3

我遇到了一个让我有点难过的 CMake 问题。它涉及一个 CMake 项目,该项目为我在工作中开发的应用程序构建依赖项。我现在必须添加一个新的依赖项 libnest2d,它本身也有三个依赖项,其中一些也是新的。

为了让 libnest2d 构建,我有这个 ExternalProject_Add 调用:

ExternalProject_Add(libnest2d
    GIT_REPOSITORY https://github.com/tamasmeszaros/libnest2d.git
    GIT_TAG da4782500da4eb8cb6e38e5e3f10164ec5a59778
    CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
               -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX}
               -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
    DEPENDS BoostHeaders nlopt Clipper
)

这个项目依赖于 Boost Headers、NLopt 和 Clipper。那些 Boost 标头和 Clipper 都很好,但它以某种方式抱怨 NLopt 并出现以下错误:

CMake Error at /usr/share/cmake-3.16/Modules/ExternalProject.cmake:2962 (get_property):
  get_property could not find TARGET nlopt.  Perhaps it has not yet been
  created.
Call Stack (most recent call first):
  /usr/share/cmake-3.16/Modules/ExternalProject.cmake:3239 (_ep_add_configure_command)
  projects/libnest2d.cmake:5 (ExternalProject_Add)
  CMakeLists.txt:61 (include)


CMake Error at /usr/share/cmake-3.16/Modules/ExternalProject.cmake:2964 (get_property):
  get_property could not find TARGET nlopt.  Perhaps it has not yet been
  created.
Call Stack (most recent call first):
  /usr/share/cmake-3.16/Modules/ExternalProject.cmake:3239 (_ep_add_configure_command)
  projects/libnest2d.cmake:5 (ExternalProject_Add)
  CMakeLists.txt:61 (include)


CMake Error at /usr/share/cmake-3.16/Modules/ExternalProject.cmake:1783 (get_property):
  get_property could not find TARGET nlopt.  Perhaps it has not yet been
  created.
Call Stack (most recent call first):
  /usr/share/cmake-3.16/Modules/ExternalProject.cmake:2064 (ExternalProject_Get_Property)
  /usr/share/cmake-3.16/Modules/ExternalProject.cmake:2966 (_ep_get_step_stampfile)
  /usr/share/cmake-3.16/Modules/ExternalProject.cmake:3239 (_ep_add_configure_command)
  projects/libnest2d.cmake:5 (ExternalProject_Add)
  CMakeLists.txt:61 (include)


CMake Error at /usr/share/cmake-3.16/Modules/ExternalProject.cmake:1785 (message):
  External project "nlopt" has no stamp_dir
Call Stack (most recent call first):
  /usr/share/cmake-3.16/Modules/ExternalProject.cmake:2064 (ExternalProject_Get_Property)
  /usr/share/cmake-3.16/Modules/ExternalProject.cmake:2966 (_ep_get_step_stampfile)
  /usr/share/cmake-3.16/Modules/ExternalProject.cmake:3239 (_ep_add_configure_command)
  projects/libnest2d.cmake:5 (ExternalProject_Add)
  CMakeLists.txt:61 (include)

所以它声明nlopt目标没有定义。但是,该目标是使用另一个ExternalProject_Add调用定义的,与其他两个依赖项相同:

ExternalProject_Add(nlopt
    GIT_REPOSITORY https://github.com/stevengj/nlopt.git
    GIT_TAG v2.6.2
    CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
               -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX}
               -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
)

ExternalProject_Add(BoostHeaders
    URL http://sourceforge.net/projects/boost/files/boost/1.67.0/boost_1_67_0.tar.bz2
    URL_HASH SHA1=694ae3f4f899d1a80eb7a3b31b33be73c423c1ae
    CONFIGURE_COMMAND ""
    BUILD_COMMAND ""
    INSTALL_COMMAND "${CMAKE_COMMAND}" -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/BoostHeaders-prefix/src/BoostHeaders/boost" "${CMAKE_INSTALL_PREFIX}/include/boost"
)

ExternalProject_Add(Clipper
    URL https://sourceforge.net/projects/polyclipping/files/clipper_ver6.4.2.zip
    URL_HASH SHA1=b05c1f454c22576f867fc633b11337d053e9ea33
    SOURCE_SUBDIR cpp
    CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
               -DCMAKE_PREFIX_PATH=${CMAKE_INSTALL_PREFIX}
               -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
)

如果没有 NLopt 依赖项,libnest2d 构建良好(因为我的本地系统上仍然安装了依赖项),但不能保证在启动 libnest2d 之前构建和安装 NLopt,如果我执行此构建确实会出错具有多个线程的虚拟机。

如果我暂时删除nlopt依赖项并调用cmake .. && make help,那么我会看到这nlopt是可用的目标之一。我也可以打电话make nlopt,它开始按预期构建 NLopt。

你可以在这里查看我的整个源代码:https ://github.com/Ultimaker/cura-build-environment/tree/CURA-7259_pynest2d 。在撰写本文时,我正在提交 39298d203d115b60d7093f0a801be1bad0ba7842。

我发现的其他问题并不相同,也没有为我提供解决方案:

  • 这个相关的问题有同样的错误,但它似乎是由 OP 使用的工具引起的,我没有使用。
  • 这个问题这个错误报告是一个被构建选项禁用的目标的问题,对我来说不是这种情况。目标显然存在,我没有选择禁用它。
  • 有一个导致此问题的旧错误,但在 CMake 2.8 中已修复。我正在使用 CMake 3.16.3。

总而言之,我怎样才能使 libnest2d 外部项目依赖于 NLopt?为什么两个依赖项被接受,但一个不被接受?

4

0 回答 0