Update package version to 1.0.6
[platform/core/uifw/ise-engine-sunpinyin.git] / SConstruct
1 import platform
2 import os
3 import sys
4
5 version="2.0.4"
6 abi_major = 3
7 abi_minor = 0
8
9 cflags = '-g -Wall'
10
11 slmsource = [
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',
19     'src/slm/slm.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',
41     ]
42
43 imesource = [
44     'src/portability.cpp',
45     'src/slm/slm.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',
64     ]
65
66 headers = [
67     #'src/slm/ids2ngram/idngram.h',
68     #'src/slm/ids2ngram/idngram_merge.h',
69     'src/slm/slm.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',
74     #'src/slm/sim_sen.h',
75     #'src/slm/sim_slm.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',
101     'src/portability.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',
112     'src/sunpinyin.h',
113     ]
114
115 # source of plugin module, it's off by default
116 # and this module depends on Python
117 imesource_plugin = [
118     'src/ime-core/imi_plugin.cpp',
119     ]
120
121 headers_plugin = [
122     'src/ime-core/imi_plugin.h',
123     ]
124
125 # options
126 AddOption('--prefix', dest='prefix', metavar='DIR',
127           help='installation prefix')
128
129 AddOption('--libdir', dest='libdir', metavar='DIR',
130           help='installation libdir')
131
132 AddOption('--libdatadir', dest='libdatadir', metavar='DIR',
133           help='installation libdata dir')
134
135 AddOption('--rpath', dest='rpath', metavar='DIR',
136           help='encode rpath in the executables')
137
138 AddOption('--enable-plugins', dest='enable_plugins', action='store_true',
139           default=False, help='enable plugin mechanism at libsunpinyin layer')
140
141 AddOption('--disable-plugins', dest='enable_plugins', action='store_false',
142           default=False, help='disable plugin mechanism at libsunpinyin layer')
143
144 # save the options
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)
150
151 #
152 #==============================environment==============================
153 #
154 #
155 def allinc():
156     inc=[]
157     for root, dirs, files in os.walk('src'):
158         inc.append(root)
159     return inc
160
161 def GetOS():
162     return platform.uname()[0]
163
164 def CreateEnvironment():
165     tar = 'tar'
166     make = 'make'
167     wget = 'wget'
168     if GetOS() == 'Darwin':
169         wget = 'curl -O'
170     elif GetOS() == 'FreeBSD':
171         wget = 'fetch'
172         make = 'gmake'
173     elif GetOS() == 'SunOS':
174         tar = 'gtar'
175         make = 'gmake'
176
177     libln_builder = Builder(action='ln -s ${SOURCE.name} ${TARGET.name}',
178                             chdir=True)
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})
184     return env
185
186 def PassVariables(envvar, env):
187     for (x, y) in envvar:
188         if x in os.environ:
189             print 'Warning: you\'ve set %s in the environmental variable!' % x
190             env[y] = os.environ[x]
191
192 env = CreateEnvironment()
193 opts.Update(env)
194
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')
199
200 if GetOption('libdir') is not None:
201     env['LIBDIR'] = GetOption('libdir')
202
203 if GetOption('libdatadir') is not None:
204     env['LIBDATADIR'] = GetOption('libdatadir')
205
206 env['ENABLE_PLUGINS'] = GetOption('enable_plugins')
207
208 opts.Save('configure.conf', env)
209
210 libdir = env['LIBDIR']
211 libdatadir = os.path.join(env['LIBDATADIR'], 'sunpinyin/data')
212 headersdir = os.path.join(env['PREFIX'], 'include/sunpinyin-2.0')
213
214 # pass through environmental variables
215 envvar = [('CC', 'CC'),
216           ('CXX', 'CXX'),
217           ('CFLAGS', 'CFLAGS'),
218           ('CXXFLAGS', 'CXXFLAGS'),
219           ('LDFLAGS', 'LINKFLAGS'),
220           ('TAR', 'TAR'),
221           ('MAKE', 'MAKE'),
222           ('WGET', 'WGET')]
223 PassVariables(envvar, env)
224
225 # append the source and headers
226 if env['ENABLE_PLUGINS']:
227     imesource += imesource_plugin
228     headers += headers_plugin
229
230 # merge some of critical compile flags
231 env.MergeFlags(['-pipe -DHAVE_CONFIG_H',
232                 '-DSUNPINYIN_DATA_DIR=\\\'\\"%s\\"\\\'' % libdatadir])
233
234 if GetOption('rpath') is not None and GetOS() != 'Darwin':
235     env.MergeFlags('-Wl,-R -Wl,%s' % GetOption('rpath'))
236
237 #
238 #==============================configure================================
239 #
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]
243     context.Result(ret)
244     return ret
245
246 def CheckPKG(context, name):
247     context.Message('Checking for %s... ' % name)
248     ret = context.TryAction('pkg-config --exists \'%s\'' % name)[0]
249     context.Result(ret)
250     return ret
251
252 def CheckPython(context):
253     context.Message('Checking for Python library...')
254     ret = context.TryAction('python-config --prefix')[0]
255     context.Result(ret)
256     if ret:
257         context.env.MergeFlags(['!python-config --includes',
258                                 '!python-config --libs'])
259     return ret
260
261 def AppendEndianCheck(conf):
262     conf.config_h_text += r'''
263
264 #if defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)
265 # define WORDS_BIGENDIAN 1
266
267 #elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)
268 # undef WORDS_BIGENDIAN
269
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
276
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
287
288 #else
289 # error can not detect the endianness!
290 #endif
291 '''
292
293 conf = env.Configure(clean=False, help=False, config_h='config.h',
294                      custom_tests={'CheckPKGConfig' : CheckPKGConfig,
295                                    'CheckPKG' : CheckPKG,
296                                    'CheckPython': CheckPython})
297
298 def DoConfigure():
299     if GetOS() == 'Darwin':
300         if not conf.CheckLibWithHeader('sqlite3', 'sqlite3.h', 'C'):
301             Exit(1)
302         if not conf.CheckLibWithHeader('iconv', 'iconv.h', 'C'):
303             Exit(1)
304     else:
305         if not conf.CheckPKGConfig():
306             Exit(1)
307         if not conf.CheckPKG('sqlite3'):
308             Exit(1)
309
310     if conf.env['ENABLE_PLUGINS']:
311         if not conf.CheckPython():
312             Exit(1)
313         conf.Define('ENABLE_PLUGINS')
314
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')
346
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"')
354
355     # append endianness checking defines
356     AppendEndianCheck(conf)
357     env = conf.Finish()
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:],
365                                    allinc())),
366             })
367
368     if GetOS() != 'Darwin':
369         env.ParseConfig('pkg-config sqlite3 --libs --cflags')
370
371 if not GetOption('clean') and not GetOption('help'):
372     DoConfigure()
373
374 #
375 #==============================compile==============================
376 #
377 #env.Command('src/pinyin/quanpin_trie.h', 'python/pinyin_data.py',
378 #            './pinyin_data.py > /dev/null', chdir = 'python')
379 #env.Object(slmsource)
380
381 #SConscript(['build/SConscript'], exports='env')
382
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)
388 lib = None
389
390 if GetOS() != 'Darwin':
391     lib = env.SharedLibrary(libname, SHLIBSUFFIX='', source=imesource,
392                             parse_flags='-Wl,-soname=%s' % libname_soname)
393 else:
394     # TODO: add install_name on Darwin?
395     lib = env.SharedLibrary('sunpinyin', source=imesource)
396
397 #env.Command('rawlm', 'build/tslmpack',
398 #            '$MAKE -C raw WGET="$WGET" TAR="$TAR"')
399
400 #env.Command('lm', 'rawlm',
401 #            '$MAKE -C data WGET="$WGET" TAR="$TAR"')
402
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"')
408
409 def DoInstall():
410     lib_target = None
411     if GetOS() == 'Darwin':
412         lib_target = env.Install(libdir, lib)
413     else:
414         lib_target_bin = env.Install(libdir, lib)
415         # where does it goes
416         install_path = os.path.dirname(str(lib_target_bin[0]))
417         lib_target = [
418             lib_target_bin,
419             env.InstallAsSymlink(os.path.join(install_path, libname_soname),
420                                  lib_target_bin),
421             env.InstallAsSymlink(os.path.join(install_path, libname_link),
422                                  lib_target_bin),
423             ]
424
425     lib_pkgconfig_target = env.Install(os.path.join(libdir, 'pkgconfig'),
426                                        ['sunpinyin-2.0.pc'])
427     libdata_target = env.Install(libdatadir,
428                                  ['data/lm_sc.t3g',
429                                   'data/pydict_sc.bin'])
430     header_targets = []
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')
437
438 DoInstall()
439 env.Alias('install', ['install-lib', 'install-libdata', 'install-headers'])