我有像这样的文件
1_0_fa.bam 1_1_fa.bam 1_2_fa.bam 1_3_fa.bam 1_4_fa.bam 1_5_fa.bam
1_6_fa.bam 1_7_fa.bam 1_8_fa.bam 1_9_fa.bam 1_0_mo.bam 1_1_mo.bam
1_2_mo.bam 1_3_mo.bam 1_4_mo.bam 1_5_mo.bam 1_6_mo.bam 1_7_mo.bam
1_8_mo.bam 1_9_mo.bam 1_0_p1.bam 1_1_p1.bam 1_2_p1.bam 1_3_p1.bam
1_4_p1.bam 1_5_p1.bam 1_6_p1.bam 1_7_p1.bam 1_8_p1.bam 1_9_p1.bam我想用bin把它们组合起来,这是名字中的第二个数字。这是我的Makefile (GNU make 3.81)
SHELL = /bin/sh
bins = 0 1 2 3 4 5 6 7 8 9
$(info $(bins))
code = 1
define buildVCF
$(info $(1))
$(eval targ = $(code)_$(1)_bin.vcf)
$(info $(targ))
targs += $(targ)
$(eval deps = $(wildcard $(code)_$(1)_*.bam))
$(info $(deps))
$(targ): $(deps)
cat $$^ > $$@
endef
$(foreach bin,$(bins),$(eval $(call buildVCF,$(bin))))
all: $(targs)如果我做了make -n,它会产生
0 1 2 3 4 5 6 7 8 9
0
1_0_bin.vcf
1_0_p1.bam 1_0_mo.bam 1_0_fa.bam
1
1_1_bin.vcf
1_1_fa.bam 1_1_p1.bam 1_1_mo.bam
2
1_2_bin.vcf
1_2_mo.bam 1_2_p1.bam 1_2_fa.bam
3
1_3_bin.vcf
1_3_fa.bam 1_3_mo.bam 1_3_p1.bam
4
1_4_bin.vcf
1_4_mo.bam 1_4_fa.bam 1_4_p1.bam
5
1_5_bin.vcf
1_5_fa.bam 1_5_mo.bam 1_5_p1.bam
6
1_6_bin.vcf
1_6_p1.bam 1_6_fa.bam 1_6_mo.bam
7
1_7_bin.vcf
1_7_fa.bam 1_7_p1.bam 1_7_mo.bam
8
1_8_bin.vcf
1_8_fa.bam 1_8_mo.bam 1_8_p1.bam
9
1_9_bin.vcf
1_9_mo.bam 1_9_p1.bam 1_9_fa.bam
cat 1_0_p1.bam 1_0_mo.bam 1_0_fa.bam > 1_0_bin.vcf为什么不建立其余的目标呢?
发布于 2015-04-15 22:37:27
因为all目标不是Makefile中的第一个。当您调用没有目标的make时,生成Makefile中的第一个规则,在本例中,这是用于1_0_bin.vcf的规则(因为它是首先生成的)。如果您调用make -n all,它将如您所期望的那样工作。
要使它在没有显式规则的情况下工作,只将all目标移到顶部就不能工作,因为targs在这一点上没有正确的值,但是您可以使用一个间接的级别来使它工作:
all: dummy
define buildVCF
...
endef
$(foreach bin,$(bins),$(eval $(call buildVCF,$(bin))))
dummy: $(targs)然而,这似乎是一种相当迂回的做事方式。如果我是你,我会尝试用静态模式规则来解决这个问题,例如
targs = $(foreach bin,$(bins),$(code)_$(bin)_bin.vcf)
all: $(targs)
$(targs) : $(code)_%_bin.vcf : $(foreach i,fa mo p1,$(code)_%_$(i).bam)
cat $^ > $@https://stackoverflow.com/questions/29661945
复制相似问题