有没有和BUCK的header_namespace等价的cmake?

Is there a cmake equivalent to BUCK's header_namespace?

BUCK 构建工具允许我为库定义一个 header 命名空间。例如,如果我有一个名为 libA 的库,其目录结构为:

root
    include
        a.h
    src
        a.cpp

我可以在库上设置 header_namespace,比如 examples/liba,这样在使用 libA 的单独项目中我可以:

#include "examples/liba/a.h"

这很好,因为它允许我在我的项目中保留一个简化的目录结构,同时还使我的包含以更具可读性的方式组织起来。

CMake 提供这样的东西吗?我还没有找到类似的东西。我的目标是拥有 BUCK 和 CMake 构建文件,以便在没有 java(BUCK 的依赖项之一)的系统上更容易构建。

不,CMake 没有这样的设施。

管理 headers 的标准方法是以不太可能与其他代码冲突的方式在文件系统中组织它们。

root
    include
       liba
            a.h
    src
       a.cpp

那么简单的事情就是:

include_directories(include)

或更好,

target_include_directories(liba PUBLIC include)

或者,最现代的,

target_include_directories(liba PUBLIC
  "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
  "$<INSTALL_INTERFACE:include>")

这只是说在包含路径上提供给任何使用 liba 当前源目录中子目录 include 内容的人以及任何安装 liba include 子目录(相对于安装前缀解释)。

然后安装通常是这样的:

install(DIRECTORY include/
  DESTINATION include)

对于 headers,安装源包含目录下的所有内容和

install(TARGETS liba
  RUNTIME DESTINATION bin
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib)

用于实际库目标("libliba.a" 或 "libliba.so")。更好的是使用 include(GNUInstallDirs) 中的变量作为 GNU 标准文件夹名称。

在您的代码中,您始终只引用通常的 conflict-free 方法中的代码:

#include "liba/a.h"

所以,文件或代码永远不应该有任何冲突,除非你真的不擅长命名!