Entrada Makefile simples e fácil de entender (10) - o uso de execução aninhada de make e export

1. Execução aninhada de make

Em um grande arquivo de projeto, de acordo com diferentes funções de arquivo são divididos em diferentes módulos, cada módulo terá seu próprio compilador pode ordenar e regras, se uma Makefiledescrição de todos os módulos compilados arquivo de regras, também bagunça inconveniente de executar, precisam são suas regras descritas nos diferentes módulos, cada módulo é escrito em um Makefilearquivo, portanto, não só é fácil de gerenciar, e pode identificar rapidamente o módulo do problema. Precisamos apenas controlar outros módulos Makefilepode ser alcançado o controle geral, que é a makeexecução aninhada.

Como usá-lo? Os exemplos são os seguintes:

subsystem:
    cd subdir && $(MAKE)

Este exemplo pode ser entendido, há um arquivo de catálogo no diretório atual subdire um Makefilesubdiretório de arquivo subdirsob o arquivo há um Makefilearquivo que é usado para descrever as regras do subdiretório de arquivo compilado.

Só precisa executar na camada mais externa do diretório ao usar o makecomando, quando o comando for executado com as regras acima, o programa entrará em um subdiretório de execução make. Esta é a execução aninhada make, que é mais Makefileconhecida como controle total Makefile.

As regras acima também podem ser alteradas para outra forma de escrita:

subsystem
    $(MAKE) -C subdir

Na makeexecução aninhada, precisamos conhecer uma variável CURDIR, esta variável representa o makediretório de trabalho. Ao usar a makeopção -Cem que o comando entrará no diretório especificado, esta variável será reatribuída.

Resumindo, se Makefilenão houver uma atribuição explícita dessa variável, ela representa o makediretório de trabalho. Também podemos Makefileatribuir um novo valor para esta variável, é claro, após a reatribuição desta variável não representará mais o makediretório de trabalho.

2. Uso de exportação

Usar makeexecução aninhada quando uma variável é passada é o que precisamos prestar atenção. Se você precisar passar variáveis, pode usá-lo assim:

export <variable>

Se você não precisar, pode escrever assim:

unexport <variable>

<variable>É o nome da variável, não use $esse caractere. Se todas as variáveis ​​precisam ser passadas, você só precisa usar exportpode, não há necessidade de adicionar o nome da variável.

export VALUE1 := export.c    <-- 用了 export, 此变量能够传递到 ./other/Makefile 中
...
@cd ./other && make
...

export O formato da sintaxe é o seguinte:

export variable = value
export variable := value
export variable += value

MakefileExistem duas variáveis ​​ou não usando a exportdeclaração de palavra-chave , elas sempre passaram para o Makefilemeio inferior . Essas duas variáveis ​​são SHELLe MAKEFLAGS, em particular a MAKEFLAGSvariável contém makeas informações dos parâmetros.

Se for a execução do controle total Makefile, o makecomando com os parâmetros ou a Makefiledefinição superior desta variável, o MAKEFLAGSvalor da variável serão os makeparâmetros passados ​​para o comando, e passados ​​para a camada inferior Makefile, que é uma variável de ambiente em nível de sistema.

makeExistem várias opções para o comando parâmetro não é passado, são eles: -C, -f, -o, -he -W. Se não quisermos passar MAKEFLAGSo valor das variáveis ​​no Makefile, escreveríamos:

subsystem:
    cd subdir && $(MAKE) MAKEFLAGS=

3. Exemplo de execução aninhada

A estrutura do diretório é a seguinte:

wohu@ubuntu:~/cpp/func$ tree
.
├── demo.cpp
├── demo.h
├── Makefile
└── subdir
    └── Makefile

1 directory, 4 files
wohu@ubuntu:~/cpp/func$ 

O Makefileconteúdo do diretório atual :

export GLOBAL_VAR = 123
SUBDIR = ./subdir 

all:
	echo "this is main Makefile"
	echo $(GLOBAL_VAR)
	cd $(SUBDIR) && $(MAKE)

subdirDiretório de Makefileconteúdo:

all:
	echo "this is subdir Makefile"
	echo "display GLOBAL_VAR" $(GLOBAL_VAR)

Executado na makesaída do diretório atual

wohu@ubuntu:~/cpp/func$ make
echo "this is main Makefile"
this is main Makefile
echo 123
123
cd ./subdir  && make
make[1]: Entering directory '/home/wohu/cpp/func/subdir'
echo "this is subdir Makefile"
this is subdir Makefile
echo "display GLOBAL_VAR" 123
display GLOBAL_VAR 123
make[1]: Leaving directory '/home/wohu/cpp/func/subdir'
wohu@ubuntu:~/cpp/func$ 

Acho que você gosta

Origin blog.csdn.net/wohu1104/article/details/111085938
Recomendado
Clasificación