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:如果
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 是无效的。
自定义环境¶
如果您的 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()
参考¶
- 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
标志指定链接器脚本的链接器(例如ld
、gold
和lld
)中使用此标志。tools.build:sysroot
为编译器定义--sysroot
标志。tools.android:ndk_path
(Conan 2.5.0 版本新增) 用于 Android 交叉编译的 NDK 路径的参数。它用于设置一些环境变量,如 *conanautotoolstoolchain.sh|bat* 脚本中的CC
、CXX
、LD
、STRIP
、RANLIB
、AS
、AR
,以及自 *Conan 2.11.0* 起的ADDR2LINE
、NM
、OBJCOPY
、OBJDUMP
、READELF
和ELFEDIT
,只要它们尚未在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 配置中指定的标志,如 cxxflags、 cflags、 sharedlinkflags、 exelinkflags 和 defines,将始终优先于由 AutotoolsToolchain 属性设置的标志。