Если вы когда-либо работали с общим программным проектом, вы, вероятно, сталкивались с 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. Мир~