2015-03-13 53 views
1

我有一个make项目,其中包含两个实际目标,一个测试套件和该项目的可执行文件。Make:如何生成除一个以外的所有.c文件的列表

建立这些我想规则是这样的:

testsuite: *.c (except executable.c) *.h 
    clang ... *.c (except executable.c) -o testsuite 

executable: *.c (except testsuite.c) *.h 
    clang ... *.c (except testsuite.c) -o executable 

什么是这个正确的语法,如果可能的话?

+1

就像一个想法;你可以把你的.c文件放在一个单独的目录中,不包括这两个目标。 – crawton 2015-03-13 13:27:37

回答

2

像这样的东西应该做你想做的。

# Explicitly list the sources specific to each target. 
EXECUTABLE_SOURCES := executable.c 
TESTSUITE_SOURCES := testsuite.c 

# Filter out all specific sources from the common wildcard-ed sources. 
COMMON_SOURCES := $(filter-out $(TESTSUITE_SOURCES) $(EXECUTABLE_SOURCES),$(wildcard *.c)) 

testsuite: $(TESTSUITE_SOURCES) $(COMMON_SOURCES) 
     clang .... 

executable: $(EXECUTABLE_SOURCES) $(COMMON_SOURCES) 
     clang .... 
1

警告:我没有测试

您可以使用类似testsuite: $(filter-out executable.c,$(wildcard *.c))。我认为wildcard函数是需要的,因为你不想对字符串“* .c”进行操作,但它的扩展。先决条件自动扩展,但函数参数不是。从info make

通配符扩展,则是由“让”的目标 自动和先决条件。在食谱中,shell负责通配符 的扩展。在其他情况下,通配符扩展仅在您使用“通配符”功能显式请求 时发生。

相关问题