+ BoolOption ('warnings', 'compile with -Wall and similiar',
+ 1),
+ BoolOption ('debugging', 'compile with debugging symbols',
+ 0),
+ BoolOption ('optimising', 'compile with optimising',
+ 1),
+ BoolOption ('shared', 'build shared libraries',
+ 0),
+ BoolOption ('static', 'build static libraries',
+ 1),
+ BoolOption ('gui', 'build with GNOME backend (EXPERIMENTAL)',
+ 0),
+ BoolOption ('verbose', 'run commands with verbose flag',
+ 0),
+ BoolOption ('checksums', 'use checksums instead of timestamps',
+ 0),
+ BoolOption ('fast', 'use timestamps, implicit cache, prune CPPPATH',
+ 0),
+ )
+
+srcdir = Dir ('.').srcnode ().abspath
+#ugh
+sys.path.append (os.path.join (srcdir, 'stepmake', 'bin'))
+
+try:
+ import packagepython
+ packagepython.Package (srcdir)
+ packagepython.version_tuple_to_str (package.version)
+except:
+ print '*** FIXME: no packagepython. setting version to 1.0'
+ class Package:
+ name = 'lilypond'
+ release_dir = '.'
+ package = Package
+ version = '1.0'
+
+ENV = { 'PYTHONPATH': '' }
+for key in ['GUILE_LOAD_PATH', 'LD_LIBRARY_PATH', 'PATH', 'PKG_CONFIG_PATH',
+ 'PYTHONPATH', 'TEXMF']:
+ if os.environ.has_key (key):
+ ENV[key] = os.environ[key]
+
+ENV['PYTHONPATH'] = os.path.join (srcdir, 'python') + ':' + ENV['PYTHONPATH']
+
+env = Environment (
+ ENV = ENV,
+ BYTEORDER = sys.byteorder.upper (),
+ CC = '$GCC',
+ CXX = '$GXX',
+ CPPDEFINES = '-DHAVE_CONFIG_H',
+ MAKEINFO = 'LANG= makeinfo',
+ MF_TO_TABLE_PY = srcdir + '/buildscripts/mf-to-table.py',
+
+ PKG_CONFIG_PATH = [os.path.join (os.environ['HOME'],
+ 'usr/pkg/gnome/lib'),
+ os.path.join (os.environ['HOME'],
+ 'usr/pkg/pango/lib')],
+ GZIP='-9v',
+ MFMODE = 'ljfour',
+ TOPLEVEL_VERSION = version,
+ )
+
+Help (usage + opts.GenerateHelpText (env))
+
+# Add all config_vars to opts, so that they will be read and saved
+# together with the other configure options.
+map (lambda x: opts.AddOptions ((x,)), config_vars)
+opts.Update (env)
+
+for key in config_vars:
+ if os.environ.has_key (key):
+ env[key] = os.environ[key]
+
+if env['fast']:
+ # Usability switch (Anthony Roach).
+ # See http://www.scons.org/cgi-bin/wiki/GoFastButton
+ # First do: scons realclean .
+ env['checksums'] = 0
+ SetOption ('max_drift', 1)
+ SetOption ('implicit_cache', 1)
+elif env['checksums']:
+ # Always use checksums (makes more sense than timestamps).
+ SetOption ('max_drift', 0)
+ # Using *content* checksums prevents rebuilds after
+ # [re]configure if config.hh has not changed. Too bad that it
+ # is unusably slow.
+ TargetSignatures ('content')
+
+absbuild = Dir (env['build']).abspath
+outdir = os.path.join (Dir (env['build']).abspath, env['out'])
+run_prefix = os.path.join (absbuild, os.path.join (env['out'], 'usr'))
+
+
+config_hh = os.path.join (outdir, 'config.hh')
+version_hh = os.path.join (outdir, 'version.hh')
+
+env.Alias ('config', config_cache)
+
+cachedir = os.path.join (outdir, 'build-cache')
+
+if not os.path.exists (cachedir):
+ os.makedirs (cachedir)
+
+CacheDir (cachedir)
+
+# No need to set $LILYPOND_DATADIR to run lily, but cannot install...
+if env['debugging'] and not 'install' in COMMAND_LINE_TARGETS:
+ env['prefix'] = run_prefix
+
+prefix = env['prefix']
+bindir = os.path.join (prefix, 'bin')
+sharedir = os.path.join (prefix, 'share')
+libdir = os.path.join (prefix, 'lib')
+libdir_package = os.path.join (libdir, package.name)
+libdir_package_version = os.path.join (libdir_package, version)
+localedir = os.path.join (sharedir, 'locale')
+sharedir_doc_package = os.path.join (sharedir, 'doc', package.name)
+sharedir_package = os.path.join (sharedir, package.name)
+sharedir_package_version = os.path.join (sharedir_package, version)
+lilypondprefix = sharedir_package_version
+
+# junkme
+env.Append (
+ absbuild = absbuild,
+ srcdir = srcdir,
+ )
+
+
+
+def symlink_tree (target, source, env):
+ def mkdirs (dir):
+ def mkdir (dir):
+ if not dir:
+ os.chdir (os.sep)
+ return
+ if not os.path.isdir (dir):
+ if os.path.exists (dir):
+ os.unlink (dir)
+ os.mkdir (dir)
+ os.chdir (dir)
+ map (mkdir, string.split (dir, os.sep))
+ def symlink (src, dst):
+ os.chdir (absbuild)
+ dir = os.path.dirname (dst)
+ mkdirs (dir)
+ if src[0] == '#':
+ frm = os.path.join (srcdir, src[1:])
+ else:
+ depth = len (string.split (dir, '/'))
+ if src.find ('@') > -1:
+ frm = os.path.join ('../' * depth,
+ string.replace (src, '@',
+ env['out']))
+ else:
+ frm = os.path.join ('../' * depth, src,
+ env['out'])
+ if src[-1] == '/':
+ frm = os.path.join (frm, os.path.basename (dst))
+ if env['verbose']:
+ print 'ln -s %s -> %s' % (frm, os.path.basename (dst))
+ os.symlink (frm, os.path.basename (dst))
+ shutil.rmtree (run_prefix)
+ prefix = os.path.join (env['out'], 'usr')
+ map (lambda x: symlink (x[0], os.path.join (prefix,
+ x[1] % {'ver' : version})),
+ # ^# := source dir
+ # @ := out
+ # /$ := add dst file_name
+ (('python', 'lib/lilypond/python'),
+ # ugh
+ ('python', 'share/lilypond/%(ver)s/python'),
+ ('lily/', 'bin/lilypond'),
+ ('scripts/', 'bin/convert-ly'),
+ ('scripts/', 'bin/lilypond-book'),
+ ('scripts/', 'bin/ps2png'),
+ ('mf', 'share/lilypond/%(ver)s/dvips/mf-out'),
+ ('#ps/music-drawing-routines.ps',
+ 'share/lilypond/%(ver)s/tex/music-drawing-routines.ps'),
+ ('mf', 'share/lilypond/%(ver)s/otf'),
+ ('mf', 'share/lilypond/%(ver)s/tfm'),
+ ('tex', 'share/lilypond/%(ver)s/tex/enc'),
+ ('#mf', 'share/lilypond/%(ver)s/fonts/mf'),
+ ('mf', 'share/lilypond/%(ver)s/fonts/map'),
+ ('mf', 'share/lilypond/%(ver)s/fonts/otf'),
+ ('mf', 'share/lilypond/%(ver)s/fonts/tfm'),
+ ('mf', 'share/lilypond/%(ver)s/fonts/type1'),
+ ('#tex', 'share/lilypond/%(ver)s/tex/source'),
+ ('tex', 'share/lilypond/%(ver)s/tex/tex-out'),
+ ('mf', 'share/lilypond/%(ver)s/tex/mf-out'),
+ ('#ly', 'share/lilypond/%(ver)s/ly'),
+ ('#scm', 'share/lilypond/%(ver)s/scm'),
+ ('#scripts', 'share/lilypond/%(ver)s/scripts'),
+ ('#ps', 'share/lilypond/%(ver)s/ps'),
+ ('po/@/nl.mo', 'share/locale/nl/LC_MESSAGES/lilypond.mo'),
+ ('elisp', 'share/lilypond/%(ver)s/elisp')))
+
+ print "FIXME: BARF BARF BARF"
+ os.chdir (absbuild)
+ out = env['out']
+ ver = version
+ prefix = os.path.join (env['out'], 'usr/share/lilypond/%(ver)s/fonts'
+ % vars ())
+ for ext in ('enc', 'map', 'otf', 'svg', 'tfm', 'pfa'):
+ dir = os.path.join (absbuild, prefix, ext)
+ os.system ('rm -f ' + dir)
+ mkdirs (dir)
+ os.chdir (dir)
+ os.system ('ln -s ../../../../../../../mf/%(out)s/*.%(ext)s .'
+ % vars ())
+ os.chdir (srcdir)
+
+def configure (target, source, env):
+ dre = re.compile ('\n(200[0-9]{5})')
+ vre = re.compile ('.*?\n[^-.0-9]*([0-9][0-9]*\.[0-9]([.0-9]*[0-9])*)',
+ re.DOTALL)
+ def get_version (program):
+ command = '(pkg-config --modversion %(program)s || %(program)s --version || %(program)s -V) 2>&1' % vars ()
+ pipe = os.popen (command)
+ output = pipe.read ()
+ if pipe.close ():
+ return None
+ splits = re.sub ('^|\s', '\n', output)
+ date_hack = re.sub (dre, '\n0.0.\\1', splits)
+ m = re.match (vre, date_hack)
+ v = m.group (1)
+ if v[-1] == '\n':
+ v = v[:-1]
+ return string.split (v, '.')
+
+ def test_version (lst, full_name, minimal, description, package):
+ program = os.path.basename (full_name)
+ sys.stdout.write ('Checking %s version... ' % program)
+ actual = get_version (program)
+ if not actual:
+ print 'not found'
+ lst.append ((description, package, minimal, program,
+ 'not installed'))
+ return 0
+ print string.join (actual, '.')
+ if map (string.atoi, actual) \
+ < map (string.atoi, string.split (minimal, '.')):
+ lst.append ((description, package, minimal, program,
+ string.join (actual, '.')))
+ return 0
+ return 1
+
+ def test_program (lst, program, minimal, description, package):
+ key = program.upper ()
+ if key.find ('+-'):
+ key = re.sub ('\+', 'X', key)
+ key = re.sub ('-', '_', key)
+ sys.stdout.write ('Checking for %s ... ' % program)
+ if env.has_key (key):
+ f = env[key]
+ sys.stdout.write ('(cached) ')
+ else:
+ f = WhereIs (program)
+ env[key] = f
+ if not f:
+ print 'not found'
+ lst.append ((description, package, minimal, program,
+ 'not installed'))
+ return 0
+ print f
+ return test_version (lst, program, minimal, description, package)
+
+ def test_lib (lst, program, minimal, description, package):
+ # FIXME: test for Debian or RPM (or -foo?) based dists
+ # to guess (or get correct!: apt-cache search?)
+ # package name.
+ #if os.system ('pkg-config --atleast-version=0 freetype2'):
+ # barf
+ if test_version (lst, program, minimal, description,
+ 'lib%(package)s-dev or %(package)s-devel'
+ % vars ()):
+ env.ParseConfig ('pkg-config --cflags --libs %(program)s'
+ % vars ())
+ return 1
+ return 0
+
+ required = []
+ test_program (required, 'bash', '2.0', 'Bash', 'bash')
+ test_program (required, 'gcc', '4.0', 'GNU C compiler', 'gcc')
+ test_program (required, 'g++', '4.0.5', 'GNU C++ compiler', 'g++')
+ test_program (required, 'guile-config', '1.8', 'GUILE development',
+ 'libguile-dev or guile-devel')
+ test_program (required, 'mf', '0.0', 'Metafont', 'tetex-bin')
+ test_program (required, 'python', '2.1', 'Python (www.python.org)',
+ 'python')
+ # Silly, and breaks with /bin/sh == dash
+ #test_program (required, 'sh', '0.0', 'Bourne shell', 'sh')