AutotoolsToolchain

AutotoolsToolchain 是 Autotools 的工具链生成器。它将生成包含环境变量定义的 shell 脚本,Autotools 构建系统可以理解这些脚本。

此生成器可在 conanfile 中通过名称使用

conanfile.py
class Pkg(ConanFile):
    generators = "AutotoolsToolchain"
conanfile.txt
[generators]
AutotoolsToolchain

它也可以在 conanfile 的 generate() 方法中完全实例化

from conan import ConanFile
from conan.tools.gnu import AutotoolsToolchain

class App(ConanFile):
    settings = "os", "arch", "compiler", "build_type"

    def generate(self):
        tc = AutotoolsToolchain(self)
        tc.generate()

生成的文件

它将生成 conanautotoolstoolchain.shconanautotoolstoolchain.bat 文件

$ conan install conanfile.py # default is Release
$ source conanautotoolstoolchain.sh
# or in Windows
$ conanautotoolstoolchain.bat

这些启动器将向 CPPFLAGS, LDFLAGS, CXXFLAGS, CFLAGS 环境变量追加信息,这些信息将设置和选项转换为相应的构建标志,例如 -stdlib=libstdc++, -std=gnu14, 架构标志等。它还将 Conan 生成器所在的文件夹追加到 PKG_CONFIG_PATH 环境变量。

Conan 2.4.0 起,在交叉构建的上下文中,如果构建配置文件在配置变量 tools.build:compiler_executables 中定义了 ccpp 的值,那么 CC_FOR_BUILDCXX_FOR_BUILD 环境变量也会被设置。更多信息请参阅 conf 部分

此生成器还将生成一个名为 conanbuild.conf 的文件,其中包含两个键

  • configure_args: 调用 configure 脚本的参数。

  • make_args: 调用 make 脚本的参数。

  • autoreconf_args: 调用 autoreconf 脚本的参数。

Autotools 构建助手将使用 conanbuild.conf 文件,通过这些预先计算好的参数无缝调用 configure 和 make 脚本。

自定义

如果您想更改预计算值的某些值,可以在调用 generate() 方法之前更改某些属性

from conan import ConanFile
from conan.tools.gnu import AutotoolsToolchain

class App(ConanFile):
    settings = "os", "arch", "compiler", "build_type"

    def generate(self):
        tc = AutotoolsToolchain(self)
        tc.configure_args.append("--my_argument")
        tc.generate()
  • configure_args: 传递给 configure 脚本的附加参数。
    • 默认情况下,将传递以下参数
      • --prefix: 默认值为 /

      • --bindir=${prefix}/bin

      • --sbindir=${prefix}/bin

      • --libdir=${prefix}/lib

      • --includedir=${prefix}/include

      • --oldincludedir=${prefix}/include

      • --datarootdir=${prefix}/res

    • 此外,如果 shared 选项存在,默认将添加
      • --enable-shared, --disable-static (如果 shared==True)

      • --disable-shared, --enable-static (如果 shared==False)

  • make_args (默认值 []): 传递给 make 脚本的附加参数。

  • autoreconf_args (默认值 ["--force", "--install"]): 传递给 make 脚本的附加参数。

  • extra_defines (默认值 []): 附加的宏定义。

  • extra_cxxflags (默认值 []): 附加的 cxxflags。

  • extra_cflags (默认值 []): 附加的 cflags。

  • extra_ldflags (默认值 []): 附加的 ldflags。

  • ndebug: 如果 settings.build_type != Debug,则为 “NDEBUG”。

  • gcc_cxx11_abi: 如果是 gcc/libstdc++,则为 “_GLIBCXX_USE_CXX11_ABI”。

  • libcxx: 从 settings.compiler.libcxx 计算的标志。

  • fpic: 如果定义了 options.fpic,则为 True/False。

  • cppstd: 从 settings.compiler.cppstd 计算的标志。

  • arch_flag: 从 settings.arch 计算的标志。

  • build_type_flags: 从 settings.build_type 计算的标志。

  • sysroot_flag: 将 --sysroot 标志传递给编译器。

  • apple_arch_flag: 仅在与 Apple 系统进行交叉构建时使用。来自 settings.arch 的标志。对于通用二进制文件,包含多个 -arch 标志。

  • apple_isysroot_flag: 仅在与 Apple 系统进行交叉构建时使用。sdk 的根目录路径。

  • msvc_runtime_flag: 当编译器是 msvc 时,来自 settings.compiler.runtime_type 的标志,或者在使用已弃用的 Visual Studio 时,来自 settings.compiler.runtime 的标志。

