Makefile中的高级模式匹配

时间:2015-09-13 11:00:49

标签: regex makefile gnu-make

是否可以创建与两个或三个不同模式匹配的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 parallel命令并行执行bash脚本来实现并行化。无论如何,这很可能不是最佳方式。

0 个答案:

没有答案