Conan 可以自动化使用任何已安装编译器的包创建过程。在Windows中,拥有两个或更多Visual Studio版本非常常见,像 CMake 这样的工具只会使用用户指定的 Visual Studio 版本。

在 Linux 中,安装多个版本的 gcc 可能比较棘手,当然这是可能的,但不像 Windows 中的 Visual Studio 版本那样简单。除此之外,我们的开发机器通常安装了许多其他开发人员可能没有的库,这可能会隐藏我们真正的需求。

因此,Docker 将帮助我们创建具有不同编译器的干净构建环境。

如果您阅读了自动创建和测试包,您会看到可以使用conan test 命令和类似这样的简单脚本测试您的 Conan 包

build.py

       ...
       system('conan test -s arch="x86" -s build_type="Release" -o mylib:shared=True')
       system('conan test -s arch="x86_64" -s build_type="Release" -o mylib:shared=True')
       system('conan test -s arch="x86" -s build_type="Debug" -o mylib:shared=True')
       system('conan test -s arch="x86_64" -s build_type="Debug" -o mylib:shared=True')
       system('conan test -s arch="x86" -s build_type="Release" -o mylib:shared=False')
       system('conan test -s arch="x86_64" -s build_type="Release" -o mylib:shared=False')
       system('conan test -s arch="x86" -s build_type="Debug" -o mylib:shared=False')
       system('conan test -s arch="x86_64" -s build_type="Debug" -o mylib:shared=False')
       ...

我认为如果我可以为我想要的每个 gcc 版本执行上述构建,那就太好了。

我为不同的 gcc 版本准备了一些Dockerfile。我使用了官方的 Ubuntu 发行版。

镜像 gcc
ubuntu:precise 4.6
ubuntu:trusty 4.8
ubuntu:vivid 4.9
ubuntu:wily 5.2
ubuntu:xenial 5.3

然后我将这些镜像上传到了我的Dockerhub 账户

请记住,从自动创建和测试包文档中,您的 Conan 包布局可能是

+-- test
|   +-- conanfile.py
|   +-- test.cpp
|   +-- CMakeLists.txt
+-- conanfile.py
+-- build.py

此脚本将为每个 gcc 版本运行一个 Docker 容器,并在容器内运行build.py脚本。

import os
import platform
import sys

if __name__ == "__main__":

    for gcc_version in ["4.6", "4.8", "4.9", "5.2", "5.3"]:
        image_name = "lasote/conangcc%s" % gcc_version.replace(".", "")
        os.system("sudo docker pull %s" % image_name)
        curdir = os.path.abspath(os.path.curdir)
        command = 'sudo docker run --rm  -v %s:/home/conan/project -v '\
                  '~/.conan/data:/home/conan/.conan/data -it %s /bin/sh -c '\
                  '"cd project && python build.py"' % (curdir, image_name)
        os.system(command)

在每个容器中,Conan 将检测正确的编译器和编译器版本。您的主机计算机 Conan 本地存储目录~/.conan/data是共享的,因此容器将把结果写入同一位置。

完成后,我可以将生成的包上传到conan.io并使其供社区使用。

	conan upload mypackage/myversion@lasote/stable --all

此 Docker 集成还可以轻松处理其他编译器(如 clang)和其他版本。

目前,此脚本由一个新工具conan package tools管理,该工具提供了 CI(travis & appveyor)轻松集成,用于远程和自动包生成(即使在 travis ci 中使用 docker),分页,Visual Studio 环境配置和其他功能。

对于希望自动分发库二进制文件的库作者来说,此工具非常有用。作者可以“推送到主分支”以触发 CI 系统,并自动将包上传到“稳定”通道。

我将尽快发布关于此新工具的更多文章。