通用 Makefile 中所需的预构建规则

Required prebuild rule in generic Makefile

我正在通过 makefile 为 Webots(机器人模拟器)编译 C++ 代码,并且我正在使用通用的 makefile Makefile.include Webots 供应来简化这个过程。

我通过自己的 makefile 构建,设置一堆必需的变量,然后调用那个设置所有必要的编译规则的 makefile。无论如何,这就是它应该工作的方式。

我收到以下错误:

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)

我不确定在pre-buildpost-build中调用make时是否没有语法错误,或者USER_PREBUILDUSER_POSTBUILD 应该是具体文件,但即使用 $(USER_PREBUILD) 替换它们,我也会得到 *** No targets specified and no makefile found。 所以我假设我需要在调用外部 makefile 之前设置这些变量,但是如果我在构建之前没有任何事情要做的话,语法到底是什么?

奇怪的是,尽管存在这些错误,程序仍然可以编译(我在 build 文件夹中获得了 *.o、*.d 和二进制文件),但它从未将二进制文件复制到目标文件夹。

在该文件中进行设置有点奇怪。

USER_PREBUILD:USER_POSTBUILD: 行没有任何作用,也没有为任何人做任何事情(至少我知道)。

对于如何解决这个问题,您有两种选择。

您可以在 makefile 中为 USER_PREBUILDUSER_POSTBUILD 目标提供空规则:

USER_PREBUILD USER_POSTBUILD: ;

或者您甚至可以通过使用以下行来避免尝试 运行 这些目标(以来自 make 的压倒一切的警告消息为代价):

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

在您的 makefile 包含 Makefile.include.

之后