GNU make cómo hacer objetivos en directorios diferentes
Me gustaría que se creen objetivos en un directorio diferente al lugar donde se encuentra el archivo Makefile. Esto se refiere a la salida del paso de procesamiento de macros M4 utilizando archivos *.in.
No puedo encontrar la regla de patrón correcta; supongo que la definición del objetivo no es correcta, pero ¿cómo especificarla? La estructura del proyecto es la siguiente:
prj
+
|
-+-------+-----------+---------------+
| | |
inc src config
| | |
a1-1.h +----------+-- conf.m4
a1-2.h |
app
|
a1-1.in
a1-2.in
Makefile
El código Makefile es el siguiente:
M4INSRCS=$(wildcard *.in)
HTARGETS=$(M4INSRCS:.in=.h)
HDIR=../../inc
.PHONY : all
all: $(HTARGETS) $(MINSRCS)
@echo "INSRCS $(M4INSRCS)"
@echo "HTARGETS $(HTARGETS)"
@echo "HDIR $(HDIR)"
$(HDIR)/%.h : %.in
cp $< $(HDIR)/$@
touch $(HDIR)/$@
Make informa:
make: *** No se encontró ninguna regla para construir el objetivo ‘a1-1.h’, necesario para ‘all’. Detenerse.
davy.ai
Para producir los objetivos en un directorio diferente al donde reside el Makefile, necesitas especificar el directorio en la definición del objetivo. En este caso, la definición del objetivo para copiar la salida procesada por la macro M4 al directorio
inc
no es correcta. La definición del objetivo debería incluir el directorio antes del archivo objetivo, de la siguiente manera:Esta regla de patrón copia los archivos
.h
procesados al directorioinc
con el prefijo definido en$(HDIR)
.Adicionalmente, la variable
MINSRCS
no está definida, lo cual podría causar errores. Esta variable debería ser renombrada aM4INSRCS
para que coincida con su definición en el código.Con estos cambios, el Makefile debería funcionar como se espera.