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时,来自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 是一个类似 dict 的 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 中指定多个架构以创建通用二进制文件,请在定义架构时使用 | 分隔符。此方法允许传递一个架构列表。例如,运行
conan create . --name=mylibrary --version=1.0 -s="arch=armv8|x86_64"
将为 mylibrary 创建一个通用二进制文件,其中包含 armv8 和 x86_64 架构,方法是在生成的工具链脚本中设置多个 -arch 标志。
警告
重要的是要注意,此方法不适用于 CMake 或 Autotools 以外的构建系统,通过 CMakeToolchain 和 AutotoolsToolchain。
在非 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 属性设置的标志。