2013-06-12 74 views
0

我正在寻找一种方法来告诉CMake使include目录以编译器的另一个名称出现。映射包含到不同目录的路径

假设我有一个需要来自外国图书馆的代码的项目。这段代码驻留在我的项目根目录下的一个目录foreignLib-1.5.0_build123456中。我会不时更新这个库,并在这个过程中更改库目录名称。

我想在我的C++源文件中将此目录作为foreignLib引用。我希望能写

#include "foreignLib/include/lib.h" 

和CMake的应该告诉我的编译器至本翻译成

#include "foreignLib-1.5.0_build123456/include/lib.h" 

现在我想知道:

  • 难道一个功能像这样存在的CMake ?
  • 如果是,我该如何使用它?
  • 如果是,支持哪些编译器?
+3

如果您使用的是类Unix操作系统,那么您应该认真考虑使用符号链接(在文件系统中)执行此操作。 – arne

+0

这个项目旨在跨平台,因此使用操作系统相关功能不是一种选择。此外,这是使用git作为版本控制,它似乎不像git可以存储符号链接:http://stackoverflow.com/questions/954560/what-does-git-do-to-files-that-are-一个符号链接 – Chris

+0

自Windows Vista以来,NTFS具有符号链接。 –

回答

1

你可以看看的CMake的configure_file:你的源文件重命名为yourfile.cpp.in并做

#include ${DIR_TO_LIB}/include/xy.h 

在你CMakeLists,你设置变量DIR_TO_LIB某种方式(通过解析命令行或某事)及发行

configure_file(yourfile.cpp.in, yourfile.cpp) 

这将产生具有正确路径集的yourfile.cpp

这可能不是你想要的,但我认为它会起作用。

0

作为构建过程的一部分,在真正包含路径的众所周知的位置(稍后称为“boilerplate/foreignLib_lib.h”)生成一个包含文件。

您的代码文件:

#include "boilerplate/foreignLib_lib.h" 

样板/ foreignLib_lib.h:

#include "foreignLib-1.5.0_build123456/include/lib.h" 
+0

尽管这首先出现在我的脑海里,但我的其他答案却更加优雅。 –

0

使用的CMake的include_directories陈述或添加-I切换到*_CXX_FLAGS到当前foreignLib路径添加到您的包含路径。

+0

这实际上正是我想到的,只是我仍然想要一个包含文件的目录。如果我将'foreignLib-1.5.0_build123456 /'添加到我的包含路径中,我将使用'#include“include/lib.h”'引用这些文件,但我不想那么做。外部lib包含文件不应该隐藏来自其他外部库或我的项目的其他文件。 – Chris

+0

然后,你应该添加另一个目录级别:'foreignLib-1.5.0_build123456/foreignLib/include/lib.h' –

+0

是的,但是想法是保持'foreignLib-1.5.0_build123456'的名字来解压外部库的压缩包所以我可以在下次更换它。如果在解压缩后还需要采取额外的步骤,那么我可能完全改变目录名称,但这不是我想要做的。 – Chris

2

我可能只是将整个包含目录复制到我的构建树中并使其可用。

一个体面的做法是使用file(GLOB_RECURSE ...)收集includes文件夹中的文件列表,然后使用configure_file(<input> <output> COPYONLY)将它们复制到构建树中。

通过使用configure_file,构建树中的文件仅根据需要进行替换。这意味着重新运行CMake不会自动将这些文件显示为构建工具的过时版本,从而避免不必要的重新编译。

set(ForeignLibName foreignLib-1.5.0_build123456) 
set(ForeignLibRoot ${CMAKE_SOURCE_DIR}/${ForeignLibName}) 
file(GLOB_RECURSE IncludeFiles RELATIVE ${ForeignLibRoot} ${ForeignLibRoot}/*) 
foreach(IncludeFile ${IncludeFiles}) 
    configure_file(${ForeignLibRoot}/${IncludeFile} 
       ${CMAKE_BINARY_DIR}/${ForeignLibName}/foreignLib/${IncludeFile} 
       COPYONLY) 
endforeach() 

include_directories(${CMAKE_BINARY_DIR}/${ForeignLibName}) 

这应该允许你这样做:

#include "foreignLib/include/lib.h" 

当您更新外国库,你必须确保你也更新了的CMakeLists.txt,这样的CMake重新运行下一个当你去建立。更新CMakeLists.txt应该只涉及改变单行set(ForeignLibName ...)

+0

+1我真的很喜欢这个解决方案。 – drescherjm

相关问题