标签: external-project

ExternalProject_Add不会安装项目的Release配置

编辑:我发现了一个可能的原因,但我不明白为什么: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构建了DebugRelease,并安装了dll的调试版本D:\externals\bin\zlibd.dll

我的构建脚本不正确吗?我究竟做错了什么?

编辑:更多信息.我刚注意到 在生成的D:\ externals\src\Release\zlib_external-build\zlib.sln中,根本没有选择INSTALL目标进行构建.如果我检查它是否为Release配置构建,然后点击visual studio中的"Build",则INSTALL目标会构建并安装我期望它们的文件.我不知道是怎么回事...

cmake external-project

5
推荐指数
1
解决办法
2381
查看次数

ExternalProject_Add何时构建?

我想建立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?

windows 64-bit openssl cmake external-project

5
推荐指数
2
解决办法
4434
查看次数

CMake ExternalProject_添加Git

我的桌面上有一个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中只是浪费。生成的文件夹结构不包含存储库中的任何我的文件。

有人有主意吗?

git cmake external-project

5
推荐指数
2
解决办法
4736
查看次数

将CMake变量传递给ExternalProject_Add

我正在使用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语法错误吗?

c++ cmake external-project

4
推荐指数
1
解决办法
5602
查看次数

使用autogen.sh与ExternalProject_Add

我尝试在CMakeLists.txt中设置ExternalProject_Add,

为此,我发现了这个问题:

CMake EXTERNALPROJECT_ADD与Git存储库的正确用法是什么?

但是我有一个问题,我不能打电话CONFIGURE_COMMAND configure,因为我必须打电话./autogen.sh来生成configure.ac.我没有找到如何使cmake运行./autogen.sh

linux configure cmake autogen external-project

4
推荐指数
1
解决办法
1322
查看次数

CMakeExternalProject_Add每次都会重建

我将 OpenSSL 作为我的 CMake 项目的一部分。由于它没有自己的 CMake 文件,因此我将其构建为外部项目。不幸的是,每次我重建项目时,ExternalProject 也会重建,并且它是迄今为止最大且最慢的部分。

如何避免每次都重建ExternalProject?

我尝试过 BUILD_ALWAYS = false 但没有帮助。OpenSSL 必须从源代码构建为静态库。

openssl cmake external-project

4
推荐指数
1
解决办法
969
查看次数

如何在使用ExternalProject_Add添加的外部项目上设置CMake策略和属性

我有一个 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)

cmake external-project

4
推荐指数
1
解决办法
1105
查看次数

使用 shell 命令作为 INSTALL_COMMAND 到 ExternalProject_Add

是否可以在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”是使用它的结果。

shell cmake external-project

3
推荐指数
1
解决办法
3883
查看次数

如何在配置主要项目的同时构建cmake ExternalProject?

当安装目标搞砸时,引用ExternalProjects会很痛苦.因此,在为给定项目生成主项目文件之前,可能需要构建和安装一次ExternalProjects.是否可以使用CMake以及如何操作?

c++ cmake external-project

3
推荐指数
1
解决办法
1159
查看次数

为ExternalProject_Add CONFIGURE_COMMAND设置WORKING_DIRECTORY

我正在尝试将Automake项目添加为外部项目.Automake配置脚本(通常与之一起运行./configure)包含资源文件的相对路径.我手动运行configure时找到该文件,因为我的工作目录位于源目录中.但是,当我运行configureExternalProject_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)

如何设置配置步骤的工作目录,以便配置脚本找到所需的文件?

cmake external-project

3
推荐指数
1
解决办法
1371
查看次数

如何让 ExternalProject_Add 下载库?

我整理了一个简单的 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" ..

cmake external-project

2
推荐指数
1
解决办法
1791
查看次数

将当前编译器转发到ExternalProject

我试图使用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?

cmake external-project

2
推荐指数
1
解决办法
1061
查看次数

CMakeExternalProject_add 与子文件夹上的 CMakeLists

我正在尝试使用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)

git cmake external-project

1
推荐指数
1
解决办法
9125
查看次数

标签 统计

cmake ×13

external-project ×13

c++ ×2

git ×2

openssl ×2

64-bit ×1

autogen ×1

configure ×1

linux ×1

shell ×1

windows ×1