4 Experimental scons (www.scons.org) building:
8 LILYPONDPREFIX=out-scons/usr/share/lilypond lily/out-scons/lilypond-bin
14 scons build=DIR # scrdir build, write to new tree =build
15 scons out=DIR # write output to deeper dir DIR
17 Optionally, make a custom.py. I have
24 os.path.join (os.getcwd (), '=install')
25 prefix=os.path.join (os.environ['HOME'], 'usr', 'pkg', 'lilypond')
31 # * running from build-dir, without installing?
32 # - scons will not install, if PREFIX lives outside of CWD
33 # - build symlink tree
34 # + mimicking regular installation setup?
35 # + use tweaked scons 'install' target?
36 # * commandline targets:
38 # - dist, tar => env.Tar
39 # * Documentation, scripts
41 # * more fine-grained config.h -- move lilypondprefix to version.hh?
42 # - config.h: changes after system upgrades, affects all files
43 # - version.hh: prefix, version etc? affects few
53 # put your favourite stuff in custom.py
54 opts = Options ('custom.py', ARGUMENTS)
55 #opts = Options (None, ARGUMENTS)
56 opts.Add ('prefix', 'Install prefix', '/usr/')
57 opts.Add ('out', 'Output directory', 'out-scons')
58 opts.Add ('build', 'Build directory', '.')
60 BoolOption ('warnings', 'compile with -Wall and similiar',
62 BoolOption ('debugging', 'compile with debugging symbols',
64 BoolOption ('optimising', 'compile with optimising',
66 BoolOption ('shared', 'build shared libraries',
68 BoolOption ('static', 'build static libraries',
70 BoolOption ('gui', 'build with GNOME backend (EXPERIMENTAL)',
72 BoolOption ('verbose', 'run commands with verbose flag',
76 Help (opts.GenerateHelpText (env))
78 env = Environment (options = opts)
80 env.CacheDir (os.path.join (env['build'], '=build-cache'))
83 sys.path.append (os.path.join ('.', 'stepmake', 'bin'))
85 package = packagepython.Package ('.')
87 env['version'] = packagepython.version_tuple_to_str (package.version)
88 env['bindir'] = os.path.join (env['prefix'], 'bin')
89 env['sharedir'] = os.path.join (env['prefix'], 'share')
90 env['libdir'] = os.path.join (env['prefix'], 'lib')
91 env['localedir'] = os.path.join (env['sharedir'], 'locale')
93 env['sharedir_package'] = os.path.join (env['sharedir'], package.name)
94 env['sharedir_package_version'] = os.path.join (env['sharedir_package'],
96 env['lilypondprefix'] = os.path.join (env['sharedir_package_version'])
100 env.Append (CFLAGS = '-g')
101 env.Append (CXXFLAGS = '-g')
102 if env['optimising']:
103 env.Append (CFLAGS = '-O2')
104 env.Append (CXXFLAGS = '-O2')
105 env.Append (CXXFLAGS = '-DSTRING_UTILS_INLINED')
107 env.Append (CFLAGS = '-W ')
108 env.Append (CFLAGS = '-Wall')
109 # what about = ['-W', '-Wall', ...]?
110 env.Append (CXXFLAGS = '-W')
111 env.Append (CXXFLAGS = '-Wall')
112 env.Append (CXXFLAGS = '-Wconversion')
114 env['MFMODE'] = 'ljfour'
117 conf = Configure (env)
120 vre = re.compile ('^.*[^-.0-9]([0-9][0-9]*\.[0-9][.0-9]*).*$', re.DOTALL)
121 def get_version (program):
122 command = '(%(program)s --version || %(program)s -V) 2>&1' % vars ()
123 pipe = os.popen (command)
124 output = pipe.read ()
127 v = re.sub (vre, '\\1', output)
128 return string.split (v, '.')
130 def assert_version (lst, program, minimal, description, package):
132 sys.stdout.write ('Checking %s version... ' % program)
133 actual = get_version (program)
136 lst.append ((description, package, minimal, program,
139 sys.stdout.write (string.join (actual, '.'))
140 sys.stdout.write ('\n')
141 if actual < string.split (minimal, '.'):
142 lst.append ((description, package, minimal, program,
143 string.join (actual, '.')))
146 assert_version (required, 'gcc', '2.8', 'GNU C compiler', 'gcc')
147 assert_version (required, 'g++', '3.0.5', 'GNU C++ compiler', 'g++')
148 assert_version (required, 'python', '2.1', 'Python (www.python.org)', 'python')
149 assert_version (required, 'guile-config', '1.6', 'GUILE development',
150 'libguile-dev or guile-devel')
151 # Do not use bison 1.50 and 1.75.
152 assert_version (required, 'bison', '1.25', 'Bison -- parser generator',
154 assert_version (required, 'flex', '0.0', 'Flex -- lexer generator', 'flex')
158 assert_version (optional, 'makeinfo', '4.7', 'Makeinfo tool', 'texinfo')
159 assert_version (optional, 'guile', '1.6', 'GUILE scheme',
160 'libguile-dev or guile-devel')
161 assert_version (optional, 'mftrace', '1.0.27', 'Metafont tracing Type1',
163 assert_version (optional, 'perl', '4.0',
164 'Perl practical efficient readonly language', 'perl')
165 #assert_version (optional, 'foo', '2.0', 'Foomatic tester', 'bar')
171 'TOPLEVEL_VERSION' : '"' + env['version'] + '"',
172 'PACKAGE': '"' + package.name + '"',
173 'DATADIR' : '"' + env['sharedir'] + '"',
174 'LILYPOND_DATADIR' : '"' + env['sharedir_package'] + '"',
175 'LOCAL_LILYPOND_DATADIR' : '"' + env['sharedir_package_version'] + '"',
176 'LOCALEDIR' : '"' + env['localedir'] + '"',
180 command = r"""python -c 'import sys; sys.stdout.write ("%s/include/python%s" % (sys.prefix, sys.version[:3]))'""" #"
181 PYTHON_INCLUDE = os.popen (command).read ()
182 env.Append (CPPPATH = PYTHON_INCLUDE)
185 headers = ('sys/stat.h', 'assert.h', 'kpathsea/kpathsea.h', 'Python.h')
187 if conf.CheckCHeader (i):
188 key = re.sub ('[./]', '_', 'HAVE_' + string.upper (i))
191 ccheaders = ('sstream',)
193 if conf.CheckCXXHeader (i):
194 key = re.sub ('[./]', '_', 'HAVE_' + string.upper (i))
197 functions = ('gettext', 'isinf', 'memmem', 'snprintf', 'vsnprintf')
199 if 0 or conf.CheckFunc (i):
200 key = re.sub ('[./]', '_', 'HAVE_' + string.upper (i))
204 key = 'HAVE_FLEXLEXER_YY_CURRENT_BUFFER'
205 defines[key] = conf.TryCompile ("""using namespace std;
206 #include <FlexLexer.h>
207 class yy_flex_lexer: public yyFlexLexer
212 yy_current_buffer = 0;
216 if conf.CheckLib ('dl'):
219 if conf.CheckLib ('kpathsea'):
220 defines['KPATHSEA'] = '1'
223 if conf.CheckLib ('kpathsea', 'kpse_find_file'):
224 defines['HAVE_KPSE_FIND_FILE'] = '1'
225 if conf.CheckLib ('kpathsea', 'kpse_find_tfm'):
226 defines['HAVE_KPSE_FIND_TFM'] = '1'
228 #this could happen after flower...
229 env.ParseConfig ('guile-config compile')
231 #this could happen only for compiling pango-*
233 env.ParseConfig ('pkg-config --cflags --libs gtk+-2.0')
234 env.ParseConfig ('pkg-config --cflags --libs pango')
235 if conf.CheckCHeader ('pango/pangofc-fontmap.h'):
236 defines['HAVE_PANGO_PANGOFC_FONTMAP_H'] = '1'
238 if conf.CheckLib ('pango-1.0',
239 'pango_fc_font_map_add_decoder_find_func'):
240 defines['HAVE_PANGO_CVS'] = '1'
241 defines['HAVE_PANGO_FC_FONT_MAP_ADD_DECODER_FIND_FUNC'] = '1'
246 reldir = str (Dir ('.').srcnode ())
248 srcdir = os.getcwd ()
250 env['srcdir'] = srcdir
254 ##reldir = str (Dir ('.').srcnode ())
255 reldir = os.getcwd ()
256 outdir = os.path.join (env['build'], reldir, env['out'])
257 if not os.path.exists (outdir):
265 config = open (os.path.join (outdir, 'config.h'), 'w')
266 for i in list_sort (defines.keys ()):
267 config.write ('#define %s %s\n' % (i, defines[i]))
270 os.system (sys.executable \
271 + ' ./stepmake/bin/make-version.py VERSION > '\
272 + os.path.join (outdir, 'version.hh'))
274 if os.path.exists ('parser'):
275 env.Append (LIBPATH = ['#/flower', '#/lily', '#/parser', '#/gui',],
276 CPPPATH = [outdir, '#',])
278 env.Append (LIBPATH = ['#/flower/' + out,],
279 CPPPATH = [outdir, '#',])
283 print '********************************'
284 print 'Please install required packages'
286 print '%s: %s-%s or newer (found: %s %s)' % i
291 print '*************************************'
292 print 'Consider installing optional packages'
294 print '%s: %s-%s or newer (found: %s %s)' % i
296 #env['tarball'] = os.path.join (outdir,
297 # package.name + '-' + env['version'] + '.tar.gz')
299 env['tarball'] = os.path.join (os.environ['HOME'], 'tmp',
300 package.name + '-' + env['version'] + '.tar.gz')
303 if 'tar' in COMMAND_LINE_TARGETS:
304 #env.Default (env['tarball'])
306 env.Default (env['tarball'])
313 absbuild = os.getcwd ()
316 env['absbuild'] = absbuild
319 env['MAKEINFO'] = 'LANG= makeinfo'
320 env['PYTHON'] = 'python'
321 env['LILYPOND_BIN'] = os.path.join (absbuild, 'lily', out, 'lilypond-bin')
322 env['LILYPONDPREFIX'] = os.path.join (outdir, 'usr/share/lilypond')
323 env['LILYPOND_BOOK'] = srcdir + '/scripts/lilypond-book.py'
324 env['LILYPOND_BOOK_FLAGS'] = ''
325 env['LILYPOND_BOOK_FORMAT'] = 'texi-html'
326 env['LILYPOND_BOOK_PATH'] = ['.', '#/input', '#/input/regression',
327 '#/input/test', '#/input/tutorial',
328 os.path.join (absbuild, 'mf', out),
329 '#/Documentation/user',
330 os.path.join (absbuild, 'Documentation', out)]
332 ## TEXINFO_PAPERSIZE_OPTION= $(if $(findstring $(PAPERSIZE),a4),,-t @afourpaper)
333 env['TEXINFO_PAPERSIZE_OPTION'] = '-t@afourpaper'
335 SConscript ('buildscripts/builder.py')
338 #subdirs = ['flower', 'lily', 'parser', 'gui', 'main',]
339 #subdirs = ['flower', 'lily', 'mf', 'scm', 'ly']
340 subdirs = ['flower', 'lily', 'mf', 'scm', 'ly', 'Documentation']
342 b = os.path.join (build, d, out)
343 # Support clean sourctree build (srcdir build)
345 # TODO: figure out SConscript (dir, builddir, duplicate)) feature
346 if (build and build != '.') \
347 or (out and out != '.'):
348 env.BuildDir (b, d, duplicate=0)
349 SConscript (os.path.join (b, 'SConscript'))
351 readme_files = ['ChangeLog', 'COPYING', 'DEDICATION', 'ROADMAP', 'THANKS']
352 readme_txt = ['AUTHORS.txt', 'README.txt', 'INSTALL.txt', 'NEWS.txt']
353 # to be [re]moved after spit
354 patch_files = ['emacsclient.patch', 'server.el.patch', 'darwin.patch']
356 map (lambda x: env.Texi2txt (x, os.path.join ('Documentation/topdocs',
357 os.path.splitext (x)[0])),
361 env.Append (TARFLAGS = '-z --owner=0 --group=0')
362 env.Append (GZIPFLAGS = '-9')
363 all_sources = ['SConstruct',] + subdirs \
364 + ['VERSION', '.cvsignore']\
365 + readme_files + readme_txt + patch_files
367 tar = env.Tar (env['tarball'], all_sources)
370 def symlink_tree (prefix):
376 if not os.path.isdir (dir):
377 if os.path.exists (dir):
381 map (mkdir, string.split (dir, os.sep))
382 #srcdir = os.getcwd ()
383 def symlink (src, dst):
384 dir = os.path.dirname (dst)
387 frm = os.path.join (srcdir, src[1:])
389 depth = len (string.split (dir))
390 frm = os.path.join ('../' * depth, src, out)
391 os.symlink (frm, os.path.basename (dst))
393 map (lambda x: symlink (x[0], os.path.join (prefix, x[1])),
394 (('python', 'lib/lilypond/python'),
395 ('#mf', 'share/lilypond/fonts/mf'),
396 ('mf', 'share/lilypond/fonts/amf'),
397 ('mf', 'share/lilypond/fonts/tfm'),
398 ('mf', 'share/lilypond/fonts/type1'),
399 ('#tex', 'share/lilypond/tex/source'),
400 ('mf', 'share/lilypond/tex/generate'),
401 ('#ly', 'share/lilypond/ly'),
402 ('#scm', 'share/lilypond/scm'),
403 ('#ps', 'share/lilypond/ps'),
404 ('elisp', 'share/lilypond/elisp')))
407 prefix = os.path.join (outdir, 'usr')
408 if not os.path.exists (prefix):
409 symlink_tree (prefix)