Use the float latex package in the spec.
[theora.git] / SConstruct
1 # see http://www.scons.org if you do not have this tool
2 from os.path import join
3 import SCons
4
5 # TODO: should use lamda and map to work on python 1.5
6 def path(prefix, list): return [join(prefix, x) for x in list]
7
8 encoder_sources = """
9         apiwrapper.c
10         fragment.c
11         idct.c
12         internal.c
13         state.c
14         quant.c
15         analyze.c
16         encfrag.c
17         encapiwrapper.c
18         encinfo.c
19         encode.c
20         enquant.c
21         fdct.c
22         huffenc.c
23         mathops.c
24         mcenc.c
25         rate.c
26         tokenize.c
27 """
28
29 decoder_sources = """
30         apiwrapper.c
31         bitpack.c
32         decapiwrapper.c
33         decinfo.c
34         decode.c
35         dequant.c
36         fragment.c
37         huffdec.c
38         idct.c
39         info.c
40         internal.c
41         quant.c
42         state.c
43 """
44
45 env = Environment()
46 if env['CC'] == 'gcc':
47   env.Append(CCFLAGS=["-g", "-O2", "-Wall", "-Wno-parentheses"])
48
49 # pass collect_metrics=1 on the scons command line
50 # to enable metrics collection for mode training.
51 collect_metrics = ARGUMENTS.get('collect_metrics', 0)
52 if int(collect_metrics):
53   env.Append(CPPDEFINES=['OC_COLLECT_METRICS'])
54   env.Append(LIBS=['m'])
55
56 def CheckPKGConfig(context, version): 
57   context.Message( 'Checking for pkg-config... ' ) 
58   ret = context.TryAction('pkg-config --atleast-pkgconfig-version=%s' % version)[0] 
59   context.Result( ret ) 
60   return ret 
61
62 def CheckPKG(context, name): 
63   context.Message( 'Checking for %s... ' % name )
64   ret = context.TryAction('pkg-config --exists %s' % name)[0]
65   context.Result( ret ) 
66   return ret
67      
68 def CheckSDL(context):
69   name = "sdl-config"
70   context.Message( 'Checking for %s... ' % name )
71   ret = SCons.Util.WhereIs('sdl-config')
72   context.Result( ret ) 
73   return ret
74
75 # check for appropriate inline asm support
76 host_x86_32_test = """
77     int main(int argc, char **argv) {
78 #if !defined(__i386__)
79   #error not an x86 host: preprocessor macro __i386__ not defined
80 #endif
81   return 0;
82     }
83     """
84 def CheckHost_x86_32(context):
85   context.Message('Checking for an x86 host...')
86   result = context.TryCompile(host_x86_32_test, '.c')
87   context.Result(result)
88   return result
89
90 host_x86_64_test = """
91     int main(int argc, char **argv) {
92 #if !defined(__x86_64__)
93   #error not an x86_64 host: preprocessor macro __x86_64__ not defined
94 #endif
95   return 0;
96     }
97     """
98 def CheckHost_x86_64(context):
99   context.Message('Checking for an x86_64 host...')
100   result = context.TryCompile(host_x86_64_test, '.c')
101   context.Result(result)
102   return result
103
104 conf = Configure(env, custom_tests = {
105   'CheckPKGConfig' : CheckPKGConfig,
106   'CheckPKG' : CheckPKG,
107   'CheckSDL' : CheckSDL,
108   'CheckHost_x86_32' : CheckHost_x86_32,
109   'CheckHost_x86_64' : CheckHost_x86_64,
110   })
111   
112 if not conf.CheckPKGConfig('0.15.0'): 
113    print 'pkg-config >= 0.15.0 not found.' 
114    Exit(1)
115
116 if not conf.CheckPKG('ogg'): 
117   print 'libogg not found.' 
118   Exit(1) 
119
120 if conf.CheckPKG('vorbis vorbisenc'):
121   have_vorbis=True
122 else:
123   have_vorbis=False
124
125 if conf.CheckPKG('libpng'):
126   have_libpng=True
127 else:
128   have_libpng=False
129   
130 build_player_example=True
131 if not conf.CheckHeader('sys/soundcard.h'):
132   build_player_example=False
133 if build_player_example and not conf.CheckSDL():
134   build_player_example=False
135
136 if conf.CheckHost_x86_32():
137   env.Append(CPPDEFINES='OC_X86_ASM')
138   decoder_sources += """
139         x86/x86cpu.c
140         x86/mmxidct.c
141         x86/mmxfrag.c
142         x86/mmxstate.c
143         x86/sse2idct.c
144         x86/x86state.c
145   """
146   encoder_sources += """
147         x86/x86cpu.c
148         x86/mmxencfrag.c
149         x86/mmxfdct.c
150         x86/x86enc.c
151         x86/x86enquant.c
152         x86/sse2encfrag.c
153         x86/mmxfrag.c
154         x86/mmxidct.c
155         x86/mmxstate.c
156         x86/x86state.c
157   """
158 elif conf.CheckHost_x86_64():
159   env.Append(CPPDEFINES=['OC_X86_ASM', 'OC_X86_64_ASM'])
160   decoder_sources += """
161         x86/x86cpu.c
162         x86/mmxidct.c
163         x86/mmxfrag.c
164         x86/mmxstate.c
165         x86/sse2idct.c
166         x86/x86state.c
167   """
168   encoder_sources += """
169         x86/x86cpu.c
170         x86/mmxencfrag.c
171         x86/mmxfdct.c
172         x86/x86enc.c
173         x86/x86enquant.c
174         x86/sse2fdct.c
175         x86/mmxfrag.c
176         x86/mmxidct.c
177         x86/mmxstate.c
178         x86/x86state.c
179         x86/sse2encfrag.c
180   """
181
182 env = conf.Finish()
183
184 env.Append(CPPPATH=['include'])
185 env.ParseConfig('pkg-config --cflags --libs ogg')
186
187 libtheoradec_Sources = Split(decoder_sources)
188 libtheoraenc_Sources = Split(encoder_sources)
189
190 libtheoradec_a = env.Library('lib/theoradec',
191         path('lib', libtheoradec_Sources))
192 libtheoradec_so = env.SharedLibrary('lib/theoradec',
193         path('lib', libtheoradec_Sources))
194
195 libtheoraenc_a = env.Library('lib/theoraenc',
196         path('lib', libtheoraenc_Sources))
197 libtheoraenc_so = env.SharedLibrary('lib/theoraenc',
198         path('lib', libtheoraenc_Sources) + [libtheoradec_so])
199
200 #installing
201 prefix='/usr'
202 lib_dir = prefix + '/lib'
203 env.Alias('install', prefix)
204 env.Install(lib_dir, [libtheoradec_a, libtheoradec_so])
205 env.Install(lib_dir, [libtheoraenc_a, libtheoraenc_so])
206
207 # example programs
208 dump_video = env.Clone()
209 dump_video_Sources = Split("""dump_video.c ../lib/libtheoradec.a""")
210 dump_video.Program('examples/dump_video', path('examples', dump_video_Sources))
211
212 dump_psnr = env.Clone()
213 dump_psnr.Append(LIBS='m')
214 dump_psnr_Sources = Split("""dump_psnr.c ../lib/libtheoradec.a""")
215 dump_psnr.Program('examples/dump_psnr', path('examples', dump_psnr_Sources))
216
217 libtheora_info = env.Clone()
218 libtheora_info_Sources = Split("""
219         libtheora_info.c
220         ../lib/libtheoraenc.a
221         ../lib/libtheoradec.a
222   """)
223 libtheora_info.Program('examples/libtheora_info',
224                        path('examples', libtheora_info_Sources))
225
226 if have_vorbis:
227   encex = dump_video.Clone()
228   encex.ParseConfig('pkg-config --cflags --libs vorbisenc vorbis')
229   encex.Append(LIBS=['m'])
230   encex_Sources = Split("""
231         encoder_example.c
232         ../lib/libtheoraenc.a 
233         ../lib/libtheoradec.a
234   """)
235   encex.Program('examples/encoder_example', path('examples', encex_Sources))
236
237   if build_player_example:
238     plyex = encex.Clone()
239     plyex_Sources = Split("""
240         player_example.c
241         ../lib/libtheoradec.a
242     """)
243     plyex.ParseConfig('sdl-config --cflags --libs')
244     plyex.Append(LIBS=['m'])
245     plyex.Program('examples/player_example', path('examples', plyex_Sources))
246
247 png2theora = env.Clone()
248 png2theora_Sources = Split("""png2theora.c
249         ../lib/libtheoraenc.a
250         ../lib/libtheoradec.a
251 """)
252 png2theora.ParseConfig('pkg-config --cflags --libs libpng')
253 png2theora.Append(LIBS=['m'])
254 png2theora.Program('examples/png2theora', path('examples', png2theora_Sources))
255
256 tiff2theora = env.Clone()
257 tiff2theora_Sources = Split("""tiff2theora.c
258         ../lib/libtheoraenc.a
259         ../lib/libtheoradec.a
260 """)
261 tiff2theora.Append(LIBS=['tiff', 'm'])
262 tiff2theora.Program('examples/tiff2theora', path('examples', tiff2theora_Sources))