2012-10-02 9 views
6

Buscando ayuda para pasar variables de un nivel al siguiente en un archivo MAKE. Tengo un árbol de fuentes que debe construirse para ejecutarse en varias arquitecturas de destino. Para mantener el makefile de nivel superior limpio, creé makefiles separados que contienen información específica de arquitectura e incluyo solo el que se requiere con la directiva include :)Pasando variables de la directiva include a la subcomposición

Más tarde, en el archivo MAKE, transfiero a otro directorio para compilar los archivos fuente. La construcción falla y veo que la falla es causada por las variables específicas de la arquitectura que no se pasan.

ifeq ($(ARCH), my_arch)  | 
include build/my_archdefs.mk | section 1 
endif       | 

<more commands> 
debug: 
     $(MAKE) -C src debug 

El archivo make para compilar el árbol de códigos se encuentra en el directorio src. Como medida de interrupción de parada, incluí la sección 1 mencionada anteriormente en el archivo MAKE de nivel inferior y, en este caso, noté que la variable ARCH no se transmitía.

Aquí hay un par de enlaces que encontré que parecían relacionados, pero no puedo entender lo que tengo que hacer para que esto funcione. http://www.gnu.org/software/make/manual/html_node/Options_002fRecursion.html#Options_002fRecursion http://www.gnu.org/software/make/manual/html_node/Include.html

Me parece que la información que necesito está al acecho en los enlaces que hizo referencia anteriormente, pero simplemente no lo veo. Cualquier puntero será muy apreciado.

Gracias.

Respuesta

6

Este enlace debería ayudar: http://www.gnu.org/software/make/manual/html_node/Variables_002fRecursion.html#Variables_002fRecursion

En el Makefile superior sólo tiene que añadir la línea export y todas sus variables se exportan a sus submakes.

Ejemplo:

Archivo Makefile:

ID=asdf 
export 
all: 
    @echo ${ID} 
    @make -f Makefile2 

Archivo Makefile2:

all: 
    @echo ${ID} 

Salida:

$ make 
asdf 
make[1]: Entering directory `/home/user/Desktop/a' 
asdf 
make[1]: Leaving directory `/home/user/Desktop/a' 
+1

Gracias por el enlace. Eso es lo que necesitaba. Solo quiero señalar una línea en la página que podría ser relevante para cualquier otra persona que lo consulte más adelante. "Si usa exportar por sí mismo para exportar variables de forma predeterminada, las variables cuyos nombres contengan caracteres que no sean alfanuméricos y guiones bajos no se exportarán a menos que se mencionen específicamente en una directiva de exportación". – dinesh

2

ejemplo para su referencia:

A continuación se muestra el "Makefile" que se encuentra en el nivel superior.

Makefile

export ROOT_DIR=${PWD} 

all:   
     $(MAKE) -C test 

Luego, hay otro "Makefile" dentro de la carpeta "prueba" (con respecto a la ubicación actual), de la siguiente manera:

Makefile

all:  
     echo $(ROOT_DIR) 

Cuando dice "make all" en la carpeta de nivel superior, posteriormente se compilará según la ubicación actual-Makefile, y luego según dicha regla en la ubicación de la carpeta "prueba" (tomando Makefile en "prueba" "ubicación para las reglas de compilación").Por lo tanto, cuando parent-Makefile exporta alguna variable, para ese entorno de compilación, la variable exportada será visible para todos los subdirectorios Makefiles.

Sin embargo, si intenta entrar explícitamente en la carpeta "prueba" e intenta "hacer todo", tendrá que establecer explícitamente la variable de entorno, antes de eso (que en el caso anterior, se establece en la parte superior nivel de archivo Makefile).

More Info.

Cuestiones relacionadas