]> git.donarmstrong.com Git - lilypond.git/blobdiff - SConstruct
* SConstruct:
[lilypond.git] / SConstruct
index 7cf431902dd8d3f4f75896447f2bbeaafe907817..89d6a59da437d395447f0bde62ff84f2f845ae1d 100644 (file)
@@ -4,7 +4,14 @@
 Experimental scons (www.scons.org) building:
 
 Usage:
-    scons
+    scons lily            # build lily
+    LILYPONDPREFIX=out-scons/usr/share/lilypond lily/out-scons/lilypond-bin
+    scons doc             # build web doc
+
+    scons                 # without args builds all targets below ./
+                          # maybe catch this one and only build lily?
+    scons /               # builds all possible targets
+
     scons install
     scons -c              # clean
     scons -h              # help
@@ -20,11 +27,16 @@ optimising=0
 debugging=1
 gui=1
 os.path.join (os.getcwd (), '=install')
+prefix=os.path.join (os.environ['HOME'], 'usr', 'pkg', 'lilypond')
 
 '''
 
 
 # TODO:
+#   * separate environments?
+#     - compile environment checks headers and libraries
+#     - doc environment checks doc stuff
+#
 #   * running from build-dir, without installing?
 #     - scons will not install, if PREFIX lives outside of CWD
 #     - build symlink tree
@@ -49,6 +61,7 @@ env = Environment ()
 
 # put your favourite stuff in custom.py
 opts = Options ('custom.py', ARGUMENTS)
+#opts = Options (['config.cache', 'custom.py'], ARGUMENTS)
 opts.Add ('prefix', 'Install prefix', '/usr/')
 opts.Add ('out', 'Output directory', 'out-scons')
 opts.Add ('build', 'Build directory', '.')
@@ -73,6 +86,10 @@ Help (opts.GenerateHelpText (env))
 
 env = Environment (options = opts)
 
+opts.Update (env)
+#opts.Save ('config.cache', env)
+
+
 env.CacheDir (os.path.join (env['build'], '=build-cache'))
 
 #ugh
@@ -109,8 +126,58 @@ if env['warnings']:
 
 env['MFMODE'] = 'ljfour'
 
+
 conf = Configure (env)
 
+
+vre = re.compile ('^.*[^-.0-9]([0-9][0-9]*\.[0-9][.0-9]*).*$', re.DOTALL)
+def get_version (program):
+       command = '(%(program)s --version || %(program)s -V) 2>&1' % vars ()
+       pipe = os.popen (command)
+       output = pipe.read ()
+       if pipe.close ():
+               return None
+       v = re.sub (vre, '\\1', output)
+       return string.split (v, '.')
+
+def assert_version (lst, program, minimal, description, package):
+       global required
+       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
+       sys.stdout.write (string.join (actual, '.'))
+       sys.stdout.write ('\n')
+       if actual < string.split (minimal, '.'):
+               lst.append ((description, package, minimal, program,
+                            string.join (actual, '.')))
+
+required = []
+assert_version (required, 'gcc', '2.8', 'GNU C compiler', 'gcc')
+assert_version (required, 'g++', '3.0.5', 'GNU C++ compiler', 'g++')
+assert_version (required, 'python', '2.1', 'Python (www.python.org)', 'python')
+assert_version (required, 'guile-config', '1.6', 'GUILE development',
+               'libguile-dev or guile-devel')
+# Do not use bison 1.50 and 1.75.
+assert_version (required, 'bison', '1.25', 'Bison -- parser generator',
+               'bison')
+assert_version (required, 'flex', '0.0', 'Flex -- lexer generator', 'flex')
+
+
+optional = []
+assert_version (optional, 'makeinfo', '4.7', 'Makeinfo tool', 'texinfo')
+assert_version (optional, 'guile', '1.6', 'GUILE scheme',
+               'libguile-dev or guile-devel')
+assert_version (optional, 'mftrace', '1.0.27', 'Metafont tracing Type1',
+               'mftrace')
+assert_version (optional, 'perl', '4.0',
+               'Perl practical efficient readonly language', 'perl')
+#assert_version (optional, 'foo', '2.0', 'Foomatic tester', 'bar')
+
+
 defines = {
    'DIRSEP' : "'/'",
    'PATHSEP' : "':'",
@@ -124,11 +191,9 @@ defines = {
 
 
 command = r"""python -c 'import sys; sys.stdout.write ("%s/include/python%s" % (sys.prefix, sys.version[:3]))'""" #"
-print command
 PYTHON_INCLUDE = os.popen (command).read ()
 env.Append (CPPPATH = PYTHON_INCLUDE)
 
-
 headers = ('sys/stat.h', 'assert.h', 'kpathsea/kpathsea.h', 'Python.h')
 for i in headers:
        if conf.CheckCHeader (i):
@@ -147,9 +212,11 @@ for i in functions:
                        key = re.sub ('[./]', '_', 'HAVE_' + string.upper (i))
                 defines[key] = '1'
 
-
 key = 'HAVE_FLEXLEXER_YY_CURRENT_BUFFER'
-defines[key] = conf.TryCompile ("""using namespace std;
+
+sys.stdout.write('Checking for yy_current_buffer ... ')
+sys.stdout.flush()
+res = conf.TryCompile ("""using namespace std;
 #include <FlexLexer.h>
 class yy_flex_lexer: public yyFlexLexer
 {
@@ -158,7 +225,13 @@ class yy_flex_lexer: public yyFlexLexer
     {
       yy_current_buffer = 0;
     }
-};""", 'cc')
+};""", '.cc')
+if res:
+       defines[key] = '1'
+       sys.stdout.write('yes\n')
+else:
+       sys.stdout.write('no\n')
+
 
 if conf.CheckLib ('dl'):
        pass
@@ -189,6 +262,13 @@ if env['gui']:
 
 env = conf.Finish ()
 
+here = os.getcwd ()
+reldir = str (Dir ('.').srcnode ())
+os.chdir (reldir)
+srcdir = os.getcwd ()
+os.chdir (here)
+env['srcdir'] = srcdir
+
 build = env['build']
 out = env['out']
 ##reldir = str (Dir ('.').srcnode ())
@@ -218,69 +298,85 @@ else:
        env.Append (LIBPATH = ['#/flower/' + out,],
                    CPPPATH = [outdir, '#',])
 
-vre = re.compile ('^.*[^-.0-9]([0-9][0-9]*\.[0-9][.0-9]*).*$', re.DOTALL)
-def get_version (program):
-       command = '(%(program)s --version || %(program)s -V) 2>&1' % vars ()
-       output = os.popen (command).read ()
-       v = re.sub (vre, '\\1', output)
-       return string.split (v, '.')
-
-def assert_version (lst, program, minimal, description, package):
-       global required
-       sys.stdout.write ('Checking %s version... ' % program)
-       actual = get_version (program)
-       sys.stdout.write (string.join (actual, '.'))
-       sys.stdout.write ('\n')
-       if actual < string.split (minimal, '.'):
-               lst.append ((description, package, minimal, program,
-                            string.join (actual, '.')))
-
-required = []
-assert_version (required, 'gcc', '2.8', 'GNU C compiler', 'gcc')
-assert_version (required, 'g++', '3.0.5', 'GNU C++ compiler', 'g++')
-assert_version (required, 'python', '2.1', 'Python (www.python.org)', 'python')
-assert_version (required, 'guile-config', '1.6', 'GUILE development',
-               'libguile-dev or guile-devel')
-# Do not use bison 1.50 and 1.75.
-assert_version (required, 'bison', '1.25', 'Bison -- parser generator',
-               'bison')
-assert_version (required, 'flex', '0.0', 'Flex -- lexer generator', 'flex')
-
-
-optional = []
-assert_version (optional, 'makeinfo', '4.7', 'Makeinfo tool', 'texinfo')
-assert_version (optional, 'guile', '1.6', 'GUILE scheme',
-               'libguile-dev or guile-devel')
-assert_version (optional, 'mftrace', '1.0.27', 'Metafont tracing Type1',
-               'mftrace')
-assert_version (optional, 'perl', '4.0',
-               'Perl practical efficient readonly language', 'perl')
-
 if required:
        print
        print '********************************'
        print 'Please install required packages'
        for i in required:
-               print '%s:      %s-%s or newer (found: %s-%s)' % i
+               print '%s:      %s-%s or newer (found: %s %s)' % i
+       sys.exit (1)
 
 if optional:
        print
        print '*************************************'
        print 'Consider installing optional packages'
        for i in optional:
-               print '%s:      %s-%s or newer (found: %s-%s)' % i
+               print '%s:      %s-%s or newer (found: %s %s)' % i
 
 #env['tarball'] = os.path.join (outdir,
 #                             package.name + '-' + env['version'] + '.tar.gz')
 
-env['tarball'] = os.path.join ('~/tmp',
+env['tarball'] = os.path.join (os.environ['HOME'], 'tmp',
                               package.name + '-' + env['version'] + '.tar.gz')
 
+# huh?
+if 'tar' in COMMAND_LINE_TARGETS:
+       #env.Default (env['tarball'])
+       #env.Default (tar)
+       env.Default (env['tarball'])
+       #Default (tar)
+
 Export ('env')
 
+#ugr
+if build == '.':
+       absbuild = os.getcwd ()
+else:
+       absbuild = build
+env['absbuild'] = absbuild
+
+# duh
+env['MAKEINFO'] = 'LANG= makeinfo'
+env['PYTHON'] = 'python'
+env['LILYPOND_BIN'] = os.path.join (absbuild, 'lily', out, 'lilypond-bin')
+env['LILYPONDPREFIX'] =        os.path.join (outdir, 'usr/share/lilypond')
+env['LILYPOND_BOOK'] = srcdir + '/scripts/lilypond-book.py'
+env['ABC2LY_PY'] = srcdir + '/scripts/abc2ly.py'
+env['MF_TO_TABLE_PY'] = srcdir + '/buildscripts/mf-to-table.py'
+env['LILYPOND_PY'] = srcdir + '/scripts/lilypond.py'
+env['LILYPOND_BOOK_FLAGS'] = ''
+env['LILYPOND_BOOK_FORMAT'] = 'texi-html'
+# ugh?
+env['LILYPOND_BOOK_PATH'] = ['.', '#/input', '#/input/regression',
+                            '#/input/test', '#/input/tutorial',
+                            os.path.join (absbuild, 'mf', out),
+                            '#/Documentation/user',
+                            os.path.join (absbuild, 'Documentation', out),
+                            os.path.join (absbuild, 'Documentation/user', out),
+                            ]
+                            
+env['MAKEINFO_PATH'] = ['.', '#/Documentation/user',
+                       os.path.join (absbuild, 'Documentation/user', out)]
+
+## TEXINFO_PAPERSIZE_OPTION= $(if $(findstring $(PAPERSIZE),a4),,-t @afourpaper)
+env['TEXINFO_PAPERSIZE_OPTION'] = '-t @afourpaper'
+env.Append (PYTHONPATH = [os.path.join (outdir, 'usr/lib/python'),
+                         os.path.join (srcdir, 'buildscripts'),
+                         os.path.join (srcdir, 'python')])
+# huh, aha?
+# GS_FONTPATH, GS_LIB?
+env.Append (ENV = { 'PYTHONPATH' : string.join (env['PYTHONPATH'],
+                                               os.pathsep) } )
+# UGHR, lilypond.py uses lilypond-bin from PATH
+env.Append (ENV = { 'PATH' : os.path.join (outdir, 'usr/bin') })
+
+SConscript ('buildscripts/builder.py')
+
 #subdirs = ['mf',]
 #subdirs = ['flower', 'lily', 'parser', 'gui', 'main',]
-subdirs = ['flower', 'lily', 'mf', 'scm', 'ly']
+#subdirs = ['flower', 'lily', 'mf', 'scm', 'ly']
+subdirs = ['flower', 'lily', 'mf', 'scm', 'ly', 'Documentation',
+          'Documentation/user', 'input']
 for d in subdirs:
        b = os.path.join (build, d, out)
        # Support clean sourctree build (srcdir build)
@@ -291,13 +387,70 @@ for d in subdirs:
                env.BuildDir (b, d, duplicate=0)
        SConscript (os.path.join (b, 'SConscript'))
 
+readme_files = ['ChangeLog', 'COPYING', 'DEDICATION', 'ROADMAP', 'THANKS']
+readme_txt = ['AUTHORS.txt', 'README.txt', 'INSTALL.txt', 'NEWS.txt']
+# to be [re]moved after spit
+patch_files = ['emacsclient.patch', 'server.el.patch', 'darwin.patch']
 
-readmes = ['AUTHORS.txt', 'ChangeLog', 'NEWS.txt']
+map (lambda x: env.Texi2txt (x, os.path.join ('Documentation/topdocs',
+                                             os.path.splitext (x)[0])),
+     readme_txt)
 
 #testing
 env.Append (TARFLAGS = '-z --owner=0 --group=0')
 env.Append (GZIPFLAGS = '-9')
-all_sources = ['SConstruct',] + readmes + subdirs
-x = env.Tar (env['tarball'], all_sources)
-
+all_sources = ['SConstruct',] + subdirs \
+             + ['VERSION', '.cvsignore']\
+             + readme_files + readme_txt + patch_files
+
+tar = env.Tar (env['tarball'], all_sources)
+
+# as a builder?
+def symlink_tree (prefix):
+       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))
+       #srcdir = os.getcwd ()
+       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:
+                       print 'dst: ' + dst
+                       depth = len (string.split (dir, '/'))
+                       print 'depth: ' + `depth`
+                       frm = os.path.join ('../' * depth, src, out)
+               print 'cwd: ' + `os.getcwd ()`
+               print 'frm: ' + frm
+               print 'dst: ' + dst
+               os.symlink (frm, os.path.basename (dst))
+       map (lambda x: symlink (x[0], os.path.join (prefix, x[1])),
+            (('python', 'lib/lilypond/python'),
+             # UGHR, lilypond.py uses lilypond-bin from PATH
+             ('lily',   'bin'),
+             ('#mf',    'share/lilypond/fonts/mf'),
+             ('mf',     'share/lilypond/fonts/afm'),
+             ('mf',     'share/lilypond/fonts/tfm'),
+             ('mf',     'share/lilypond/fonts/type1'),
+             ('#tex',   'share/lilypond/tex/source'),
+             ('mf',     'share/lilypond/tex/generate'),
+             ('#ly',    'share/lilypond/ly'),
+             ('#scm',   'share/lilypond/scm'),
+             ('#ps',    'share/lilypond/ps'),
+             ('elisp',  'share/lilypond/elisp')))
+       os.chdir (srcdir)
 
+if env['debugging']:
+       prefix = os.path.join (out, 'usr')
+       if not os.path.exists (prefix):
+               symlink_tree (prefix)