使用覆盖三元组
在 Linux 上构建动态库
kmpkg 开箱即支持为多种配置构建库,但目前默认不包含 Linux 和 macOS 平台的共享库(动态库)构建配置。
这并不意味着你无法通过 kmpkg 在这些平台上构建动态库!本文将指导你通过 --overlay-triplets 选项创建自定义三元组文件,轻松在 Linux 上构建动态库。
步骤 1:创建自定义三元组文件
为节省时间,可直接复制现有的 x64-linux.cmake 三元组文件:
~/git$ mkdir custom-triplets
~/git$ cp kmpkg/triplets/x64-linux.cmake custom-triplets/x64-linux-dynamic.cmake
修改 custom-triplets/x64-linux-dynamic.cmake,使其内容如下:
# ~/git/custom-triplets/x64-linux-dynamic.cmake
set(KMPKG_TARGET_ARCHITECTURE x64)
set(KMPKG_CRT_LINKAGE dynamic)
set(KMPKG_LIBRARY_LINKAGE dynamic) # 此处从 static 改为 dynamic
set(KMPKG_CMAKE_SYSTEM_NAME Linux)
步骤 2:使用 --overlay-triplets 构建动态库
通过 --overlay-triplets 选项引入 custom-triplets 目录下的三元组:
~/git$ kmpkg/kmpkg install sqlite3:x64-linux-dynamic --overlay-triplets=custom-triplets
The following packages will be built and installed:
sqlite3[core]:x64-linux-dynamic
Starting package 1/1: sqlite3:x64-linux-dynamic
Building package sqlite3[core]:x64-linux-dynamic...
-- Loading triplet configuration from: /home/victor/git/custom-triplets/x64-linux-dynamic.cmake
-- Downloading https://sqlite.org/2019/sqlite-amalgamation-3280000.zip...
-- Extracting source /home/victor/git/kmpkg/downloads/sqlite-amalgamation-3280000.zip
-- Applying patch fix-arm-uwp.patch
-- Using source at /home/victor/git/kmpkg/buildtrees/sqlite3/src/3280000-6a3ff7ce92
-- Configuring x64-linux-dynamic-dbg
-- Configuring x64-linux-dynamic-rel
-- Building x64-linux-dynamic-dbg
-- Building x64-linux-dynamic-rel
-- Performing post-build validation
-- Performing post-build validation done
Building package sqlite3[core]:x64-linux-dynamic... done
Installing package sqlite3[core]:x64-linux-dynamic...
Installing package sqlite3[core]:x64-linux-dynamic... done
Elapsed time for package sqlite3:x64-linux-dynamic: 44.82 s
Total elapsed time: 44.82 s
The package sqlite3:x64-linux-dynamic provides CMake targets:
find_package(unofficial-sqlite3 CONFIG REQUIRED)
target_link_libraries(main PRIVATE unofficial::sqlite3::sqlite3)
覆盖三元组功能会在执行 kmpkg install、kmpkg update、kmpkg upgrade 和 kmpkg remove 命令时启用你的自定义三元组文件。
使用 --overlay-triplets 选项时,控制台会输出如下提示,表明当前正在使用自定义三元组:
-- Loading triplet configuration from: /home/custom-triplets/x64-linux-dynamic.cmake
覆盖默认三元组
你可能已经注意到:Windows 平台的默认三元组(x86-windows 和 x64-windows)默认安装动态库,需添加 -static 后缀才能构建静态库;而 Linux 和 macOS 平台则相反——x64-linux 和 x64-osx 默认为静态库构建配置。
通过 --overlay-triplets 可覆盖默认三元组,让 Linux 平台实现与 Windows 一致的行为:
x64-linux:构建动态库x64-linux-static:构建静态库
步骤 1:创建覆盖三元组
将上例中创建的自定义三元组文件 custom-triplets/x64-linux-dynamic.cmake 重命名为 custom-triplets/x64-linux.cmake;然后复制默认的 x64-linux 三元组(默认构建静态库)到 custom-triplets 目录,并将其重命名为 x64-linux-static.cmake。
~/git$ mv custom-triplets/x64-linux-dynamic.cmake custom-triplets/x64-linux.cmake
~/git$ cp kmpkg/triplets/x64-linux.cmake custom-triplets/x64-linux-static.cmake
步骤 2:使用 --overlay-triplets 覆盖默认三元组
通过 --overlay-triplets 选项引入 custom-triplets 目录下的三元组:
~/git$ kmpkg/kmpkg install sqlite3:x64-linux --overlay-triplets=custom-triplets
The following packages will be built and installed:
sqlite3[core]:x64-linux
Starting package 1/1: sqlite3:x64-linux
Building package sqlite3[core]:x64-linux...
-- Loading triplet configuration from: /home/victor/git/custom-triplets/x64-linux.cmake
-- Downloading https://sqlite.org/2019/sqlite-amalgamation-3280000.zip...
-- Extracting source /home/victor/git/kmpkg/downloads/sqlite-amalgamation-3280000.zip
-- Applying patch fix-arm-uwp.patch
-- Using source at /home/victor/git/kmpkg/buildtrees/sqlite3/src/3280000-6a3ff7ce92
-- Configuring x64-linux-dbg
-- Configuring x64-linux-rel
-- Building x64-linux-dbg
-- Building x64-linux-rel
-- Performing post-build validation
-- Performing post-build validation done
Building package sqlite3[core]:x64-linux... done
Installing package sqlite3[core]:x64-linux...
Installing package sqlite3[core]:x64-linux... done
Elapsed time for package sqlite3:x64-linux: 44.82 s
Total elapsed time: 44.82 s
The package sqlite3:x64-linux provides CMake targets:
find_package(unofficial-sqlite3 CONFIG REQUIRED)
target_link_libraries(main PRIVATE unofficial::sqlite3::sqlite3)
此时默认三元组已被你的自定义三元组覆盖,控制台会输出如下提示:
-- Loading triplet configuration from: /home/victor/git/custom-triplets/x64-linux.cmake