编译脚本支持(Build script support)

查看原文:Build Script Support

有些包需要编译第三方的非Rust代码,比如说C库。其他包需要链接到C库,这些C库可能位于系统磁盘上,也有可能需要从源代码中构建。其他人仍然需要一些功能,比如在构建之前的代码生成(考虑解释器生成器)(没明白是什么意思)。

Cargo并不是为了取代这些针对这些任务进行了良好优化的其他工具,但是它确实与构建配置选项集成在一起了:

一、如何使用构建脚本

在Cargo.toml文件中

[package]
# ...
build = "build.rs"

构建命令(相对于包的根)指定的Rust文件,将在其他任何在包中东西被编译之前被编译和调用,这能允许你的Rust代码依赖于构建或生成的组件。

注意:如果你没有为构建命令指定值,但是你的包根目录下确实存在一个"build.rs"文件,Cargo将会为你编译并调用这个文件。

构建命令的一些用例如下:

  • 构建一个绑定的C库
  • 在主机系统上查找一个C库
  • 从规范中生成一个Rust模块
  • 执行Crate需要的任何针对特定平台的配置

下面详细介绍每个用例,以给出构建命令如何工作的示例。

一、构建脚本的输入

当构建脚本运行时,构建脚本有大量的输入,所有的输入都以环境变量的形式传递。而除了环境变量之外,构建脚本的当前目录是构建脚本包的源目录。

二、构建脚本的输出

通过构建脚本输出到stdout的所有行,都会被写到文件中如:target/debug/build/<pkg>/stdout(具体位置可能取决于你的配置)。任何以 "cargo:" 开头的行都会被Cargo直接解释。这一行必须是这种格式:

cargo:key=value

如下所示:

# specially recognized by Cargo
cargo:rustc-link-lib=static=foo
cargo:rustc-link-search=native=/path/to/foo
cargo:rustc-cfg=foo
cargo:rustc-env=FOO=bar
# arbitrary user-defined metadata
cargo:root=/path/to/foo
cargo:libdir=/path/to/foo/lib
cargo:include=/path/to/foo/include

另外,打印到stderr的行会被写入到一个文件:target/debug/build/<pkg>/stderr,但是不会被Cargo解释。

Cargo会识别一些特殊的关键字,会一定程度上影响crate的构建方式:

  • rustc-link-lib=[KIND=]NAME    表示指定的值是一个库名,应该将其作为 -l 标识传递给编译器。可选的KIND可以是static,dylib(默认),或者framework(只适用于苹果系统),可以通过rustc --help查看更多细节。
  • rustc-link-search=[KIND=]PATH    表示指定的值是一个库的搜索路径,应该将其作为 -L 标识传递给编译器。可选的KIND可以是dependency,crate,native,framework或者是all(默认),查看rustc --help获取更多细节。
  • rustc-flags=FLAGS    是传递给编译器的一组标识,只有 -l 和 -L 标识被支持。
  • rustc-cfg=FEATURE    表示指定的特性将会被以一个 --cfg 标识传递给编译器。这通常用于进行各种特性的编译时检测。
  • rust-env=VAR=VALUE    表示指定的环境变量将被添加到编译器在其中运行的环境中。然后在编译的crate中,可以通过 env! 宏检索这个环境变量。这对于在crate的代码中嵌入额外的元数据非常有用,比如Git HEAD的hash或者持续集成服务器的唯一标识符。
  • rerun-if-changed=PATH    是一个文件或目录的路径,该路径指示构建脚本在更改时应该重新运行(通过文件的最近修改时间戳检测)。通常情况下,如果在crate的根目录下的任何文件发生变化,那么构建脚本就会重新运行,但是这可以用于将更改范围更改为一小部分文件。(如果该路径指向一个目录,那么整个目录将不会被遍历更改--而只更改目录本身的时间戳(对应于目录中的某些类型的更改,这取决于平台),这将触发重新构建。如果要请求对整个目录中的任何更改都进行重新构建,请递归的为该目录打印一行,并且为其内部的所有内容打印另一行)。注意,如果构建脚本本身(或它的一个依赖项)发生了更改,那么它将被无条件的重新构建和重新运行,因此:cargo:rerun-if-changed=build.rs几乎总是冗余的(除非你想忽略除build.rs之外所有其他文件的更改)。
  • rurun-if-env-changed=VAR    是一个环境变量的名称,它表示如果环境变量的值发生变换,应该重新运行构建脚本。这基本上工作方式与 rerun-if-changed 相同,只不过它与环境变量一起工作。注意,这里的环境变量是为诸如CC之类的全局环境变量而设计的,因此对于env
时间: 2024-10-13 20:02:20

编译脚本支持(Build script support)的相关文章

Gradle Android最新自动化编译脚本教程

