Использовать переменные между make файлами

У меня есть структура каталогов, где я хочу один основной make файл в моей основной папке, а затем еще один make файл в моей тестовой и src-папке.

В моем основном make файле у меня есть директивы для обоих тестовых/всех, которые вызывают отдельные файлы make файлов. Я пытаюсь объявить переменные в моем основном make файле и сделать их доступными для этих других папок.

Например, в моем основном Makefile

PACKAGES = jansson mysql ....

all:
    do something here

test:

    cd test
    make test

И затем в моем test/Makefile я хочу иметь доступ к предыдущей переменной PACKAGES и добавлять к ней эти индивидуальные зависимости makefile.

В файле test/Makefile

PACKAGES += googletest googlemock

test
     do something here

Может ли кто-нибудь помочь мне решить эту проблему?

Спасибо

Ответ 1

Вы можете создать другой файл, например Makefile.variable, где эти общие переменные определены и включить файл, используя

include $(PATHTOSHAREDMAKEFILE)/Makefile.variable

Посмотрите руководство пользователя для получения дополнительной информации

Ответ 2

Вы можете передать переменную в командной строке:

test:
    make -C test PACKAGES="$(PACKAGES)"

Обратите внимание, что все равно невозможно идти в другую сторону. Если test/Makefile изменяет переменную, то эти изменения не могут возвращаться в вызывающий файл makefile.


Если вы хотите добавить к переменной PACKAGES в основном make файле, вам придется реорганизовать вашу систему сборки, чтобы вместо этого включить под-make файлы. Таким образом, основной make файл устанавливает все, а затем включает (используя директиву include, доступную в большинстве реализаций make), под-make файлы, которые добавляют к ним конкретные локальные цели, а также изменяют/добавляют переменные.

Например, скажем, у вас есть два тестовых каталога, test_foo и test_bar, вы можете иметь переменную, содержащую целевые объекты тестирования, и вызывать ее TEST_TARGETS. Каждый make файл в папке test_* добавляет свою локальную и уникальную цель в глобальную переменную, и основной make файл может их запускать.

Что-то вроде этого:

Основной файл makefile:

# Start empty
TEST_TARGETS =

include test_foo/Makefile
include test_bar/Makefile

test:
    for target in "$(TEST_TARGETS)"; do \
        $(MAKE) $(target); \
    done

test_foo/Makefile:

TEST_TARGETS += test_foo

test_foo:
    # Do some foo testing

test_bar/Makefile:

TEST_TARGETS += test_bar

test_bar:
    # Do some bar testing

Ответ 3

ПАКЕТЫ экспорта = Янссон MySQL....