Esse comportamento é esperado?

0

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?

    
por bool3max 26.07.2018 / 21:44

1 resposta

2

Você precisa especificar os caminhos completos para os arquivos nos destinos de regras, caso contrário, os considera localizados no diretório atual.

No seu caso, use

./inc/libs/libflagutil.o: ./inc/libs/libflagutil.c ./inc/libs/flagutil.h 

na segunda regra.

    
por 26.07.2018 / 22:52