如何有条件地附加到Makefile函数中的变量?

如何有条件地附加到Makefile函数中的变量?,makefile,gnu-make,Makefile,Gnu Make,我在common make文件中有以下构造,该文件将由 特定于模块的生成文件- # Conditionally add Logger as a MUT dependency define COND_ADD_LOGGER $if($$(findstring -DLOGGER, $$(DEFINES)), SOURCES += logger.c) endef define CMN_TESTS_RULE $(COND_ADD_LOGGER) $(eval OBJECTS = $(SOURCES:.c

我在common make文件中有以下构造,该文件将由 特定于模块的生成文件-

# Conditionally add Logger as a MUT dependency
define COND_ADD_LOGGER
$if($$(findstring -DLOGGER, $$(DEFINES)), SOURCES += logger.c)
endef

define CMN_TESTS_RULE
$(COND_ADD_LOGGER)
$(eval OBJECTS = $(SOURCES:.cpp=.o))
$(eval OBJECTS := $(OBJECTS:.c=.o))
$(TARGET): $(OBJECTS)
    $(COMPILE_RULE_CMN)
endef
在我的模块的Makefile中,我这样做-

SOURCES = a.c b.c test.cpp

TARGET = generic_tests
$(eval $(CMN_TESTS_RULE))
这并不像我预期的那样将logger.c文件添加到源代码列表中。 (定义变量的
中肯定有子字符串“-DLOGGER”。)

这是我使用
info
-

$if($(findstring -DLOGGER, $(DEFINES)), SOURCES += logger.c)


generic_type_abstraction_tests: a.o b.o test.o
        g++ -o $@ $^ D:/TEST/gtest-1.7.0/make/gtest_main.a
$if($(findstring -DLOGGER, $(DEFINES)), SOURCES += logger.c)


generic_type_abstraction_tests: a.o b.o test.o
        g++ -o $@ $^ D:/TEST/gtest-1.7.0/make/gtest_main.a

我正在Windows 8机器上使用CYGWIN的GNU Make版本3.81。

在您的Make文件中有一些东西对我来说没有意义(特别是嵌套
eval
的奇怪用法)。我建议用以下方法解决这些问题:

# Conditionally add Logger as a MUT dependency
define COND_ADD_LOGGER
SOURCES += $(if $(findstring -DLOGGER,$(DEFINES)),logger.c)
endef

define CMN_TESTS_RULE
$(COND_ADD_LOGGER)
OBJECTS = $$(patsubst %.c,%.o,$$(patsubst %.cpp,%.o,$$(SOURCES)))
$(TARGET): $$(OBJECTS)
    $(COMPILE_RULE_CMN)
endef

SOURCES = a.c b.c test.cpp

TARGET = generic_tests

$(eval $(CMN_TESTS_RULE))

.PHONY: debug

debug:
    $(info SOURCES: $(SOURCES))
    $(info OBJECTS: $(OBJECTS))
演示:


我的主要错误是使用
$(目标):$(对象)
而不是
$(目标):$(对象)
。谢谢你的帮助。
$ make debug
SOURCES: a.c b.c test.cpp 
OBJECTS: a.o b.o test.o
gmake: 'debug' is up to date.
$ make DEFINES=-DLOGGER debug
SOURCES: a.c b.c test.cpp logger.c
OBJECTS: a.o b.o test.o logger.o
gmake: 'debug' is up to date.