转自:http://blog.csdn.net/changemyself/article/details/39927381 一.前言 Gradle 是以 Groovy 语言为基础,面向Java应用为主.基于DSL(领域特定语言)语法的自动化构建工具. 上面这句话我觉得写得很官方,大家只需知道Gradle可以用来android开发中进行多个项目依赖的自动化编译脚本,知道这点也就知道我们使用它的目的: 为什么不使用Ant做自动化编译脚本,因为ant上手快,但是维护起来太不方便了,有了Gradle你可

VLCKit编译脚本的防坑修改

前言:编译过VLC的朋友们可能都知道,整个流程编译下来,在没任何错误的情况下基本上需要3到4个小时,网速慢点的可能需要7-8个小时,如果中途出现错误,很可能需要重新来过,那么有什么方法可以防坑呢? 作者在尝试编译多次VLC之后总结和修改了编译脚本. 据我观察,编译VLC的时候,大部分时间都会消耗在buildMobileVLCKit.sh 文件中153行附近的 git clone git://git.videolan.org/vlc.git vlc 这行代码上. 所以防坑的原则就是修改脚本只执行这

【Android本地开发技术:编译脚本】Android.mk

作者:郭孝星 微博:郭孝星的新浪微博 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells Github:https://github.com/AllenWells 一 Android.mk文件的作用和特点 1.1 Android.mk文件作用 该文件用来描述编译系统(build system)的,即一个微型的GNU Makefile片段,会由编译系统解析一次或多次. 1.2 Android.mk文件特点 该文件用来将源文件组织成模块,模

Gradle Android最新自动化编译脚本教程(提供demo源码)

一.前言 Gradle 是以 Groovy 语言为基础,面向Java应用为主.基于DSL(领域特定语言)语法的自动化构建工具. 上面这句话我觉得写得很官方,大家只需知道Gradle可以用来android开发中进行多个项目依赖的自动化编译脚本,知道这点也就知道我们使用它的目的: 为什么不使用Ant做自动化编译脚本,因为ant上手快,但是维护起来太不方便了,有了Gradle你可以跟项目组的同事说,用Ant的孩子们别苦逼的维护了,赶紧换成gradle吧. 本文面向gradle新手或者以前使用过grad

ios及android两个平台下x264编译脚本

今年做了一些音视频编解码工作,此前做图形.图像类工作多一些,做了音视频编解码才知道,这项工作还是很有趣.很神奇的.比如采集几十M的视频数据,经过编码存储后,文件体积仅仅有几十K大小,这当中就需要x264来发挥神奇了.下面将手机端ios及android两个平台下x264编译脚本分享出来,希望对正在做相关工作的同学有帮助.x264源码地址:http://www.videolan.org/developers/x264.html 1. ios平台下x264编译.这个编译脚本修改自:https://gi

FFmpeg示例程序合集-批量编译脚本

此前做了一系列有关FFmpeg的示例程序,组成了<最简单的FFmpeg示例程序合集>,其中包含了如下项目:simplest ffmpeg player:                  最简单的基于FFmpeg的视频播放器simplest ffmpeg audio player:       最简单的基于FFmpeg的音频播放器simplest ffmpeg pic encoder:        最简单的基于FFmpeg的图像编码器simplest ffmpeg video encoder

Android - 警告:it is always overridden by the value specified in the Gradle build script

警告:it is always overridden by the value specified in the Gradle build script 本文地址: http://blog.csdn.net/caroline_wendy 警告:This minSdkVersion value (8) is not used; it is always overridden by the value specified in the Gradle build script (8) (at line

xcode 编译打包 支持64位 设置

首先说两个时间 1.自2015年2月份开始,新上传到iTunes上面审核的app,必须支持64位,新上传是指第一次上传, 或者没有审核通过过,总之就是在AppStore上面没有上架的app,必须支持64位,包括工程里面的代码和用到的静态库文件 2.如果之前iTunes上面有审核通过的app,现在只是上传升级版本,更新版本去审核,这时也可以提交成功,iTunes上面验证二进制文件可以通过, 不必非得支持64位,但是不要高兴太早,这只是权宜之计,到2015年6月份上传的升级版本还是要支持64位,只是

180729-Quick-Task 动态脚本支持框架之任务动态加载

Quick-Task 动态脚本支持框架之任务动态加载 前面几篇博文分别介绍了整个项目的基本架构,使用说明,以及整体框架的设计与实现初稿,接下来则进入更细节的实现篇,将整个工程中核心实现捞出来,从为什么这么设计到最终的实现给予说明 相关系列博文: 180702-QuickTask动态脚本支持框架整体介绍篇 180719-Quick-Task 动态脚本支持框架之使用介绍篇 180723-Quick-Task 动态脚本支持框架之结构设计篇 I. 任务动态加载 这个动态脚本调度框架,最大的一个功能点就是