跳到主要内容

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 会禁用该标志转换逻辑,让 clwindres 等工具直接接收未经修改的命令行标志。

DISABLE_MSVC_TRANSFORMATIONS

默认情况下,使用 MSVC 编译器时,库文件和编译/链接标志会被转换为符合 Unix 风格的格式——这是为了兼容 libtool 等 Unix 系构建工具,同时也是因为跨平台环境下 MSVC 通常通过包装脚本(如 ar-libcompile)调用。这些包装脚本让 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

禁用从 CFLAGSCXXFLAGS 中提取预处理器标志(-D-isystem)并移入 CPPFLAGS 的行为。

默认情况下,kmpkg_make_configure 会从 CFLAGS/CXXFLAGS 环境变量中提取预处理器相关标志,并存入 CPPFLAGS——这是因为 kmpkg 中预处理器标志通常通过 KMPKG_C_FLAGSKMPKG_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=yesac_cv_func_memset=yes,标识系统支持 memmovememset 函数;
    • ARM64 构建时设置 gl_cv_host_cpu_c_abi=no,标识编译器对浮点数未使用标准 C ABI。
  • 类 Unix 系统:

    • 调整路径以匹配典型的 Unix 文件系统层级(如使用 /usr/local 作为基准)。
信息

这些默认选项为大多数项目简化了配置流程。若需高度自定义构建,可设置 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_SOURCEPRE_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

指定配置和构建过程中需要考虑的编程语言。

有效值包括:CCXXASMCUDAFortranHIPISPCSwiftOBJCOBJCXX

该参数会将指定的语言追加到 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() 函数。