2014-08-28 5 views
0

На данный момент я хочу найти что-то, что работает (this и this, не нужно читать, этот текущий вопрос должен быть намного проще).

Я хочу создать задачу make, которая работает в подкаталогах с динамическим (неизвестным) количеством подфайлов. Можете ли вы сделать это в make?

build/%.js: $(shell find apps/% -type f -name '*.js') 

Допустим, вы хотите, чтобы окончательное дерево каталогов, чтобы выглядеть следующим образом:

build/ 
build/page.js 
build/popup.js 
apps/ 
apps/page/ 
apps/page/index.js 
apps/page/lib/ 
apps/page/lib/a.js 
apps/page/lib/b.js 
apps/popup/ 
apps/popup/index.js 

При изменении любого из index.js файлов или файлами вложенными внутри lib/*.js то соответствующая папка должна восстановить.

Как вы это делаете с make? Не повторяясь, это просто сделать, если у вас есть куча похожих задач сборки, которые не являются СУХОЙ.

Я также попытался это:

build/%.js: apps/%/index.js apps/%/lib/*.js 

Но это работает только тогда, когда существует в каждом проекте есть lib/*.js. Проект «popup» в приведенном выше дереве каталогов не имеет этого, поэтому он никогда не строится.

В основном, эти цели должны быть «необязательными». Простой пример заключается в следующем:

build.js: $(shell find apps -type f -name '*.js') 

Это создаст build.js файл, если любой*.js файл в папке apps/ изменилось. В основном это то, что я иду, главное отличие которого я хочу иметь имя переменной Подключайтесь:

build/%.js: $(shell find apps/% -type f -name '*.js') 

Но это не работает, потому что кажется, что % не вычисляется внутри функции $(shell) (не уверен, как это должно работать или где это задокументировано). Но, по сути, это все, что я хочу сделать.

Возможно ли это?

ответ

1

Вы можете определить prereqs для каждой цели, которая соответствует build/%.js «вручную», и при этом сохранить общее правило назначения build/%.js для их создания.

APPS := $(subst apps/,,$(wildcard apps/*)) 

TARGETS := $(patsubst %,build/%.js,$(APPS)) 

all: $(TARGETS) 

# Add prerequisites (based on $(wildcard) output) to each target file. 
$(foreach app,$(APPS),$(eval build/$(app).js: $(wildcard apps/$(app)/lib/*.js))) 

build/%.js: apps/%/index.js 
     @echo 'Building [email protected] from $^' 
Смежные вопросы