CMake在安装过程中遵循符号链接

时间:2012-02-13 23:37:05

标签: cmake llvm

简短问题: 在安装过程中复制文件时是否可以将CMake设置为遵循符号链接?如果是,如何完成?

详细信息:我正在使用CMake构建和安装LLVM。在include目录中的LLVM源代码树中,我有一个指向另一个针对LLVM开发的子项目的符号链接。一切似乎都有效,除了我注意到当我运行“cmake install”时它复制了include目录而没有遵循符号链接。我遇到的问题是我的符号链接有一个相对路径(因为它在git repo中)。因此,当复制符号链接(而不是遵循并复制内容)时,它们不再指向正确的文件。例如,我有dsa -> ../../llvm-poolalloc/include/dsa/我想在安装时复制此链接的内容而不是仅复制链接。但是我还没有找到这样做的cmake标志。

我意识到这可能不是构建我的项目的想法,但我正在使用已经存在的东西,并且最好不要改变太多的目录结构,因为我工作的其他人期待它是这样的。所以我认为能够遵循符号链接可以解决我的问题,而无需重构整个构建系统。但我愿意接受其他建议,以便更好地完成我想要做的事情。

请注意,我在Linux(Ubuntu 10.04)中工作并使用LLVM 2.6(我从源代码和llvm-gcc一起编译)。我也在使用CMake 2.8版。

修改

以下是与安装说明相关联的CMakeLists.txt文件的源代码:

install(DIRECTORY include
  DESTINATION .
  PATTERN ".svn" EXCLUDE
  PATTERN "*.cmake" EXCLUDE
  PATTERN "*.in" EXCLUDE
  PATTERN "*.tmp" EXCLUDE
  )

install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include
  DESTINATION .
  )

include目录的目录列表是:

dsa -> ../../llvm-poolalloc/include/dsa/
llvm
llvm-c
poolalloc -> ../../llvm-poolalloc/include/poolalloc

我想要的是复制dsapoolalloc目录,而不仅仅是复制符号链接。我不在符号链接中使用绝对路径的原因是我将它们签入git仓库。因此,当他们从回购交易结账时,我的绝对路径与其他从事该项目的人不同。

1 个答案:

答案 0 :(得分:4)

嗯,让我们试试这个:

get_filename_component(ABS_DIR include REALPATH)

install(DIRECTORY ${ABS_DIR}
  DESTINATION .
  PATTERN ".svn" EXCLUDE
  PATTERN "*.cmake" EXCLUDE
  PATTERN "*.in" EXCLUDE
  PATTERN "*.tmp" EXCLUDE
  )

如果它没有用,你可以尝试不安装include dir本身(这是符号链接),但它的内容。但在你的情况下,你需要提出智能正则表达式:

file(GLOB INCLUDES include/*) # filter there .svn and others

install(FILES ${INCLUDES}
  DESTINATION include
)

最后,使符号链接绝对。