Если вы когда-либо работали с общим программным проектом, вы, вероятно, сталкивались с Makefile. Этот файл используется программой make
для автоматизации общих задач, таких как компиляция кода, установка программ, запуск тестов и поддержание чистоты ваших каталогов.
Документация по Makefile устрашает. Человек может потратить много времени на ее чтение. На своем опыте я обнаружил, что даже знание самых основ может занять много времени. Как только вы освоите основы, вы сможете использовать make
для создания потрясающих вещей. Например, вместо того, чтобы объяснять 10-шаговый процесс установки, вы можете просто попросить пользователя запустить make install
и позволить компьютеру сделать это за него.
В этом посте я поделюсь несколькими базовыми примерами, которые, надеюсь, демистифицируют структуру и синтаксис Makefile и помогут вам чувствовать себя более комфортно с make
и Makefiles.
Цели
target — это имя одной из «задач» Makefile.
$ cat Makefile install: python setup.py install run: python my_app/src/main.py --debug=False clean: rm *.pyc
В Makefile выше install
, run
и clean
являются целями.
Выполнение Makefile
$ cat Makefile apple: echo 'apple' banana: echo 'banana' guava: echo 'guava'
По умолчанию make
выполнит только первую цель.
$ make echo 'apple' apple
Вы можете указать make
, какую цель выполнять, передав цель в качестве аргумента.
$ make guava 'echo guava' guava
Вы можете запустить несколько целей, поместив их в одну строку с целью.
$ cat Makefile all: apple banana guava apple: echo 'apple' banana: echo 'banana' guava: echo 'guava' $ make all echo 'apple' apple echo 'banana' banana echo 'guava' guava
или просто (поскольку all
является первой целью)
$ make echo 'apple' apple echo 'banana' banana echo 'guava' guava
Вкладки, вкладки, вкладки… Не пробелы
Самая большая проблема при работе с файлами Makefile заключается в том, что вы должны использовать табуляции, а не пробелы. make
ненавидит пробелы. Я буду использовать утилиту tr
для преобразования пробелов в ~
s.
$ cat Makefile | tr ' ' '~' mango: ~~~~echo~'mango' $ make mango Makefile:2: *** missing separator. Stop. # ... after replacing 4 spaces with a tab $ cat Makefile | tr ' ' '~' mango: echo~'mango' $ cat Makefile | tr '\t' '~' mango: ~echo 'mango' $ make mango echo 'mango' mango
Поэтому всякий раз, когда вы видите missing separator
, проверьте, используете ли вы вкладки!
Скрытие команд
Как вы заметили, make
выводит команды в таргете на экран.
echo 'apple' apple echo 'banana' banana echo 'guava' guava
Что делать, если я хочу скрыть фактические команды?
# ./Makefile all: apple banana guava apple: @echo 'apple' banana: echo 'banana' guava: @echo 'guava'
Используйте @
перед командой
$ ls Makefile $ make apple echo 'banana' banana guava
.ФОНИЯ
Вы можете столкнуться с какой-то странной целью по имени .PHONY
.
.PHONY
предотвращает нежелательное поведение, когда в вашем рабочем каталоге есть файл с то же именем, что и у цели:
# ./Makefile strawberry: @echo 'strawberry'
…
$ make strawberry $ touch strawberry $ ls Makefile strawberry $ make make: `strawberry' is up to date.
Добавьте .PHONY
, чтобы исправить это:
# ./Makefile .PHONY: strawberry strawberry: @echo 'strawberry'
…
$ ls Makefile strawberry $ make strawberry
Переменные
Makefiles имеют синтаксис, аналогичный используемому в сценариях bash, поэтому вы можете использовать переменные.
$ cat Makefile PROGRAM=src/avocado.py run: @python "${PROGRAM}" $ cat src/avocado.py print('i am the avocado program') $ make run i am the avocado program
Вывод
С помощью make
и Makefile вы можете сделать намного больше, но простое знание некоторых основ, таких как материал, который мы рассмотрели, может позволить вам выполнить мощную автоматизацию и упростить ваши проекты кода. работать с.
Поделитесь со мной своими впечатлениями о Makefile в Твиттере @eightlimbed. Мир~