SConstruct 6.66 KB
Newer Older
Jan Gerber's avatar
Jan Gerber committed
1
# SCons build specification
2
# vi:si:et:sw=2:sts=2:ts=2
Jan Gerber's avatar
Jan Gerber committed
3
4
5
6
7
from glob import glob
import os

import SCons

8
def version():
Jan Gerber's avatar
Jan Gerber committed
9
    #return "0.29"
Jan Gerber's avatar
Jan Gerber committed
10
    f = os.popen("./version.sh")
Jan Gerber's avatar
Jan Gerber committed
11
12
13
    version = f.read().strip()
    f.close()
    return version
Jan Gerber's avatar
Jan Gerber committed
14

Jan Gerber's avatar
Jan Gerber committed
15
pkg_version=version()
Jan Gerber's avatar
Jan Gerber committed
16

Jan Gerber's avatar
Jan Gerber committed
17
18
pkg_name="ffmpeg2theora"

Jan Gerber's avatar
Jan Gerber committed
19
scons_version=(1,2,0)
20
21
22
23
24
25
26

try:
    EnsureSConsVersion(*scons_version)
except TypeError:
    print 'SCons %d.%d.%d or greater is required, but you have an older version' % scons_version
    Exit(2)

Jan Gerber's avatar
Jan Gerber committed
27
28
29
30
opts = Variables()
opts.AddVariables(
  BoolVariable('static', 'Set to 1 for static linking', 0),
  BoolVariable('debug', 'Set to 1 to enable debugging', 0),
31
  BoolVariable('build_ffmpeg', 'Set to 1 to build local copy of ffmpeg', 0),
Jan Gerber's avatar
Jan Gerber committed
32
  ('prefix', 'install files in', '/usr/local'),
33
34
35
36
  ('bindir', 'user executables', 'PREFIX/bin'),
  ('mandir', 'man documentation', 'PREFIX/man'),
  ('destdir', 'extra install time prefix', ''),
  ('APPEND_CCFLAGS', 'Additional C/C++ compiler flags'),
37
  ('APPEND_LINKFLAGS', 'Additional linker flags'),
Jan Gerber's avatar
Jan Gerber committed
38
39
  BoolVariable('libkate', 'enable libkate support', 1),
  BoolVariable('crossmingw', 'Set to 1 for crosscompile with mingw', 0)
40
41
42
)
env = Environment(options = opts)
Help(opts.GenerateHelpText(env))
Jan Gerber's avatar
Jan Gerber committed
43
44

pkg_flags="--cflags --libs"
45
if env['static']:
Jan Gerber's avatar
Jan Gerber committed
46
47
48
  pkg_flags+=" --static"
  env.Append(LINKFLAGS=["-static"])

49
50
51
if env['crossmingw']:
    env.Tool('crossmingw', toolpath = ['scons-tools'])

52
53
54
55
56
57
58
prefix = env['prefix']
if env['destdir']:
  if prefix.startswith('/'): prefix = prefix[1:]
  prefix = os.path.join(env['destdir'], prefix)
man_dir = env['mandir'].replace('PREFIX', prefix)
bin_dir = env['bindir'].replace('PREFIX', prefix)

Jan Gerber's avatar
Jan Gerber committed
59
60
env.Append(CPPPATH=['.'])
env.Append(CCFLAGS=[
61
62
  '-DPACKAGE_VERSION=\\"%s\\"' % pkg_version,
  '-DPACKAGE_STRING=\\"%s-%s\\"' % (pkg_name, pkg_version),
Jan Gerber's avatar
Jan Gerber committed
63
  '-DPACKAGE=\\"%s\\"' % pkg_name,
64
  '-D_FILE_OFFSET_BITS=64'
Jan Gerber's avatar
Jan Gerber committed
65
])
66

67
68
69
env.Append(CCFLAGS = Split('$APPEND_CCFLAGS'))
env.Append(LINKFLAGS = Split('$APPEND_LINKFLAGS'))

