¿Se puede hacer $ (comodín% / ** / *. C) en un archivo MAKE?

Como seguimiento deesta pregunta, hay un caso más que no he podido resolver en unas pocas horas de retoques.

Así es como se ve actualmente el archivo MAKE:

output = $(shell find lib -type f -name '*build.js' -or -name '*build.css')
myth = ./node_modules/.bin/myth
duo = ./node_modules/.bin/duo

build: $(output)

%/build/build.js: %/index.js %/lib/*.js node_modules component.json
  @mkdir -p '$(@D)'
  @$(duo) '$*'/index.js > '$@'

%/build/build.css: %/index.css %/lib/*.css node_modules component.json
  @mkdir -p '$(@D)'
  @$(duo) '$*'/index.css | $(myth) > '$@'

node_modules: package.json
  @n 0.11.13
  @npm install
  @touch node_modules # make sure folder is updated later than package.json

La pieza que he agregado a la gran respuesta en esa otra pregunta es la%/lib/*.js y%/lib/*.css aquí mismo:

%/build/build.js: %/index.js %/lib/*.js node_modules component.json

Eso parece funcionar bien si tiene todos los archivos necesarios, lo que significa que la estructura del directorio se ve así:

component.json
lib/
lib/page/
lib/page/build/
lib/page/build/build.js
lib/page/index.js
lib/page/lib/
lib/page/lib/a.js
lib/page/lib/b.js
lib/popup/
lib/popup/build/
lib/popup/build/build.js
lib/popup/index.js
lib/popup/lib/
lib/popup/lib/a.js
lib/popup/lib/b.js
node_modules/
package.json

Con esa tarea de creación actual, reconstruye el subproyecto / carpeta adecuado (página / ventana emergente / etc.) Si cambia un archivo dentro de esa carpeta. De todos modos, esono lo hace reconstruir si eresfalta una de las dependencias.

Por ejemplo, en la siguiente estructura de carpetas, el subproyecto "emergente" se compilará bien (porque todavía tiene todas las dependencias de destino requeridas). Sin embargo, el subproyecto "página" nunca se construirá, porque le falta%/lib/*.js archivos:

component.json
lib/
lib/page/
lib/page/build/
lib/page/build/build.js
lib/page/index.js
lib/popup/
lib/popup/build/
lib/popup/build/build.js
lib/popup/index.js
lib/popup/lib/
lib/popup/lib/a.js
lib/popup/lib/b.js
node_modules/
package.json

Entonces, en esta situación, la única forma en que se construirá es si tienes ambos%/index.js y algunos archivos coincidentes%/lib/*.js.

Mi pregunta es, ¿cómo haces que funcione para ambos casos?

Esencialmente, todo lo que quiero es reconstruir un subproyecto si alguno de los archivosexcepto los de build / build.js cambio. Es decir, si algún archivo ha cambiado esono coincide con el nombre del objetivo, luego ejecute la tarea.

¿Cómo haces esto?

He intentado esto:

%/build/build.js: %/**/*.js node_modules component.json

Pero eso se equivoca con esto:

make: Circular lib/page/build/build.js <- lib/page/build/build.js dependency dropped.

Porque coincide con el nombre del objetivo.

También parece que podría ser posible usar$(filter pattern, text) o$(filter-out, pattern, text), pero no he tenido éxito con eso.

%/build/build.js: $(filter-out %/build/build.js, %/**/*.js) node_modules component.json

Parece que podría incluir todos los archivos coincidentes%/**/*.js (entonceslib/page/index.jsylib/page/lib/a.js si eso estaba presente), y solo excluirlib/page/build/build.js. Pero, no he tenido suerte con eso, tal vez solo lo estoy usando incorrectamente.

¿Cómo haces que esto funcione?

Respuestas a la pregunta(0)

Su respuesta a la pregunta