get_property从ExternalProject中找不到TARGET

问题描述

我遇到了一个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,如果我执行此操作,这确实出错了建立具有多个线程的VM。

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

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

我发现的其他问题并不相同,因此无法为我提供解决方案:

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

因此,总而言之,如何使libnest2d外部项目依赖于NLopt?为什么要接受两个依赖项,而不能接受一个依赖项?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)