CMake是一個比make更高級的編譯配置工具,它可以根據不同平台、不同的編譯器,生成相應的Makefile或者vcproj項目。
通過編寫CMakeLists.txt,可以控制生成的Makefile,從而控制編譯過程。CMake自動生成的Makefile不僅可以通過make命令構建項目生成目標文件,還支持安裝(make install)、測試安裝的程序是否能正確執行(make test,或者ctest)、生成當前平台的安裝包(make package)、生成源碼包(make package_source)、產生Dashboard顯示數據並上傳等高級功能,只要在CMakeLists.txt中簡單配置,就可以完成很多復雜的功能,包括寫測試用例。
如果有嵌套目錄,子目錄下可以有自己的CMakeLists.txt。
總之,CMake是一個非常強大的編譯自動配置工具,支持各種平台,KDE也是用它編譯的,感興趣的可以試用一下。
准備活動:
(1)安裝cmake。
(2)運行cmake的方法。(GUI、命令行)
CMake使用步驟:
運行GUI的cmake界面:
cmake-2.8.1-win32-x86bincmake-gui.exe
執行Configure:
運行之後,生成了如下文件:
生成Makefile:
執行Generate之後生成如下文件:
運行make進行編譯:
編譯完成後,在build目錄生成Tutorial.exe,運行Tutorial.exe 25就可以看到運行結果:
運行make install安裝程序:
運行make test進行測試:
通過cmake tutorial學習CMake配置方法 http://www.cmake.org/cmake/help/cmake_tutorial.html
可以在源代碼的Tests/Turorial目錄中找到這個手冊對應的代碼。
1、Step1。
(如果不知道如何使用cmake,以及如何使用編譯產生的Turorial.exe,可先看下前面“CMake使用步驟”的說明,它以Step4為例詳細介紹了使用過程,Step1的配置可能不夠完全,比如無法運行make install,無法運行make test,但可以參考。)
簡單的程序編譯。
(1)運行GUI的cmake,指定要編譯的源代碼路徑和二進制文件路徑(會自動創建)。
(2)點擊Configure,配置成功後,再點擊Generate。
配置需要選擇合適的編譯器,雖然我安裝了VC2008,但沒有配置成功;選擇Unix Makefiles,配置成功,它自動找到了DevC++下的gcc.exe等編譯器。
(3)在build3目錄執行make,就能夠編譯生成Turorial.exe了。
D:ProjectsLabtestngppcmake-2.8.1TestsTutorialStep1build3>makeLinking CXX executable Tutorial.exe
[100%] Built target Tutorial
可以運行一下Turorial.exe:
D:ProjectsLabtestngppcmake-2.8.1TestsTutorialStep1build3>Tutorial.exe
Tutorial.exe Version 1.0
Usage: Tutorial.exe number
D:ProjectsLabtestngppcmake-2.8.1TestsTutorialStep1build3>Tutorial.exe 4
The square root of 4 is 2
2、Step2 把子目錄編譯為庫,並且鏈接到最終的可執行文件。
include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory (MathFunctions) # 使得子目錄MathFunctions也能被編譯
# add the executable
add_executable (Tutorial tutorial.cxx)
target_link_libraries (Tutorial MathFunctions)
產生makefile:
在GUI上點擊Configure,之後Generate還是灰色,再次點擊Configure,Generate就可以點擊了。
編譯:
在build目錄運行make,即可開始編譯,但是開始會報告sh.exe運行異常,應該是Tools下的UnxUtils的sh.exe與Win7不兼容,發現有如下make文件,估計是它導致的,於是把它重命名,不使用UnxUtils下的make,就OK樂。
D:ToolsCMDUnxUtilsusrlocalwbinmake.exe
編譯過程:
D:ProjectsLabtestngppcmake-2.8.1TestsTutorialStep2build>make
[ 50%] Building CXX object MathFunctions/CMakeFiles/MathFunctions.dir/mysqrt.cxx
.obj
Linking CXX static library libMathFunctions.a
[ 50%] Built target MathFunctions
Linking CXX executable Tutorial.exe
[100%] Built target Tutorial
3、Step3
支持make install把程序安裝到系統指定目錄,並且運行一些測試檢查它是否能夠正常工作。
a、安裝時使用的基礎目錄,由CMAKE_INSTALL_PREFIX指定。
b、可以通過一個很簡單的用例檢查程序是否運行起來,沒有出現異常。(TurotialRuns只是一個用例名字)
add_test (TutorialRuns Tutorial 25)
c、macro方式進行多組數據的測試是非常簡潔方便的。
#define a macro to simplify adding tests, then use it
macro (do_test arg result)
add_test (TutorialComp${arg} Tutorial ${arg})
set_tests_properties (TutorialComp${arg}
PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endmacro (do_test)
# do a bunch of result based tests
do_test (25 "25 is 5")
do_test (-25 "-25 is 0")
執行make install:
D:ProjectsLabtestngppcmake-2.8.1TestsTutorialStep3build>make install
[ 50%] "Built target MathFunctions"
[100%] "Built target Tutorial"
Install the project...
-- Install configuration: ""
-- Installing: C:/Program Files/Tutorial/bin/Tutorial.exe
-- Installing: C:/Program Files/Tutorial/include/TutorialConfig.h
-- Installing: C:/Program Files/Tutorial/bin/libMathFunctions.a
-- Installing: C:/Program Files/Tutorial/include/MathFunctions.h
安裝結果: C:Program FilesTutorial>tree /f
C:.
├─bin
│ libMathFunctions.a
│ Tutorial.exe
│
└─include
MathFunctions.h
TutorialConfig.h
執行make test:
D:ProjectsLabtestngppcmake-2.8.1TestsTutorialStep3build>make test
Running tests...
Test project D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step3/build
Start 1: TutorialRuns
1/5 Test #1: TutorialRuns ..................... Passed 0.01 sec
Start 2: TutorialComp25
2/5 Test #2: TutorialComp25 ................... Passed 0.01 sec
Start 3: TutorialNegative
3/5 Test #3: TutorialNegative ................. Passed 0.01 sec
Start 4: TutorialSmall
4/5 Test #4: TutorialSmall .................... Passed 0.00 sec
Start 5: TutorialUsage
5/5 T