疑問に対する直接の回答にはなっていないかもしれませんが、.cpp→.o→実行モジュールの依存関係でタイムスタンプを見てファイル更新がされるように修正してみました。
提示されているMakefileは、.oファイルがあるのが前提の書き方になっていますがcleanした後など.oファイルがないは状態では正しく動作しません。.oが存在しない状態で「*.o」や「%.o」としても.oファイルのリストは得たり、マッチングさせたりは出来ません。
.oのリストである$(OBJ)は.現在存在するcppファイルのリスト$(SRC)を取得してそこからから得るようにする必要があります。
また実行モジュールを作る規則のターゲットの指定(ALL)は$(TARGET)となるべきだと思います。意図通りに.oが流用されないというのはこれのことを言ってるのかもしれないと思いました。
デフォルトターゲットALLは慣習的には小文字のallとすることが多いと思うのでそのように修正しました。
runターゲットの意図や.hppの扱いが不明だったのですがとりあえずそのままにしてあります。
実行されるコマンドの確認のためにコマンド前の「@」は外してあります。
GNU Make 4.1で動作確認しています。
Makefile
1CC = g++
2CFLAGS = -g -Wall
3SRCS = $(wildcard src/*.cpp)
4OBJS = $(patsubst src/%.cpp,%.o,$(SRCS))
5TARGET = ABC
6
7all: $(TARGET)
8
9$(TARGET): $(OBJS)
10 $(CC) $(CFLAGS) -o $(TARGET) $(OBJS)
11
12%.o: src/%.cpp
13 $(CC) $(CFLAGS) -o $@ -c $<
14
15%.o: src/%.hpp
16
17clean:
18 rm -rf $(OBJS) $(TARGET)
19
20run:
21 ./$(TARGET) < $(TARGET)
22
23build_run:
24 make
25 make run
実行モジュールと中間ファイルを削除してからビルド
terminal
1$ make clean
2$ ls -l `find . -type f`
3-rw-rw-r-- 1 hidezzz hidezzz 341 9月 26 08:13 ./Makefile
4-rw-rw-r-- 1 hidezzz hidezzz 0 9月 26 08:17 ./src/hoge.cpp
5-rw-rw-r-- 1 hidezzz hidezzz 71 9月 25 07:30 ./src/main.cpp
6$ make
7g++ -g -Wall -o hoge.o -c src/hoge.cpp
8g++ -g -Wall -o main.o -c src/main.cpp
9g++ -g -Wall -o ABC hoge.o main.o
10$ ls -l `find . -type f`
11-rwxrwxr-x 1 hidezzz hidezzz 10720 9月 26 08:20 ./ABC
12-rw-rw-r-- 1 hidezzz hidezzz 341 9月 26 08:13 ./Makefile
13-rw-rw-r-- 1 hidezzz hidezzz 1232 9月 26 08:20 ./hoge.o
14-rw-rw-r-- 1 hidezzz hidezzz 5696 9月 26 08:20 ./main.o
15-rw-rw-r-- 1 hidezzz hidezzz 0 9月 26 08:17 ./src/hoge.cpp
16-rw-rw-r-- 1 hidezzz hidezzz 71 9月 25 07:30 ./src/main.cpp
実行モジュールを削除してからビルド
terminal
1$ rm ABC
2$ ls -l `find . -type f`
3-rw-rw-r-- 1 hidezzz hidezzz 341 9月 26 08:13 ./Makefile
4-rw-rw-r-- 1 hidezzz hidezzz 1232 9月 26 08:20 ./hoge.o
5-rw-rw-r-- 1 hidezzz hidezzz 5696 9月 26 08:20 ./main.o
6-rw-rw-r-- 1 hidezzz hidezzz 0 9月 26 08:17 ./src/hoge.cpp
7-rw-rw-r-- 1 hidezzz hidezzz 71 9月 25 07:30 ./src/main.cpp
8$ make
9g++ -g -Wall -o ABC hoge.o main.o
10$ ls -l `find . -type f`
11-rwxrwxr-x 1 hidezzz hidezzz 10720 9月 26 08:22 ./ABC
12-rw-rw-r-- 1 hidezzz hidezzz 341 9月 26 08:13 ./Makefile
13-rw-rw-r-- 1 hidezzz hidezzz 1232 9月 26 08:20 ./hoge.o
14-rw-rw-r-- 1 hidezzz hidezzz 5696 9月 26 08:20 ./main.o
15-rw-rw-r-- 1 hidezzz hidezzz 0 9月 26 08:17 ./src/hoge.cpp
16-rw-rw-r-- 1 hidezzz hidezzz 71 9月 25 07:30 ./src/main.cpp
ソースのタイムスタンプを更新してからビルド
terimnal
1$ touch src/hoge.cpp
2$ ls -l `find . -type f`
3-rwxrwxr-x 1 hidezzz hidezzz 10720 9月 26 08:22 ./ABC
4-rw-rw-r-- 1 hidezzz hidezzz 341 9月 26 08:13 ./Makefile
5-rw-rw-r-- 1 hidezzz hidezzz 1232 9月 26 08:20 ./hoge.o
6-rw-rw-r-- 1 hidezzz hidezzz 5696 9月 26 08:20 ./main.o
7-rw-rw-r-- 1 hidezzz hidezzz 0 9月 26 08:24 ./src/hoge.cpp
8-rw-rw-r-- 1 hidezzz hidezzz 71 9月 25 07:30 ./src/main.cpp
9$ make
10g++ -g -Wall -o hoge.o -c src/hoge.cpp
11g++ -g -Wall -o ABC hoge.o main.o
12$ ls -l `find . -type f`
13-rwxrwxr-x 1 hidezzz hidezzz 10720 9月 26 08:24 ./ABC
14-rw-rw-r-- 1 hidezzz hidezzz 341 9月 26 08:13 ./Makefile
15-rw-rw-r-- 1 hidezzz hidezzz 1232 9月 26 08:24 ./hoge.o
16-rw-rw-r-- 1 hidezzz hidezzz 5696 9月 26 08:20 ./main.o
17-rw-rw-r-- 1 hidezzz hidezzz 0 9月 26 08:24 ./src/hoge.cpp
18-rw-rw-r-- 1 hidezzz hidezzz 71 9月 25 07:30 ./src/main.cpp