+# ugr,huh?
+env.Append (LINKFLAGS = ['-Wl,--export-dynamic'])
+# FIXME: ParseConfig ignores -L flag?
+env.Append (LINKFLAGS = ['-L/usr/X11R6/lib'])
+
+if env['verbose']:
+ env['__verbose'] = ' --verbose'
+ env['set__x'] = 'set -x;'
+
+
+## Explicit target and dependencies
+
+if 'clean' in COMMAND_LINE_TARGETS:
+ # ugh: prevent reconfigure instead of clean
+ os.system ('touch %s' % config_cache)
+
+ command = sys.argv[0] + ' -c .'
+ sys.stdout.write ('Running %s ... ' % command)
+ sys.stdout.write ('\n')
+ s = os.system (command)
+ if os.path.exists (config_cache):
+ os.unlink (config_cache)
+ Exit (s)
+
+if 'sconsclean' in COMMAND_LINE_TARGETS:
+ command = 'rm -rf scons.cache $(find . -name ".scon*")'
+ s = os.system (command)
+ if os.path.exists (config_cache):
+ os.unlink (config_cache)
+ Exit (s)
+
+if 'realclean' in COMMAND_LINE_TARGETS:
+ command = 'rm -rf $(find . -name "out-scons" -o -name ".scon*")'
+ sys.stdout.write ('Running %s ... ' % command)
+ sys.stdout.write ('\n')
+ s = os.system (command)
+ if os.path.exists (config_cache):
+ os.unlink (config_cache)
+ Exit (s)
+
+# Declare SConscript phonies
+env.Alias ('minimal', config_cache)
+env.Alias ('mf-essential', config_cache)
+
+env.Alias ('minimal', ['lily', 'mf-essential'])
+env.Alias ('all', ['minimal', 'mf', '.'])
+# Do we want the doc/web separation?
+env.Alias ('doc',
+ ['Documentation',
+ 'Documentation/user',
+ 'Documentation/topdocs',
+ 'Documentation/bibliography',
+ 'input'])
+
+# Without target arguments, do minimal build
+if not COMMAND_LINE_TARGETS:
+ env.Default (['minimal'])
+
+# GNU Make rerouting compat:
+env.Alias ('web', 'doc')
+
+
+env.Command (version_hh, '#/VERSION',
+ '$PYTHON ./stepmake/bin/make-version.py VERSION > $TARGET')
+
+# post-config environment update
+env.Append (
+ run_prefix = run_prefix,
+ LILYPONDPREFIX = LILYPONDPREFIX,
+
+ # FIXME: move to lily/SConscript?
+ LIBPATH = [os.path.join (absbuild, 'flower', env['out']),
+ os.path.join (absbuild, 'kpath-guile', env['out']),],
+ CPPPATH = [outdir, ],
+ LILYPOND_PATH = ['.',
+ '$srcdir/input',
+ '$srcdir/input/regression',
+ '$srcdir/input/test',
+ '$srcdir/input/tutorial',
+ '$srcdir/Documentation/user',
+ '$absbuild/mf/$out',
+# os.path.join (absbuild, 'Documentation',
+# env['out']),
+# os.path.join (absbuild, 'Documentation/user',
+# env['out']),
+ ],
+ MAKEINFO_PATH = ['.', '$srcdir/Documentation/user',
+ '$absbuild/Documentation/user/$out'],
+ )
+
+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', 'share/lilypond/%(ver)s/dvips/ps'),
+ ('#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)
+
+if 1: #env['debugging']:
+ stamp = os.path.join (run_prefix, 'stamp')
+ env.Command (stamp, ['#/SConstruct', '#/VERSION'],
+ [symlink_tree, 'touch $TARGET'])
+ env.Depends ('lily', stamp)
+
+#### dist, tar
+def plus (a, b):
+ a + b
+
+def cvs_entry_is_dir (line):
+ return line[0] == 'D' and line[-2] == '/'
+
+def cvs_entry_is_file (line):
+ return line[0] == '/' and line[-2] == '/'
+
+def cvs_dirs (dir):
+ entries = os.path.join (dir, 'CVS/Entries')
+ if not os.path.exists (entries):
+ return []
+ entries = open (entries).readlines ()
+ dir_entries = filter (cvs_entry_is_dir, entries)
+ dirs = map (lambda x: os.path.join (dir, x[2:x[2:].index ('/')+3]),
+ dir_entries)
+ return dirs + map (cvs_dirs, dirs)
+
+def cvs_files (dir):
+ entries = os.path.join (dir, 'CVS/Entries')
+ if not os.path.exists (entries):
+ return []
+ entries = open (entries).readlines ()
+ file_entries = filter (cvs_entry_is_file, entries)
+ files = map (lambda x: x[1:x[1:].index ('/')+1], file_entries)
+ return map (lambda x: os.path.join (dir, x), files)
+
+def flatten (tree, lst):
+ if type (tree) == type ([]):
+ for i in tree:
+ if type (i) == type ([]):
+ flatten (i, lst)
+ else:
+ lst.append (i)
+ return lst
+
+if os.path.isdir ('%(srcdir)s/CVS' % vars ()):
+ subdirs = flatten (cvs_dirs ('.'), [])
+else:
+ # ugh
+ command = 'cd %(srcdir)s \
+ && find . -name SConscript | sed s@/SConscript@@' % vars ()
+ subdirs = string.split (os.popen (command).read ())
+
+if env['fast']\
+ and 'all' not in COMMAND_LINE_TARGETS\
+ and 'doc' not in COMMAND_LINE_TARGETS\
+ and 'web' not in COMMAND_LINE_TARGETS\
+ and 'install' not in COMMAND_LINE_TARGETS\
+ and 'clean' not in COMMAND_LINE_TARGETS:
+ subdirs = ['lily',
+ 'flower',
+ 'kpath-guile',
+ 'mf',
+ 'python',
+ ]
+
+if os.path.isdir ('%(srcdir)s/CVS' % vars ()):
+ src_files = reduce (lambda x, y: x + y, map (cvs_files, subdirs))
+else:
+ src_files = ['foobar']
+
+readme_files = ['AUTHORS', 'README', 'INSTALL', 'NEWS']
+txt_files = map (lambda x: x + '.txt', readme_files)
+
+
+#
+# speeds up build by +- 5%
+#
+if not env['fast']:
+ foo = map (lambda x: env.TXT (x + '.txt',
+ os.path.join ('Documentation/topdocs', x)),
+ readme_files)
+ tar_base = package.name + '-' + version
+ tar_name = tar_base + '.tar.gz'
+ ball_prefix = os.path.join (outdir, tar_base)
+ tar_ball = os.path.join (outdir, tar_name)
+
+ dist_files = src_files + txt_files
+ ball_files = map (lambda x: os.path.join (ball_prefix, x), dist_files)
+ map (lambda x: env.Depends (tar_ball, x), ball_files)
+ map (lambda x: env.Command (os.path.join (ball_prefix, x), x,
+ 'ln $SOURCE $TARGET'), dist_files)
+ tar = env.Command (tar_ball, src_files,
+ ['rm -f $$(find $TARGET.dir -name .sconsign)',
+ 'tar czf $TARGET -C $TARGET.dir %s' % tar_base,])
+ env.Alias ('tar', tar)
+
+ dist_ball = os.path.join (package.release_dir, tar_name)
+ env.Command (dist_ball, tar_ball,
+ 'if [ -e $SOURCE -a -e $TARGET ]; then rm $TARGET; fi;' \
+ + 'ln $SOURCE $TARGET')
+ env.Depends ('dist', dist_ball)
+ patch_name = os.path.join (outdir, tar_base + '.diff.gz')
+ patch = env.PATCH (patch_name, tar_ball)
+ env.Depends (patch_name, dist_ball)
+ env.Alias ('release', patch)
+
+#### web
+if not env['fast']:
+ web_base = os.path.join (outdir, 'web')
+ web_ball = web_base + '.tar.gz'
+ env['footify'] = 'MAILADDRESS=bug-lilypond@gnu.org $PYTHON stepmake/bin/add-html-footer.py --name=lilypond --version=$TOPLEVEL_VERSION'
+ web_ext = ['.html', '.ly', '.midi', '.pdf', '.png', '.ps.gz', '.txt',]
+ web_path = '-path "*/$out/*"' + string.join (web_ext, ' -or -path "*/$out/*"') + '-or -type l'
+ env['web_path'] = web_path
+ web_list = os.path.join (outdir, 'weblist')
+ # compatible make heritits
+ # fixme: generate in $outdir is cwd/builddir
+ env.Command (web_list,
+ ## Adding 'doc' dependency is correct, but takes
+ ## > 5min extra if you have a peder :-)
+ #'doc',
+
+ '#/VERSION',
+ ['$PYTHON buildscripts/mutopia-index.py -o examples.html ./',
+ 'cd $absbuild && $footify $$(find . -name "*.html" -print)',
+ 'cd $absbuild && rm -f $$(find . -name "*.html~" -print)',
+ 'cd $absbuild && find Documentation input $web_path \
+ > $TARGET',
+ '''echo '<META HTTP-EQUIV="refresh" content="0;URL=Documentation/out-www/index.html">' > $absbuild/index.html''',
+ '''echo '<html><body>Redirecting to the documentation index...</body></html>' >> $absbuild/index.html''',
+ 'cd $absbuild && ls *.html >> $TARGET',])
+ env.Command (web_ball, web_list,
+ ['cat $SOURCE | tar -C $absbuild -czf $TARGET -T -',])
+ #env.Alias ('web', web_ball)
+ www_base = os.path.join (outdir, 'www')
+ www_ball = www_base + '.tar.gz'
+ env.Command (www_ball, web_ball,
+ ['rm -rf $out/tmp',
+ 'mkdir -p $absbuild/$out/tmp',
+ 'tar -C $absbuild/$out/tmp -xzf $SOURCE',
+ 'cd $absbuild/$out/tmp && for i in $$(find . -name "$out"); '
+ + ' do mv $$i $$(dirname $$i)/out-www; done',
+ 'tar -C $absbuild/$out/tmp -czf $TARGET .'])
+ env.Alias ('web', www_ball)
+
+#### tags
+env.Append (
+ ETAGSFLAGS = """--regex='{c++}/^LY_DEFINE *(\([^,]+\)/\\1/' \
+ --regex='{c++}/^LY_DEFINE *([^"]*"\([^"]+\)"/\\1/'""")
+code_ext = ['.cc', '.hh', '.scm', '.tcc',]
+env.Command ('TAGS', filter (lambda x: os.path.splitext (x)[1] in code_ext,
+ src_files),
+ 'etags $ETAGSFLAGS $SOURCES')