2016-03-09 12 views
2

Я раньше не писал Make-файлы, но я подозреваю, что это было бы полезно в моей ситуации. У меня есть набор текстовых файлов, которые мне нужны для предварительной обработки для извлечения функций для машинного обучения. Структура каталогов может выглядеть так:Makefile для БОЛЬШОГО количества файлов

/ 
+---Makefile 
+---/corpus 
| +-- a.txt 
| +-- b.txt 
| +-- ... 
| 
+---/wordcounts 
| +-- a.wordcount 
| +-- b.wordcount 
| +-- ... 
| 
+---/lettercounts 
| +-- a.lettercount 
| +-- b.lettercount 
| +-- ... 
| 
... 

Файлы в /wordcounts и /lettercounts генерируются из файлов в /corpus. Для всего файла a.txt, я могу написать make зависимостей, как это:

all: wordcounts/a.wordcount lettercounts/a.lettercount 

wordcounts/a.wordcount: corpus/a.txt 
    cat corpus/a.txt | wc -w > wordcounts/a.wordcount 

lettercounts/a.lettercount: corpus/a.txt 
    cat corpus/a.txt | wc -m > lettercounts/a.lettercount 

Однако, с тысячами файлов в \corpus этот Makefile будет чрезвычайно долго. Я хочу написать Makefile, который будет настраиваться на любые файлы в \corpus. Идея заключается в том, что независимо от того, сколько файлов я помещаю в /corpus, Makefile автоматически сделает все остальные файлы. Как я могу это сделать? Это то, что для automake?

фон В настоящее время я использую ряд сценариев для создания больших csv файлов, и работаю все сценарии для всего корпуса занимает несколько часов. Мне нужно реструктурировать, чтобы изменения в одном файле не требовали переработки всего корпуса. Я приветствую любые предложения по эффективному созданию проекта, если то, что я предлагаю, не является идеальным.

ответ

2

Вот один из способов достижения этой

corpora  := $(wildcard corpus/*.txt) 
wordcounts := $(corpora:corpus/%.txt=wordcounts/%.wordcount) 
lettercounts := $(corpora:corpus/%.txt=lettercounts/%.lettercount) 

.PHONY: all 
all: $(wordcounts) $(lettercounts) 

$(wordcounts): wcflags += -w 
$(wordcounts): wordcounts/%.wordcount: corpus/%.txt 

$(lettercounts): wcflags += -m 
$(lettercounts): lettercounts/%.lettercount: corpus/%.txt 

$(wordcounts) $(lettercounts): 
    cat $< | wc $(wcflags) > [email protected] 

Выполнить make с -r флагом, чтобы отключить встроенные правила для достижения максимальной производительности.

+0

Для информации других читателей, '$ <' и '$ @' в этом make-файле являются автоматическими переменными: https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html#Automatic -Variables – reynoldsnlp

+0

См. Также Правила статических шаблонов: http://www.gnu.org/software/make/manual/html_node/Static-Usage.html#Static-Usage – reynoldsnlp