Как указать целевой порядок сборки 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.