2009年2月11日 星期三

CMake - 指令說明

指令:
PROJECT(projectname [CXX] [C] [Java])
設定這一個project的名稱,並且設定此project使用的語言
例:
此project名稱為HELLO
PROJECT (HELLO)

SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
設定變數VAR的內容值
例:
設定${SRC_LIST}變數內容為main.c t1.c t2.c
SET(SRC_LIST main.c t1.c t2.c)

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"
...)
這個指令用於向終端輸出用戶定義的訊息,包含三種類型:
SEND_ERROR:產生錯誤,生成過程被跳過
SATUS:輸出等級為1的訊息
FATAL_ERROR:立即終止所有cmake過程

例:輸出PROJECT_SOURCE_DIR
MESSAGE(STATUS "This is SOURCE dir "${PROJECT_SOURCE_DIR})

ADD_EXECUTABLE(exename [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
exename是指要產生出來的可執行檔,而[WIN32] [MACOSX_BUNDLE]分別在windows與mac才需要設定的,這裡不用理它。[EXCLUDE_FROM_ALL]是先把此目錄編譯排除在外,例如"examples資料夾",而source則是編譯出執行檔exename所需要的原始碼)
ADD_EXECUTABLE(hello main.c func.c)

ADD_EXECUTABLE(hello ${SRC_LIST})

ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
這一個指令可以加入目前工程的子目錄,並且可以指定object與target存放的位置,而[EXCLUDE_FROM_ALL]是把此目錄在編譯過程排除在外。例如工程的examples目錄。可能是project完成後,再進入examples目錄單獨編譯
把src目錄加入工程,並且指定編譯輸出路徑為bin
ADD_SUBDIRECTORY(src bin)

INSTALL(TARGETS targets...
[[ARCHIVE|LIBRARY|RUNTIME] [DESTINATION <dir>] [PERMISSIONS permissions...]
[CONFIGURATIONS
[Debug|Release|...]]
[COMPONENT <component>]
[OPTIONAL]
] [...])
INSTALL指令用於定義安裝規則,安裝的內容可以包括執行檔、shared library、static library、文件、目錄、腳本
可執行檔myrun安裝到${CMAKE_INSTALL_PREFIX}/bin目錄
shared library:libmylib安裝到${CMAKE_INSTALL_PREFIX}/lib目錄
static library:libmystaticlib安裝到${CMAKE_INSTALL_PREFIX}/libstatic目錄

INSTALL(TARGETS myrun mylib mystaticlib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION libstatic
)


普通文件的安裝:
INSTALL(FILES files... DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[RENAME <name>] [OPTIONAL])
如果若不設定權限PERMISSIONS,安裝後的權限為644權限。

非目標的可執行檔(例如腳本之類的)
INSTALL(PROGRAMS files... DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[RENAME <name>] [OPTIONAL])

跟上面的FILES指令使用方法一樣,唯一的不同是安裝後權限為755

目錄的安裝:
INSTALL(DIRECTORY dirs... DESTINATION <dir>
[FILE_PERMISSIONS permissions...]
[DIRECTORY_PERMISSIONS permissions...]
[USE_SOURCE_PERMISSIONS]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[[PATTERN <pattern> | REGEX <regex>]
[EXCLUDE] [PERMISSIONS permissions...]] [...])

DIRECTORY後面連接的是所在Source目錄的相對路徑,但務必注意:
abc和abc/有很大的區别。
如果目錄名不以/结尾,那麼這個目錄将被安裝為目標路徑下的abc,如果目錄名以/结尾,
代表将這個目錄中的内容安装到目標路徑,但不包括這個目錄本身。
PATTERN用於使用正規表示式進行過濾,PERMISSIONS用於指定PATTERN過濾後的文件

將icons目錄安裝到 /share/myproj,将scripts/中的内容安装到
/share/myproj
不包含目錄名為CVS的目录,對於scripts/*文件指定權限為 OWNER_EXECUTE
OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ.
INSTALL(DIRECTORY icons scripts/ DESTINATION share/myproj
PATTERN "CVS" EXCLUDE
PATTERN "scripts/*"
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
GROUP_EXECUTE GROUP_READ)


$ cmake -DCMAKE_INSTALL_PREFIX=/usr ..
則會把安裝目錄設定在/usr下,但是,若沒有設定的話預設是/usr/local的目錄下

ADD_LIBRARY(libname [SHARED|STATIC|MODULE]
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)

SHARED,動態函式庫
STATIC,靜態函式庫
MODULE,在使用dyld的系统有效,如果不支持dyld,则被當作SHARED對待。
EXCLUDE_FROM_ALL參數的意思是這個函式庫不會被默認建構,除非有其他的组件依賴或是手工建構。



變數:
PROJECT_BINARY_DIR
表示執行cmake的路徑
PROJECT_SOURCE_DIR
表示source的路徑,也就是主要的CMakeList.txt的位置
EXECUTABLE_OUTPUT_PATH
指定最終可執行檔存放的位置
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
LIBRARY_OUTPUT_PATH
設定最終產生的shared library存放的位置
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

Makefile產生後,make所使用的參數:
DCMAKE_INSTALL_PREFIX
設定執行檔安裝的路徑
cmake -DCMAKE_INSTALL_PREFIX=/usr .

沒有留言: