2015-03-30 5 views
2

У меня есть makefile для GNU make для создания документов из текстовых файлов разметки. Файл make имеет переменную INPUT Я хочу установить имя файла отметки. Все файлы разметки следуют шаблону * .md.Как установить переменную в Makefile для имени файла с помощью шаблона файла, только если шаблон имеет ОДИН матч

Однако я хочу установить INPUT только имя файла, когда есть только один файл соответствия шаблону, если есть более чем один файл уценки, сделать должен выйти с ошибкой.

Я попробовал очевидный выбор

INPUT ?= *.md 

, но это устанавливает ВХОД конечно к списку ** всех * спичек. Так он работает правильно для каталога, который содержит, скажем, только file_a.md, но в каталоге с

file_a.md 
file_b.md 

INPUT содержит впоследствии «file_a.md file_b.md», который путает мои правила, ожидающие, чтобы содержать один файл или выйти ,

Любой способ назначить INPUT, как я хочу, с синтаксисом makefile?

+0

Что вы хотите назначить 'INPUT', если имеется более одного файла? Ничего? Вы хотите сделать ошибку? –

+0

Да, если есть несколько совпадений, я хочу, чтобы 'make' вышел с ошибкой. – halloleo

ответ

3

Чтобы сделать то, что вы хотите, вам необходимо использовать функцию $(wildcard), чтобы заставить globbing выполняться немедленно (в противном случае make будет ждать, пока переменная не будет использоваться в соответствующем месте перед расширением glob).

INPUT ?= $(wildcard *.md) 

ifneq (1,$(words $(INPUT))) 
    $(error Too many or two few input files found.) 
endif 
+0

Отличная идея использовать функцию подстановки. Это то, чего мне не хватало. Спасибо! – halloleo