CMAKE_*_OUTPUT_DIRECTORY 的正确使用

sve*_*evs 5 c++ cmake

前言:我说本地编译,说安装项目。这是因为我还没有对installCMake进行足够的研究,但如果我的问题与install实践直接相关(似乎很可能),请加入。

TL; 博士

  1. 在什么情况下,你希望收集所有项目库正在兴建到同一个目录?为什么没有任何人曾经CACHECMAKE_*_OUTPUT_DIRECTORY路径?

  2. 是否需要$<CONFIG>直接执行电平规范?

  3. 一般默认值应该是CMAKE_BINARY_DIR, CMAKE_CURRENT_BINARY_DIR, 还是PROJECT_BINARY_DIR

1.缓存还是不缓存?

这个优秀的答案

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
Run Code Online (Sandbox Code Playgroud)

您可以在网络上的许多项目中看到。

  • 父母CMakeLists.txt 不能覆盖这些。
  • 如果父项目想要/需要更改这些,例如将所有内容放在同一个文件夹中,这是不可能的。

所以建议的修订是始终 CACHE PATH "description"

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib CACHE PATH "Where to place compiled static libraries.")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib CACHE PATH "Where to place compiled shared libraries.")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin CACHE PATH "Where to place compiled executables.")
Run Code Online (Sandbox Code Playgroud)
  • 有什么理由缓存吗?

2.$<CONFIG>构建的处理

这应该几乎总是留给生成器,是吗?我的理解(和经验)是通过设置非配置,生成器(Visual Studio、XCode 等)使用每个配置构建的文件夹仍然满足于将东西放置在它们通常会放置的位置。AKA 通过不设置配置级别,CMAKE_*_OUTPUT_DIRECTORY_*我将控制权传递给生成器以让它决定。

3. BINARY_DIR, CURRENT_BINARY_DIR, 或PROJECT_BINARY_DIR?

在另一方面,说开发者希望他们建造在同一目录落得等项目。我不应该进一步使用CMAKE_CURRENT_BINARY_DIR OR PROJECT_BINARY_DIR吗?如果只使用 rawCMAKE_BINARY_DIR而没有使用CACHE,那么我绝对无法阻止我正在构建的子项目在我的旁边结束。

通过使用任一CMAKE_CURRENT_BINARY_DIR或者PROJECT_BINARY_DIR,如果用户确实希望这个图书馆旁边,他们可以简单地设置父项目最终CMAKE_*_OUTPUT_DIRECTORY变量之后配置这一项。

概括

基本上,对于如何使用这些变量似乎没有任何标准。我对 CMake 的多功能性感到兴奋,我并不是说他们应该在这里做任何默认值——这由项目决定。我试图了解最合适的默认选择是什么,如果他们愿意,这也允许开发人员绕过我的默认设置。

Flo*_*ian 5

我和@Tsyvarev 在一起。我没有看到启用 CMake 的项目的用户想要更改构建工件的输出路径,而只想更改安装路径。

1. 缓存还是不缓存?

只是不要将CMAKE_*_OUTPUT_DIRECTORY变量设置为缓存,因为如果另一个 CMake 项目使用您的项目作为子项目,您在某些情况下会覆盖父项目的设置(缓存变量是全局的)。

2.$<CONFIG>构建的处理

是的。仅当生成器的默认值不适合时才会给出(“配置名称”=“子文件夹名称”)。

3. CMAKE_BINARY_DIR, CMAKE_CURRENT_BINARY_DIR, 或PROJECT_BINARY_DIR?

所以我想说,保存变体将首先检查语句if ()是否其他人已经设置了变量,并且还使用PROJECT_BINARY_DIR

if (NOT CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
endif()
Run Code Online (Sandbox Code Playgroud)

然后,您的项目的用户仍然可以从外部设置变量,或者父项目可以设置它,如果未设置,您将拥有默认值。