1.cmake_minimum_required(VERSION 3.4.1) # 指定最低支持版本
2.aux_source_directory(. DIR_SRCS)
查找(第一個參數(shù).)當(dāng)前目錄所有源文件,并將源文件名稱列表保存到(第二個參數(shù))DIR_SRCS變量
不能查找字目錄
3.add_library
添加一個庫名為<name>
指定STATIC,SHAREN,MODULE參數(shù)來指定庫的類型。STATIC:靜態(tài)庫;SHARED:動態(tài)庫,MOULE:在使用dyld的系統(tǒng)有效,若不支持dyld,等同于SHARED。
EXCLUDE_FROM_ALL:標(biāo)識該庫不會被默認(rèn)構(gòu)建。
source1 source2…… sourceN:用來指定庫的源文件
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL] source1 source2 ……sourceN}
導(dǎo)入預(yù)編譯庫
添加一個已存在的預(yù)編譯庫,名為<name>。
一般配合set_target_properties使用
add_library(test SHARED IMPORTED)
set_target_properties(
test #指名目標(biāo)庫名
PROPERTIES IMPORTED_LOCATION #指明要設(shè)置的參 數(shù)庫路徑/${ANDROID_API}/libtest.so #導(dǎo)入庫的路徑
)
4.設(shè)置CMake變量
#設(shè)置可執(zhí)行文件的輸出路徑(EXCUTABLE_OUTPUT_PATH是全局變量)
set(EXECUTABLE_OUTPUT_PATH[output_path])
#設(shè)置庫文件的輸出路徑(LIBRARY_OUTPUT_PTAH 是全局變量)
set(LIBRARY_OUTPUT_PTAH [output_path])
#設(shè)置C++編譯參數(shù)(CMAKE_CXX_FLAGSs是全局變量)
set(CMAKE_CXX_FLAGS "-Wall std=c++11")
#設(shè)置源文件集合(SOURCE_FILES是本地變量即自定義變量)
set(SOURCE_FILES main.cpp test.cpp ...)
5.設(shè)置頭文件目錄,相當(dāng)于g++選項中的-i參數(shù)
#可以用相對或絕對路徑,也可以用自定義的變量值
include_directories(./include ${MY_INCLUDE})
6.添加可執(zhí)行文件
add_executable(<name> ${SRC_LIST})
7.將若干個庫連接到目標(biāo)庫文件。連接的順序應(yīng)當(dāng)符合gcc鏈接順序的規(guī)則,被鏈接的庫放在依賴他的庫的后面,即如果上面的命令,lib1依賴于lib2,lib2又依賴于lib3,則在下面命令中必須嚴(yán)格按照lib1 lib2 lib3 的順序排列,否則會報錯
target_link_libraries(<name> lib1 lib2 lib3)
#如果出現(xiàn)互相依賴的靜態(tài)庫,CMake會允許依賴途中的包含循環(huán)依賴,如:
add_library(A STATIC a.c)
add_library(B STATIC b.c)
target_link_libraries(A B)
target_link_libraries(B A)
add_executable(main main.c)
target_link_libraries(main A)
8.為當(dāng)前路徑以及子目錄的源文件加入由-D引入的define flag
add_definitions(-DFOO -DDEBUG ...)
9.如果當(dāng)前目錄下還有子目錄時可以使用add_subdirectory,子目錄中也需要包含有CMakeLists.text
#sub_dir指定包含CMakeLists.txt和源碼文件的子目錄位置
#binary_dir是輸入路徑,一般可以不指定
add_subdirecroty(sub_dir [binary_dir])
10.文件操作命令
#將message 寫入filename文件中,會覆蓋文件原有內(nèi)容
file(WRITE filename "message")
#將message寫入filename文件中,會追加在文件末尾
file(APPEND filename "message")
#從filename文件中讀取內(nèi)容并存儲到var 變量中,如果指定了numBytes 和offset
#則從offset處開始最多讀numBytes個字節(jié),另外如果指定了HEX 參數(shù),則內(nèi)容會議十六進(jìn)制形式存儲在var變量中
file(READ filename var [LIMIT numBytes] [OFFSET offset] [HEX])
#重命名文件
file(RENAME <oldname> <newname>)
#刪除文件,等于rm
file(REMOVE [file1 ...])
#遞歸的執(zhí)行刪除文件命令,等于 rm -r
file(REMOVE_RECURSE [file1 ...])
#根據(jù)指定的url下載文件
#timeout 超時時間;下載的狀態(tài)會保留在status中;下載日志會被保存到log;sum指定所下載文件逾期的MD5值,如果指定會自動進(jìn)行比對,
#如果不一致,則返回一個錯誤;SHOW_PROGRESS,進(jìn)度信息會議狀態(tài)信息的形式被打印出來
file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log] [EXPECTED_MD5 sun] [SHOW_PROGRESS])
#創(chuàng)建目錄
file(MAKE_DIRECTORY [dir1 dir2 ...])
#會把path轉(zhuǎn)換為以unix的/開頭的cmake風(fēng)格路徑,保存在result中
file(TO_CMAKE_PATH path result)
#它會把cmake風(fēng)格的路徑轉(zhuǎn)換為本地路徑風(fēng)格:windows下用"\",而unix下用"/"
file(TO_NATIVE_PATH path result)
#將會為所有匹配查詢表達(dá)式的文件生成一個文件list,并將該list存儲進(jìn)變量variable里,如果一個表達(dá)式指定了RELATIVE,返回的結(jié)果將會相對于給定路徑的相對路徑,查詢表達(dá)式例子:*.cxx,*.vt?
#NOTE:按照官方文檔的說法,不建議使用file的GLOB指令來手機(jī)工程的源文件
file(GLOB variable [RELATIVE path] [globbing expressions]...)
11.設(shè)置某個路徑的一種屬性
prop1,prop2代表屬性,取值為:INCLUDE_DIRECTORIES LINK_DIRECTORIES INCLUDE_REGULAR_EXPRESSION ADDITIONAL_MAKE_CLEAN_FILES
set_directory_properties(PROPERTIES prop1 value1 prop2 value2)
12.在給定的作用域內(nèi)設(shè)置一個命名的屬性,PROPERTY參數(shù)是必須的,第一個參數(shù)決定了屬性可以影響的作用域:
GLOBAL: 全局作用域
DIRECTORY:默認(rèn)當(dāng)前路徑,也可以用[dir]指定路徑
TARGET:目標(biāo)作用域,可以是0個活多個已有目標(biāo)
SOURCE:源文件作用域,可以是0個活多個源文件
TEST:測試作用域,可以是0個或多個已有的測試
CACHE:必須指定0個或多個cache中已有的條目
set_property(<GLOBAL |DIRECTORY [dir] | TARGET [traget ...] | SOURCE [src1 ...] | TEST [test1 ...] | CACHE [entry1 ...]> [APPEND] PROPERTY<name> [value ...])