在Makefile中事先不知道目标

在Makefile中事先不知道目标,makefile,build,Makefile,Build,我试图在一个小项目中使用makefile来管理我的构建过程,在这个项目中,目标编号和目标名称事先不知道,但取决于输入。具体地说,我想根据cities_list.txt文件生成一组数据文件,比如.csv文件,其中包含城市名称列表。例如,如果txt文件的内容为: 纽约 华盛顿 多伦多 然后,名为write_data.py的脚本将生成名为newyork.csv、washington.csv和toronto.csv的三个文件。当cities_list.txt文件的内容发生更改时,我希望能够巧妙地处理此更

我试图在一个小项目中使用makefile来管理我的构建过程,在这个项目中,目标编号和目标名称事先不知道,但取决于输入。具体地说,我想根据cities_list.txt文件生成一组数据文件,比如.csv文件,其中包含城市名称列表。例如,如果txt文件的内容为:

纽约 华盛顿 多伦多

然后,名为write_data.py的脚本将生成名为newyork.csv、washington.csv和toronto.csv的三个文件。当cities_list.txt文件的内容发生更改时,我希望能够巧妙地处理此更改,即只更新新添加的cities文件

我试图在目标名称中定义变量名称来实现这一点,但没有成功。我现在尝试创建一组中间.name文件,如下所示:

all: *.csv

%.name: cities_list.txt
        /bin/bash gen_city_files.sh $<

%.csv: %.name write_data.py
        python3 write_data.py $<

clean:
        rm *.name *.csv
这似乎非常接近成功,但它只给了我一个.csv文件。原因很明显,因为make无法确定应该为all目标生成哪些文件。如何让我知道此*.csv应包含存在相应*.name文件的所有文件?或者有没有更好的方法来实现我想在这里做的事情?

好吧,这应该可以。我们希望在文件的开头有一个变量赋值:

CITY_FILES := newyork.csv washington.csv toronto.csv
有两种方法可以做到这一点。这样:

-include cities.mak

# this rule can come later in the makefile, near the bottom
cities.mak: cities_list.txt
    @sed 's/^/CITIES := /' $< > $@
完成其中一项后,我们可以构建所需文件的列表:

CITY_FILES := $(addsuffix .csv, $(CITIES))
并建造它们:

# It is convenient to have this be the first rule in the makefile.
all: $(CITY_FILES)

%.csv: write_data.py
    python3 $< $*.name

谢谢。您是否错过了%.csv:的依赖性?和城市_文件:=$。。。应该包含在makefile代码块中,对吗?谢谢,它可以工作。一个小问题是,每次运行make都会删除那些*.name文件,你知道原因吗?@user123:等等,我太笨了,*.name文件完全不需要。我将再次编辑,并将它们从prereq列表中删除。您好,如果您删除.name文件,%.csv的规则将不正确,为什么您仍然保留$对不起,我最近几天一直在嘈杂的环境中工作,犯了错误。write_data.py脚本需要什么才能生成newyork.csv?它只需要newyork.name作为参数,还是必须有一个名为newyork.name的文件包含重要的内容?
# It is convenient to have this be the first rule in the makefile.
all: $(CITY_FILES)

%.csv: write_data.py
    python3 $< $*.name