vcpkg_make_configure

配置基于生成的项目。

用法

vcpkg_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>...]
)

若要使用此函数,必须依赖于帮助程序端口 vcpkg-make

"dependencies": [
  {
    "name": "vcpkg-make",
    "host": true
  }
]

参数

SOURCE_PATH

包含项目的源文件的目录。

此值通常是由于调用源获取命令(如 vcpkg_from_github())而获取的。

AUTORECONF

设置时运行 autoreconf

COPY_SOURCE

如果指定,则源目录将在配置过程开始之前复制到生成目录。 适用于在配置或生成期间修改源树的项目。

DISABLE_MSVC_WRAPPERS

默认情况下,vcpkg_make_configure 提供包装器,这些包装器将“Unix/GCC-style”标志重新排序为“MSVC 样式”标志。 这适用于假定 Unix 或 GCC 约定的生成系统。

设置 DISABLE_MSVC_WRAPPERS 会禁用标志转换,从而允许 clwindres 等工具在不修改的情况下接收命令行标志。

DISABLE_MSVC_TRANSFORMATIONS

默认情况下,使用 MSVC时,库和标志将转换为适合 Unix 样式约定。 这是与基于 Unix 的生成工具(如 libtool)兼容所必需的,因为 MSVC 是通过跨平台环境中的包装器调用的。 这些包装器(如 ar-libcompile 脚本)可确保 MSVC 的行为更像 Unix 编译器,简化生成过程,使其与以 Unix 为中心的工具兼容。

库转换:

  • libexample.lib 等库通过添加 -l 前缀和剥离扩展(例如,libexample.lib 变为 -llibexample)来转换为链接器友好的标志。

标志处理:

  • 转义字符(如 -Xcompiler-Xlinker)在编译器和链接器标志(例如,-O2 变为 -Xcompiler -O2)之前添加。 这些转义字符可确保使用 libtool等工具正确处理,否则这些工具可能会错误解释包含特殊字符或空格的标志。

设置 DISABLE_MSVC_TRANSFORMATIONS 时,将禁用默认转换,库和标志以原始形式传递到 MSVC。

示例(默认行为):

libexample.lib  →  -llibexample
-O2             →  -Xcompiler -O2

示例(DISABLE_MSVC_TRANSFORMATIONS):

libexample.lib  →  libexample.lib
-O2             →  -O2

注意

如果使用 DISABLE_MSVC_WRAPPERS禁用 MSVC 包装器,则此选项(DISABLE_MSVC_TRANSFORMATIONS)不起作用。

DISABLE_CPPFLAGS

禁用从 CFLAGSCXXFLAGS 提取 C 预处理器标志(-D-isystem)到 CPPFLAGS

默认情况下,vcpkg_make_configure 将预处理器相关标志从 CFLAGSCXXFLAGS 环境变量提取到 CPPFLAGS,因为 vcpkg 中的预处理器标志通常通过编译器设置变量(如 VCPKG_C_FLAGSVCPKG_CXX_FLAGS)提供。

设置 DISABLE_CPPFLAGS 将禁用该行为,在 CFLAGSCXXFLAGS中保留预处理器相关标志。

这对于不使用标准环境变量或具有特定预处理器要求的项目非常有用。

DISABLE_DEFAULT_OPTIONS

设置此标志将禁用 vcpkg_make_configure提供的以下默认配置选项。 仅当需要完全控制配置命令行并且想要手动指定所有选项时,才使用此标志。

常规默认值:

  • --disable-silent-rules - 使生成进程输出更加详细。
  • --verbose - 启用配置脚本的详细输出。

库链接:

  • 对于动态库生成:--enable-shared 和 --disable-static
  • 对于静态库内部版本:--disable-shared 和 --enable-static

安装目录:

  • 调整标准目录(bin、lib、share 等),使其符合 vcpkg 的布局。

  • 始终设置:

    • --prefix:每个生成类型(发布或调试)调整的基本安装目录。
    • --bindir:可执行文件的前缀下的子目录
    • --sbindir:系统管理程序的前缀下的子目录
    • --libdir:库前缀下的子目录(共享或静态)
    • --mandir:手动页面前缀下的子目录(man 文件)
    • --docdir:文档前缀下的子目录
    • --datarootdir:独立于体系结构的数据前缀下的子目录
  • 仅调试生成:

    • --includedir:标头文件的前缀下的子目录

示例路径:

  • 发布配置:

    • --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}
  • 调试配置:

    • --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}

Platform-Specific 调整:

  • 在 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_RELEASE

仅在发布生成期间传递给配置脚本的其他选项。 使用这些标记可以指定项目所需的任何自定义标志或设置。 这些是除了 OPTIONS

OPTIONS_DEBUG

仅在调试生成期间传递给配置脚本的其他选项。 使用这些标记可以指定项目所需的任何自定义标志或设置。 这些是除了 OPTIONS

PRE_CONFIGURE_CMAKE_COMMANDS

指定要在每个生成类型配置过程之前执行的 CMake 命令的列表。 也就是说,如果 VCPKG_BUILD_TYPE 为空(默认值),这些命令将运行一次进行调试,一次用于发布。 如果 VCPKG_BUILD_TYPErelease,则这些命令仅在发布时运行一次。 这可用于设置环境,或以配置脚本所需的方式准备生成。

注意

如果未设置 COPY_SOURCE 选项,PRE_CONFIGURE_CMAKE_COMMANDS 中的 CMake 命令直接对原始源目录中的文件进行操作。

function(my_preconfigure_command SRC BUILD_TYPE)
    # Each source directory gets different version.txt files
    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()
    # The environment variable has different values for each configuration
    set(ENV{SPECIAL} "${BUILD_TYPE} is magic")
endfunction()

vcpkg_make_configure(
    # ...
    PRE_CONFIGURE_CMAKE_COMMANDS my_preconfigure_command
)

在此示例中,my_preconfigure_command 执行两次(如果未设置 VCPKG_BUILD_TYPE,则为“调试”和“发布”):

调试生成:使用内容“这是调试版本!”创建 version.txt,并将环境变量 SPECIAL 设置为“调试是神奇的”。

发布版本:使用内容“这是发布版本!”创建 version.txt,并将环境变量 SPECIAL 设置为“Release is magic”。

语言

LANGUAGES 参数指定要在配置和生成过程中考虑的编程语言。

有效值为 CCXXASMCUDAFortranHIPISPCSwiftOBJCOBJCXX

将指定语言追加到 VCPKG_CMAKE_CONFIGURE_OPTIONS-DVCPKG_LANGUAGES=<languages>vcpkg_cmake_get_vars 使用存储在 VCPKG_CMAKE_CONFIGURE_OPTIONS中的选项(包括 LANGUAGES 参数)来配置虚拟 CMake 项目并提取必要的 CMake 变量。 LANGUAGES 参数会影响 vcpkg_cmake_get_vars中使用的虚拟 CMake 项目的配置。 该配置提取指定语言的相关 CMake 变量,并将其重新导出为 VCPKG_DETECTED_CMAKE_*

vcpkg_make_configure(
    SOURCE_PATH "/path/to/source"
    LANGUAGES "C" "CXX" "Fortran"
)

例子

vcpkg_from_github(
    OUT_SOURCE_PATH SOURCE_PATH
    REPO example/examplelib
    REF v1.2.3
    SHA512 123456...
)

vcpkg_make_configure(
    SOURCE_PATH ${SOURCE_PATH}
    OPTIONS
        --disable-silent-rules
        --enable-foo
    OPTIONS_DEBUG
        --enable-debug-logs
)

vcpkg_make_install()

言论

此命令替换 vcpkg_configure_make()