2015-08-25 2 views
0

Я просто не могу понять, как получить это желаемое поведение внутри Makefile:использование оболочки найти в Makefile для комков

1) использование находит расширить поиск Глоба в /path/match/1, /path/match/2 и т.д ..

2) установить этот путь в переменную Make

Возможно, кто-то может прочитать мой разум и интерпретировать эту (неправильную) попытку в законную команду Make?

Makefile DIRS := $(shell find ./web/{$$(FEATS)}/tests -name "*-spec.js")

и выполнить/потреблять этот Makefile, я обеспечить FEATS как экспорт.

export FEATS=feature-a,feature-b make run-some-target

ответ

2

Команда оболочки, что вы выполняете это

find ./web/{$(FEATS)}/tests -name "*-spec.js" 

Т.е. запустите команду оболочки FEATS, замените ее вывод на параметры для find, а затем запустите find. Для того, чтобы исправить, вы должны предоставить только один $ -знак, т.е.

DIRS := $(shell find ./web/{$(FEATS)}/tests -name "*-spec.js") 

Что случилось, что make обычно интерпретирует $ как начало замену. Но иногда нужно передавать литералы $ командам, и это можно сделать, если предшествовать $ другим $. Затем Make будет свернуть это до одного $.

Также, когда вы вызываете марку, вы используете export. Экспорт не работает таким образом, вы, вероятно, имел в виду, чтобы выполнить одно из следующих действий:

# note the ';' 
export FEATS=feature-a,feature-b; make run-some-target 
# or 
env FEATS=feature-a,feature-b make run-some-target 
# or 
FEATS=feature-a,feature-b make run-some-target 
# or 
make FEATS=feature-a,feature-b run-some-target 
+0

справа. Расширение переменной make является либо '$ (VAR)', либо '$ {VAR}'. Расширение переменной оболочки внутри команды make recipe/'$ (shell)' '' $$ var' или '$$ {var}'. –

+0

Ах да, я хотел иметь && между экспортом и сделать. Однако при этом удалении $ я получаю 'find: './web/{some-feature}/tests': нет такого файла или каталога' с' export FEATS = some-feature', и на самом деле есть ./web/some-feature/tests каталог? – Clev3r

+0

@Clever В оболочке должно быть не менее 1 запятой, чтобы оболочка могла расширять фигурные скобки, поэтому '{a}' остается '{a}', тогда как '{a, b}' становится 'a' и' b'. – meuh

2

экс-Барта answer является правильным, но когда вам не нужно найти, но только расширение Глоб (например: web/*/tests/*-spec.js) вас может заинтересовать встроенная команда $(wildcard).

К сожалению, это не относится к расширению стиля {a, b}, только ? и *. Но если вы готовы изменить свой синтаксис «б» вместо этого, вы можете использовать $(foreach) встроенный перебирать их:

FEATS='feature-a feature-b' make 

с Makfile:

DIRS := $(foreach v,$(FEATS),$(wildcard web/$(v)/tests/*-spec.js)) 
Смежные вопросы