Как указать целевой порядок сборки Makefile без каких-либо физических зависимостей?

Я работал над проектом C ++, который ссылается на файл .so (динамическая библиотека). Предположим, у меня есть целевой PROG, который должен соединиться с a.so, и a.so также создан мной, как указано в следующем 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>

Я использовал авто-генерацию зависимостей, чтобы получить .cpp файлы получить свою собственную зависимость от .h файлы. И prog.cpp включает в себя

Но таким образом, как только я изменю a.cpp, liba.so будет переделан, тогда PROG будет римейк (relink), чего я не хочу. Я просто изменил реализацию liba.so, но не любые определения интерфейса. ПРОГ должен просто переделать после того как я поменяю а.х.

Я хочу сделать так, чтобы a.so собирался до сборки PROG, но изменения a.so не повлекут за собой создание PROG.

Следующий Makefile - метод, который я понял, но с небольшим побочным эффектом (создать временный файл).

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

Таким образом, каждый раз, когда liba.so получает римейк, $ (ORDER) тоже получает римейк. Но это только касание файл, если он не существует.

Есть ли способ указать этот вид зависимости без каких-либо побочных эффектов, например, Создание файла TMP.

Ответы на вопрос(1)

Ваш ответ на вопрос