code style

2016年10月21日 星期五

CMake筆記(5) - 將建置資訊分類

CMake的build有2種:
In-source build:build的資料夾和source code在同一個資料夾,不推薦
out-of-source build:build的資料夾和source code在不同個資料夾,推薦,source code裡不會有cmake產生的cache,可單獨打包發佈。 

注意事項: 在執行 Out-of-source build 之前必須先確定所指定的源碼根目錄是否乾淨,若是該目錄下含有前次留下的 CMakeCache.txt 仍會執行 In-source build。 

開始前我們先清除之前CMake產生的cache,而因為CMake似乎沒有相關命令清除cache,我們自已寫一個簡單的script來清除:
#!/bin/bash
# usage: bash clean_cmake_cache.sh
echo "remove cmake cache...."
if [ -f ./cmake_install.cmake ]; then
rm ./cmake_install.cmake
fi
if [ -d ./CMakeFiles ]; then
rm -r ./CMakeFiles
fi
if [ -f ./Makefile ]; then
rm ./Makefile
fi
if [ -f ./CMakeCache.txt ]; then
rm ./CMakeCache.txt
fi

out-of-source build:
我們將資料夾整理一下:
src:放source code
lib:放library的source code
lib/include:放library的header file
bin:放build 好的執行檔
build:放build好的lib檔
Project資料夾:放CMake產生 的cache


















CMakeLists.txt:
cmake_minimum_required (VERSION 2.6)
project (Test)

include_directories(lib/include)
set(TEST_SOURCES src/main.cxx)
set(LIB_SOURCES lib/lib.cxx)
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/build)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
 

add_library(MyLib ${LIB_SOURCES})
add_executable(TestRun ${TEST_SOURCES})
target_link_libraries(TestRun MyLib)


路徑資訊:
CMake 提供了幾個變數讓使用者在撰寫 CMakeLists 時取得路徑資訊。
CMAKE_SOURCE_DIR
內容為 source tree 根目錄的完整路徑,也就是 CMake 開始建置過程的進入點。
CMAKE_BINARY_DIR
內容為 binary tree 根目錄的完整路徑,在 in-source build 的時候值與 CMAKE_SOURCE_DIR 相同。
PROJECT_SOURCE_DIR
目前所屬專案的原始碼根目錄,即內含 project() 指令的 CMakeLists 所在資料夾。前面的例子沒有階層之分,所以 PROJECT_SOURCE_DIR 和 CMAKE_SOURCE_DIR 相同;更複雜的專案會包含數個子專案,子專案下面還可能會有多個資料夾,PROJECT_SOURCE_DIR 內容為目前正在處理中的專案最上層目錄。
PROJECT_BINARY_DIR
目前所屬專案的建置根目錄,專案意義同上。在 in-source build 時和 PROJECT_SOURCE_DIR 相同。
CMAKE_CURRENT_SOURCE_DIR
目前正在處理的 CMakeLists.txt 所在位置。
CMAKE_CURRENT_BINARY_DIR
目前正在處理的 CMakeLists.txt 對應的建置資料夾位置。當然,在 in-source build 時和 CMAKE_CURRENT_SOURCE_DIR 相同。
這裡要注意的是,CMake 中都使用絕對路徑來表示檔案位置。

沒有留言:

張貼留言