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

Эта статья представляет собой краткое руководство по некоторым полезным вещам, которые необходимо знать о GNU make, чтобы эффективно понять его использование и повысить свою способность эффективно создавать программное обеспечение. Это будет первая часть серии статей, посвященных упомянутым полезным функциям make и тому, как их использовать.

Установка

В этом руководстве я предполагаю, что на вашем компьютере с Linux/Unix установлена ​​версия make ≥ 3.81. Сначала вы можете проверить наличие программы make на вашем компьютере, выполнив следующую команду

which make

После того, как вы подтвердите наличие make на вашем компьютере, вы можете найти версию make, выполнив команду

make --version

Если на вашем компьютере не установлена ​​make v3.81+, вы можете найти необходимые инструкции здесь https://www.gnu.org/software/make/.

Переменные

Одна из самых важных вещей, о которой нужно знать при создании Makefile, — это назначение переменных. Существует два способа назначения переменных в make: либо с помощью простого оператора (:=), либо с помощью рекурсивного оператора (=).

Когда вы используете простой оператор, как в этом примере,

FOO := $(shell find $(HOME) -name "*.c")

FOO сразу оценивается как единое фиксированное значение для всех ссылок на него, но когда вы используете рекурсивный оператор, как в этом примере,

FOO = $(shell find $(HOME) -name "*.c")

Переменная FOO должна оцениваться каждый раз, когда используется переменная, что может привести к некоторым проблемам с производительностью, особенно если она оценивается и требует больших затрат.

Учитывая вышеизложенное, вы можете подумать, что использование простого оператора (:=) всегда лучше, но также может вызвать некоторые проблемы. Поскольку они оцениваются сразу, порядок определения зависимых переменных может повлиять на значение того, что простой оператор оценивает переменную, что может повлиять на правильность ваших инструкций. Всегда старайтесь взвесить потенциальные затраты на использование одного оператора по сравнению с другим, прежде чем остановиться на одном!

Ура! Теперь вы можете определить переменную в make, но чтобы узнать, правильно ли вы определили указанную переменную, вам нужен способ ее распечатать. Хороший способ сделать это — использовать команду info. Вы можете распечатать содержимое переменной с помощью

$(info $(VARIABLE_NAME))

Важно знать о переменных в файлах Makefile иерархию важности происхождения переменных (где они определены). Это выглядит так:

override > command-line (eg., make VAR=val) > environment override (eg., make -e VAR=val) > file > environment

Хотя использование уникальных имен переменных всегда является хорошей практикой, вы можете оказаться в ситуации, когда захотите извлечь важную информацию о переменных из среды или пользователя, но если вы ошибочно определите ее в своем файле, у вас могут возникнуть трудности. время на оценку необходимого значения. Старайтесь помнить об относительной важности того, где определены переменные, чтобы не использовать неправильные значения в своих инструкциях. Вы можете найти источник переменной с помощью команды:

$(info $(origin VARIABLE_NAME))

Это все на сегодня. В следующий раз я расскажу о некоторых полезных функциях make, так что следите за мной, чтобы оставаться в курсе. Пока.