SCons build tool speed

Jeff Epler jepler at unpythonic.net
Sun Feb 13 22:14:58 EST 2005


On Sun, Feb 13, 2005 at 08:39:10PM -0500, Peter Hansen wrote:
> That answer, combined with Mike's response pointing out
> that tools more sophisticated than basic "make" actually
> can delve into the source and identify the dependencies,

Argh argh argh.

Of course you can write a makefile to "delve into the source and
identify the dependencies".  And, by the way, there's no need for make
to be recursive when a project spans multiple directories. (the other
popular misconception about make)

Below is a GNU makefile that I use to build a small program.  I
re-organized the file a bit before posting to clearly separate the two
sections of the makefile, and it's possible I broke something in the
process.

Since my system has subsecond file timestamps and I do not build with source
or object files on network filesystems, the "timestamp comparison"
method works just fine to decide whether a target must be rebuilt or
not.

What programs like SCons *do* is include nice built-in definitions of
stuff like the 'obj/%.d: %.cc' rule (often with a built-in parser which
you can bet will not be 100% compatible with your compiler!), built-in
inclusion of dependency lists with no extra programmer action, and the
features I don't need like the use of cryptographic hashes to compare
files.

A larger system I work on uses GNU make to build around 6000 object
files into a single executable.  A "do-nothing" make takes around 8
seconds on a 2.8GHz machine.  This involves parsing about 6000 lines of
Makefiles and Submakefiles (per-directory lists of source files), and
about 650klines of dependency information.

I don't know how this measures up to "modern" tools like SCons.  I'd be
curious to know.

But it's my opinion that a well-designed "make library" and/or "make
preprocessor" to go with GNU Make would be right up there with SCons in
its "power", while avoiding the need for a tool that most people have
never heard of and don't already have installed on their system (yes, a
pretty Linux-centric view).

One criticism of Make that I'd take seriously is that it's a
domain-specific language and usually I say those are terrible ideas.  I
still have to refer to the manual to remember which of $*, $@, $^ or $<
I need, sometimes, even though I've been a GNU Make power user for two
years now.

Jeff


#------------------------------------------------------------------------
# This section of the makefile names the source files (one in this case)
# and other complier options.  It also has a rule for linking the target
# program
default: stippler
LFLAGS := -L/usr/X11R6/lib 
LIBS := -lGL -lGLU -lglut -lXi -lXmu -lX11 -lm -lnetpbm
SRCS := main.cc
CFLAGS := -mcpu=pentium4 -O0 -g -DOUTPUT_POSTSCRIPT

stippler: $(OBJS)
        $(CCLD) $(LFLAGS) -o $@ $^ $(LIBS)

#------------------------------------------------------------------------
# This section, which is essentially boilerplate, says how to generate
# the list of dependencies or the object file from a given source file.  
# It also transforms the list of sources into a list of objects, and
# includes all the necessary dependency lists ("dot d files")
#
# The definition of OBJS would be more complex if source files of
# different types exist (.c and .cc files, for example)
OBJS := $(patsubst %.cc, obj/%.o, $(SRCS))
CCLD := $(CC)
include $(patsubst %.o,%.d,$(OBJS))

obj/%.d: %.cc
        mkdir -p $(dir $@)
        $(CC) -MM -MG -MT "$@ $(patsubst obj/%.d,obj/%.o,$@)" \
                $(CFLAGS) $< -o $@.tmp && mv -f $@.tmp $@

obj/%.o: %.cc
        $(CC) $(CFLAGS) -c $< -o $@.tmp && mv -f $@.tmp $@
#------------------------------------------------------------------------
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 196 bytes
Desc: not available
URL: <http://mail.python.org/pipermail/python-list/attachments/20050213/84a16fd7/attachment.sig>


More information about the Python-list mailing list