diff options
author | Jan Nieuwenhuizen <janneke@gnu.org> | 2004-07-13 16:03:32 +0000 |
---|---|---|
committer | Jan Nieuwenhuizen <janneke@gnu.org> | 2004-07-13 16:03:32 +0000 |
commit | ffc1f4186e3727d63271da11aa250b3523c35923 (patch) | |
tree | 8f618e9fc9382777413cee9230b26772d6236806 /SConstruct | |
parent | c1fb671679be258cbd68c6ee00885a0bfbb30372 (diff) |
* SConstruct: Configure only pristine build tree or on user
request. Cleanups.
* Documentation/topdocs/SConscript: New file.
Diffstat (limited to 'SConstruct')
-rw-r--r-- | SConstruct | 405 |
1 files changed, 228 insertions, 177 deletions
diff --git a/SConstruct b/SConstruct index 8e92bd5eea..37cf8b87cc 100644 --- a/SConstruct +++ b/SConstruct @@ -63,6 +63,7 @@ import string # to be done, building or installing # TODO: Documentation/*, input/*/*, vim, po # rename Documentation/* to ./doc? + subdirs = ['flower', 'lily', 'mf', 'scm', 'ly', 'Documentation', 'Documentation/user', 'input', 'scripts', 'elisp', 'buildscripts', 'cygwin', 'debian'] @@ -73,27 +74,22 @@ scons [KEY=VALUE].. [TARGET].. where TARGET is config|lily|all|fonts|doc|tar|dist|release ''' -env = Environment () - -# Without target arguments, build lily only -if not COMMAND_LINE_TARGETS: - env.Default ('lily') -# All builds everything (all directories) -env.Alias ('all', ['lily', 'mf', 'input', 'Documentation']) - -#? -env.Depends ('Documentation', ['lily', 'mf']) -env.Depends ('input', ['lily', 'mf']) -env.Depends ('doc', ['lily', 'mf']) -env.Depends ('doc', 'mf') -env.Depends ('input', ['lily', 'mf']) - - -## FIXME: opts in function +config_cache = 'config.cache' + +config_vars = ( + 'BASH', + 'CFLAGS', + 'CPPPATH', + 'CXXFLAGS', + 'DEFINES', + 'LIBS', + 'METAFONT' + 'PYTHON', + ) # Put your favourite stuff in custom.py -opts = Options (['config.cache', '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', '.') @@ -114,30 +110,68 @@ opts.AddOptions ( 0), ) -Help (usage + opts.GenerateHelpText (env)) - -env = Environment (options = opts) - -opts.Update (env) -opts.Save ('config.cache', env) - -env.CacheDir (os.path.join (env['build'], '=build-cache')) +srcdir = Dir ('.').srcnode ().abspath #ugh -sys.path.append (os.path.join ('.', 'stepmake', 'bin')) +sys.path.append (os.path.join (srcdir, 'stepmake', 'bin')) import packagepython -package = packagepython.Package ('.') +package = packagepython.Package (srcdir) + + +prefix = '/usr/local' + +version = packagepython.version_tuple_to_str (package.version) +bindir = os.path.join (prefix, 'bin') +sharedir = os.path.join (prefix, 'share') +libdir = os.path.join (prefix, 'lib') +localedir = os.path.join (sharedir, 'locale') +sharedir_package = os.path.join (sharedir, package.name) +sharedir_package_version = os.path.join (sharedir_package, version) +lilypondprefix = sharedir_package_version + +ENV = { 'PATH' : os.environ['PATH'] } +for key in ['LD_LIBRARY_PATH', 'GUILE_LOAD_PATH', 'PKG_CONFIG_PATH']: + if os.environ.has_key(key): + ENV[key] = os.environ[key] + +env = Environment ( + ENV = ENV, + + srcdir = srcdir, + + bindir = bindir, + sharedir = sharedir, + TOPLEVEL_VERSION = version, + lilypond_datadir = sharedir_package, + local_lilypond_datadir = sharedir_package_version, + lilypondprefix = lilypondprefix, + sharedir_package = sharedir_package, + sharedir_package_version = sharedir_package_version, + + + SH = '/bin/sh', + BASH = '/bin/bash', + PYTHON = '/usr/bin/python', + MAKEINFO = 'LANG= makeinfo', + + LILYPOND_BOOK = srcdir + '/scripts/lilypond-book.py', + LILYPOND_PY = srcdir + '/scripts/lilypond.py', + + ABC2LY_PY = srcdir + '/scripts/abc2ly.py', + MF_TO_TABLE_PY = srcdir + '/buildscripts/mf-to-table.py', + LILYPOND_BOOK_FLAGS = '', + LILYPOND_BOOK_FORMAT = 'texi-html', + + TEXINFO_PAPERSIZE_OPTION = '-t @afourpaper', + MFMODE = 'ljfour' + ) -env['version'] = packagepython.version_tuple_to_str (package.version) -env['bindir'] = os.path.join (env['prefix'], 'bin') -env['sharedir'] = os.path.join (env['prefix'], 'share') -env['libdir'] = os.path.join (env['prefix'], 'lib') -env['localedir'] = os.path.join (env['sharedir'], 'locale') -env['sharedir_package'] = os.path.join (env['sharedir'], package.name) -env['sharedir_package_version'] = os.path.join (env['sharedir_package'], - env['version']) -env['lilypondprefix'] = os.path.join (env['sharedir_package_version']) +Help (usage + opts.GenerateHelpText (env)) + +map (lambda x: opts.AddOptions ((x,)), config_vars) +opts.Update (env) +env.CacheDir (os.path.join (env['build'], '=build-cache')) if env['debugging']: env.Append (CFLAGS = '-g') @@ -156,15 +190,29 @@ if env['warnings']: if env['verbose']: env['__verbose'] = '--verbose' -build = env['build'] -out = env['out'] +env['srcdir'] = Dir ('.').srcnode ().abspath -outdir = Dir ('.').path -abs_srcdir = Dir ('.').srcnode ().abspath -srcdir = abs_srcdir -abs_outdir = Dir ('.').abspath +outdir = os.path.join (Dir (env['build']).abspath, env['out']) +config_h = os.path.join (outdir, 'config.h') +version_h = os.path.join (outdir, 'version.hh') +config_h = os.path.join (outdir, 'config.h') +env.Alias ('config', config_h) -env['srcdir'] = srcdir + +## Explicit dependencies + +# Without target arguments, build lily only +if not COMMAND_LINE_TARGETS: + env.Default ('lily') +env.Alias ('all', '.') +env.Alias ('doc', + 'Documentation', + 'Documentation/user', + 'Documentation/topdocs') + +env.Depends ('doc', ['lily', 'mf']) +env.Depends ('input', ['lily', 'mf']) +env.Depends ('doc', ['lily', 'mf']) def list_sort (lst): @@ -172,13 +220,7 @@ def list_sort (lst): sorted.sort () return sorted -env['MFMODE'] = 'ljfour' -config_h = os.path.join (outdir, 'config.h') -env.Alias ('config', config_h) - -def configure (env): - conf = Configure (env) - +def configure (target, source, 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 () @@ -189,8 +231,7 @@ def configure (env): v = re.sub (vre, '\\1', output) return string.split (v, '.') - def assert_version (lst, program, minimal, description, package): - global required + def test_program (lst, program, minimal, description, package): sys.stdout.write ('Checking %s version... ' % program) actual = get_version (program) if not actual: @@ -205,39 +246,55 @@ def configure (env): 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', + test_program (required, 'gcc', '2.8', 'GNU C compiler', 'gcc') + test_program (required, 'g++', '3.0.5', 'GNU C++ compiler', 'g++') + test_program (required, 'python', '2.1', 'Python (www.python.org)', 'python') + test_program (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', + test_program (required, 'bison', '1.25', 'Bison -- parser generator', 'bison') - assert_version (required, 'flex', '0.0', 'Flex -- lexer generator', 'flex') + test_program (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', + test_program (optional, 'makeinfo', '4.7', 'Makeinfo tool', 'texinfo') + test_program (optional, 'guile', '1.6', 'GUILE scheme', 'libguile-dev or guile-devel') - assert_version (optional, 'mftrace', '1.0.27', 'Metafont tracing Type1', + test_program (optional, 'mftrace', '1.0.27', 'Metafont tracing Type1', 'mftrace') - assert_version (optional, 'perl', '4.0', + test_program (optional, 'perl', '4.0', 'Perl practical efficient readonly language', 'perl') - #assert_version (optional, 'foo', '2.0', 'Foomatic tester', 'bar') - + #test_program (optional, 'foo', '2.0', 'Foomatic tester', 'bar') + + def CheckYYCurrentBuffer (context): + context.Message ('Checking for yy_current_buffer... ') + ret = conf.TryCompile ("""using namespace std; + #include <FlexLexer.h> + class yy_flex_lexer: public yyFlexLexer + { + public: + yy_flex_lexer () + { + yy_current_buffer = 0; + } + };""", '.cc') + context.Result (ret) + + conf = Configure (env, custom_tests = { 'CheckYYCurrentBuffer' + : CheckYYCurrentBuffer }) defines = { 'DIRSEP' : "'/'", 'PATHSEP' : "':'", - 'TOPLEVEL_VERSION' : '"' + env['version'] + '"', + 'TOPLEVEL_VERSION' : '"' + version + '"', 'PACKAGE': '"' + package.name + '"', - 'DATADIR' : '"' + env['sharedir'] + '"', - 'LILYPOND_DATADIR' : '"' + env['sharedir_package'] + '"', - 'LOCAL_LILYPOND_DATADIR' : '"' + env['sharedir_package_version'] + '"', - 'LOCALEDIR' : '"' + env['localedir'] + '"', + 'DATADIR' : '"' + sharedir + '"', + 'LILYPOND_DATADIR' : '"' + sharedir_package + '"', + 'LOCAL_LILYPOND_DATADIR' : '"' + sharedir_package_version + '"', + 'LOCALEDIR' : '"' + localedir + '"', } - + conf.env.Append (DEFINES = defines) command = r"""python -c 'import sys; sys.stdout.write ("%s/include/python%s" % (sys.prefix, sys.version[:3]))'""" #" PYTHON_INCLUDE = os.popen (command).read () @@ -247,52 +304,34 @@ def configure (env): for i in headers: if conf.CheckCHeader (i): key = re.sub ('[./]', '_', 'HAVE_' + string.upper (i)) - defines[key] = '1' + conf.env['DEFINES'][key] = 1 ccheaders = ('sstream',) for i in ccheaders: if conf.CheckCXXHeader (i): key = re.sub ('[./]', '_', 'HAVE_' + string.upper (i)) - defines[key] = '1' + conf.env['DEFINES'][key] = 1 functions = ('gettext', 'isinf', 'memmem', 'snprintf', 'vsnprintf') for i in functions: if 0 or conf.CheckFunc (i): key = re.sub ('[./]', '_', 'HAVE_' + string.upper (i)) - defines[key] = '1' - - key = 'HAVE_FLEXLEXER_YY_CURRENT_BUFFER' - - 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 - { - public: - yy_flex_lexer () - { - yy_current_buffer = 0; - } - };""", '.cc') - if res: - defines[key] = '1' - sys.stdout.write('yes\n') - else: - sys.stdout.write('no\n') + conf.env['DEFINES'][key] = 1 + if conf.CheckYYCurrentBuffer (): + conf.env['DEFINES']['HAVE_FLEXLEXER_YY_CURRENT_BUFFER'] = 1 if conf.CheckLib ('dl'): pass if conf.CheckLib ('kpathsea'): - defines['KPATHSEA'] = '1' + conf.env['DEFINES']['KPATHSEA'] = 1 # huh? if conf.CheckLib ('kpathsea', 'kpse_find_file'): - defines['HAVE_KPSE_FIND_FILE'] = '1' + conf.env['DEFINES']['HAVE_KPSE_FIND_FILE'] = '1' if conf.CheckLib ('kpathsea', 'kpse_find_tfm'): - defines['HAVE_KPSE_FIND_TFM'] = '1' + conf.env['DEFINES']['HAVE_KPSE_FIND_TFM'] = '1' #this could happen after flower... env.ParseConfig ('guile-config compile') @@ -302,25 +341,12 @@ def configure (env): env.ParseConfig ('pkg-config --cflags --libs gtk+-2.0') env.ParseConfig ('pkg-config --cflags --libs pango') if conf.CheckCHeader ('pango/pangofc-fontmap.h'): - defines['HAVE_PANGO_PANGOFC_FONTMAP_H'] = '1' + conf.env['DEFINES']['HAVE_PANGO_PANGOFC_FONTMAP_H'] = '1' if conf.CheckLib ('pango-1.0', 'pango_fc_font_map_add_decoder_find_func'): - defines['HAVE_PANGO_CVS'] = '1' - defines['HAVE_PANGO_FC_FONT_MAP_ADD_DECODER_FIND_FUNC'] = '1' - - # use Command - if not os.path.exists (outdir): - os.mkdir (outdir) - - config = open (config_h, 'w') - for i in list_sort (defines.keys ()): - config.write ('#define %s %s\n' % (i, defines[i])) - config.close () - - os.system (sys.executable \ - + ' ./stepmake/bin/make-version.py VERSION > '\ - + os.path.join (outdir, 'version.hh')) + conf.env['DEFINES']['HAVE_PANGO_CVS'] = '1' + conf.env['DEFINES']['HAVE_PANGO_FC_FONT_MAP_ADD_DECODER_FIND_FUNC'] = '1' if required: print @@ -339,63 +365,57 @@ def configure (env): return conf.Finish () -# Hmm. Must configure when building lily, to get compiler and linker -# flags set-up. -# FIXME -if 1 or not os.path.exists (config_h) or 'config' in COMMAND_LINE_TARGETS: - env = configure (env) - - -#ugr -if build == '.': - absbuild = os.getcwd () -else: - absbuild = build -env['absbuild'] = absbuild - -env.Append (LIBPATH = [os.path.join (absbuild, 'flower', out),], - CPPPATH = [outdir, '#',]) +if os.path.exists (config_cache) and 'config' in COMMAND_LINE_TARGETS: + os.unlink (config_cache) +# WTF? +# scons: *** Calling Configure from Builders is not supported. +# env.Command (config_cache, None, configure) +if not os.path.exists (config_cache): + env = configure (None, None, env) + map (lambda x: opts.AddOptions ((x,)), config_vars) + opts.Save (config_cache, env) + +def config_header (target, source, env): + config = open (str (target[0]), 'w') + for i in list_sort (env['DEFINES'].keys ()): + config.write ('#define %s %s\n' % (i, env['DEFINES'][i])) + config.close () +env.Command (config_h, config_cache, config_header) + +env.Command (version_h, '#/VERSION', + '$PYTHON ./stepmake/bin/make-version.py VERSION > $TARGET') + +absbuild = Dir (env['build']).abspath +run_prefix = os.path.join (absbuild, os.path.join (env['out'], 'usr')) + +env.Append ( + absbuild = absbuild, + run_prefix = run_prefix, + LILYPONDPREFIX = os.path.join (run_prefix, 'share/lilypond'), + + LIBPATH = [os.path.join (absbuild, 'flower', env['out']),], + CPPPATH = [outdir, '#',], + LILYPOND_BIN = os.path.join (absbuild, 'lily', env['out'], + 'lilypond-bin'), + LILYPOND_BOOK_PATH = ['.', '#/input', '#/input/regression', + '#/input/test', '#/input/tutorial', + os.path.join (absbuild, 'mf', env['out']), + '#/Documentation/user', + os.path.join (absbuild, 'Documentation', + env['out']), + os.path.join (absbuild, 'Documentation/user', + env['out']), + ], + MAKEINFO_PATH = ['.', '#/Documentation/user', + os.path.join (absbuild, 'Documentation/user', + env['out'])], + ) Export ('env') - -env['MAKEINFO'] = 'LANG= makeinfo' -env['PYTHON'] = 'python' -env['LILYPOND_BIN'] = os.path.join (absbuild, 'lily', out, 'lilypond-bin') -env['LILYPONDPREFIX'] = os.path.join (absbuild, out, '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' - SConscript ('buildscripts/builder.py') -for d in subdirs: - if os.path.exists (os.path.join (d, 'SConscript')): - b = os.path.join (build, d, out) - # Support clean sourcetree build (--srcdir build) - # and ./out build. - if (build and build != '.') or (out and out != '.'): - env.BuildDir (b, d, duplicate=0) - SConscript (os.path.join (b, 'SConscript')) -# as a builder? -def symlink_tree (prefix): +def symlink_tree (target, source, env): def mkdirs (dir): def mkdir (dir): if not dir: @@ -417,6 +437,7 @@ def symlink_tree (prefix): depth = len (string.split (dir, '/')) frm = os.path.join ('../' * depth, src, out) os.symlink (frm, os.path.basename (dst)) + prefix = os.path.join (env['out'], 'usr') map (lambda x: symlink (x[0], os.path.join (prefix, x[1])), (('python', 'lib/lilypond/python'), # UGHR, lilypond.py uses lilypond-bin from PATH @@ -434,25 +455,46 @@ def symlink_tree (prefix): os.chdir (srcdir) if env['debugging']: - prefix = os.path.join (out, 'usr') - if not os.path.exists (os.path.join (absbuild, prefix)): - symlink_tree (prefix) + print 'run_prefix:' + run_prefix + env.Command (os.path.join (run_prefix, 'stamp'), 'VERSION', + [symlink_tree, 'touch $TARGET']) #### dist, tar -def cvs_files (dir): - entries = open (os.path.join (dir, 'CVS/Entries')).readlines () - files = filter (lambda x: x[0] != 'D', entries) - return map (lambda x: os.path.join (dir, x[1:x[1:].index ('/')+1]), - files) +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') + 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) + +#subdirs = reduce (lambda x, y: x + y, cvs_dirs ('.')) +#print `subdirs` readme_files = ['AUTHORS', 'README', 'INSTALL', 'NEWS'] -foo = map (lambda x: env.Texi2txt (x + '.txt', - os.path.join ('Documentation/topdocs', - x)), +foo = map (lambda x: env.TXT (x + '.txt', + os.path.join ('Documentation/topdocs', x)), readme_files) txt_files = map (lambda x: x + '.txt', readme_files) src_files = reduce (lambda x, y: x + y, map (cvs_files, subdirs)) -tar_base = package.name + '-' + env['version'] +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) @@ -476,3 +518,12 @@ patch = env.PATCH (patch_name, tar_ball) env.Depends (patch_name, dist_ball) env.Alias ('release', patch) + +for d in subdirs: + if os.path.exists (os.path.join (d, 'SConscript')): + b = os.path.join (env['build'], d, env['out']) + # Support clean sourcetree build (--srcdir build) + # and ./out build. + if os.path.abspath (b) != os.path.abspath (d): + env.BuildDir (b, d, duplicate = 0) + SConscript (os.path.join (b, 'SConscript')) |