CMake入門實戰(轉載)

什麼是 CMake

All problems in computer science can be solved by another level of indirection.php

David Wheeler

你或許聽過好幾種 Make 工具,例如 GNU Make ,QT 的 qmake ,微軟的 MS nmake,BSD Make(pmake),Makepp,等等。這些 Make 工具遵循着不一樣的規範和標準,所執行的 Makefile 格式也千差萬別。這樣就帶來了一個嚴峻的問題:若是軟件想跨平臺,必需要保證可以在不一樣平臺編譯。而若是使用上面的 Make 工具,就得爲每一種標準寫一次 Makefile ,這將是一件讓人抓狂的工做。html

CMake CMake附圖 1 CMake就是針對上面問題所設計的工具:它首先容許開發者編寫一種平臺無關的 CMakeList.txt 文件來定製整個編譯流程,而後再根據目標用戶的平臺進一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。從而作到「Write once, run everywhere」。顯然,CMake 是一個比上述幾種 make 更高級的編譯配置工具。一些使用 CMake 做爲項目架構系統的知名開源項目有 VTKITKKDEOpenCVOSG[1]linux

在 linux 平臺下使用 CMake 生成 Makefile 並編譯的流程以下:c++

  1. 編寫 CMake 配置文件 CMakeLists.txt 。
  2. 執行命令 cmake PATH 或者 ccmake PATH 生成 Makefile 1 1ccmakecmake 的區別在於前者提供了一個交互式的界面。 。其中, PATH 是 CMakeLists.txt 所在的目錄。
  3. 使用 make 命令進行編譯。

本文將從實例入手,一步步講解 CMake 的常見用法,文中全部的實例代碼能夠在這裏找到。若是你讀完仍以爲意猶未盡,能夠繼續學習我在文章末尾提供的其餘資源。git

入門案例:單個源文件

本節對應的源代碼所在目錄:Demo1github

對於簡單的項目,只須要寫幾行代碼就能夠了。例如,假設如今咱們的項目中只有一個源文件 main.cc ,該程序的用途是計算一個數的指數冪。web

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <stdlib.h>
/**
* power - Calculate the power of number.
* @param base: Base value.
* @param exponent: Exponent value.
*
* @return base raised to the power exponent.
*/
double power(double base, int exponent)
{
int result = base;
int i;
 
if (exponent == 0) {
return 1;
}
 
for(i = 1; i < exponent; ++i){
result = result * base;
}
return result;
}
int main(int argc, char *argv[])
{
if (argc < 3){
printf("Usage: %s base exponent \n", argv[0]);
return 1;
}
double base = atof(argv[1]);
int exponent = atoi(argv[2]);
double result = power(base, exponent);
printf("%g ^ %d is %g\n", base, exponent, result);
return 0;
}

編寫 CMakeLists.txt

首先編寫 CMakeLists.txt 文件,並保存在與 main.cc 源文件同個目錄下:數組

1
2
3
4
5
6
7
8
# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)
# 項目信息
project (Demo1)
# 指定生成目標
add_executable(Demo main.cc)

CMakeLists.txt 的語法比較簡單,由命令、註釋和空格組成,其中命令是不區分大小寫的。符號 # 後面的內容被認爲是註釋。命令由命令名稱、小括號和參數組成,參數之間使用空格進行間隔。架構

對於上面的 CMakeLists.txt 文件,依次出現了幾個命令:ide

  1. cmake_minimum_required:指定運行此配置文件所需的 CMake 的最低版本;
  2. project:參數值是 Demo1,該命令表示項目的名稱是 Demo1
  3. add_executable: 將名爲 main.cc 的源文件編譯成一個名稱爲 Demo 的可執行文件。

編譯項目

以後,在當前目錄執行 cmake . ,獲得 Makefile 後再使用 make 命令編譯獲得 Demo1 可執行文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[ehome@xman Demo1]$ cmake .
-- The C compiler identification is GNU 4.8.2
-- The CXX compiler identification is GNU 4.8.2
-- Check for working C compiler: /usr/sbin/cc
-- Check for working C compiler: /usr/sbin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/sbin/c++
-- Check for working CXX compiler: /usr/sbin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ehome/Documents/programming/C/power/Demo1
[ehome@xman Demo1]$ make
Scanning dependencies of target Demo
[ 100%] Building C object CMakeFiles/Demo.dir/main.cc.o
Linking C executable Demo
[ 100%] Built target Demo
[ehome@xman Demo1]$ ./Demo 5 4
5 ^ 4 is 625
[ehome@xman Demo1]$ ./Demo 7 3
7 ^ 3 is 343
[ehome@xman Demo1]$ ./Demo 2 10
2 ^ 10 is 1024

