¿Cómo especificar el orden de construcción objetivo de Makefile sin poner ninguna dependencia física?

He estado trabajando en un proyecto de C ++ que enlaza con un archivo .so (biblioteca dinámica). Supongamos que tengo un PROG de destino que debe vincularse a a.so, y a.so también lo he creado yo, especificado en el siguiente 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>

He utilizado la generación de dependencias automáticas para obtener los archivos .cpp y obtener su propia dependencia de los archivos .h. Y prog.cpp incluye a.h.

Pero de esta manera, una vez que cambie a.cpp, liba.so sería una nueva versión, luego PROG sería una nueva versión (relink), que no es lo que quiero. Acabo de cambiar la implementación de liba.so, pero no las definiciones de interfaz. PROG debería simplemente rehacerse después de cambiar a.h.

Quiero hacer que a.so debe ser construido antes de que se construya PROG, pero los cambios de a.so no incurrirían en la construcción de PROG.

El siguiente Makefile es el método que descubrí, pero con un poco de efecto secundario (generar un archivo temporal).

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

De esta manera, cada vez que liba.so obtiene una nueva versión, $ (ORDER) también se vuelve a crear. Pero solo toca el archivo si no existe.

¿Hay alguna forma de especificar este tipo de dependencia sin ningún efecto secundario, por ejemplo? creando un archivo tmp.

Respuestas a la pregunta(1)

Su respuesta a la pregunta