Makefile中的高级模式匹配



是否可以创建与两个或三个不同模式匹配的Makefile模式?我正在使用Gnu make.

在我当前的简化设置中,我使用两个Bash for循环将一组文件转换为另一组文件,并创建最终的结果文件。例子:

#!/bin/bash
XMIN=$1
XMAX=$2
YMIN=$3
YMAX=$4
z=$5
FINAL_LIST=
for y in `seq $YMIN $YMAX`;
do
  SOURCE_LIST=
  echo Processing column $y
  for x in `seq $XMIN $XMAX`;
    do
    # Convert from file source/something_${x}_${y}_${z} to
    #    target/something_else_$${x}_${y}_${z}
    echo Processing X ${x} Y ${y} with Z ${z}
    # do_something
    SOURCE_LIST+="target/something_else_$${x}_${y}_${z} "
    done
  # Create something for this line
  echo Processing ${SOURCE_LIST} target_line_${y}_${z}
  # process the line
  FINAL_LIST+="target_line_${y}_${z} "
done
# Finally, compose the final thing
echo Process the final result: ${FINAL_LIST} result_${z}
# process the final result
# We're done

我想用Makefile更有效地做到这一点,因为它允许我并行执行事情,而且它也会注意,"行结果"只有在特定行发生变化时才会重新生成。

我已经使用Makefile将单个数据文件转换为另一种格式,使用简单的模式匹配。Makefile在处理我的>500k数据文件方面非常好-它可以非常快速地检测更改的源文件并仅对更改的数据文件执行转换。

这里的问题是,我不知道,如何使Makefile模式与一个以上的变化模式。下面是一个简单的模式:

%.target : %.source
    # do something

但我不知道,是否可以(作为伪代码):

<var_pat_Z>_<var_pat_Y>.target: <var_pat_Z>_<var_pat_Y>.source
    # do something else

没有必要用Makefile实现这一点,但我仍然需要找到一种方法来检测更改的源文件,以及并行执行的能力。目前,我正在我的bash脚本中处理这些检测,并通过使用Gnu并行命令并行执行bash脚本来并行化。无论如何,这很可能不是最佳方法。

如果我正确理解了你的问题,你有一堆*.source文件,并想要一个规则,将每个变成*.target文件,同时从*扩展到的任何内容中选择两个子字符串。

为什么不在下划线处选择$*中的 ?这里有一个解决方案。如果你有这些文件

$ ls *.source
1_1.source
1_2.source
1_3.source
a_b.source
foo_bar.source

然后运行GNUmakefile的默认目标

# all should depend on all targets for which a source exists.
all: $(shell echo *.source | sed 's/source/target/g')
%.target: %.source
    @z="$*" y="$*"; 
    z=$${z%%_*} y=$${y##*_}; 
    echo z=$$z y=$$y

会给你

$ gmake
z=1 y=1
z=1 y=2
z=1 y=3
z=a y=b
z=foo y=bar

最新更新