FetchContent
find_package()
今天會繼續用 Day 21 的範例, 不過和 Day 22 的打包不同
而是另外寫一個只有執行檔的專案, 並使用該範例提供的 headers 和 libraries
看看我們前幾天寫的 Project 是否真的能被使用
在此之前, 我們先回頭將該範例的 libraries 加上 Namespace
add_library(Day21Example::SharedLib ALIAS SharedLib)
add_library(Day21Example::StaticLib ALIAS StaticLib)
接著看看今日的專案架構CMakeLists.txt
cmake_minimum_required(VERSION 3.25)
project(Day23Sample CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/src/cmake)
include(dependencies)
add_subdirectory(src)
src/CMakeLists.txt
add_executable(Day23Sample_Main main.cpp)
target_link_libraries(Day23Sample_Main PRIVATE
Day21Sample::SharedLib
Day21Sample::StaticLib
)
src/cmake/dependencies.cmake
include(FetchContent)
set(FETCHCONTENT_QUIET OFF)
FetchContent_Declare(Day21Sample
GIT_REPOSITORY https://github.com/erichung0404/cmake-example.git
GIT_TAG day22-packaging
GIT_SHALLOW TRUE
)
FetchContent_MakeAvailable(Day21Sample)
src/main.cpp
#include <shared_lib.h>
#include <static_lib.h>
int main() {
print_shared_lib();
print_static_lib();
return 0;
}
FetchContent
從上面可以看到有 src/cmake/dependencies.cmake
module 負責撈 external project
因為裡面是使用 FetchContent
, 會直接引入該專案的 build tree, 所以我們不需要安裝就能使用該 library targets
可以看到我們成功引進前幾天自己寫的 libraries 了!
find_package()
上面的 FetchContent
是直接將 build tree 拉進來
現在讓我們來修改一下 src/cmake/dependencies.cmake
, 改成用 find_package()
拉套件src/cmake/dependencies.cmake
find_package(Day21Example REQUIRED)
然後下載 Day 22 打包好的套件並解壓縮到 /usr/local/opt
底下
tar xvf ... -C /usr/local/opt
再重新執行一次
Voila! 可以看到我們也成功引入安裝的套件了🎉🎉🎉
單平台的建置到這邊就告一個段落了
下一篇會介紹如何分析並改善我們 build process 的效率