Есть ли веские причины не использовать '#!/bin/make -f' в начале make-файла для получения исполняемого make-файла?

В основном для развлечения я создал makefile в моем каталоге $HOME/bin с именем rebuild.mk и сделал его исполняемым, и первые строки файла гласили:

#!/bin/make -f
#
# Comments on what the makefile is for

...

all: ${SCRIPTS} ${LINKS} ...

...

Теперь я могу ввести:

rebuild.mk

и это приводит к выполнению make.

Каковы причины не использовать это на постоянной основе, кроме этого:

  • Makefile привязан к одному каталогу, поэтому он не подходит для моего основного каталога bin.

Кто-нибудь когда-нибудь видел, как этот трюк использовали раньше?


Собираем некоторые комментарии и предоставляем немного дополнительной справочной информации.

  1. Норман Рэмси сообщает, что этот метод используется в Debian; это интересно знать. Спасибо.
  2. Я согласен, что печатать «make» более идиоматично.
  3. Однако сценарий (ранее не указанный) заключается в том, что в моем каталоге $HOME/bin уже есть основной межплатформенный make-файл, который является основным инструментом обслуживания для более чем 500 команд в каталоге.
  4. Однако на одной конкретной машине (только) я хотел добавить make-файл для создания специального набора инструментов. Таким образом, эти инструменты получают специальный make-файл, который я назвал rebuild.mk для этого вопроса (на моей машине он имеет другое имя).
  5. Я могу сэкономить на вводе «make -f rebuild.mk», используя вместо этого «rebuild.mk».
  6. Исправление положения утилиты make проблематично на разных платформах.
  7. Техника #!/usr/bin/env make -f, вероятно, сработает, хотя я полагаю, что официальные правила взаимодействия таковы, что строка должна быть меньше 32 символов и может иметь только один аргумент для команды.
  8. @dF комментирует, что этот метод может помешать вам передавать аргументы для создания. Во всяком случае, на моей машине с Солярисом это не проблема. Три разные версии make, которые я тестировал (Sun, GNU, моя), все получили дополнительные аргументы командной строки, которые я вводил, включая параметры («-u» в моей домашней версии) и цели «someprogram» и макросы CC ='cc' WFLAGS=-v (для использования другого компилятора и отмены флагов предупреждения GCC, которые компилятор Sun не понимает).

Я бы не рекомендовал это как общую технику.

Как уже говорилось, это было в основном для моего развлечения. Я могу оставить его для этой конкретной работы; маловероятно, что я буду использовать его в распределенной работе. И если бы я это сделал, я бы поставил и применил скрипт 'fixin', чтобы исправить путь к интерпретатору; действительно, я сделал это уже на своей машине. Этот сценарий является пережитком первого издания книги Camel («Программирование на Perl» Ларри Уолла).


person Jonathan Leffler    schedule 22.12.2008    source источник


Ответы (7)


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

Конечно, всегда можно запустить соответствующую команду вручную, но это сводит на нет всю цель создания исполняемого файла Makefile.

person Greg Hewgill    schedule 22.12.2008
comment
В яблочко. Например, в моей системе make находится в /usr/bin. - person Robert Gamble; 22.12.2008
comment
Но ты по-прежнему не хуже, чем был в начале. - person recursive; 22.12.2008

Я видел этот прием раньше в файле debian/rules, который является частью каждого пакета Debian.

person Norman Ramsey    schedule 22.12.2008

Чтобы решить проблему, когда make не всегда находится в одном и том же месте (например, в моей системе он находится в /usr/bin), вы можете использовать

#!/usr/bin/env make -f

если вы работаете в UNIX-подобной системе.

Другая проблема заключается в том, что, используя Makefile таким образом, вы не можете переопределить переменные, выполнив, например, make CFLAGS=....

person dF.    schedule 22.12.2008
comment
Вы можете переопределить - и предоставить другие аргументы в командной строке. По крайней мере, так показывают мои эксперименты. - person Jonathan Leffler; 22.12.2008
comment
Отдельно официально можно указать один аргумент (а не два, как показано). И я считаю, что вся строка командной строки должна быть меньше 32 символов. - person Jonathan Leffler; 22.12.2008
comment
Если env нет в этом месте, значит, вы используете Linux, который сам себе придумывает проблемы. - person mxcl; 08.10.2009
comment
Почему бы вам не передать аргументы, как и любому другому сценарию хэш-бэнга? Обратите внимание, что используется -f, поэтому файл сценария, который предоставляет ядро, будет использоваться в качестве аргумента для -f, и могут быть обработаны другие аргументы: цели, назначения переменных, другие параметры make, такие как -k для продолжения и т. д. - person Kaz; 15.03.2012
comment
Передача более одного аргумента не удалась по крайней мере в одной ОС, которую я использовал, я думаю, это был Linux. - person reinierpost; 15.03.2012

"make" короче "./Makefile", поэтому я не думаю, что вы что-то покупаете.

person dicroce    schedule 22.12.2008
comment
Верно: но reboot.mk короче, чем make -f reboot.mk, так что я что-то получаю. - person Jonathan Leffler; 22.12.2008

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

person grepsedawk    schedule 22.12.2008
comment
Вариант использования для этого, вероятно, будет не столько новой командой для создания проектов, сколько рассмотрением make как еще одного языка для написания сценариев. Я вижу, что использую make вместо bash, если мой скрипт содержит много if [file.x -nt -file.y]. - person Rolf Rander; 22.12.2008
comment
Кроме того, в моем конкретном сценарии у меня уже есть главный межплатформенный make-файл в каталоге, и мне нужен отдельный файл для конкретной машины и определенного набора команд — следовательно, reboot.mk. - person Jonathan Leffler; 22.12.2008
comment
Но я согласен - печатать «make» более идиоматично. Это просто спасает меня от ввода «make -f reboot.mk». - person Jonathan Leffler; 22.12.2008

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

person PEZ    schedule 22.12.2008
comment
@PEZ: да, я мог бы. Однако это был бы один из очень, очень немногих псевдонимов, которые у меня есть; Я вырос до того, как они стали общедоступными, и обычно использую сценарии вместо псевдонимов (не в последнюю очередь потому, что сценарии работают независимо от того, какую оболочку я использую). Другими словами, я бы не стал использовать для этого псевдоним. - person Jonathan Leffler; 22.12.2008
comment
Я думаю, что сценарий хорош для этого. Это то, чем я чаще всего пользуюсь. Я только что указал, что вы cold также используете псевдоним оболочки. Может быть полезно знать некоторым людям, которые ищут в Google ваш вопрос. - person PEZ; 22.12.2008

Можно посмотреть на это с другой стороны: стоит ли разрабатывать язык, интерпретатор которого ищет фиксированное имя файла, если вы ему его не дадите? Что, если python искал Pythonfile при отсутствии имени скрипта? ;)

Вам не нужен такой механизм, чтобы иметь соглашение, основанное на известном имени. Пример: скрипт Autoconf ./configure.

person Kaz    schedule 15.03.2012