在CMakes“Add_External_Project”函数中使用cmake作为配置工具(CONFIGURE_COMMAND)

时间:2017-04-30 14:52:35

标签: cmake external-project

我遇到了CMakes Add_External_Project功能的问题(更多的是烦恼而不是其他任何事情)。具体来说,我无法理解密钥CONFIGURE_COMMANDBUILD_COMMANDINSTALL_COMMAND

在以下(工作)示例中,下载Google的测试库,问题末尾的两个文件将确保下载并构建第三方库(>安装)。 / p>

但是,当我尝试将配置和构建命令添加为“CONFIGURE_COMMAND”和“BUILD_COMMAND”(cmake .cmake --build)时,而不是必须执行execute_process CMake craps错误讯息:

[ 55%] Performing configure step for 'googletest'
/bin/sh: 1: cmake .: not found

我是否尝试做一些显然不在Add_External_Project功能范围内的事情?

示例文件:

CMakeLists.txt

cmake_minimum_required (VERSION 3.0)

project (Test VERSION 0.1.0.0 LANGUAGES CXX)

# Download and unpack googletest at configure time
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt.in" "${CMAKE_BINARY_DIR}/googletest-download/CMakeLists.txt" @ONLY)
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googletest-download" )

execute_process(COMMAND ${CMAKE_COMMAND} --build . WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/googletest-download")

add_subdirectory("${CMAKE_BINARY_DIR}/googletest-src" "${CMAKE_BINARY_DIR}/googletest-build")

CMakeLists.txt.in

cmake_minimum_required(VERSION 3.0)

project(third-party NONE)

include(ExternalProject)
ExternalProject_Add(googletest
  GIT_REPOSITORY    https://github.com/google/googletest.git
  GIT_TAG           master
  SOURCE_DIR        "@CMAKE_BINARY_DIR@/googletest-src"
  BINARY_DIR        "@CMAKE_BINARY_DIR@/googletest-build"
  CONFIGURE_COMMAND ""
  BUILD_COMMAND     ""
  INSTALL_COMMAND   ""
  TEST_COMMAND      ""
)

2 个答案:

答案 0 :(得分:1)

如果您根本没有指定CONFIGURE_COMMAND,它将假设一个CMake项目并为您运行相应的cmake命令(适当的,我的意思是它将使用相同的CMake生成器作为您的主要建筑等)。同样,如果您遗漏BUILD_COMMAND,它也会假设一个CMake项目并为您做cmake --build。因此,在您的情况下,只需省略这两行,ExternalProject_Add()应该完全按照您的意愿行事。

您可以将这两个选项指定为空字符串的主要原因是为了防止这些步骤完成任何操作。例如,这可能很有用,只需将ExternalProject_Add()用于其下载和解包功能。这种确切情况用于描述here的技术,用于下载GoogleTest的来源,以便通过add_subdirectory()将其添加到您的项目中,使其成为您构建的一部分(另请参阅this answer和一些相关材料对该问题的其他答案)。我怀疑这可能是你的代码派生的地方,因为结构看起来很相似。

为了完整性,如果您发现自己处于 需要指定CMake命令的情况,请不要使用裸cmake来引用要运行的命令。相反,始终使用由CMake提供的${CMAKE_COMMAND}作为当前用于处理文件的CMake可执行文件的位置。使用此变量意味着cmake不必位于用户的PATH上,并且还确保如果开发人员选择运行除PATH之外的其他版本的CMake,相同的cmake仍将用于您要添加的命令。

答案 1 :(得分:0)

您可以像这样使用PATCH_COMMAND

option(WITH_MBEDTLS "Build with mbedtls" OFF)
if(WITH_MBEDTLS)
  ExternalProject_Add(external-mbedtls
    URL https://github.com/ARMmbed/mbedtls/archive/mbedtls-2.16.1.tar.gz
    UPDATE_COMMAND ""
    PATCH_COMMAND ./scripts/config.pl set MBEDTLS_THREADING_C &&
                  ./scripts/config.pl set MBEDTLS_THREADING_PTHREAD
    CMAKE_ARGS
      -DCMAKE_INSTALL_PREFIX:PATH=${PROJECT_BINARY_DIR}/third_party/mbedtls
      -DCMAKE_TOOLCHAIN_FILE:PATH=${TOOLCHAIN_FILE}
      -DCMAKE_BUILD_TYPE:STRING=Debug
      -DENABLE_TESTING:BOOL=OFF
      -DENABLE_PROGRAMS:BOOL=ON
    TEST_COMMAND ""
    )
    set(MBEDTLS_PREFIX ${PROJECT_BINARY_DIR}/third_party/mbedtls PARENT_SCOPE)
endif(WITH_MBEDTLS)