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 Makefile
descriçã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 Makefile
arquivo, portanto, não só é fácil de gerenciar, e pode identificar rapidamente o módulo do problema. Precisamos apenas controlar outros módulos Makefile
pode ser alcançado o controle geral, que é a make
execuçã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 subdir
e um Makefile
subdiretório de arquivo subdir
sob o arquivo há um Makefile
arquivo 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 make
comando, 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 Makefile
conhecida como controle total Makefile
.
As regras acima também podem ser alteradas para outra forma de escrita:
subsystem
$(MAKE) -C subdir
Na make
execução aninhada, precisamos conhecer uma variável CURDIR
, esta variável representa o make
diretório de trabalho. Ao usar a make
opção -C
em que o comando entrará no diretório especificado, esta variável será reatribuída.
Resumindo, se Makefile
não houver uma atribuição explícita dessa variável, ela representa o make
diretório de trabalho. Também podemos Makefile
atribuir um novo valor para esta variável, é claro, após a reatribuição desta variável não representará mais o make
diretório de trabalho.
2. Uso de exportação
Usar make
execuçã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 export
pode, 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
Makefile
Existem duas variáveis ou não usando a export
declaração de palavra-chave , elas sempre passaram para o Makefile
meio inferior . Essas duas variáveis são SHELL
e MAKEFLAGS
, em particular a MAKEFLAGS
variável contém make
as informações dos parâmetros.
Se for a execução do controle total Makefile
, o make
comando com os parâmetros ou a Makefile
definição superior desta variável, o MAKEFLAGS
valor da variável serão os make
parâmetros passados para o comando, e passados para a camada inferior Makefile
, que é uma variável de ambiente em nível de sistema.
make
Existem várias opções para o comando parâmetro não é passado, são eles: -C
, -f
, -o
, -h
e -W
. Se não quisermos passar MAKEFLAGS
o 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 Makefile
conteúdo do diretório atual :
export GLOBAL_VAR = 123
SUBDIR = ./subdir
all:
echo "this is main Makefile"
echo $(GLOBAL_VAR)
cd $(SUBDIR) && $(MAKE)
subdir
Diretório de Makefile
conteúdo:
all:
echo "this is subdir Makefile"
echo "display GLOBAL_VAR" $(GLOBAL_VAR)
Executado na make
saí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$