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 это значение".