Makefile - Outros recursos

Neste capítulo, examinaremos vários outros recursos do Makefile.

Uso Recursivo de Make

Uso recursivo de make significa usar makecomo um comando em um makefile. Esta técnica é útil quando você deseja makefiles separados para vários subsistemas que compõem um sistema maior. Por exemplo, suponha que você tenha um subdiretório chamado `subdir 'que tem seu próprio makefile, e você gostaria que o makefile do diretório que o contém seja executadomakeno subdiretório. Você pode fazer isso escrevendo o código abaixo -

subsystem:
   cd subdir && $(MAKE)

or, equivalently:
 	
subsystem:
   $(MAKE) -C subdir

Você pode escrever recursivo makecomandos apenas copiando este exemplo. No entanto, você precisa saber como eles funcionam e por que, e como o submarcar se relaciona com o fabricante de nível superior.

Comunicando Variáveis ​​para uma Sub-Marca

Valores variáveis ​​de nível superior makepode ser passado para a submarca por meio do ambiente por solicitação explícita. Essas variáveis ​​são definidas no submarque como padrões. Você não pode sobrescrever o que é especificado no makefile usado pelo sub-make makefile a menos que use a opção `-e '.

Para transmitir ou exportar uma variável, makeadiciona a variável e seu valor ao ambiente para executar cada comando. O sub-make, por sua vez, usa o ambiente para inicializar sua tabela de valores de variáveis.

As variáveis ​​especiais SHELL e MAKEFLAGS são sempre exportadas (a menos que você as cancele). MAKEFILES é exportado se você definir qualquer coisa.

Se você deseja exportar variáveis ​​específicas para um sub-make, use a diretiva de exportação, conforme mostrado abaixo -

export variable ...

Se você quiser evitar que uma variável seja exportada, use a diretiva não exportar, como mostrado abaixo -

unexport variable ...

A Variável MAKEFILES

Se a variável de ambiente MAKEFILES for definida, makeconsidera seu valor como uma lista de nomes (separados por espaço em branco) de makefiles adicionais a serem lidos antes dos outros. Isso funciona de forma muito semelhante à diretiva include: vários diretórios são pesquisados ​​para esses arquivos.

O principal uso de MAKEFILES é na comunicação entre invocações recursivas do make.

Incluindo arquivo de cabeçalho de diferentes diretórios

Se você colocou os arquivos de cabeçalho em diretórios diferentes e está executando makeem um diretório diferente, é necessário fornecer o caminho dos arquivos de cabeçalho. Isso pode ser feito usando a opção -I no makefile. Supondo que o arquivo functions.h esteja disponível na pasta / home / tutorialspoint / header e o restante dos arquivos esteja disponível na pasta / home / tutorialspoint / src /, então o makefile seria escrito da seguinte maneira -

INCLUDES = -I "/home/tutorialspoint/header"
CC = gcc
LIBS =  -lm
CFLAGS = -g -Wall
OBJ =  main.o factorial.o hello.o

hello: ${OBJ}
   ${CC} ${CFLAGS} ${INCLUDES} -o [email protected] ${OBJS} ${LIBS}
.cpp.o:
   ${CC} ${CFLAGS} ${INCLUDES} -c $<

Anexando mais texto às variáveis

Freqüentemente, é útil adicionar mais texto ao valor de uma variável já definida. Você faz isso com uma linha contendo `+ = ', como mostrado -

objects += another.o

Ele pega o valor dos objetos variáveis ​​e adiciona o texto `outro.o 'a ele, precedido por um único espaço como mostrado abaixo.

objects = main.o hello.o factorial.o
objects += another.o

O código acima define objetos para `main.o hello.o factorial.o another.o '.

Usar `+ = 'é semelhante a:

objects = main.o hello.o factorial.o
objects := $(objects) another.o

Linha de continuação em Makefile

Se você não gosta de linhas muito grandes em seu Makefile, você pode quebrar sua linha usando uma barra invertida "\" conforme mostrado abaixo -

OBJ =  main.o factorial.o \
   hello.o

is equivalent to

OBJ =  main.o factorial.o hello.o

Executando Makefile do Prompt de Comando

Se você preparou o Makefile com o nome "Makefile", simplesmente escreva make no prompt de comando e ele executará o arquivo Makefile. Mas se você deu qualquer outro nome para o Makefile, use o seguinte comando -

make -f your-makefile-name