#makefile #build #programmatically #variables #prelude #would #hook

构建 makemake

用于程序化构建Makefile的库

2个版本

0.1.3 2024年7月6日
0.1.2 2024年7月1日
0.1.1 2024年6月30日
0.1.0 2024年6月30日

#175 in 构建工具

Download history 444/week @ 2024-06-29 139/week @ 2024-07-06 22/week @ 2024-07-13 1/week @ 2024-07-20 22/week @ 2024-07-27 12/week @ 2024-08-03

每月 64 次下载

MIT 协议

38KB
961

makemake

CI CodeFactor

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