2013-01-20 20 views
2

我想通過autotools - 動態變量名來實現非常具體的內容。我的目標是根據特定的配置文件創建動態目標,與Linux內核類似。使用自動工具的動態目標

Linux內核可以使用make menuconfig進行配置,最終生成一個.config。 Linux內核的Makefiles包含目標,例如obj-$(CONFIG_DMA),並且根據CONFIG_DMA (y, n or m)的值,關聯的源文件將作爲模塊靜態構建,或根本不構建。我正在使用kconfig-frontends,它可以讓我生成一個.config文件,然後我可以將它包含在一個標準的GNU Makefile中併成功使用。我想用automake實現同樣的功能級別,但不幸automake根據外部環境變量拒絕設置變量名稱。我可以想出解決這個問題的方法,但我相信肯定有辦法以一種明確的方式實現這一點。任何人都可以爲此考慮一個解決方案嗎?

任何幫助表示讚賞,如果它解決了我的問題,我很樂意使用cmake。

謝謝!

回答

0

也許你可以使用EXTRA_foo_SOURCES?您可能無法在變量賦值的LHS中使用變量替換,但您當然可以在RHS中這樣做。列表全部EXTRA_foo_SOURCES中的可能來源,然後根據.config定義的內容設置foo_SOURCES - 並考慮使用+=做這件事。

您可能必須根據y/m/n來創建文件擴展名約定才能獲得所需的不同行爲;可能爲foo_SOURCES = mod.yo(對於* _SOURCES *變量,不要讓* .o分散注意力 - 只需提供規則並讓它算出),foo_SOURCES = mod.mo用於可加載模塊,foo_SOURCES = mod.no用於禁用的模塊。然後你需要幫助膠合規則在一起。東西給你一些想法:

-include .config 
EXTRA_foo_SOURCES = $(obj-y) $(obj-m) 
.c.o: # No rule; disables implicit rule 
.c.yo: 
    $(COMPILE) -o [email protected] $< 
.c.mo: 
    $(COMPILE) -DTHIS_IS_A_MODULE -o [email protected] $< 
.c.no: 
    touch [email protected] 
.yo.o: 
    cp $< [email protected] 
.mo.o: 
    cp $< [email protected] 
.no.o: 
    cp /path/to/null/object.o [email protected] 

希望你能做到這一點。我把它作爲汽車原子的湯來呈現,而不是成品,希望你能把它變成一個美麗的分子。