Как создать Makeflow для компиляции нескольких драйверов из других Makefile в подкаталогах - PullRequest
0 голосов
/ 26 марта 2020

Я относительно новичок в make-файлах GNU и в настоящее время для своей работы мне необходимо создать цель в make-файле для проекта, чтобы скомпилировать кучу драйверов. У каждого драйвера уже есть свой собственный make-файл, созданный в их собственном каталоге сборки, и цели, которые нужно вызывать для каждого драйвера, одинаковы. ie. и для драйвера A, и для драйвера B должен вызываться «make shared».

Моя текущая идея состоит в том, чтобы определить путь к каждому драйверу в основном make-файле следующим образом:

DRIVER_A = $(CURR_DIR)/<path_to_a>/driver
DRIVER_B = $(CURR_DIR)/<path_to_b>/driver
DRIVER_C = $(CURR_DIR)/<path_to_c>/driver

From здесь, что я действительно хотел бы сделать, это вызвать один и тот же процесс для каждого из DRIVER_A, DRIVER_B и DRIVER_ C ie:

        source <some_compiler>; \
        cp -r <some_folder> DRIVER_A/source/; \
        cd DRIVER_A/build; \
        make shared <some_flags>; \
        make so_test <some_flags>

И поэтому для достижения sh этого я попытался DRIVER_A, DRIVER_B и DRIVER_ C в один объект, такой как

DRIVER_SOURCES := \
        DRIVER_A\
        DRIVER_B \
        DRIVER_C

И затем вызывая цель на DRIVER_SOURCES

drivers_sw: ${DRIVER_SOURCES}
        source <some_compiler>; \
        cp -r <some_folder> $@/source/; \
        cd $@/build; \
        make shared <some_flags>; \
        make so_test <some_flags>

Но это не работает, потому что не существует правила для создания цель для DRIVER_A, DRIVER_B и DRIVER_ C, что имеет смысл для меня в ретроспективе, однако я не знаю альтернативного способа достижения sh того, что я пытаюсь выполнить sh.

Я также открыт для лучшего способа вызова make'а для каждого драйвера, чем cd'ing для его каталога и вызова make, я уверен, что есть более чистый способ, но я просто сразу собирался для функции летучая мышь.

Любая помощь будет отличной, дайте мне знать, если понадобится какая-либо дополнительная информация, я извиняюсь, если что-то пропустил, я довольно новичок в публикации по переполнению стека.

Редактировать: Я сделал опечатку в 4-м блоке кода, заменил "DRIVER_A" на $ @

1 Ответ

1 голос
/ 26 марта 2020

Давайте сначала сделаем грубый и простой способ. У вас уже есть рецепт для драйвера A:

DRIVER_A = $(CURR_DIR)/<path_to_a>/driver
build_DRIVER_A:
    source <some_compiler>; \
    cp -r <some_folder> DRIVER_A/source/; \
    cd DRIVER_A/build; \
    make shared <some_flags>; \
    make so_test <some_flags>

Если вы подтвердите, что это работает, вы можете легко написать правила для B и C.

Как только они все заработают вы можете иметь одно правило для построения всех трех:

build_all_drivers: build_DRIVER_A build_DRIVER_B build_DRIVER_C

И не забывайте:

.PHONY: build_all_drivers build_DRIVER_A build_DRIVER_B build_DRIVER_C

Как только все это заработает, вы можете сделать весь дизайн более элегантно, но сложно понять, как это сделать, не зная деталей проекта. Я не знаю, что делает, например, source <some compiler>, поэтому я не знаю, как это сделать. Я не знаю, что содержат различные <some folders>, поэтому я не знаю, насколько легко было бы сделать эти исходные файлы необходимыми для своих драйверов. Но я бы, конечно, посмотрел на make-файлы в разных каталогах драйверов и увидел, могут ли они взять на себя часть этого бремени - в конце концов, именно они ответственны за создание своих соответствующих драйверов.

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