Add a new libtheora_info example program.
[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
55 def CheckPKGConfig(context, version): 
56   context.Message( 'Checking for pkg-config... ' ) 
57   ret = context.TryAction('pkg-config --atleast-pkgconfig-version=%s' % version)[0] 
58   context.Result( ret ) 
59   return ret 
60
61 def CheckPKG(context, name): 
62   context.Message( 'Checking for %s... ' % name )
63   ret = context.TryAction('pkg-config --exists %s' % name)[0]
64   context.Result( ret ) 
65   return ret
66      
67 def CheckSDL(context):
68   name = "sdl-config"
69   context.Message( 'Checking for %s... ' % name )
70   ret = SCons.Util.WhereIs('sdl-config')
71   context.Result( ret ) 
72   return ret
73
74 # check for appropriate inline asm support
75 host_x86_32_test = """
76     int main(int argc, char **argv) {
77 #if !defined(__i386__)
78   #error not an x86 host: preprocessor macro __i386__ not defined
79 #endif
80   return 0;
81     }
82     """
83 def CheckHost_x86_32(context):
84   context.Message('Checking for an x86 host...')
85   result = context.TryCompile(host_x86_32_test, '.c')
86   context.Result(result)
87   return result
88
89 host_x86_64_test = """
90     int main(int argc, char **argv) {
91 #if !defined(__x86_64__)
92   #error not an x86_64 host: preprocessor macro __x86_64__ not defined
93 #endif
94   return 0;
95     }
96     """
97 def CheckHost_x86_64(context):
98   context.Message('Checking for an x86_64 host...')
99   result = context.TryCompile(host_x86_64_test, '.c')
100   context.Result(result)
101   return result
102
103 conf = Configure(env, custom_tests = {
104   'CheckPKGConfig' : CheckPKGConfig,
105   'CheckPKG' : CheckPKG,
106   'CheckSDL' : CheckSDL,
107   'CheckHost_x86_32' : CheckHost_x86_32,
108   'CheckHost_x86_64' : CheckHost_x86_64,
109   })
110   
111 if not conf.CheckPKGConfig('0.15.0'): 
112    print 'pkg-config >= 0.15.0 not found.' 
113    Exit(1)
114
115 if not conf.CheckPKG('ogg'): 
116   print 'libogg not found.' 
117   Exit(1) 
118
119 if conf.CheckPKG('vorbis vorbisenc'):
120   have_vorbis=True
121 else:
122   have_vorbis=False
123
124 if conf.CheckPKG('libpng'):
125   have_libpng=True
126 else:
127   have_libpng=False
128   
129 build_player_example=True
130 if not conf.CheckHeader('sys/soundcard.h'):
131   build_player_example=False
132 if build_player_example and not conf.CheckSDL():
133   build_player_example=False
134
135 if conf.CheckHost_x86_32():
136   env.Append(CPPDEFINES='OC_X86_ASM')
137   decoder_sources += """
138         x86/x86cpu.c
139         x86/mmxidct.c
140         x86/mmxfrag.c
141         x86/mmxstate.c
142         x86/sse2idct.c
143         x86/x86state.c
144   """
145   encoder_sources += """
146         x86/x86cpu.c
147         x86/mmxencfrag.c
148         x86/mmxfdct.c
149         x86/x86enc.c
150         x86/x86enquant.c
151         x86/sse2encfrag.c
152         x86/mmxfrag.c
153         x86/mmxidct.c
154         x86/mmxstate.c
155         x86/x86state.c
156   """
157 elif conf.CheckHost_x86_64():
158   env.Append(CPPDEFINES=['OC_X86_ASM', 'OC_X86_64_ASM'])
159   decoder_sources += """
160         x86/x86cpu.c
161         x86/mmxidct.c
162         x86/mmxfrag.c
163         x86/mmxstate.c
164         x86/sse2idct.c
165         x86/x86state.c
166   """
167   encoder_sources += """
168         x86/x86cpu.c
169         x86/mmxencfrag.c
170         x86/mmxfdct.c
171         x86/x86enc.c
172         x86/x86enquant.c
173         x86/sse2fdct.c
174         x86/mmxfrag.c
175         x86/mmxidct.c
176         x86/mmxstate.c
177         x86/x86state.c
178         x86/sse2encfrag.c
179   """
180
181 env = conf.Finish()
182
183 env.Append(CPPPATH=['include'])
184 env.ParseConfig('pkg-config --cflags --libs ogg')
185
186 libtheoradec_Sources = Split(decoder_sources)
187 libtheoraenc_Sources = Split(encoder_sources)
188
189 libtheoradec_a = env.Library('lib/theoradec',
190         path('lib', libtheoradec_Sources))
191 libtheoradec_so = env.SharedLibrary('lib/theoradec',
192         path('lib', libtheoradec_Sources))
193
194 libtheoraenc_a = env.Library('lib/theoraenc',
195         path('lib', libtheoraenc_Sources))
196 libtheoraenc_so = env.SharedLibrary('lib/theoraenc',
197         path('lib', libtheoraenc_Sources) + [libtheoradec_so])
198
199 #installing
200 prefix='/usr'
201 lib_dir = prefix + '/lib'
202 env.Alias('install', prefix)
203 env.Install(lib_dir, [libtheoradec_a, libtheoradec_so])
204 env.Install(lib_dir, [libtheoraenc_a, libtheoraenc_so])
205
206 # example programs
207 dump_video = env.Clone()
208 dump_video_Sources = Split("""dump_video.c ../lib/libtheoradec.a""")
209 dump_video.Program('examples/dump_video', path('examples', dump_video_Sources))
210
211 dump_psnr = env.Clone()
212 dump_psnr.Append(LIBS='m')
213 dump_psnr_Sources = Split("""dump_psnr.c ../lib/libtheoradec.a""")
214 dump_psnr.Program('examples/dump_psnr', path('examples', dump_psnr_Sources))
215
216 libtheora_info = env.Clone()
217 libtheora_info_Sources = Split("""
218         libtheora_info.c
219         ../lib/libtheoraenc.a
220         ../lib/libtheoradec.a
221   """)
222 libtheora_info.Program('examples/libtheora_info',
223                        path('examples', libtheora_info_Sources))
224
225 if have_vorbis:
226   encex = dump_video.Clone()
227   encex.ParseConfig('pkg-config --cflags --libs vorbisenc vorbis')
228   encex.Append(LIBS=['m'])
229   encex_Sources = Split("""
230         encoder_example.c
231         ../lib/libtheoraenc.a 
232         ../lib/libtheoradec.a
233   """)
234   encex.Program('examples/encoder_example', path('examples', encex_Sources))
235
236   if build_player_example:
237     plyex = encex.Clone()
238     plyex_Sources = Split("""
239         player_example.c
240         ../lib/libtheoradec.a
241     """)
242     plyex.ParseConfig('sdl-config --cflags --libs')
243     plyex.Append(LIBS=['m'])
244     plyex.Program('examples/player_example', path('examples', plyex_Sources))
245
246 png2theora = env.Clone()
247 png2theora_Sources = Split("""png2theora.c
248         ../lib/libtheoraenc.a
249         ../lib/libtheoradec.a
250 """)
251 png2theora.ParseConfig('pkg-config --cflags --libs libpng')
252 png2theora.Append(LIBS=['m'])
253 png2theora.Program('examples/png2theora', path('examples', png2theora_Sources))
254