2012-02-13 225 views
3

簡短問題: 在安裝過程中複製文件時,是否可以設置CMake遵循符號鏈接?如果是這樣做?CMake在安裝過程中遵循符號鏈接

詳細信息:我使用CMake來構建和安裝LLVM。在包含目錄中的LLVM源代碼樹中,我有一個符合LLVM開發的另一個子項目的符號鏈接。一切似乎都起作用,除了我注意到當我運行「cmake install」時,它複製了include目錄而沒有遵循符號鏈接。我遇到的問題是我的符號鏈接有一個相對路徑(因爲它在一個git倉庫中)。因此,當符號鏈接被複制(而不是跟隨並複製內容)時,它們不再指向正確的文件。例如我有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 . 
) 

爲包括目錄列出目錄是:

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

我想要的是dsapoolalloc目錄被複制而不僅僅是複製符號鏈接。我不在符號鏈接中使用絕對路徑的原因是我將它們簽入了git回購。所以,當他們從回購中結賬時,我的絕對路徑會與從事項目工作的其他人不同。

+0

你能顯示代碼,哪些安裝這些包括?另外,你可以使符號鏈接絕對。 – arrowd 2012-02-14 07:57:18

+0

@arrowdodger,謝謝你看我的問題。我編輯它提供更多的細節,但讓我知道如果它仍然不清楚。我一直在尋找'install'的CMake文檔,我開始認爲我想做的事情是不可能的,所以我可能不得不想出另一個解決方案。但是我可能錯了,因爲有很多我不瞭解CMake。 – 2012-02-14 21:40:14

回答

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 
) 

如果它不會幫助,你可以嘗試安裝不包括目錄本身(這是符號鏈接),但它的內容。但是,在你的情況,你將需要與智能正則表達式來了:

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

install(FILES ${INCLUDES} 
    DESTINATION include 
) 

最後,使符號鏈接是絕對的。

+1

它看起來像使用安裝命令的符號鏈接是不可能的。但是,這個答案有助於我弄清楚如何重構CMakeLists.txt並添加更多指向我想要複製的其他目錄的安裝語句。 – 2012-02-16 19:45:30