Обязательное правило предварительной сборки в универсальном Makefile

Я компилирую код C ++ для Webots (симулятора роботов) с помощью make-файлов, и я использую общий make-файл Makefile.include, поставляемый Webots, чтобы упростить процесс.

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

Я получаю следующую ошибку:

make[1]: *** No rule to make target 'USER_PREBUILD'.  Stop.
/usr/share/webots/resources/Makefile.include:503: recipe for target 'pre-build' failed
make: *** [pre-build] Error 2

И посмотрев на соответствующую строчку (от Makefile.include):

$(SUPPORTED_TARGETS): post-build

USER_PREBUILD:

USER_POSTBUILD:

pre-build:
    @$(MAKE) --silent USER_PREBUILD

post-build: main-build
    @$(MAKE) --silent USER_POSTBUILD

$(TARGETS): pre-build

main-build: $(TARGETS)

Я не уверен, нет ли синтаксической ошибки при вызове make в pre-build и post-build, или если USER_PREBUILD и USER_POSTBUILD должны быть конкретными файлами, но даже если заменить их на $(USER_PREBUILD), я получаю *** No targets specified and no makefile found. Итак, я предполагаю, что мне нужно будет установить эти переменные перед вызовом внешнего make-файла, но каков именно синтаксис, если мне нечего делать перед сборкой?

Как ни странно, даже несмотря на эти ошибки, программа компилируется (я получаю * .o, * .d и двоичный файл в папке build), но никогда не копирует двоичный файл в папку назначения.


person joaocandre    schedule 14.05.2015    source источник
comment
Да, редактировал вопрос.   -  person joaocandre    schedule 14.05.2015
comment
Попробуйте запустить make USER_POSTBUILD.   -  person G. Allen Morris III    schedule 14.05.2015


Ответы (1)


Это немного странный способ установить что-то в этом файле.

Строки USER_PREBUILD: и USER_POSTBUILD: не действуют и никому ничего не делают (по крайней мере, о чем я знаю).

У вас есть два варианта решения этой проблемы.

Вы можете указать пустые правила для целей USER_PREBUILD и USER_POSTBUILD в вашем make-файле:

USER_PREBUILD USER_POSTBUILD: ;

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

pre-build: ;
post-build: main-build ;

в вашем make-файле после включения Makefile.include.

person Etan Reisner    schedule 14.05.2015
comment
Второе решение помогло (первое вызвало те же ошибки ..) - person joaocandre; 14.05.2015
comment
Вы включили точку с запятой в первом решении? Потому что это должно сработать. (Я полагаю, это может быть после включения, но я не думаю, что это должно быть.) - person Etan Reisner; 14.05.2015