编辑:我发现了一个可能的原因,但我不明白为什么:Project(Externals)删除下面脚本中的最后一行修复了我的问题.所以现在的问题为什么?
cmake_minimum_required(VERSION 2.8)
include(ExternalProject)
MACRO(EXTERNAL_DEF aNewTargetName aPathToSource)
ExternalProject_Add(
${aNewTargetName}
PREFIX ${CMAKE_INSTALL_PREFIX}
SOURCE_DIR ${aPathToSource}
TMP_DIR "${CMAKE_INSTALL_PREFIX}/tmp/${CMAKE_BUILD_TYPE}"
DOWNLOAD_DIR "${CMAKE_INSTALL_PREFIX}/src/${CMAKE_BUILD_TYPE}"
BINARY_DIR "${CMAKE_INSTALL_PREFIX}/src/${CMAKE_BUILD_TYPE}/${aNewTargetName}-build"
STAMP_DIR "${CMAKE_INSTALL_PREFIX}/src/${CMAKE_BUILD_TYPE}/${aNewTargetName}-stamp"
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
--debug-output
BUILD_COMMAND "${CMAKE_COMMAND}" --build
"${CMAKE_INSTALL_PREFIX}/src/${CMAKE_BUILD_TYPE}/${aNewTargetName}-build" --config "${CMAKE_BUILD_TYPE}"
#INSTALL_DIR "${CMAKE_INSTALL_PREFIX}"
)
ENDMACRO()
get_filename_component(zlibAbsPath "./zlib" ABSOLUTE)
EXTERNAL_DEF(zlib_external ${zlibAbsPath})
Project(Externals)
Run Code Online (Sandbox Code Playgroud)
我在上面的CMakeLists.txt文件中调用cmake,CMAKE_INSTALL_PREFIX设置为让我们说"d:\ externals"并CMAKE_BUILD_TYPE设置为"Release"
期望:
我希望只构建Release配置.在它构建之后,我希望它能够被安装D:\externals\bin\zlib.dll.
问题:
实际上,ExternalProject_Add构建了Debug和Release,并安装了dll的调试版本D:\externals\bin\zlibd.dll
我的构建脚本不正确吗?我究竟做错了什么?
编辑:更多信息.我刚注意到 在生成的D:\ externals\src\Release\zlib_external-build\zlib.sln中,根本没有选择INSTALL目标进行构建.如果我检查它是否为Release配置构建,然后点击visual studio中的"Build",则INSTALL目标会构建并安装我期望它们的文件.我不知道是怎么回事...
我想建立openssl并将我的项目链接到它.在我的项目中,我有一个名为net的库,它是使用openssl的部分.所以在我的net\CMakeList中,我补充道
include_directories(
../
+ ../../../ext/openssl/inc32/
)
add_library(net STATIC ${sources})
+ ADD_DEPENDENCIES(net openssl)
Run Code Online (Sandbox Code Playgroud)
在我用于组织所有外部库的ext文件夹中,我在名为openssl的文件夹中有一个全新的解压缩openssl源代码.然后我编辑了ext\CmakeList
message(STATUS "Configuring OpenSSL")
set(openssl_dir openssl)
if (CMAKE_CL_64)
include(ExternalProject)
set(OPENSSL_CONFIGURE perl\ Configure\ VC-WIN64A)
set(OPENSSL_MAKE ms\\do_win64a\ &&\ nmake\ -f\ ms\\ntdll.mak)
ExternalProject_Add(openssl
PREFIX openssl
#-- Download Step ----------
SOURCE_DIR ${CMAKE_SOURCE_DIR}/ext/openssl
#--Configure step ----------
CONFIGURE_COMMAND ${OPENSSL_CONFIGURE}
#--Build Step ----------
BUILD_COMMAND ${OPENSSL_MAKE}
BUILD_IN_SOURCE 1
#--install Step ----------
INSTALL_COMMAND ""}
)
endif()
Run Code Online (Sandbox Code Playgroud)
当我构建时,编译器抱怨它无法找到包含文件,并且根本没有构建openssl源代码,因为没有out32dll和inc32.
我的问题是:ExternalProject_Add何时实际构建项目?如果我根据openssl创建我的网库,这是否意味着当我构建网络时,它需要先检查并构建openssl?
我的桌面上有一个git-bare-repository,我想用CMake克隆它。我的存储库具有此路径C:\Users\demoUser\Desktop\learnGIT\prog。我的CMakeLists.txt看起来像这样:
cmake_minimum_required(VERSION 2.8)
project(Demo)
include(ExternalProject)
ExternalProject_Add(demo
GIT_REPOSITORY C:/Users/demoUser/Desktop/learnGIT/prog
GIT_TAG master
UPDATE_COMMAND ""
INSTALL_COMMAND ""
)
Run Code Online (Sandbox Code Playgroud)
但是在生成的文件夹prog-build中只是浪费。生成的文件夹结构不包含存储库中的任何我的文件。
有人有主意吗?
我正在使用CMake和ExternalProject_Add构建一个外部库.我在这里使用了答案来生成以下内容(它捕获命令行输入到CMake以便将其传递给ExternalProject_Add命令):
get_cmake_property(CACHE_VARS CACHE_VARIABLES)
foreach(CACHE_VAR ${CACHE_VARS})
get_property(CACHE_VAR_HELPSTRING CACHE ${CACHE_VAR} PROPERTY HELPSTRING)
if(CACHE_VAR_HELPSTRING STREQUAL "No help, variable specified on the command line.")
get_property(CACHE_VAR_TYPE CACHE ${CACHE_VAR} PROPERTY TYPE)
if(CACHE_VAR_TYPE STREQUAL "UNINITIALIZED")
set(CACHE_VAR_TYPE)
else()
set(CACHE_VAR_TYPE :${CACHE_VAR_TYPE})
endif()
set(CMAKE_ARGS "${CMAKE_ARGS} -D${CACHE_VAR}${CACHE_VAR_TYPE}=\"${${CACHE_VAR}}\"")
endif()
endforeach()
Run Code Online (Sandbox Code Playgroud)
ExternalProject_Add命令如下所示:
ExternalProject_Add(external_lib
URL ${EXTERNALLIB_SOURCE_DIR}
PREFIX ${EXTERNALLIB_PREFIX}
CMAKE_ARGS "${CMAKE_ARGS};-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>"
INSTALL_DIR ${EXTERNALLIB_INSTALL_DIR}
BINARY_DIR "${EXTERNALLIB_PREFIX}/lib"
)
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何正确地将CMAKE_ARGS变量传递给此命令.显然,其他变量工作正常,但CMAKE_ARGS似乎没有正确扩展,因为我知道它包含我想要它包含的内容.我在使用CMake语法错误吗?
我尝试在CMakeLists.txt中设置ExternalProject_Add,
为此,我发现了这个问题:
CMake EXTERNALPROJECT_ADD与Git存储库的正确用法是什么?
但是我有一个问题,我不能打电话CONFIGURE_COMMAND configure,因为我必须打电话./autogen.sh来生成configure.ac.我没有找到如何使cmake运行./autogen.sh
我将 OpenSSL 作为我的 CMake 项目的一部分。由于它没有自己的 CMake 文件,因此我将其构建为外部项目。不幸的是,每次我重建项目时,ExternalProject 也会重建,并且它是迄今为止最大且最慢的部分。
如何避免每次都重建ExternalProject?
我尝试过 BUILD_ALWAYS = false 但没有帮助。OpenSSL 必须从源代码构建为静态库。
我有一个 cmake 项目,它使用 CMake 的ExternalProject_Add 功能来使用外部项目。有没有办法在外部项目上设置策略和属性?
我希望将我的项目中设置的策略和属性也转发到外部项目,以便使用静态多线程 Windows 运行时库而不是动态库。
cmake_policy(SET CMP0091 NEW)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
Run Code Online (Sandbox Code Playgroud) 是否可以在INSTALL_COMMANDcmake 的阶段使用任何 shell 命令ExternalProject_Add?例如
ExternalProject_Add(leveldb
GIT_REPOSITORY git@github.com:google/leveldb.git
GIT_TAG v1.18
CONFIGURE_COMMAND ./build_detect_platform build.settings .
BUILD_COMMAND make -j 8
BUILD_IN_SOURCE 1
INSTALL_COMMAND ""
)
# INSTALL_COMMAND "mkdir -p ${CMAKE_BINARY_DIR}/lib/ \
# && find . \( -name \"*${CMAKE_SHARED_LIBRARY_SUFFIX}\" -or -name \"*${CMAKE_STATIC_LIBRARY_SUFFIX}\" \
# -exec cp {} ${CMAKE_BINARY_DIR}/lib/\;\) \
# && cp -r ./include ${CMAKE_BINARY_DIR}")
Run Code Online (Sandbox Code Playgroud)
我注释掉了我想使用的 INSTALL_COMMAND,似乎不允许使用 find 和 cp,“没有这样的文件或目录,错误 127”是使用它的结果。
当安装目标搞砸时,引用ExternalProjects会很痛苦.因此,在为给定项目生成主项目文件之前,可能需要构建和安装一次ExternalProjects.是否可以使用CMake以及如何操作?
我正在尝试将Automake项目添加为外部项目.Automake配置脚本(通常与之一起运行./configure)包含资源文件的相对路径.我手动运行configure时找到该文件,因为我的工作目录位于源目录中.但是,当我运行configure时ExternalProject_Add,它找不到资源文件,因为工作目录是CMAKE_CURRENT_BINARY_DIR.
ExternalProject_Add(zlib
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
CONFIGURE_COMMAND sh ${CMAKE_CURRENT_SOURCE_DIR}/configure
BUILD_COMMAND make)
Run Code Online (Sandbox Code Playgroud)
如何设置配置步骤的工作目录,以便配置脚本找到所需的文件?
我整理了一个简单的 CMakeLists.txt 文件,该文件对 ExternalProject_Add 进行了一次调用,但从未下载过该项目。我需要在文件中添加更多内容吗?
cmake_minimum_required(VERSION 3.2)
include(ExternalProject)
# Download and install GoogleTest
ExternalProject_Add(
gtest
URL https://googletest.googlecode.com/files/gtest-1.7.0.zip
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/gtest
# Disable install step
BUILD_IN_SOURCE 1
INSTALL_COMMAND ""
BUILD_ALWAYS 1
)
Run Code Online (Sandbox Code Playgroud)
然后我执行cmake -G "Visual Studio 12" ..
我试图使用ExternalProject模块:
ExternalProject_Add( googlebenchmark
GIT_REPOSITORY "https://github.com/google/benchmark.git"
TLS_VERIFY ON
CMAKE_CACHE_DEFAULT_ARGS -DBENCHMARK_ENABLE_TESTING:BOOL=OFF
SOURCE_DIR "${CMAKE_BINARY_DIR}/third_party/gbenchmark"
INSTALL_DIR "${CMAKE_BINARY_DIR}/third_party" )`
Run Code Online (Sandbox Code Playgroud)
我遇到了一个问题:由于某种原因,该模块不会转发在(父)cmake 以及 CMAKE_BUILD_TYPE 中使用的编译器。
我尝试使用 CMAKE_CACHE_DEFAULT_ARGS 直接设置 CMAKE_CXX_COMPILER,但它并没有安静地解决。
对于这种行为有一个合理的解释吗?是否有正确的(cmake-ish)方法将当前使用的编译器/构建配置转发到ExternalProject?
我正在尝试使用ExternalProject_Add 命令从cmake 下载并构建DevIL,但由于某种原因,git 存储库在项目的子文件夹中包含CMakeLists.txt 文件。
我似乎无法找到一种方法使ExternalProject_add 在正确的文件夹上调用cmake。我尝试使用 prefix 和 source_dir,但仍然失败。
然后,我在网上看到一个答案,其中涉及创建一个临时的 CMakeLists.txt,它将调用正确的 cmake 路径。但由于我不知道如何提供 cmake 调用的路径,这意味着我必须将其放入下载的 git 存储库中,后来证明这很痛苦......这是我正在使用的当前命令:包括(“外部项目”)
######### Search for required third-party libraries. If not found, attempt to download and build them ########
set ( DEVIL_ROOT "${THIRD_PARTY_OUTPUT_PATH}/DevIL" )
option ( BUILD_DEVIL "Download and build DevIL" FALSE )
find_package ( Devil )
if ( NOT DEVIL_FOUND )
message ( STATUS "DevIL not found. Forcing to build own copy...")
set ( BUILD_DEVIL TRUE )
endif()
if ( BUILD_DEVIL )
set ( …Run Code Online (Sandbox Code Playgroud)