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

Большинство людей не понимают значения сообщения об ошибке. Без шуток. Большинство из них.

Они считают, что сообщения об ошибках одинаковы, говорит: «Что-то не так!» Они не удосужились его прочитать. Хотя это самая важная часть сообщения об ошибке, а не только тот факт, что она была поднята, но это имеет значение. Это может сказать вам , что идет не так. Сообщения об ошибках предназначены для помощи, а не для того, чтобы беспокоить вас «как скрыть это?». проблема. Это одно из самых больших недоразумений в мире веб-программирования новичка.

Таким образом, вместо сообщения об ошибке gagging следует прочитать то, что он говорит. Он имеет не только одно значение «файл не найден». Могут быть тысячи разных ошибок: permission denied, save mode restriction, open_basedir restriction и т. Д. Каждый из них требует соответствующих действий. Но если вы заткнете это, вы никогда не узнаете, что произошло!

OP представляет собой сообщение об ошибках с обработкой ошибок, в то время как это очень большая разница! Обработка ошибок для пользователя. «что-то случилось» достаточно. Хотя сообщения об ошибках предназначены для программистов, которым отчаянно нужно знать, что именно произошло.

Таким образом, сообщения о ошибках никогда не появляются. Оба регистрируют его для программиста и обрабатывают его для пользователя.

532
задан pillravi 11 November 2016 в 05:59
поделиться

4 ответа

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

  • Из среды - каждая переменная среды преобразуется в переменную make-файла с то же имя и значение.

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

     FOO? = default_value_if_not_set_in_environment 
     

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

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

     make target FOO = bar 
     

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

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

     # Не делайте этого! 
    target: { {1}} $ (MAKE) -C target CC = $ (CC) CFLAGS = $ (CFLAGS) 
     

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

     # Сделайте вот так 
    CFLAGS = -g 
    export CFLAGS 
    target: 
     $ (MAKE) -C target 
     

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

686
ответ дан 22 November 2019 в 22:16
поделиться

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

make foo=bar target

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

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

188
ответ дан 22 November 2019 в 22:16
поделиться

Допустим, у вас есть make-файл, подобный этому:

action:
    echo argument is $(argument)

You затем назовет его make action argument = something

69
ответ дан 22 November 2019 в 22:16
поделиться

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

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

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

FOOBAR=1 make

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

20
ответ дан 22 November 2019 в 22:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: