gpt4 book ai didi

CMake:create_symlink 与 ln

转载 作者:行者123 更新时间:2023-12-01 14:36:48 27 4
gpt4 key购买 nike

我有一个宏来创建链接

makeLink($BUILD_ROOT/lib somewhere/somelibrary.so makelinks)
这样做的目的是使一个完整的构建包含一个类似于开发人员安装的目录结构,包含指向实际产品的链接的 bin、include 和 lib 目录。
但是,目的与我关于 create_symlink 的问题无关,而不是关于链接是否应用于此目的或任何其他目的的元问题。
宏可以通过多种方式实现,包括:
macro(makeLink src dest target)
add_custom_command(TARGET ${target} PRE_BUILD
COMMAND ln -sf ${src} ${dest} DEPENDS ${dest} COMMENT "mklink ${src} -> ${dest}")
endmacro()
或者:
macro(makeLink src dest target)
add_custom_command(TARGET ${target} PRE_BUILD
COMMAND ${CMAKE_COMMAND} -E create_symlink ${src} ${dest} DEPENDS ${dest} COMMENT "mklink ${src} -> ${dest}")
endmacro()
现在我明白了 create_symlink 的要点是在平台不理解链接的情况下是可移植的。然而,它似乎在功能上不完整。 ln 有几种不同的用例
  • 无论源是否存在都创建一个链接
  • 仅当源存在时才创建链接
  • 是否覆盖现有链接

  • 据我所知,cmake 文档未指定行为(它实际上是:如果目标不存在且源存在,则创建链接。如果源不存在则失败)
    https://cmake.org/cmake/help/v3.2/manual/cmake.1.html
    这似乎可能让许多用户感到困惑,他们认为它应该根据一种且仅一种可能的用例来工作。例如。
    https://cmake.org/Bug/view.php?id=14928
    https://cmake.org/Bug/print_bug_page.php?bug_id=4418
    鉴于此,为什么任何人都应该使用 create_symlink?
    是否明智的做法是合并对所有常见用例的支持(主要是通过对 ln 实现系统可移植包装器)?
    某处是否有半标准的 .cmake 文件?
    当您使用 cmake -E 或解析器是否将其识别为特殊情况时,cmake 是否真的会递归调用 fork 本身。我怀疑后者看起来非常快(允许以这种方式创建链接仍然看起来很快)但如果是这样,为什么会出现不必要的冗长语法?

    注意:我不是在配置中构建库。创建库链接以支持两件事:
  • 链接使用其他子项目中的库的程序
  • 运行使用库的测试

  • 在“配置”阶段实际上并未构建库。链接只需要及时可用。这是从基于 configure/make 的构建系统迁移到 cmake/ninja 的一部分。这是一个大型项目,分阶段推出 cmake 比大爆炸更可取。碰巧的是,在现有系统中,链接是在配置时创建的(尽管直到构建时才使用)。

    最佳答案

    通常 create_symlink仅在构建目录中用于链接到主要在源目录中的东西。鉴于这一点和所需的平台独立性,一切都很好。

    如果您需要更多,则 create_symlink提供,很有可能您以非预期的方式使用 CMake,或者 CMake 不是您任务的正确工具。
    CMake 提供的内容,如您总结的“如果目标不存在且源存在则创建链接。如果源不存在则失败”就是您所需要的。您知道创建了哪个文件,因此创建链接而不知道此链接是否已存在或源是否存在不应发生。为什么在您刚刚创建链接时覆盖它?

    在您的情况下,add_custom_command是正确的工具。只需更换 PRE_BUILD来自 POST_BUILD .

    关于CMake:create_symlink 与 ln,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34876602/

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