使用自动工具的动态目标

时间:2013-01-20 22:05:55

标签: variables dynamic makefile autotools automake

我正在尝试用autotools实现非常具体的东西 - 动态变量名。我的目标是根据特定的配置文件创建动态目标,类似于Linux内核。

可以使用make menuconfig配置Linux内核,最终生成.config。 Linux内核的Makefile包含obj-$(CONFIG_DMA)等目标,并且根据CONFIG_DMA (y, n or m)的值,相关的源文件将作为模块静态构建,或者根本不构建。我正在使用kconfig-frontends,它允许我生成一个.config文件,然后我可以将其包含在标准GNU Makefile中并成功使用。我想用automake实现相同级别的功能,但遗憾的是,automake拒绝根据外部环境变量设置变量名称。我可以想到解决这个问题的黑客方法,但我确信必须有一种方法可以明确地实现这一目标。谁能想到解决方案?

感谢任何帮助,如果它解决了我的问题,我愿意使用cmake。

谢谢!

1 个答案:

答案 0 :(得分:0)

也许您可以使用EXTRA_foo_SOURCES?您可能无法在变量赋值的LHS中使用变量替换,但您当然可以在RHS上执行此操作。在EXTRA_foo_SOURCES中列出所有可能的来源,然后根据.config定义的内容设置foo_SOURCES - 并考虑使用+=进行操作

您可能必须发明一个文件扩展名约定,以根据y / m / n获得您想要的不同行为;也许foo_SOURCES = mod.yo用于内置模块(并且不要让* .o用于* _SOURCES *变量分散您的注意力 - 只提供规则并制作应该弄清楚),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 $@ $<
.c.mo:
    $(COMPILE) -DTHIS_IS_A_MODULE -o $@ $<
.c.no:
    touch $@
.yo.o:
    cp $< $@
.mo.o:
    cp $< $@
.no.o:
    cp /path/to/null/object.o $@

希望你能做到这一点。我把它作为汽车原子的汤,而不是成品,希望你能把它变成美丽的分子。