2013-02-14 5 views
7

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

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

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

PACKAGES = jansson mysql .... 

all: 
    do something here 

test: 

    cd test 
    make test 

А потом в моем тестовом/Makefile Я хочу, чтобы иметь возможность получить доступ к предыдущим ПАКЕТАМ переменным и добавить отдельные зависимости этого Makefile'' и на него.

В тесте/Makefile

PACKAGES += googletest googlemock 

test 
    do something here 

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

Благодаря

ответ

8

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

include $(PATHTOSHAREDMAKEFILE)/Makefile.variable 

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

+1

Да, это то, о чем я изначально думал, но не был уверен, что это была хорошая практика. Все получилось, спасибо – JonMorehouse

6

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

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

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


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

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

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

Главная 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 
+0

Проблемы я вижу с последним подходом состоит в том, что $ (MAKE) $ (целевой) называется с контуром в каталоге Makefile верхнего уровня.Я бы подумал, что путь должен находиться в папке с Makefile, которая содержит целевой объект, чтобы это работало правильно. –

Смежные вопросы