Curingas e Foreach no Makefile

Curingas E Foreach No Makefile



Um arquivo é sempre composto de um tipo diferente de conteúdo: seja um arquivo de texto simples, um arquivo de código de programa ou qualquer makefile. O tipo de conteúdo de qualquer arquivo o torna único e o diferencia de outros formatos de arquivo. Simples assim, makefile consiste em regras que utilizam diferentes elementos para realizar seu trabalho corretamente. Desses elementos, existe o curinga e o foreach que são necessários para realizar algo único e extra. Neste guia, discutiremos o poder dos curingas e do foreach enquanto eles são usados ​​em um makefile.

Curingas no Makefile

Em geral, sabe-se que o curinga é um fator que não pode ser previsto e pode transformar a situação de todas as maneiras possíveis. Os curingas no makefile são usados ​​para realizar um bônus de detecção de todos os padrões possíveis de um diretório de trabalho atual, seja um arquivo ou qualquer pasta. Esses arquivos de origem podem ser de qualquer tipo.







Para usar um curinga em um makefile, você deve usar a palavra-chave “curinga” que segue o asterisco “*” ou “?” sinal e a extensão do arquivo que está conectado por meio de um ponto. Você também pode utilizar o “?” sinal para pesquisar um único caractere e “*” para corresponder a qualquer número de caracteres. Toda essa estrutura deve ser utilizada entre colchetes e um sinal “$”. Por exemplo, declaramos a variável “SRCS” que obtém seu arquivo de valor através do curinga. Este curinga procura todos os arquivos com o padrão “cpp” no final.





Foreach no Makefile

A função foreach do makefile funciona exatamente como um loop foreach em linguagens de programação – itera sobre os itens de uma lista. A função foreach no makefile executa uma ação específica em cada item de uma lista. Este elemento pode ser uma variável ou qualquer arquivo de origem. Por exemplo, elaboramos a sintaxe da função foreach em makefile através da variável SOURCES que contém uma lista de três arquivos fonte. A função foreach usa esta variável SOURCES para criar o mesmo nome para três arquivos objeto, iterando a lista de arquivos de origem e salvando-os em outra variável “OBJECTS”. As duas últimas linhas mostram como uma regra makefile pode ser usada para criar um arquivo objeto para cada arquivo C após a iteração.





FONTES:= arquivo1.c arquivo2.c arquivo3.c
OBJETOS := $ ( foreach fonte,$ ( FONTES ) ,$ ( src:.c=.o ) )
$OBJETOS : % .o: % .c
$ ( CC ) $ ( CFLAGS ) -c $ < -o $ @

Exemplo 1: Usando curingas

Para exibir a ilustração e o funcionamento de curingas e funções foreach, introduzimos um arquivo C++. Este arquivo “salary.cpp” é iniciado com o uso do cabeçalho “iostream” para permitir um uso suave dos fluxos de entrada e saída. O método principal declara uma variável “s” do tipo inteiro e a instrução “cout” para solicitar um valor de entrada em tempo de execução. O fluxo de entrada padrão “cin” obtém o valor de um usuário em tempo de execução e o salva na variável “s”. O “cout” exibe o valor inserido por um usuário na tela do console.

#include
usando namespace std;
principal interno ( ) {
ints;
corte << 'Insira o salário:' ;
comendo >> é;
corte << ' \n Salário: ' << é << fim;
retornar 0 ;
}



Iniciamos o makefile com a variável “CXX” que define o compilador para C++, e a variável CXXFLAGS contém os sinalizadores para o compilador C++. A variável EXECUTABLE contém o nome de um arquivo executável “hello” que é gerado após a execução de um makefile. A variável SRCS obtém todos os arquivos C++ de um diretório atual usando o curinga “*” para pesquisar qualquer padrão que termine com “.cpp”. A variável OBJS contém os nomes dos arquivos objetos a serem criados utilizando a variável SRCS, substituindo a extensão “cpp” por “o”. O destino padrão “all” constrói o makefile e depende da variável EXECUTABLE.