多個源文件

同一目錄,多個源文件

本小節對應的源代碼所在目錄:Demo2

上面的例子只有單個源文件。如今假如把 power 函數單獨寫進一個名爲 MathFunctions.c 的源文件裏,使得這個工程變成以下的形式:

1
2
3
4
5
6
7
./Demo2
|
+--- main.cc
|
+--- MathFunctions.cc
|
+--- MathFunctions.h

這個時候,CMakeLists.txt 能夠改爲以下的形式:

1
2
3
4
5
6
7
8
# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)
# 項目信息
project (Demo2)
# 指定生成目標
add_executable(Demo main.cc MathFunctions.cc)

惟一的改動只是在 add_executable 命令中增長了一個 MathFunctions.cc 源文件。這樣寫固然沒什麼問題,可是若是源文件不少,把全部源文件的名字都加進去將是一件煩人的工做。更省事的方法是使用 aux_source_directory 命令,該命令會查找指定目錄下的全部源文件,而後將結果存進指定變量名。其語法以下:

1
aux_source_directory(<dir> <variable>)

所以,能夠修改 CMakeLists.txt 以下:

1
2
3
4
5
6
7
8
9
10
11
12
# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)
# 項目信息
project (Demo2)
# 查找當前目錄下的全部源文件
# 並將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)
# 指定生成目標
add_executable(Demo ${DIR_SRCS})

這樣,CMake 會將當前目錄全部源文件的文件名賦值給變量 DIR_SRCS ,再指示變量 DIR_SRCS 中的源文件須要編譯成一個名稱爲 Demo 的可執行文件。

多個目錄,多個源文件

本小節對應的源代碼所在目錄:Demo3

如今進一步將 MathFunctions.h 和 MathFunctions.cc 文件移動到 math 目錄下。

1
2
3
4
5
6
7
8
9
./Demo3
|
+--- main.cc
|
+--- math/
|
+--- MathFunctions.cc
|
+--- MathFunctions.h

對於這種狀況,須要分別在項目根目錄 Demo3 和 math 目錄裏各編寫一個 CMakeLists.txt 文件。爲了方便,咱們能夠先將 math 目錄裏的文件編譯成靜態庫再由 main 函數調用。

根目錄中的 CMakeLists.txt :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)
# 項目信息
project (Demo3)
# 查找當前目錄下的全部源文件
# 並將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)
# 添加 math 子目錄
add_subdirectory(math)
# 指定生成目標
add_executable(Demo main.cc)
# 添加連接庫
target_link_libraries(Demo MathFunctions)

該文件添加了下面的內容: 第3行,使用命令 add_subdirectory 指明本項目包含一個子目錄 math,這樣 math 目錄下的 CMakeLists.txt 文件和源代碼也會被處理 。第6行,使用命令 target_link_libraries 指明可執行文件 main 須要鏈接一個名爲 MathFunctions 的連接庫 。

子目錄中的 CMakeLists.txt:

1
2
3
4
5
6
# 查找當前目錄下的全部源文件
# 並將名稱保存到 DIR_LIB_SRCS 變量
aux_source_directory(. DIR_LIB_SRCS)
# 生成連接庫
add_library (MathFunctions ${DIR_LIB_SRCS})

在該文件中使用命令 add_library 將 src 目錄中的源文件編譯爲靜態連接庫。

自定義編譯選項

本節對應的源代碼所在目錄:Demo4

CMake 容許爲項目增長編譯選項,從而能夠根據用戶的環境和需求選擇最合適的編譯方案。

例如,能夠將 MathFunctions 庫設爲一個可選的庫,若是該選項爲 ON ,就使用該庫定義的數學函數來進行運算。不然就調用標準庫中的數學函數庫。

修改 CMakeLists 文件

