CMake:create_symlink vs ln

时间:2016-01-19 12:16:47

标签: cmake symlink

我有一个宏来创建链接E.g。

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文档中指定了行为(实际上是:如果目标不存在且源存在,则创建链接。如果源不存在则失败)< / p>

https://cmake.org/cmake/help/v3.2/manual/cmake.1.html

这似乎可能会使许多用户感到困惑,他们认为应该根据一个且只有一个可能的用例工作。 E.g。

https://cmake.org/Bug/view.php?id=14928 https://cmake.org/Bug/print_bug_page.php?bug_id=4418

鉴于此,为什么有人会使用create_symlink? 明智的做法是不是要对所有常见用例(主要是通过实现系统便携式包装器)来支持? 这个地方是否有半标准的.cmake文件?

当你使用cmake -E或者解析器将它识别为特殊情况时,cmake也正在对fork本身进行递归调用。我怀疑后者看起来非常快(授予以这种方式创建链接似乎仍然很快)但是如果这就是为什么不必要的详细语法呢?

注意:我没有将库构建为configure的一部分。创建链接到库以支持两件事:

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

在配置&#39;期间,实际上并没有构建库。阶段。链接只需要及时提供。这是从基于配置/ make的构建系统迁移到cmake / ninja的一部分。这是一个大型项目,分阶段推出cmake比大爆炸更好。恰好在现有系统中,链接是在配置时创建的(虽然直到构建时才使用)。

1 个答案:

答案 0 :(得分:1)

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

如果您需要create_symlink提供的更多内容,则很有可能以不适合的方式使用CMake,或者CMake不适合您的任务。
CMake提供的内容,如您所总结的那样“创建链接,如果目标不存在且源存在。如果源不存在则失败”就是您所需要的。您知道创建了哪个文件,因此创建链接并且不知道此链接是否已存在或源是否存在永远不会发生。为什么要在创建链接时覆盖链接?

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