以下属性是只读的,它们将包含当前配置和自定义属性的计算值。有些配方可能需要读取它们来生成自定义构建文件(不严格是 Autotools)以及配置信息。

  • defines

  • cxxflags

  • cflags

  • ldflags

from conan import ConanFile
from conan.tools.gnu import AutotoolsToolchain

class App(ConanFile):
    settings = "os", "arch", "compiler", "build_type"
    def generate(self):
        tc = AutotoolsToolchain(self)
        # Customize the flags
        tc.extra_cxxflags = ["MyFlag"]
        # Read the computed flags and use them (write custom files etc)
        tc.defines
        tc.cxxflags
        tc.cflags
        tc.ldflags

如果您想更改 configure_args 的默认值,请在 layout() 方法中调整 cpp.package 对象。

def layout(self):
    ...
    # For bindir and sbindir takes the first value:
    self.cpp.package.bindirs = ["mybin"]
    # For libdir takes the first value:
    self.cpp.package.libdirs = ["mylib"]
    # For includedir and oldincludedir takes the first value:
    self.cpp.package.includedirs = ["myinclude"]
    # For datarootdir takes the first value:
    self.cpp.package.resdirs = ["myres"]

注意

package_info() 方法中更改 self.cpp_info 是 **无效** 的。

自定义环境

如果您的 Makefileconfigure 脚本需要 CPPFLAGS, LDFLAGS, CXXFLAGSCFLAGS 之外的其他环境变量,您可以在调用 generate() 方法之前自定义它。调用 environment() 方法来计算上述变量,然后添加您需要的变量。 environment() 方法返回一个 Environment 对象。

from conan import ConanFile
from conan.tools.gnu import AutotoolsToolchain

class App(ConanFile):
    settings = "os", "arch", "compiler", "build_type"

    def generate(self):
        at = AutotoolsToolchain(self)
        env = at.environment()
        env.define("FOO", "BAR")
        at.generate(env)

AutotoolsToolchain 还会读取配置文件中的 [conf] 部分来设置 CXXFLAGS, CFLAGS, LDFLAGSCPPFLAGS请参阅下面的 conf 参考

管理 configure_args, make_args 和 autoreconf_args 属性

AutotoolsToolchain 提供了一些辅助方法,用户可以添加/更新/删除 configure_args, make_argsautoreconf_args (它们都是字符串列表)。这些方法是:

  • update_configure_args(updated_flags): 将更改 AutotoolsToolchain.configure_args

  • update_make_args(updated_flags): 将更改 AutotoolsToolchain.make_args

  • update_autoreconf_args(updated_flags): 将更改 AutotoolsToolchain.autoreconf_args

其中 updated_flags 是一个类似字典的 Python 对象,定义了所有要更改的标志。它遵循以下规则:

  • 键值对是标志名称及其值,例如,{"--enable-tools": no} 将被翻译为 --enable-tools=no

  • 如果该键没有值,则为空字符串,例如 {"--disable-verbose": ""} 将被翻译为 --disable-verbose

  • 如果键的值为 None,则表示您想从 xxxxxx_args (请注意,它可以是 configure_args, make_argsautoreconf_args) 中移除该标志,例如 {"--force": None} 将从最终结果中移除该标志。

总而言之,您将

  • 添加参数: 如果 updated_flags 中给定的标志尚未存在于 xxxxxx_args 中。

  • 更新参数: 如果 updated_flags 中给定的标志已存在于属性 xxxxxx_args 中。

  • 移除参数: 如果 updated_flags 中给定的标志已存在于 xxxxxx_args 中,并且其值为 None

例如

from conan import ConanFile
from conan.tools.gnu import AutotoolsToolchain

class App(ConanFile):
    settings = "os", "arch", "compiler", "build_type"

    def generate(self):
        at = AutotoolsToolchain(self)
        at.update_configure_args({
            "--new-super-flag": "",  # add new flag '--new-super-flag'
            "--host": "my-gnu-triplet",  # update flag '--host=my-gnu-triplet'
            "--force": None  # remove existing '--force' flag
        })
        at.generate()

AutotoolsToolchain 将监听来自 global.conftools.gnu:extra_configure_args 来扩展 configure_args 属性。

macOS 通用二进制文件的支持

警告

此功能是实验性的,可能会发生重大更改。有关更多信息,请参阅 Conan 稳定性 部分。

从 Conan 2.21.0 开始,为使用 AutotoolsToolchain 在 macOS 上构建通用二进制文件提供了支持。要在 Conan 中指定通用二进制文件的多个架构,请在定义架构时使用 | 分隔符。此方法支持传递架构列表。例如,运行

conan create . --name=mylibrary --version=1.0 -s="arch=armv8|x86_64"