咱們要作的第一步是在頂層的 CMakeLists.txt 文件中添加該選項:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)
# 項目信息
project (Demo4)
# 加入一個配置頭文件,用於處理 CMake 對源碼的設置
configure_file (
"${PROJECT_SOURCE_DIR}/config.h.in"
"${PROJECT_BINARY_DIR}/config.h"
)
# 是否使用本身的 MathFunctions 庫
option (USE_MYMATH
"Use provided math implementation" ON)
# 是否加入 MathFunctions 庫
if (USE_MYMATH)
include_directories ("${PROJECT_SOURCE_DIR}/math")
add_subdirectory (math)
set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)
# 查找當前目錄下的全部源文件
# 並將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)
# 指定生成目標
add_executable(Demo ${DIR_SRCS})
target_link_libraries (Demo ${EXTRA_LIBS})

其中:

  1. 第7行的 configure_file 命令用於加入一個配置頭文件 config.h ,這個文件由 CMake 從 config.h.in 生成,經過這樣的機制,將能夠經過預約義一些參數和變量來控制代碼的生成。
  2. 第13行的 option 命令添加了一個 USE_MYMATH 選項,而且默認值爲 ON
  3. 第17行根據 USE_MYMATH 變量的值來決定是否使用咱們本身編寫的 MathFunctions 庫。

修改 main.cc 文件

以後修改 main.cc 文件,讓其根據 USE_MYMATH 的預約義值來決定是否調用標準庫仍是 MathFunctions 庫:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include
#include
#include "config.h"
#ifdef USE_MYMATH
#include "math/MathFunctions.h"
#else
#include
#endif
int main(int argc, char *argv[])
{
if (argc < 3){
printf("Usage: %s base exponent \n", argv[0]);
return 1;
}
double base = atof(argv[1]);
int exponent = atoi(argv[2]);
 
#ifdef USE_MYMATH
printf("Now we use our own Math library. \n");
double result = power(base, exponent);
#else
printf("Now we use the standard library. \n");
double result = pow(base, exponent);
#endif
printf("%g ^ %d is %g\n", base, exponent, result);
return 0;
}

編寫 config.h.in 文件

上面的程序值得注意的是第2行,這裏引用了一個 config.h 文件,這個文件預約義了 USE_MYMATH 的值。但咱們並不直接編寫這個文件,爲了方便從 CMakeLists.txt 中導入配置,咱們編寫一個 config.h.in 文件,內容以下:

1
#cmakedefine USE_MYMATH

這樣 CMake 會自動根據 CMakeLists 配置文件中的設置自動生成 config.h 文件。

編譯項目

如今編譯一下這個項目,爲了便於交互式的選擇該變量的值,可使用 ccmake 命令 2 2也可使用 cmake -i 命令,該命令會提供一個會話式的交互式配置界面。 :

CMake的交互式配置界面

從中能夠找到剛剛定義的 USE_MYMATH 選項,按鍵盤的方向鍵能夠在不一樣的選項窗口間跳轉,按下 enter 鍵能夠修改該選項。修改完成後能夠按下 c 選項完成配置,以後再按 g 鍵確認生成 Makefile 。ccmake 的其餘操做能夠參考窗口下方給出的指令提示。

咱們能夠試試分別將 USE_MYMATH 設爲 ONOFF 獲得的結果:

USE_MYMATH 爲 ON

運行結果:

1
2
3
4
5
[ehome@xman Demo4]$ ./Demo
Now we use our own MathFunctions library.
7 ^ 3 = 343.000000
10 ^ 5 = 100000.000000
2 ^ 10 = 1024.000000

此時 config.h 的內容爲:

1
#define USE_MYMATH
USE_MYMATH 爲 OFF

運行結果:

1
2
3
4
5
[ehome@xman Demo4]$ ./Demo
Now we use the standard library.
7 ^ 3 = 343.000000
10 ^ 5 = 100000.000000
2 ^ 10 = 1024.000000

此時 config.h 的內容爲:

1
/* #undef USE_MYMATH */

安裝和測試

本節對應的源代碼所在目錄:Demo5

CMake 也能夠指定安裝規則,以及添加測試。這兩個功能分別能夠經過在產生 Makefile 後使用 make installmake test 來執行。在之前的 GNU Makefile 裏,你可能須要爲此編寫 installtest 兩個僞目標和相應的規則,但在 CMake 裏,這樣的工做一樣只須要簡單的調用幾條命令。

定製安裝規則

首先先在 math/CMakeLists.txt 文件裏添加下面兩行:

1
2
3
# 指定 MathFunctions 庫的安裝路徑
install (TARGETS MathFunctions DESTINATION bin)
install (FILES MathFunctions.h DESTINATION include)

