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