Есть ли прочь, чтобы заставить make применить правило к каждому файлу, который соответствует шаблону?

Я работаю над проектом, который имеет структуру каталогов, которая выглядит примерно так:

inputs/ a.txt b.txt c.txt outputs/ a.out b.out c.out makefile 

Файлы в папке outputs генерируются из файлов в папке inputs и я хочу автоматически обновлять их, когда изменяется один из входных файлов.

Я попытался сделать это, создав make-файл с правилом шаблона. (Чтобы этот вопрос был прост, я просто копирую входной файл вместо его преобразования)

 outputs/%.txt: inputs/%.out cp $< $@ 

Однако этот make-файл не совсем сделал то, что я хочу. Если я запустил make outputs/a.txt он применит правило, которое я написал и регенерировал выходной файл, если он устарел, но если я просто запустил make ничего не произойдет:

 make: *** No targets. Stop. 

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

edit : сделанные выходные файлы имеют другой суффикс файла, чем входные файлы.

  • Получить каталог верхнего уровня из переменной makefile
  • obfsproxy не удается построить, потому что он не может найти event2 / util.h
  • gnu make: ": = $ (выражение)" vs ": = @ (выражение)"
  • Что такое аргумент задания по умолчанию для make?
  • Как вы можете избежать сглаживания конфигурационных файлов при установке с помощью make
  • Удаление программного обеспечения, построенного на основе Source
  • Использовать переменную для строковой подстановки в make-файле
  • Является ли `make -j` (без аргументов) опасным?
  • One Solution collect form web for “Есть ли прочь, чтобы заставить make применить правило к каждому файлу, который соответствует шаблону?”

    Обычно вы делаете это с make-файлом примерно так:

     IN = $(wildcard inputs/*.txt) OUT = $(subst inputs/,outputs/,$(IN)) outputs/%.txt: inputs/%.txt cp $< $@ default: $(OUT) 

    Это делает цель по умолчанию (первая в файле), зависит от OUT которая является расширением glob существующих файлов в IN с изменением строки каталога с входов на выходы.


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

     IN2 = $(addsuffix .out,$(basename $(IN))) 

    Функция basename удалит конечный .txt , а addsuffix добавит конечный .out .

    Linux и Unix - лучшая ОС в мире.