指明 MathFunctions 庫的安裝路徑。以後一樣修改根目錄的 CMakeLists 文件,在末尾添加下面幾行:

1
2
3
4
# 指定安裝路徑
install (TARGETS Demo DESTINATION bin)
install (FILES "${PROJECT_BINARY_DIR}/config.h"
DESTINATION include)

經過上面的定製,生成的 Demo 文件和 MathFunctions 函數庫 libMathFunctions.o 文件將會被複制到 /usr/local/bin 中,而 MathFunctions.h 和生成的 config.h 文件則會被複制到 /usr/local/include 中。咱們能夠驗證一下3 3順帶一提的是,這裏的 /usr/local/ 是默認安裝到的根目錄,能夠經過修改 CMAKE_INSTALL_PREFIX 變量的值來指定這些文件應該拷貝到哪一個根目錄。:

1
2
3
4
5
6
7
8
9
10
11
12
13
[ehome@xman Demo5]$ sudo make install
[ 50%] Built target MathFunctions
[ 100%] Built target Demo
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/bin/Demo
-- Installing: /usr/local/include/config.h
-- Installing: /usr/local/bin/libMathFunctions.a
-- Up-to-date: /usr/local/include/MathFunctions.h
[ehome@xman Demo5]$ ls /usr/local/bin
Demo libMathFunctions.a
[ehome@xman Demo5]$ ls /usr/local/include
config.h MathFunctions.h

爲工程添加測試

添加測試一樣很簡單。CMake 提供了一個稱爲 CTest 的測試工具。咱們要作的只是在項目根目錄的 CMakeLists 文件中調用一系列的 add_test 命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 啓用測試
enable_testing()
# 測試程序是否成功運行
add_test (test_run Demo 5 2)
# 測試幫助信息是否能夠正常提示
add_test (test_usage Demo)
set_tests_properties (test_usage
PROPERTIES PASS_REGULAR_EXPRESSION "Usage: .* base exponent")
# 測試 5 的平方
add_test (test_5_2 Demo 5 2)
set_tests_properties (test_5_2
PROPERTIES PASS_REGULAR_EXPRESSION "is 25")
# 測試 10 的 5 次方
add_test (test_10_5 Demo 10 5)
set_tests_properties (test_10_5
PROPERTIES PASS_REGULAR_EXPRESSION "is 100000")
# 測試 2 的 10 次方
add_test (test_2_10 Demo 2 10)
set_tests_properties (test_2_10
PROPERTIES PASS_REGULAR_EXPRESSION "is 1024")

上面的代碼包含了四個測試。第一個測試 test_run 用來測試程序是否成功運行並返回 0 值。剩下的三個測試分別用來測試 5 的 平方、10 的 5 次方、2 的 10 次方是否都能獲得正確的結果。其中 PASS_REGULAR_EXPRESSION 用來測試輸出是否包含後面跟着的字符串。

讓咱們看看測試的結果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[ehome@xman Demo5]$ make test
Running tests...
Test project /home/ehome/Documents/programming/C/power/Demo5
Start 1: test_run
1/4 Test #1: test_run ......................... Passed 0.00 sec
Start 2: test_5_2
2/4 Test #2: test_5_2 ......................... Passed 0.00 sec
Start 3: test_10_5
3/4 Test #3: test_10_5 ........................ Passed 0.00 sec
Start 4: test_2_10
4/4 Test #4: test_2_10 ........................ Passed 0.00 sec
100% tests passed, 0 tests failed out of 4
Total Test time (real) = 0.01 sec

若是要測試更多的輸入數據,像上面那樣一個個寫測試用例未免太繁瑣。這時能夠經過編寫宏來實現:

