M в команде make, Makefile
make -C ~/kernel-2.6 M=`pwd` modules
Каково значение в M = 'pwd' в строке выше?
Я не мог понять объяснения:
Параметр M = приводит к тому, что makefile возвращается в исходный код вашего модуля прежде чем пытаться построить цель модуля.
Можете ли вы сделать это более понятным?
Ответы
Ответ 1
M
не является параметром для make
. Обратите внимание, что в нем отсутствует дефис. M
- это переменная, назначенная для выполнения make
. Если make
выполняет Makefile
script, этот script может читать переменную M
и использовать ее содержимое.
В приведенном примере make
будет читать Makefile
в ~/kernel-2.6
и назначить текущую рабочую директорию переменной M
. Как правило, это позволит make
вернуться в ваш текущий каталог после обработки Makefile
.
Ответ 2
Прочтите руководство для make
:
-C dir, --directory=dir
Change to directory dir before reading the makefiles or doing anything else.
Ваш вызов изменяет каталог на ~/kernel
и эффективно вызывает make
, т.е. читает Makefile
из этого каталога. С помощью переменной M
файл makefile знает, где находятся ваши фактические файлы проекта, и может вернуться в это место.
Дело в том, что вы не пишете свой собственный make файл, а используете одну, один раз и для всех версию.
Ответ 3
У меня была аналогичная опрос с
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
Здесь make вызывается в моей директории проекта. -C
- опция make:
-C dir, --directory = dir Перейдите в каталог dir перед чтением make файлов или чем-нибудь еще. Если заданы несколько параметров -C, каждый из которых интерпретируется относительно предыдущего один: -C/-C и т.д. эквивалентен -C/etc. Обычно это используется с рекурсивным invocations of make.
M
не является опцией, но аргумент передается. Поскольку -C
меняет каталог, мы знаем, что make будет читать make файл в этом каталоге. Проверяя файл make в этом каталоге, я обнаружил, что он собирается делать с M
:
Из файла make (с именем Makefile) в каталоге, на который указывает -C
(btw это каталог сборки ядра):
# Use make M=dir to specify directory of external module to build
# Old syntax make ... SUBDIRS=$PWD is still supported
# Setting the environment variable KBUILD_EXTMOD takes precedence
ifdef SUBDIRS
KBUILD_EXTMOD ?= $(SUBDIRS)
endif
Объяснение из драйверов устройств Linux, 3-е издание, Джонатан Корбет и др.:
Эта команда начинается с изменения ее каталога на тот, который предоставляется с помощью параметр -C (то есть исходный каталог ядра). Там он находит файл makefile на верхнем уровне ядра. Параметр M = вызывает makefile для вернитесь в исходный каталог вашего модуля, прежде чем пытаться создать модулей.
Ответ 4
Команда для создания внешнего модуля:
$ make -C <path_to_kernel_src> M=$PWD
Система kbuild знает, что внешний модуль создается из-за опции "M =", указанной в команде.
Для построения против используемого ядра используйте:
$ make -C /lib/modules/`uname -r`/build M=$PWD
Ответ 5
Другие ответы в основном верны, но я хочу рассказать вам, как это узнать.
-
M
не вариант
-
M
- это переменная в Makefile
- поэтому мы должны прочитать
Makefile
в каталоге, в котором изменяется make -C
.
Прочитайте Makefile: есть несколько комментариев:
# Use make M=dir to specify directory of external module to build
# Old syntax make ... SUBDIRS=$PWD is still supported
# Setting the environment variable KBUILD_EXTMOD take precedence
ifdef SUBDIRS
KBUILD_EXTMOD ?= $(SUBDIRS)
endif
ifeq ("$(origin M)", "command line")
KBUILD_EXTMOD := $(M)
endif
Вы можете выполнить поиск KBUILD_EXTMOD
:
VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
module-dirs := $(addprefix _module_,$(KBUILD_EXTMOD))
То, как ядро Makefile
может построить ваши внешние источники.
Ответ 6
В оболочке Unix запись `foobar`
в середине команды означает: "Запустите команду foobar
и замените ее вывод здесь".
Итак, включение M=`pwd`
в команду make
означает "запустить команду pwd
для печати текущего рабочего каталога и установить для переменной M
это значение".