Моя структура папок выглядит так:
.
├── app.c
├── inc
│ ├── butil.h
│ └── libs
│ ├── flagutil.h
│ ├── libflagutil.c
│ └── libflagutil.o
└── Makefile
Мой Makefile
выглядит так:
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
Я немного озадачен его поведением. Допустим, я внес критическое изменение в файл ./inc/libs/flagutil.h
. И app
и libflagutil.o
зависят от этого.
Затем я просто запускаю make
. Поскольку app
основного правила зависит от ./inc/libs/flagutil.h
, и оно было изменено, выполняется строка под правилом.
НО, libflagutil.o
, который зависит от app
(основное правило), также зависит от ./inc/libs/flagutil.h
, и его изменение может оказать критическое влияние на libflagutil.o
, который, опять же, зависит от app
Однако простое выполнение make
не выполняло правило libflagutil.o
, что означает, что libflagutil.c
не был перекомпилирован, а исполняемый файл app
связан со старой версией libflagutil.o
.
Это, конечно , может быть исправлено путем явного запуска make libflagutil.o
после внесения изменений в /inc/libs/flagutil.h
и только затем запустить основное правило, но не вся суть make
, чтобы избежать неприятностей , таких как это один?
Я что-то упустил или такое поведение ожидается?