Introdução à sintaxe do Makefile

Índice

1. O que é Makefile

2. Precauções de uso

3. O processo de execução do Make:

Quatro, sintaxe Makefile

1. Formato de regularização

2. Quatro métodos de atribuição

3. Normalização do modo

4. Variáveis ​​de automação

5. Alvo falso

6. Julgamento de condição de makefile

7. Função Makefile

<1>, função subst

<2>, função patsubst 

<3>, diretório da função 

<4>, função notdir

<5>, função foreach 

<6>, curinga de função 


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) 

Acho que você gosta

Origin blog.csdn.net/qq_41709234/article/details/131347818
Recomendado
Clasificación