使用 Autotools 创建您的第一个 Conan 包

警告

此示例仅适用于 Linux 和 OSX 环境,并且不直接支持 Windows,包括 msys2/cygwin 子系统。但是,Windows Subsystem for Linux (WSL) 应该可以工作,因为它提供了 Linux 环境。虽然 Conan 为在带有 Autotools 的 Windows 环境中提供一定程度的支持而提供了 win_bash = True,但这在本教程中不适用。

创建您的第一个 Conan 包教程 中,CMake 被用作构建系统。如果您尚未阅读该部分,请先阅读它以熟悉 conanfile.pytest_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 环境脚本,定义诸如 CXXFLAGSLDFLAGS 之类的环境变量,这些变量将由 Makefiles 使用,以将 Conan 输入设置映射到编译标志。如果项目有带有 Conan requires 的依赖项,则它也应添加 PkgConfigDeps

  • build() 方法使用 Autotools() 辅助程序来驱动构建,调用不同的配置和构建步骤。

  • package() 方法使用 Autotools 安装功能来定义最终工件并将其复制到包文件夹。请注意,模板还包括对 fix_apple_shared_install_name() 的调用,该调用使用 OSX install_name_tool 实用程序来设置 @rpath``to fix the ``LC_ID_DYLIBLC_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

另请参阅