1

我遇到了 CMakesAdd_External_Project功能的问题(比其他任何事情都更令人烦恼)。具体来说,我不明白键CONFIGURE_COMMAND和。BUILD_COMMANDINSTALL_COMMAND

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

但是,当我尝试将配置和构建命令添加为“CONFIGURE_COMMAND”和“BUILD_COMMAND”(cmake .cmake --build)时,不必执行execute_processCMake 并显示错误消息:

[ 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      ""
)
4

2 回答 2

1

如果您根本不指定CONFIGURE_COMMAND,它将假定一个 CMake 项目并cmake为您运行适当的命令(适当地,我的意思是它将使用与您的主构建相同的 CMake 生成器等)。同样,如果您省略BUILD_COMMAND,它还将假定一个 CMake 项目并cmake --build为您执行。因此,在您的情况下,只需省略这两行,就ExternalProject_Add()应该完全按照您的意愿行事。

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

为了完整起见,如果您发现自己确实需要指定 CMake 命令,请不要使用裸词cmake来引用要运行的命令。相反,请始终使用${CMAKE_COMMAND}CMake 提供的 ,作为当前用于处理文件的 CMake 可执行文件的位置。使用此变量意味着cmake不必在用户的位置上,PATH并且还确保如果开发人员选择运行不同于.PATHcmake

于 2017-04-30T21:37:25.397 回答
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)
于 2019-06-11T08:06:40.520 回答