conan.tools.files 补丁

conan.tools.files.patch()

patch(conanfile, base_path=None, patch_file=None, patch_string=None, strip=0, fuzz=False, **kwargs)

在 conanfile.source_folder 目录中应用来自文件 (patch_file) 或字符串 (patch_string) 的 diff。包含源代码的文件夹可以通过 layout(self) 方法中的 self.folders 属性进行自定义。

参数:
  • conanfile – 当前配方,始终传递 'self'

  • base_path – 除非提供绝对路径,否则路径相对于 conanfile.export_sources_folder。

  • patch_file – 应该应用的补丁文件。除非提供绝对路径,否则路径相对于 conanfile.source_folder。

  • patch_string – 应该应用的补丁字符串。

  • strip – 要从路径中剥离的文件夹数量。

  • fuzz – 是否应该接受模糊补丁。

  • kwargs – 可以添加的额外参数,并将有助于输出信息

用法

from conan.tools.files import patch

def build(self):
    for it in self.conan_data.get("patches", {}).get(self.version, []):
        patch(self, **it)

conan.tools.files.apply_conandata_patches()

apply_conandata_patches(conanfile)

应用存储在 conanfile.conan_data 中的补丁(从 conandata.yml 文件读取)。它将应用 patches 条目下所有与给定 conanfile.version 匹配的补丁。如果 conandata.yml 中未定义版本,它将直接应用 patches 关键字下的所有补丁。

键条目将作为 kwargs 传递给 patch 函数。

用法

from conan.tools.files import apply_conandata_patches

def build(self):
    apply_conandata_patches(self)

conandata.yml 示例

patches:
- patch_file: "patches/0001-buildflatbuffers-cmake.patch"
- patch_file: "patches/0002-implicit-copy-constructor.patch"
  base_path: "subfolder"
  patch_type: backport
  patch_source: https://github.com/google/flatbuffers/pull/5650
  patch_description: Needed to build with modern clang compilers.

不同版本的不同补丁

patches:
  "1.11.0":
    - patch_file: "patches/0001-buildflatbuffers-cmake.patch"
    - patch_file: "patches/0002-implicit-copy-constructor.patch"
      base_path: "subfolder"
      patch_type: backport
      patch_source: https://github.com/google/flatbuffers/pull/5650
      patch_description: Needed to build with modern clang compilers.
  "1.12.0":
    - patch_file: "patches/0001-buildflatbuffers-cmake.patch"
    - patch_string: |
        --- a/tests/misc-test.c
        +++ b/tests/misc-test.c
        @@ -1232,6 +1292,8 @@ main (int argc, char **argv)
              g_test_add_func ("/misc/pause-cancel", do_pause_cancel_test);
              g_test_add_data_func ("/misc/stealing/async", GINT_TO_POINTER (FALSE), do_stealing_test);
              g_test_add_data_func ("/misc/stealing/sync", GINT_TO_POINTER (TRUE), do_stealing_test);
        +     g_test_add_func ("/misc/response/informational/content-length", do_response_informational_content_length_test);
        +

        ret = g_test_run ();
    - patch_file: "patches/0003-fix-content-length-calculation.patch"

对于每个补丁,必须提供 patch_filepatch_stringpatch_user 字段。前两个由 apply_conandata_patches() 自动应用,而 patch_user 被忽略,必须由用户在 conanfile.py 配方中直接处理。

conan.tools.files.export_conandata_patches()

export_conandata_patches(conanfile)

导出存储在 'conanfile.conan_data' 中的补丁(从 'conandata.yml' 文件读取)。它将导出 'patches' 条目下所有与给定 'conanfile.version' 匹配的补丁。如果 'conandata.yml' 中未定义版本,它将导出 'patches' 关键字下所有补丁。

conandata.yml 示例,未定义版本

from conan.tools.files import export_conandata_patches
def export_sources(self):
    export_conandata_patches(self)