11
slmsource=['src/slm/ids2ngram/ids2ngram.cpp',
12
'src/slm/ids2ngram/idngram_merge.cpp',
13
'src/slm/mmseg/mmseg.cpp',
14
'src/slm/tslminfo/tslminfo.cpp',
15
'src/slm/tslmpack/arpa_slm.cpp',
16
'src/slm/tslmpack/arpa_conv.cpp',
17
'src/slm/tslmpack/slmpack.cpp',
19
'src/slm/slminfo/slminfo.cpp',
20
'src/slm/sim_sen.cpp',
21
'src/slm/sim_slm.cpp',
22
'src/slm/getWordFreq/getWordFreq.cpp',
23
'src/slm/slmseg/slmseg.cpp',
24
'src/slm/thread/slmthread.cpp',
25
'src/slm/thread/test_vc.cpp',
26
'src/slm/thread/ValueCompress.cpp',
27
'src/slm/slmbuild/slmbuild.cpp',
28
'src/slm/slmprune/slmprune.cpp',
29
'src/slm/sim_slmbuilder.cpp',
30
'src/slm/tslmendian/slm_endian.cpp',
31
'src/slm/tslmendian/writer.cpp',
32
'src/slm/tslmendian/slm_file.cpp',
33
'src/slm/sim_dict.cpp',
34
'src/portability.cpp',
35
'src/lexicon/trie_writer.cpp',
36
'src/lexicon/genPYT.cpp',
37
'src/lexicon/pytrie_gen.cpp',
38
'src/lexicon/pytrie.cpp',
39
'src/pinyin/pinyin_data.cpp']
41
imesource=['src/portability.cpp',
43
'src/lexicon/pytrie.cpp',
44
'src/pinyin/pinyin_data.cpp',
45
'src/pinyin/pinyin_seg.cpp',
46
'src/pinyin/shuangpin_data.cpp',
47
'src/pinyin/shuangpin_seg.cpp',
48
'src/pinyin/hunpin_seg.cpp',
49
'src/ime-core/imi_context.cpp',
50
'src/ime-core/imi_data.cpp',
51
'src/ime-core/lattice_states.cpp',
52
'src/ime-core/imi_view.cpp',
53
'src/ime-core/imi_uiobjects.cpp',
54
'src/ime-core/imi_view_classic.cpp',
55
'src/ime-core/imi_winHandler.cpp',
56
'src/ime-core/ic_history.cpp',
57
'src/ime-core/imi_funcobjs.cpp',
58
'src/ime-core/imi_options.cpp',
59
'src/ime-core/imi_option_event.cpp',
60
'src/ime-core/userdict.cpp']
62
headers=['src/slm/ids2ngram/idngram.h',
63
'src/slm/ids2ngram/idngram_merge.h',
65
'src/slm/tslmpack/arpa_slm.h',
66
'src/slm/tslmpack/common.h',
67
'src/slm/tslmpack/arpa_conv.h',
71
'src/slm/thread/ValueCompress.h',
72
'src/slm/sim_fmerge.h',
73
'src/slm/sim_slmbuilder.h',
74
'src/slm/tslmendian/slm_file.h',
75
'src/slm/tslmendian/writer.h',
76
'src/lexicon/pytrie_gen.h',
77
'src/lexicon/trie_writer.h',
78
'src/lexicon/pytrie.h',
79
'src/ime-core/imi_view_classic.h',
80
'src/ime-core/imi_uiobjects.h',
81
'src/ime-core/lattice_states.h',
82
'src/ime-core/ic_history.h',
83
'src/ime-core/imi_funcobjs.h',
84
'src/ime-core/imi_context.h',
85
'src/ime-core/imi_winHandler.h',
86
'src/ime-core/userdict.h',
87
'src/ime-core/imi_option_event.h',
88
'src/ime-core/imi_data.h',
89
'src/ime-core/utils.h',
90
'src/ime-core/imi_keys.h',
91
'src/ime-core/imi_option_keys.h',
92
'src/ime-core/imi_options.h',
93
'src/ime-core/imi_defines.h',
94
'src/ime-core/imi_view.h',
96
'src/pinyin/segmentor.h',
97
'src/pinyin/shuangpin_seg.h',
98
'src/pinyin/datrie.h',
99
'src/pinyin/quanpin_trie.h',
100
'src/pinyin/pinyin_seg.h',
101
'src/pinyin/pinyin_data.h',
102
'src/pinyin/syllable.h',
103
'src/pinyin/shuangpin_data.h',
104
'src/pinyin/hunpin_seg.h',
105
'src/pinyin/datrie_impl.h',
109
AddOption('--prefix', dest='prefix', metavar='DIR',
110
help='installation prefix')
112
AddOption('--libdir', dest='libdir', metavar='DIR',
113
help='installation libdir')
115
AddOption('--libdatadir', dest='libdatadir', metavar='DIR',
116
help='installation libdata dir')
118
AddOption('--rpath', dest='rpath', metavar='DIR',
119
help='encode rpath in the executables')
122
opts = Variables('configure.conf')
123
opts.Add('PREFIX', default='/usr/local')
124
opts.Add('LIBDIR', default='/usr/local/lib')
125
opts.Add('LIBDATADIR', default='/usr/local/lib')
128
#==============================environment==============================
133
for root, dirs, files in os.walk('src'):
138
return platform.uname()[0]
140
def CreateEnvironment():
144
if GetOS() == 'Darwin':
146
elif GetOS() == 'FreeBSD':
149
elif GetOS() == 'SunOS':
153
return Environment(ENV=os.environ, CFLAGS=cflags, CXXFLAGS=cflags,
154
TAR=tar, MAKE=make, WGET=wget,
155
CPPPATH=['.'] + allinc())
157
def PassVariables(envvar, env):
158
for (x, y) in envvar:
160
print 'Warning: you\'ve set %s in the environmental variable!' % x
161
env[y] = os.environ[x]
163
env = CreateEnvironment()
166
if GetOption('prefix') is not None:
167
env['PREFIX'] = GetOption('prefix')
168
env['LIBDATADIR'] = env['PREFIX'] + '/lib'
169
env['LIBDIR'] = env['PREFIX'] + '/lib'
171
if GetOption('libdir') is not None:
172
env['LIBDIR'] = GetOption('libdir')
174
if GetOption('libdatadir') is not None:
175
env['LIBDATADIR'] = GetOption('libdatadir')
177
opts.Save('configure.conf', env)
179
libdir = env['LIBDIR']
180
libdatadir = env['LIBDATADIR'] + '/sunpinyin/data'
181
headersdir = env['PREFIX'] + '/include/sunpinyin-2.0'
183
# pass through environmental variables
184
envvar = [('CC', 'CC'),
186
('CFLAGS', 'CFLAGS'),
187
('CXXFLAGS', 'CXXFLAGS'),
188
('LDFLAGS', 'LINKFLAGS'),
192
PassVariables(envvar, env)
194
# append critical cflags
195
extra_cflags=' -DHAVE_CONFIG_H -DSUNPINYIN_DATA_DIR=\'"%s"\'' % libdatadir
196
env.Append(CFLAGS=extra_cflags)
197
env.Append(CXXFLAGS=extra_cflags)
199
if GetOS() != 'Darwin':
200
env.Append(LINKFLAGS=['-Wl,-soname=libsunpinyin.so.%d' % abi_major])
202
if GetOption('rpath') is not None and GetOS() != 'Darwin':
203
env.Append(LINKFLAGS=['-Wl,-R', '-Wl,%s' % GetOption('rpath')])
206
#==============================configure================================
208
def CheckPKGConfig(context, version='0.12.0'):
209
context.Message( 'Checking for pkg-config... ' )
210
ret = context.TryAction('pkg-config --atleast-pkgconfig-version=%s' % version)[0]
214
def CheckPKG(context, name):
215
context.Message( 'Checking for %s... ' % name )
216
ret = context.TryAction('pkg-config --exists \'%s\'' % name)[0]
220
def AppendEndianCheck(conf):
221
conf.config_h_text += r'''
223
#if defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)
224
# define WORDS_BIGENDIAN 1
226
#elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)
227
# undef WORDS_BIGENDIAN
229
#elif defined(__sparc) || defined(__sparc__) \
230
|| defined(_POWER) || defined(__powerpc__) \
231
|| defined(__ppc__) || defined(__hpux) || defined(__hppa) \
232
|| defined(_MIPSEB) || defined(_POWER) \
234
# define WORDS_BIGENDIAN 1
236
#elif defined(__i386__) || defined(__i386) \
237
|| defined(__ia64) || defined(__ia64__) \
238
|| defined(_M_IX86) || defined(_M_IA64) \
239
|| defined(_M_ALPHA) || defined(__amd64) \
240
|| defined(__amd64__) || defined(_M_AMD64) \
241
|| defined(__x86_64) || defined(__x86_64__) \
242
|| defined(_M_X64) || defined(__bfin__) \
243
|| defined(__alpha__) || defined(__ARMEL__)
244
# undef WORDS_BIGENDIAN
247
# error can not detect the endianness!
251
conf = env.Configure(clean=False, help=False, config_h='config.h',
252
custom_tests={'CheckPKGConfig' : CheckPKGConfig,
253
'CheckPKG' : CheckPKG})
256
if GetOption('clean'):
259
if GetOS() == 'Darwin':
260
if not conf.CheckLibWithHeader('sqlite3', 'sqlite3.h', 'C'):
262
if not conf.CheckLibWithHeader('iconv', 'iconv.h', 'C'):
265
if not conf.CheckPKGConfig():
267
if not conf.CheckPKG('sqlite3'):
270
conf.Define('ENABLE_NLS', 1)
271
conf.Define('GETTEXT_PACKAGE', '"sunpinyin2"')
272
conf.CheckCHeader('assert.h')
273
conf.CheckFunc('bind_textdomain_codeset')
274
conf.CheckFunc('dcgettext')
275
conf.CheckCHeader('dlfcn.h')
276
conf.CheckFunc('exp2')
277
conf.CheckCHeader('fcntl.h')
278
conf.CheckCHeader('getopt.h')
279
conf.CheckFunc('getopt_long')
280
conf.CheckFunc('getpagesize')
281
conf.CheckFunc('get_opt')
282
conf.CheckCHeader('iconv.h')
283
conf.CheckCHeader('inttypes.h')
284
conf.CheckCHeader('locale.h')
285
conf.CheckCHeader('libintl.h')
286
conf.CheckCHeader('limits.h')
287
conf.CheckCHeader('locale.h')
288
conf.CheckFunc('log2')
289
conf.CheckCHeader('memory.h')
290
conf.CheckFunc('memset')
291
conf.CheckFunc('mmap')
292
conf.CheckFunc('munmap')
293
conf.CheckFunc('setlocale')
294
conf.CheckFunc('strndup')
295
conf.CheckCHeader('sys/mman.h')
296
conf.CheckCHeader('sys/param.h')
297
conf.CheckCHeader('sys/stat.h')
298
conf.CheckCHeader('sys/types.h')
299
conf.CheckCHeader('unistd.h')
300
conf.CheckCHeader('wchar.h')
302
# add essential package requirements
303
conf.Define('PACKAGE', '"sunpinyin"')
304
conf.Define('PACKAGE_NAME', '"sunpinyin"')
305
conf.Define('PACKAGE_STRING', '"sunpinyin 2.0"')
306
conf.Define('PACKAGE_TARNAME', '"sunpinyin"')
307
conf.Define('PACKAGE_VERSION', '"2.0"')
308
conf.Define('VRESION', '"2.0"')
310
# append endianness checking defines
311
AppendEndianCheck(conf)
314
# generate sunpinyin.pc
315
f = file('sunpinyin-2.0.pc', 'w')
317
'prefix='+env['PREFIX'],
318
'exec_prefix=${prefix}',
320
'includedir=${exec_prefix}/include/sunpinyin-2.0',
322
'Name: libsunpinyin',
323
'Description: IME library based on Statistical Language Model',
324
'Version: %s' % version,
326
'Libs: -L${libdir} -lsunpinyin',
327
'Cflags: ' + reduce(lambda a, b: a + ' ' + b,
328
map(lambda x: '-I${includedir}' + x[3:],
331
f.write(reduce(lambda a, b: a + '\n' + b, content))
334
if GetOS() != 'Darwin':
335
env.ParseConfig('pkg-config sqlite3 --libs --cflags')
340
#==============================compile==============================
342
env.Object(slmsource)
344
SConscript(['build/SConscript'], exports='env')
346
libname = 'libsunpinyin.so.%d.%d' % (abi_major, abi_minor)
347
libname_soname = 'libsunpinyin.so.%d' % abi_major
348
libname_link = 'libsunpinyin.so'
350
lib = env.SharedLibrary('sunpinyin-%d.%d' % (abi_major, abi_minor),
353
if GetOption('clean'):
354
os.environ['TAR'] = env['TAR']
355
os.environ['MAKE'] = env['MAKE']
356
os.system('$MAKE -C raw clean WGET="$WGET" TAR="$TAR"')
357
os.system('$MAKE -C data clean WGET="$WGET" TAR="$TAR"')
360
if not 'install' in COMMAND_LINE_TARGETS:
364
if GetOS() == 'Darwin':
365
lib_target = env.Install(libdir, lib)
367
lib_target_bin = env.InstallAs(libdir + '/' + libname, lib)
368
install_path = os.path.dirname(str(lib_target_bin[0])) + '/'
371
env.Command(install_path + libname_soname, lib_target_bin,
372
'cd %s && ln -sf %s %s' %
373
(install_path, libname, libname_soname)),
374
env.Command(install_path + libname_link, lib_target_bin,
375
'cd %s && ln -sf %s %s' %
376
(install_path, libname, libname_link))
379
lib_pkgconfig_target = env.Install(libdir+'/pkgconfig',
380
['sunpinyin-2.0.pc'])
381
libdata_target = env.Install(libdatadir)
383
for header in headers:
384
header_targets.append(env.InstallAs(headersdir + header[3:], header))
385
env.Alias('install-headers', header_targets)
386
env.Alias('install-lib', lib_target + [lib_pkgconfig_target])
387
env.Alias('install-libdata', libdata_target)
390
env.Alias('install', ['install-lib', 'install-libdata', 'install-headers'])