【问题标题】:jobserver unavailable when building external projects with CMake使用 CMake 构建外部项目时作业服务器不可用
【发布时间】:2016-01-15 06:10:16
【问题描述】:

我正在尝试使用ExternalProject_add 在 linux 上使用 CMake 构建一些外部项目。但是,他们不尊重make -j12 命令,并发出警告:

‘warning: jobserver unavailable: using -j1. Add `+' to parent make rule.’

这会痛苦地减慢我的构建速度。有什么方法可以并行构建外部项目吗?这是一个示例项目:

include(ExternalProject)
    ExternalProject_Add(
        ${TARGET_NAME}-ext
        URL ${CMAKE_CURRENT_SOURCE_DIR}/xerces-c-${VERSION_XERCESC}.tar.gz
        DOWNLOAD_DIR ${XERCESC_DIR}
        SOURCE_DIR ${XERCESC_DIR}/src
        PATCH_COMMAND chmod guo+rw ${CMAKE_CURRENT_SOURCE_DIR} -R
        CONFIGURE_COMMAND ./configure --prefix=${XERCESC_DIR} --disable-shared -q --disable-network --enable-transcoder-gnuiconv --enable-msgloader-inmemory
        BUILD_COMMAND make --silent
        INSTALL_COMMAND make install
        BUILD_IN_SOURCE 1
    )

【问题讨论】:

    标签: c++ cmake makefile


    【解决方案1】:

    为了让make 命令正确地传播给它们的子命令,您需要使用带括号(不是花括号)的$(MAKE) 而不是 make 作为您的命令,即

    BUILD_COMMAND $(MAKE) --silent
    INSTALL_COMMAND $(MAKE) install
    

    从 CMake 版本 2.8.4 开始支持此功能。

    【讨论】:

    • 这可行,但不可移植。我使用cmake --build <BINARY_DIR>,但收到作业服务器警告。
    • @pawetbylica 我猜这暗示这将包含在操作系统特定的构建语句中。以我的经验,大多数外部项目更容易以这种方式定义。这只是一种 Linux 解决方法。
    • Here 是这个答案的来源。
    • 这不是便携式的。如果你总是使用 make 作为顶层 make,它可能会起作用,但我们在第一级使用 ninja,然后 ninja 调用 make。您会收到类似“ninja: error: build.ninja:111: bad $-escape (literal $ must be writing as $$)”的错误
    • 这仅适用于 hack iff 1) 使用的生成器是 Makefiles 生成器,2) 使用的 make 首先支持作业服务器(GNU make?),3) '$(MAKE )' 最终成为 Makefile 规则中的第一个单词。在 BUILD_COMMAND 的情况下,您可能会得到一个看起来像这样的规则:cd current/working/directory && $(MAKE) ... 在这种情况下,恕我直言,这仍然失败。
    猜你喜欢
    • 1970-01-01
    • 2019-01-10
    • 2016-10-16
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 2018-02-24
    相关资源
    最近更新 更多