Как использовать makefile для запуска обработки данных при изменении входных файлов? - PullRequest
1 голос
/ 18 апреля 2019

Я хотел бы, чтобы при запуске make выполнялась обработка данных, и один или несколько файлов во входном каталоге изменились. С моим текущим Makefile обработка не запускается.

Допустим, я создаю примерный проект: две директории, одна с файлами данных. Используйте этот скрипт:

#!/bin/bash

mkdir -p proj/input
mkdir -p proj/output
cd proj/input
echo "a2018" > 2018a.txt
echo "b2018" > 2018b.txt

echo "a2019" > 2019a.txt
echo "b2019" > 2019b.txt

Мой Makefile:

#proj/Makefile

RAW := $(shell find input -name "*.txt")
OUT := ./output

.PHONY: all

all: $(OUT)/*.txt
    echo "Running processing of raw files"

$(OUT)/2018merged.txt: $(RAW)
    ./merge.sh 2018

$(OUT)/2019merged.txt: $(RAW)
    ./merge.sh 2019 

Сценарий объединения выполняет базовую конкатенацию файлов по годам из имени файла и сохраняет результат в файле в выходном каталоге.

#!/bin/bash
# proj/merge.sh

echo "-- merging files for $1"
cat input/$1*.txt > "./output/$1merged.txt"

Я полагал, что предоставления всех файлов во входном каталоге в качестве предварительного условия будет достаточно, но, очевидно, я делаю что-то не так. Я нашел несколько вопросов относительно подобных проблем, и частичные решения могут быть там:

1 Ответ

0 голосов
/ 18 апреля 2019

Рассмотрим это правило:

all: $(OUT)/*.txt
        echo "Running processing of raw files"

Здесь указано, что all зависит от всех файлов в каталоге $(OUT), соответствующих шаблону *.txt.

Ну, конечно, прежде чем вы запустите свой make-файл, там нет файлов : в этом весь ваш make-файл, чтобы создать их. Поэтому при первом запуске make этот шаблон расширяется до нуля, и поэтому нет никаких предпосылок для all, и, таким образом, ничего не делается.

Если вы хотите построить список целей для построения, вы должны сделать это на основе исходных файлов, которые будут существовать всегда, или в этом случае, когда они не совпадают точно, у вас есть перечислить их явно:

YEARS = 2018 2019

all: $(patsubst %,$(OUT)/%.txt,$(YEARS))
        echo "Running processing of raw files"
...