AutotoolsToolchain¶
AutotoolsToolchain
是 Autotools 的工具链生成器。它将生成包含环境变量定义的 shell 脚本,Autotools 构建系统可以理解这些脚本。
此生成器可在 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: 如果
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 是 **无效** 的。
自定义环境¶
如果您的 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 中指定通用二进制文件的多个架构,请在定义架构时使用 | 分隔符。此方法支持传递架构列表。例如,运行
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, and defines,将始终优先于 AutotoolsToolchain 属性设置的标志。