12 #'src/slm/ids2ngram/ids2ngram.cpp',
13 #'src/slm/ids2ngram/idngram_merge.cpp',
14 #'src/slm/mmseg/mmseg.cpp',
15 #'src/slm/tslminfo/tslminfo.cpp',
16 #'src/slm/tslmpack/arpa_slm.cpp',
17 #'src/slm/tslmpack/arpa_conv.cpp',
18 #'src/slm/tslmpack/slmpack.cpp',
20 #'src/slm/slminfo/slminfo.cpp',
21 #'src/slm/sim_sen.cpp',
22 #'src/slm/sim_slm.cpp',
23 #'src/slm/getWordFreq/getWordFreq.cpp',
24 #'src/slm/slmseg/slmseg.cpp',
25 #'src/slm/thread/slmthread.cpp',
26 #'src/slm/thread/test_vc.cpp',
27 #'src/slm/thread/ValueCompress.cpp',
28 #'src/slm/slmbuild/slmbuild.cpp',
29 #'src/slm/slmprune/slmprune.cpp',
30 #'src/slm/sim_slmbuilder.cpp',
31 #'src/slm/tslmendian/slm_endian.cpp',
32 #'src/slm/tslmendian/writer.cpp',
33 #'src/slm/tslmendian/slm_file.cpp',
34 #'src/slm/sim_dict.cpp',
35 'src/portability.cpp',
36 'src/lexicon/trie_writer.cpp',
37 'src/lexicon/genPYT.cpp',
38 'src/lexicon/pytrie_gen.cpp',
39 'src/lexicon/pytrie.cpp',
40 'src/pinyin/pinyin_data.cpp',
44 'src/portability.cpp',
46 'src/lexicon/pytrie.cpp',
47 'src/pinyin/pinyin_data.cpp',
48 'src/pinyin/pinyin_seg.cpp',
49 'src/pinyin/shuangpin_data.cpp',
50 'src/pinyin/shuangpin_seg.cpp',
51 'src/pinyin/hunpin_seg.cpp',
52 'src/ime-core/imi_context.cpp',
53 'src/ime-core/imi_data.cpp',
54 'src/ime-core/lattice_states.cpp',
55 'src/ime-core/imi_view.cpp',
56 'src/ime-core/imi_uiobjects.cpp',
57 'src/ime-core/imi_view_classic.cpp',
58 'src/ime-core/imi_winHandler.cpp',
59 'src/ime-core/ic_history.cpp',
60 'src/ime-core/imi_funcobjs.cpp',
61 'src/ime-core/imi_options.cpp',
62 'src/ime-core/imi_option_event.cpp',
63 'src/ime-core/userdict.cpp',
67 #'src/slm/ids2ngram/idngram.h',
68 #'src/slm/ids2ngram/idngram_merge.h',
70 #'src/slm/tslmpack/arpa_slm.h',
71 #'src/slm/tslmpack/common.h',
72 #'src/slm/tslmpack/arpa_conv.h',
73 #'src/slm/sim_dict.h',
76 #'src/slm/thread/ValueCompress.h',
77 #'src/slm/sim_fmerge.h',
78 #'src/slm/sim_slmbuilder.h',
79 #'src/slm/tslmendian/slm_file.h',
80 #'src/slm/tslmendian/writer.h',
81 'src/lexicon/pytrie_gen.h',
82 'src/lexicon/trie_writer.h',
83 'src/lexicon/pytrie.h',
84 'src/ime-core/imi_view_classic.h',
85 'src/ime-core/imi_uiobjects.h',
86 'src/ime-core/lattice_states.h',
87 'src/ime-core/ic_history.h',
88 'src/ime-core/imi_funcobjs.h',
89 'src/ime-core/imi_context.h',
90 'src/ime-core/imi_winHandler.h',
91 'src/ime-core/imi_glibHandler.h',
92 'src/ime-core/userdict.h',
93 'src/ime-core/imi_option_event.h',
94 'src/ime-core/imi_data.h',
95 'src/ime-core/utils.h',
96 'src/ime-core/imi_keys.h',
97 'src/ime-core/imi_option_keys.h',
98 'src/ime-core/imi_options.h',
99 'src/ime-core/imi_defines.h',
100 'src/ime-core/imi_view.h',
102 'src/pinyin/segmentor.h',
103 'src/pinyin/shuangpin_seg.h',
104 'src/pinyin/datrie.h',
105 'src/pinyin/quanpin_trie.h',
106 'src/pinyin/pinyin_seg.h',
107 'src/pinyin/pinyin_data.h',
108 'src/pinyin/syllable.h',
109 'src/pinyin/shuangpin_data.h',
110 'src/pinyin/hunpin_seg.h',
111 'src/pinyin/datrie_impl.h',
115 # source of plugin module, it's off by default
116 # and this module depends on Python
118 'src/ime-core/imi_plugin.cpp',
122 'src/ime-core/imi_plugin.h',
126 AddOption('--prefix', dest='prefix', metavar='DIR',
127 help='installation prefix')
129 AddOption('--libdir', dest='libdir', metavar='DIR',
130 help='installation libdir')
132 AddOption('--libdatadir', dest='libdatadir', metavar='DIR',
133 help='installation libdata dir')
135 AddOption('--rpath', dest='rpath', metavar='DIR',
136 help='encode rpath in the executables')
138 AddOption('--enable-plugins', dest='enable_plugins', action='store_true',
139 default=False, help='enable plugin mechanism at libsunpinyin layer')
141 AddOption('--disable-plugins', dest='enable_plugins', action='store_false',
142 default=False, help='disable plugin mechanism at libsunpinyin layer')
145 opts = Variables('configure.conf')
146 opts.Add('PREFIX', default='/usr/local')
147 opts.Add('LIBDIR', default='/usr/local/lib')
148 opts.Add('LIBDATADIR', default='/usr/local/lib')
149 opts.Add('ENABLE_PLUGINS', default=False)
152 #==============================environment==============================
157 for root, dirs, files in os.walk('src'):
162 return platform.uname()[0]
164 def CreateEnvironment():
168 if GetOS() == 'Darwin':
170 elif GetOS() == 'FreeBSD':
173 elif GetOS() == 'SunOS':
177 libln_builder = Builder(action='ln -s ${SOURCE.name} ${TARGET.name}',
179 env = Environment(ENV=os.environ, CFLAGS=cflags, CXXFLAGS=cflags,
180 TAR=tar, MAKE=make, WGET=wget,
181 CPPPATH=['.'] + allinc(),
182 tools=['default', 'textfile'])
183 env.Append(BUILDERS={'InstallAsSymlink': libln_builder})
186 def PassVariables(envvar, env):
187 for (x, y) in envvar:
189 print 'Warning: you\'ve set %s in the environmental variable!' % x
190 env[y] = os.environ[x]
192 env = CreateEnvironment()
195 if GetOption('prefix') is not None:
196 env['PREFIX'] = GetOption('prefix')
197 env['LIBDATADIR'] = os.path.join(env['PREFIX'], 'lib')
198 env['LIBDIR'] = os.path.join(env['PREFIX'], 'lib')
200 if GetOption('libdir') is not None:
201 env['LIBDIR'] = GetOption('libdir')
203 if GetOption('libdatadir') is not None:
204 env['LIBDATADIR'] = GetOption('libdatadir')
206 env['ENABLE_PLUGINS'] = GetOption('enable_plugins')
208 opts.Save('configure.conf', env)
210 libdir = env['LIBDIR']
211 libdatadir = os.path.join(env['LIBDATADIR'], 'sunpinyin/data')
212 headersdir = os.path.join(env['PREFIX'], 'include/sunpinyin-2.0')
214 # pass through environmental variables
215 envvar = [('CC', 'CC'),
217 ('CFLAGS', 'CFLAGS'),
218 ('CXXFLAGS', 'CXXFLAGS'),
219 ('LDFLAGS', 'LINKFLAGS'),
223 PassVariables(envvar, env)
225 # append the source and headers
226 if env['ENABLE_PLUGINS']:
227 imesource += imesource_plugin
228 headers += headers_plugin
230 # merge some of critical compile flags
231 env.MergeFlags(['-pipe -DHAVE_CONFIG_H',
232 '-DSUNPINYIN_DATA_DIR=\\\'\\"%s\\"\\\'' % libdatadir])
234 if GetOption('rpath') is not None and GetOS() != 'Darwin':
235 env.MergeFlags('-Wl,-R -Wl,%s' % GetOption('rpath'))
238 #==============================configure================================
240 def CheckPKGConfig(context, version='0.12.0'):
241 context.Message('Checking for pkg-config... ')
242 ret = context.TryAction('pkg-config --atleast-pkgconfig-version=%s' % version)[0]
246 def CheckPKG(context, name):
247 context.Message('Checking for %s... ' % name)
248 ret = context.TryAction('pkg-config --exists \'%s\'' % name)[0]
252 def CheckPython(context):
253 context.Message('Checking for Python library...')
254 ret = context.TryAction('python-config --prefix')[0]
257 context.env.MergeFlags(['!python-config --includes',
258 '!python-config --libs'])
261 def AppendEndianCheck(conf):
262 conf.config_h_text += r'''
264 #if defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)
265 # define WORDS_BIGENDIAN 1
267 #elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)
268 # undef WORDS_BIGENDIAN
270 #elif defined(__sparc) || defined(__sparc__) \
271 || defined(_POWER) || defined(__powerpc__) \
272 || defined(__ppc__) || defined(__hpux) || defined(__hppa) \
273 || defined(_MIPSEB) || defined(_POWER) \
274 || defined(__s390__) || (defined(__sh__) && defined(__BIG_ENDIAN__))
275 # define WORDS_BIGENDIAN 1
277 #elif defined(__i386__) || defined(__i386) \
278 || defined(__ia64) || defined(__ia64__) \
279 || defined(_M_IX86) || defined(_M_IA64) \
280 || defined(_M_ALPHA) || defined(__amd64) \
281 || defined(__amd64__) || defined(_M_AMD64) \
282 || defined(__x86_64) || defined(__x86_64__) \
283 || defined(_M_X64) || defined(__bfin__) \
284 || defined(__alpha__) || defined(__ARMEL__) \
285 || defined(_MIPSEL) || (defined(__sh__) && defined(__LITTLE_ENDIAN__))
286 # undef WORDS_BIGENDIAN
289 # error can not detect the endianness!
293 conf = env.Configure(clean=False, help=False, config_h='config.h',
294 custom_tests={'CheckPKGConfig' : CheckPKGConfig,
295 'CheckPKG' : CheckPKG,
296 'CheckPython': CheckPython})
299 if GetOS() == 'Darwin':
300 if not conf.CheckLibWithHeader('sqlite3', 'sqlite3.h', 'C'):
302 if not conf.CheckLibWithHeader('iconv', 'iconv.h', 'C'):
305 if not conf.CheckPKGConfig():
307 if not conf.CheckPKG('sqlite3'):
310 if conf.env['ENABLE_PLUGINS']:
311 if not conf.CheckPython():
313 conf.Define('ENABLE_PLUGINS')
315 conf.Define('ENABLE_NLS', 1)
316 conf.Define('GETTEXT_PACKAGE', '"sunpinyin2"')
317 conf.CheckCHeader('assert.h')
318 conf.CheckFunc('bind_textdomain_codeset')
319 conf.CheckFunc('dcgettext')
320 conf.CheckCHeader('dlfcn.h')
321 conf.CheckFunc('exp2')
322 conf.CheckCHeader('fcntl.h')
323 conf.CheckCHeader('getopt.h')
324 conf.CheckFunc('getopt_long')
325 conf.CheckFunc('getpagesize')
326 conf.CheckFunc('get_opt')
327 conf.CheckCHeader('iconv.h')
328 conf.CheckCHeader('inttypes.h')
329 conf.CheckCHeader('locale.h')
330 conf.CheckCHeader('libintl.h')
331 conf.CheckCHeader('limits.h')
332 conf.CheckCHeader('locale.h')
333 conf.CheckFunc('log2')
334 conf.CheckCHeader('memory.h')
335 conf.CheckFunc('memset')
336 conf.CheckFunc('mmap')
337 conf.CheckFunc('munmap')
338 conf.CheckFunc('setlocale')
339 conf.CheckFunc('strndup')
340 conf.CheckCHeader('sys/mman.h')
341 conf.CheckCHeader('sys/param.h')
342 conf.CheckCHeader('sys/stat.h')
343 conf.CheckCHeader('sys/types.h')
344 conf.CheckCHeader('unistd.h')
345 conf.CheckCHeader('wchar.h')
347 # add essential package requirements
348 conf.Define('PACKAGE', '"sunpinyin"')
349 conf.Define('PACKAGE_NAME', '"sunpinyin"')
350 conf.Define('PACKAGE_STRING', '"sunpinyin 2.0"')
351 conf.Define('PACKAGE_TARNAME', '"sunpinyin"')
352 conf.Define('PACKAGE_VERSION', '"2.0"')
353 conf.Define('VRESION', '"2.0"')
355 # append endianness checking defines
356 AppendEndianCheck(conf)
358 # generate sunpinyin.pc
359 env.Substfile('sunpinyin-2.0.pc.in', SUBST_DICT={
360 '@PREFIX@': env['PREFIX'],
361 '@LIBDIR@': env['LIBDIR'],
362 '@VERSION@': version,
363 '@CFLAGS@': reduce(lambda a, b: a + ' ' + b,
364 map(lambda x: '-I$${includedir}' + x[3:],
368 if GetOS() != 'Darwin':
369 env.ParseConfig('pkg-config sqlite3 --libs --cflags')
371 if not GetOption('clean') and not GetOption('help'):
375 #==============================compile==============================
377 #env.Command('src/pinyin/quanpin_trie.h', 'python/pinyin_data.py',
378 # './pinyin_data.py > /dev/null', chdir = 'python')
379 #env.Object(slmsource)
381 #SConscript(['build/SConscript'], exports='env')
383 libname_default = '%ssunpinyin%s' % (env.subst('${SHLIBPREFIX}'),
384 env.subst('${SHLIBSUFFIX}'))
385 libname_link = libname_default
386 libname_soname = '%s.%d' % (libname_link, abi_major)
387 libname = '%s.%d' % (libname_soname, abi_minor)
390 if GetOS() != 'Darwin':
391 lib = env.SharedLibrary(libname, SHLIBSUFFIX='', source=imesource,
392 parse_flags='-Wl,-soname=%s' % libname_soname)
394 # TODO: add install_name on Darwin?
395 lib = env.SharedLibrary('sunpinyin', source=imesource)
397 #env.Command('rawlm', 'build/tslmpack',
398 # '$MAKE -C raw WGET="$WGET" TAR="$TAR"')
400 #env.Command('lm', 'rawlm',
401 # '$MAKE -C data WGET="$WGET" TAR="$TAR"')
403 if GetOption('clean'):
404 os.environ['TAR'] = env['TAR']
405 os.environ['MAKE'] = env['MAKE']
406 os.system('$MAKE -C raw clean WGET="$WGET" TAR="$TAR"')
407 os.system('$MAKE -C data clean WGET="$WGET" TAR="$TAR"')
411 if GetOS() == 'Darwin':
412 lib_target = env.Install(libdir, lib)
414 lib_target_bin = env.Install(libdir, lib)
416 install_path = os.path.dirname(str(lib_target_bin[0]))
419 env.InstallAsSymlink(os.path.join(install_path, libname_soname),
421 env.InstallAsSymlink(os.path.join(install_path, libname_link),
425 lib_pkgconfig_target = env.Install(os.path.join(libdir, 'pkgconfig'),
426 ['sunpinyin-2.0.pc'])
427 libdata_target = env.Install(libdatadir,
429 'data/pydict_sc.bin'])
431 for header in headers:
432 header_targets.append(env.InstallAs(headersdir + header[3:], header))
433 env.Alias('install-headers', header_targets)
434 env.Alias('install-lib', lib_target + [lib_pkgconfig_target])
435 env.Alias('install-libdata', libdata_target)
436 env.Depends('install-libdata', 'install-lib')
439 env.Alias('install', ['install-lib', 'install-libdata', 'install-headers'])