Makefile - выполнить правило для каждого поля в переменной - PullRequest
0 голосов
/ 04 февраля 2019

Мой двоичный файл проекта находится в корне моего репозитория, а также Makefile, используемый для его сборки.
Этот двоичный файл использует многие из моих самодельных библиотек, расположенных в моей папке lib/

Для построения (и очистки) двоичного файла моего репозитория я хочу реализовать следующее выполнение:

Вместо жесткого кодирования следующих строк:

clean_binaries:
    make -C clean lib/folder1 -s
    make -C clean lib/folder2 -s
    make -C clean lib/another_folder -s

Iсоздал переменную BIN_PATH, содержащую предыдущие пути.

BIN_PATHS = lib/folder1 \
            lib/folder2 \
            lib/another_folder

И создал простое правило, подобное этому:

clean_binaries: $(BIN_PATHS)
    make -C clean $< -s

НО выполняет только строку для первого поля переменной (lib/folder1), что не то, что я хочу сделать.

Я думал об использовании неявных правил (?), Так же, как я компилировал .c файлы, но я не мог понять это правильно.
В конце я просто задаюсь вопросом, как выполнить правило длякаждое поле данной переменной, и это внутри Makefile, если есть какой-либо способ сделать это.

Спасибо за ваши ответы:]

1 Ответ

0 голосов
/ 04 февраля 2019

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

Makefile

BIN_PATHS := lib/folder1 lib/folder2 lib/another_folder

.PHONY: clean_binaries

clean_binaries:
    $(foreach path,$(BIN_PATHS),make -C $(path) clean ;)

, который работает следующим образом:

$ make
make -C lib/folder1 clean -s; make -C lib/folder2 clean -s; make -C lib/another_folder clean -s;

, не требующий цикла оболочки.

Обратите внимание, что вам необходимо исправить:

make -C clean <directory>

до:

make -C <directory> clean
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...