Tue 2018-01-30 12:19:45 UTC, Erik Bray: > > Hi anyone interested in Sage (the distribution's) build system, > > I have a ticket that's been languishing for months now which makes > some significant overhauls to how Sage's build/make/Makefile is > generated and structured: https://trac.sagemath.org/ticket/21524 > I know we're all very busy and that it's a difficult patch to > evaluate, so I haven't been too pushy about trying to get eyes on it. > > But I've been doing some new work (rather successful so far) to > implement a general method for how I can easily add configure-time > checks to use system packages for more of Sage's dependencies, and > I've been doing this work on top of #21524. So if I want to proceed > any further with that work I think progress is needed on this ticket. > > The basic issue is that Sage's old configure.ac contains code in it > for directly writing the Makefile, rather than using a template (a > Makefile.in) per the usual autoconf pattern. Of course, the fact that > we weren't doing that isn't *wrong*--after all there's nothing else > very "standard" about Sage's Makefile--so there was some question as > to why this was worth doing at all. I think my approach to fixing the > issue answers that question: I think the resulting Makefile, and its > template, are easier to understand for one. And the resulting > configure script runs *much* faster. Especially on Cygwin where it has > always been painfully slow, but the speedup is even noticeable on a > fast Linux machine. > > To summarize what this ticket changed: > > 1) The configure.ac template does not contain code that directly > writes the Makefile. Instead, it loops *once* over all the packages > in build/pkgs, classifies them into various categories, and generates > some variables that are easily consumed by make (e.g. a list of > standard packages, and variables containing each package's > dependencies). > > 2) These variables are then inserted into a Makefile template > (Makefile.in) by config.status, at the end of running the configure > script, via the standard AC_OUTPUT mechanism. > > 3) Unlike the old Makefile, neither the new Makefile nor the template > it is generated from contain explicit rules for building each package. > As a result it's actually quite a bit shorter. Instead it uses > relatively advanced features of GNU make (but easy to understand, I > think, especially with the inline comments I've added)--it uses the > variables substituted into the Makefile.in by configure along with > some simple templates and foreach/eval loops to generate the build and > clean rules for each package. > > The result is a more compact Makefile that, for the most part, just > contains some variables with information about the individual > packages, and some templates for generating rules for the packages. > > Most other parts of the Makefile, such as those included from > build/make/deps, remain mostly unchanged for now. > > The resulting configure script is also much faster, as it only loops > over the packages once and performs some relatively simple checks, > since it has much less text to generate. The old configure had a > shell function in it called filtered_packages_list that would loop > over all the packages and filter them according to some criteria, and > the old configure script called this four or five times, which was > responsible for much of the slowness. The new script loops over the > packages only once to generate the variables needed by the Makefile. > > Hopefully this makes sense, and will be of interest to someone. I'm > not 100% married to all the details of my current approach, but I > think the general approach is much cleaner and, as I've noted, faster. > > Best, > E
Not an expert in build systems, but +1 to looping only once +1 to the speedup +1 to making it easier to use system packages for more of Sage's dependencies -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To post to this group, send email to sage-devel@googlegroups.com. Visit this group at https://groups.google.com/group/sage-devel. For more options, visit https://groups.google.com/d/optout.