CMake:重建外部项目

时间:2017-02-08 17:24:56

标签: c++ git cmake

我有一个使用外部库的项目。该项目的CMakeLists.txt如下所示:

cmake_minimum_required(VERSION 3.6.0)

project(my-project)

set(CMAKE_CXX_STANDARD 14)

include(ExternalProject)
find_package(Git REQUIRED)

ExternalProject_Add(library
        PREFIX ${my-project_SOURCE_DIR}/lib/library
        GIT_REPOSITORY https://github.com/vendor/library
        GIT_TAG master
        UPDATE_COMMAND ""
        INSTALL_COMMAND ""
        )

link_directories(${my-project_SOURCE_DIR}/lib/library/src/library-build/src)

add_subdirectory(src)

和src / CMakeLists.txt这样:

include_directories(../lib/library/src/library/include)

add_executable(my-project
        main.cpp
        )

add_dependencies(my-project library)

target_link_libraries(my-project liblibrary.a)

它从Git中提取库并首次构建它而没有任何问题。

我想编辑库的源代码并自动重新编译库.a文件。我能做到的最干净的方法是什么?它目前忽略了对源代码的任何更新,因为它已经有了库的.a文件。

当我尝试添加

add_subdirectory(lib/library/src/library/src)

到我的主CMakeLists.txt,我收到以下错误:

lib / library / src / library / src / CMakeLists.txt中的CMake错误:55(add_library):add_library无法创建目标"库"因为已经存在另一个具有相同名称的目标。现有目标是在源目录" / cygdrive / c / Code / my-project"中创建的自定义目标。有关更多详细信息,请参阅策略CMP0002的文档。

我猜这是由于致电

造成的
add_library(gram STATIC ${SOURCE_FILES})

在库CMakeLists.txt中,然后调用

ExternalProject_Add(library ...)

项目CMakeLists.txt。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

由于您使用ExternalProject_Add的主要目标是从外部源下载依赖项而不进行配置和构建,因此您可以定义CMAKE_COMMANDCONFIGURE_COMMANDBUILD_COMMAND作为空字符串。与您对UPDATE_COMMANDINSTALL_COMMAND的操作相同。这样,ExternalProject_Add只会克隆一次存储库。

要克服名称冲突,只需为ExternalProject_Add的第一个参数使用另一个参数,例如library_src

ExternalProject_Add(library_src
    PREFIX ${my-project_SOURCE_DIR}/lib/library
    GIT_REPOSITORY https://github.com/vendor/library
    GIT_TAG master
    UPDATE_COMMAND ""
    CONFIGURE_COMMAND ""
    CMAKE_COMMAND ""
    BUILD_COMMAND ""
    INSTALL_COMMAND ""
)
ExternalProject_Get_Property(library_src SOURCE_DIR)
add_subdirectory(${SOURCE_DIR})

第二个命令(ExternalProject_Get_Property)将为您提供给定外部项目的命名属性。输出变量与属性的名称相同。这样,您就可以免除ExternalProject_Add放置实际源树的行为的变化。

答案 1 :(得分:0)

在ExternalProject_Add中添加此命令可能会帮助您: UPDATE_COMMAND“”

https://gitlab.kitware.com/cmake/cmake/issues/16419