Como especificar ordem de criação de alvo Makefile sem colocar nenhuma dependência física?

Eu tenho trabalhado em um projeto C ++ que vincula a um arquivo .so (biblioteca dinâmica). Vamos supor que eu tenho um alvo PROG que precisa vincular a a.so, e a.so também é construído por mim, especificado no Makefile a seguir.

<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>

Eu usei auto-dependency-generation para obter os arquivos .cpp obter sua própria dependência nos arquivos. E o prog.cpp inclui a.h.

Mas, desta forma, uma vez que eu mude a.cpp, liba.so seria remake, então PROG seria remake (relink), que não é o que eu quero. Eu apenas mudo a implementação do liba.so, mas não quaisquer definições de interface. O PROG deve apenas refazer depois de eu mudar a.h.

Eu quero fazer com que o a.so seja construído antes que o PROG seja construído, mas as mudanças de a.so não incorreriam na construção do PROG.

O Makefile a seguir é o método que eu descobri, mas com um efeito colateral menor (gerar um arquivo temporário).

<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>

Desta forma, toda vez que o liba.so recebe o remake, $ (ORDER) também é refilmado. Mas só toca no arquivo se ele não existir.

Existe alguma maneira de especificar esse tipo de dependência sem qualquer efeito colateral, por exemplo, criando um arquivo tmp.

questionAnswers(1)

yourAnswerToTheQuestion