2014-12-05 95 views
0

我最近转换为GNU make use。我试图滥用Makefile来处理所有类型的文件,因为Makefile提供了并行和检查点功能。这是我的问题:如何指定makefile的可选依赖关系

我有很多pdf文件,我解析为csv。在PDF文件中的分层文件夹结构:

level1/ 
    level2_1/ 
     level3_1_1.pdf 
     level3_1_2.pdf 
    level2_2/ 
     level3_2_1.pdf 
     level3_2_2.pdf 

我有我的脚本规则:

%.csv: %.pdf 
     python parsepdf.py $< [email protected] 

但现在我想连接所有这些文件。最简单的方法是使用一个简单的查找脚本

cat $(find level1/ -name '*.csv') > level1/level1.csv 

不过,我想这样做在随后与在每个层次创造了一个中间CSV依赖层次结构的方式。我认为这种方法将利用make -j的并行性优势。

level1/level2_1/level_2_1.csv : level1/level2_1/level3_1_1.csv level1/level2_1/level3_1_2.csv 
     cat $* > [email protected] 
level1/level2_2/level_2_2.csv : level1/level2_2/level3_2_1.csv level1/level2_2/level3_2_2.csv 
     cat $* > [email protected] 
level1/level1.csv : $(wildcard level1/level2_*.csv) 
     cat $* > [email protected] 

但上面的方法为两个问题:

  • 即使CSV文件的一个不存在,水平最高的csv文件将不会被创建。我的要求是,即使有一个文件,我应该继续并创建一个csv级别文件。
  • 如何在层次结构中自动为这两个级别生成这些规则(可以只假设两个级别)。每个级别可以有不同数量的pdf文件。

Makefile是一个很好的工具吗?如果是的话,在makefile中指定这个目标的最Makefile's方式是什么?

+1

make是处理一些文件编写其他文件一个很好的工具。但是,你的问题和例子并不清楚。你需要阅读你的问题,并问问自己'是否有人不知道它已经明白我在写什么'。如果你很难把自己置于这个位置,让其他人阅读这些,而你没有告诉他们任何事情,你会看到他们是否理解。我敢打赌他们不会。 一旦你的问题写得很好,我会回答它。 – 2014-12-05 11:52:09

回答

1

我会猜测你想要什么,因为它不是很清楚你的问题。

使用find,通配符或$(wildcard)来生成预先声明列表是一种不好的做法。躲开它。只需明确列出它们。如果您需要自动执行此过程,则始终可以通过一些脚本为您生成Makefile,并在必要时手动进行编辑。

然后你就可以有

define CONCATENATE_RULE               
$1: $2 Makefile                 
     cat $2 > $1                
endef                   

$(eval $(call CONCATENATE_RULE, level1/level2_1/level_2_1.csv,\ 
    level1/level2_1/level3_1_1.csv \ 
    level1/level2_1/level3_1_2.csv \ 
)) 


$(eval $(call CONCATENATE_RULE, level1/level2_2/level_2_2.csv,\ 
    level1/level2_2/level3_2_1.csv \ 
    level1/level2_2/level3_2_2.csv \ 
))