一起學習CMake – 02

本節介紹如何用CMake來設置軟件的版本號

 

《一起學習CMake - 01中我們看到了如何用CMakeLists.txt來構建一個最簡單的工程,這一節裏我們一起來看看如何用CMake對開發的軟件進行版本號的設置。在介紹這方面的內容時,先簡單看一下在軟件開發中是如何對版本號進行設置的,如VTK5.6.1,軟件當中的版本都表示什麼意思。

 

*******************************************************************************

 

關於軟件版本號的問題
完全的版本號定義,分三項::<主版本號>.<次版本號>.<修訂版本號>,如 1.0.0
版本號升級原則:
主版本號:功能模塊有大的變動,比如增加多個模塊或者整體架構發生變化。
次版本號:和主版本相對而言,次版本號的升級對應的只是局部的變動。但該局部的變動造成了程序和以前版本不能兼容,或者對該程序以前的協作關係產生了破壞,或者是功能上有大的改進或增強。
修訂版本號:局部的變動,主要是局部函數的功能改進,或者bug的修正,或者功能的擴充。
1. 各種軟件的版本號是怎麼確定的,怎樣的跨越才能算是由bate到正式版?
原則上,自第一個穩定版本發佈後,修訂版本號會經常性改動,而次版本號則依情況作改動,主版本號改動的頻率很低,除非有大的重構或功能改進。對於小項目而言,甚至可以簡化爲:>.<次版本號>.<修訂版本號>
版本號比較自由,至於Beta版或者是正式版跟版本號之間並沒有任何關係,只要達到正式版的要求的話,即使版本號是1.0或者0.1都可能是正式版的。
* Alpha: 此版本表示該軟件在此階段主要是以實現軟件功能爲主,通常只在軟件開發者內部交流,一般而言,該版本軟件的Bug較多,需要繼續修改。
* Beta: 該版本相對於α版已有了很大的改進,消除了嚴重的錯誤,但還是存在着一些缺陷,需要經過多次測試來進一步消除,此版本主要的修改對像是軟件的UI
* RC: 該版本已經相當成熟了,基本上不存在導致錯誤的BUG,與即將發行的正式版相差無幾。
* Release: 該版本意味最終版本,在前面版本的一系列測試版之後,終歸會有一個正式版本,是最終交付用戶使用的一個版本。該版本有時也稱爲標準版。一般情況下,Release不會以單詞形式出現在軟件封面上,取而代之的是符號(R)
2. 版本命名規範
軟件版本號由四部分組成,例如:1.1.1.110108_beta。第一個1爲主版本號,第二個1爲子版本號,第三個1爲階段版本號,第四部分爲日期版本號加希臘字母版本號,希臘字母版本號共有5種,分別爲:basealphabetaRCrelease
3. 版本號定修改規則
* 主版本號(1):當功能模塊有較大的變動,比如增加多個模塊或者整體架構發生變化。此版本號由項目決定是否修改。
* 子版本號(1):當功能有一定的增加或變化,比如增加了對權限控制、增加自定義視圖等功能。此版本號由項目決定是否修改。
* 階段版本號(1):一般是 Bug 修復或是一些小的變動,要經常發佈修訂版,時間間隔不限,修復一個嚴重的bug即可發佈一個修訂版。此版本號由項目經理決定是否修改。
* 日期版本號(110108):用於記錄修改項目的當前日期,每天對項目的修改都需要更改日期版本號。此版本號由開發人員決定是否修改。
* 希臘字母版本號(beta):此版本號用於標註當前版本的軟件處於哪個開發階段,當軟件進入到另一個階段時需要修改此版本號。此版本號由項目決定是否修改。

*******************************************************************************

詳細的關於軟件版本號的問題,可以參考百度百科等資料的介紹。下面開始介紹如何用CMake來對自己開發的軟件進行版本號的設置。

第一節所建的目錄裏,再建立一個空的文件夾:HelloCMake2(在我機子的完整路徑是:D:\CMake\CMake-Study\HelloCMake2),然後把HelloCMake裏的文件CMakeLists.txt和HelloCMake.cpp兩個文件複製到HelloCMake2目錄下,打開該目錄下的CMakeLists.txt文件,裏面的內容應該是:

 

cmake_minimum_required(VERSION 2.6)

project(HelloCmake)

add_executable(HelloCMake hellocmake.cpp)

 

接着把它更改爲:

 

cmake_minimum_required(VERSION 2.6)

project(HelloCmake)

 

# 在CMake裏設置HelloCMake軟件的主版本號爲1,次版本號爲0。

set( HelloCMake_VERSION_MAJOR 1 )

set( HelloCMake_VERSION_MINOR 0 )

 

configure_file(

         “${PROJECT_SOURCE_DIR}/HelloCMakeConfig.h.in”

         “${PROJECT_BINARY_DIR}/HelloCMakeConfig.h”

         )

 

Include_directories(“${PROJECT_BINARY_DIR}”)

 

add_executable(HelloCMake hellocmake.cpp)

 

然後在HelloCMake2目錄下創建一個文本文件(txt),重命名爲”HelloCMakeConfig.h.in”,這裏Windows會彈出對話框警告你文件後綴被更改了(原來是***.txt的,現在改爲***.in),問題是否繼續,點確認更改。

然後用記事本打開HelloCMakeConfig.h.in文件,在裏面輸入下面的代碼:

 

//the configured options and settings for HelloCMake

#define HelloCMake_VERSION_MAJOR @HelloCMake_VERSION_MAJOR@

#define HelloCMake_VERSION_MINOR @HelloCMake_VERSION_MINOR@

 

到此爲止就完成了用CMake對自己的軟件進行版本號設置的一些前期工作,接着打開HelloCMake.cpp文件,把HelloCMakeConfig.h文件包含到該源文件中去,然後在裏面加入一些打印HelloCMake軟件版本號的信息,看看我們在CMake裏設置的版本有沒有效果,完整的HelloCMake.cpp代碼如下:

#include <iostream>
#include "HelloCMakeConfig.h"

int main(int argc, char *argv[])
{
	std::cout<<"HelloCMake軟件的主版本號是:"
		<< HelloCMake_VERSION_MAJOR << std::endl;

	std::cout<<"HelloCMake軟件的次版本號是:"
		<< HelloCMake_VERSION_MINOR << std::endl; 

	fprintf(stdout, "%s Version is: %d.%d\n",
		argv[0],
		HelloCMake_VERSION_MAJOR,
		HelloCMake_VERSION_MINOR);

	std::cout<<"Study CMake Together - HelloCMake2"<<std::endl;
	system("pause");
	return 0;
}


打開CMake,根據《一起學習CMake - 01的流程走一遍CMake。在我機子上我把編譯目錄設置爲:D:\CMake\CMake-Study\HelloCMake2-binConfigure, Generate完了以後打開HelloCMake2-bin目錄下的HelloCMake.sln文件,編譯鏈接,你就會看到整個工程能正確地運行了。


接着我們來看看爲什麼要這麼寫,裏面的每句代碼都表示什麼意思。首先看看HelloCMake2目錄下的CMakeLists.txt文件,與《一起學習CMake - 01相比較多了下面的代碼:

 

1. # CMake裏設置HelloCMake軟件的主版本號爲1,次版本號爲0

2. set ( HelloCMake_VERSION_MAJOR 1 )

3. set ( HelloCMake_VERSION_MINOR 0 )

 

4. configure_file(

5.    “${PROJECT_SOURCE_DIR}/HelloCMakeConfig.h.in”

6.    “${PROJECT_BINARY_DIR}/HelloCMakeConfig.h”

7.    )

 

8. Include_directories (“${PROJECT_BINARY_DIR}”)

 

  第1句,註釋作用,在CMake裏的註釋符號是”#”,這裏面的註釋已經對第2,3句代碼的作用說得很清楚了。”set”CMake的命令,用於定義變量,即定義了HelloCMake_VERSION_MAJORHelloCMake_VERSION_MINOR的值分別爲10

  第4 – 7句代碼,意思就是把” ${PROJECT_SOURCE_DIR}”目錄下的文件HelloCMakeConfig.h.inCMake自動生成後的頭文件HelloCMakeConfig.h放到目錄“${PROJECT_BINARY_DIR}” ” ${PROJECT_SOURCE_DIR}”表示的是工程源文件所在的目錄,換句話說就是你在CMake”where is the source code”裏設置的路徑;同樣  ${ PROJECT_BINARY_DIR }”就是你在CMake”where to build the binaries”裏設置的路徑。這兩個變量是CMake裏預先定義好的,可以直接拿來用。

  第8句代碼,意思就是把” ${PROJECT_BINARY_DIR}”路徑加入到工程頭文件的搜索路徑中去,這樣工程編譯鏈接時就能夠找到HelloCMakeConfig.h這個頭文件。因爲我們在上面一段已經知道,HelloCMakeConfig.hCMake根據HelloCMakeConfig.h.in文件自動生成的,並且放在” ${PROJECT_BINARY_DIR}”目錄下,所以必須把這個路徑加到工程的搜索路徑中去。加進去以後你會發現編譯環境的變化如下圖所示。

  接着來看看HelloCMake2目錄下的文件HelloCMakeConfig.h.in裏的內容:

