我正在尝试通过虚假的文件名将参数传递给 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