2016-04-29 30 views
0

说我有这样的源文件的列表:如何使用GNUMake指定目标相关的先决条件?

SOURCE=aaa.src bbb.src ccc.src 

我想创建一个规则来构建成对应的目标在自己的文件夹,它的名称依赖于源文件时。

的资源文件---->相应输出文件/靶


aaa.src -------------------> AAA/AAA .OUT

bbb.src -------------------> BBB/bbb.out

ccc.src --------- ----------> ccc/ccc.out

How do我使用GNUMake为此写了一个规则?我最好的努力是下面的Makefile:

.PHONY: all clean 

CC=somecompiler 

SOURCE := aaa.src bbb.src ccc.src 
RTARGS := $(SOURCE:%.src=%.out) 
TDIRS := $(addsuffix /,$(basename $(SOURCE))) 
TARGS := $(join $(TDIRS), $(RTARGS)) 

all:$(TARGS) 

%.out: $(SOURCE)  # Better source specification? 
    @[ ! -d "$(dir $*)" ] && mkdir "$(dir $*)" 
    $(CC) "$(patsubst %/,%,$(dir $*)).src" "[email protected]" 

clean: 
    rm -f $(TARGS) 
    rmdir --ignore-fail-on-non-empty $(TDIRS) 

这里的问题是,任何一个目标(即.out文件)取决于源(即.src文件),而不是只具有相同的一个基本名称。我可以将注释行更改为%.out: %.src,但源文件必须与输出文件位于同一目录中。我也可以这样编译它:

%.out: %.src 
    $(CC) "$>" -o "$*/[email protected]" 

但是,然后make会总是编译每个目标,不管它是否已经存在或不。

我该如何才能使用适当的源文件。 在通用规则中分别指定每个目标的相关性的正确方法是什么?

回答

1

在GNU让你可以从食谱分别指定的先决条件,而且还有所有.out文件的通用/模式规则:

.PHONY: all clean 

all : 

SOURCES := aaa.src bbb.src ccc.src 
OUTPUTS := $(foreach src,${SOURCES},$(basename ${src})/${src:%.src=%.out}) 

# Build dependencies in the form of x/x.out : x.src | x 
define ESTABLISH_DEPENDENCY = 
$(basename ${1})/${1:%.src=%.out} : ${1} | $(basename ${1}) # Also depend on the output directory. 
$(basename ${1}) : # Rule to create the output directory. 
    mkdir [email protected] 
endef 

$(foreach src,${SOURCES},$(eval $(call ESTABLISH_DEPENDENCY,${src}))) 

all : ${OUTPUTS} 

# Generice rule for all .out files. 
%.out : 
    @echo "build [email protected] from $^" 
    touch [email protected] 

%.src : # For debugging only. 
    touch [email protected] 

.PHONY: all 

输出:

$ make 
touch aaa.src 
mkdir aaa 
build aaa/aaa.out from aaa.src 
touch aaa/aaa.out 
touch bbb.src 
mkdir bbb 
build bbb/bbb.out from bbb.src 
touch bbb/bbb.out 
touch ccc.src 
mkdir ccc 
build ccc/ccc.out from ccc.src 
touch ccc/ccc.out 

请注意,这是更有效而且优雅的是对目录有依赖关系并且让它们创建它们,而不是让每个配方首先检查目录。

+0

好的,基本上,ESTABLISH_DEPENDENCY在调用时会做的是创建一个空的规则,只是指定依赖关系和另一个创建目录的规则。我对吗?无论如何,这非常狡猾。谢谢! –

+0

@ con-f-use权利。为了迂回,它只创建一个依赖关系,没有'.out'的规则。和目录的规则。 –

+0

再次感谢。请忽略我的编辑,我完全忽略了“all:”已经在第三行 –

相关问题