主机依赖项
其他端口在构建时用于生成代码或实现自定义构建系统的工具,可打包到 kmpkg 中,这类工具称为主机依赖项。
使用主机依赖项
当将某个端口作为工具使用时,必须将该依赖项的 "host" 字段设为 true。示例:
{
"name": "contoso-http-library",
"version-string": "1.0.0",
"description": "Contoso 的 HTTP 运行时库",
"dependencies": [
"contoso-core-library",
{
"name": "contoso-code-generator",
"host": true
},
{
"name": "contoso-build-system",
"host": true
}
]
}
在上述示例中,contoso-code-generator 和 contoso-build-system(包括其所有传递依赖项)将先为主机三元组构建并安装,之后再构建 contoso-http-library。
使用主机依赖项时,必须使用
kmpkg.json作为元数据格式(而非CONTROL)。可通过kmpkg format-manifest /path/to/CONTROL命令快速转换现有CONTROL文件。
随后,在使用者的端口文件(示例中的 contoso-http-library)中,CMake 变量 CURRENT_HOST_INSTALLED_DIR 会被定义为 installed/<host-triplet>,可通过该变量定位所需资源。例如,contoso-code-generator 可能安装了 tools/contoso-code-generator/ccg.exe,使用者可通过以下方式将其添加到本地路径:
# ports/contoso-http-library/portfile.cmake
kmpkg_add_to_path(${CURRENT_HOST_INSTALLED_DIR}/tools/contoso-code-generator)
指定主机三元组
默认主机三元组根据主机架构和操作系统自动选择(例如 x64-windows、x64-linux 或 x64-osx),可通过以下方式覆盖:
- 基于 CMake 的清单模式:在第一个
project()指令前调用set(KMPKG_HOST_TRIPLET "<triplet>" CACHE STRING ""); - 基于 MSBuild 的清单模式:设置
KmpkgHostTriplet属性; - 命令行:使用
--host-triplet=...选项; - 环境变量:
KMPKG_DEFAULT_HOST_TRIPLET。
制作主机依赖工具
制作工具类端口无需特殊要求,只需按照标准端口的编写规范、遵循所有常规策略和实践即可。需注意:在端口文件的上下文环境中,工具应基于 TARGET_TRIPLET 构建,而非 HOST_TRIPLET。
若当前处于交叉编译上下文(TARGET_TRIPLET 不等于 HOST_TRIPLET),KMPKG_CROSSCOMPILING 变量会被设为真值。示例:
if(KMPKG_CROSSCOMPILING)
# 这是交叉构建(目标三元组 ≠ 主机三元组)
else()
# 这是原生构建(目标三元组 = 主机三元组)
endif()
仅主机端口
部分端口应仅作为主机依赖项被引用(例如脚本端口、工具端口)。此时,可使用 "native" 支持表达式描述该特性。当 KMPKG_CROSSCOMPILING 为 false(即 TARGET_TRIPLET == HOST_TRIPLET)时,该支持表达式为真。
KMPKG_USE_HOST_TOOLS
设置该 CMake 选项后,kmpkg 构建的可执行文件会被添加到 CMAKE_PROGRAM_PATH,并在构建过程中可用。
该选项需在 CMakeLists.txt 的 project() 调用前设置才能生效,且必须已设置 KMPKG_HOST_TRIPLET 变量。
仅主机三元组的 tools 目录 下安装的工具会被添加到 CMAKE_PROGRAM_PATH,具体包括以下路径:
${KMPKG_INSTALLED_DIR}/${KMPKG_HOST_TRIPLET}/tools${KMPKG_INSTALLED_DIR}/${KMPKG_HOST_TRIPLET}/tools/*/bin