关于c++:xmake-v237-发布-新增-tinyc-和-emscripten-工具链支持

52次阅读

共计 5552 个字符,预计需要花费 14 分钟才能阅读完成。

xmake 是一个基于 Lua 的轻量级跨平台构建工具,应用 xmake.lua 保护我的项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对老手十分敌对,短时间内就能疾速入门,可能让用户把更多的精力集中在理论的我的项目开发上。

随着 xmake 最近几年一直的迭代倒退,xmake 曾经在 Github 播种 2.9K star,300+ fork,30+ 贡献者,并且解决了 900+ issues,5400+ Commits,沉闷用户也在一直增长。

当初,xmake v2.3.7 版本公布了,在新版本中,咱们次要欠缺了 xmake 本身的稳定性和兼容性,通过两个月的一直迭代,修复了很多用户反馈的各种应用问题,应用体验和稳定性有了很大的晋升。

另外,咱们在这个版本中也新增对 TinyC 和 Emscripten (WebAssembly) 编译工具链的反对。

尤其是针对 windows 平台,咱们提供了额定的 xmake-tinyc 安装包,外面内置了 tinyc 编译器,使得用户能够齐全脱离臃肿的 vs 环境,一键装置,开箱即用,只须要 5M 的安装包即可开发简略的 C 程序,同时还自带了整套 winapi 头文件。

最初,咱们还改良了 trybuild 模式编译,通过 xmake 能够疾速编译 autotools/cmake 保护的第三方我的项目,并且能够疾速对接 android/ios/mingw 等穿插编译环境,实现疾速移植编译。

  • 我的项目源码
  • 官网文档

新个性介绍

更加多样的装置形式

新版本中,咱们将 xmake 安装包提交到了 windows winget 以及 ubuntu ppa 仓库,咱们能够更加方便快捷地装置 xmake。

Winget 装置

winget install xmake

Ubuntu PPA 装置

sudo add-apt-repository ppa:xmake-io/xmake
sudo apt update
sudo apt install xmake

当然,咱们还反对很多其余的装置形式,对于其余平台的具体装置形式见:装置文档。

更加丰盛的工具链反对

以后咱们曾经反对十分多的工具链环境,而在这个版本中,咱们又新增了 TinyC 和 Emscripten (WebAssembly) 编译工具链的反对,咱们能够通过上面的命令疾速切换到对应的工具链来编译。

xmake f --toolchain=[tinyc|emscripten]
xmake

咱们还在新版本中,额定提供了两个安装包,内置集成了 TinyC 编译环境,整个安装包只须要 5M,还蕴含了 winsdk api。

安装包能够在 xmake 的 github/releases 目录下找到。

  • xmake-tinyc-v2.3.7.win64.exe
  • xmake-tinyc-v2.3.7.win32.exe

通过这个安装包,咱们编译开发 C 程序就能够齐全解脱臃肿的 vs 开发环境(好几个 G),实现一键装置,开箱即用,对于咱们平时刷刷 leetcode,写点 C 测试代码还是十分有用的,没必要为此特定装置整个 vs 进来。

另外,如果咱们要查看 xmake 反对的所有工具链,能够执行上面的命令,另外 xmake f -p cross --sdk=/xxx 的编译配置能够反对更多通用的穿插工具链。

$ xmake show -l toolchains
xcode         Xcode IDE
vs            VisualStudio IDE
yasm          The Yasm Modular Assembler
clang         A C language family frontend for LLVM
go            Go Programming Language Compiler
dlang         D Programming Language Compiler
gfortran      GNU Fortran Programming Language Compiler
zig           Zig Programming Language Compiler
sdcc          Small Device C Compiler
cuda          CUDA Toolkit
ndk           Android NDK
rust          Rust Programming Language Compiler
llvm          A collection of modular and reusable compiler and toolchain technologies
cross         Common cross compilation toolchain
nasm          NASM Assembler
gcc           GNU Compiler Collection
mingw         Minimalist GNU for Windows
gnu-rm        GNU Arm Embedded Toolchain
envs          Environment variables toolchain
fasm          Flat Assembler
tinyc         Tiny C Compiler
emcc          A toolchain for compiling to asm.js and WebAssembly

