2017-08-03 55 views
1

BUCK构建工具允许我为库定义头部命名空间。举例来说,如果我有一个名为力霸库,该目录结构:是否有一个等同于BUCK的header_namespace的cmake?

root 
    include 
     a.h 
    src 
     a.cpp 

我可以在图书馆的,比方说,examples/liba设置header_namespace,使得在使用力霸我可以在一个单独的项目:

#include "examples/liba/a.h" 

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

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

回答

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>") 

这只是说让在包含路径上可用于使用的任何人当前源目录中子目录include的内容和任何安装libainclude子目录(相对于安装前缀解释)的内容的任何人。

然后安装通常是这样的:

install(DIRECTORY include/ 
    DESTINATION include) 

的头,源下安装的一切包括实际库目标(“libliba.a”或“目录和

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

libliba.so“)。更好的办法是将include(GNUInstallDirs)的变量用于GNU标准文件夹名称。

在你的代码,在任何时候,你只是指代码在平时无冲突的方法:

#include "liba/a.h" 

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

+0

够公平的,谢谢你提供的所有信息!我肯定会相应地更新我的策略。 – Craig

相关问题