AutotoolsToolchain¶
AutotoolsToolchain 是 Autotools 的工具链生成器。它将生成包含 Autotools 构建系统可以理解的环境变量定义的 shell 脚本。
此生成器可在 conanfile 中通过名称使用
class Pkg(ConanFile):
generators = "AutotoolsToolchain"
[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.sh 或 conanautotoolstoolchain.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 中定义了 c 和 cpp 值,则环境变量 CC_FOR_BUILD 和 CXX_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:“NDEBUG”,如果
settings.build_type!= Debug。gcc_cxx11_abi:“_GLIBCXX_USE_CXX11_ABI”,如果
gcc/libstdc++。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或使用已弃用的Visual Studio时,来自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 是**无效的**。
自定义环境¶
如果您的 Makefile 或 configure 脚本需要其他环境变量,而不仅仅是 CPPFLAGS、LDFLAGS、CXXFLAGS 或 CFLAGS,您可以在调用 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、LDFLAGS 和 CPPFLAGS。请参阅下面的 conf 参考。
管理 configure_args、make_args 和 autoreconf_args 属性¶
AutotoolsToolchain 提供了一些帮助方法,以便用户可以添加/更新/删除在 configure_args、make_args 和 autoreconf_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_args或autoreconf_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.conf 的 tools.gnu:extra_configure_args 以扩展 configure_args 属性。
macOS 中通用二进制文件的支持¶
警告
此功能是实验性的,可能会发生重大更改。有关更多信息,请参阅 Conan 稳定性 部分。
从 Conan 2.21.0 开始,支持使用 AutotoolsToolchain 在 macOS 上构建通用二进制文件。要在 Conan 中指定通用二进制文件的多个架构,请在 settings 中定义架构时使用 | 分隔符。这种方法可以传递一个架构列表。例如,运行
conan create . --name=mylibrary --version=1.0 -s="arch=armv8|x86_64"
将为 mylibrary 创建一个通用二进制文件,其中包含 armv8 和 x86_64 架构,方法是在生成的工具链脚本中设置多个 -arch 标志。
警告
重要的是要注意,此方法不适用于 CMake 或通过 CMakeToolchain 和 AutotoolsToolchain 的 Autotools 等其他构建系统。
尝试在非 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和ELFEDIT,在 conanautotoolstoolchain.sh|bat 脚本中,只要它们未在buildenv环境中定义。如果它们在buildenv环境中定义,则conanautotoolstoolchain文件将不会定义它们,将它们的定义留给VirtualBuildEnv生成器。tools.build:compiler_executables一个类似字典的 Python 对象,其中编译器作为键,编译器可执行文件路径作为值。这些键将映射如下tools.gnu:extra_configure_args用于扩展AutotoolsToolchain的configure_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 和 defines,将始终优先于 AutotoolsToolchain 属性设置的标志。