У меня есть предварительное условие, которое я должен объявить для цели, которая должна всегда выполняться, прежде чем я попытаюсь построить цель.Это на самом деле не генерирует файл.Проблема в том, что если я объявлю это как первую зависимость самой цели, то фальшивая зависимость обернется в $ ^ и запутает следующий шаг связывания.
Вот пример:
.PHONY: start
sample-prog-1 : start sample-prog-1.o
В других местах у меня есть правило для создания исполняемого файла из объектного файла:
%: %.o
echo "Building executable $@";$(CC) $(LDFLAGS) $^ $(LOADLIBES) $(LDLIBS) -o $@ $(LDFLAGS_$@)
Проблема в том, что «start» является фальшивой целью, поэтому она не существует, но этап связыванияПри вызове «start» в качестве одного из объектных файлов, процесс сборки выкручивается!
Я нашел обходной путь, который просто удаляет «start» из списка объектных файлов:
%: %.o
echo "Building executable $@";$(CC) $(LDFLAGS) $(shell echo "$^" | sed s/start//g) $(LOADLIBES) $(LDLIBS) -o $@ $(LDFLAGS_$@)
Но помимо того, что это выглядит очень хакерским и уродливым, это также означает, что у меня не может быть никаких исходных файлов, в которых есть «start».Я также всегда перестраиваю sample-prog-1, так как «begin» всегда оказывается переделанным.
Это просто кажется неправильным решением, но я в растерянности относительно того, что "Правильный "способ сделать это есть.Я думаю, что я должен сделать что-то, где я выделяю исполняемый файл примерно так:
sample-prog-1 : sample-prog-1.o
do_sample-prog-1 : start sample-prog-1
Но это не интуитивно понятно, потому что теперь, если я хочу создать заданную цель, я должен помнить, что нужно добавить илидобавьте еще одну строку к этому целевому имени, чтобы стартовый код был запущен до сборки исполняемого файла.