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

问题描述 投票:0回答:1

我正在尝试通过伪造的文件名将参数传递给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)无效。

是否有办法解决这两个限制?

gnu-make
1个回答
0
投票

这将首先从目标中提取结束年份部分,然后在模式中以开始年份作为前缀。逐步进行操作。

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

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
© www.soinside.com 2019 - 2024. All rights reserved.