Jan Gerber's avatar
Jan Gerber committed
70
71
if env['debug'] and env['CC'] == 'gcc':
  env.Append(CCFLAGS=["-g", "-O2", "-Wall"])
Jan Gerber's avatar
Jan Gerber committed
72

73
74
75
if GetOption("help"):
    Return()

76
77
78
79
80
81
82
def ParsePKGConfig(env, name): 
  if os.environ.get('PKG_CONFIG_PATH', ''):
    action = 'PKG_CONFIG_PATH=%s pkg-config %s "%s"' % (os.environ['PKG_CONFIG_PATH'], pkg_flags, name)
  else:
    action = 'pkg-config %s "%s"' % (pkg_flags, name)
  return env.ParseConfig(action)

83
84
85
86
87
88
89
def TryAction(action):
    import os
    ret = os.system(action)
    if ret == 0:
        return (1, '')
    return (0, '')

Jan Gerber's avatar
Jan Gerber committed
90
91
def CheckPKGConfig(context, version): 
  context.Message( 'Checking for pkg-config... ' ) 
92
  ret = TryAction('pkg-config --atleast-pkgconfig-version=%s' % version)[0] 
Jan Gerber's avatar
Jan Gerber committed
93
94
95
96
97
98
99
100
101
  context.Result( ret ) 
  return ret 

def CheckPKG(context, name): 
  context.Message( 'Checking for %s... ' % name )
  if os.environ.get('PKG_CONFIG_PATH', ''):
    action = 'PKG_CONFIG_PATH=%s pkg-config --exists "%s"' % (os.environ['PKG_CONFIG_PATH'], name)
  else:
    action = 'pkg-config --exists "%s"' % name
102
  ret = TryAction(action)[0]
Jan Gerber's avatar
Jan Gerber committed
103
104
105
  context.Result( ret ) 
  return ret

106
107
env.PrependENVPath ('PATH', os.environ['PATH'])

Jan Gerber's avatar
Jan Gerber committed
108
109
110
conf = Configure(env, custom_tests = {
  'CheckPKGConfig' : CheckPKGConfig,
  'CheckPKG' : CheckPKG,
111
112
})

113
114
115
116
117
118
if env["build_ffmpeg"]:
  if env.GetOption('clean'):
    TryAction("cd ffmpeg;make distclean")
  else:
    TryAction("./build_ffmpeg.sh")

119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
if not env.GetOption('clean'):
  pkgconfig_version='0.15.0'
  if not conf.CheckPKGConfig(pkgconfig_version): 
     print 'pkg-config >= %s not found.' % pkgconfig_version 
     Exit(1)

  if not conf.CheckPKG("ogg >= 1.1"): 
    print 'ogg >= 1.1 missing'
    Exit(1) 

  if not conf.CheckPKG("vorbis"): 
    print 'vorbis missing'
    Exit(1) 

  if not conf.CheckPKG("vorbisenc"): 
    print 'vorbisenc missing'
    Exit(1) 

  if not conf.CheckPKG("theoraenc >= 1.1.0"): 
    print 'theoraenc >= 1.1.0 missing'
    Exit(1) 

  XIPH_LIBS="ogg >= 1.1 vorbis vorbisenc theoraenc >= 1.1.0"

  if not conf.CheckPKG(XIPH_LIBS): 
    print 'some xiph libs are missing, ffmpeg2theora depends on %s' % XIPH_LIBS
    Exit(1) 
  ParsePKGConfig(env, XIPH_LIBS)

  FFMPEG_LIBS=[
      "libavdevice",
      "libavformat",
Jan Gerber's avatar
Jan Gerber committed
151
      "libavfilter",
152
153
154
      "libavcodec >= 52.30.0",
      "libpostproc",
      "libswscale",
155
      "libswresample",
156
157
158
159
160
161
      "libavutil",
  ]
  if os.path.exists("./ffmpeg"):
    pkg_path = list(set(map(os.path.dirname, glob('./ffmpeg/*/*.pc'))))
    pkg_path.append(os.environ.get('PKG_CONFIG_PATH', ''))
    os.environ['PKG_CONFIG_PATH'] = ':'.join(pkg_path)
