Цель, не известная заранее в Makefile - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь использовать make-файл для управления процессом сборки в небольшом проекте, где целевое число и целевые имена заранее неизвестны, но зависят от ввода.В частности, я хочу создать группу файлов данных (скажем, .csv файлы) в соответствии с файлом cities_list.txt со списком названий городов внутри.Например, если содержимое txt-файла:

newyork washington toronto

, тогда скрипт с именем write_data.py сгенерирует три файла с именем newyork.csv, washington.csv и toronto.csv.Когда содержимое файла cities_list.txt изменится, я хочу, чтобы make умело справился с этим изменением, то есть обновил только новые файлы городов.

Я пытался определить имена переменных в именах целей, чтобы это произошло, но безуспешно.Сейчас я пытаюсь создать несколько промежуточных файлов .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?Или есть какой-нибудь лучший способ добиться того, что я хотел сделать здесь?

1 Ответ

0 голосов
/ 07 июня 2018

Хорошо, это должно сделать это.Мы хотели бы присвоить переменную в начале файла:

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 := /' $< > $@

и таким образом:

CITIES := $(shell cat cities_list.txt)

После того, как мы выполнили одно из этих двух действий, мы можем составить список необходимых файлов:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...