【问题标题】:Metabuild tool to handle multiple cross-builds simultaneouslyMetabuild 工具可同时处理多个交叉构建
【发布时间】:2015-03-08 10:45:58
【问题描述】:

我有一个中型 C++ 项目,可以在 32 位和 64 位的 Linux、Windows 和 Mac OS X 上运行。在某些平台上,它有多个变体(例如 Linux 上的 Gtk-2 和 Gtk-3 变体)。作为一个业余程序员,我没有为每个平台专门构建机器的资源。所以我为每一个都安装了交叉编译器,这样所有的构建都在我的 Linux 机器上进行。

我希望能够用一个命令构建所有十个左右的变体。现在我通过一个快速而肮脏的 Python 脚本来创建一个 makefile 来实现这一点(实际上我最近切换到了 ninja,但我猜它不是很相关)。它为每个变体创建 Windows 安装程序、Debian 包和诸如此类的东西。但我想要一个更简洁的解决方案,因为我的脚本不会随着项目的增长而很好地扩展。

所以我的问题是:哪些元构建工具能够创建一个可以处理多个工具包(交叉编译器)和自定义命令(创建安装程序等)的 Makefile(或类似的,如忍者构建文件)? )?

我尝试过 CMake(和其他一些),但对我来说如何使用多个工具包并不明显。大多数工具似乎为每个配置创建一个 Makefile。

编辑:现在,this 回答声称这是不可能的。我不明白为什么。如果我能用我 15 分钟的 Python 脚本来完成它,我觉得一定有一个工具能够为我完成它。

【问题讨论】:

  • 你让我思考它,但我从来不需要这样的工具,我现在正在做一些搜索。分享一下我的想法,也许制作脚本只需要 15 分钟的事实是缺乏这种工具的原因。我认为准备适用于所有内容的东西会花费大量时间,因为您需要使用单个脚本来完成。一个可能很有趣:bakefile.org
  • Cmake 是我害怕的方式

标签: c++ build cross-build


【解决方案1】:

您可以通过 CMake 获得此行为,使用 ToolchainsExternalProject。仍然会在后台创建不同的 makefile,但这不会影响用户或项目的可扩展性。

首先,您需要将项目转换为 CMake 项目,在 CMakeLists.txt 文件中包含在所有不同平台上构建所需的所有 if 和 else。

您可以创建一组工具链文件,例如命名为 <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()

这应该提供一个平台,可以根据您的特定需求进行调整,并与项目一起很好地扩展。

【讨论】:

    猜你喜欢
    • 2021-01-16
    • 2013-06-01
    • 1970-01-01
    • 2016-03-02
    • 2015-02-04
    • 2016-12-23
    • 2018-04-21
    • 2017-12-08
    • 2023-02-21
    相关资源
    最近更新 更多