Parallel processing 如何为makefile指定可选依赖项

Parallel processing 如何为makefile指定可选依赖项,parallel-processing,makefile,Parallel Processing,Makefile,我最近转换为GNU使用。由于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 p

我最近转换为GNU使用。由于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 $< $@
但是,我希望以一种遵循依赖关系层次结构的方式来执行此操作,并在层次结构的每个级别创建一个中间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 $* > $@
level1/level2_2/level_2_2.csv : level1/level2_2/level3_2_1.csv level1/level2_2/level3_2_2.csv
         cat $* > $@
level1/level1.csv : $(wildcard level1/level2_*.csv)
         cat $* > $@
但上述方法存在两个问题:

  • 即使其中一个csv文件不存在,也不会创建升级csv文件。我的要求是,即使有一个文件,我也应该继续创建一个升级的csv文件
  • 如何为层次结构中的两个级别(确定为仅假设两个级别)自动生成这些规则。每个级别可以有不同数量的pdf文件

Makefile是执行此类任务的好工具吗?如果是,在Makefile中指定此目标的最类似Makefile的方式是什么?

我将猜测您想要的是什么,因为您的问题并不十分清楚

使用
find
、通配符或
$(通配符)
生成预请求列表是一种不好的做法。避免它。只需明确列出它们。如果您需要自动化这个过程,您总是可以让一些脚本最初为您生成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 \
))

Make是一个非常好的工具,用于处理某些文件以编写其他文件。然而,你的问题和例子并不清楚。你需要阅读你的问题并问自己“一个还不知道的人能理解我在写什么吗?”。如果你很难把自己放在这个位置上,让别人读一下,你什么都不告诉他们,你就会看到他们是否理解。我打赌他们不会的。一旦你的问题写好了,我会回答的。
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 \
))