Minha estrutura de pastas é assim:
.
├── app.c
├── inc
│ ├── butil.h
│ └── libs
│ ├── flagutil.h
│ ├── libflagutil.c
│ └── libflagutil.o
└── Makefile
Meu Makefile
é assim:
CC = gcc
WARN = -Wall -Wconversion -Wextra -Wno-unused-variable -Wno-unused-parameter
DEBUG = -ggdb -O0
app: ./app.c ./inc/libs/flagutil.h ./inc/butil.h ./inc/libs/libflagutil.o
$(CC) $(WARN) app.c ./inc/libs/libflagutil.o -o ./app
libflagutil.o: ./inc/libs/libflagutil.c ./inc/libs/flagutil.h
$(CC) $(WARN) ./inc/libs/libflagutil.c -c -o ./inc/libs/libflagutil.o
app-debug: ./app.c ./inc/libs/flagutil.h ./inc/butil.h ./inc/libs/libflagutil.o
$(CC) $(WARN) $(DEBUG) app.c ./inc/libs/libflagutil.o -o ./app
Estou um pouco confuso sobre o seu comportamento. Digamos que eu faça uma mudança crítica no arquivo ./inc/libs/flagutil.h
. Ambos app
e libflagutil.o
dependem disso.
Então, simplesmente executo make
. Como a regra principal app
depende de ./inc/libs/flagutil.h
e foi alterada, a linha abaixo da regra é executada.
MAS, libflagutil.o
, que é dependente de app
(a regra principal) também depende de ./inc/libs/flagutil.h
, e sua alteração pode ter um efeito crítico em libflagutil.o
, que é novamente dependente de% código%.
No entanto, simplesmente executar app
não executou a regra make
, o que significa que libflagutil.o
não foi recompilado e o executável libflagutil.c
está vinculado à versão antiga de app
.
Isso pode ser corrigido explicitamente executando libflagutil.o
depois de fazer uma alteração em make libflagutil.o
, e só então executando a regra principal, mas não é o ponto inteiro de /inc/libs/flagutil.h
para evitar aborrecimentos como este ?
Estou faltando alguma coisa ou esse comportamento é esperado?