es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    $(HDIR)/%.h : %.in
        cp $< $@
        touch $@
    

    Esta regla de patrón copia los archivos .h procesados al directorio inc 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 a M4INSRCS para que coincida con su definición en el código.

    Con estos cambios, el Makefile debería funcionar como se espera.

Comments are closed.