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

时间:2017-11-08 13:17:07

标签: makefile gnu-make

我在公共make文件中有以下构造,该文件将被包含在内 模块特定的Makefile -

# 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文件添加到SOURCES列表中。 (DEFINES变量肯定有子字符串" -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版。

1 个答案:

答案 0 :(得分:1)

在Makefile中有一些对我没有意义的事情(特别是对嵌套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.