В Makefile, как я могу предотвратить включение фальшивого предварительного условия в $ ^ - PullRequest
1 голос
/ 10 марта 2012

У меня есть предварительное условие, которое я должен объявить для цели, которая должна всегда выполняться, прежде чем я попытаюсь построить цель.Это на самом деле не генерирует файл.Проблема в том, что если я объявлю это как первую зависимость самой цели, то фальшивая зависимость обернется в $ ^ и запутает следующий шаг связывания.

Вот пример:

    .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

Но это не интуитивно понятно, потому что теперь, если я хочу создать заданную цель, я должен помнить, что нужно добавить илидобавьте еще одну строку к этому целевому имени, чтобы стартовый код был запущен до сборки исполняемого файла.

Ответы [ 2 ]

3 голосов
/ 10 марта 2012

Вы можете рассмотреть обязательное условие только для заказа :

sample-prog-1 : sample-prog-1.o | start

Помимо прочего, предварительные условия только для заказа не отображаются в $^.

1 голос
/ 10 марта 2012

Вы можете поставить фальшивую цель после цели .o и затем использовать $< вместо $^:

sample-prog-1 : sample-prog-1.o start

%: %.o
        echo "Building executable $@";$(CC) $(LDFLAGS) $< $(LOADLIBES) $(LDLIBS) -o $@ $(LDFLAGS_$@)

Или, если вы используете gnu-make, используйте встроенную filter, чтобы получить только объектные файлы:

$(CC) $(LDFLAGS) $(filter %.o $^) $(LOADLIBES) $(LDLIBS) -o $@ 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...