xmake v2.3.6 发布, 新增 fortran 编译支持

2020-07-29 07:34:16 +08:00
 waruqi

这个版本重点对其他语言的支持做了一些改进,比如新增了 fortran 的编译支持,zig 语言的实验性支持,另外对 golang/dlang 增加了第三方依赖包支持以及交叉编译支持。

虽然,xmake 重点关注 c/c++的构建支持,但是其他语言的支持 xmake 也会不定期做一些改进,其主要目的并不是替代它们官方自身的构建系统,仅仅只是为了支持与 c/c++的混合编译,更好的为 c/c++项目服务, 毕竟有些 c/c++项目中,还是会偶尔调用其他语言的代码接口,比如与 cuda, dlang, objc,swift, asm 等语言的混合调用,所以 xmake 还是会对他们做一些基础性的编译支持。

另外,关于 c/c++方面,我们也对 vs 预览版中新的/sourceDependencies xxx.json输出的头文件依赖格式也做了支持(这对于多语言下,头文件依赖检测会更加的可靠稳定)。

新特性介绍

Fortran 语言编译支持

这个版本开始,我们已经完全支持使用 gfortran 编译器来编译 fortran 项目,我们可以通过下面的命令,快速创建一个基于 fortran 的空工程:

$ xmake create -l fortran -t console test

它的 xmake.lua 内容如下:

add_rules("mode.debug", "mode.release")

target("test")
    set_kind("binary")
    add_files("src/*.f90")

更多代码例子可以到这里查看:Fortran Examples

Zig 语言实验性支持

注:目前这个语言 xmake 还在试验性支持阶段,还很不完善,比如:windows 上不支持,linux/macOS 下动态库编译还不支持,请自行评估使用。

我们可以通过下面的配置方式,尝试性体验下,至少 linux/macOS 下 console 和 static library 程序还是可以跑的。

add_rules("mode.debug", "mode.release")

target("test")
    set_kind("binary")
    add_files("src/*.zig")

至于为啥 windows 不支持呢,详情见我之前提给 zig 的 issues,#5825

而动态库不支持,也是因为我躺了一些坑( zig 生成的动态库会自动追加.0.0.0),详情见:issue 5827

另外还躺了下其他坑,个人感觉坑有点多,所以我暂时还是试验阶段,等过段时间再看看。

更多例子见:Zig Examples

Go 依赖包和交叉编译支持

新版本 xmake 对 go 构建支持继续做了一些改进,比如对 go 的交叉编译也进行了支持,例如我们可以在 macOS 和 linux 上编译 windows 程序:

$ xmake f -p windows -a x86

另外,新版本对 go 的第三方依赖包管理也进行了初步支持:

add_rules("mode.debug", "mode.release")

add_requires("go::github.com/sirupsen/logrus", {alias = "logrus"})
add_requires("go::golang.org/x/sys/internal/unsafeheader", {alias = "unsafeheader"})
if is_plat("windows") then
    add_requires("go::golang.org/x/sys/windows", {alias = "syshost"})
else
    add_requires("go::golang.org/x/sys/unix", {alias = "syshost"})
end

target("test")
    set_kind("binary")
    add_files("src/*.go")
    add_packages("logrus", "syshost", "unsafeheader")

不过还有一些不完善的地方,比如目前必须手动配置所有级联依赖包,会稍微繁琐些,后续有待改进。

更多例子见:Go Examples

Dlang/Dub 依赖包支持

xmake 对 dlang 的 dub 包管理也进行了支持,可以快速集成 dlang 的第三方依赖包:

add_rules("mode.debug", "mode.release")

add_requires("dub::log 0.4.3", {alias = "log"})
add_requires("dub::dateparser", {alias = "dateparser"})
add_requires("dub::emsi_containers", {alias = "emsi_containers"})
add_requires("dub::stdx-allocator", {alias = "stdx-allocator"})
add_requires("dub::mir-core", {alias = "mir-core"})

target("test")
    set_kind("binary")
    add_files("src/*.d")
    add_packages("log", "dateparser", "emsi_containers", "stdx-allocator", "mir-core")

cl.exe 新的头文件依赖文件支持

msvc 的头文件依赖通常需要解析/showIncludes的输出内容,提取里面的 includes 文件列表来处理依赖编译问题,但是呢,cl.exe 对这个的输出做的很不好,includes 信息和编译输出是混在一起的。

对构建工具处理依赖解析非常不友好,尤其是多语言环境下,如何判断是 includes,需要通过前置的Note: including file:字符串来判断提取,但中文下,又是注意: 包含文件:, 如果换成日语环境,又是日文的前缀字符串,编码格式问题、硬编码问题导致解析处理上,总归不是很完美。

关于这一点,最新的 vs2019 预览版中,微软终于对齐做了改进,通过新的/sourceDependencies xxx.json编译选项,可以更好的输出 includes 依赖信息,方便多语言环境下的解析提取。

另外,这个新选项的输出是独立到单独的 json 文件中去的,终于不是跟编译输出混一起了,也终于不用痛苦地解析分离编译错误、警告信息、includes 列表信息了。

输出内容大概长这样:

{
    "Version": "1.0",
    "Data": {
        "Source": "z:\\personal\\tbox\\src\\tbox\\tbox.c",
        "Includes": [
            "z:\\personal\\tbox\\src\\tbox\\tbox.h",
            "z:\\personal\\tbox\\src\\tbox\\prefix.h",
            "z:\\personal\\tbox\\src\\tbox\\prefix\\prefix.h",
            "z:\\personal\\tbox\\src\\tbox\\prefix\\config.h",
            "z:\\personal\\tbox\\src\\tbox\\config.h",
            ...

而新版本中,xmake 通过新增内置的core.base.json模块处理 json 解析,很方便地对新的头文件依赖数据进行解析和支持,优先使用此模式(如果 cl 是新版本支持的话,老版本 cl 还是使用/showIncludes)。

Xcode 插件生成支持

目前,我们还没有时间去自己实现 xcode 工程的生成,但不代表不支持,因为 xmake 支持生成 cmakelists.txt 文件,而 cmake 是支持 xcode 工程文件生成的,在官方还没有实现之前, 我们也可以通过 cmake 变相支持它,xmake 会自动内部调用 cmake 中转下生成结果,对用户而言使用上没啥区别,只需要确保 cmake 已经安装即可:

$ xmake project -k xcode

!> 等之后有时间,我们会重新自己实现各更加完善的 xcode 输出插件,也欢迎大家帮忙贡献。

xmake-vscode 插件 intellisense 支持

近期,我们也更新了下xmake-vscode插件,通过自动生成compile_commands.json到当前项目的.vscode目录下,然后我们只需要配置.vscode/c_cpp_properties.json在里面关联上这个.vscode/compile_commands.json路径 就能实现 intellisense 自动提示,同步 xmake.lua 里面的 includedirs 等配置信息。

至于,具体怎么生成c_cpp_properties,官方文档里面有详细说明: https://code.visualstudio.com/docs/cpp/configure-intellisense-crosscompilation

里面的主要配置项:

  "configurations": [
    {
      "compileCommands": ".vscode/compile_commands.json",
    }
  ],

更新内容

新特性

改进

关注公众号

如果大家对 xmake 以及后续的开发进展感兴趣,也可以关注我的公众号,即时获取最新开发进展以及相关文章

1240 次点击
所在节点    程序员
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/693909

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX