标签: external-project

CMake:如何构建外部项目并包含其目标

我有一个项目A,它导出一个静态库作为目标:

install(TARGETS alib DESTINATION lib EXPORT project_a-targets)
install(EXPORT project_a-targets DESTINATION lib/alib)
Run Code Online (Sandbox Code Playgroud)

现在我想将项目A用作项目B的外部项目并包含其构建目标:

ExternalProject_Add(project_a
  URL ...project_a.tar.gz
  PREFIX ${CMAKE_CURRENT_BINARY_DIR}/project_a
  CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
)

include(${CMAKE_CURRENT_BINARY_DIR}/lib/project_a/project_a-targets.cmake)
Run Code Online (Sandbox Code Playgroud)

问题是当运行项目B的CMakeLists时,包含文件尚不存在.

有没有办法让include依赖于正在构建的外部项目?

cmake external-project

95
推荐指数
4
解决办法
8万
查看次数

CMake - 链接到从ExternalProject_add()下载的库

我正在尝试使用ExternalProject_add()来下载/安装依赖项.它安装得很好,但我无法弄清楚如何在下载后实际链接库.

我想在刚下载的库上调用target_link_libraries(),但库的路径因系统而异.

如果这是系统依赖,我可以调用find_package() - 但是默认搜索路径上没有安装软件包.我不认为你可以在模块模式下为find_package指定搜索路径.

这是我的CMakeLists.txt片段不起作用:

ExternalProject_Add(
protobuf
URL http://protobuf.googlecode.com/files/protobuf-2.4.1.tar.gz
CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=<INSTALL_DIR>
PREFIX ${MYPROJ_SOURCE_DIR}/dependencies
)
find_package(protobuf REQUIRED)
set(LIBS ${LIBS} ${PROTOBUF_LIBRARIES})
target_link_libraries (mybinary ${LIBS})
Run Code Online (Sandbox Code Playgroud)

cmake external-project

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

如何以跨平台的方式使用CMake ExternalProject_Add或替代方案?

我想建立一个已经将CMake作为我项目的CMake条带的一部分的第三方项目.ExternalProject_Add就是出于此目的,但我发现它只能用于特定的生成器,我想在很多平台上轻松工作.

例如,这里是zlib的外部项目添加脚本,它有自己的CMakeLists.txt:

set(USE_PROJECT_CMAKE_MODULE_PATH "-DCMAKE_MODULE_PATH=${MAKE_MODULE_PATH}")
ExternalProject_Add(ZLIB
                    SOURCE_DIR ${CMAKE_SOURCE_DIR}/external/zlib
                    DOWNLOAD_COMMAND ""
                    UPDATE_COMMAND ""
                    CMAKE_ARGS
                       -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
                       -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
                       -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
                       -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
                       ${USE_PROJECT_CMAKE_MODULE_PATH}
                    INSTALL_COMMAND "")

ExternalProject_Add_Step(ZLIB installInternally
                         COMMAND cd <BINARY_DIR> && make install
                         DEPENDEES install
                         ALWAYS 1)
ExternalProject_Get_Property(ZLIB install_dir)

if(UNIX)
    set(ZLIB_NAME libz)
else(UNIX)
    set(ZLIB_NAME zlib)
endif(UNIX)

add_library(zlib UNKNOWN IMPORTED)
set_property(TARGET zlib PROPERTY IMPORTED_LOCATION ${install_dir}/lib/${ZLIB_NAME}.a)
set(ZLIB_LIBRARIES zlib)
set(ZLIB_LIBRARIES_OPTIONAL ${ZLIB_LIBRARIES})
set(ZLIB_DIR ${install_dir} CACHE INTERNAL "zlib ROOT dir")
set(ZLIB_INCLUDE_DIRS ${install_dir}/include CACHE INTERNAL "zlib include dirs")
set(ZLIB_DEFINES "-msse2 -mfpmath=sse" CACHE INTERNAL "zlib defines")
Run Code Online (Sandbox Code Playgroud)

这个问题是它适用于make,但不适用于Xcode或Visual Studio.也许有一些方法可以将传递给我的项目的cmake构建命令转发给ExternalProject_Add.

如何以最小的代码复杂性以跨平台的方式编写ExternalProject_Add调用,还是有更好的选择?

cross-platform cmake external-project

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

CMake ExternalProject_Add()和FindPackage()

有没有正确的方法来找到一个用FindPackage()它构建的库(via )ExternalProject_Add()

问题是CMake无法在CMake时找到库,因为外部库在编译时生成.我知道在构建库和superbuild中的项目时可以组合这两个CMake函数,但我想在普通的CMake项目中使用它.

事实上,我想建立VTK 6 ExternalProject_AddFindPackage在我的CMake项目中找到它.

c++ build cmake vtk external-project

26
推荐指数
3
解决办法
2万
查看次数

未知的CMake命令"ExternalProject_Add"

我有以下CMakeLists.txt文件:

cmake_minimum_required (VERSION 3.2 FATAL_ERROR)

project (utils VERSION 1.0.0 LANGUAGES CXX)

ExternalProject_Add(json-c
    GIT_REPOSITORY "https://github.com/json-c/json-c.git"
    UPDATE_COMMAND git pull "https://github.com/json-c/json-c.git"

    CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/SDL_image/./configure
                      --prefix=${SDL_INSTALL_DIR}

    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/json-c

    INSTALL_DIR ${CMAKE_CURRENT_BINARY_DIR}
    )
Run Code Online (Sandbox Code Playgroud)

我想将json-c库添加到我的项目中,但是当我运行cmake时,我收到错误:未知的CMake命令"ExternalProject_Add".我的CMake版本在OS X上是3.6.2

cmake external-project

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

什么是INSTALL_DIR在ExternalProject_Add命令中有用?

我不明白在ExternalProject_Add命令中使用INSTALL_DIR.我尝试使用它,但它似乎不起作用.这是一个CMakeLists.txt的示例,使用可快速编译的特征库:

cmake_minimum_required (VERSION 2.6)
project (example CXX)
include(ExternalProject)
include(ProcessorCount)
set(CMAKE_VERBOSE_MAKEFILE ON)
ProcessorCount(N)
if(NOT N EQUAL 0)
   set(CMAKE_BUILD_FLAGS -j${N})
endif()
ExternalProject_Add
(
    mylib
    PREFIX myprefix
    DOWNLOAD_COMMAND wget http://bitbucket.org/eigen/eigen/get/3.2.4.tar.gz && tar xvzf 3.2.4.tar.gz -C mylib --strip-components=1
)
Run Code Online (Sandbox Code Playgroud)

我选择了以下项目层次结构:

project
    CMakeLists.txt
    build/
Run Code Online (Sandbox Code Playgroud)

从构建存储库,我输入:

cmake ..
make
Run Code Online (Sandbox Code Playgroud)

安装过程失败,并显示以下消息:

文件无法创建目录:/ usr/local/include/eigen3.
也许需要管理权限.

据我所知,这意味着我需要在配置步骤中定义"前缀":

cmake -D CMAKE_INSTALL_PREFIX=$INSTALL_DIR ..
Run Code Online (Sandbox Code Playgroud)

但是,INSTALL_DIR变量已在ExternalProject_Add命令中定义.但是,当我通过添加修改INSTALL_DIR的值时,我得到相同的错误

INSTALL_DIR myprefix/src/install
Run Code Online (Sandbox Code Playgroud)

在ExternalProject_Add命令中.

那么,INSTALL_DIR对什么有用呢?我究竟做错了什么?

当然,我知道如何提供自己的配置命令来添加前缀并解决问题.但这不是我的问题.我的问题是:如果我必须这样做,INSTALL_DIR的目的是什么?

cmake external-project

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

CMake ExternalProject_Add() - 使用自定义的CMakeLists.txt构建

我正在构建lua作为外部项目,我想使用我自己的CMakeLists.txt而不是捆绑的Makefile.这就是我在主CMakeLists.txt中的内容:

include(ExternalProject)
set(lua_RELEASE 5.1.4)
ExternalProject_Add(
    lua-${lua_RELEASE}
    URL http://www.lua.org/ftp/lua-${lua_RELEASE}.tar.gz
    DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/download/lua-${lua_RELEASE}
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/lua/lua-${lua_RELEASE}
    BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/build/lua-${lua_RELEASE}
    UPDATE_COMMAND ""
    PATCH_COMMAND ""
    INSTALL_COMMAND ""
)
Run Code Online (Sandbox Code Playgroud)

要使BUILD步骤起作用,SOURCE_DIR中必须有一个CMakeLists.txt.我现在在SOURCE_DIR中有这个CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)

project(lua)

set(lua_library
  lapi.c lcode.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c
  lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c
  ltable.c ltm.c lundump.c lvm.c lzio.c
  lauxlib.c lbaselib.c ldblib.c liolib.c lmathlib.c loslib.c
  ltablib.c lstrlib.c loadlib.c linit.c
)

foreach(s ${lua_library})
    set(lua_LIBRARY ${lua_LIBRARY} src/${s})
endforeach()

add_definitions(-DLUA_ANSI=1)
add_library(lua STATIC ${lua_LIBRARY})
Run Code Online (Sandbox Code Playgroud)

这有效,但我不满意让lua源文件混乱我的版本控制CMakeLists.txt.

有没有办法为不在 SOURCE_DIR中的构建步骤指定自定义CMakeLists.txt ?

cmake external-project

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

如何在主项目配置期间配置ExternalProject?

CMake的ExternalProject允许定义如何下载,配置,构建和安装外部项目.所有步骤都将在构建时执行.

我想在主项目配置期间执行外部项目的配置步骤.完成外部项目配置后,可以使用导入目标的描述,以便可以使用find_package()函数加载外部项目.

是否可以在配置时构建一些目标?

cmake external-project

10
推荐指数
3
解决办法
5778
查看次数

cmake external projects命令似乎忽略了INSTALL_DIR

首先,我对cmake相对较新.我正在尝试使用cmake构建一个具有单个外部依赖项的项目.我将外部项目的INSTALL_DIR指定为CMAKE_INSTALL_PREFIX,因此它将安装到与父项目相同的位置.但是当我运行make时,它会忽略它并尝试安装到/ usr/local/lib.

这是我的CMakeList.txt:

cmake_minimum_required( VERSION 2.8 )
include( ExternalProject )
project( capture )
add_library( capture SHARED capture.cc )
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )

ExternalProject_Add( proj_exceptions 
    GIT_REPOSITORY /home/user/workspace/exceptions 
    INSTALL_DIR ${CMAKE_INSTALL_PREFIX} 
)

add_library( exceptions SHARED IMPORTED )
set_property( TARGET exceptions 
    PROPERTY IMPORTED_LOCATION ${CMAKE_INSTALL_PREFIX}/lib/libexceptions.so 
)
add_dependencies( exceptions proj_exceptions )
include_directories( ${CMAKE_INSTALL_PREFIX}/include )
target_link_libraries( capture exceptions )
install( TARGETS capture DESTINATION lib )
install( FILES capture.h DESTINATION include )
Run Code Online (Sandbox Code Playgroud)

外部项目的CMakeLists.txt如下所示:

cmake_minimum_required( VERSION 2.8 )
project( exceptions )
add_library( exceptions SHARED exceptions.cc )
install( TARGETS …
Run Code Online (Sandbox Code Playgroud)

cmake external-project

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

避免额外的ExternalProject下载

假设我有以下项目设置与这些依赖项:

MainProject
?? Dependency_1
?  ?? Dependency_2
?? Dependency_2
Run Code Online (Sandbox Code Playgroud)

这些依赖关系的处理MainProjectDependency_1ExternalProject.

问题Dependency_2将被下载两次:Dependency_1将为自己MainProject下载一个副本,并将为自己下载一个副本.

这不是一个有效的构建过程,有没有一种方法可以Dependency_2为两个项目下载一次?


有人建议这个问题与此问题重复.这个问题与我的略有不同,因为我不能假设这些库将通过ExternalProject安装到主机系统.我还想要一个只有CMake的解决方案,而这个问题并不需要.

installation dependencies build cmake external-project

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