1
2
3
4
5
6
7
8
9
10
11
# 定義一個宏,用來簡化測試工做
macro (do_test arg1 arg2 result)
add_test (test_${arg1}_${arg2} Demo ${arg1} ${arg2})
set_tests_properties (test_${arg1}_${arg2}
PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endmacro (do_test)
 
# 使用該宏進行一系列的數據測試
do_test ( 5 2 "is 25")
do_test ( 10 5 "is 100000")
do_test ( 2 10 "is 1024")

關於 CTest 的更詳細的用法能夠經過 man 1 ctest 參考 CTest 的文檔。

支持 gdb

讓 CMake 支持 gdb 的設置也很容易,只須要指定 Debug 模式下開啓 -g 選項:

1
2
3
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

以後能夠直接對生成的程序使用 gdb 來調試。

添加環境檢查

本節對應的源代碼所在目錄:Demo6

有時候可能要對系統環境作點檢查,例如要使用一個平臺相關的特性的時候。在這個例子中,咱們檢查系統是否自帶 pow 函數。若是帶有 pow 函數,就使用它;不然使用咱們定義的 power 函數。

添加 CheckFunctionExists 宏

首先在頂層 CMakeLists 文件中添加 CheckFunctionExists.cmake 宏,並調用 check_function_exists 命令測試連接器是否可以在連接階段找到 pow 函數。

1
2
3
# 檢查系統是否支持 pow 函數
include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
check_function_exists (pow HAVE_POW)

將上面這段代碼放在 configure_file 命令前。

預約義相關宏變量

接下來修改 config.h.in 文件,預約義相關的宏變量。

1
2
// does the platform provide pow function?
#cmakedefine HAVE_POW

在代碼中使用宏和函數

最後一步是修改 main.cc ,在代碼中使用宏和函數:

1
2
3
4
5
6
7
#ifdef HAVE_POW
printf("Now we use the standard library. \n");
double result = pow(base, exponent);
#else
printf("Now we use our own Math library. \n");
double result = power(base, exponent);
#endif

添加版本號

本節對應的源代碼所在目錄:Demo7

給項目添加和維護版本號是一個好習慣,這樣有利於用戶瞭解每一個版本的維護狀況,並及時瞭解當前所用的版本是否過期,或是否可能出現不兼容的狀況。

首先修改頂層 CMakeLists 文件,在 project 命令以後加入以下兩行:

1
2
set (Demo_VERSION_MAJOR 1)
set (Demo_VERSION_MINOR 0)

分別指定當前的項目的主版本號和副版本號。

以後,爲了在代碼中獲取版本信息,咱們能夠修改 config.h.in 文件,添加兩個預約義變量:

1
2
3
// the configured options and settings for Tutorial
#define Demo_VERSION_MAJOR @Demo_VERSION_MAJOR@
#define Demo_VERSION_MINOR @Demo_VERSION_MINOR@

這樣就能夠直接在代碼中打印版本信息了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "config.h"
#include "math/MathFunctions.h"
int main(int argc, char *argv[])
{
if (argc < 3){
// print version info
printf("%s Version %d.%d\n",
argv[ 0],
Demo_VERSION_MAJOR,
Demo_VERSION_MINOR);
printf("Usage: %s base exponent \n", argv[0]);
return 1;
}
double base = atof(argv[1]);
int exponent = atoi(argv[2]);
 
#if defined (HAVE_POW)
printf("Now we use the standard library. \n");
double result = pow(base, exponent);
#else
printf("Now we use our own Math library. \n");
double result = power(base, exponent);
#endif
 
printf("%g ^ %d is %g\n", base, exponent, result);
return 0;
}

生成安裝包

本節對應的源代碼所在目錄:Demo8

本節將學習如何配置生成各類平臺上的安裝包,包括二進制安裝包和源碼安裝包。爲了完成這個任務,咱們須要用到 CPack ,它一樣也是由 CMake 提供的一個工具,專門用於打包。

首先在頂層的 CMakeLists.txt 文件尾部添加下面幾行:

1
2
3
4
5
6
7
# 構建一個 CPack 安裝包
include (InstallRequiredSystemLibraries)
set (CPACK_RESOURCE_FILE_LICENSE
"${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set (CPACK_PACKAGE_VERSION_MAJOR "${Demo_VERSION_MAJOR}")
set (CPACK_PACKAGE_VERSION_MINOR "${Demo_VERSION_MINOR}")
include (CPack)

上面的代碼作了如下幾個工做:

  1. 導入 InstallRequiredSystemLibraries 模塊,以便以後導入 CPack 模塊;
  2. 設置一些 CPack 相關變量,包括版權信息和版本信息,其中版本信息用了上一節定義的版本號;
  3. 導入 CPack 模塊。

接下來的工做是像往常同樣構建工程,並執行 cpack 命令。

  • 生成二進制安裝包:
1
cpack -C CPackConfig.cmake
  • 生成源碼安裝包
1
cpack -C CPackSourceConfig.cmake

咱們能夠試一下。在生成項目後,執行 cpack -C CPackConfig.cmake 命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[ehome@xman Demo8]$ cpack -C CPackSourceConfig.cmake
CPack: Create package using STGZ
CPack: Install projects
CPack: - Run preinstall target for: Demo8
CPack: - Install project: Demo8
CPack: Create package
CPack: - package: /home/ehome/Documents/programming/C/power/Demo8/Demo8- 1.0.1-Linux.sh generated.
CPack: Create package using TGZ
CPack: Install projects
CPack: - Run preinstall target for: Demo8
CPack: - Install project: Demo8
CPack: Create package
CPack: - package: /home/ehome/Documents/programming/C/power/Demo8/Demo8- 1.0.1-Linux.tar.gz generated.
CPack: Create package using TZ
CPack: Install projects
CPack: - Run preinstall target for: Demo8
CPack: - Install project: Demo8
CPack: Create package
CPack: - package: /home/ehome/Documents/programming/C/power/Demo8/Demo8- 1.0.1-Linux.tar.Z generated.

此時會在該目錄下建立 3 個不一樣格式的二進制包文件:

1
2
[ehome@xman Demo8]$ ls Demo8-*
Demo8- 1.0.1-Linux.sh Demo8-1.0.1-Linux.tar.gz Demo8-1.0.1-Linux.tar.Z

這 3 個二進制包文件所包含的內容是徹底相同的。咱們能夠執行其中一個。此時會出現一個由 CPack 自動生成的交互式安裝界面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[ehome@xman Demo8]$ sh Demo8- 1.0.1-Linux.sh
Demo8 Installer Version: 1.0.1, Copyright (c) Humanity
This is a self-extracting archive.
The archive will be extracted to: /home/ehome/Documents/programming/C/power/Demo8
If you want to stop extracting, please press <ctrl-C>.
The MIT License (MIT)
Copyright (c) 2013 Joseph Pan(http://hahack.com)
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Do you accept the license? [yN]:
y
By default the Demo8 will be installed in:
"/home/ehome/Documents/programming/C/power/Demo8/Demo8-1.0.1-Linux"
Do you want to include the subdirectory Demo8- 1.0.1-Linux?
Saying no will install in: "/home/ehome/Documents/programming/C/power/Demo8" [Yn]:
y
Using target directory: /home/ehome/Documents/programming/C/power/Demo8/Demo8- 1.0.1-Linux
Extracting, please wait...
Unpacking finished successfully

完成後提示安裝到了 Demo8-1.0.1-Linux 子目錄中,咱們能夠進去執行該程序:

1
2
3
[ehome@xman Demo8]$ ./Demo8- 1.0.1-Linux/bin/Demo 5 2
Now we use our own Math library.
5 ^ 2 is 25

關於 CPack 的更詳細的用法能夠經過 man 1 cpack 參考 CPack 的文檔。

將其餘平臺的項目遷移到 CMake

CMake 能夠很輕鬆地構建出在適合各個平臺執行的工程環境。而若是當前的工程環境不是 CMake ,而是基於某個特定的平臺,是否能夠遷移到 CMake 呢?答案是可能的。下面針對幾個經常使用的平臺,列出了它們對應的遷移方案。

autotools

qmake

Visual Studio

  • vcproj2cmake.rb 能夠根據 Visual Studio 的工程文件(後綴名是 .vcproj.vcxproj)生成 CMakeLists.txt 文件。
  • vcproj2cmake.ps1 vcproj2cmake 的 PowerShell 版本。
  • folders4cmake 根據 Visual Studio 項目文件生成相應的 「source_group」 信息,這些信息能夠很方便的在 CMake 腳本中使用。支持 Visual Studio 9/10 工程文件。

CMakeLists.txt 自動推導

  • gencmake 根據現有文件推導 CMakeLists.txt 文件。
  • CMakeListGenerator 應用一套文件和目錄分析建立出完整的 CMakeLists.txt 文件。僅支持 Win32 平臺。

相關連接

  1. 官方主頁
  2. 官方文檔
  3. 官方教程
  4. Wiki
  5. FAQ
  6. bug tracker
  7. 郵件列表:
  8. 其餘推薦文章

相似工具

  • SCons:Eric S. Raymond、Timothee Besset、Zed A. Shaw 等大神力薦的項目架構工具。和 CMake 的最大區別是使用 Python 做爲執行腳本。
相關文章
相關標籤/搜索