r5081
[geany-mirror.git] / wscript
bloba8abf054f82f8646d391a6d96927b3b474a1b4e0
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
4 # WAF build script - this file is part of Geany, a fast and lightweight IDE
6 # Copyright 2008-2010 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
7 # Copyright 2008-2010 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
9 # This program is free software; you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation; either version 2 of the License, or
12 # (at your option) any later version.
14 # This program is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 # GNU General Public License for more details.
19 # You should have received a copy of the GNU General Public License
20 # along with this program; if not, write to the Free Software
21 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23 # $Id$
25 """
26 This is a WAF build script (http://code.google.com/p/waf/).
27 It can be used as an alternative build system to autotools
28 for Geany. It does not (yet) cover all of the autotools tests and
29 configure options but all important things are working.
30 "make dist" should be done with autotools, most other targets and
31 functions should work better (regarding performance and flexibility)
32 or at least equally.
34 Missing features: --enable-binreloc, make targets: dist, pdf (in doc/)
35 Known issues: Dependency handling is buggy, e.g. if src/document.h is
36 changed, depending source files are not rebuilt (maybe Waf bug).
38 The code of this file itself loosely follows PEP 8 with some exceptions
39 (line width 100 characters and some other minor things).
41 Requires WAF 1.5.7 and Python 2.4 (or later).
42 """
45 import Build
46 import Configure
47 import Options
48 import Utils
49 import sys
50 import os
51 import shutil
52 import tempfile
53 from distutils import version
54 from TaskGen import taskgen, feature
57 APPNAME = 'geany'
58 VERSION = '0.19'
60 srcdir = '.'
61 blddir = '_build_'
64 tagmanager_sources = [
65 'tagmanager/args.c', 'tagmanager/abc.c', 'tagmanager/actionscript.c', 'tagmanager/asm.c',
66 'tagmanager/basic.c', 'tagmanager/c.c',
67 'tagmanager/conf.c', 'tagmanager/css.c', 'tagmanager/ctags.c', 'tagmanager/diff.c',
68 'tagmanager/docbook.c', 'tagmanager/entry.c', 'tagmanager/fortran.c', 'tagmanager/get.c',
69 'tagmanager/haskell.c', 'tagmanager/haxe.c', 'tagmanager/html.c', 'tagmanager/js.c',
70 'tagmanager/keyword.c', 'tagmanager/latex.c', 'tagmanager/lregex.c', 'tagmanager/lua.c',
71 'tagmanager/make.c', 'tagmanager/markdown.c', 'tagmanager/matlab.c', 'tagmanager/nsis.c',
72 'tagmanager/nestlevel.c', 'tagmanager/options.c',
73 'tagmanager/parse.c', 'tagmanager/pascal.c', 'tagmanager/r.c',
74 'tagmanager/perl.c', 'tagmanager/php.c', 'tagmanager/python.c', 'tagmanager/read.c',
75 'tagmanager/rest.c', 'tagmanager/ruby.c', 'tagmanager/sh.c', 'tagmanager/sort.c',
76 'tagmanager/sql.c', 'tagmanager/strlist.c', 'tagmanager/txt2tags.c', 'tagmanager/tcl.c',
77 'tagmanager/tm_file_entry.c',
78 'tagmanager/tm_project.c', 'tagmanager/tm_source_file.c', 'tagmanager/tm_symbol.c',
79 'tagmanager/tm_tag.c', 'tagmanager/tm_tagmanager.c', 'tagmanager/tm_work_object.c',
80 'tagmanager/tm_workspace.c', 'tagmanager/vhdl.c', 'tagmanager/verilog.c', 'tagmanager/vstring.c' ]
82 scintilla_sources = [
83 'scintilla/AutoComplete.cxx', 'scintilla/CallTip.cxx', 'scintilla/CellBuffer.cxx',
84 'scintilla/CharClassify.cxx', 'scintilla/ContractionState.cxx', 'scintilla/Decoration.cxx',
85 'scintilla/DocumentAccessor.cxx', 'scintilla/Document.cxx', 'scintilla/Editor.cxx',
86 'scintilla/ExternalLexer.cxx', 'scintilla/Indicator.cxx', 'scintilla/KeyMap.cxx',
87 'scintilla/KeyWords.cxx',
88 'scintilla/LexAda.cxx', 'scintilla/LexAsm.cxx', 'scintilla/LexBash.cxx',
89 'scintilla/LexBasic.cxx', 'scintilla/LexCaml.cxx', 'scintilla/LexCmake.cxx', 'scintilla/LexCPP.cxx',
90 'scintilla/LexCSS.cxx', 'scintilla/LexD.cxx',
91 'scintilla/LexFortran.cxx', 'scintilla/LexHaskell.cxx', 'scintilla/LexHTML.cxx',
92 'scintilla/LexLua.cxx', 'scintilla/LexMarkdown.cxx', 'scintilla/LexMatlab.cxx',
93 'scintilla/LexNsis.cxx', 'scintilla/LexOthers.cxx',
94 'scintilla/LexPascal.cxx', 'scintilla/LexPerl.cxx', 'scintilla/LexPython.cxx',
95 'scintilla/LexR.cxx',
96 'scintilla/LexRuby.cxx', 'scintilla/LexSQL.cxx', 'scintilla/LexTCL.cxx',
97 'scintilla/LexVHDL.cxx', 'scintilla/LexVerilog.cxx', 'scintilla/LexYAML.cxx',
98 'scintilla/LineMarker.cxx', 'scintilla/PerLine.cxx',
99 'scintilla/PlatGTK.cxx',
100 'scintilla/PositionCache.cxx', 'scintilla/PropSet.cxx', 'scintilla/RESearch.cxx',
101 'scintilla/RunStyles.cxx', 'scintilla/ScintillaBase.cxx', 'scintilla/ScintillaGTK.cxx',
102 'scintilla/scintilla-marshal.c', 'scintilla/Selection.cxx', 'scintilla/StyleContext.cxx', 'scintilla/Style.cxx',
103 'scintilla/UniConversion.cxx', 'scintilla/ViewStyle.cxx', 'scintilla/WindowAccessor.cxx',
104 'scintilla/XPM.cxx' ]
106 geany_sources = [
107 'src/about.c', 'src/build.c', 'src/callbacks.c', 'src/dialogs.c', 'src/document.c',
108 'src/editor.c', 'src/encodings.c', 'src/filetypes.c', 'src/geanyentryaction.c',
109 'src/geanymenubuttonaction.c', 'src/geanyobject.c', 'src/geanywraplabel.c',
110 'src/highlighting.c', 'src/interface.c', 'src/keybindings.c',
111 'src/keyfile.c', 'src/log.c', 'src/main.c', 'src/msgwindow.c', 'src/navqueue.c', 'src/notebook.c',
112 'src/plugins.c', 'src/pluginutils.c', 'src/prefix.c', 'src/prefs.c', 'src/printing.c', 'src/project.c',
113 'src/sciwrappers.c', 'src/search.c', 'src/socket.c', 'src/stash.c',
114 'src/symbols.c',
115 'src/templates.c', 'src/toolbar.c', 'src/tools.c', 'src/sidebar.c',
116 'src/ui_utils.c', 'src/utils.c' ]
120 def configure(conf):
121 def in_git():
122 cmd = 'git ls-files >/dev/null 2>&1'
123 return (Utils.exec_command(cmd) == 0)
125 def in_svn():
126 return os.path.exists('.svn')
128 def conf_get_svn_rev():
129 # try GIT
130 if in_git():
131 cmds = [ 'git svn find-rev HEAD 2>/dev/null',
132 'git svn find-rev origin/trunk 2>/dev/null',
133 'git svn find-rev trunk 2>/dev/null',
134 'git svn find-rev master 2>/dev/null'
136 for c in cmds:
137 try:
138 stdout = Utils.cmd_output(c)
139 if stdout:
140 return stdout.strip()
141 except:
142 pass
143 # try SVN
144 elif in_svn():
145 try:
146 _env = None if is_win32 else {'LANG' : 'C'}
147 stdout = Utils.cmd_output(cmd='svn info --non-interactive', silent=True, env=_env)
148 lines = stdout.splitlines(True)
149 for line in lines:
150 if line.startswith('Last Changed Rev'):
151 key, value = line.split(': ', 1)
152 return value.strip()
153 except:
154 pass
155 else:
156 pass
157 return '-1'
159 def conf_define_from_opt(define_name, opt_name, default_value, quote=1):
160 if opt_name:
161 if isinstance(opt_name, bool):
162 opt_name = 1
163 conf.define(define_name, opt_name, quote)
164 elif default_value:
165 conf.define(define_name, default_value, quote)
168 conf.check_tool('compiler_cc')
169 is_win32 = target_is_win32(conf.env)
171 conf.check(header_name='fcntl.h')
172 conf.check(header_name='fnmatch.h')
173 conf.check(header_name='glob.h')
174 conf.check(header_name='sys/time.h')
175 conf.check(header_name='sys/types.h')
176 conf.check(header_name='sys/stat.h')
177 conf.define('HAVE_STDLIB_H', 1) # are there systems without stdlib.h?
178 conf.define('STDC_HEADERS', 1) # an optimistic guess ;-)
180 if Options.options.gnu_regex:
181 conf.define('HAVE_REGCOMP', 1, 0)
182 conf.define('USE_INCLUDED_REGEX', 1, 0)
183 else:
184 conf.check(header_name='regex.h')
185 if conf.env['HAVE_REGEX_H'] == 1:
186 conf.check(function_name='regcomp', header_name='regex.h')
187 # fallback to included regex lib
188 if conf.env['HAVE_REGCOMP'] != 1 or conf.env['HAVE_REGEX_H'] != 1:
189 conf.define('HAVE_REGCOMP', 1, 0)
190 conf.define('USE_INCLUDED_REGEX', 1, 0)
191 Utils.pprint('YELLOW', 'Using included GNU regex library.')
193 conf.check(function_name='fgetpos', header_name='stdio.h')
194 conf.check(function_name='ftruncate', header_name='unistd.h')
195 conf.check(function_name='gethostname', header_name='unistd.h')
196 conf.check(function_name='mkstemp', header_name='stdlib.h')
197 conf.check(function_name='strstr', header_name='string.h', mandatory=True)
199 # check for cxx after the header and function checks have been done to ensure they are
200 # checked with cc not cxx
201 conf.check_tool('compiler_cxx misc')
202 if is_win32:
203 conf.check_tool('winres')
204 # we don't require intltool on Windows (it would require Perl) though it works well
205 try:
206 conf.check_tool('intltool')
207 if 'LINGUAS' in os.environ:
208 conf.env['LINGUAS'] = os.environ['LINGUAS']
209 except Configure.ConfigurationError:
210 if not is_win32:
211 raise
213 # GTK / GIO version check
214 conf.check_cfg(package='gtk+-2.0', atleast_version='2.8.0', uselib_store='GTK',
215 mandatory=True, args='--cflags --libs')
216 have_gtk_210 = False
217 gtk_version = conf.check_cfg(modversion='gtk+-2.0', uselib_store='GTK')
218 if gtk_version:
219 if version.LooseVersion(gtk_version) >= version.LooseVersion('2.10.0'):
220 have_gtk_210 = True
221 else:
222 gtk_version = 'Unknown'
223 conf.check_cfg(package='gio-2.0', uselib_store='GIO', args='--cflags --libs', mandatory=False)
225 # Windows specials
226 if is_win32:
227 if conf.env['PREFIX'] == tempfile.gettempdir():
228 # overwrite default prefix on Windows (tempfile.gettempdir() is the Waf default)
229 conf.define('PREFIX', os.path.join(conf.srcdir, '%s-%s' % (APPNAME, VERSION)), 1)
230 conf.define('DOCDIR', os.path.join(conf.env['PREFIX'], 'doc'), 1)
231 conf.define('LOCALEDIR', os.path.join(conf.env['PREFIX'], 'share\locale'), 1)
232 conf.define('LIBDIR', conf.env['PREFIX'], 1)
233 # DATADIR is defined in objidl.h, so we remove it from config.h but keep it in env
234 conf.undefine('DATADIR')
235 conf.env['DATADIR'] = os.path.join(conf.env['PREFIX'], 'data')
236 # hack: we add the parent directory of the first include directory as this is missing in
237 # list returned from pkg-config
238 conf.env['CPPPATH_GTK'].insert(0, os.path.dirname(conf.env['CPPPATH_GTK'][0]))
239 # we don't need -fPIC when compiling on or for Windows
240 if '-fPIC' in conf.env['shlib_CCFLAGS']:
241 conf.env['shlib_CCFLAGS'].remove('-fPIC')
242 if '-fPIC' in conf.env['CXXFLAGS']:
243 conf.env['CXXFLAGS'].remove('-fPIC')
244 conf.env.append_value('program_LINKFLAGS', '-mwindows')
245 conf.env.append_value('LIB_WIN32', [ 'wsock32', 'uuid', 'ole32', 'iberty' ])
246 conf.env['shlib_PATTERN'] = '%s.dll'
247 conf.env['program_PATTERN'] = '%s.exe'
248 else:
249 conf.env['shlib_PATTERN'] = '%s.so'
250 conf_define_from_opt('DOCDIR', Options.options.docdir,
251 os.path.join(conf.env['DATADIR'], 'doc/geany'))
252 conf_define_from_opt('LIBDIR', Options.options.libdir,
253 os.path.join(conf.env['PREFIX'], 'lib'))
254 conf_define_from_opt('MANDIR', Options.options.mandir,
255 os.path.join(conf.env['DATADIR'], 'man'))
257 svn_rev = conf_get_svn_rev()
258 conf.define('ENABLE_NLS', 1)
259 conf.define('GEANY_LOCALEDIR', '' if is_win32 else conf.env['LOCALEDIR'], 1)
260 conf.define('GEANY_DATADIR', 'data' if is_win32 else conf.env['DATADIR'], 1)
261 conf.define('GEANY_DOCDIR', conf.env['DOCDIR'], 1)
262 conf.define('GEANY_LIBDIR', '' if is_win32 else conf.env['LIBDIR'], 1)
263 conf.define('GEANY_PREFIX', '' if is_win32 else conf.env['PREFIX'], 1)
264 conf.define('PACKAGE', APPNAME, 1)
265 conf.define('VERSION', VERSION, 1)
266 conf.define('REVISION', svn_rev, 1)
268 conf.define('GETTEXT_PACKAGE', APPNAME, 1)
270 conf_define_from_opt('HAVE_PLUGINS', not Options.options.no_plugins, None, 0)
271 conf_define_from_opt('HAVE_SOCKET', not Options.options.no_socket, None, 0)
272 conf_define_from_opt('HAVE_VTE', not Options.options.no_vte, None, 0)
274 conf.write_config_header('config.h')
276 Utils.pprint('BLUE', 'Summary:')
277 print_message(conf, 'Install Geany ' + VERSION + ' in', conf.env['PREFIX'])
278 print_message(conf, 'Using GTK version', gtk_version)
279 print_message(conf, 'Build with GTK printing support', have_gtk_210 and 'yes' or 'no')
280 print_message(conf, 'Build with plugin support', Options.options.no_plugins and 'no' or 'yes')
281 print_message(conf, 'Use virtual terminal support', Options.options.no_vte and 'no' or 'yes')
282 if svn_rev != '-1':
283 print_message(conf, 'Compiling Subversion revision', svn_rev)
284 conf.env.append_value('CCFLAGS', '-g -DGEANY_DEBUG'.split())
286 conf.env.append_value('CCFLAGS', '-DHAVE_CONFIG_H')
287 conf.env.append_value('CCFLAGS', '-DGTK') # Scintilla needs this
288 # for now define GEANY_PRIVATE for all files, even though it should just be for src/*.
289 conf.env.append_value('CCFLAGS', '-DGEANY_PRIVATE')
290 # Scintilla flags
291 conf.env.append_value('CXXFLAGS',
292 '-DNDEBUG -DGTK -DGTK2 -DSCI_LEXER -DG_THREADS_IMPL_NONE'.split())
295 def set_options(opt):
296 opt.tool_options('compiler_cc')
297 opt.tool_options('compiler_cxx')
298 opt.tool_options('intltool')
300 if 'configure' in sys.argv:
301 # Features
302 opt.add_option('--disable-plugins', action='store_true', default=False,
303 help='compile without plugin support [default: No]', dest='no_plugins')
304 opt.add_option('--disable-socket', action='store_true', default=False,
305 help='compile without support to detect a running instance [[default: No]',
306 dest='no_socket')
307 opt.add_option('--disable-vte', action='store_true', default=target_is_win32(os.environ),
308 help='compile without support for an embedded virtual terminal [[default: No]',
309 dest='no_vte')
310 opt.add_option('--enable-gnu-regex', action='store_true', default=False,
311 help='compile with included GNU regex library [default: No]', dest='gnu_regex')
312 # Paths
313 opt.add_option('--mandir', type='string', default='',
314 help='man documentation', dest='mandir')
315 opt.add_option('--docdir', type='string', default='',
316 help='documentation root', dest='docdir')
317 opt.add_option('--libdir', type='string', default='',
318 help='object code libraries', dest='libdir')
319 # Actions
320 opt.add_option('--htmldoc', action='store_true', default=False,
321 help='generate HTML documentation', dest='htmldoc')
322 opt.add_option('--hackingdoc', action='store_true', default=False,
323 help='generate HTML documentation from HACKING file', dest='hackingdoc')
324 opt.add_option('--apidoc', action='store_true', default=False,
325 help='generate API reference documentation', dest='apidoc')
326 opt.add_option('--update-po', action='store_true', default=False,
327 help='update the message catalogs for translation', dest='update_po')
330 def build(bld):
331 is_win32 = target_is_win32(bld.env)
333 def build_plugin(plugin_name, install = True):
334 if install:
335 instpath = '${PREFIX}/lib' if is_win32 else '${LIBDIR}/geany/'
336 else:
337 instpath = None
339 bld.new_task_gen(
340 features = 'cc cshlib',
341 source = 'plugins/' + plugin_name + '.c',
342 includes = '. plugins/ src/ scintilla/include tagmanager/include',
343 defines = 'G_LOG_DOMAIN="%s"' % plugin_name,
344 target = plugin_name,
345 uselib = 'GTK',
346 install_path = instpath
350 # Tagmanager
351 if bld.env['USE_INCLUDED_REGEX'] == 1:
352 tagmanager_sources.append('tagmanager/regex.c')
353 bld.new_task_gen(
354 features = 'cc cstaticlib',
355 source = tagmanager_sources,
356 name = 'tagmanager',
357 target = 'tagmanager',
358 includes = '. tagmanager/ tagmanager/include/',
359 defines = 'G_LOG_DOMAIN="Tagmanager"',
360 uselib = 'GTK',
361 install_path = None # do not install this library
364 # Scintilla
365 bld.new_task_gen(
366 features = 'cc cxx cstaticlib',
367 name = 'scintilla',
368 target = 'scintilla',
369 source = scintilla_sources,
370 includes = 'scintilla/ scintilla/include/',
371 uselib = 'GTK',
372 install_path = None, # do not install this library
375 # Geany
376 if bld.env['HAVE_VTE'] == 1:
377 geany_sources.append('src/vte.c')
378 if is_win32:
379 geany_sources.append('src/win32.c')
381 bld.new_task_gen(
382 features = 'cc cxx cprogram',
383 name = 'geany',
384 target = 'geany',
385 source = geany_sources,
386 includes = '. src/ scintilla/include/ tagmanager/include/',
387 defines = 'G_LOG_DOMAIN="Geany"',
388 uselib = 'GTK GIO WIN32',
389 uselib_local = 'scintilla tagmanager',
390 add_objects = 'geany-rc' if is_win32 else None
393 # geanyfunctions.h
394 bld.new_task_gen(
395 source = 'plugins/genapi.py src/plugins.c',
396 name = 'geanyfunctions.h',
397 before = 'cc cxx',
398 cwd = '%s/plugins' % bld.path.abspath(),
399 rule = 'python genapi.py -q'
402 # Plugins
403 if bld.env['HAVE_PLUGINS'] == 1:
404 build_plugin('classbuilder')
405 build_plugin('demoplugin', False)
406 build_plugin('export')
407 build_plugin('filebrowser')
408 build_plugin('htmlchars')
409 build_plugin('saveactions')
410 build_plugin('splitwindow', not is_win32)
412 # Translations
413 if bld.env['INTLTOOL']:
414 bld.new_task_gen(
415 features = 'intltool_po',
416 podir = 'po',
417 install_path = '${LOCALEDIR}',
418 appname = 'geany'
421 # geany.pc
422 bld.new_task_gen(
423 features = 'subst',
424 source = 'geany.pc.in',
425 target = 'geany.pc',
426 dict = { 'VERSION' : VERSION,
427 'prefix': bld.env['PREFIX'],
428 'exec_prefix': '${prefix}',
429 'libdir': '${exec_prefix}/lib',
430 'includedir': '${prefix}/include',
431 'datarootdir': '${prefix}/share',
432 'datadir': '${datarootdir}',
433 'localedir': '${datarootdir}/locale' },
434 install_path = None if is_win32 else '${LIBDIR}/pkgconfig'
437 if not is_win32:
438 # geany.desktop
439 if bld.env['INTLTOOL']:
440 bld.new_task_gen(
441 features = 'intltool_in',
442 source = 'geany.desktop.in',
443 flags = [ '-d', '-q', '-u', '-c' ],
444 install_path = '${DATADIR}/applications'
447 # geany.1
448 bld.new_task_gen(
449 features = 'subst',
450 source = 'doc/geany.1.in',
451 target = 'geany.1',
452 dict = { 'VERSION' : VERSION,
453 'GEANY_DATA_DIR': bld.env['DATADIR'] + '/geany' },
454 install_path = '${MANDIR}/man1'
457 # geany.spec
458 bld.new_task_gen(
459 features = 'subst',
460 source = 'geany.spec.in',
461 target = 'geany.spec',
462 install_path = None,
463 dict = { 'VERSION' : VERSION }
466 # Doxyfile
467 bld.new_task_gen(
468 features = 'subst',
469 source = 'doc/Doxyfile.in',
470 target = 'doc/Doxyfile',
471 install_path = None,
472 dict = { 'VERSION' : VERSION }
474 else:
475 bld.new_task_gen(
476 features = 'cc',
477 name = 'geany-rc',
478 source = 'geany_private.rc'
482 # Install files
484 if not is_win32:
485 # Headers
486 bld.install_files('${PREFIX}/include/geany', '''
487 src/document.h src/editor.h src/encodings.h src/filetypes.h src/geany.h
488 src/highlighting.h src/keybindings.h src/msgwindow.h src/plugindata.h
489 src/prefs.h src/project.h src/search.h src/stash.h src/support.h
490 src/templates.h src/toolbar.h src/ui_utils.h src/utils.h
491 plugins/geanyplugin.h plugins/geanyfunctions.h''')
492 bld.install_files('${PREFIX}/include/geany/scintilla', '''
493 scintilla/include/SciLexer.h scintilla/include/Scintilla.h
494 scintilla/include/Scintilla.iface scintilla/include/ScintillaWidget.h ''')
495 bld.install_files('${PREFIX}/include/geany/tagmanager', '''
496 tagmanager/include/tm_file_entry.h tagmanager/include/tm_project.h
497 tagmanager/include/tm_source_file.h
498 tagmanager/include/tm_symbol.h tagmanager/include/tm_tag.h
499 tagmanager/include/tm_tagmanager.h tagmanager/include/tm_work_object.h
500 tagmanager/include/tm_workspace.h ''')
501 # Docs
502 base_dir = '${PREFIX}' if is_win32 else '${DOCDIR}'
503 ext = '.txt' if is_win32 else ''
504 html_dir = '' if is_win32 else 'html/'
505 html_name = 'Manual.html' if is_win32 else 'index.html'
506 for f in 'AUTHORS ChangeLog COPYING README NEWS THANKS TODO'.split():
507 bld.install_as("%s/%s%s" % (base_dir, uc_first(f, is_win32), ext), f)
508 bld.install_files('${DOCDIR}/%simages' % html_dir, 'doc/images/*.png')
509 bld.install_as('${DOCDIR}/%s' % uc_first('manual.txt', is_win32), 'doc/geany.txt')
510 bld.install_as('${DOCDIR}/%s%s' % (html_dir, html_name), 'doc/geany.html')
511 bld.install_as('${DOCDIR}/ScintillaLicense.txt', 'scintilla/License.txt')
512 if is_win32:
513 bld.install_as('${DOCDIR}/ReadMe.I18n.txt', 'README.I18N')
514 bld.install_as('${DOCDIR}/Hacking.txt', 'HACKING')
515 # Data
516 dir = '' if is_win32 else 'geany'
517 bld.install_files('${DATADIR}/%s' % dir, 'data/filetype*')
518 bld.install_files('${DATADIR}/%s' % dir, 'data/*.tags')
519 bld.install_files('${DATADIR}/%s' % dir, 'data/snippets.conf')
520 bld.install_files('${DATADIR}/%s' % dir, 'data/ui_toolbar.xml')
521 bld.install_files('${DATADIR}/%s/templates/files' % dir, 'data/templates/files/*.*')
522 bld.install_as('${DATADIR}/%s/GPL-2' % dir, 'COPYING')
523 # Icons
524 bld.install_files('${PREFIX}/share/icons'
525 if is_win32 else '${DATADIR}/icons/hicolor/16x16/apps', 'icons/16x16/*.png')
526 if not is_win32:
527 bld.install_files('${DATADIR}/icons/hicolor/48x48/apps', 'icons/48x48/*.png')
528 bld.install_files('${DATADIR}/icons/hicolor/scalable/apps', 'icons/scalable/*.svg')
531 @taskgen
532 @feature('intltool_po')
533 def write_linguas_file(self):
534 linguas = ''
535 if 'LINGUAS' in Build.bld.env:
536 files = Build.bld.env['LINGUAS']
537 for po_filename in files.split(' '):
538 if os.path.exists('po/%s.po' % po_filename):
539 linguas += '%s ' % po_filename
540 else:
541 files = os.listdir('%s/po' % self.path.abspath())
542 files.sort()
543 for f in files:
544 if f.endswith('.po'):
545 linguas += '%s ' % f[:-3]
546 f = open("po/LINGUAS", "w")
547 f.write('# This file is autogenerated. Do not edit.\n%s\n' % linguas)
548 f.close()
551 def shutdown():
552 is_win32 = False if not Build.bld else target_is_win32(Build.bld.env)
553 # the following code was taken from midori's WAF script, thanks
554 if not is_win32 and not Options.options.destdir and (Options.commands['install'] or \
555 Options.commands['uninstall']):
556 dir = Build.bld.get_install_path('${DATADIR}/icons/hicolor')
557 icon_cache_updated = False
558 try:
559 Utils.exec_command('gtk-update-icon-cache -q -f -t %s' % dir)
560 Utils.pprint('GREEN', 'GTK icon cache updated.')
561 icon_cache_updated = True
562 except:
563 Utils.pprint('YELLOW', 'Failed to update icon cache for %s.' % dir)
564 if not icon_cache_updated:
565 print 'Icon cache not updated. After install, run this:'
566 print 'gtk-update-icon-cache -q -f -t %s' % dir
568 if Options.options.apidoc:
569 doxyfile = os.path.join(Build.bld.srcnode.abspath(Build.bld.env), 'doc', 'Doxyfile')
570 cmd = Configure.find_program_impl(Build.bld.env, 'doxygen')
571 if cmd:
572 os.chdir('doc')
573 ret = launch('%s %s' % (cmd, doxyfile), 'Generating API reference documentation')
574 else:
575 Utils.pprint('RED',
576 'doxygen could not be found. Please install the doxygen package.')
577 sys.exit(1)
579 if Options.options.htmldoc or Options.options.hackingdoc:
580 # first try rst2html.py as it is the upstream default, fall back to rst2html
581 cmd = Configure.find_program_impl(Build.bld.env, 'rst2html.py')
582 if not cmd:
583 cmd = Configure.find_program_impl(Build.bld.env, 'rst2html')
584 if cmd:
585 if Options.options.hackingdoc:
586 file_in = '../HACKING'
587 file_out = 'hacking.html'
588 msg = 'HACKING HTML'
589 else:
590 file_in = 'geany.txt'
591 file_out = 'geany.html'
592 msg = 'HTML'
593 os.chdir('doc')
594 ret = launch(cmd + ' -stg --stylesheet=geany.css %s %s' % (file_in, file_out),
595 'Generating %s documentation' % msg)
596 else:
597 Utils.pprint('RED',
598 'rst2html.py could not be found. Please install the Python docutils package.')
599 sys.exit(1)
601 if Options.options.update_po:
602 # the following code was taken from midori's WAF script, thanks
603 os.chdir('%s/po' % srcdir)
604 try:
605 try:
606 size_old = os.stat('geany.pot').st_size
607 except:
608 size_old = 0
609 Utils.exec_command('intltool-update --pot -g %s' % APPNAME)
610 size_new = os.stat('geany.pot').st_size
611 if size_new != size_old:
612 Utils.pprint('CYAN', 'Updated POT file.')
613 launch('intltool-update -r -g %s' % APPNAME, 'Updating translations', 'CYAN')
614 else:
615 Utils.pprint('CYAN', 'POT file is up to date.')
616 except:
617 Utils.pprint('RED', 'Failed to generate pot file.')
618 os.chdir('..')
621 # Simple function to execute a command and print its exit status
622 def launch(command, status, success_color='GREEN'):
623 ret = 0
624 Utils.pprint(success_color, status)
625 try:
626 ret = Utils.exec_command(command)
627 except OSError, e:
628 ret = 1
629 print str(e), ":", command
630 except:
631 ret = 1
633 if ret != 0:
634 Utils.pprint('RED', status + ' failed')
636 return ret
639 def print_message(conf, msg, result, color = 'GREEN'):
640 conf.check_message_1(msg)
641 conf.check_message_2(result, color)
644 def uc_first(s, is_win32):
645 if is_win32:
646 return s.title()
647 return s
650 def target_is_win32(env):
651 if sys.platform == 'win32':
652 return True
653 if env and 'CC' in env:
654 cc = env['CC']
655 if not isinstance(cc, str):
656 cc = ''.join(cc)
657 return cc.find('mingw') != -1
658 return False