TryBuild 编译模式改良

所谓 trybuild 模式,就是 xmake 推出的一个适配现有第三方构建零碎的个性,因为当初大部分已有的第三方我的项目都是用 autotools/cmake 等第三方构建系统维护的,如果将它们迁徙到 xmake 配置那么迁徙老本还是比拟高的。

尽管 xmake 的配置编写非常简单上手,但也没必要对曾经稳固保护的我的项目去大改构建零碎,xmake 次要还是用于一些新我的项目的构建保护。

基于此背景,xmake 采纳 trybuild 编译模式,也就是所谓的尝试编译模式,通过主动探测第三方我的项目的构建零碎,如果检测到是 autotools 保护的我的项目,那么主动调用 ./configure; make 来编译。

如果检测到是用 cmake 保护的我的项目,那么主动调用 cmake 来生成 makefile/build.ninja 来编译,对于应用 xmake 的用户而言,始终只是执行 xmake 这一个命令就能够实现编译,例如:

$ xmake
note: configure found, try building it or you can run `xmake f --trybuild=` to set buildsystem (pass -y or --confirm=y/n/d to skip confirm)?
please input: y (y/n)
y
  ...
  CC       src/pcre2grep-pcre2grep.o
  CC       src/libpcre2_8_la-pcre2_auto_possess.lo
  CC       src/libpcre2_8_la-pcre2_config.lo
  ...
build ok!

xmake 检测到 autotools 构建零碎后,就会提醒用户是否须要尝试调用 autotools 来编译,输出 y 确认后,就能够间接实现编译,对于 cmake 的我的项目也是,只须要执行雷同的 xmake 命令即可。

而不须要关怀 autotools/cmake 须要如何去配置应用和编译,毕竟 cmake 对于 windows 和 linux 平台,须要生成不同的构建文件,编译形式也是不同的,一会调用 make,一会调用 msbuild,看着就头大。

不仅如此,xmake 还对接了 xmake -r 来间接从新编译,对接 xmake clean 实现对立的文件清理,对接 xmake -v 实现对立的具体编译命令的查看。

TryBuild 的穿插编译反对

如果只是以后主机平台的编译,兴许你们会说,这有啥,cmake 也有 cmake --build . 来间接编译,并不怎么麻烦么。

那么问题来了,穿插编译怎么搞?如果你们用过 autotools/cmake 去穿插编译生成 mingw/android/ios 的目标程序,cmake 和 autotools 还可能简略统一的解决么?

autotools 不多说,反正我是对它的穿插体验是疾恶如仇的,每次穿插编译移植一个带有 autotools 我的项目的代码,都要折腾半天,常常要包各种谬误,钻研各种配置参数的传递,不同平台的配置还不同。

而 cmake 我感觉用起来也不省事,比方对于 Android 平台得这样搞:

$ cmake \
    -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \
    -DANDROID_ABI=$ABI \
    -DANDROID_NATIVE_API_LEVEL=$MINSDKVERSION \
    $OTHER_ARGS

而对于 ios 平台,没找到简答的配置形式,就找到个第三方的 ios 工具链配置,很简单:https://github.com/leetal/ios…

对于 mingw 又是另外一种形式,我又折腾了半天环境,很是折腾。

那如果应用 xmake 去对接 cmake 实现穿插编译呢,只须要这样。

编译 android 程序:

xmake f -p android --trybuild=cmake --ndk=/xxx
xmake

编译 ios 程序:

xmake f -p iphoneos --trybuild=cmake
xmake

编译 mingw 程序:

xmake f -p mingw --trybuild=cmake --mingw=/sdk/xxx
xmake

咱们只须要配置的时候,通过 --trybuild=cmake 启用 cmake 的尝试编译模式,而后通过 -p android/iphoneos/mingw 切到对应的平台,对接对应的 sdk,就能够应用雷同的形式来疾速实现穿插编译,哪怕这个我的项目是应用 cmake 来保护的。

用户不须要关系如果应用 cmake 去传递不同工具链的配置,xmake 都帮你主动解决了,你只须要简略的执行 xmake 来编译,也能够执行 xmake -r 来重编,或者查看编译详情 xmake -v

