Передача дополнительных переменных из командной строки для

Могу ли я передавать переменные в файл GNU Makefile в качестве аргументов командной строки? Другими словами, я хочу передать некоторые аргументы, которые в конечном итоге станут переменными в Makefile.

У вас есть несколько вариантов настройки переменных из-за пределов вашего файла makefile:

  • Из среды – каждая переменная среды преобразуется в переменную makefile с тем же именем и значением.

    Вы также можете установить параметр -e (aka --environments-override ), а переменные среды переопределят назначения, внесенные в make-файл (если только эти назначения не используют директиву override . Однако это не рекомендуется, и это намного лучше, гибкий для использования ?= присваивание (условный оператор присваивания переменной, он действует только в том случае, если переменная еще не определена):

     FOO?=default_value_if_not_set_in_environment 

    Обратите внимание, что некоторые переменные не наследуются от среды:

    • MAKE получен от имени скрипта
    • SHELL либо устанавливается в make-файл, либо по умолчанию используется /bin/sh (логическое: команды указаны в файле makefile, и они специфичны для оболочки).
  • Из командной строкиmake может принимать переменные назначения как часть его командной строки, смешанные с целями:

     make target FOO=bar 

    Но тогда все назначения переменной FOO в make-файле будут проигнорированы, если вы не используете директиву override при назначении. (Эффект такой же, как с параметром -e для переменных среды).

  • Экспорт из родительского Make – если вы вызываете Make из Makefile, вы обычно не должны явно писать назначения переменных следующим образом:

     # Don't do this! target: $(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS) 

    Вместо этого лучшим решением могло бы стать экспорт этих переменных. Экспортируя переменную, она попадает в среду каждого вызова оболочки, а вызовы из этих команд выбирают эту переменную среды, как указано выше.

     # Do like this CFLAGS=-g export CFLAGS target: $(MAKE) -C target 

    Вы также можете экспортировать все переменные, используя export без аргументов.

Самый простой способ:

 make foo=bar target 

Затем в вашем файле makefile вы можете ссылаться на $(foo) . Обратите внимание, что это не будет автоматически распространяться на субмашины.

Если вы используете подзапросы, см. Эту статью: Передача переменных в под-make

Скажем, у вас есть make-файл:

 action: echo argument is $(argument) 

Тогда вы бы назвали его make action argument=something

Из руководства :

Переменные в make могут исходить из среды, в которой выполняется make. Каждая переменная среды, которая видна при ее запуске, преобразуется в переменную make с тем же именем и значением. Однако явное присваивание в make-файле или с аргументом команды переопределяет среду.

Итак, вы можете сделать (из bash):

 FOOBAR=1 make 

приводя к переменной FOOBAR в вашем Makefile.

Если вы создадите файл под названием Makefile и добавьте переменную типа $ (unittest), вы сможете использовать эту переменную внутри Makefile даже с помощью подстановочных знаков

пример :

 make unittest=* 

Я использую BOOST_TEST и задавая шаблон для параметра –run_test = $ (unittest), тогда я смогу использовать регулярное выражение для фильтрации теста, который я хочу, чтобы мой Makefile запускался

 export ROOT_DIR= 

Затем используйте переменную $(ROOT_DIR) в Makefile.

Здесь есть еще один вариант, который включен в книгу GNU Make by Stallman и McGrath (см. http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.html ). В нем приведен пример:

 archive.a: ... ifneq (,$(findstring t,$(MAKEFLAGS))) +touch archive.a +ranlib -t archive.a else ranlib archive.a endif 

Это включает проверку того, появляется ли данный параметр в MAKEFLAGS . Например .. предположим, что вы изучаете streamи в c ++ 11, и вы разделили свое исследование на несколько файлов ( class01 , …, classNM ), и вы хотите: скомпилировать все и запустить отдельно или скомпилировать один и запускать его, если указан флаг ( -r , например). Итак, вы можете создать следующий Makefile :

 CXX=clang++-3.5 CXXFLAGS = -Wall -Werror -std=c++11 LDLIBS = -lpthread SOURCES = class01 class02 class03 %: %.cxx $(CXX) $(CXXFLAGS) -o [email protected] $^ $(LDLIBS) ifneq (,$(findstring r, $(MAKEFLAGS))) ./[email protected] endif all: $(SOURCES) .PHONY: clean clean: find . -name "*.out" -delete 

Имея это, вы должны:

  • создать и запустить файл w / make -r class02 ;
  • построить все ж / make или make all ;
  • создайте и запустите все w / make -r (предположим, что все они содержат некоторые определенные типы утверждений, и вы просто хотите их протестировать)
  • Как передать аргументы командной строки программе Node.js?
  • Разбор аргументов командной строки в сценариях R
  • Давайте будем гением компьютера.