将为 mylibrary 创建一个包含 armv8x86_64 架构的通用二进制文件,通过在生成的工具链脚本中设置多个 -arch 标志。

警告

重要的是要注意,此方法不适用于 CMake 或 Autotools 以外的构建系统,也不适用于 CMakeToolchainAutotoolsToolchain

在非 Apple 平台上尝试使用通用架构设置将导致错误。

请注意,此功能主要用于构建最终的通用二进制文件以用于发布目的。Conan 默认的每个架构管理一个二进制文件的行为通常能提供更可靠、更少麻烦的体验。用户应谨慎使用此功能,不要过度依赖它以用于更广泛的用例。

参考

class AutotoolsToolchain(conanfile, namespace=None, prefix='/')
参数:
  • conanfile – 当前的配方对象。始终使用 self

  • namespace – 此参数可避免在同一配方中有多个工具链调用时发生冲突。通过设置此参数,用于将信息传递给构建助手的 conanbuild.conf 文件将命名为 <namespace>_conanbuild.conf。默认值是 None,这意味着生成的文件名是 conanbuild.conf。在 Autotools 构建助手的构造函数中也必须设置相同的命名空间值,以便它能从正确的文件读取信息。

  • prefix – 用于 --prefix 参数的文件夹(默认为 “/”)。

update_configure_args(updated_flags)

辅助方法,用于更新/删除 self.configure_args 中的标志。

参数:

updated_flags – 一个 dict,其中键是参数,值是参数值。请注意,如果参数值为 None,则该参数将被删除。

update_make_args(updated_flags)

辅助方法,用于更新/删除 self.make_args 中的参数。

参数:

updated_flags – 一个 dict,其中键是参数,值是参数值。请注意,如果参数值为 None,则该参数将被删除。

update_autoreconf_args(updated_flags)

辅助方法,用于更新/删除 self.autoreconf_args 中的参数。

参数:

updated_flags – 一个 dict,其中键是参数,值是参数值。请注意,如果参数值为 None,则该参数将被删除。

conf

  • tools.build:cxxflags:将由 CXXFLAGS 使用的额外 C++ 标志列表。

  • tools.build:cflags:将由 CFLAGS 使用的纯 C 标志列表。

  • tools.build:sharedlinkflags:将由 LDFLAGS 使用的额外链接器标志列表。

  • tools.build:exelinkflags:将由 LDFLAGS 使用的额外链接器标志列表。

  • tools.build:defines:将由 CPPFLAGS 使用的预处理器定义列表。

  • tools.build:linker_scripts:链接器脚本列表,每个脚本都将以 -T 为前缀并添加到 LDFLAGS。仅当链接器支持使用 -T 标志指定链接器脚本时才使用此标志,例如 ld, gold, 和 lld

  • tools.build:sysroot:定义传递给编译器的 --sysroot 标志。

  • tools.android:ndk_path(*Conan 2.5.0 起新增*):在 Android 交叉编译情况下 NDK 路径的参数。它用于设置一些环境变量,如 CC, CXX, LD, STRIP, RANLIB, AS, AR,以及(*Conan 2.11.0 起*)ADDR2LINE, NM, OBJCOPY, OBJDUMP, READELF, 和 ELFEDITconanautotoolstoolchain.sh|bat 脚本中,只要它们还没有在 buildenv 环境中定义。如果它们已在 buildenv 环境中定义,则 conanautotoolstoolchain 文件将不会定义它们,而是将它们的定义留给 VirtualBuildEnv 生成器。

  • tools.build:compiler_executables 一个类似字典的 Python 对象,其中编译器作为键,编译器可执行文件路径作为值。这些键将映射如下

  • tools.gnu:extra_configure_args:用于扩展 AutotoolsToolchainconfigure_args 属性的参数列表。

    • c:将在 conanautotoolstoolchain.sh|bat 脚本中设置 CC(以及在交叉构建时设置 CC_FOR_BUILD)。

    • cpp:将在 conanautotoolstoolchain.sh|bat 脚本中设置 CXX(以及在交叉构建时设置 CXX_FOR_BUILD)。

    • rc:将在 conanautotoolstoolchain.sh|bat 脚本中设置 RC

    • cuda:将在 conanautotoolstoolchain.sh|bat 脚本中设置 NVCC

    • fortran:将在 conanautotoolstoolchain.sh|bat 脚本中设置 FC

注意

标志优先级顺序:在 tools.build 配置中指定的标志,例如 cxxflags, cflags, sharedlinkflags, exelinkflags, and defines,将始终优先于 AutotoolsToolchain 属性设置的标志。