分类: Rust

  • Rust编写Switch应用

    Rust编写Switch应用

    写Switch应用首选肯定是C/C++语言,主要依赖是devkitpro和libnx。

    如果要用Rust语言来写,最核心的就是两个问题,一个是和核心的libnx交互,一个编译产出的配置。

    Rust FFI

    由于现实中很多程序是由不同编程语言写的,必然会涉及到跨语言调用,比如 A 语言写的函数如果想在 B 语言里面调用,这时一般有两种解决方案:一种是将函数做成一个服务,通过进程间通信或网络协议通信;另一种就是直接通过 FFI 调用。前者需要至少两个独立的进程才能实现,而后者直接将其它语言的接口内嵌到本语言中,所以调用效率比前者高。

    Rust 本身定位为系统编程语言,不可避免要和现有的 C/C++ 代码交互。

    Rust FFI原理和使用文档不少,这里要解决了的主要是简便。因为手写所有绑定是不现实的。

    rust-bindgen可以帮助我们生成对应的绑定文件,支持C和部分C++。这里我们先只考虑核心的libnx。

    创建build.rs文件

    extern crate bindgen;
    
    use std::env;
    use std::path::PathBuf;
    
    pub fn main() {
        let devkitpro_path = env::var("DEVKITPRO").unwrap();
    
        println!("cargo:rustc-link-lib=static=nx");
    
        println!(
            "cargo:rustc-link-search=native={}/libnx/lib",
            devkitpro_path
        );
    
        // 
  • 减少Rust构建物大小

    一般情况下使用cargo build –release就可以生成最终构建物并直接执行,理论上将Rust这种语言构建出的hello world体积应该很小。但是实际上用hello world为例

    fn main() {
        println!("Hello world!");
    }

    最后构建出的结果有2M。

    这个随便搜索一下就可以得到很多优化方法,但是考虑到便利性和收益,这里用最简单的方式来,不考虑代码改动,尽可能不变更构建命令,且跨平台友好。

    首先改动Cargo.toml,增加

    [profile.release]
    opt-level = 'z'  # Optimize for size
    lto = true
    codegen-units = 1
    panic = 'abort'

    然后使用upx压缩,upx可以自动识别平台和类型,直接传入文件名就行了。

    最终大小为86KB。

  • Travis CI使用Ubuntu trusty

    之前Travis CI支持的Ubuntu 12.X,一般使用还好,但是对于有UI的,需要xvfb的有时候会有点问题。

    现在直接支持Ubuntu Trusty了。使用方法

    sudo: required
    dist: trusty

    其他照旧。…