Docker 和 Conan 自动化多编译器打包器
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 系统,并自动将包上传到“稳定”通道。
我将尽快发布关于此新工具的更多文章。