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.

Traduzco documentos de IT al español. Por favor, proporcióname el nombre del archivo y también incluye los archivos mk (mk significa Makefile) en el lugar correspondiente usando GNU make.

Supongamos que hay un directorio /opt/dvp/gmake/, y en este directorio hay tres archivos: a.mk, a-b.mk y a-b-c.mk.

Solo para aclarar, en a-b-c.mk hay definiciones y configuraciones para un programa específico, biblioteca, etc., que genéricamente llamo artefacto. En a-b.mk hay definiciones para todos los artefactos en el grupo a-b, y en a.mk hay definiciones para todos los artefactos en el grupo a.

Quiero escribir un archivo makefile en el que llame a make ARTIFACT=/opt/dvp/gmake/a-b-c.mk, y en el makefile se incluyan automáticamente -include /opt/dvp/gmake/a-b-c.mk, -include /opt/dvp/gmake/a-b.mk y -include /opt/dvp/gmake/a.mk.

He revisado aquí, aquí, aquí, en la documentación de GNU Make, he intentado muchas formas de foreach en combinación con las funciones call y shell, pero no fui capaz de hacerlo.

Gracias de antemano.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr esto, puedes utilizar la función wildcard para encontrar todos los archivos .mk en el directorio /opt/dvp/gmake/. Luego, utiliza la función filter para filtrar el archivo especificado por ARTIFACT. Por último, utiliza la función foreach para incluir todos los archivos restantes.

    Aquí tienes un ejemplo de makefile:

    MKFILES := $(wildcard /opt/dvp/gmake/*.mk)
    
    define include_file
        -include $(1)
    endef
    
    all:
        $(foreach file,$(filter-out $(ARTIFACT),$(MKFILES)), \
            $(call include_file,$(file)) \
        )
        -include $(ARTIFACT)
    

    En este makefile, la variable MKFILES contiene una lista de todos los archivos .mk en el directorio. La función include_file define un comando para incluir un archivo específico utilizando la opción -include. El objetivo all utiliza foreach para llamar a include_file para cada archivo en MKFILES que no sea el archivo especificado por ARTIFACT, y luego incluye el archivo especificado por ARTIFACT al final.

    Para ejecutar este makefile, simplemente llama a make ARTIFACT=/opt/dvp/gmake/a-b-c.mk.

Comments are closed.