另外,还能够通过 xmake f -p iphoneos -a arm64 --trybuild=cmake 疾速的切换编译架构。

最初,咱们须要阐明的是,尽管 trybuild 模式能够极大帮忙用户节俭编译和配置操作,然而如果条件运行,咱们还是心愿大家可能间接应用 xmake.lua 来保护本人的我的项目。

这样,就不须要走 trybuild 编译了,xmake 会更加完满的反对穿插编译,因为外部 xmake 会间接去编译我的项目,而不须要在调用 cmake、autotools 等工具了,例如:

xmake f -p iphoneos
xmake

或者

xmake f -p android --ndk=/xxx
xmake

能够看到,这回咱们省去了 --trybuild=cmake 参数,因为不须要了,咱们是间接编译的,这个时候 xmake 相当于独立的 make/ninja,并且齐全不依赖 make,编译速度也能够齐全媲美 ninja。

改良近程依赖包的集成

穿插编译反对

xmake 不仅对 trybuild 反对了 mingw/autotools 的穿插编译反对,还对近程包仓库中应用 cmake/autotools 保护的第三方也反对上了穿插编译装置和集成。

例如:

add_requires("pcre2")

target("test")
    set_kind("binary")
    add_files("src/*.cpp")
    add_packages("pcre2")

而后通过切换到 iphoneos 平台,就能够疾速集成装置 iphoneos 平台的 pcre2 包,而后编译链接它,哪怕这个 pcre2 包是通过 autotools/cmake 保护的。

xmake f -p iphoneos
xmake

公有网络包仓库

这个版本中,咱们对近程依赖包的集成也略微做了一些改良,比方能够通过配置 xmake g --network=private 切到公有网络模式。

这个次要用于一些公司外部网络通过 xmake 自建的包治理仓库,实现封闭式的 C/C++ 依赖包集成,齐全不会从 xmake 提供的官网仓库下来依赖包。

递归导出装置的包

xmake 之前提供了一个命令,能够导出通过 xmake 装置的所有第三方依赖包。

xmake require --export

然而,之前的版本对应一些存在依赖的包,导出时候只会导出本身,它的所有依赖是不会被导出的,而这个版本中,咱们对其进行了改良,将对应的所有依赖包也进行了导出。

改良对 Qt SDK 环境的反对

另外,这个版本咱们还对 Qt SDK 的工具链环境进行了更好的反对,比方 ubuntu 零碎下通过 apt 命令装置的 Qt SDK 工具链也进行了反对,而之前的版本只能反对从 Qt 官网下载安装的 Qt SDK 环境。

更新内容

新个性

  • #2941: 反对通过 winget 来装置 xmake
  • 增加 xmake-tinyc 安装包,内置 tinyc 编译器,反对 windows 上无 msvc 环境也可间接编译 c 代码
  • 增加 tinyc 编译工具链
  • 增加 emcc (emscripten) 编译工具链去编译 asm.js 和 WebAssembly
  • #947: 通过 xmake g --network=private 配置设置公有网络模式,防止近程依赖包下载拜访外网导致编译失败

改良

  • #907: 改良 msvc 的链接器优化选项,生成更小的可执行程序
  • 改良 ubuntu 下 Qt 环境的反对
  • #918: 改良 cuda11 工具链的反对
  • 改良 Qt 反对,对通过 ubuntu/apt 装置的 Qt sdk 也进行了探测反对,并且检测效率也优化了下
  • 改良 CMake 工程文件生成器
  • #931: 改良导出包,反对导出所有依赖包
  • #930: 如果公有包定义没有版本定义,反对间接尝试下载包
  • #927: 改良 android ndk,反对 arm/thumb 指令模式切换
  • 改良 trybuild/cmake 反对 Android/Mingw/iPhoneOS/WatchOS 工具链

Bugs 修复

  • #903: 修复 vcpkg 包装置失败问题
  • #912: 修复自定义工具链
  • #914: 修复局部 aarch64 设施上运行 lua 呈现 bad light userdata pointer 问题

https://tboox.org/cn/2020/09/…

正文完
 0