使用 Autotools 创建你的第一个 Conan 包¶
警告
此示例仅适用于 Linux 和 OSX 环境,并且不直接支持 Windows,包括 msys2/cygwin 子系统。但是,Windows Subsystem for Linux (WSL) 应该可以工作,因为它提供了一个 Linux 环境。虽然 Conan 为在 Windows 环境中使用 Autotools 提供了一些程度的支持,通过 win_bash = True,但这在本教程中不适用。
在 创建你的第一个 Conan 包教程 中,CMake 被用作构建系统。如果你还没有阅读该部分,请先阅读它以熟悉 conanfile.py
和 test_package
的概念,然后再回来阅读关于 Autotools
包创建的具体细节。
使用 conan new 命令创建一个 “Hello World” C++ 库示例项目
$ conan new autotools_lib -d name=hello -d version=0.1
这将创建一个具有以下结构的 Conan 包项目。
├── conanfile.py
├── configure.ac
├── Makefile.am
├── src
│ ├── hello.h
│ ├── hello.cpp
│ └── Makefile.am
└── test_package
├── conanfile.py
├── configure.ac
├── mainc.pp
└── Makefile.am
结构和文件与之前的 CMake 示例非常相似
conanfile.py: 在根文件夹中,有一个 conanfile.py,它是主要的配方文件,负责定义如何构建和使用包。
configure.ac: 一个 autotools 配置文件,其中包含必要的宏并引用配置所需的
Makefiles
。Makefile.am: 一个 Makefile 配置文件,仅定义
SUBDIRS = src
src 文件夹:包含简单的 C++ “hello” 库的文件夹。
src/Makefile.am: Makefile 配置文件,包含库定义和源文件,例如
libhello_la_SOURCES = hello.cpp hello.h
test_package 文件夹:包含一个 example 应用程序,该应用程序将需要并链接到创建的包。在这种情况下,
test_package
也包含一个 autotools 项目,但如果需要,test_package
也可以使用其他构建系统,如 CMake。test_package 不强制要求使用与包相同的构建系统。
让我们看一下包配方 conanfile.py (仅相关的新的部分)
exports_sources = "configure.ac", "Makefile.am", "src/*"
def layout(self):
basic_layout(self)
def generate(self):
at_toolchain = AutotoolsToolchain(self)
at_toolchain.generate()
def build(self):
autotools = Autotools(self)
autotools.autoreconf()
autotools.configure()
autotools.make()
def package(self):
autotools = Autotools(self)
autotools.install()
fix_apple_shared_install_name(self)
让我们简要解释一下配方的不同部分
layout()
定义了一个basic_layout()
,它不如 CMake 的灵活,因此不允许任何参数化。generate()
方法调用AutotoolsToolchain
,它可以生成一个conanautotoolstoolchain
环境变量脚本,定义环境变量,如CXXFLAGS
或LDFLAGS
,这些变量将被Makefiles
使用,以将 Conan 输入设置映射到编译标志。如果项目有 Conanrequires
的依赖项,则应同时添加PkgConfigDeps
build()
方法使用Autotools()
助手来驱动构建,调用不同的配置和构建步骤。package()
方法使用Autotools
安装功能来定义最终工件并将其复制到包文件夹。请注意,模板还包括对fix_apple_shared_install_name()
的调用,该调用使用 OSX install_name_tool 实用程序来设置@rpath``to fix the ``LC_ID_DYLIB
和LC_LOAD_DYLIB
字段在 Apple dylibs 上,因为 autotools 项目通常不会设法做到这一点(CMake 可以做到)。
让我们使用当前的默认配置从源代码构建包,然后让 test_package
文件夹测试该包
$ conan create .
...
======== Testing the package: Executing test ========
hello/0.1 (test package): Running test()
hello/0.1 (test package): RUN: ./main
hello/0.1: Hello World Release!
hello/0.1: __x86_64__ defined
hello/0.1: _GLIBCXX_USE_CXX11_ABI 1
hello/0.1: __cplusplus201703
hello/0.1: __GNUC__11
hello/0.1: __GNUC_MINOR__1
hello/0.1 test_package
我们现在可以验证配方和包二进制文件是否在缓存中
$ conan list "hello/1.0:*"
Local Cache:
hello
hello/1.0
revisions
5b151b3f08144bf25131266eb306ddff (2024-03-06 12:03:52 UTC)
packages
8631cf963dbbb4d7a378a64a6fd1dc57558bc2fe
info
settings
arch: x86_64
build_type: Release
compiler: gcc
compiler.cppstd: gnu17
compiler.libcxx: libstdc++11
compiler.version: 11
os: Linux
options
fPIC: True
shared: False
另请参阅