A primeira regra cria o arquivo “hello” de destino que depende do arquivo objeto da variável OBJS (nomes dos arquivos objeto) usando os nomes dos arquivos que são gerados por meio da variável “OBJS”. A segunda regra makefile gera o arquivo objeto com a extensão “.o” que depende do arquivo C++ após compilar o arquivo de código C++. Aqui, “%” é um curinga para pesquisar nomes de arquivos de qualquer padrão que termine com “cpp”. No final, o alvo limpo usa seu comando “rm” para limpar à força os arquivos executáveis ​​​​e objetos recém-gerados de um diretório usando o sinalizador “-f”.

CXX = g++
CXXBANDEIRAS = -Parede -std =c++ onze
EXECUTABLE = olá
SRC = $ ( curinga * .cpp )
OBJS = $ ( SRCS:.cpp=.o )
tudo: $ ( EXECUTÁVEL )
$ ( EXECUTÁVEL ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -o $ @ $ ( OBJS )
% .o: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -c $ < -o $ @
limpar:
rm -f $ ( EXECUTÁVEL ) $ ( OBJS )

Ao executar a instrução “make”, os arquivos de destino e objeto foram criados. Após executar o arquivo executável “hello”, o usuário é solicitado a inserir um salário e adicionamos “67000”. Ao final, o salário é exibido de volta.

fazer

Exemplo 2: Usando Foreach

Depois de usar curingas, é hora de usar a função foreach no makefile. O resto do código do makefile é o mesmo. Na linha 6, inicializamos outra variável que é “NAMES” com uma lista de três valores – Kate, Kim, Tim. O destino padrão “all” depende da variável EXECUTABLE (nome do arquivo de destino “hello”) e da instrução foreach. A função “addprefix” itera a variável “NAMES” para gerar dinamicamente os nomes de destino prefixando “run_” no início de cada nome na lista “NAMES”.

A regra na linha oito indica que um arquivo de destino executável de saída, ou seja, hello, depende do “OBJS”. O sinalizador “-o” gera o arquivo de saída de destino usando o OBJS. A regra na décima linha gera o arquivo do objeto de destino usando os arquivos de origem com a extensão “cpp”. Para isso, o sinalizador “-c” é utilizado para compilar um arquivo fonte e gerar o arquivo objeto relacionado necessário para a geração do destino. Na décima terceira linha, usamos a variável EXECUTABLE para gerar a saída com nomes diferentes começando com “run_” como prefixo. No final, o alvo limpo e os alvos falsos removerão e limparão o objeto e os arquivos de destino.

CXX = g++
CXXBANDEIRAS = -Parede -std =c++ onze
# arquivo de destino executável
EXECUTABLE = olá
SRC = $ ( curinga * .cpp )
OBJS = $ ( SRCS:.cpp=.o )
#Lista de nomes
NOMES = Kate Kim Tim
# Alvos
tudo: $ ( EXECUTÁVEL ) $ ( addprefix run_, $ ( NOMES ) )
$ ( EXECUTÁVEL ) : $ ( OBJS )
$ ( CXX ) $ ( CXXFLAGS ) -o $ @ $ ( OBJS )
% .o: % .cpp
$ ( CXX ) $ ( CXXFLAGS ) -c $ < -o $ @
# Crie alvos para cada nome
correr_ % : $ ( EXECUTÁVEL )
. / $ ( EXECUTÁVEL ) $*
limpar:
rm -f $ ( EXECUTÁVEL ) $ ( OBJS )
# Alvos falsos
.PHONY: tudo limpo

O uso da instrução “make” gera o alvo executável “hello” e executa o programa para cada nome especificado na variável “NAMES”.

fazer

Você também pode modificar sua saída usando o nome de uma lista com o prefixo “run_”.

Faça run_Kim

Conclusão

Este guia discutiu o uso de curingas e conceitos foreach no makefile enquanto discutia sua sintaxe separadamente. Depois disso, discutimos os exemplos de código para elaborar cada um de seus trabalhos com saídas para obter os arquivos com as mesmas extensões e iterar os valores em uma lista de variáveis.