本節介紹如何用CMake來設置軟件的版本號ios
在《一塊兒學習CMake - 01》中咱們看到了如何用CMakeLists.txt來構建一個最簡單的工程,這一節裏咱們一塊兒來看看如何用CMake對開發的軟件進行版本號的設置。在介紹這方面的內容時,先簡單看一下在軟件開發中是如何對版本號進行設置的,如VTK 5.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爲階段版本號,第四部分爲日期版本號加希臘字母版本號,希臘字母版本號共有5種,分別爲:base、alpha、beta、RC、release。例如:1.1.1.110108_beta。
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)ui
project(HelloCmake)spa
add_executable(HelloCMake hellocmake.cpp).net
接着把它更改成:code
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;
return 0;
}
打開CMake,根據《一塊兒學習CMake - 01》的流程走一遍CMake。在我機子上我把編譯目錄設置爲:D:\CMake\CMake-Study\HelloCMake2-bin。Configure, 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_MAJOR和HelloCMake_VERSION_MINOR的值分別爲1和0。
第4 – 7句代碼,意思就是把」 ${PROJECT_SOURCE_DIR}」目錄下的文件HelloCMakeConfig.h.in用CMake自動生成後的頭文件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.h是CMake根據HelloCMakeConfig.h.in文件自動生成的,而且放在」 ${PROJECT_BINARY_DIR}」目錄下,因此必須把這個路徑加到工程的搜索路徑中去。加進去之後你會發現編譯環境的變化以下圖所示。
< xmlnamespace prefix ="v" ns ="urn:schemas-microsoft-com:vml" />
接着來看看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值分別爲1和0。而後結合HelloCMakeConfig.h.in生成了頭文件HelloCMakeConfig.h,並用這兩個變量替代「@HelloCMake_VERSION_MAJOR@」和」@HelloCMake_VERSION_MINOR@」的值,因而就有了HelloCMakeConfig.h裏的內容。
而後咱們又在HelloCMake.cpp裏包含了頭文件」HelloCMakeConfig.h」,也就是定義了HelloCMake_VERSION_MAJOR和HelloCMake_VERSION_MINOR兩個宏,接下HelloCMake裏就能夠肆無忌憚地去引用這兩個宏了。
這就是用CMake設置軟件版本號的整個過程,上面介紹的過程是我我的的理解,若是有不對的地方必定要告訴我(水靈,MSN:shuiling119@hotmail.com, QQ:348774226)。
再結合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/