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.