2个版本
0.1.3 | 2024年7月6日 |
---|---|
0.1.2 |
|
0.1.1 |
|
0.1.0 |
|
#175 in 构建工具
每月 64 次下载
38KB
961 行
makemake
makemake
是一个用于程序化构建Makefile的Rust库。特性允许 makemake
函数接受几乎任何类型的参数 - 您可以将变量的值设置为字符串、函数,甚至另一个变量,而不需要到处使用 .into()
。还有一个用于构建更复杂表达式的辅助宏 expr!
。
尽管不依赖版本,但 makemake
支持GNU make
的特性。如果您打算使Makefile非常通用(尽管macOS也自带GNU make
),则在手动编写Makefile时避免使用这些特性。
用法
在您的Rust项目根目录中运行此命令
cargo add makemake
您可以在crates.io上找到crate。
然后,您可以将
use makemake::prelude::*;
添加到适当的文件中。
示例
让我们为C项目构建一个Makefile。
let mut makefile = Makefile::new();
我们需要为源文件、目标文件、编译器和标志设置变量。
let src = makefile.assign("SRC", Function::wildcard([expr!("src/*.c")]));
let obj = makefile.assign("OBJ", Substitution::new(src, ".c", ".o"));
let cc = makefile.assign_without_overwrite(
"CC",
Function::shell("which gcc || which clang")
);
let cflags = makefile.append("CFLAGS", "-std=c99 -Wall -Wextra");
let target = makefile.assign("TARGET", "main");
接下来,我们将定义创建目标规则的规则。
makefile.rule(target).dep("main.c").dep(obj).cmd(expr!(
cc;
cflags;
"-o";
makefile.target_var();
makefile.deps_var()
));
在
expr!
宏中,使用;
通过空格分隔参数,使用,
将它们直接相邻。
最后,我们可以打印生成的Makefile。
print!("{}", makefile.build());
实际上,我们可以使用我们的Makefile来构建示例项目。
cargo run --example c_project > examples/Makefile
cd examples
make && ./main
实际的示例(c_project.rs
位于examples/
目录中)还附带了一个make clean
命令!
设置Git钩子
克隆仓库后,运行以下脚本来设置钩子
/bin/sh setup_hooks.sh
许可证
本项目遵循MIT 许可证,许可证副本可在本目录中找到。
依赖项
~725KB
~17K SLoC