元构建工具,可同时处理多个交叉构建
Metabuild tool to handle multiple cross-builds simultaneously
我有一个中型C++项目,运行在Linux,Windows和Mac OS X上,包括32位和64位。在某些平台上,它有多个变体(例如Linux上的Gtk-2和Gtk-3变体)。作为一个业余程序员,我没有为每个平台提供专用构建机器的资源。所以我为每个版本安装了交叉编译器,以便所有构建都在我的 Linux 机器上进行。
我希望能够使用一个命令构建所有十个左右的变体。现在我用一个快速而肮脏的 Python 脚本来实现这一点,该脚本创建了一个 makefile(实际上我最近切换到了忍者,但我想它不是很相关)。它为每个变体创建Windows安装程序,Debian软件包等等。但我想要一个更干净的解决方案,因为我的脚本不会随着项目的增长而很好地扩展。
所以我的问题是:哪些元构建工具能够创建单个 Makefile(或类似的,如 ninja 构建文件),可以处理多个工具包(交叉编译器)和自定义命令(创建安装程序等)?
我尝试了CMake(和其他一些),但对我来说如何使用多个工具包并不明显。大多数工具似乎为每个配置创建一个生成文件。
编辑:现在,这个答案声称这是不可能的。我不明白为什么。如果我可以用我的 15 分钟 python 脚本来做到这一点,我觉得一定有一个工具能够为我做到这一点。
您可以使用 Toolschains 和 ExternalProject 通过 CMake 获得此行为。不同的生成文件仍将在后台创建,但这不会影响用户或项目的可伸缩性。
首先,您需要将项目转换为 CMake 项目,其中包含在CMakeLists.txt
文件中的所有不同平台上构建所需的所有 ifs 和其他内容。
您可以创建一组工具链文件,例如名为<target>.toolchain
和交叉构建CMakeLists.txt
,其中完成了所有魔术:
cmake_minimum_required(VERSION 3.0.2)
project(cross-build-project)
include(ExternalProject)
set(project_dir <path to your CMake project>)
set(targets_dir ${CMAKE_SOURCE_DIR}/targets)
function(add_target target_toolchain)
get_filename_component(target_name ${target_toolchain} NAME_WE)
ExternalProject_Add(
${target_name}
PREFIX ${targets_dir}/${target_name}
SOURCE_DIR ${project_dir}
CMAKE_ARGS -DTOOLCHAIN_FILE=${target_toolchain}
BINARY_DIR ${targets_dir}/${target_name}
)
endfunction(add_target)
file(GLOB toolchains "*.toolchain")
foreach(toolchain ${toolchains})
add_target(${toolchain})
endforeach()
这应该提供一个平台,可以根据您的特定需求进行调整,并随项目很好地扩展。
- 构建wxWidgets后该如何处理
- 在发布模式下使用 VS2017 在C++发布模式下构建的应用不会在未经处理的异常时中断
- 在使用Bazel Build构建项目期间,处理/选择界面的不同实现
- 预处理之后和使用CMake编译之前的自定义构建步骤
- Linux上的静态Qt5构建:部署时如何处理字体
- 元构建工具,可同时处理多个交叉构建
- 构建 MuPDF 并注册文档处理程序
- 在类中构建数组和未经处理的异常
- 如何处理具有完全不同的构建系统的第三方库
- 使用批处理文件使用 Cmake & Msbuild (vs2010) 一键构建我的项目
- 多处理Microsoft接口定义语言(.idl)的构建
- 使用可重写的处理程序函数构建类层次结构
- SFML构建所有批处理文件
- 如何处理由于项目中涉及的库的不同构建标志而出现的当前堆错误(在调试模式下)
- 在使用Rcpp构建包时处理修饰的外部二进制文件
- 如何为自定义文件格式构建筛选器处理程序,以便可以通过windows搜索来搜索其内容
- 如何处理构建谷歌测试执行文件的自动工具
- 在构建c++字符串时如何处理未终止字符数组
- 在VS2010中使用发布配置构建时未分配处理的值
- 如何处理和包含头文件和库,以便在不同的机器上构建Visual Studio 2010解决方案