Jak określić docelową kolejność budowania Makefile bez nakładania żadnych fizycznych zależności?

Pracowałem nad projektem C ++, który łączy się z plikiem .so (biblioteka dynamiczna). Załóżmy, że mam docelowy PROG, który musi łączyć się z a.so, a a.so jest również budowane przeze mnie, określone w następującym pliku Makefile.

<code>PROG_SRCS = prog.cpp
PROG_OBJS = $(PROG_SRCS: %.cpp:%.o)

all: PROG
PROG: $(PROG_OBJS) liba.so
    $(LINK.cpp) -o $@ $(PROG_OBJS) -la

LIBA_SRCS = liba/a.cpp
LIBA_OBJS = $(LIBA_SRCS: %.cpp:%.o)

liba.so: $(LIBA_OBJS)
    $(LINK.cpp) -shared -Wl.-soname,$@ -o $@ $^
</code>

Użyłem automatycznego generowania zależności, aby uzyskać pliki .cpp zależne od plików .h. A prog.cpp zawiera a.h.

Ale w ten sposób, po zmianie a.cpp, liba.so będzie remake, a PROG będzie remake (relink), co nie jest tym, czego chcę. Po prostu zmieniam implementację liba.so, ale nie wszystkie definicje interfejsu. PROG powinien po prostu przerobić po zmianie a.h.

Chcę, aby a.so zostało zbudowane przed zbudowaniem PROG, ale zmiany a.so nie spowodowałyby budowy PROG.

Poniższy plik Makefile jest metodą, którą wymyśliłem, ale ma nieco efekt uboczny (wygenerowanie pliku tymczasowego).

<code>ORDER = /tmp/.ORDER

all: PROG
PROG: $(PROG_OBJS) $(ORDER)
    $(LINK.cpp) -shared -Wl,-soname,$@ -o $@ $(PROG_OBJS) -la

$(ORDER): liba.so
    test -e $@ || touch $@
</code>

W ten sposób za każdym razem, gdy liba.so pobiera remake, $ (ORDER) również jest przerabiany. Ale dotyka tylko pliku, jeśli nie istnieje.

Czy istnieje sposób na określenie tego rodzaju zależności bez żadnych skutków ubocznych, np. tworzenie pliku tmp.

questionAnswers(1)

yourAnswerToTheQuestion