// the configured options and settings for HelloCMake

#define HelloCMake_VERSION_MAJOR @HelloCMake_VERSION_MAJOR@

#define HelloCMake_VERSION_MINOR @HelloCMake_VERSION_MINOR@

 

  很簡單,只是定義了兩個宏,分別是HelloCMake軟件的主版本號和次版本號,”//”這一行當然就表示註釋了,你可以打開HelloCMake-bin目錄下的自動生成後的HelloCMakeConfig.h文件跟HelloCMakeConfig.h.in文件作一下對比,你會發現它們之前太神似了:

// the configured options and settings for HelloCMake
#define HelloCMake_VERSION_MAJOR 1
#define HelloCMake_VERSION_MINOR 0

  “@HelloCMake_VERSION_MAJOR@””@HelloCMake_VERSION_MINOR@”是取值的意思,這兩個值已經在CMakeLists.txt裏定義過了,CMake配置工程時要去CMakeLists.txt讀取內容,當它發現set ( HelloCMake_VERSION_MAJOR 1 )set ( HelloCMake_VERSION_MINOR 0 )這兩句代碼時,CMake就知道變量HelloCMake_VERSION_MAJOR/ HelloCMake_VERSION_MINOR值分別爲10。然後結合HelloCMakeConfig.h.in生成了頭文件HelloCMakeConfig.h,並用這兩個變量替代“@HelloCMake_VERSION_MAJOR@””@HelloCMake_VERSION_MINOR@”的值,於是就有了HelloCMakeConfig.h裏的內容。

  然後我們又在HelloCMake.cpp裏包含了頭文件”HelloCMakeConfig.h”,也就是定義了HelloCMake_VERSION_MAJORHelloCMake_VERSION_MINOR兩個宏,接下HelloCMake裏就可以肆無忌憚地去引用這兩個宏了。

  再結合VTK, ITK, IGSTK等開源工具包,可以加深你對用CMake進行軟件版本號設置的理解,以VTK爲例,在VTK的源文件中肯定有一個文件叫做VTKConfigure.h.in(我這裏使用的是VTK 5.6.1版本),在該文件的第165-168行,有如下的代碼:

 

/* Version number.  */

#define VTK_MAJOR_VERSION @VTK_MAJOR_VERSION@

#define VTK_MINOR_VERSION @VTK_MINOR_VERSION@

#define VTK_BUILD_VERSION @VTK_BUILD_VERSION@

 

比較一下跟我們上面提到的HelloCMakeConfig.h.in裏的一樣嗎?

再打開VTK源文件目錄下的CMakeLists.txt文件,在第64-67行你會發現有如下代碼:

 

# VTK version number.  An even minor number corresponds to releases.

SET(VTK_MAJOR_VERSION 5)

SET(VTK_MINOR_VERSION 6)

SET(VTK_BUILD_VERSION 1)

 

再看看這個文件的第1065行開始,有如下代碼:

 

INCLUDE_DIRECTORIES(

  ${VTK_INCLUDE_DIRS_BUILD_TREE}

  ${VTK_INCLUDE_DIRS_SOURCE_TREE}

  ${VTK_INCLUDE_DIRS_BUILD_TREE_CXX}

  ${VTK_INCLUDE_DIRS_SYSTEM}

)

 

又比較一下跟我們例子HelloCMake2裏的CMakeLists.txt的內容一樣嗎?

最後再打開VTK的編譯目錄,你會有裏面發現一個文件叫做VTKConfigure.h這個頭文件。

 

  用CMake進行軟件版本號的設置是不是很簡單?只要在CMakeLists.txt里加入一些代碼,準備一個YourProjectConfigure.h.in,然後用CMake來構建工程就OK了。

HelloCMake2程序執行的結果截圖:


轉自http://blog.163.com/jacky_ling0/blog/static/13739257120110822137872/

發佈了14 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章