生成文件模式规则和通配符 - 如何将两个参数从目标传递到配方



我正在尝试通过虚假的文件名将参数传递给 stata do-file,我想知道是否有办法绕过只有一个模式规则的限制。

假的:

test: file1_2005_2010.dta file1_2004_2008.dta

在另一个makefile中,我现在想要解析这些开始和结束年份,理论上这将通过在stata do文件中解析2005_2010和2004_2008来工作:

file1_%.dta: 
cd path/folder && YEAR=$* $(STATA) dofile.do

但问题是某些先决条件中只有开始年份,必须动态进行,以便在这种情况下我只能使用 2005 年的 %:

file1_2005_2010.dta: file2_2005.dta
cd path/folder && $(STATA) dofile.do
file1_%_2010.dta: file2_%.dta
cd path/folder && YEAR=$* $(STATA) dofile.do

我不一定需要 2010 来匹配任何先决条件文件名,它只需要传递给配方。如果目标尚不存在,则使用 2010 (file1_%_*.dta( 的通配符也不起作用。

有没有办法绕过这两个限制?

这将首先从目标中提取结束年份部分,然后在模式中以开始年份作为前缀。一步一步地走过它。

为了获取目标文件名,我们使用自动变量$@

YEAR=$@
# Year is file1_2005_2010.dta

删除后缀.dta

YEAR=$(basename $@)
# Year is file1_2005_2010

用空格交换 _ 以创建单词:

YEAR=$(subst _, ,$(basename $@))
# Year is "file1 2005 2010"

摘录最后一句话:

YEAR=$(lastword $(subst _, ,$(basename $@)))
# Year is 2010

最后加上开始年份的前缀:

YEAR=$*_$(lastword $(subst _, ,$(basename $@)))
# Year is 2005_2010

最新更新