2013-02-14 144 views
7

我有一個目錄結構,我想在我的主文件夾中創建一個主makefile,然後在我的test和src文件夾中創建另一個makefile。在makefiles之間共享變量

在我的主要生成文件中,我有針對測試/所有調用單個文件夾makefiles的指令。我試圖在我的主要生成文件中聲明變量並讓它們可以訪問其他文件夾。

例如,在我的主要的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 CE Makefile.variable其中那些共享變量的定義,包括使用

include $(PATHTOSHAREDMAKEFILE)/Makefile.variable 

看那include manual瞭解更多信息

+1

是的,這是我原本想做的事,但不知道這是不是好習慣。一切都奏效了,謝謝 – JonMorehouse 2013-02-14 18:25:46

6

你可以通過在命令行中的變量:

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

請注意,這是不可能走另一條路,雖然各地。如果test/Makefile更改了一個變量,則這些更改無法返回到調用makefile。


如果你想添加到PACKAGES變量在主makefile文件,你將不得不重構您的構建系統包括子的makefile來代替。因此,主makefile設置了一切,然後包括(在大多數make實現中使用include指令)添加了特定目標本地到它們的子makefiles,以及修改/添加變量。

例如,假設您有兩個測試目錄,test_footest_bar,您可以有一個包含測試目標的變量,我們稱它爲TEST_TARGETStest_*文件夾中的每個生成文件都將其本地和唯一目標添加到全局變量,然後主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文件夾中,以便它能正常工作。 – 2013-02-18 21:40:25