Índice
3. O processo de execução do Make:
2. Quatro métodos de atribuição
6. Julgamento de condição de makefile
1. O que é Makefile
Se nosso projeto tiver apenas um ou dois arquivos C, tudo bem e não há muitos comandos a serem inseridos. Quando há dezenas, centenas ou mesmo dezenas de milhares de arquivos, é obviamente irreal usar o terminal para inserir comandos GCC . O arquivo que descreve quais arquivos precisam ser compilados e quais precisam ser recompilados é chamado Makefile.Makefile é como um arquivo de script.Os comandos do sistema também podem ser executados no Makefile.
2. Precauções de uso
1. Crie um arquivo chamado "Makefile" no diretório do projeto, e o nome do arquivo deve ser chamado "Makefile"! ! ! É sensível a maiúsculas e minúsculas!
2. A tecla "TAB" deve ser usada em todos os lugares do código que precisam estar vazios no início da linha! Não use a barra de espaço!
3. As variáveis no Makefile são todas strings! $(objetos)
4. O comentário é "#"!
3. O processo de execução do Make:
1. O comando make irá procurar por um arquivo chamado Makefile (makefile pode realmente ser usado) no diretório atual.
2. Quando o Makefile for encontrado, ele irá compilar e gerar o arquivo de destino final de acordo com as regras definidas no Makefile.
3. Quando for descoberto que o arquivo de destino não existe, ou o arquivo do qual o destino depende é mais recente que o arquivo de destino (ou seja, a hora da última modificação é posterior ao arquivo de destino), os seguintes comandos serão executados para atualizar o destino.
Quatro, sintaxe Makefile
1. Formato de regularização
目标...: 依赖...
命令1
命令2
...
main : main.o input.o calcu.o
gcc -o main main.o input.o calcu.o
2. Quatro métodos de atribuição
= O valor real de uma variável depende do último valor válido da variável a que se refere.
:= não usará variáveis definidas posteriormente, apenas aquelas definidas anteriormente .
?= Se a variável não foi atribuída antes, então esta variável é a atribuição ?= atual, se ela foi atribuída antes, use o valor atribuído anteriormente.
+= Anexar à variável. Equivalente a anexar algumas strings.
3. Normalização do modo
Em regras de padrão, pelo menos "%" deve ser incluído na definição de destino da regra, caso contrário, é uma regra geral. "%" no destino significa que corresponde ao nome do arquivo e "%" significa uma sequência não vazia de qualquer comprimento, como " %.c" são todos os arquivos que terminam com .c, semelhantes aos curingas.
%.o : %.c
命令
4. Variáveis de automação
A chamada variável automática significa que este tipo de variável vai tirar automaticamente uma série de arquivos definidos no padrão um a um até que todos os arquivos conforme o padrão sejam retirados, e a variável automática só deve aparecer no comando de a regra.
$@ indica o arquivo de destino
$^ significa todos os arquivos dependentes
$< indica o primeiro arquivo dependente
$? Indica uma lista de arquivos dependentes que são mais recentes que o destino
5. Alvo falso
O nome geral do alvo é o arquivo a ser gerado, e o pseudo-destino não representa o nome real do alvo.Ao executar o comando make, especifique este pseudo-destino para executar o comando definido pela regra onde está localizado.
O uso de pseudo-destinos é principalmente para evitar conflitos de nome entre os destinos definidos no Makefile e os arquivos reais no diretório de trabalho.
clean:
rm *.o
rm main
Nunca haverá uma limpeza de arquivo no diretório de trabalho.Quando digitamos "make clean", os seguintes "rm *.o" e "rm main" sempre serão executados. Mas se formos "hands-on" e criarmos um arquivo chamado "clean" no diretório de trabalho, será diferente. Quando "make clean" é executado, o destino é considerado o último porque não há arquivo dependente no a regra , então o seguinte comando rm não será executado , e a função de limpeza do projeto que pré-concebemos não será concluída. Para evitar esse problema, podemos declarar clean como um pseudo-alvo da seguinte maneira:
.PHONY : clean
Depois de declarar clean como um alvo falso, independentemente de haver um arquivo chamado "clean" no diretório atual, se você inserir "make clean", o comando rm por trás da regra será executado.
6. Julgamento de condição de makefile
<条件关键字>
<条件为真时执行的语句>
endif
<条件关键字>
<条件为真时执行的语句>
else
<条件为假时执行的语句>
endif
Existem quatro palavras-chave condicionais: ifeq, ifneq, ifdef e ifndef.
ifeq é usado para julgar se eles são iguais e ifneq é usado para julgar se eles não são iguais. ifeq é usado da seguinte forma:
ifeq (<参数 1>, <参数 2>)
ifeq ‘<参数 1 >’,‘ <参数 2>’
ifeq “<参数 1>”, “<参数 2>”
ifeq “<参数 1>”, ‘<参数 2>’
ifeq ‘<参数 1>’, “<参数 2>”
O uso de ifdef e ifndef é o seguinte, se o valor de "nome da variável" não estiver vazio, a expressão é verdadeira, caso contrário, a expressão é falsa.
ifdef <变量名>
7. Função Makefile
As funções no Makefile já estão definidas, nós as usamos diretamente e não suportamos nossas funções personalizadas. O uso da função é o seguinte:
$(函数名 参数集合)
${函数名 参数集合}
O conjunto de parâmetros são vários parâmetros da função, os parâmetros são separados por uma vírgula ","", o nome da função e os parâmetros são separados por um "espaço" e a chamada da função começa com "$".
<1>, função subst
A função subst é usada para completar a substituição da string:
$(subst <from>,<to>,<text>)
Substitua o conteúdo de <from> na string <text> por <to> e a função retornará a string substituída.
<2>, função patsubst
A função patsubst é usada para realizar a substituição de string padrão:
$(patsubst <pattern>,<replacement>,<text>)
Esta função verifica se a palavra na string <text> corresponde ao padrão <pattern> e a substitui por <replacement> se corresponder. <pattern> pode usar o caractere curinga "%" para representar uma string de qualquer comprimento. A função o valor de retorno é a string substituída. Se "%" também estiver incluído em <replacement>, então "%" em <replacement> será a string representada por "%" em <pattern>, por exemplo:
$(patsubst %.c,%.o,ac bc cc)
Substitua todas as strings correspondentes a "%.c" na string "ac bc cc" por "%.o", e a string após a substituição é "ao bo co".
<3>, diretório da função
A função dir é usada para obter o diretório, o método de uso é o seguinte:
$(dir <names…>)
Esta função é usada para extrair a parte do diretório da sequência do nome do arquivo <nomes>, e o valor de retorno é a parte do diretório da sequência do nome do arquivo <nomes>, por exemplo:
$(dir </src/a.c>)
Extraia a parte do diretório do arquivo "/src/ac", que é "/src".
<4>, função notdir
A função notdir remove a parte do diretório no arquivo, ou seja, extrai o nome do arquivo. A utilização é a seguinte:
$(notdir <names…>)
Esta função é usada para extrair a parte não-diretório do nome do arquivo da sequência de nome do arquivo <nomes>, como:
$(não dir </src/ac>)
Extraia a parte não-diretório do arquivo "/src/ac", que é o nome do arquivo "ac".
<5>, função foreach
$(foreach <var>, <list>,<text>)
Esta função retira as palavras do parâmetro <lista> uma a uma e as coloca no parâmetro <var>, e então executa a expressão contida em <texto>.
# 定义一个列表
fruits := apple banana cherry
# 使用 foreach 迭代列表,并为每个元素打印一行信息
$(foreach fruit,$(fruits),echo $(fruit);)
# 输出
apple
banana
cherry
<6>, curinga de função
O caractere curinga "%" só pode ser usado em regras e será expandido apenas em regras. Se o caractere curinga não for expandido automaticamente quando a definição de variável e a função forem usadas, a função curinga será usada neste momento e o método de uso é o seguinte:
$(wildcard PATTERN…)
Por exemplo, o código a seguir é usado para obter todos os arquivos .c no diretório atual, ou seja, a função desta função é equivalente a "%".
$(curinga *.c)