2011-04-12 43 views
2

我是cmake的新手,我發現它非常令人沮喪。我試圖在構建運行時評估的文件路徑中使用通配符,而不是構建生成時使用通配符。cmake中的編譯時通配符安裝目標

我創建了一個使用SWIG爲某些C++代碼生成Java包裝的構建。我可以編寫命令來生成本地代碼,編譯它並生成工作共享庫,甚至可以使用INSTALL命令正確安裝該共享庫。我想不出如何做的是編寫一個INSTALL命令,它可以將SWIG生成的所有* .java文件複製到同一個安裝位置。

似乎cmake的FILE GLOB命令在執行cmake時執行globbing,而不是在構建實際運行時執行。當然,執行cmake時,SWIG尚未運行,並且Java文件不存在。

有沒有辦法做我想要的?我是否在做錯事情?看起來這是Makefiles需要做的基本部分,我很驚訝沒有找到一個簡單的方法來做到這一點。

回答

11

假設Java包裝都位於當前的二進制目錄,你可以使用下面的install命令後的Java文件複製安裝:

install(
    CODE "file(GLOB _GeneratedJavaSources \"${CMAKE_CURRENT_BINARY_DIR}/*.java\")" 
    CODE "file(INSTALL \${_GeneratedJavaSources} DESTINATION \"$ENV{HOME}\")" 
) 

install命令的CODE形式用於在運行安裝目標時執行兩個CMake命令。第一個收集所有生成的Java文件在輔助變量中。第二個使用file命令的INSTALL形式來複制文件。

+0

這有效!非常感謝! – 2011-04-13 13:27:01

+1

**感謝**這真的工程.. – user1036908 2014-07-24 12:54:33

+0

我已經使用這個麻煩:如果可執行權限沒有複製過來。以這種方式安裝程序會使程序無法運行。任何方式來安裝,同時保留權限? – Gauthier 2015-06-26 11:57:22

1

您可以使用安裝(SCRIPT swigInstaller.cmake)或安裝(DIRECTORY)這兩個在安裝時支持做文件globing。你可以閱讀更多關於安裝命令:

http://cmake.org/cmake/help/cmake-2-8-docs.html#command:install

+3

男孩,這是如此接近。 「腳本」似乎沒有幫助,因爲顯然,INSTALL不能包含在這樣的腳本中;但是INSTALL(DIRECTORY)非常接近。唯一的問題是它堅持從源目錄拷貝所有的目錄樹,儘管它們都是空的。任何修剪它們的方法,或者使INSTALL(DIRECTORY)只考慮直接在源目錄中的文件? – 2011-04-12 20:53:27