O que significa “all” em um makefile?

105

Eu li alguns tutoriais sobre Makefiles, mas para mim ainda não está claro o que o alvo "all" significa e o que ele faz.

Alguma ideia?

Chris Smullian
fonte

Respostas:

116

Uma construção, como o Makefile entende, consiste em muitos alvos. Por exemplo, para construir um projeto, você pode precisar

  1. Compilar o arquivo1.o fora do arquivo1.c
  2. Compilar o arquivo2.o a partir do arquivo2.c
  3. Construir arquivo3.o fora do arquivo3.c
  4. Compilar executável1 a partir de arquivo1.o e arquivo3.o
  5. Construa executável2 fora do arquivo2.o

Se você implementou este fluxo de trabalho com makefile, você poderia fazer cada um dos destinos separadamente. Por exemplo, se você escreveu

make file1.o

ele apenas construiria esse arquivo, se necessário.

O nome de allnão está fixo. É apenas um nome convencional; alltarget denota que se você invocá-lo, make irá construir tudo o que é necessário para fazer uma construção completa . Normalmente, é um destino fictício, que não cria nenhum arquivo, mas depende apenas dos outros arquivos. Para o exemplo acima, construir tudo o que é necessário é construir executáveis, os outros arquivos sendo puxados como dependências. Portanto, no makefile é assim:

all: executable1 executable2

alltarget é geralmente o primeiro no makefile, já que se você apenas escrever makena linha de comando, sem especificar o destino, ele construirá o primeiro destino. E você espera que seja all.

allgeralmente também é um .PHONYalvo. Saiba mais aqui .

P Shved
fonte
31

O manual do GNU Make fornece uma definição clara para allem sua lista de destinos padrão .

Se o autor do Makefile está seguindo essa convenção, o alvo alldeve:

  1. Compile todo o programa, mas não crie a documentação.
  2. Seja o alvo padrão. Como em execução apenas makedeve fazer o mesmo que make all.

Para atingir 1 allé normalmente definido como um .PHONYalvo que depende do (s) executável (es) que formam todo o programa:

.PHONY : all
all : executable

Para atingir 2 alldeve ser o primeiro alvo definido no arquivo make ou ser atribuído como a meta padrão:

.DEFAULT_GOAL := all
PeterSW
fonte
3

Não tenho certeza se significa algo especial. É apenas uma convenção que você fornece uma regra 'todos' e geralmente ela é usada para listar todos os subalvos necessários para construir o projeto inteiro, daí o nome 'todos'. A única coisa especial sobre isso é que muitas vezes as pessoas irão colocá-lo como o primeiro destino no makefile, o que significa que apenas digitar 'make' sozinho fará a mesma coisa que 'make all'.

JustJeff
fonte
2

O destino "todos" é um exemplo de destino fictício - não há nada no disco chamado "todos". Isso significa que quando você faz um "make all", make sempre pensa que precisa construí-lo, e então executa todos os comandos para aquele alvo. Esses comandos serão tipicamente aqueles que constroem todos os produtos finais que o makefile conhece, mas podem fazer qualquer coisa.

Outros exemplos de alvos fictícios são "limpar" e "instalar", e eles funcionam da mesma maneira.

Se você ainda não leu, você deve ler o GNU Make Manual , que também é um excelente tutorial.


fonte