This is a Rust implementation of make
, striving to be simple, portable, and fast.
To avoid clashing with your system's make
, this project is built as omake
by default, but if
this project is ever used as the default implementation of make
in a system, then it should be
named make
(to follow the same convention as gmake
and bmake
).
I decided to try to re-write make
in Rust both as a way to learn Rust and also because I found the
existing make
implementations' source code very convoluted.
https://xkcd.com/2314/
You can install the binary with Cargo: cargo install omake
. In the future, I may consider
packaging this software for other repos such as Homebrew or the AUR.
While the main goal of this project is the binary project omake
, the project is designed such that
most of the logic is located inside the library component, libomake
.
If you want to use libomake
library in your software, just include the dependency in your
Cargo.toml
, and you can disable the default feature to avoid having to bring in clap
and
const_format
as dependencies of your project:
toml
[dependencies]
omake = { version = "*", features = [] }
This project is in it's infancy, so I may find out later that some or all of the project goals are impossible to achieve. Regardless, in order of importance, here are the project goals:
make
extensions as possible.make
that works on Linux and FreeBSD (and macOS); that's it.1.0 release will probably happen when this project can build the Linux kernel.
Note that due to implementation details (and especially during the initial development phase this project is in), it's possible certain features are inadvertently added. Users should probably not rely on those and they may even qualify as bugs. I hope to get everything ironed out before the 1.0 release to avoid (as stated in Goal #6) building an incompatible competing standard. There are already other build systems, I don't actually want to make another one.
Working list of things that I plan on leaving out of this implementation intentionally: 1. Remaking makefiles from RCS/SCCS. I see no need to support this. 2. Implicit rules. I'm on the fence, so I could be convinced to remove this from the list. The Linux kernel's makefile explicitly disables implicit rules (ref: https://github.com/torvalds/linux/blob/15b3f48a4339e3c16acf18624e2b7f60bc5e9a2c/Makefile#L202-L208). However, other projects might use these a lot, so if I find that's the case I might decide to implement implicit rules, especially if it's not too cumbersome.
We have unit tests where they are feasible.
There is also a system test suite in the tests
directory. In this context, "system" tests are
directories which contain a makefile, a mod.rs
file, and any other files needed by the makefile.
The mod.rs
invokes a system_test_cases!
macro, which executes this project's resulting binary
against that directory's makefile given the arguments provided and checks STDOUT/STDERR against the
expected STDOUT/STDERR provided to the macro, and also checks the directory against the expected
files and content provided to the macro.
At some point, I should probably also copy over the GNU make test suite and try to get this project to pass the entire test suite.