GNU crea con muchos directorios de destino

engo que integrar la generación de muchos archivos HTML en una @ existenMakefile. El problema es que los archivos HTML deben residir en muchos directorios diferentes. Mi idea es escribir una regla implícita que convierta el archivo fuente (* .st) en el archivo html correspondiente

%.html: %.st
    $(HPC) -o $@ 
%.html: %.st
    $(HPC) -o $@ $<
lt;

y una regla que depende de todos los archivos html

all: $(html)

Si el archivo HTML no está en el builddirmake no encuentra la regla implícita:*** No rule to make target. Si cambio la regla implícita así,

$(rootdir)/build/doc/2009/06/01/%.html: %.st  
    $(HPC) -o $@ 
$(rootdir)/build/doc/2009/06/01/%.html: %.st  
    $(HPC) -o $@ $<
lt;

se encuentra, pero luego tengo que tener una regla implícita para casi todos los archivos del proyecto. De acuerdo a Algoritmo de búsqueda de reglas implícitas en el GNUmake manual, la búsqueda de reglas funciona así:

Split t en una parte del directorio, llamada d, y el resto, llamada n. Por ejemplo, si t essrc/foo.o', then d is src / 'yn es `foo.o'.Haga una lista de todas las reglas de patrón, uno de cuyos objetivos coincida con t o n. Si el patrón de destino contiene una barra inclinada, se compara con t; de lo contrario, contra n.

Por qué no se encuentra la regla implícita y cuál sería la solución más elegante, suponiendo GNUmake se usa @

Aquí hay una versión reducida de miMakefile:

rootdir  = /home/user/project/doc
HPC      = /usr/local/bin/hpc

html = $(rootdir)/build/doc/2009/06/01/some.html

%.html: %.st
    $(HPC) -o $@ 
rootdir  = /home/user/project/doc
HPC      = /usr/local/bin/hpc

html = $(rootdir)/build/doc/2009/06/01/some.html

%.html: %.st
    $(HPC) -o $@ $<

#This works, but requires a rule for every output dir
#$(rootdir)/build/doc/2009/06/01/%.html: %.st  
#   $(HPC) -o $@ $<

.PHONY: all
all: $(html)
lt; #This works, but requires a rule for every output dir #$(rootdir)/build/doc/2009/06/01/%.html: %.st # $(HPC) -o $@
rootdir  = /home/user/project/doc
HPC      = /usr/local/bin/hpc

html = $(rootdir)/build/doc/2009/06/01/some.html

%.html: %.st
    $(HPC) -o $@ $<

#This works, but requires a rule for every output dir
#$(rootdir)/build/doc/2009/06/01/%.html: %.st  
#   $(HPC) -o $@ $<

.PHONY: all
all: $(html)
lt; .PHONY: all all: $(html)

Respuestas a la pregunta(8)

Su respuesta a la pregunta