Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

    make figures out which files need updating
    make allows to write pattern rules (.c.o:, or %.o: %.c)
    you don't need to move files out of the 'inbox'
      to ignore them
    regenerating a file is a touch(1) away
    make is descriptive, not imperative (invaluable
      readability when you're coming back on it years later)
    should you ever need a second transformative step or
      a new dependency, it's trivial to insert, and make
      will figure stuff out
    make can trash intermediate results automatically
    make is crazy fast
    make variables are not environment variables
    make has multiple variable assignations, resulting in
      some early/late evaluation system (early with :=,
      late with =, $() is always late unless part of a :=)
    make outputs commands as they're executed (not with a global)
    make outputs nothing when commands are prefixed with @ (not with a global)
    make interrupts itself on a chain failure
    each make recipe line is executed in a distinct shell
You can set bash to do some of those things, or you can write bash code that do some of those, but most of the time you end up just coercing bash into behaving like make.

Of course I would not write everything in make. But knowing what make can do makes it the obvious choice for some tasks, and helps you coming up with a robust task/generator system in a snap, whereas coming up with a task/generator system in bash quickly is already not that easy, and making it robust even less.



"make is crazy fast"

Make calls the shell in order to run programs, correct?

(IOW, does make call execve directly, as the shell does?)


Indeed, execve in exec_command (job.c). That does not make it slow, since it's the very last part of the game, and one you could not really do without.




Consider applying for YC's Winter 2026 batch! Applications are open till Nov 10

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: