gpt4 book ai didi

git - CMake 外部项目 : how to specify relative path to the root CMakeLists. txt?

转载 作者:太空狗 更新时间:2023-10-29 12:45:44 25 4
gpt4 key购买 nike

似乎CMake ExternalProject始终假定为根目录外部项目的源目录。但如果那不是呢案子?

考虑以下示例:

外部项目使用此目录布局:

libfoo.git                 <--- ExternalProject assumes this as source dir.
├── ...
└── libfoo <--- However, the actual source directory is this!
   ├── CMakeLists.txt
   └── ...

在依赖项目libfoo中配置如下:

ExternalProject_Add( libfoo 
PREFIX "${CMAKE_CURRENT_BINARY_DIR}/EP_libfoo"
GIT_REPOSITORY "<link to remote which hosts libfoo.git>"
GIT_TAG "<some hash>"
)

然后构建失败并显示以下错误消息:

$ cmake -H/path/to/source-dir -B/path/to/build-dir
...
$ cmake --build /path/to/build-dir/ --target all
...
CMake Error: The source directory "/path/to/build-dir/EP_libfoo/src/libfoo" does not appear to contain CMakeLists.txt.
...
$

因此,正如上面目录布局中指出的那样,CMake 认为根外部项目是

/path/to/build-dir/EP_libfoo/src/libfoo

事实上,它是

/path/to/build-dir/EP_libfoo/src/libfoo/libfoo

我尝试解决这个问题:

  1. 不幸的是,更改 ExternalProject 的参数 SOURCE_DIR 确实不起作用,因为此变量的值用作libfoo 的 git 存储库被克隆到其中。这导致无法打破的递归依赖 hell 。

  2. 更改 libfoo 的目录布局以符合 ExternalProject。显然,这可行,但可能不适用于其他(只读)第三方库。

  3. 滥用 ExternalProject 的更新/补丁步骤,例如通过指定

    set( EP_LIBFOO_DIR "${CMAKE_CURRENT_BINARY_DIR}/EP_libfoo" )

    ExternalProject_Add( libfoo
    PREFIX "${EP_LIBFOO_DIR}"
    GIT_REPOSITORY "<link to remote which hosts libfoo.git>"
    GIT_TAG "<some hash>"

    # Copy the content of `<...>/libfoo/libfoo` into `<...>/libfoo`.
    # Note to self: using symlinks instead copying is too platform-specific.
    PATCH_COMMAND ${CMAKE_COMMAND} -E copy_directory "${EP_LIBFOO_DIR}/src/libfoo/libfoo" "${EP_LIBFOO_DIR}/src/libfoo"
    )

    这行得通,但它很老套,而且很容易与其他外部项目一起失败。

  4. solution to another problem 为基础: 添加一个临时的CMakeLists.txt 在 CMake 假定的位置。这个临时文件然后包含实际的 CMakeLists.txt:

    set( EP_LIBFOO_DIR "${CMAKE_CURRENT_BINARY_DIR}/EP_libfoo" )
    set( GENERATED_DIR "${CMAKE_BINARY_DIR}/generated" )

    file( MAKE_DIRECTORY ${GENERATED_DIR} )
    file( WRITE ${GENERATED_DIR}/CMakeLists.txt
    "cmake_minimum_required( VERSION 3.0 )\n"
    "add_subdirectory( libfoo )\n"
    )

    ExternalProject_Add( libfoo
    PREFIX "${EP_LIBFOO_DIR}"
    GIT_REPOSITORY "<link to remote which hosts libfoo.git>"
    GIT_TAG "<some hash>"

    # Copy the
    UPDATE_COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/generated/CMakeLists.txt ${EP_LIBFOO_DIR}/src/libfoo
    )

    这同样有效,而且感觉比以前的解决方案更好。

但是,是否存在更优雅来做同样的事情?

最佳答案

我已经提交了 a merge requestSOURCE_SUBDIR 选项添加到 ExternalProject_Add 以解决此用例。希望它将在 CMake 3.7 中可用。 (您也可以将 ExternalProject*.cmake 本地复制到您自己的项目中,以立即利用该功能。)

关于git - CMake 外部项目 : how to specify relative path to the root CMakeLists. txt?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30028117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com