[CMake] config Cmake เพื่อ build C/C++ เบื้องต้น

CMake เป็น build tool นึงเพื่อช่วยให้เราเซตโปรเจ็ค C/C++ ให้ build binary ออกมาได้ง่ายๆ เพราะ C/C++ เวลาจะ build มีทั้งต้องกำหนด include ตอน compile ทั้งต้องกำหนด library อื่นๆที่เกี่ยวข้องก่อน linking ดังนั้นใช้ CMake ก็จะช่วยจัดการพวกนี้ได้ง่ายขึ้น

สิ่งที่เราต้องทำคือสร้างไฟล์ CMakeLists.txt ซึ่งเป็นไฟล์ config ของ CMake สำหรับการ build C/C++ เบื้องต้น ที่มีใช้ Boost library ด้วย เป็นแบบนี้

# กำหนด CMake minimum version ไม่ต่ำกว่า 3.18
cmake_minimum_required(VERSION 3.18)

# กำหนดชื่อโปรเจค boost-thread-pool-example และภาษาที่ใช้คือ C และ CXX (C++)
project(boost-thread-pool-example C CXX)

# เช็คว่าถ้า env CMAKE_BUILD_TYPE ไม่ใช่ Debug ก็จะกำหนด CMAKE_BUILD_TYPE เป็น Release
if(NOT CMAKE_BUILD_TYPE MATCHES Debug)
  set(CMAKE_BUILD_TYPE Release)
endif()

# กำหนด version ว่าจะใช้ CPP version 17
set(CMAKE_CXX_STANDARD 17)
# เปิดใช้งาน flag CMAKE_CXX_STANDARD_REQUIRED
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# ปิดการใช้งาน CPP Extensions
set(CMAKE_CXX_EXTENSIONS OFF)

# เช็คว่า compile บน 64 bit หรือ 32 bit
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  message(STATUS "Building on a 64 bit system")
else()
  message(STATUS "Building on a 32 bit system")
endif()

# จะใช้คำสั่ง find_package เพื่อระบุ dependencies เช่นกรณีนี้คือ Boost library
# ซึ่ง CMake จะ include module FindBoost.cmake เขามาให้เราด้วย
# ในนั้นก็จะหา include path, lib path แล้วกำหนดค่าลงตัวแปรที่ขึ้นต้นด้วย Boost_ ให้เราเช่น
# Boost_CXXFLAGS
find_package(Boost REQUIRED)

# เพิ่ม include directory ของ Boost เข้ามาใน project
include_directories(${Boost_INCLUDE_DIRS})

# ระบุว่า เราจะ build executable program เราจาก main.cpp และชื่อไฟล์โปรแกรมคือ boost-thread-pool-example
add_executable(boost-thread-pool-example main.cpp)

# สุดท้ายตอน link library ระบุด้วยว่าตอน link ให้เอา library ของ Boost มา link ด้วย
target_link_libraries(boost-thread-pool-example ${Boost_LIBRARIES})

ทีนี้ในโปรเจ็คเราตอนจะ build ก็ให้สร้าง build directory ขึ้นมาก่อนเช่นในโปรเจ็คมีไฟล์แบบนี้

app
- main.cpp
- CMakeLists.txt

ให้เรา cd เข้าไปใน app แล้ว mkdir build แล้ว cd เข้าไปใน build แล้วสั่ง cmake .. แบบนี้

cd app
makdir build
cd build
cmake ..

เสร็จแล้วตอนจะ build ก็ให้สั่ง

cmake --build .

ก็ได้แล้ว

ถ้าใครใช้ VSCode CMake extension ก็สั่ง build จาก VSCode ได้เลยอีกด้วย