简短问题: 在安装过程中复制文件时是否可以将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
我想要的是复制dsa
和poolalloc
目录,而不仅仅是复制符号链接。我不在符号链接中使用绝对路径的原因是我将它们签入git仓库。因此,当他们从回购交易结账时,我的绝对路径与其他从事该项目的人不同。
答案 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
)
最后,使符号链接绝对。