frontpage.
newsnewestaskshowjobs

Made with ♥ by @iamnishanth

Open Source @Github

fp.

OpenCiv3: Open-source, cross-platform reimagining of Civilization III

https://openciv3.org/
518•klaussilveira•9h ago•145 comments

The Waymo World Model

https://waymo.com/blog/2026/02/the-waymo-world-model-a-new-frontier-for-autonomous-driving-simula...
852•xnx•14h ago•513 comments

How we made geo joins 400× faster with H3 indexes

https://floedb.ai/blog/how-we-made-geo-joins-400-faster-with-h3-indexes
66•matheusalmeida•1d ago•13 comments

Show HN: Look Ma, No Linux: Shell, App Installer, Vi, Cc on ESP32-S3 / BreezyBox

https://github.com/valdanylchuk/breezydemo
169•isitcontent•9h ago•21 comments

Monty: A minimal, secure Python interpreter written in Rust for use by AI

https://github.com/pydantic/monty
172•dmpetrov•9h ago•77 comments

Show HN: I spent 4 years building a UI design tool with only the features I use

https://vecti.com
286•vecti•11h ago•129 comments

Dark Alley Mathematics

https://blog.szczepan.org/blog/three-points/
65•quibono•4d ago•11 comments

Microsoft open-sources LiteBox, a security-focused library OS

https://github.com/microsoft/litebox
340•aktau•15h ago•166 comments

Unseen Footage of Atari Battlezone Arcade Cabinet Production

https://arcadeblogger.com/2026/02/02/unseen-footage-of-atari-battlezone-cabinet-production/
5•videotopia•3d ago•0 comments

Sheldon Brown's Bicycle Technical Info

https://www.sheldonbrown.com/
335•ostacke•15h ago•90 comments

Hackers (1995) Animated Experience

https://hackers-1995.vercel.app/
426•todsacerdoti•17h ago•223 comments

Show HN: If you lose your memory, how to regain access to your computer?

https://eljojo.github.io/rememory/
232•eljojo•12h ago•142 comments

An Update on Heroku

https://www.heroku.com/blog/an-update-on-heroku/
366•lstoll•15h ago•252 comments

PC Floppy Copy Protection: Vault Prolok

https://martypc.blogspot.com/2024/09/pc-floppy-copy-protection-vault-prolok.html
37•kmm•4d ago•3 comments

Show HN: ARM64 Android Dev Kit

https://github.com/denuoweb/ARM64-ADK
14•denuoweb•1d ago•1 comments

Delimited Continuations vs. Lwt for Threads

https://mirageos.org/blog/delimcc-vs-lwt
11•romes•4d ago•1 comments

Why I Joined OpenAI

https://www.brendangregg.com/blog/2026-02-07/why-i-joined-openai.html
85•SerCe•5h ago•69 comments

How to effectively write quality code with AI

https://heidenstedt.org/posts/2026/how-to-effectively-write-quality-code-with-ai/
216•i5heu•12h ago•160 comments

Female Asian Elephant Calf Born at the Smithsonian National Zoo

https://www.si.edu/newsdesk/releases/female-asian-elephant-calf-born-smithsonians-national-zoo-an...
17•gmays•4h ago•2 comments

Introducing the Developer Knowledge API and MCP Server

https://developers.googleblog.com/introducing-the-developer-knowledge-api-and-mcp-server/
36•gfortaine•6h ago•10 comments

Show HN: R3forth, a ColorForth-inspired language with a tiny VM

https://github.com/phreda4/r3
59•phreda4•8h ago•11 comments

Learning from context is harder than we thought

https://hy.tencent.com/research/100025?langVersion=en
161•limoce•3d ago•80 comments

I spent 5 years in DevOps – Solutions engineering gave me what I was missing

https://infisical.com/blog/devops-to-solutions-engineering
124•vmatsiiako•14h ago•51 comments

Understanding Neural Network, Visually

https://visualrambling.space/neural-network/
260•surprisetalk•3d ago•35 comments

I now assume that all ads on Apple news are scams

https://kirkville.com/i-now-assume-that-all-ads-on-apple-news-are-scams/
1024•cdrnsf•18h ago•425 comments

FORTH? Really!?

https://rescrv.net/w/2026/02/06/associative
53•rescrv•16h ago•17 comments

WebView performance significantly slower than PWA

https://issues.chromium.org/issues/40817676
16•denysonique•5h ago•2 comments

I'm going to cure my girlfriend's brain tumor

https://andrewjrod.substack.com/p/im-going-to-cure-my-girlfriends-brain
102•ray__•5h ago•49 comments

Evaluating and mitigating the growing risk of LLM-discovered 0-days

https://red.anthropic.com/2026/zero-days/
44•lebovic•1d ago•13 comments

Show HN: Smooth CLI – Token-efficient browser for AI agents

https://docs.smooth.sh/cli/overview
82•antves•1d ago•59 comments
Open in hackernews

Mbake – A Makefile formatter and linter, that only took 50 years

https://github.com/EbodShojaei/bake
227•rainmans•7mo ago

Comments

jtwaleson•7mo ago
Nice, would be good to package this as a https://pre-commit.com/ hook.
foma-roje•7mo ago
It really doesn’t have to be complicated for it to be useful. Plenty thanks for sharing this.
x3n0ph3n3•7mo ago
I don't understand why people like make so much. Interacting with CLI tools using only env vars as arguments is cartoonishly bad dev experience.
zabzonk•7mo ago
You can pass arguments via the command line (it is, after all, a CLI tool): https://stackoverflow.com/questions/2826029/passing-addition...
lmz•7mo ago
I mean there's really not much difference between "VAR=val make x" and "make x VAR=val" now is there?
marginalia_nu•7mo ago
Syntactically? No. Semantically? Yes.
lmz•7mo ago
I'm guessing the syntax was the part the poster was complaining about when they complained about the "dev experience".
marginalia_nu•7mo ago
Dunno, there are other aspects of environment variables that deteriorate the dev experience. They're very conducive to spooky action at a distance, since they're silently being passed along from parent-process to child-process (except when they aren't).

They can cause a lot of annoying bugs, and sometimes it's hard to track down where they are coming from (especially when dealing with stuff running in containers).

77pt77•7mo ago
> except when they aren't

Like sudo for example.

So many problems related to that.

hiAndrewQuinn•7mo ago
I often prefer to work in in extremis environments where there is no internet access, and hence, no easy way to get ahold of make; it's given me a bad habit of just waiting a build.bash script to do what make does most of the time. I haven't really found myself missing it that much.
M0r13n•7mo ago
I am confused, because this means that you won't be able to install anything. No compiler, no 3rd party libraries and no text editor that isn't preinstalled
0points•7mo ago
If you can install bash on your airgapped dev box, why wouldn't you install make on it? Make is part of the core dev environment on just about every disto under the sun.
77pt77•7mo ago
most minimal setups nowadays have bash, make and even perl.
lelanthran•7mo ago
I've worked on payment terminals running linus that had a shell like busybox but no make.

Of course it's a damn payment terminal, no one is ever going to actually build the app on the terminal so it has no compiler either.

I'm wondering what sort of dev machine GP has that is used to build software but doesn't have make...

georgyo•7mo ago
I'm not so sure most people would agree with you. Though I think plenty would.

I dare say that developers like environment variables more than before. Consider that Docker images, and hence Helm charts, are entirely controlled via environment variables. These very popular dev tools suffer from the same problem of having near-zero easy discoverability of what those environment variables might be. Yet they are very popular.

But I don't think Make usually uses all that many environment variables. You're usually specifying build targets as the command line arguments. Automake and autogen usually generate these makefiles with everything hard-coded.

Also, it makes it very easy to get started with, and it is universally available. Makes it very easy to like.

globular-toast•7mo ago
It's 80% of what you want and it's installed everywhere.

You could go for something closer to exactly what you want, but now you've got an extra set up step for devs and something else for people to learn if they want to change it.

I would say if you're looking for cli args then you shouldn't be using any wrapper like make at all. Just call the underlying tool directly. Make is for doing big high level things in the standard way, nowadays quite often in CI pipelines.

zelphirkalt•7mo ago
Yep, that's how I used it on the job before. "make test" would run tests locally and in CI pipeline, keeping the CI file refreshingly short at that point.
zelphirkalt•7mo ago
Make allows you to specify dependencies for you targets, which are also targets. As such you do not need to rely on brittle string concatenation approaches. It is a tool build for this.

I personally like going to a project folder and run "make run", no matter what language or setup I have, to run the project. It enables me to unify access to projects.

I also take great care to make these runs reproducible, using lock files and other things of the ecosystems I am using, whenever possible. I work on another machine? git clone, make run. Or perhaps git clone, make init, make run.

danlitt•7mo ago
Make is in POSIX, so it's generally available. Same reason people write shell scripts (even if the scripts are not generally POSIX-only).
bshacklett•7mo ago
Unless your company forces you to use Windows, which is still much more common than many would like to admit. And yes, WSL exists, but in my experience, if a company is unwilling to allow macOS, there’s a good chance they either don’t allow enabling HyperV, or the security software they use is such garbage that it results in a HyperV enabled system being effectively unusable.
pjmlp•7mo ago
Windows 11 requires Hyper-V turned on, virtualization based security is one of the reasons of the forced hardware upgrades.
bshacklett•7mo ago
Any chance you could provide links to documentation around that? I haven't been able to find anything definitive about exactly what's required and what's enabled by default.
lelanthran•7mo ago
Unless the company also forcefully prevents installation of git bash, you'll have make as well.

I know, I know, what developer on windows uses git via the official git windows client, right? /s

bshacklett•7mo ago
Having make doesn't help much if you don't have the commands that it's calling.
PhilipRoman•7mo ago
You don't have to write Make invocations by hand... It's just a tool that can be called from any editor or IDE (or by automatic file watchers). Environment variables aren't really relevant to Make either, unless you really want to misuse it as a command runner.
cerved•7mo ago
I like it because it's language and tooling agnostic, declarative, fast and ubiquitous.

Where it's less great is complicated recipes and debugging

xigoi•7mo ago
Make is not language agnostic; it has implicit rules for compiling C.
pheggs•7mo ago
it also has implicit rules for other languages, why would that make it non-agnostic?
dima55•7mo ago
Look at "remake": a drop-in fork of GNU make, with an interactive debugger.
aboardRat4•7mo ago
Because make is a prolog in disguise.
gjvc•7mo ago
you don't do it naked, you write and use wrapper scripts to make it ergonomic
motorest•7mo ago
> Interacting with CLI tools using only env vars as arguments is cartoonishly bad dev experience.

Make excels at what it's design to do: specify a configurable DAG of tasks that generate artifacts, execute them, and automatically determine which subgraph requires updates and which can be skipped by reusing their artifacts.

I wonder: which tool do you believe does this better than Make?

system33-•7mo ago
Tup. https://gittup.org/tup/ https://gittup.org/tup/make_vs_tup.html

But the Internet’s make mind-share means you still have to know make.

Edit: and make lets you use make to essentially run scripts/utils. People love to abuse make for that. Can’t do that with tup.

aDyslecticCrow•7mo ago
Abuse? Runnig linters, code analysers, configuration tools, template engines, spellcheckers, pulling dependencies, building dependencies with different build systems.

Sufficiently complex project need to invole alot of wierd extra scripts, and if a build system cannot fulfil it... the n it needs to be wrapped in a complex bash script anyway.

motorest•7mo ago
> Tup.

I don't think Tup managed to present any case. Glancing at the page, the only conceivable synthetic scenarios where they can present Tup in a positive light is built times of > 10k files, and only in a synthetic scenario involving recompiling partially built projects. And what's the upside of those synthetic scenarios? Shaving w couple of seconds in rebuilds? That's hardly a compelling scenario.

kiitos•7mo ago
> Tup

`tup` relies on a stateful database, which makes it incomparable to `make`.

Crier1002•7mo ago
ive always wanted this. im going to give it a go!

does this happen to support IDE like vscode?

antonhag•7mo ago
From the readme:

  VSCode Extension
    1. Open VSCode
    2. Go to Extensions (Ctrl+Shift+X)
    3. Search for "mbake Makefile Formatter"
    4. Click Install
Crier1002•7mo ago
thanks! apologies i was on mobile and missed this. im excited to try it out
s4i•7mo ago
Does this support inline ignoring specific rules with some syntax? Couldn’t find this from the README. Would be good to have as an escape hatch.
pjmlp•7mo ago
I am quite certain to have used such kind of tooling during 1990's, with ads on The C/C++ Users Journal and Dr. Dobbs developer magazines.
JdeBP•7mo ago
It wouldn't have been Matthias Andrée's makel, then.

* https://git.maandree.se/makel

Or unmake.

* https://crates.io/crates/unmake

Or checkmake.

* https://github.com/checkmake/checkmake (https://news.ycombinator.com/item?id=32460375)

Or make-audit.

* https://github.com/david-a-wheeler/make-audit

Or the Sublime linter for makefiles.

* https://github.com/giampaolo/SublimeLinter-contrib-makefile

It hasn't taken quite the 50 years that we are told, has it? (-:

1oooqooq•7mo ago
ewwww. consolidated phony lines. everyone knows these should be right before each rule declaration.
leetrout•7mo ago
Seems like from the README this can be disabled

  group_phony_declarations = false

I think the visual clutter of .PHONY on each recipe declaration is better since there’s always a lot of copy-paste coding.
b0a04gl•7mo ago
some Makefiles use indents or var placement as semantic cues. if a tool rewrites them mechanically, it might clean things while killing meaning. is structural correctness enough, or do we need formatters that preserve human context too?
iib•7mo ago
Ideally, we'd have linters that preserve the human context as well. But human context may be too ambiguous and high variance enough that it can be impractical.

It's hard to say what's intent and what not, maybe linters with many custom rules would work best.

jchw•7mo ago
That doesn't sound any different than it is for any other programming language, but many people prefer automatic formatting anyways.
kseistrup•7mo ago
Here's an AUR package:

https://aur.archlinux.org/packages/python-bake-git

eabeezxjc•7mo ago
simple use rake
notnmeyer•7mo ago
or any other task runner
rurban•7mo ago
Differences to checkmake, the older Makefile's linter and formatter?
rednafi•7mo ago
Thanks for the tool. This is pretty neat.

It’s almost comical to see “why Python” comments after all these years. I would’ve chosen Go to write this, but that’s beside the point.

Yes, Python installation is tricky, dependency management is a mess (even with uv, since it’s not standard tooling; another one will pop up), and performance is atrocious. But even then, some Python libraries have bigger communities than the combined communities of all these “better, faster, more awesome” languages.

Python is here to stay. Newcomers love it because you need to know so little to get started. People don’t care about the little quirks when they begin, and eventually they just live with the warts. That’s fine. LLMs write better Python than Go (my preferred language, or whatever yours is). And if you know anything about the AI research community, it’s C++, C, Python or GTFO.

Going forward, a lot more tools will be written in Python, mostly by people entering the field. On top of that, there’s a huge number of active Python veterans churning out code faster than ever. The network effect keeps on giving.

So whatever language you have in mind, it’s going to be niche compared to Python or JS. I don’t like it either. But if languages and tools were chosen on merit instead of tribalism, we wouldn’t be in this JS clusterfuck on the web.

kiitos•7mo ago
> It’s almost comical to see “why Python” comments ... Yes, Python installation is tricky, dependency management is a mess (even with uv, since it’s not standard tooling; another one will pop up), and performance is atrocious. But ... Newcomers love it because you need to know so little to get started. People don’t care about the little quirks when they begin, and eventually they just live with the warts.

I'm not sure if this is news to you or if you already know it, but, just to be explicit -- you know that the overwhelming majority of end users aren't gonna have `pip` installed on their systems, right? And that any project with "Installation instructions" that begin with a `pip` command aren't really gonna work in the general case?

Just wanna make sure that's well-understood... it's fine if you wanna build a tool in Python, but if you expect it to be practically usable, you need to do distribution of binaries, not `pip` targets...

rednafi•7mo ago
This point has been pummeled to death for decades. Before Python, people did the same with Ruby and “gem.” Literally nothing is new here.

One of the reasons I write my tools in Go is exactly this. But if the tool was written in Go, people would complain about why not Rust and such. The point wasn’t to convey that Python doesn’t have its fair share of flaws, but to underscore that the HN crowd doesn’t represent any significant majority. The outside world keeps on using Python, and the number of Go or Rust users is most likely less than PyTorch or Scikit-learn users.

Shipping Python is hard and the language is slow. Also, tooling is bad. The newfangled ones are just a few in the long stream of ad hoc tooling over the past 20 years. Yet people write Python and will continue to do so. JS has a similar story, but it’s just a 10x worse language than Python.

kiitos•7mo ago
Let me be even more explicit: if your installation instructions are `pip install ...` -- or `npm install ...` for that matter -- then you are automatically excluding a super-majority of potential users.
rednafi•7mo ago
I don’t even write python these days. I just wrote my own version of a terminal llm-caller[^1] in Go for this exact same reason.

There’s a famous one that does the same thing but is written in Python. So it has its issues.

My point is, pip exists in most machines. pip install sucks but it’s not the end of the world. HN crowd (including myself) has a tendency to beat around the bush about things that the majority don’t care about IRL.

[1]: https://github.com/rednafi/q

vachina•7mo ago
You only have to install pip once. It’s a one-time set and forget operation. And with conda, it’s even easier with just click and install.
kiitos•7mo ago
Even if `pip` is installed, it doesn't solve the problem of reliable reproducibility, because `pip install <identifier>` doesn't have deterministic results, it behaves differently based on arbitrary, implicit, and un-documented host-specific properties -- like, which version of python is used, which set of dependencies are used, etc. And what the hell is conda?
callc•7mo ago
I love python, have used it for years. I hate the dependency and multiple interpreter situation.

A great PL should stand on its own without the need for external tooling.

At this point I have given up on python except for if it’s a little script that only uses standard libraries. Otherwise I’m choosing a compiled language.

Some more thoughts: http://calvinlc.com/p/2025/06/10/thank-you-and-goodbye-pytho...

TZubiri•7mo ago
I use python without any dependencies on web servers. Pip is cool, but you don't need to get pulled into the node-like dependecy hell.

For example instead of requests, you can use http.client, instead of flask, http.server, or socket.tcpserver, or just socket. If you want sqlite, don't jump to pip install sqlite or whatever, use sockets to talk to it.

jonotime•7mo ago
How do you use only sockets to talk to sqlite?
rednafi•7mo ago
Why do you need to do that when Python has built in sqlite3 support?
TZubiri•7mo ago
Right, my bad, I was thinking of psql or mysql.

If you had to use sqlite without library, you can trivially call the c api from python directly with the ctypes builtin (or compile a python module with c api)

blks•7mo ago
it’s harder to distribute software written in python via eg package manager compared to compilable languages.
seanwilson•7mo ago
Anyone else not bother maintaining a list of .PHONY targets? Always felt like a chore that adds noise for a rare edge case.
leetrout•7mo ago
> The implicit rule search (see Using Implicit Rules) is skipped for .PHONY targets. This is why declaring a target as .PHONY is good for performance, even if you are not worried about the actual file existing.

https://www.gnu.org/software/make/manual/html_node/Phony-Tar...

CableNinja•7mo ago
I use a shell command as .PHONY, to keep it always synced. the command looks through the makefile, and then outputs the targets for the line.

I also use a similar pattern to provide a `help` target, which shows all targets, and a blurb about its purpose

jbverschoor•7mo ago
Makefile is “make file“. It has been abused into being a task runner. The wrong tool for the job.

The “make file” is all about file dependencies based on last modified date. Outdated target files can be rebuilt using source file. It’s is dependency management and the essence of an incremental compiler, but all revolving around files, not tasks.

tgv•7mo ago
The nice thing about make is that is ubiquitous, and that it offers nice things out of the box.
jbverschoor•7mo ago
This is so unfortunate about these ubiquitous tools.

At a certain point we seem to have stopped adding tools to POSIX.

Does anyone know why exactly?

wahern•7mo ago
To be added to POSIX usually requires common existing availability of a feature, if not literally at least substantially similar and not too difficult to add a POSIX-compliant mode. Fortunately this has become easier to achieve now that most of the more esoteric Unix-like systems have died off.

POSIX-2024 added at least three new utilities: readlink, realpath, and timeout.[1] (It also added the gettext localization framework, which includes new C APIs and a few additional shell utilities.) Many utilities gained new flags and features, including Make. For example, POSIX Make now supports "!=" variable assignment for capturing shell command invocations, as well as guaranteed computed macro name evaluation (i.e. `$($(FOO).$(BAR))`). The latter actual gives a standards compliant way to implement conditionals, and interestingly had already been supported on all common Make implementations for a very long time.

These days anybody can meaningfully participate in POSIX. You can get started by checking out https://austingroupbugs.net/, where both errata and suggestions for new features can be added. There's also a mailing-list you can join, though most of the discourse happens in the ticket tracker. But please don't spam new feature requests, a la GitHub drive-bys. Spend a good amount of time understanding the specification and existing review processes, e.g. by reading alot of ticket discussions.

[1] See https://sortix.org/blog/posix-2024/

dima55•7mo ago
Right. It kinda sucks for that purpose too, which gives Make a bad name.
kristopolous•7mo ago
What gives make a bad name is the same thing that gave javascript or m4 a bad name - these things are their own exotic birds - doing them well require new concepts and new behaviors.

You can indeed shoehorn them into what you know but really you need to fully embrace their weird world.

See also forth, dc, awk, jq ...

It'd be nice to have a dedicated crash course on these things for people who understand conventional programming and have been doing the normal stuff for a number of years.

Also see supercollider, prolog, haskell, apl...

I think the most mainstream exotic bird people learn is Lisp. Doing all these things well is as different as Lisp is from say conventional python.

anthk•7mo ago
Forth it's far easier than dc.

On Lisp, exotic? it's damn easy. Haskell it's far worse.

eddythompson80•7mo ago
I’m confused. Are you saying that python is less exotic than javascript, jq, awk, m4, haskell, lisp, dc, prolog, apl, and supercollider therefore it’s bad, but the least bad out of these?
jonhohle•7mo ago
It may suck for it, but it’s better than a collection of random scripts and commands baked into CI configuration that evolve to become unrunnable in normal dev environments.
paulddraper•7mo ago
It works fine for PHONY targets.

But most people don’t realize in many cases they can do better than that.

kiitos•7mo ago
Consolidation of .PHONY targets is an anti-feature, the .PHONY decl is supposed to be adjacent to its target...
worthless-trash•7mo ago
Possible opinion detected. Explain why.
chrismorgan•7mo ago
Look at https://github.com/EbodShojaei/bake#basic-formatting. It starts with a horribly contrived example¹ including this²:

  .PHONY: clean
  all: $(TARGET)
      $(CC) $(CFLAGS) -o $@ $^

  .PHONY: install
  clean:
      rm -f *.o
And changes it to this with a consolidated .PHONY, but still no install target. Surely it should complain “there is no install target, what are you marking it as phoney³ for?”

  .PHONY: all clean install

  all: $(TARGET)
      $(CC) $(CFLAGS) -o $@ $^

  clean:
      rm -f *.o
I will not say that this way of writing it is unreasonable; users unfamiliar with the available targets can benefit from such a thing up the top (though in practice there’s normally a block of other stuff first, and other ways of achieving it). But this is also a reasonable way of writing it, with strong advantages of its own:

  .PHONY: all
  all: $(TARGET)
      $(CC) $(CFLAGS) -o $@ $^

  .PHONY: clean
  clean:
      rm -f *.o

  .PHONY: install
  # Um… where’s the `install:` line?
Treating .PHONY as more an inline attribute like this rather than a target of its own makes it much more obvious that the install target is missing, and makes desynchronisation of .PHONY and the actual targets much less likely.

—⁂—

¹ The first atrocity is that it’s not even a legal makefile: barring a .RECIPEPREFIX override, recipes must be indented by one tab. Running make with this file produces “Makefile:10: ** missing separator. Stop.” Taking invalid code and making it valid is not the domain of a linter or formatter. The Markdown is also abysmal because it doesn’t use tabs, but rather a single space in the output. Given that tabs are structural in makefiles, this is an astonishing lapse.

The second atrocity is the mismatching of .PHONY targets, despite joining the lines (by not having a blank line after the .PHONY line), which is completely unrealistic. Or at least I find it so.

² I have normalised whitespace so we can focus on the .PHONY changes. Assume tabs are where they need to be. Unfortunately HN hates interesting whitespace.

³ Ah, the number of times I’ve written .PHONEY… stupid americentric software.

worthless-trash•7mo ago
Thanks for taking the time ! I had to write some demos out to test, but you are thoroughly correct.
teo_zero•7mo ago
If only it accepted POSIX syntax...
AdieuToLogic•7mo ago
Speaking of make...

A while back I attended an open-source conference (which was a lot of fun). After the presentations, people would "set up shop" at tables and jam on whatever was their fancy.

One evening there was a person using make as a SAT solver[0]. That blew my mind to be honest. I had used make for years as a build tool and never thought of it in that problem space.

This memory isn't relevant to this project. I was just reminded of the experience is all.

0 - https://en.wikipedia.org/wiki/SAT_solver