kmpkg_make_configure
配置基于 Make 构建系统的项目。
用法
kmpkg_make_configure(
SOURCE_PATH <source-path>
[AUTORECONF]
[COPY_SOURCE]
[DISABLE_MSVC_WRAPPERS]
[DISABLE_CPPFLAGS]
[DISABLE_DEFAULT_OPTIONS]
[DISABLE_MSVC_TRANSFORMATIONS]
[OPTIONS <configure-setting>...]
[OPTIONS_RELEASE <configure-setting>...]
[OPTIONS_DEBUG <configure-setting>...]
[PRE_CONFIGURE_CMAKE_COMMANDS <cmake-command>...]
[LANGUAGES <language>...]
)
使用该函数前,必须依赖辅助端口 kmpkg-make(需配置为 host 依赖):
"dependencies": [
{
"name": "kmpkg-make",
"host": true
}
]
参数
SOURCE_PATH
包含项目源码文件的根目录路径。
该路径通常由源码获取类命令(如 kmpkg_from_github())的输出变量提供。
AUTORECONF
设置该参数时,会在配置前执行 autoreconf 命令(用于重构 autotools 生成的配置脚本)。
COPY_SOURCE
若指定该参数,配置流程开始前会将源码目录复制到构建目录。适用于那些在配置/构建过程中会修改源码树的项目。
DISABLE_MSVC_WRAPPERS
默认情况下,kmpkg_make_configure 会提供一套包装器(wrappers),将「Unix/GCC 风格」的编译/链接标志转换并重排为「MSVC 风格」,以适配那些假定构建环境为 Unix/GCC 的构建系统。
设置 DISABLE_MSVC_WRAPPERS 会禁用该标志转换逻辑,让 cl、windres 等工具直接接收未经修改的命令行标志。
DISABLE_MSVC_TRANSFORMATIONS
默认情况下,使用 MSVC 编译器时,库文件和编译/链接标志会被转换为符合 Unix 风格的格式——这是为了兼容 libtool 等 Unix 系构建工具,同时也是因为跨平台环境下 MSVC 通常通过包装脚本(如 ar-lib、compile)调用。这些包装脚本让 MSVC 表现得更接近 Unix 编译器,简化构建流程并适配 Unix 中心化的工具链。
转换规则详情
- 库文件转换:将
libexample.lib这类 MSVC 库名转换为链接器友好的标志(添加-l前缀并移除扩展名),例如libexample.lib→-llibexample; - 标志处理:在编译器/链接器标志前添加转义字符(如
-Xcompiler、-Xlinker),例如-O2→-Xcompiler -O2。这些转义字符确保libtool等工具能正确处理含特殊字符/空格的标志。
设置 DISABLE_MSVC_TRANSFORMATIONS 后,会禁用上述默认转换,库文件和标志会以原始形式传递给 MSVC。
| 场景 | 示例(库文件) | 示例(编译标志) |
|---|---|---|
| 默认行为 | libexample.lib → -llibexample | -O2 → -Xcompiler -O2 |
| 禁用转换(本参数) | libexample.lib 保持不变 | -O2 保持不变 |
若通过
DISABLE_MSVC_WRAPPERS禁用了 MSVC 包装器,本参数(DISABLE_MSVC_TRANSFORMATIONS)将失效。
DISABLE_CPPFLAGS
禁用从 CFLAGS、CXXFLAGS 中提取预处理器标志(-D、-isystem)并移入 CPPFLAGS 的行为。
默认情况下,kmpkg_make_configure 会从 CFLAGS/CXXFLAGS 环境变量中提取预处理器相关标志,并存入 CPPFLAGS——这是因为 kmpkg 中预处理器标志通常通过 KMPKG_C_FLAGS、KMPKG_CXX_FLAGS 等编译器设置变量提供。
设置该参数后,预处理器标志会保留在 CFLAGS/CXXFLAGS 中,适用于那些不遵循标准环境变量规范、或有特殊预处理器需求的项目。
DISABLE_DEFAULT_OPTIONS
设置该标志会禁用 kmpkg_make_configure 提供的以下默认配置选项。仅当你需要完全掌控配置命令行、手动指定所有选项时才建议使用。
通用默认项
--disable-silent-rules:让构建过程输出更详细的日志;--verbose:启用配置脚本的详细输出。
库链接类型
- 动态库构建:
--enable-shared+--disable-static; - 静态库构建:
--disable-shared+--enable-static。
安装目录
调整标准安装目录以适配 kmpkg 的目录结构:
-
始终设置的目录:
--prefix:基础安装目录(会根据 Debug/Release 构建类型调整);--bindir:可执行程序的子目录;--sbindir:系统管理程序的子目录;--libdir:库文件(静态/动态)的子目录;--mandir:手册页(man files)的子目录;--docdir:文档的子目录;--datarootdir:架构无关数据的根目录。
-
仅 Debug 构建设置:
--includedir:头文件的子目录。
目录示例
-
Release 配置:
--prefix=${current_installed_dir}--bindir=${prefix}/tools/${PORT}/bin--sbindir=${prefix}/tools/${PORT}/sbin--libdir=${prefix}/lib--mandir=${prefix}/share/${PORT}--docdir=${prefix}/share/${PORT}--datarootdir=${prefix}/share/${PORT}
-
Debug 配置:
--prefix=${current_installed_dir}${path_suffix_DEBUG}--bindir=${prefix}/../tools/${PORT}${path_suffix_DEBUG}/bin--sbindir=${prefix}/../tools/${PORT}${path_suffix_DEBUG}/sbin--libdir=${prefix}/lib--includedir=${prefix}/../include--mandir=${prefix}/share/${PORT}--docdir=${prefix}/share/${PORT}--datarootdir=${prefix}/share/${PORT}
平台专属调整
-
Windows 系统:
- 设置
gl_cv_double_slash_root=yes,告知配置脚本当前运行在支持双斜杠开头路径(//)的 Windows 系统; - 设置
ac_cv_func_memmove=yes、ac_cv_func_memset=yes,标识系统支持memmove、memset函数; - ARM64 构建时设置
gl_cv_host_cpu_c_abi=no,标识编译器对浮点数未使用标准 C ABI。
- 设置
-
类 Unix 系统:
- 调整路径以匹配典型的 Unix 文件系统层级(如使用
/usr/local作为基准)。
- 调整路径以匹配典型的 Unix 文件系统层级(如使用
这些默认选项为大多数项目简化了配置流程。若需高度自定义构建,可设置
DISABLE_DEFAULT_OPTIONS并手动提供所有必要的配置选项。
OPTIONS
无论构建类型(Debug/Release),均传递给配置脚本的额外选项。用于指定项目所需的自定义标志或设置。
OPTIONS_RELEASE
仅在 Release 构建时传递给配置脚本的额外选项(会追加到 OPTIONS 之后)。
OPTIONS_DEBUG
仅在 Debug 构建时传递给配置脚本的额外选项(会追加到 OPTIONS 之后)。
PRE_CONFIGURE_CMAKE_COMMANDS
指定在每种构建类型的配置流程前执行的 CMake 命令列表。即:
- 若
KMPKG_BUILD_TYPE为空(默认):该命令会为 Debug、Release 各执行一次; - 若
KMPKG_BUILD_TYPE设为release:仅为 Release 执行一次。
可用于配置脚本所需的环境准备或构建前置操作。
若未设置
COPY_SOURCE,PRE_CONFIGURE_CMAKE_COMMANDS中的 CMake 命令会直接操作原始源码目录的文件。
示例
function(my_preconfigure_command SRC BUILD_TYPE)
# 为不同构建类型生成不同的 version.txt
if(BUILD_TYPE STREQUAL "release")
file(WRITE "${SRC}/version.txt" "This is a release version!")
else()
file(WRITE "${SRC}/version.txt" "This is a debug version!")
endif()
# 为不同构建类型设置不同的环境变量
set(ENV{SPECIAL} "${BUILD_TYPE} is magic")
endfunction()
kmpkg_make_configure(
# 其他参数...
PRE_CONFIGURE_CMAKE_COMMANDS my_preconfigure_command
)
上述示例中,my_preconfigure_command 会执行两次(若 KMPKG_BUILD_TYPE 未设置):
- Debug 构建:生成内容为 "This is a debug version!" 的
version.txt,并设置环境变量SPECIAL为 "Debug is magic"; - Release 构建:生成内容为 "This is a release version!" 的
version.txt,并设置环境变量SPECIAL为 "Release is magic"。
LANGUAGES
指定配置和构建过程中需要考虑的编程语言。
有效值包括:C、CXX、ASM、CUDA、Fortran、HIP、ISPC、Swift、OBJC、OBJCXX。
该参数会将指定的语言追加到 KMPKG_CMAKE_CONFIGURE_OPTIONS 中,格式为 -DKMPKG_LANGUAGES=<languages>。kmpkg_cmake_get_vars 会读取 KMPKG_CMAKE_CONFIGURE_OPTIONS 中的选项(包括 LANGUAGES),配置一个空的 CMake 项目并提取所需的 CMake 变量,最终将这些变量重新导出为 KMPKG_DETECTED_CMAKE_* 格式。
示例
kmpkg_make_configure(
SOURCE_PATH "/path/to/source"
LANGUAGES "C" "CXX" "Fortran"
)
完整示例
# 1. 获取源码
kmpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH
REPO example/examplelib
REF v1.2.3
SHA512 123456...
)
# 2. 配置 Make 项目
kmpkg_make_configure(
SOURCE_PATH ${SOURCE_PATH}
OPTIONS
--disable-silent-rules
--enable-foo # 自定义配置项
OPTIONS_DEBUG
--enable-debug-logs # 仅 Debug 构建启用调试日志
)
# 3. 安装项目
kmpkg_make_install()
备注
该命令替代了旧的 kmpkg_configure_make() 函数。