AutotoolsToolchain

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

此生成器可以在 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

这些启动器会将信息附加到 CPPFLAGSLDFLAGSCXXFLAGSCFLAGS 环境变量中,这些变量将设置和选项转换为相应的构建标志,如 -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 获取的标志。

  • apple_isysroot_flag:仅当与 Apple 系统进行交叉构建时。到根 sdk 的路径。

  • msvc_runtime_flag:当编译器为 msvc 时,从 settings.compiler.runtime_type 获取的标志;或者当使用已弃用的 Visual Studio 时,从 settings.compiler.runtime 获取的标志。

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

  • 定义

  • 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 脚本需要除 CPPFLAGSLDFLAGSCXXFLAGSCFLAGS 之外的其他环境变量,您可以在调用 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] 部分的变量来设置 CXXFLAGSCFLAGSLDFLAGSCPPFLAGS请参阅下面的 conf 参考

管理 configure_args、make_args 和 autoreconf_args 属性

AutotoolsToolchain 提供了一些辅助方法,使用户可以添加/更新/删除在 configure_argsmake_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_argsmake_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()

参考

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

  • **namespace** – 当您在同一个 recipe 中多次调用工具链时,此参数可避免冲突。通过设置此参数,用于将信息传递给构建助手的 *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 标志指定链接器脚本的链接器(例如 ldgoldlld)中使用此标志。

  • tools.build:sysroot 为编译器定义 --sysroot 标志。

  • tools.android:ndk_path (Conan 2.5.0 版本新增) 用于 Android 交叉编译的 NDK 路径的参数。它用于设置一些环境变量,如 *conanautotoolstoolchain.sh|bat* 脚本中的 CCCXXLDSTRIPRANLIBASAR,以及自 *Conan 2.11.0* 起的 ADDR2LINENMOBJCOPYOBJDUMPREADELFELFEDIT,只要它们尚未在 buildenv 环境中定义。如果它们在 buildenv 环境中定义,则 *conanautotoolstoolchain* 文件将不会定义它们,而是将它们的定义留给 VirtualBuildEnv 生成器。

  • tools.build:compiler_executables 类似字典的 Python 对象,它将编译器指定为键,将编译器可执行路径指定为值。这些键将按如下方式映射

    • 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 配置中指定的标志,如 cxxflagscflagssharedlinkflagsexelinkflagsdefines,将始终优先于由 AutotoolsToolchain 属性设置的标志。