162
    env.Append(CCFLAGS=[
163
      '-Iffmpeg'
164
    ])
165
166
167
168
169
170
    for lib in FFMPEG_LIBS:
      lib = lib.split(' ')[0]
      env.Append(LINKFLAGS=[
        '-Lffmpeg/' + lib
      ])

171
  if conf.CheckPKG('libswresample'):
172
173
174
175
    FFMPEG_LIBS.append('libswresample')
    env.Append(CCFLAGS=[
      '-DUSE_SWRESAMPLE'
    ])
176
177
  elif conf.CheckPKG('libavresample'):
    FFMPEG_LIBS.append('libavresample')
178

179
  if not conf.CheckPKG(' '.join(FFMPEG_LIBS)): 
180
    print """
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
        Could not find %s.
        You can install it via
         sudo apt-get install %s
        or update PKG_CONFIG_PATH to point to ffmpeg's source folder
        or run ./get_ffmpeg.sh (for more information see INSTALL)
    """ %(" ".join(FFMPEG_LIBS), " ".join(["%s-dev"%l.split()[0] for l in FFMPEG_LIBS]))
    Exit(1) 

  for lib in FFMPEG_LIBS:
      ParsePKGConfig(env, lib)

  if conf.CheckCHeader('libavformat/framehook.h'):
      env.Append(CCFLAGS=[
        '-DHAVE_FRAMEHOOK'
      ])

  KATE_LIBS="oggkate"
  if env['libkate']:
    if os.path.exists("./libkate/misc/pkgconfig"):
      os.environ['PKG_CONFIG_PATH'] = "./libkate/misc/pkgconfig:" + os.environ.get('PKG_CONFIG_PATH', '')
    if os.path.exists("./libkate/pkg/pkgconfig"):
      os.environ['PKG_CONFIG_PATH'] = "./libkate/pkg/pkgconfig:" + os.environ.get('PKG_CONFIG_PATH', '')
    if conf.CheckPKG(KATE_LIBS):
      ParsePKGConfig(env, KATE_LIBS)
      env.Append(CCFLAGS=['-DHAVE_KATE', '-DHAVE_OGGKATE'])
    else:
      print """
          Could not find libkate. Subtitles support will be disabled.
          You can also run ./get_libkate.sh (for more information see INSTALL)
          or update PKG_CONFIG_PATH to point to libkate's source folder
      """

  if conf.CheckCHeader('iconv.h'):
      env.Append(CCFLAGS=[
        '-DHAVE_ICONV'
      ])
      if conf.CheckLib('iconv'):
          env.Append(LIBS=['iconv'])

  if env['crossmingw']:
      env.Append(CCFLAGS=['-Wl,-subsystem,windows'])
  elif env['static']:
Jan Gerber's avatar
Jan Gerber committed
223
224
      env.Append(LIBS=['dl'])
  env.Append(LIBS=['m'])
225

Jan Gerber's avatar
Jan Gerber committed
226
227
228
env = conf.Finish()

# ffmpeg2theora 
229
ffmpeg2theora = env.Clone()
Jan Gerber's avatar
Jan Gerber committed
230
ffmpeg2theora_sources = glob('src/*.c')
Jan Gerber's avatar
Jan Gerber committed
231
ffmpeg2theora.Program('ffmpeg2theora', ffmpeg2theora_sources)
232
233
234
235

ffmpeg2theora.Install(bin_dir, 'ffmpeg2theora')
ffmpeg2theora.Install(man_dir + "/man1", 'ffmpeg2theora.1')
ffmpeg2theora.Alias('install', prefix)