makefile变量扩展

时间:2012-07-27 15:48:16

标签: makefile gnu-make

我有一些互相使用的库。每当我构建其中任何一个时,我都需要定义预处理器定义以确保使用适当的可见性修饰符(例如,windows中的dllimport / dllexport)。

所有的库都使用相同的makefile,即它们共享规则,CFLAGS等。所有这些库只有输入文件列表不同,其余的makefile由lib共享。

共享的makefile有一个包含所有lib列表的变量,如下所示:

MODULE_LIBS = liba123 libb456 libc999

然后,我需要为每个libs启用这些预处理器定义:

For liba123: -Da123_EXPORTS
For libb456: -Db456_EXPORTS
For libc999: -Dc999_EXPORTS

这些lib中的每一个都存在于它们各自的子文件夹中,这些子文件夹是libs本身的名称(例如liba123,libb456等)。 所以,我写了这个makefile技巧,根据正在编译的文件的路径启用这些EXPORTS定义:

%。o:%。c
$(CC)$(CPPFLAGS)$(CFLAGS) -D $(过滤器$(MODULE_LIBS),$(替换lib,,$(,/,$ @)))_出口 -c - o $ @<


我必须在整个地方添加那个东西('-D $(过滤器$(MODULE_LIBS),$(替换lib,,$(,$,))_ EXPORTS'),因为我有许多类似的规则。所有这些不同的规则都无法做到,但有一个共同点:$(CPPFLAGS)。
 这是问题所在。我可以将“-D $(过滤器$(MODULE_LIBS),$(替换lib,,$(,/,$)))_ EXPORTS”添加到CPPFLAGS,以便所有这些makefile变量只会扩展到位它在哪里使用?

1 个答案:

答案 0 :(得分:0)

我想我会这样做:

liba123/%.o : EXPORTS=a123_EXPORTS
libb456/%.o : EXPORTS=b456_EXPORTS
libc999/%.o : EXPORTS=c999_EXPORTS

%.o: %.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -D$(EXPORTS) -c -o $@ $<

但如果您愿意,可以将它们放入CPPFLAGS中:

liba123/%.o : CPPFLAGS+=-Da123_EXPORTS
libb456/%.o : CPPFLAGS+=-Db456_EXPORTS
libc999/%.o : CPPFLAGS+=-Dc999_EXPORTS