2

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

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

任何帮助表示赞赏,如果它解决了我的问题,我愿意使用 cmake。

谢谢!

4

1 回答 1

0

也许你可以使用EXTRA_foo_SOURCES?您可能无法在变量赋值的 LHS 中使用变量替换,但您当然可以在 RHS 上这样做。列出所有可能的来源EXTRA_foo_SOURCES,然后根据.config定义,设置foo_SOURCES- 并考虑使用+=for do to。

您可能必须发明一个文件扩展名约定以根据 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 $@

希望你能有所作为。我把它作为汽车原子的汤,而不是成品,希望你能把它变成一个美丽的分子。

于 2013-01-20T22:30:37.597 回答