]> git.donarmstrong.com Git - lilypond.git/blob - SConstruct
(assert_version): Add.
[lilypond.git] / SConstruct
1 # -*-python-*-
2
3 '''
4 Experimental scons (www.scons.org) building:
5
6 Usage:
7     scons
8     scons install
9     scons -c              # clean
10     scons -h              # help
11
12     scons build=DIR       # scrdir build, write to new tree =build
13     scons out=DIR         # write output to deeper dir DIR
14
15 Optionally, make a custom.py.  I have
16
17 import os
18 out='out-scons'
19 optimising=0
20 debugging=1
21 prefix=os.getcwd ()
22
23
24 '''
25
26
27 # TODO:
28 #   * mf: pfa
29 #   *, Documentation, ly etc.
30
31
32 import re
33 import glob
34 import os
35 import sys
36 import string
37
38 env = Environment ()
39
40 # put your favourite stuff in custom.py
41 opts = Options ('custom.py', ARGUMENTS)
42 opts.Add ('prefix', 'Install prefix', '/usr/')
43 opts.Add ('out', 'Output directory', 'out-scons')
44 opts.Add ('build', 'Build directory', '.')
45 opts.AddOptions (
46         BoolOption ('warnings', 'compile with -Wall and similiar',
47                    1),
48         BoolOption ('debugging', 'compile with debugging symbols',
49                     0),
50         BoolOption ('optimising', 'compile with optimising',
51                     1),
52         BoolOption ('shared', 'build shared libraries',
53                     0),
54         BoolOption ('static', 'build static libraries',
55                     1),
56         )
57
58 Help (opts.GenerateHelpText (env))
59
60 env = Environment (options = opts)
61
62 env.CacheDir (os.path.join (env['build'], '=build-cache'))
63
64 #ugh
65 sys.path.append (os.path.join ('.', 'stepmake', 'bin'))
66 import packagepython
67 package = packagepython.Package ('.')
68
69 env['version'] = packagepython.version_tuple_to_str (package.version)
70 env['bindir'] = os.path.join (env['prefix'], 'bin')
71 env['sharedir'] = os.path.join (env['prefix'], 'share')
72 env['libdir'] = os.path.join (env['prefix'], 'lib')
73 env['lilypondprefix'] = os.path.join (env['sharedir'], 'lilypond',
74                                       env['version'])
75
76 if env['debugging']:
77         env.Append (CFLAGS = '-g')
78         env.Append (CXXFLAGS = '-g')
79 if env['optimising']:
80         env.Append (CFLAGS = '-O2')
81         env.Append (CXXFLAGS = '-O2')
82         env.Append (CXXFLAGS = '-DSTRING_UTILS_INLINED')
83 if env['warnings']:
84         env.Append (CFLAGS = '-W ')
85         env.Append (CFLAGS = '-Wall')
86         # what about = ['-W', '-Wall', ...]?
87         env.Append (CXXFLAGS = '-W')
88         env.Append (CXXFLAGS = '-Wall')
89         env.Append (CXXFLAGS = '-Wconversion')
90
91 env['MFMODE'] = 'ljfour'
92
93 conf = Configure (env)
94
95 #ugh -- hardcode territory
96 defines = {
97    '0DIRSEP' : "'/'",
98    '1PATHSEP' : "':'",
99
100    '2PACKAGE': '"lilypond"',
101    '3TOPLEVEL_VERSION' : '"2.3.6"',
102    '4DATADIR' : '"' + os.getcwd () + '/share"',
103    '5PACKAGE_DATADIR': 'DATADIR "/" PACKAGE',
104    '6LILYPOND_DATADIR' : 'PACKAGE_DATADIR',
105    '7LOCAL_PACKAGE_DATADIR' : 'PACKAGE_DATADIR "/" TOPLEVEL_VERSION',
106    '8LOCAL_LILYPOND_DATADIR' : 'LOCAL_PACKAGE_DATADIR',
107    '9LOCALEDIR' : '"' + os.getcwd () + '/share/locale"',
108 }
109
110 headers = ('sys/stat.h', 'assert.h', 'kpathsea/kpathsea.h')
111 for i in headers:
112         if conf.CheckCHeader (i):
113                 key = re.sub ('[./]', '_', 'zHAVE_' + string.upper (i))
114                 defines[key] = '1'
115
116 ccheaders = ('sstream',)
117 for i in ccheaders:
118         if conf.CheckCXXHeader (i):
119                 key = re.sub ('[./]', '_', 'zHAVE_' + string.upper (i))
120                 defines[key] = '1'
121
122 functions = ('gettext', 'isinf', 'memmem', 'snprintf', 'vsnprintf')
123 for i in functions:
124         if 0 or conf.CheckFunc (i):
125                 key = re.sub ('[./]', '_', 'zHAVE_' + string.upper (i))
126                 defines[key] = '1'
127
128
129 key = 'zHAVE_FLEXLEXER_YY_CURRENT_BUFFER'
130 defines[key] = conf.TryCompile ("""using namespace std;
131 #include <FlexLexer.h>
132 class yy_flex_lexer: public yyFlexLexer
133 {
134   public:
135     yy_flex_lexer ()
136     {
137       yy_current_buffer = 0;
138     }
139 };""", 'cc')
140
141 if conf.CheckLib ('dl'):
142         pass
143
144 if conf.CheckLib ('kpathsea'):
145         defines['zKPATHSEA'] = '1'
146
147 # huh? 
148 if conf.CheckLib ('kpathsea', 'kpse_find_file'):
149         defines['zHAVE_KPSE_FIND_FILE'] = '1'
150
151 env = conf.Finish ()
152
153 Export ('env')
154
155 #this could happen after flower...
156 env.ParseConfig ('guile-config compile')
157
158 build = env['build']
159 out = env['out']
160 ##reldir = str (Dir ('.').srcnode ())
161 reldir = os.getcwd ()
162 outdir = os.path.join (env['build'], reldir, env['out'])
163 if not os.path.exists (outdir):
164         os.mkdir (outdir)
165
166 config = open (os.path.join (outdir, 'config.h'), 'w')
167 sort_helper = defines.keys ()
168 sort_helper.sort ()
169 for i in sort_helper:
170         config.write ('#define %s %s\n' % (i[1:], defines[i]))
171 config.close ()
172
173 os.system (sys.executable \
174            + ' ./stepmake/bin/make-version.py VERSION > '\
175            + os.path.join (outdir, 'version.hh'))
176
177 if os.path.exists ('parser'):
178         env.Append (LIBPATH = ['#/flower', '#/lily', '#/parser', '#/gui',],
179                     CPPPATH = [outdir, '#',])
180 else:   
181         env.Append (LIBPATH = ['#/flower/' + out,],
182                     CPPPATH = [outdir, '#',])
183
184 def get_version (program):
185         command = '(%(program)s --version || %(program)s -V) 2>&1' % vars ()
186         output = os.popen (command).readline ()[:-1]
187         v = re.sub ('^.*[^-.0-9]([0-9][0-9]*\.[0-9][.0-9]*).*$', '\\1', output)
188         return string.split (v, '.')
189
190 def assert_version (program, minimal, description, package):
191         global required
192         sys.stdout.write ('Checking %s version... ' % program)
193         actual = get_version (program)
194         sys.stdout.write (string.join (actual, '.'))
195         sys.stdout.write ('\n')
196         if actual < string.split (minimal, '.'):
197                 required.append ((description, package,
198                                   string.join (minimal, '.'),
199                                   program,
200                                   string.join (actual, '.')))
201
202 required = []
203 assert_version ('gcc', '3.0.5', 'GNU C compiler', 'gcc')
204 assert_version ('makeinfo', '4.7', 'Makeinfo tool', 'texinfo')
205
206 if required:
207         print
208         print '********************************'
209         print 'Please install required packages'
210 for i in required:
211         print '%s:      %s-%s or newer (found: %s-%s)' % i
212
213 #subdirs = ('mf',)
214 #subdirs = ('flower', 'lily', 'parser', 'gui', 'main',)
215 subdirs = ('flower', 'lily', 'mf')
216 for d in subdirs:
217         b = os.path.join (build, d, out)
218         # Support clean sourctree build (srcdir build)
219         # and outdir build.
220         # TODO: figure out SConscript (dir, builddir, duplicate)) feature
221         if (build and build != '.') \
222            or (out and out != '.'):
223                 env.BuildDir (b, d, duplicate=0)
224         SConscript (os.path.join (b, 'SConscript'))
225