CMake:create_symlink vs ln

问题描述 投票:3回答:1

我有一个宏来创建链接,例如

makeLink($BUILD_ROOT/lib somewhere/somelibrary.so makelinks)

这样做的目的是使完整的构建包括类似于开发人员安装的目录结构,其中binincludelib目录包含指向实际产品的链接。

但是,目的与我的问题无关,该问题与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=14928https://cmake.org/Bug/print_bug_page.php?bug_id=4418

鉴于此,为什么任何人都应该使用create_symlink?明智的做法是不为所有常见用例合并支持(基本上是通过对ln实现系统可移植包装)?在某处是否有半标准的.cmake文件?

当您使用cmake -E或解析器将其识别为特例时,cmake确实在进行递归调用以分叉自身。我怀疑后者看起来非常快(允许以这种方式创建链接仍然看起来很快),但是如果是这样,为什么不必要的冗长语法呢?


注意:我不是在配置过程中构建库。 links到库的创建是为了支持两件事:

  • 链接使用其他子项目中的库的程序
  • 运行使用库的测试

这些库实际上不是在'configure'阶段构建的。链接仅需要及时可用。这是从基于配置/制作的构建系统到cmake / ninja迁移的一部分。它是一个比较大的项目,其中分阶段从cmake推出比大爆炸更可取。碰巧的是,在现有系统中,链接是在配置时创建的(尽管直到构建时才使用)。

cmake symlink
1个回答
1
投票

通常create_symlink仅在构建目录中用于链接到主要在源目录中的内容。考虑到这一点以及所需的平台独立性,一切都很好。

[如果需要更多,然后create_symlink提供,则很有可能以一种不适合的方式使用CMake,或者CMake不是完成任务的正确工具。CMake提供的内容,如您用“ 如果目的地不存在而源不存在,创建链接;如果不存在源则失败,则创建链接”所概括的那样。您知道创建了哪个文件,因此创建链接而不知道该链接是否已经存在或源是否存在永远不会发生。创建链接后,为什么要覆盖链接?

根据您的情况,add_custom_command就是正确的工具。只需将PRE_BUILD替换为POST_BUILD

© www.soinside.com 2019 - 2024. All rights reserved.