当前位置: 首页 > news >正文

编译脚本支持(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

转载于:https://www.cnblogs.com/yishuyuan/p/7455777.html

相关文章:

  • Docker 后台进程参数-------更改Docker运行根目录的方法
  • Python 爬虫入门3种方法
  • GSSAPIAuthentication=no
  • 红帽推 Ansible Tower 3.1 扩展 DevOps自动化功能
  • 从边缘计算看移动化与云计算的融合之道
  • 卡巴斯基:Duqu2.0病毒使用的数字证书窃取自富士康
  • 网络攻击检测:五大致命弱点和解决办法
  • Arbor Networks发布新安全平台 通过内部企业网络连接互联网上的攻击
  • 中国大数据利用率仅0.4%?行业大咖教你如何用好大数据
  • Spring IoC 学习(4)
  • 为什么要点两下才能删除一个li节点 原来是空白节点作怪
  • 《中国人工智能学会通讯》——3.30 改革性成就
  • spring+SpringMVC+mybati整合JBPM
  • 《逻辑与计算机设计基础(原书第5版)》——3.7 选择
  • 为什么运营商玩不转物联网?
  • 77. Combinations
  • Javascript弹出层-初探
  • java第三方包学习之lombok
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • PHP的类修饰符与访问修饰符
  • Spring Boot MyBatis配置多种数据库
  • 京东美团研发面经
  • 聊聊flink的TableFactory
  • 排序算法之--选择排序
  • 如何胜任知名企业的商业数据分析师?
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 算法---两个栈实现一个队列
  • 异常机制详解
  • 与 ConTeXt MkIV 官方文档的接驳
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (1)(1.11) SiK Radio v2(一)
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (3)选择元素——(17)练习(Exercises)
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (算法)Travel Information Center
  • (一)基于IDEA的JAVA基础1
  • (译)2019年前端性能优化清单 — 下篇
  • (转)Linux下编译安装log4cxx
  • .apk 成为历史!
  • .NET 读取 JSON格式的数据
  • .NET分布式缓存Memcached从入门到实战
  • .NET中GET与SET的用法
  • .sdf和.msp文件读取
  • /dev下添加设备节点的方法步骤(通过device_create)
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • ::前边啥也没有
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [20150629]简单的加密连接.txt
  • [22]. 括号生成