Slashdot Mirror


GNU Make 4.0 Released

jones_supa writes "A new major version of the classic GNU Make software has been released. First of all, Make 4.0 has integration support for GNU Guile Scheme. Guile is the extension system of the GNU project that is a Scheme programming language implementation and now in the Make world will be the embedded extension language. 4.0 also features a new 'output-sync' option, 'trace-enables' for tracing of targets, a 'none' flag for the 'debug' argument, and the 'job server' and .ONESHELL features are now supported under Windows. There are also new assignment operators, a new function for writing to files, and other enhancements. It's been reported that Make 4.0 also has more than 80 bug-fixes. More details can be found from their release announcement on the mailing list."

179 comments

  1. GNU Guile, eh? by rodrigoandrade · · Score: 2, Funny

    I myself prefer GNU Ryu and GNU Ken, but a lot of people seem to do well with GNU Chun Li.

    1. Re:GNU Guile, eh? by Anonymous Coward · · Score: 0

      GNU Chun Li? I'm afraid that would look like this.

    2. Re:GNU Guile, eh? by Anonymous Coward · · Score: 0

      Gnuryuken!

  2. Lua for GUILE? by Anonymous Coward · · Score: 1

    Didn't they plan to introduce a Lua frontend to GUILE? Does anyone of you know what happened to that?

    1. Re:Lua for GUILE? by kthreadd · · Score: 3, Informative

      From http://www.gnu.org/software/guile/:
      "In addition to Scheme, Guile includes compiler front-ends for ECMAScript and Emacs Lisp (support for Lua is underway),..."

      So unless that page is inaccurate I guess that means it's still underway.

    2. Re:Lua for GUILE? by Anonymous Coward · · Score: 0

      Thanks.
      Unfortunately, web sites are often not up-to-date.
      The last repo entry is from a month ago, so I hoped one of the developers could confirm it's well-being/death/hiatus state...

    3. Re:Lua for GUILE? by Jonner · · Score: 1

      From http://www.gnu.org/software/guile/:
      "In addition to Scheme, Guile includes compiler front-ends for ECMAScript and Emacs Lisp (support for Lua is underway),..."

      So unless that page is inaccurate I guess that means it's still underway.

      Where in the announcement of Make 4.0 is there any mention of Lua?

    4. Re:Lua for GUILE? by Anonymous Coward · · Score: 0

      There isn't. The discussion _you_ quoted was about guile.

    5. Re:Lua for GUILE? by durin · · Score: 1

      Thank god they're actually trying to support a sensible scripting language as well (goes without saying that I don't like lisp derivates).

      --
      Why, yes! I AM new here.
    6. Re:Lua for GUILE? by Jonner · · Score: 1

      I still say it has nothing to do with Make. I guess I shouldn't have replied to a post responding to an AC.

  3. Plagiarism by Anonymous Coward · · Score: 0

    You've quoted exactly from the original article, with only a blind link to it. You have not credited the original author whatsoever. jones_supa should receive a permament HORRIBLY EVIL karma rating, and all his posts should start with -9999 moderation.

  4. Me gusta! by serviscope_minor · · Score: 5, Informative

    This looks good.

    The --trace option is really nice. For some reason people think it is prettier to have makefiles not print put the compile lines. It is, of course, until it breaks.

    Make is one of those widely misunderstood tools. Despite being far simpler than, e.g. C it seems to be understood much worse. It's also sad that it diverged long ago, but it's good to see GNU trying to make it compatible with the divergent BSD and POSIX variants too.

    One Make to rule them all! While it seems fashionable not to use the GNU tools these days (for instance distros using less featureful and now slower AWKs than gawk by default), GNU Make is truly the superior one. It is very featureful and an excellent part of a build system.

    --
    SJW n. One who posts facts.
    1. Re:Me gusta! by phantomfive · · Score: 1

      For some reason people think it is prettier to have makefiles not print put the compile lines. It is, of course, until it breaks.

      That drives me crazy. Why would anyone want not to actually see the commands that are getting run? Make them pretty if you must, but show what you are doing.

      --
      "First they came for the slanderers and i said nothing."
    2. Re:Me gusta! by Anonymous Coward · · Score: 0

      Why would anyone want to see 1000 lines output by compiling gcc?
      It's completely pointless.
      Do you have your kernel print a trace of every function it calls?
      Make has flags to enable and disable printing of output. If you want to debug your shit, just enable the output printing.
      Also, the reason everyone hates gnu make is because the documentation is horrible.
      The documentation actually gives examples that are wrong and inefficient.
      It doesn't help that autotools default are also completely brain dead and inefficient.

      Sure if you plow through all the docs you can find all the information, but it should just not be this hard.

    3. Re:Me gusta! by Anonymous Coward · · Score: 1

      ... For some reason people think it is prettier to have makefiles not print put the compile lines. It is, of course, until it breaks.

      ...

      "Think" has nothing to do with that. People who do that are certainly not thinking.

    4. Re:Me gusta! by Anonymous Coward · · Score: 0

      people still use make? i moved to Ant a long time ago and have never looked back.

    5. Re:Me gusta! by Anonymous Coward · · Score: 0

      I usually have my makefiles just summarize what they're doing rather than dump the commandline, as I only really need to see the commandline if I've been messing with build settings, etc. But I set up a make variable, so when I _do_ need to see the actual commandlines, I can use 'make VERBOSE=1' instead of just 'make'.

      I'm interested to see what new features are added by make 4.0, as I've yet to find anything I couldn't do with make 3.8 - especially when using features like $(eval $(call my_dynamic_target_syntax)). Having access to Scheme syntax could be beneficial, but I've always thought that advanced usage of make starts to approximate some kind of Lisp anyway, so...

    6. Re:Me gusta! by Anonymous Coward · · Score: 2, Insightful

      That drives me crazy. Why would anyone want not to actually see the commands that are getting run? Make them pretty if you must, but show what you are doing.

      Too much build spew means it's harder to spot the compiler warning spew. It's pretty useful to only see the unexpected output.

    7. Re:Me gusta! by Anonymous Coward · · Score: 0

      not to actually see

      The motivation for me is to quickly identify where a build breaks. That is more difficult when output is obscured by tool commands wrapping around the terminal 12 times per line. I rarely care about the content of the commands; I'm interested in picking out compiler/linker/whatever diagnostics from among all the noise.

      Crafting recipes is something that shouldn't be happening frequently; once you've figured out how to build something you are supposed to have moved on to actually building it, not dwelling on the tools and their invocation. If you need to read, re-read and re-read again the same commands used to build you're doing something wrong. If you're not doing it wrong then the rare times when you need to see all the gory detail can be accommodated with non-default switches, such as --trace.

    8. Re:Me gusta! by Anonymous Coward · · Score: 0

      Call me when Ant can understand that an inner class has changed and recompile dependencies of it. As I type this, I'm beating Ant about the head trying to get it to understand when it needs to recompile which class files. By contrast, none of my projects with make have ever had this issue.

    9. Re:Me gusta! by dyingtolive · · Score: 4, Funny

      Any time I want to slack off or if I need some more time to work on something useful rather than the pointless tasks delegated in the name of excess micromanagement, I just kick off a kernel build on three or four different boxes and tell my boss I'm testing a client issue.

      You say pointless, but I think what you mean is ESSENTIAL.

      --
      Support the EFF and Creative Commons. The war is coming, and they're supporting you...
    10. Re:Me gusta! by Anonymous Coward · · Score: 0

      Exactly this.
      When ther's 10K lines of complier input to sort through, missing a new warning is far more likely then spotting it.

    11. Re:Me gusta! by X0563511 · · Score: 1

      That's what set +x is for.

      --
      For large sets, this will be our guide even unto death, for the LORD will work for each type of data it is applied to...
    12. Re:Me gusta! by phantomfive · · Score: 1

      Why would anyone want to see 1000 lines output by compiling gcc? It's completely pointless.

      Because it's not completely pointless.

      --
      "First they came for the slanderers and i said nothing."
    13. Re:Me gusta! by Anonymous Coward · · Score: 0

      That's why everyone has moved on to CMake or SCons.

    14. Re:Me gusta! by gmack · · Score: 1

      Once your project reaches a certain size the actual commands and their arguments end up making a multiline mess for each command and aren't actually that helpful unless it's the build process itself you are debugging. It gets even worse if you generate dependency files which involve piping the output of gcc through some arcane sed commands.

      I generally prefer having make tell me what it's doing (Generating depfile.d, building file.c, linking file.o) etc. And then it's very easy to spot what file threw the error. Where I work, we turn on every GCC warning we can find and that alone is several lines per gcc execution (programmers are under orders to not leave warnings). Compiles here happen several times an hour but the build system only gets worked on when I have some free time and feel like I need some pain in my life (once a year at best). The other programmers don't know or care that the build system crawls the source tree, duplicates the tree structure in a build folder, generates dependency and object files in the corresponding subfolders of the build folder etc etc. They only want to see what source or include file they broke.

    15. Re:Me gusta! by Darinbob · · Score: 1

      Often it scrolls by too fast. You want to see how far along you are in a build but if every command has 5 lines long and scrolls by faster than you can read then it's not helpful, except to review a log file afterwords.

    16. Re:Me gusta! by Darinbob · · Score: 2

      Ant is great if you are building something that works the way Ant expects it to. Make is a bit easier to adapt to products that don't fit simple patterns. Using Ant is a lot like building with an IDE, everything is great if you do things the way that the tool expects everyone to do things, but it becomes cumbersome when you want to do your build a different way. Now Ant may not be that bad if you use a pre-generated starting point (ie, Eclipse dumps a sample build.xml for you), but the result of a simple project there is much more verbose than the equivalent makefile, and essentially don't do anything new or different from Make. How can it hide more details of what is actually being performed (the actual shell commands) while still resulting in a larger and more difficult to read file?

      I evaluated several build methods when trying to replace an existing build system for an existing product, and almost all of them would have required far more work and customization (in Java or Python or something else) than GNU Make required.

      When the Ant documentation starts off by bitching that Make is "evil" (their words) because of the space versus tab thing and then their solution is to use XML style verbage, then the conclusiong is that it is not attempting to be objective.

      Make is very simple to learn. It looks hard mostly because it's so easy to hack it to do your build the wrong way and then someone other than the original author ends up having to maintain it. The hard part is knowing how to create a Makefile that is simple while still being maintainable and flexible. There are so many things it does right that there have been several alternative build systems over the years that create makefile on the backend to do the real work.

      Also use a decent Make as well. GNU Make is much better to use than some older basic implementations (like that absymal parody that comes with Visual Studio). Even better with GCC creating automatic header file dependencies for you, which is often the most difficult part to get working for novices.

    17. Re:Me gusta! by J'raxis · · Score: 3, Insightful

      Because if the last line of those 1000 lines is "make: *** Error 1", suddenly the one right above it is not so pointless.

    18. Re:Me gusta! by Anonymous Coward · · Score: 0

      Well, you could use sort with eliminate duplicate lines followed by diff.

    19. Re:Me gusta! by phantomfive · · Score: 1

      Yeah, if it goes into a log file I can check afterwards, that's fine with me, as long as the location of the log file is easy to figure out.

      --
      "First they came for the slanderers and i said nothing."
    20. Re:Me gusta! by phantomfive · · Score: 1

      That kind of thing works fine if you understand the build process already, but if you don't, then having all the stuff print out is very useful.

      --
      "First they came for the slanderers and i said nothing."
    21. Re:Me gusta! by phantomfive · · Score: 1

      cool trick, thanks, I'll try it next time

      --
      "First they came for the slanderers and i said nothing."
    22. Re:Me gusta! by hobarrera · · Score: 1

      Because I just downloaded the lastest snapshot of X and want to build it. I only care about every specific line if something breaks (to report it). I probably won't understand most of what it's doing anyway.

    23. Re:Me gusta! by phantomfive · · Score: 1

      The best build systems, you begin to understand them just by staring at the output over and over

      --
      "First they came for the slanderers and i said nothing."
    24. Re:Me gusta! by gmack · · Score: 1

      Why? It autodetects source files and subfolders so they never need to touch the build system.

    25. Re:Me gusta! by CSMoran · · Score: 1

      Make has flags to enable and disable printing of output. If you want to debug your shit, just enable the output printing.

      "Just enable" works when the 'make' you execute is the only one. In a maze of scripts and Makefiles and scripts generating Makefiles and scripts generating scripts that call make, euphemistically called "a custom buildsystem", hunting down the right 'make' to change into 'make -d' can take a while.

      --
      Every end has half a stick.
    26. Re:Me gusta! by Anonymous Coward · · Score: 0

      Exactly this. When ther's 10K lines of complier input to sort through, missing a new warning is far more likely then spotting it.

      And that's why god gave us grep.

    27. Re:Me gusta! by phantomfive · · Score: 1

      That part is fine, I am referring to hiding the details about the build. It's a real pain to download a project, try to get it to compile on a different platform (or even the same platform), and then have all the build commands hidden. Especially when you don't have a coworker nearby who understands what is going on.

      --
      "First they came for the slanderers and i said nothing."
    28. Re:Me gusta! by c++0xFF · · Score: 1

      You've never done a parallel build on a large project, have you? The output gets disgustingly obnoxious (the include path being the worst offender). You can't see what the compiler is doing, and that's the point.

      Instead, it's better to just print a simple line like "Compiling File1.c" -- that's 90% of what you want to know anyway. If something goes wrong, use the -n option to see the compile line. The --trace option is even better.

      A common workaround up to this point was to conditionally define a variable like QUIET=@, and then use that at the start of any actions ($(QUIET) $(CC) ...). Redefining QUIET to empty lets you see the line. I prefer the -n option, but it might not be as portable.

      In reality, you only care about the compile options when debugging the build process itself. But in normal usage, get rid of the internals and just let me see the results of the compilation.

    29. Re:Me gusta! by c++0xFF · · Score: 1

      At which point you type 'make --trace' and figure things out. But in the general case, it is completely pointless.

    30. Re:Me gusta! by phantomfive · · Score: 1

      I honestly don't even understand why you want to see "Compiling File1.c"

      I also have no idea why you find the output obnoxious. Do you sit there reading the output from you makefiles? Why don't you just minimize the terminal and go work on something else?

      --
      "First they came for the slanderers and i said nothing."
    31. Re:Me gusta! by c++0xFF · · Score: 1

      Three reasons:

      1) It's a feel-good. I'll admit it -- you don't strictly need that line.
      2) It gives an indication of progress. I can see that things are progressing. I can see what files are taking forever (rare but informative). I can tell where in the build process things are (and therefore how much time is left.)
      3) I can see what is being recompiled and gain a better understanding of the build dependencies.

      And yes, I do "read" the output of the build process. Seeing build warnings and errors at a glance is essential. A good IDE is even better, of course (it basically parses out the build garbage for you), but that's not always available.

      Clean build output is like syntax highlighting -- not strictly necessary to do your job, but it makes finding and fixing errors much easier, in my opinion.

    32. Re:Me gusta! by phantomfive · · Score: 1

      Well, it doesn't matter to me how you set up your own personal build.

      However, if you publicly distribute a build, and it isn't easy to figure out how things are getting built, I will jab extra needles in your voodoo doll.

      --
      "First they came for the slanderers and i said nothing."
    33. Re:Me gusta! by c++0xFF · · Score: 1

      Thanks to --trace ... we both get our way.

      I like your thinking ... the GPL needs a voodoo doll sharing clause. There's more than one build system that deserved it.

    34. Re:Me gusta! by Anonymous Coward · · Score: 0

      You understand nothing.

    35. Re:Me gusta! by functor0 · · Score: 1

      In a maze of scripts and Makefiles and scripts generating Makefiles and scripts generating scripts that call make, euphemistically called "a custom buildsystem", hunting down the right 'make' to change into 'make -d' can take a while.

      That sounds like you're not doing sub-makes with $(MAKE), which would have passed down the -d automatically. See http://www.gnu.org/software/make/manual/html_node/MAKE-Variable.html#MAKE-Variable and http://www.gnu.org/software/make/manual/html_node/Options_002fRecursion.html#Options_002fRecursion

  5. Backward compatibility? by Anonymous Coward · · Score: 2, Insightful

    Have the developers made a statement concerning backward compatibility with makefiles developed for GNU make 3.80 (or 3.76, etc)?

  6. I'm ready to replace Make by steveha · · Score: 4, Interesting

    There is a lot I don't like about Make, including GNU Make. The extensions it has received over the years make it incredibly baroque. I can't work on nontrivial makefiles without keeping a copy of the reference manual open to look things up, and the magic differences between tabs and spaces mean I need syntax highlighting to make sure I know what my makefiles really will do.

    So now GUILE integration. How many Slashdot users are big fans of the Scheme language? I appreciate the elegance but I don't want to work in it, and I don't look forward to trying to debug makefiles that make heavy use of it.

    I'm not sure what to use to replace Make though. I'm a Python guy so I would probably want Scons or something like that, but Ruby fans probably want Rake, Java fans probably want Ant, and in general I don't think there is any consensus on what might be the best replacement for Make.

    --
    lf(1): it's like ls(1) but sorts filenames by extension, tersely
    1. Re:I'm ready to replace Make by serviscope_minor · · Score: 1

      and the magic differences between tabs and spaces mean I need syntax highlighting to make sure I know what my makefiles really will do

      Just like python!

      Actually, GNU Make has got pretty good in this regard and usually does the correct thing if you use the wrong kind of indent.

      --
      SJW n. One who posts facts.
    2. Re:I'm ready to replace Make by Samantha+Wright · · Score: 2

      Well put. I haven't had the displeasure of working with huge makefiles personally, and I am quite fond of the Lisp language family, but it doesn't make sense to me to put it into a build system, and the tab magic thing is slightly Turing tarpit worthy. Maybe it's time for a classic fork of 3.x?

      --
      Bio questions? Ask me to start a Q&A journal. Computer analogies available for most topics!
    3. Re:I'm ready to replace Make by wiredlogic · · Score: 1

      Considering all the extensions to standard make it would be nice if they'd relax the tab requirement so writing makefiles is more convenient.

      --
      I am becoming gerund, destroyer of verbs.
    4. Re:I'm ready to replace Make by Anonymous Coward · · Score: 2, Insightful

      Java fans probably want Ant

      Not bloody likely. Gradle kicks Ant's ass by about a bazillion times. Even Maven is better than Ant, even if the XML used to define artifact construction is terribly named and terribly complex.

    5. Re:I'm ready to replace Make by Anonymous Coward · · Score: 0

      I use nakefiles because they are written in a really cool programming language much better than python or ruby and compiled to binary code, which makes them instant. But I reckon if you want something more stable/supported you should give tup a try.

      If somebody uses today make that's really like living in the past ignoring all the much better new options.

    6. Re:I'm ready to replace Make by ebno-10db · · Score: 1

      Just like python!

      The right thing to do is just ban the use of the @%#^! tab character. You can't do that w/ make, but you can with just about everything else. I once wrote a pre-checkin validation script for a VC system, and it would reject any file (of the appropriate source types) that contained a tab.

    7. Re:I'm ready to replace Make by steveha · · Score: 3, Interesting

      Just like python!

      Actually, no.

      Python lets you use spaces or tabs, and will do pretty much the right thing. You can sometimes get into trouble if you mix spaces and tabs.

      If you have multiple lines and they are indented identically, they are a block. It's easy to indent identically if you use nothing but spaces; still easy if you use nothing but tabs. (If you indent with a mix of tabs and spaces, and use the identical indent on each line, it will still work but this is very non-recommended. If you indent two lines such that they visually line up, but they have spaces and tabs in a non-identical configuration, it won't work right... but Python will raise an exception and warn you.)

      Recommended practice in the Python community is just to use spaces for indenting. Everyone's editor agrees on how that would work. Most editors have an option to use spaces automatically even if you hit a tab when indenting a line.

      The white space situation in Python is not perfect, but you really cannot say that Python has a syntactic distinction between tabs and spaces like Make does.

      Actually, GNU Make has got pretty good in this regard and usually does the correct thing if you use the wrong kind of indent.

      This has not been my experience, but perhaps you are right. I have been using vim with syntax highlighting, and every time I use spaces instead of a tab, the highlighting reveals my mistake and I fix it, so I haven't screwed this up in a while.

      If the tabs vs spaces thing was the only issue with Make, I could live with it (just as I can live with Python's handling of white space). The baroque syntax bothers me much more.

      --
      lf(1): it's like ls(1) but sorts filenames by extension, tersely
    8. Re:I'm ready to replace Make by Phillip2 · · Score: 1

      Ant? Seriously, you have to be kidding!

      The bottom line is that there is no replacement for Make; it still does what it was designed for very well. I use it when ever I have lots of small files with unix commands to convert them; python normally shows up there as well.

      But make sucks for Java, hence ant, and then maven. And I use leiningen for Clojure. I'm not sure having one build tool per language is a great situation, but there you have it. But make fills its niche and it will be there in quite a few years time.

    9. Re:I'm ready to replace Make by Anonymous Coward · · Score: 5, Informative

      > Protip: If you need another tool to build a project other than the compiler, then you're doing it wrong.
      Protip: If the only tool your project needs to build is the compiler, it's a trivial project.
      Generating any non-trivial product (package, installer, resources, doc, etc.) takes a pile of tools.

    10. Re:I'm ready to replace Make by ebno-10db · · Score: 1

      Are those build utilities just for Java, or do they handle other languages?

    11. Re:I'm ready to replace Make by Anonymous Coward · · Score: 0

      Not like python. Because, in reality, everyone who actually knows how to program uses spaces, because you can't show tabs in HTML. And everyone who knows how to program knows how to configure his IDE/Editor.

    12. Re:I'm ready to replace Make by spike_gran · · Score: 2

      In the mailing lists, the maintainer of Make implied that the Guile integration was put there essentially as a hedge. People would ask for extensions to Make that he didn't want to commit to, so now the Guile is there so that people can extend make their own way.

      I would imaging that the Guile stuff would be valuable to do complicated pattern substitutions than Make can easily handle. It is trivial in GNU Make to convert a variable containing a list of *.c files to a list of *.o files, etc. But something more complicated of that nature is where a Guile extension would come in.

    13. Re:I'm ready to replace Make by ebno-10db · · Score: 1

      Try SCons. It blows the doors off of Make, and once you get the hang of it, is much simpler to use. It's also written in Python, and you write the "build files" (equivalent to make files) in Python. Real honest-to-goodness Python, not just some restricted kind-of-like Python stuff.

    14. Re:I'm ready to replace Make by Anonymous Coward · · Score: 0

      Let me start off with I really like python (my best hey try this out language).

      However the spaces thing is a real PITA. You must be consistent with it. Which means if you add a new member to the project you need to say exactly what you are doing. The differences between 3 spaces and 4 spaces in many fonts is rather minimal. Line breaks for readability are a pain as they better be on the same indentation level as the next line or the previous line (or woe unto you when the compiler acts oddly).

      Would it have killed them to put in begin/end qualifiers?

      I can not tell you the number of bugs I have 'fixed' in my python code because I had an indentation level wrong. This feature of python makes bugs.

    15. Re:I'm ready to replace Make by Anonymous Coward · · Score: 0

      That's the problem with Scons - because the "build file" is a Python script, it's easy to abuse and soon you find all sorts of code in your build system.

      I hate nothing more than trying to figure out how a program works before I can build the program I need to work on...

    16. Re:I'm ready to replace Make by ebno-10db · · Score: 1

      If you write a lot of Python in an SCons build file, then you're doing something wrong. The capabilities, including things like checking for header file dependencies, are all built in. It even knows something about commonly used tools, like gcc, so you can start out by saying "use the usual gcc stuff".

      Just because your declarations and whatnot are written in Python, doesn't really mean you have to actually write a Python program - that's already been done for you. Sure you can abuse it, but what powerful tool can't be?

    17. re: I'm ready to replace Make by SkOink · · Score: 1

      I'm not sure what to use to replace Make though. I'm a Python guy so I would probably want Scons or something like that, but Ruby fans probably want Rake, Java fans probably want Ant, and in general I don't think there is any consensus on what might be the best replacement for Make

      I went back and forth on different Pythonic build tools for awhile. Scons is pretty great if you're doing 'standard' sorts of builds, but I found it a little heavy for my tastes and really hard to customize to my tool flow (in FPGA land, there are all kinds of nonstandard vendor tools that all need to play together).

      I've been using doit more and more over the past few months, and I'm continually impressed by the tool (aside from the goofy name). It works amazingly well for automating tricky/exotic build processes.

      Check it out! http://pydoit.org/index.html/

      --
      ---- I'll take you in a Hunt deathmatch any day.
    18. Re:I'm ready to replace Make by ebno-10db · · Score: 1

      You could always use Haskell. You have a choice between {}; C-style syntax, and Python style whitespace. Ok, that's a bit of a kluge, but in practice everyone uses the whitespace anyway, so it's not a problem.

    19. Re:I'm ready to replace Make by Anonymous Coward · · Score: 0

      Try SCons [scons.org]. It blows the doors off of Make

      No it does not. If you think it does you don't understand dependencies. Using a static data structure, as make does, to describe dependencies rather than executable code such as Python, as SCons does, is hugely important in reducing the complexity and increasing the understanding of large build graphs and reducing bugs. e.g. just for starters executable code has both the halting problem and order dependencies that just don't need to exist for dependency management. Executable code should be restricted solely to the build itself.

    20. Re:I'm ready to replace Make by Anonymous Coward · · Score: 0

      What do you think the word baroque means?

    21. Re:I'm ready to replace Make by Anonymous Coward · · Score: 0

      With Maven, you managed to mention the one tool that sucks even compared to .BAT files, let alone Make or Ant. Congratulations!

    22. Re:I'm ready to replace Make by Anonymous Coward · · Score: 0

      I'm a fan of Scheme. But I'm no fan of Guile, I've had no end of stability issues with it over several years.

    23. Re:I'm ready to replace Make by serviscope_minor · · Score: 1

      and I am quite fond of the Lisp language family, but it doesn't make sense to me to put it into a build system,

      Ignoring the de/merits of LISP, why not? If you want the build system to be programmable, it's better to embed a "proper" language than to keep kludging Make so that it does become a turing tarpit.

      --
      SJW n. One who posts facts.
    24. Re:I'm ready to replace Make by X0563511 · · Score: 2

      The way notepad++ does it works superbly well. You get visually low-contrast dots or arrows indicating what kind of white-space it is. It's there, and it's visible - but it's not distracting. (you have to turn this on btw)

      --
      For large sets, this will be our guide even unto death, for the LORD will work for each type of data it is applied to...
    25. Re:I'm ready to replace Make by GumphMaster · · Score: 1

      Baroque: "extravagantly ornate, florid, and convoluted in character or style," not unlike the architectural style of the same name. Seems fitting for at least some Makefile instances I have seen.

      --
      Patent litigation: A doctrine of Mutually Assured Destruction... in which everyone seems willing to push the button
    26. Re:I'm ready to replace Make by Samantha+Wright · · Score: 1

      Actually I'm more militant—I think embedding a language is still pretty kludgy. I'd opt for writing a new language that replaces the whole Make syntax, rather than $(encrusting everything). (But I'm not really a fan of the syntax of shell scripting, so admittedly I'm a bit biased.)

      --
      Bio questions? Ask me to start a Q&A journal. Computer analogies available for most topics!
    27. Re:I'm ready to replace Make by JanneM · · Score: 1

      ..which is nice until you sit on a system without Python (go to big compute clusters and things like Python are suddenly scarce). Make is completely standalone; and the Autotoools look the way they do because, again, you can run them with minimal external dependencies.

      As I heard it told, the reason Make (and Autotools) is the default despite all the suck is because all proposed alternatives suck more once you leave their original use-case.

      --
      Trust the Computer. The Computer is your friend.
    28. Re:I'm ready to replace Make by Chewy509 · · Score: 2

      Both Ant and Maven can compile C/C++ code, either through native support or via plugins.

      Ant: http://codemesh.com/products/junction/doc/ant_cpp.html
      Maven: http://mojo.codehaus.org/maven-native/native-maven-plugin/ and http://blog.bigpixel.ro/2012/07/building-cc-applications-with-maven/

      Mind you, we have so many build tools available, why not just pick one that suites you and your target environment? (eg make for C/C++, groovy/ivy/maven for Java, etc).
      eg cmake and scons all are popular as well...

    29. Re:I'm ready to replace Make by greggman · · Score: 1

      Mostly because I used to work on Chrome but I like gyp. It will generate projects for XCode and Visual Studio so developers on those platforms can use the tools they're comfortable with. It will also generate projects for Ninja which is much faster than Make.

    30. Re:I'm ready to replace Make by Anonymous Coward · · Score: 0

      Gradle.

      It's finalizing its support for asm/C/C++

    31. Re:I'm ready to replace Make by ebno-10db · · Score: 1

      Using a static data structure, as make does, to describe dependencies rather than executable code such as Python, as SCons does, is hugely important in reducing the complexity and increasing the understanding of large build graphs

      This is a common misunderstanding about SCons. Just because the user-written construction files are Python files, does not mean that the user writes code to determine dependencies. SCons dependency specifications are just as static as they are in Make - typically just lists of the source. SCons figures out all the dependencies from there.

    32. Re:I'm ready to replace Make by ebno-10db · · Score: 1

      nice until you sit on a system without Python (go to big compute clusters and things like Python are suddenly scarce)

      I'll take your word for it about Python being scarce on such systems, but why? Installing Python is no big deal. If you can install autotools, etc., you can install Python.

      As I heard it told, the reason Make (and Autotools) is the default despite all the suck is because all proposed alternatives suck more once you leave their original use-case.

      You may have heard it told, but I've tried it, and I disagree. What do you mean by "leave their original use-case"?

    33. Re: I'm ready to replace Make by ebno-10db · · Score: 1

      That link gives a 404.

    34. Re:I'm ready to replace Make by JanneM · · Score: 1

      Installing Python is no big deal.

      ..is no big deal on things that look and act much like an X86 workstation. On big machines you frequently need to cross compile; the compiler/assembler/linker suite is not GCC or closely compatible; the system libraries are intended to be compatible these days but are separate implementations with their own quirks; and the environment is geared toward specific use so you lack many libs that are taken for granted in all-round systems.

      I have installed Python on such a machine. It was a big deal and nothing I would ever attempt just to get a make-like utility working. It would be far less work to replace that utility with Make than to get Python onto the machine.

      You may have heard it told, but I've tried it, and I disagree. What do you mean by "leave their original use-case"?

      Sorry; I get a bit abridged at times. What I meant is that Make alternatives normally are born from a specific need. A group wants to build Java programs (for example) and come up with a tool that works better than Make for that.

      But then it almost invariably (so far) turns out that the tool that works great for the original use case is lacking features, or lack flexibility, or has dependencies that make it unsuitable for very different kind of projects. Make-replacements that really are general enough to fully replace it are no easier to learn and use than Make itself. It seems for all its cruft and oddities, Make does seem to represent a floor in the complexity needed to support all the different situations you may encounter.

      I have tried a number of alternatives over the years because I was frustrated with Autotools (which, rather than Make itself, is what people often really complain about). Finally, for one project I bit the bullet, got myself a book and really learned Autotools properly. And found out it's not bad at all, just unintuitive until you get a good explanation. There is some cruft there of course; but many oddities are due to the portable nature of the tools, and others are simply conventions that modern languages don't follow - they're not wrong, just different.

      If you really want to replace make I suspect the best replacement would be - Make. That is, define an optional "new Make" mode that is not backwards compatible, with cleaned up syntax and parsing rules; the surface stuff that people get annoyed by.

      --
      Trust the Computer. The Computer is your friend.
    35. Re: I'm ready to replace Make by Anonymous Coward · · Score: 0

      It's a lot more messy than "simple lists"; enough to cause all sorts of inconsistency and high learning curve on any but the most trivial build/dependency graph. New syntax does not make things simpler; often the reverse.

    36. Re:I'm ready to replace Make by Anonymous Coward · · Score: 0

      In fact, many people like to write their own tools, but a compiler is generally too hard (or they looked at gcc and were put off by its spaghettiesque insides), and so a build system is the next best thing. And it shows. The worst thing are the "improvements" that build upon make in a way that makes it needlessly hard to use the generated makefiles without the generator present (*cough* cmake *cough*).

      Personally I like to keep my makefiles simple, you know, POSIX simple. It's actually quite amazing how much you can do with that little. Remember that it's not just about compiling things, but about dependency checking on the file level, and once you understand that many more things can benefit from make. Like, oh, generating the old CV, assembling websites and sending them over to the hoster (more hosters with rsync support needed, but I digress), basically anything that can be expressed as transformations on files.

      It's only when developers clamour for (or are just itching to add) more features because they're developers that things become problematic. It doesn't help that *cough* some people *cough* didn't read the instructions and so get confused by the rules--especially when they copy/paste make rules from a friend who did the same thing with someone else's misunderstood rules.

      So if you happen to have lots of trouble with makefiles, you might want to review just how the rules work. I know I had to do that a couple times before I wrapped my head around it. After that, well, understand that while it doesn't do everything, what it does, it does quite well.

      Just stay away from every vendor's (and the GNU project is a vendor for this purpose) pet lock-in extensions if you'd like to distribute your (projects with) makefiles beyond your fellow same software users.

    37. Re:I'm ready to replace Make by Darinbob · · Score: 1

      The spaces versus tabs is not that big an issue anymore. But people keep pointing to it as the difficult part. If there is a mistake, GNU Make won't just guess what was intended and go on, however it will give a legible error message about what it thinks was wrong. Just use spaces almost everywhere (everyone should already do this in their source code I hope) and tabs only go in a few clearly defined places. It mostly breaks when poeple have poor editors that insist on hard tabs for indentation.

      Yes, GNU Make has some baroque things, but you don't have to use them. Once you've got the Makefile built and done correctly, it can be maintained with little effort. Just add some new files to a list, change some compile time options for one project etc. It breaks down when someone tries to do too much in one Makefile so that the rules are too much to keep track off. Simple works much better, and there are plenty of built in rules that help make things simple except that some people don't know about them.

      On the other hand all the alternatives also have hidden built in rules. If you need to do something other than the default then it's just as much work looking up in the documentation to figure out how to do that, and often much more work if you're forced to write Python code for your C++ build to work for example.

      Of course someone writing a makefile for a big project needs to know what they're doing. Any build system that is designed for ignorant people to use is going to fail. One has to learn the tools they're going to use no matter what the tools are.

    38. Re:I'm ready to replace Make by Anonymous Coward · · Score: 0

      But it shouldn't; that's the point.

    39. Re:I'm ready to replace Make by Darinbob · · Score: 1

      Which is why everyone should use a fixed width font for programming, it's just basic common sense. Similarly, never use hard tabs, configure your editor to never insert hard tabs automatically to replace spaces, things like that.

    40. Re:I'm ready to replace Make by Darinbob · · Score: 3, Funny

      I have an Italian compiler. Some times it tells me "your code, she is baroque on line 13".

    41. Re:I'm ready to replace Make by Darinbob · · Score: 1

      Keep the makefiles simple and use a higher level shell script that ties together the more complicated build system. I think some places make a mistake of trying to have a top level makefile that tries to do everything across multiple groups and projects. Also Make is perfectly happy spawning off a shell script or perl script or even external guile script if asked to do so.

    42. Re:I'm ready to replace Make by Darinbob · · Score: 1

      I wish they'd get rid of all the parentheses to make Lisp more convenient. And get rid of all those angle brackets in XML to make it more convenient.

    43. Re:I'm ready to replace Make by Darinbob · · Score: 1

      But make isn't just for C/C++. It's for everything. There is nothing in it that is more suitable for C/C++ than any other language that has command line tools to build.

    44. Re:I'm ready to replace Make by Darinbob · · Score: 1

      You have cross platform object files? How do you get your ARM ELF file to link and run on a PowerPC machine?

    45. Re:I'm ready to replace Make by Jonner · · Score: 1

      There are millions of replacements for make, which is part of the problem. I doubt there will ever be one canonical replacement, but Scons is a good choice for many projects IMHO. I'm trying to replace the use of make where I work with Scons, which especially makes sense we use Python for the application code. I think a Scheme-extensible replacement for make could be a very good thing, but adding more languages to the ugliness of Make is not the way to go.

    46. Re:I'm ready to replace Make by Anonymous Coward · · Score: 0

      you seem like a lazy programmer.

    47. Re:I'm ready to replace Make by Anonymous Coward · · Score: 0

      Java fans probably want Ant

      I wish. Ant is all but dead. All new work gets done using Maven these days. Maven is an abomination. If forces you to structure your code base and tasks to it's way of doing things (hundreds of ugly "tasks"), and it goes out and fetches libraries from external repositories (Your libraries are no longer stored alongside your code base). Better run your own respository which copies from upstream too, else those libraries you're depending on may be removed. Yeah that's so much better and more "best practice". Oh baby!

    48. Re:I'm ready to replace Make by Anonymous Coward · · Score: 0

      If you can install autotools, etc., you can install Python.

      Yes, but you don't actually need to have autotools on your system in order to build stuff that uses autotools. You only need standard unix tools (make, sh).

      The real reason for autotools' popularity is that it's extremely portable.

    49. Re:I'm ready to replace Make by goose-incarnated · · Score: 1

      The answer is languages that aren't retarding. Seriously. The only reason make is required is because you let implementation details leak into the damn language.

      Personally I need this. When doing builds off a single source tree for multiple targets then the "implementation details" such as the target name, target bit-width or whatever else is needed can be passed into the code using Make. Other "implementation details" are useful - embedding the git hash into the code makes it easier to determine which version of software sent the crash report. Signing a binary using a hash of the source is another "implementation detail".

      Just because you're too stupid to do things like the git hash in your software doesn't mean that everyone wants to be stupid too; there's a reason why other build systems come and go while Make is still around year after year.

      --
      I'm a minority race. Save your vitriol for white people.
    50. Re:I'm ready to replace Make by prionic6 · · Score: 1

      Maven is great when you are ready to give up many freedoms in how to setup your build structure and do things exactly as intended. Then it works very well. Most of my projects work with a single parent pom defining stuff like metadata, repositories, java version, a project pom for every module with nothing more then dependencies and a single aggregator pom bringing it all together. if you stay simple, Maven is great. If you want to do complicated stuff, stay away from it.

      In my personal opinion, that is a great way to do things. Leave the individuality and innovation to the software, let the build system be conservative and dumb. A well written Maven build is short, uses few plugins and is easy to read and understand. It still needs work to set it up, learn about the right way to do things and possibly change old habits.

      I you are not prepared to give up individuality in your build system, stay away from Maven, there are better tools for scripting a build.

    51. Re:I'm ready to replace Make by serviscope_minor · · Score: 1

      Actually I'm more militantâ"I think embedding a language is still pretty kludgy. I'd opt for writing a new language that replaces the whole Make syntax, rather than $(encrusting everything). (But I'm not really a fan of the syntax of shell scripting, so admittedly I'm a bit biased.)

      I see your point, but I'm not convinced I agree or disagree.

      There's an annoying tradeoff between such things. Shell syntax is certainly horrible for programming. Partly it's because it's clearly an aggregation of features. Partly it's because of the way data strings are the primary entity, not sane syntactic tokens. That leads naturally to whitespace in data being a pain. Thing is though for a lot of stuff, especially short scripts and one liners where you get to control the environment, it's short, simple and easy. Just not scalable.

      It's a better UI than a language.

      I *think* the tradeoff is worth it.

      Make "suffers" the same thing in that it's designed to throw stuff at the shell. It's a bit more sane in that things mostly aggregate only inside $() rather than with every new possible combination of bracketing characters and worse in the shell.

      Again not sure. For many things Make is quite easy. Many of my makefiles are only 4 lines long (augment CXXFLAGS, augment LDFLAGS, target:lost of objects, linker line).

      Also, most of what you need to do in building is the same. Fundementally, Make is a language for expressing lines and nodes in a DAG. Assuming you treat building in the same way, a new language would eiher have to have a new DSL for expressing that data and then a whole new language to go along to make it programmable, or be written in something with decent enough support for an EDSL. The choice is:

      1. New DSL with turing completeness available.
      2. DSL with embedded "proper" language.
      3. EDSL inside existing language.

      It's not clear to me which is the best by any means.

      --
      SJW n. One who posts facts.
    52. Re:I'm ready to replace Make by Jahta · · Score: 1

      Leave the individuality and innovation to the software, let the build system be conservative and dumb.

      Agreed. This is especially true when you have sizeable development team (or teams), and you're doing continuous integration and deployment. Once you accept the "convention over configuration" approach, Maven is a breeze to work with.

    53. Re:I'm ready to replace Make by Anonymous Coward · · Score: 0

      When used correctly. tab characters are the ideal way of indenting code. 1 tab == 1 level of indentation, and how much space that visually takes can be a personal preference, I like my tab size set to 2 spaces, but my clleges like 4. Were I to indent my code with 2 hardcoded spaces we would be fighting about unimportant preferences.

    54. Re:I'm ready to replace Make by Anonymous Coward · · Score: 0

      SCons figures out all the dependencies from there.

      So, how does it figure out that main.cs depends on util.dll? And that texture1.h depends on texture1.png, which depends on texture1.pov?

      Yes, I have makefiles build the textures, so these are only rebuilt when the model is changed. Magically figuring out dependencies by looking for #include lines is a case of being good for one specific job, while failing to keep up with good old make as soon as you venture outside that one specific job.

    55. Re:I'm ready to replace Make by ebno-10db · · Score: 1

      So, how does it figure out that main.cs depends on util.dll?

      Depends('main.cs', 'util.dll')

      Magically figuring out dependencies by looking for #include lines is a case of being good for one specific job, while failing to keep up with good old make as soon as you venture outside that one specific job.

      Nope. SCons is a very general and extensible tool, that has many pre-written facilities for common cases, like finding header file dependencies in C/C++. You need something different? No problem. It also has facilities for creating your own Builders. And no, even for those, you don't write the Python from scratch. Don't feel like writing a Builder (though it's not that hard), and want a quick hack for one oddball case? No problem, you can do that too, including specifying the dependencies (see above).

    56. Re:I'm ready to replace Make by Anonymous Coward · · Score: 0

      Would it have killed them to put in begin/end qualifiers?

      The point of using whitespace is to enforce a coding style that makes code more readable. If you have trouble with indentation then perhaps you need to use a better editor.

    57. Re:I'm ready to replace Make by TopherC · · Score: 1

      Agreed. I'm surprised there weren't more posts mentioning Gradle here!

  7. Changelog? by Anonymous Coward · · Score: 1

    Why isn't there a changelog on the gnu make website?

  8. Re:Scheme?!? by kthreadd · · Score: 1

    I see a lot of words but not a lot of arguments. State your position on _why_ you should not use it as an extension language.

  9. Tab by Anonymous Coward · · Score: 0

    Did they get rid of the required TAB character in front of the rules? Or at least report a non-TAB character?

  10. Re:Scheme?!? by Anonymous Coward · · Score: 0

    He's saying that he's too stupid to understand functional languages, therefore functional languages are bad.

  11. make!?? by Anonymous Coward · · Score: 0

    people still use make? i switched to Ant a long time ago and have never looked back.

  12. Re:Scheme?!? by Waffle+Iron · · Score: 1

    He's saying that he's too stupid to understand functional languages, therefore functional languages are bad.

    It's more like the average Joe-sixpack developer doesn't want to have to spend weeks learning the subtle distinctions between "let", "let*" and "letrec" just so they can add some scripting to their makefiles.

  13. Lipstick on a pig by ebno-10db · · Score: 1

    No matter what you do to it, Make is an antiquated pig. No offense to the GNU folks, who generally make the best versions of the traditional *nix utilities, and yes, you do need to keep Make around for backwards compatibility, yada, yada, yada.

    What's really needed is a ground up re-think of how to create a build utility. A number of folks have tried it. I used to use SCons, and before that it's Perl based predecessor, Cons. The reason I'm not using them now has nothing to do with the software, which I though was excellent. The project lead's idea of alpha is what some people call final release.

    I suspect the biggest problem to a widely used Make alternative is the sheer variety of options out there. Nevertheless, what are other people's experiences with build utilities other than Make?

    1. Re:Lipstick on a pig by serviscope_minor · · Score: 1

      How do those non-make utilities compare? Why are they better? Is it syntax or do they do something more sophisticated than representing the dependency chain as a DAG? Or better integration with other tools?

      --
      SJW n. One who posts facts.
    2. Re:Lipstick on a pig by Anonymous Coward · · Score: 0

      Nevertheless, what are other people's experiences with build utilities other than Make?

      They are all slower than make, and less portable.

    3. Re:Lipstick on a pig by gmueckl · · Score: 1

      I have tried SCons and cmake as replacements for Makefiles and I'm pretty happy with cmake. Both tools are better than make in that they have more insight in what you're trying to accomplish and end up doing the right thing in many cases. You certainly don't have to spell out every command explicitly like you have to do with Makefiles.

      SCons gives you a lot of programmer's freedom by handing you a whole Python interpreter to work with. That can be cool in some situations, the downside for me is that you have to come up with all the code that configures the build by yourself. The big plus with SCons is that it knows what to do with about any kind of file that can be compiled without having to tell it how to invoke the corresponding compiler.

      cmake on the other hand brings a lot of tools that let you spell out the configuration of the build in terms of user-set variables in a very straight-forward manner and it also has. It doesn't run the build, but can generate build scripts or project definition for a lot of environments and IDEs. I find it to be very easy to write cmake scripts that compile moderately complex builds with lots of dependencies on multiple platforms, where each user has his/her dependencies layout it in a different fashion from everyone else.

      --
      http://www.moonlight3d.eu/
    4. Re:Lipstick on a pig by Darinbob · · Score: 1

      Scons feels to me like a clumsy way of doing Make, just with a Python syntax. Yes when your project gets really complicated you can break out of it and write raw Python code, but that's only helpful if you're a Python expert and understand what happens under the hood of Scons. The Scons wiki even points this out as one of the drawbacks.

      At its core Make is agnostic. It doesn't have any opinions on how you should build your project instead you tell it what to do. Most of the Make replacement systems seem to be build around some built in concepts that they expect most people to follow (ie, building into a separate build subdirectory, assuming everything in a directory gets built and linked together, internal knowledge about a specific programming language, etc). The trouble is that when you need to break your build system's expectations that you end up doing a lot of extra work. And so someone says "I can fix this mess by writing a NEW build system!" which is why we have so many of them now.

      Of course Make has some expectations in a way, because it has builtin rules. If people try to do it from scratch it often is a mess but that's often because they don't know that the rules exist rather than trying to do something that the rules don't support.

      As an example, one ability that many people want in a build system is automatic header file dependencies; ie it knows to rebuild the file if any of the files it includes have changed without having to explicitly list every header file somewhere. There is no way for a build system to know how to do this without some build in assumptions. So many of the alternative build systems assume a specific environment (ie, it knows how to ask the compiler to give it a list of header files). Now lets say you want to dump the default compiler and use an alternative compiler; that build system either needs a lot of work to get going again, or you search the web for a "plugin", or the automatic dependency feature goes away. So while that may be complex at times with Make it's relatively straight forward to manage compared to many alternatives.

      The biggest complains about Make are about the syntax really. That's sort of a minor issue in the big scheme of it. None of the alternatives I've seen manage to do anything fundamentally better than Make or build in a fundamentally different way. Most seem to be not much different over getting a pre-built Makefile skeleton where you just have to fill in a few lines.

      Sure, Make is "archaic" but so is Unix and it's still in use and the core of the latest MacOS and Android phones, so archaic does not mean obsolete. At it's core Make is extremely simple. The first Make even more so. The latest GNU Make is just an evolution that adds extra convenience features. The simplicity is what really gives it all the power. None of the Make alternatives have the simplicity at the core that Make has.

    5. Re:Lipstick on a pig by Anonymous Coward · · Score: 0

      You didn't check, did you? In that case, you would know that there are several alternatives that are not only more portable than make, but also faster.

    6. Re:Lipstick on a pig by Anonymous Coward · · Score: 0

      Both tools are better than make in that they have more insight in what you're trying to accomplish

      Not really. They just reinvent the command line wheel having new syntax for a hundred different things when the command line already does it perfectly well.

      SCons gives you a lot of programmer's freedom by handing you a whole Python interpreter to work with.

      Make allows you to use any language you like in the build rules though traditionally it's shell.

      cmake on the other hand brings a lot of tools that let you spell out the configuration of the build in terms of user-set variables in a very straight-forward manner and it also has.

      Make allows you to use any tool you like in the build rules including python. Make's variables, both pre-defined and user settable, also work just fine.

      In any but the most trivial builds a compiler is only one of dozens of tools used for handling dependencies. Everything from document processors to archivers to version management to symbolic links to unit testing to graphics blob generators to help file parsers to feature selection to hardware checking to disk space management to checksumming to logging to sanity checks to parallelizing processing to distributed processing to portability. Scons, cmake et. al. do only a small subset of that well. Make does all of that and much more. And does it very consistently and completely without reinventing the syntax wheel.

      Make tabs were a poor choice but a developer can learn that in a minute and the rest is far more consistent and complete than Scons, cmake etc. Those just re-implement the command line yet again with new syntax (the so-called "friendly syntax" is not friendly at all) and only implement a fraction of it.

  14. Too little, too late by Anonymous Coward · · Score: 0

    Most abandoned make long ago, in favour of automake/cmake/etc.

    1. Re:Too little, too late by doti · · Score: 1

      Both these tools use make as a backend, and some of the new features (--trace and --output-sync, for instance) will be useful even for users of automake and cmake.

      --
      factor 966971: 966971
  15. Obligatory SCons plug by goruka · · Score: 2

    At our company we use SCons to build our large projects, which span several platforms (mobile, desktop and consoles), and have plenty of autogenerated code, shaders, etc.
    My point of view is that if you are going to need a complex, scripted build system, why not use a friendlier and more accessible programming language such as Python?

    1. Re:Obligatory SCons plug by kthreadd · · Score: 1

      That's why a lot of projects don't use Make directly. You typically use a combination of programs like autoconf, automake and libtool to generate the makefiles for you. In the end you get a shell script that you can send to users and they don't need to have the tools you used installed.

    2. Re:Obligatory SCons plug by Anonymous Coward · · Score: 1

      Because the idea of using a sequential language for building is shit.
      Building is no complex task, so even with all special stuff and such it should be possible to cover this with a declarative or at partial declarative language.
      Unfortunately, cmake repeated the mistake and it shows.

    3. Re:Obligatory SCons plug by ebno-10db · · Score: 1

      That's the way some people have to do it, but it's a kluge. SCons is much cleaner and easier to use. Also cross-platform.

    4. Re:Obligatory SCons plug by ebno-10db · · Score: 1

      First, Makefiles are essentially a declarative language. Second, even though the utility is written in Python, and your "make files" are also in Python, SCons largely uses a declarative approach. You tell it what you have to build, and how to build it, then let it figure out the order and so forth.

    5. Re:Obligatory SCons plug by Anonymous Coward · · Score: 0

      Agree.

      Make was designed to manage source code within a single directory. SCons nimbly takes care of complex directory structures.

      That said, there are many ways to use SCons, and I think it is a mistake to build on Python and scripting too much. I recommend sticking to basic, explicit idioms so that developers who don't know Python can understand and maintain the SConscript files. For example, if you encounter this expression:

      env.StaticLibrary('foo', [ 'a.c', 'b.c', 'c.c' ])

      you have a very good chance at correctly adding d.c to the library even if you had no prior exposure to Python.

    6. Re:Obligatory SCons plug by loufoque · · Score: 1

      It can't be that large if you're using scons.
      SCons is known for being inefficient and scaling badly. It is however fairly powerful at scripting your build rules.

    7. Re:Obligatory SCons plug by loufoque · · Score: 1

      Autotools are obsolete technology.
      If you want something similar, but truly multi-platform and modern, try CMake.

    8. Re:Obligatory SCons plug by MtHuurne · · Score: 1

      I'm a big Python fan, but not so fond of SCons. I think this is mostly a documentation issue: there is a manual which explains things superficially and contains some examples, but what I really want is to have the underlying concepts explained thoroughly. When working on a build system, there are usually multiple ways you could implement something, but they are not equivalent in terms of reliability (robustness against transient failure or user error) and flexibility for future changes in requirements (new platforms with their own weirdness etc). With SCons I could get things to work, but I never really had the feeling I knew why this was the right way to do it.

      (I'm sorry if this is a bit vague, but it's been several years and I don't remember all the details anymore.)

      There isn't really a build system that I do like; most of the time I settle on plain GNU Make (for simple projects) or GNU Make with included Makefiles generated by Python scripts (for complex projects).

    9. Re:Obligatory SCons plug by Anonymous Coward · · Score: 0

      I used SCons for about two years, after using autotools, after using straigt up makefile. Then I moved on to my own project and research: http://bca.stoverenterprises.com

    10. Re:Obligatory SCons plug by ebno-10db · · Score: 1

      Much of the scaling issue comes from SCons' default use of hashes to determine if a file has changed. That means in a large build, it has to read and generate a hash for every file. No big deal if you're re-building the whole thing, but a big slowdown if you've changed only one or two files. You can easily switch to timestamps though, ala make. It's not as robust, but it's good for modify-compile-test on big projects. For the real "gotta make sure everything is right", you can go back to hashes.

    11. Re: Obligatory SCons plug by loufoque · · Score: 1

      you realize make doesn't scale well either, right?

    12. Re:Obligatory SCons plug by Anonymous Coward · · Score: 0

      scons is a fucking piece of shit

    13. Re: Obligatory SCons plug by ebno-10db · · Score: 1

      So what does scale well?

    14. Re: Obligatory SCons plug by loufoque · · Score: 1

      ninja, tup, tundra...

    15. Re:Obligatory SCons plug by shutdown+-p+now · · Score: 1

      Using autotools to make makefiles easier is like using regexes to make your Perl code more readable.

  16. But... by romiz · · Score: 1

    Does it build Linux, this time ?

    The Linux build system broke when upgrading GNU Make from 3.81 to 3.82, and all stable branches had to add a fix to handle the changes.

  17. I like make. by Anonymous Coward · · Score: 0

    Make might not have many friends, but when something doesn't go as expected (eg, compiling an Ubuntu utility on openwrt) it's usually straightforward to dive in and change things. scons and cmake are nice, too; nicer when they work but more painful when things break. And as for the abomination that is autoconf. WTF? 2 hours chugging through ./configure to give an error like "Can't compile -llibbaz" which it turns out means I'm running autoconf 1.2.8 and need autoconf >= 1.2.11 Now, how long before GNU standardises on guile-scripted makefile generated from configure scripts from autoconf autogenerated by cmake from a ./install.sh script???

  18. Can it handle spaces in directory names yet? by Anonymous Coward · · Score: 0

    Some of us actually have directories like that...

  19. Re:Scheme?!? by Anonymous Coward · · Score: 1

    Strictly spoken, it's not functional.
    Also, its language is only good for the lazy parser writers.
    Human need contrast, but all lisp-likes provides is data structure like XML. (Haha, this comparison must make LISPers mad.)
    It wouldn't even make sense to cheat this away with clever syntax highlighting, because it would be a logical flaw and pretty pointless, because then one could implement/use a good syntax anyway.
    Also, add on paradigms can't be used by the same logic, so no CLOS or similar crap is allowed.

    The best about lisp-likes is that some runtime implementations are really good.

  20. Re:Scheme?!? by Anonymous Coward · · Score: 0

    That makes me raise the question, why do average Joe-sixpack developers need scripting in their makefiles to begin with? Shouldn't they be using something that does everything for them already?

  21. Re:Scheme?!? by interval1066 · · Score: 1

    I don't think so. Scheme has enough issues to where I'd rather use lisp if I feel the need to go the functional route (object-oriented model is horribly mis-defined if not out and out plain broken, whomever implements that language needs to understand how valuable "standard" structures like arrays and hash tables are, and I know some love the multiple return types but I think they're a huge pain in the ass.)

    --
    Python: 'And then suddenly you have a language which says "we're all stuck with whatever the whiniest coder wants".'
  22. Re:Scheme?!? by ebno-10db · · Score: 4, Insightful

    Human need contrast, but all lisp-likes provides is data structure like XML. (Haha, this comparison must make LISPers mad.)

    I hope you realize that you've just started a war that will make the Wars of the Reformation seem tame. Get out of Bohemia while you can! I'm staying neutral.

  23. Why not tup? by Anonymous Coward · · Score: 0

    Why do we still insist on using make when we have much better tools, such as git tup. http://gittup.org/tup/
    Tup understands the dependencies between source files, so if you modify a header, only the appropriate source files will be rebuilt, only the libraries/binaries that are dependent on those will be relinked. Whereas make spends most of its time figuring out what to build and what not to.

    1. Re:Why not tup? by loufoque · · Score: 1

      Because tup is experimental software.
      It's similar to ninja, except ninja is production quality and actually even more efficient.

  24. Ninja by loufoque · · Score: 1

    Hasn't everyone moved to Ninja yet?

  25. Re:Scheme?!? by Anonymous Coward · · Score: 0

    I just did it for the trullz.

  26. Re:Scheme?!? by cheater512 · · Score: 1

    His arguments were clear to me. Too many bloody brackets!

  27. Re:Scheme?!? by Anonymous Coward · · Score: 1

    but all lisp-likes provides is data structure like XML. (Haha, this comparison must make LISPers mad :)

    XML is just an ugly syntax for S-Expressions :)

    More seriously, the reason for Lisp's syntax is that it makes it easy to write Lisp code that manipulates Lisp code (since Lisp code is really just a list). In this Lisper's experience, that more than makes up for the unique syntax

  28. Re:Scheme?!? by Anonymous Coward · · Score: 0

    Don't worry, guile is basically a pink stain where a horse used to be that the GNU guys insist on beating. It's been around for literally 2 decades and in that time has largely been ignored.

  29. Re:Scheme?!? by Anonymous Coward · · Score: 0

    As soon as one needs anything more complicated than "compile these files", it's time to use a better build system or write one.

    I've seen complex pure-make based build systems.. it's terrifying stuff.

  30. First they took away SQL... by Coppit · · Score: 1

    SQL is being replaced with NoSQL DBs + imperative code. Want a join? Code up a couple of loops.

    How long before makefiles get replaced with something imperative? Is there anything else widely used that's declarative?

    1. Re:First they took away SQL... by shutdown+-p+now · · Score: 1

      And there are a lot more declarative automated build tools than just GNU make.

      To give some specific examples. Ant and Maven, the two most widely used build tools for Java, are both declarative. MSBuild, the standard build tool for various Microsoft compilers (historically, .NET ones, but for the last 3 years also VC++), is declarative.

  31. Re:Scheme?!? by Darinbob · · Score: 1

    Lisp is great as a language for Emacs. It has also been well used in some other contexts for customization. I dont doubt that Scheme would work too in some instances. However often the pure functional nature of Scheme would seem to collide with the quick-and-dirty nature of scripting languages, but could be worked around (a lot of Scheme implementations relent and add some more traditional Lisp features instead of staying minimalist).

    However Scheme being good at something doesn't say too much about Guile. Guile last I looked seems larger than I would expect a Scheme to be.

  32. Re:Scheme?!? by ebno-10db · · Score: 1

    In this Lisper's experience, that more than makes up for the unique syntax

    Thank you! It drives me nuts when Lispers defend the human readability of the "unique" syntax by saying things like "it's simpler" (true for a computer, a human not so much) and "you don't have to worry about operator precedence" (you can get the same effect in C by putting everything in parentheses, which makes it look like Lisp).

    By contrast, you admit that it's a tradeoff. I don't have enough Lisp experience to say whether it's a worthwhile tradeoff, but it's a very solid argument.

  33. Re:Scheme?!? by jbolden · · Score: 1

    Being simpler for a computer means it is simpler to write evaluators for LISP expressions. Because of the simplicity of LISP an evaluator + applicator gives you a compiler or runtime environment. That is a huge huge advantage.

    You really can only do LISP in LISP. The real tradeoff is between layers of DSLs vs. layers of libraries as a way of designing large systems. Libraries obviously won some of the fights for example on operating systems or large application. While on places like networking, or hardware DSLs won.

  34. Re:Scheme?!? by Anonymous Coward · · Score: 0

    Three minutes, tops.

  35. Zawinski's Law, next stop. by real-modo · · Score: 1

    Make 4.1 will be able to read mail.

  36. Re:Scheme?!? by Anonymous Coward · · Score: 0

    Also, its language is only good for the lazy parser writers.

    Nothing wrong with "simple to parse" (which XML is not; go on, try it, with a really simple single byte lookahead parser, while making sure you're getting all the little details and corner cases right).

    Human need contrast, but all lisp-likes provides is data structure like XML. (Haha, this comparison must make LISPers mad.)

    To me you're sounding like you didn't like "the novelisation of the movie", when the book came first. Lisp is a lot more useful than XML, and easier to parse to boot. Both lack in readability but the former is a lot less arbitrary.

    If you want to slag something, I'm told it's actually easier to stick some things in xml then run xslt/xpath/xquery on it (just one approach wasn't enough--yet somehow all three are still less expressive than SQL unless you count byzantine tree traversions induced by "going xml" as "expressive"), than it is to do it directly in java. Hence, xml+friends are popular with the java crowd.

    Tangentially, I stumbled on a lisp interpreter done in awk not too long ago. That is a pretty neat hack.

  37. related: Qbs by Anonymous Coward · · Score: 0

    How is the state of that?
    Some Qt insider?

  38. Re:Scheme?!? by MareLooke · · Score: 1

    Having tried to deal with Scala's macros I have joined the camp of "it's a seriously worthwhile tradeoff".

    Honestly doing anything with reflection in Scala (or pretty much every non-Lisp) is just horrifyingly unintuitive (and as a result: painful). In a Lisp you're just manipulating lists using typical list manipulation functions, it is, comparatively, a piece of cake.

  39. Java, .NET, or LLVM by tepples · · Score: 1

    By having the object code format be JVM bytecode, CIL, or LLVM bitcode.

  40. Replacing make with... make by dwheeler · · Score: 1

    There are a lot of build systems that provide more built-in features than straight-up make. Heck, GNU make itself has LOTS more features than POSIX make.

    But many of those more-automated build systems run on top of... make. In particular, if you use cmake or automake/autotools, they *generate* makefiles, so you still need a capable "make" program. In fact, you *want* a "make" underneath with lots of capabilities, so the tool you use directly can generate better results.

    Ant and Maven are nice tools... but usually they're only used with Java. Rake is great, but is typically only used with Ruby. I like Python (the language), but there are several articles showing that at least at the time Scons was *slow* (and thus had trouble scaling). Autoconf's syntax is still baroque, but if you follow certain conventions it's actually not too bad, and it's much easier to use now that a number of annoying bugs have been fixed.

    For general-purpose build systems, the autotools or cmake are still reasonable build systems to look at (unless you're using Java or Ruby). And since they generate makefiles, it's important to have a great tool underneath to process the makefile, even if you don't use make directly.

    --
    - David A. Wheeler (see my Secure Programming HOWTO)
  41. Lisp s-expression notation can be readable by dwheeler · · Score: 1

    Previous poster: "Being simpler for a computer means it is simpler to write evaluators for LISP expressions. Because of the simplicity of LISP an evaluator + applicator gives you a compiler or runtime environment. That is a huge huge advantage."

    Yes, but that doesn't require using the old s-expression notation from the 1950s.

    Check out http://readable.sourceforge.net./ This adds additional abbreviations to s-expressions, just like 'x currently means (quote x), so that people can produce much more readable code and data. It's implemented in Scheme and Common Lisp, and is released as open source software using the MIT license.

    --
    - David A. Wheeler (see my Secure Programming HOWTO)
    1. Re:Lisp s-expression notation can be readable by jbolden · · Score: 1

      For lurkers the link you wanted was: http://sourceforge.net/projects/readable/

      The idea you are proposing is the idea behind Dylan: http://en.wikipedia.org/wiki/Dylan_(programming_language). It certainly is a reasonable idea for the base language. But when you construct a DSL you want your DSL code to be easy to construct and destruct data in the lower language. That is you don't want to have write complex parsers. Because once you start writing complex, you want to isolate them i.e. make them methods, make the protocols for putting data into and out of the DSL data structures isolated as well.... and soon you are looking at object oriented code. You've changed the whole paradigm.

      What is truly unique about LISP is how easy it is to create a LISP and those s-expressions which are pre-parsed is a large part of that.

    2. Re:Lisp s-expression notation can be readable by MarginalWatcher · · Score: 1

      Check out http://readable.sourceforge.net./ This adds additional abbreviations to s-expressions, just like 'x currently means (quote x), so that people can produce much more readable code and data. It's implemented in Scheme and Common Lisp, and is released as open source software using the MIT license.

      Looks a lot like m-expressions to me.

  42. Make scales just fine (see: Peter Miller) by dwheeler · · Score: 1

    Make scales just fine. Badly using make, through mistakes like using recursive make, causes scalability problems.

    The paper "Recursive make considered harmful" by Peter Miller identifies common mistakes in using make, and how to fix them. The biggest mistake is using recursive make; this is a common mistake that is NOT required by make. Once you stop making this mistake, make is suddenly much faster.

    Two other issues with standard make were not part of POSIX, but they are now:

    Issue 1: Historically, standard make only implements deferred assignment (where values are calculated when referenced, not when set). This meant that as size grows, there was an exponentially increasing calculation effort (eek). Miller recommends using immediate assignment op, but although GNU make has one (as :=) that wasn't in the POSIX standard. He also suggests using an appending assignment (+=_, which wasn't in POSIX either. Since then, POSIX has added the immediate-assignment operator ::= and the appendix-assignment += (see http://austingroupbugs.net/view.php?id=330). GNU make 4.0 implements "::=", so you can now start using it. This gets rid of a major scalability problem.

    Issue 2: The "obvious" ways to implement automatic dependency generation in make require the ability to "include" multiple from one line, and the ability to silently ignore errors when including, and those weren't in POSIX either. These have since been added to POSIX (in http://austingroupbugs.net/view.php?id=333 and http://austingroupbugs.net/view.php?id=518).

    Just getting something into the POSIX spec doesn't cause anything magical to happen. But if a capability is in a standard, it's way more likely to be implemented, and people are far more willing to depend on it.

    --
    - David A. Wheeler (see my Secure Programming HOWTO)
  43. And tab vs. space bug still not fixed. by descubes · · Score: 1

    See page 184 of the Unix Haters Handbook, http://web.mit.edu/~simsong/www/ugh.pdf. That has to be the most obstinate bug in the world.

    Helpful comments in the source code:

                    if (wtype == w_eol)
                        {
                            if (*p2 != '\0') /* There's no need to be ivory-tower about this: check for
                                      one of the most common bugs found in makefiles... */
                                fatal (fstart, _("missing separator%s"),
                                              (cmd_prefix == '\t' && !strneq (line, " ", 8))
                                              ? "" : _(" (did you mean TAB instead of 8 spaces?)"));
                            continue;
                        }

    So they detect it, and they'd rather insult the user. But "no ivory tower", no no, we will just not parse a space when the ATT code only parsed tabs. It's a "makefile bug", not a "make bug". Sure.

    And for the fun, I just tried to build make. On MacOSX, supposedly some kind of Unix that I head a few folks actually use to build stuff. Could be a prime citizen. OK, no configure out of the box with the git repository. OK. No makefile, obviously. No install script. Bogus information in the INSTALL that tells me to run nonexistent configure. Well, running the magic incantation, aclocal ; autoheader; automake ; autoconf. Still does not work, missing files like config/compile. Running automake --add-missing. Whatever. Still an error where it's looking for po/Makefile.in.in. Huh?

    So to build make, I need not just make, but four other utilities and makefile input inputs? WTF?

    Make alone was bad enough. But it was not good enough for portability, so autoconf was added. But it did not work so automake was added. But it did not work, so... And now at version 4.0, we have a system here you need half a dozen commands just to build the damn thing, and it still does not build out of the box. Seriously?

    This whole archaic build system is doomed. Go cmake.

    --
    -- Did you try Tao3D? http://tao3d.sourceforge.net
  44. Re:Awesorme! by unixisc · · Score: 1

    Now you should be able to GNU Make 4.0 GNU HURD

  45. Re:Scheme?!? by Unknown+Lamer · · Score: 1

    Subtle? You mean ... parallel binding, sequential binding, and recursive binding? That's not so hard to get. Especially since you can define all of them in terms of let to elucidate their meaning... let* just expands into (let ((binding one)) (let ((binding two)) ...)), letrec is just (let ((binding-one *unspecified*) (binding-two *unspecified*) ...) (let ((binding-one actual-definition) (binding-two actual-definition)) ...)

    Although using let* is a sin (usually it is used to hide imperative programs, something that annoys the piss out of me in SML with its default sequential let...).

    --

    HAL 7000, fewer features than the HAL 9000, but just as homicidal!
  46. Re:Scheme?!? by Unknown+Lamer · · Score: 1

    Guile is pretty much Scheme with the Common Lisp library and POSIX support bolted on. It's really convenient for scripting when bash becomes too unwieldy. The only thing that sucks is that it doesn't support the scheme shell process notation any more, but that's mostly my fault since I started porting it to guile 2.x a few years ago and kind of trailed off like the lazy hacker I am.

    --

    HAL 7000, fewer features than the HAL 9000, but just as homicidal!