Почему в make нижнего уровня экспортируется переменная, хотя она экспортироваться не должна?

IDE, VCS и прочее

Модератор: Модераторы разделов

Аватара пользователя
жучара
Сообщения: 1017
ОС: астралинукс

Почему в make нижнего уровня экспортируется переменная, хотя она экспортироваться не должна?

Сообщение жучара »

Друзья! Речь идёт о make и Makefile. Вот тут сказано:
"Для экспорта указанной переменной в make "нижнего уровня", используется директива export: "
Да и я попробовал, действительно, пока "export" не напишешь, make нижнего уровня переменную, объявленную в верхнем уровне, не распознаёт.

...Теперь посмотрите на Makefile, я специально нашел маленький.
obj-m += lkm_example.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Этот файл взят отсюда и служит для сборки модуля ядра
Судя по теории, переменная obj-m что мёртвому припарка. Но нет же, если мы её уберём, модуль не собирается, а с ней собирается. Как так? Ведь в приведённом Makefile она не задействована, а в нижний не передаётся!

...А вот официальная инфа по сборке модулей ядра.
https://www.kernel.org/doc/html/latest/kbuild/modules.html#shared-makefile
И тоже сплошь и рядом такие вот переменные:
obj-m := 8123.o
8123-y := 8123_if.o 8123_pci.o 8123_bin.o
В этом, например, файле:
--> filename: Kbuild
obj-m := 8123.o
8123-y := 8123_if.o 8123_pci.o 8123_bin.o

--> filename: Makefile
ifneq ($(KERNELRELEASE),)
# kbuild part of makefile
include Kbuild

else
# normal makefile
KDIR ?= /lib/modules/`uname -r`/build

default:
$(MAKE) -C $(KDIR) M=$$PWD

# Module specific targets
genbin:
echo "X" > 8123_bin.o_shipped

endif
Зачем? Почему? Для чего? Как такие переменные могут влиять на сборку модуля? Непонятно. Спасибо, кто откликнется. Debian 11.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1017
ОС: астралинукс

Re: Почему в make нижнего уровня экспортируется переменная, хотя она экспортироваться не должна?

Сообщение жучара »

Ну что ребята, какие будут мнения? Как же задействуется переменная obj-m, если она задействоваться не может?
...Кажись, разобрался. С утра отпишусь.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1017
ОС: астралинукс

Re: Почему в make нижнего уровня экспортируется переменная, хотя она экспортироваться не должна?

Сообщение жучара »

Ну то есть тут в чём дело. Действительно, в своих предположениях я прав, obj-m никуда не передаётся, но без неё не собрать. А как это всё работает. make вызывается где-то там в глубине и срабатывает система (исполняемый файл какой-то, не знаю), которую называют kbuild. И она просто считывает переменную obj-m из Makefile и использует её.

Как kbuild узнает, где искать Makefile? По переменной M. Можно создать Makefile содержания всего лишь
obj-m := 8123.o
И куда-нибудь его поместить, а в переменной M указать путь для Makefile c этим содержанием (ну то есть у нас два Makefile уже будет). И kbuild найдёт его по этому пути. Ну то есть примерно так:

Содержание Makefile №1
all:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD)/../d_Makefile modules

clean:
$(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD)/../d_Makefile clean
d_Makefile это не текущая директория, а ДРУГАЯ, где находится другой Makefile №2:

Содержание Makefile №2:
obj-m += hello.o
И всё соберётся. Более того, исходники можно положить в третью директорию (например, d_src). Тогда содержание Makefile №2 будет:
obj-m += ../d_src/hello.o
И опять всё соберётся. То есть мы скомандуем make, согласно переменной M пойдёт поиск Makefile в директории d_Makefile и, согласно ему, поиск и сборка исходников в директории d_src. Также в определении переменной obj-m можно указывать и абсолютный путь. И да, в папке d_Makefile создаются файлы modules.order и Module.symvers, а все остальные- в папке d_src. А их там не много не мало:
hello.ko hello.mod hello.mod.c hello.mod.o hello.o
А вот команда make clean уже не сработает. Оно найдёт Makefile в директории d_Makefile и очистит её- удалит файлы modules.order и Module.symvers, а в папку d_src уже не полезет и её не очистит.

В общем, чтобы всё собиралось и очищалось без дополнительного изучения, нужно класть исходники вместе с Makefile, в котором определена переменная obj-m и указывать путь к этому Makefile в переменной M. Тогда всё соберётся. Также можно назвать Makefile №1 Kbuild- тоже всё будет собираться. Но это уже совсем другая история
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1017
ОС: астралинукс

Re: Почему в make нижнего уровня экспортируется переменная, хотя она экспортироваться не должна?

Сообщение жучара »

Да, но теперь возник другой вопрос- а как вообще определяется "M"?
И вообще, M- это что?
M присутствует в командной строке make, она должна быть чем-нибудь таким, чем можно быть в командной строке. Но она ничего, на неё должна быть ругань
Тут вообще нет ничего похожего на форму передачи значения "M=..."
...Так, а вот man make и там чётко написана форма вызова make;
SYNOPSIS
make [OPTION]... [TARGET]...
То есть опции и цель
Среди опций make нет M. И M не цель. Но как-то умудряется make на неё не ругнуться. Как так?
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1017
ОС: астралинукс

Re: Почему в make нижнего уровня экспортируется переменная, хотя она экспортироваться не должна?

Сообщение жучара »

Небольшие опыты показали, что переменная M, объявленная таким образом, ведёт себя, будто она объявлена внутри Makefile №1 со словом export. То есть в Makefile №1 мы можем ещё раз вызывать make, указывая в опциях другой Makefile №2 (я делал это, указывая другую директорию с опцией ) и в вызове make никоим образом не упоминать больше переменную M, но она в Makefile №2 отлично распознается. Это недокументированная особенность make.
Я просто читаю маны.
Спасибо сказали:
math
Сообщения: 279
Статус: Ъ участник
ОС: Artix (= Arch without systemd)

Re: Почему в make нижнего уровня экспортируется переменная, хотя она экспортироваться не должна?

Сообщение math »

жучара писал(а):
01.08.2022 13:55
Как так?
Да просто man-страница тухлая, в смысле неправильная. См.
9.5 Overriding Variables
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1017
ОС: астралинукс

Re: Почему в make нижнего уровня экспортируется переменная, хотя она экспортироваться не должна?

Сообщение жучара »

math писал:
01.08.2022 18:01
жучара писал(а):
01.08.2022 13:55
Как так?
Да просто man-страница тухлая, в смысле неправильная. См.
9.5 Overriding Variables
Тут тоже, оказывается, есть. Но всё равно поди найди его.
Я просто читаю маны.
Спасибо сказали: