{"slug": "gnu-make", "name": "GNU Make", "category": "dev-libs", "category_name": "Libraries and frameworks", "description": "", "recommenders": 4, "commenters": 5, "warners": 0, "score": 4.107, "rising": 1.35, "first": "2026-06-08", "latest": "2026-10-01", "why": "Make has long been my go-to script runner and build tool, simple and ubiquitous", "why_is_quote": true, "has_verdict": false, "sentiment": {"recommend": 4, "neutral": 1, "compare": 0, "warn": 0}, "spark": [0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 2], "listed": true, "loved": [], "caveat": "", "short_quote": "Make has long been my go-to script runner and build tool, simple and ubiquitous", "icon": true, "domain": null, "github_repo": null, "official_url": "https://www.gnu.org/software/make/", "pricing": "", "aliases": ["GNU Make"], "verdict": null, "praise": [{"label": "", "summary": "", "quotes": [{"id": 798744000, "item_id": 49921500, "url": "https://news.ycombinator.com/item?id=49921500", "by": "adrian_b", "date": "2026-10-01", "stance": "recommend", "quote": "Like anything else, recursive make can be used in a right way and in a wrong way.", "excerpt": "Like anything else, recursive make can be used in a right way and in a wrong way. It can be used in a wrong way, like described in the article linked by you, when it results in slow project building. How I use recursive make, it does not introduce any slowdown whatsoever. I organize my projects so that there is a one-to-one correspondence between leaf Makefiles and the final files that are generated as a result of th", "context": "", "use_case": "project build system", "switched_from": "", "story": "Recursive `make` and `-j`"}, {"id": 798721985, "item_id": 49920124, "url": "https://news.ycombinator.com/item?id=49920124", "by": "Piraty", "date": "2026-10-01", "stance": "recommend", "quote": "It then becomes just `make release`. it is portable already and does not add yet another host dependency", "excerpt": "> I built Ledge because I spend much of my day copy/pasting commands from my notes into the terminal. I was inspired by how much cmux helped me organize my terminals - but there was still a split brain between my notes and frequently Run commands. I've been daily-driving it for the past few weeks and use it for deploys, API calls, smoke tests, etc. I see it might be handy for exploring your own pipelines (and so are ", "context": "", "use_case": "calling project scripts", "switched_from": "", "story": "Show HN: Ledge.sh \u2013 Runnable Markdown Notes"}, {"id": 785446433, "item_id": 49090402, "url": "https://news.ycombinator.com/item?id=49090402", "by": "f18m", "date": "2026-07-28", "stance": "recommend", "quote": "Make has long been my go-to script runner and build tool, simple and ubiquitous", "excerpt": "A fun project I started about a month ago. Make has long been my go-to script runner and build tool, simple and ubiquitous, but as my projects piled up, I kept hitting the same problem: I'd write a useful makefile target for one project, then copy-paste it into the next, and so on. MKPM offers a way to share makefiles within teams. It has some limitations for now, but may evolve in the future.", "context": "", "use_case": "script runner and build tool", "switched_from": "", "story": "Show HN: MKPM \u2013 GNU Make Package Manager"}, {"id": 775281632, "item_id": 48455102, "url": "https://news.ycombinator.com/item?id=48455102", "by": "zelphirkalt", "date": "2026-06-08", "stance": "recommend", "quote": "I use GNU Make for my Python and GNU Guile projects just fine.", "excerpt": "I use GNU Make for my Python and GNU Guile projects just fine. For Python projects it becomes a job runner of tooling commands. For Guile projects it uses a SHELL that is a guix shell, which references channels and manifest, to ensure reproducibility.", "context": "", "use_case": "job runner for tooling commands", "switched_from": "", "story": "OCaml Onboarding: Introduction to the Dune build system"}]}], "caveats": [], "who": [], "tags": [], "use_cases": ["project build system", "calling project scripts", "documenting data pipelines", "script runner and build tool", "job runner for tooling commands"], "compared": [], "makers": [], "threads": [{"url": "https://news.ycombinator.com/item?id=49912094", "title": "Recursive `make` and `-j`", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49902382", "title": "Show HN: Ledge.sh \u2013 Runnable Markdown Notes", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49607858", "title": "Maak.el: Lisp machine command runner in Emacs, infinitely extensible and Scheme", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49090245", "title": "Show HN: MKPM \u2013 GNU Make Package Manager", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=48402137", "title": "OCaml Onboarding: Introduction to the Dune build system", "mentions": 1}], "sentiment_by_month": {"2025-11": {}, "2025-12": {}, "2026-01": {}, "2026-02": {}, "2026-03": {}, "2026-04": {}, "2026-05": {}, "2026-06": {"recommend": 1}, "2026-07": {"recommend": 1}, "2026-08": {}, "2026-09": {"neutral": 1}, "2026-10": {"recommend": 2}}, "quotes": [{"id": 798744000, "item_id": 49921500, "url": "https://news.ycombinator.com/item?id=49921500", "by": "adrian_b", "date": "2026-10-01", "stance": "recommend", "quote": "Like anything else, recursive make can be used in a right way and in a wrong way.", "excerpt": "Like anything else, recursive make can be used in a right way and in a wrong way. It can be used in a wrong way, like described in the article linked by you, when it results in slow project building. How I use recursive make, it does not introduce any slowdown whatsoever. I organize my projects so that there is a one-to-one correspondence between leaf Makefiles and the final files that are generated as a result of th", "context": "", "use_case": "project build system", "switched_from": "", "story": "Recursive `make` and `-j`"}, {"id": 798721985, "item_id": 49920124, "url": "https://news.ycombinator.com/item?id=49920124", "by": "Piraty", "date": "2026-10-01", "stance": "recommend", "quote": "It then becomes just `make release`. it is portable already and does not add yet another host dependency", "excerpt": "> I built Ledge because I spend much of my day copy/pasting commands from my notes into the terminal. I was inspired by how much cmux helped me organize my terminals - but there was still a split brain between my notes and frequently Run commands. I've been daily-driving it for the past few weeks and use it for deploys, API calls, smoke tests, etc. I see it might be handy for exploring your own pipelines (and so are ", "context": "", "use_case": "calling project scripts", "switched_from": "", "story": "Show HN: Ledge.sh \u2013 Runnable Markdown Notes"}, {"id": 793993122, "item_id": 49624570, "url": "https://news.ycombinator.com/item?id=49624570", "by": "wwfn", "date": "2026-09-09", "stance": "neutral", "quote": "I try to use Makefile to document data pipelines, but it's easy for it to become spaghetti.", "excerpt": "It looks like maak does not have a mechanism for specifying file dependencies (run recipe when dependent file is newer than output file). I'd love to be wrong. I try to use Makefile to document data pipelines, but it's easy for it to become spaghetti. [Edit: There's the decade-stale https://github.com/factual/drake \"Drake is similar to GNU Make, but designed especially for data workflow management\". I can't remember ", "context": "", "use_case": "documenting data pipelines", "switched_from": "", "story": "Maak.el: Lisp machine command runner in Emacs, infinitely extensible and Scheme"}, {"id": 785446433, "item_id": 49090402, "url": "https://news.ycombinator.com/item?id=49090402", "by": "f18m", "date": "2026-07-28", "stance": "recommend", "quote": "Make has long been my go-to script runner and build tool, simple and ubiquitous", "excerpt": "A fun project I started about a month ago. Make has long been my go-to script runner and build tool, simple and ubiquitous, but as my projects piled up, I kept hitting the same problem: I'd write a useful makefile target for one project, then copy-paste it into the next, and so on. MKPM offers a way to share makefiles within teams. It has some limitations for now, but may evolve in the future.", "context": "", "use_case": "script runner and build tool", "switched_from": "", "story": "Show HN: MKPM \u2013 GNU Make Package Manager"}, {"id": 775281632, "item_id": 48455102, "url": "https://news.ycombinator.com/item?id=48455102", "by": "zelphirkalt", "date": "2026-06-08", "stance": "recommend", "quote": "I use GNU Make for my Python and GNU Guile projects just fine.", "excerpt": "I use GNU Make for my Python and GNU Guile projects just fine. For Python projects it becomes a job runner of tooling commands. For Guile projects it uses a SHELL that is a guix shell, which references channels and manifest, to ensure reproducibility.", "context": "", "use_case": "job runner for tooling commands", "switched_from": "", "story": "OCaml Onboarding: Introduction to the Dune build system"}]}