我遇到了CMakes Add_External_Project
功能的问题(更多的是烦恼而不是其他任何事情)。具体来说,我无法理解密钥CONFIGURE_COMMAND
,BUILD_COMMAND
和INSTALL_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 ""
)
答案 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)