2017-02-18 33 views
0

我有一个数据处理工作,我希望使用Make进行自动化。需要分几步处理数百个文件。 不幸的是,基本名称至少会改变其中一个步骤,但将这些依赖项编写成一个单独的文件并将其包含在其中很容易。GNU使用不同文件基名的模式规则

但是,我想避免分别编写所有这些文件的构建指令(这非常复杂)。

我设想沿着这些路线的东西:

# automatically generated rules, included into make file 
dir1/test.bb: dir2/test_other_name.aa 
# (many more rules like the above, linking xxx.bb to yyy.aa) 

# pattern rule 
%.bb: %.aa 
     # build step using [email protected] $> 

我想是的模式规则提供的规则,以及明确的规则定义的依赖关系。可以这样做吗?

+0

一个更具体的例子将极大地澄清这里提出的问题,我想。 –

回答

0

使的noddy图案不切芥子, 只是明确地写出规则。 (这还没有使用模式规则的愉快的副作用。)

假设你有一个函数src-to-target这将生成目标文件名(即$(call src-to-target,dir2/test_other_name.aa)扩展到dir1/test.bb

而且,你有一个清单在${srcs},并${recipe}来源是shell命令的使用[email protected],列表$<

define src-to-target = ... # $1:source 

define recipe = 
    echo Building [email protected] from $< 
    ⋮ 
endef 

define generate-rule = # $1:source 
target := $(call src-to-taget,$1) 
targets += $${target} 
$${target}: $1 ; $${recipe} 
endef 

$(foreach _,${srcs},$(eval $(call generate-rule,$_))) 

.PHONY: all 
all: ${targets} ; : [email protected] Success 

的​​在这里所做的所有工作。

所以,看在痛苦的细节,

  • 一是扩大${srcs}
  • 设置$_到列表中的第(dir2/test_other_name.aa说)
  • 展开$(call generate-rule,$_)

    • 展开$(call generate-rule,dir2/test_other_name.aa)
      • $1设置为dir2/test_other_name.aa,和$(generate-rule)膨胀如下,导致文本

        target := dir1/test.bb
        targets += ${target}
        ${target}: dir2/test_other_name.aa ; ${recipe}

  • 的该块作为一个副作用,$(eval)吞下上述文字。 $(eval)的扩展虽然是空的。

  • $_设置为下一个源文件。
  • 洗净,起泡,冲洗,重复

一旦$(foreach)完成后, ${targets}包含目标的完整列表。

平行安全也。 不喜欢什么?

相关问题