跳到主要内容

主机依赖项

其他端口在构建时用于生成代码或实现自定义构建系统的工具,可打包到 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-generatorcontoso-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-windowsx64-linuxx64-osx),可通过以下方式覆盖:

  1. 基于 CMake 的清单模式:在第一个 project() 指令前调用 set(KMPKG_HOST_TRIPLET "<triplet>" CACHE STRING "")
  2. 基于 MSBuild 的清单模式:设置 KmpkgHostTriplet 属性;
  3. 命令行:使用 --host-triplet=... 选项;
  4. 环境变量:KMPKG_DEFAULT_HOST_TRIPLET

制作主机依赖工具

制作工具类端口无需特殊要求,只需按照标准端口的编写规范、遵循所有常规策略和实践即可。需注意:在端口文件的上下文环境中,工具应基于 TARGET_TRIPLET 构建,而非 HOST_TRIPLET

若当前处于交叉编译上下文(TARGET_TRIPLET 不等于 HOST_TRIPLET),KMPKG_CROSSCOMPILING 变量会被设为真值。示例:

if(KMPKG_CROSSCOMPILING)
# 这是交叉构建(目标三元组 ≠ 主机三元组)
else()
# 这是原生构建(目标三元组 = 主机三元组)
endif()

仅主机端口

部分端口应仅作为主机依赖项被引用(例如脚本端口、工具端口)。此时,可使用 "native" 支持表达式描述该特性。当 KMPKG_CROSSCOMPILINGfalse(即 TARGET_TRIPLET == HOST_TRIPLET)时,该支持表达式为真。

KMPKG_USE_HOST_TOOLS

设置该 CMake 选项后,kmpkg 构建的可执行文件会被添加到 CMAKE_PROGRAM_PATH,并在构建过程中可用。

该选项需在 CMakeLists.txtproject() 调用前设置才能生效,且必须已设置 KMPKG_HOST_TRIPLET 变量。

仅主机三元组的 tools 目录 下安装的工具会被添加到 CMAKE_PROGRAM_PATH,具体包括以下路径:

  • ${KMPKG_INSTALLED_DIR}/${KMPKG_HOST_TRIPLET}/tools
  • ${KMPKG_INSTALLED_DIR}/${KMPKG_HOST_TRIPLET}/tools/*/bin