是否有一个等同于BUCK的header_namespace的cmake?

时间:2017-08-03 13:58:05

标签: c++ cmake buck

BUCK构建工具允许我为库定义头名称空间。例如,如果我有一个名为libA的库,则具有以下目录结构:

root
    include
        a.h
    src
        a.cpp

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

#include "examples/liba/a.h"

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

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

1 个答案:

答案 0 :(得分:1)

不,CMake没有这样的设施。

管理标头的标准方法是在文件系统中组织它们,使它们不会与其他代码冲突。

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)

为标题,安装源包含目录和

下的所有内容
install(TARGETS liba
  RUNTIME DESTINATION bin
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib)

表示实际的库目标(“libliba.a”或“libliba.so”)。更好的是使用include(GNUInstallDirs)中的变量来表示GNU标准文件夹名称。

在您的代码中,您始终只需使用通常的无冲突方法来引用代码:

#include "liba/a.h"

所以,除非你真的很难命名,否则不应该对文件或代码产生任何冲突!