Как выполнить скрипт bash в makefile

#bash #makefile

#баш #makefile

Вопрос:

У меня есть простой скрипт bash, который устанавливает и архивирует приложение NodeJS. Это отлично сработало на местном уровне. Теперь я хочу выполнить этот скрипт из Makefile. Итак, я написал этот код

 .FOO: install_and_zip
    install_and_zip: ./install_and_zip_foo.sh
 

Итак, если я запускаю этот Makefile с make foo помощью, я получаю это сообщение об ошибке:

 make: *** No rule to make target `foo'.  Stop.
 

Makefile и bash-скрипт находятся в одном каталоге.

Что я делаю не так? Можете ли вы помочь мне исправить этот Makefile?

Ответ №1:

Разные ошибки. Это сработает:

 foo:    install_and_zip
install_and_zip:
# next line must start with a real TAB (ASCII 9)
    ./install_and_zip_foo.sh
 
  • Если вы хотите сделать foo , то вызывайте правило foo , но не FOO или .FOO .
  • Код всегда идет ниже правила. Все командные строки должны начинаться с реальной табуляции (ASCII 9, но не с ряда пробелов).

Правило foo вызывает правило install_and_zip . Это твое желание? В противном случае это тоже сработает:

 foo:
# next line must start with a real TAB (ASCII 9)
    ./install_and_zip_foo.sh
 

Комментарии:

1. Спасибо за ваш ответ. Действительно, мне нужно только одно правило для выполнения только одного скрипта. Я опробовал ваше решение foo: ./install_and_zip_foo.sh с make foo помощью, но я получаю эту ошибку Makefile:2: *** missing separator. Stop.

2. 2 строки! И ВКЛАДКА в начале второй строки.

3. Это «настоящий» горизонтальный символ табуляции, например ASCII 0x9 , а не просто 8 пробелов.

4. Я вставил здесь табуляции, но они были заменены пробелами. Каждая командная строка должна начинаться с вкладки, чтобы отличать правила и другие компоненты Make от команд и.

Ответ №2:

Вы должны написать «make .FOO», как вы определили, это должно быть именно так. Однако вы должны правильно написать свой Makefile (идентификаторы вкладок и так далее). Если вы это сделаете, вы можете просто написать «make», и инструмент определит «install_and_zip» в качестве основной цели, выполнив таким образом ваш скрипт.

PD: цели с начальным ‘.’ (и без косых черт) будут игнорироваться make при попытке определить основную цель (т. Е. Они не будут выполняться, просто выполняя ‘make’). Итак, если вы не знаете, что делаете, просто переименуйте свою цель в ‘foo’.