我有一个可在Linux,Windows和Mac OS X上运行的中型C ++项目,包括32位和64位。在某些平台上,它有多个变体(例如Linux上的Gtk-2和Gtk-3变体)。作为一个业余爱好程序员,我没有为每个平台提供专用构建机器的资源。所以我为每一个安装了交叉编译器,以便所有构建都在我的Linux机器上进行。
我希望能够使用一个命令构建所有十个左右的变体。现在我用一个快速而肮脏的Python脚本来创建一个makefile(实际上我最近切换到了忍者,但我认为它并不是很相关)。它为每个变体创建Windows安装程序,Debian软件包和诸如此类的东西。但我想要一个更清晰的解决方案,因为随着项目的发展,我的脚本不能很好地扩展。
所以我的问题是:哪些元构建工具能够创建单个Makefile(或类似的忍者构建文件),可以处理多个工具包(交叉编译器)和自定义命令(创建安装程序等)。 )吗
我尝试过CMake(和其他一些人),但对我来说,如何使用多个工具包并不明显。大多数工具似乎每个配置创建一个Makefile。
修改:现在,this回答声称无法做到这一点。我不明白为什么。如果我可以使用我的15分钟python脚本,我觉得必须有一个工具能够为我做到这一点。
答案 0 :(得分:2)
您可以使用Toolchains和ExternalProject通过CMake获取此行为。在幕后仍会创建不同的makefile,但这不会影响用户或项目的可扩展性。
首先,您需要将项目转换为CMake项目,并在CMakeLists.txt
文件中的所有不同平台上构建所有ifs和elses。
您可以创建一组工具链文件,例如命名<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()
这应该提供一个可以根据您的特定需求进行调整的平台,并可以很好地适应项目。