什麼是CMake與Make

在認識modmesh的過程中,包括modmesh本身以及延伸的小實作,幾乎處處可見make及CMake的身影;雖然對它們的認識甚少,但操作的過程中可以隱約感受到make與cmake似乎存在某種相依性,擁有類似的機制。同樣仰賴導演(make, cmake)與腳本(Makefile, CMakeList.txt),也就是make仰賴Makefile, 而cmake仰賴CMakeList.txt,但兩者做著不一樣的事情。

CMake

CMake 用來產生跨平台的專案建置文件,在 windows 下它會生成 visual studio 的專案檔 (.sln) codeblock eclipse,在 linux 下它會生成 Makefile,雖然makefile是可以人工生成,但當手寫makefile並不方便,也不能跨平台使用,於是cmake依平台生成建置文件即可帶來便利性。(最終端的CMakeLists.txt依然是由依然是由人工攥寫)

CMakeList.txt:

1
2
3
4
cmake_minimum_required(VERSION 3.4)
PROJECT(pybind_vid)
add_subdirectory(pybind11)
pybind11_add_module(test test.cpp)

cmake:

1
2
3
4
5
6
7
8
9
~/git-repo/demo$ ls
CMakeLists.txt pybind11 test.cpp
~/git-repo/demo$ mkdir build #創建build這個directory,區分原始文件以及CMake過程的中間產物
~/git-repo/demo$ ls build/
# (empty)
~/git-repo/demo$ cd build/
~/git-repo/demo/build$ cmake .. #執行cmake
~/git-repo/demo/build$ ls #執行後,build底下就會有Makefile
CMakeCache.txt CMakeFiles cmake_install.cmake Makefile pybind11

Make

make是用來自動化shell script,在這篇demo了一個手動生成Makefile的範例。

CMake and make 協作使用之過程:

1
2
3
4
5
6
~/git-repo/demo$ ls
build CMakeLists.txt pybind11 test.cpp #cmake所根據的CMakeLists.txt存在此目錄底下
~/git-repo/demo/build$ cmake .. #cmake根據CMakeLists.txt 生成 Makefile
~/git-repo/demo/build$ ls
CMakeCache.txt CMakeFiles cmake_install.cmake Makefile pybind11 #cmake所生成的Makefile
~/git-repo/demo/build$ make #make根據Makefile執行裡頭的shellscript