Estou simplesmente estudando make. E me deparo com a pergunta sobre o arquivo intermediário de remoção automática do make. Eu gostaria de prever melhor como o make marcaria o arquivo intermediário (ou seja, responderia "Removê-lo automaticamente?"), Então escrevi um projeto fictício como este para demonstrar minha pergunta:
olá.h
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif
olá.c
#include <stdio.h>
void hello(const char *name) {
printf("Hello %s\n", name);
}
main.c
#include "hello.h"
int main() {
hello("world");
return 0;
}
makefile
all: main
./main
clean:
rm -f *.o *.a
rm -f main
hello.o:
gcc -c hello.c
libmyhello.a: hello.o
ar -crv $@ hello.o
main: libmyhello.a
gcc -L. -o $@ [email protected] -lmyhello
.PHONY: all clean
Quando eu faço main
, requer libmyhello.a
. libmyhello.a
requer hello.o
. Se bem entendi, hello.o
deve ser um arquivo intermediário. Mas não foi excluído no make main
processo.
Por que é? Como saber se o make irá tratar um arquivo como arquivo intermediário e removê-lo?
Arquivos intermediários são produzidos apenas por padrão em cadeias de regras implícitas e somente se não forem mencionados explicitamente, seja como destinos ou como pré-requisitos. No seu caso, todos os arquivos que você produz são mencionados explicitamente no Makefile, portanto não são arquivos intermediários.
Você pode forçar um arquivo a ser um arquivo intermediário listando-o como um pré-requisito de
.INTERMEDIATE
:Isso resultará em mais trabalho em geral, pois qualquer reconstrução de
libmyhello.a
exigirá reconstruçãohello.o
, mesmo quehello.c
não tenha mudado. (Aliás, você deve listarhello.c
como pré-requisito dehello.o
.)Consulte a seção sobre arquivos intermediários em regras implícitas encadeadas no manual do GNU Make para obter detalhes.