Beep if the user hasn't entered a class name on pressing OK.
[geany-mirror.git] / wscript
blobd43331fb9c07272d7ae51056b5c5f96d1a3172dc
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/LexCrontab.cxx', '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:
210 pass
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 # for now define GEANY_PRIVATE for all files, even though it should just be for src/*.
288 conf.env.append_value('CCFLAGS', '-DGEANY_PRIVATE')
289 # Scintilla flags
290 conf.env.append_value('CXXFLAGS',
291 '-DNDEBUG -DGTK -DGTK2 -DSCI_LEXER -DG_THREADS_IMPL_NONE'.split())
294 def set_options(opt):
295 opt.tool_options('compiler_cc')
296 opt.tool_options('compiler_cxx')
297 opt.tool_options('intltool')
299 if 'configure' in sys.argv:
300 # Features
301 opt.add_option('--disable-plugins', action='store_true', default=False,
302 help='compile without plugin support [default: No]', dest='no_plugins')
303 opt.add_option('--disable-socket', action='store_true', default=False,
304 help='compile without support to detect a running instance [[default: No]',
305 dest='no_socket')
306 opt.add_option('--disable-vte', action='store_true', default=target_is_win32(os.environ),
307 help='compile without support for an embedded virtual terminal [[default: No]',
308 dest='no_vte')
309 opt.add_option('--enable-gnu-regex', action='store_true', default=False,
310 help='compile with included GNU regex library [default: No]', dest='gnu_regex')
311 # Paths
312 opt.add_option('--mandir', type='string', default='',
313 help='man documentation', dest='mandir')
314 opt.add_option('--docdir', type='string', default='',
315 help='documentation root', dest='docdir')
316 opt.add_option('--libdir', type='string', default='',
317 help='object code libraries', dest='libdir')
318 # Actions
319 opt.add_option('--htmldoc', action='store_true', default=False,
320 help='generate HTML documentation', dest='htmldoc')
321 opt.add_option('--hackingdoc', action='store_true', default=False,
322 help='generate HTML documentation from HACKING file', dest='hackingdoc')
323 opt.add_option('--apidoc', action='store_true', default=False,
324 help='generate API reference documentation', dest='apidoc')
325 opt.add_option('--update-po', action='store_true', default=False,
326 help='update the message catalogs for translation', dest='update_po')
329 def build(bld):
330 is_win32 = target_is_win32(bld.env)
332 def build_plugin(plugin_name, install = True):
333 if install:
334 instpath = '${PREFIX}/lib' if is_win32 else '${LIBDIR}/geany/'
335 else:
336 instpath = None
338 bld.new_task_gen(
339 features = 'cc cshlib',
340 source = 'plugins/' + plugin_name + '.c',
341 includes = '. plugins/ src/ scintilla/include tagmanager/include',
342 target = plugin_name,
343 uselib = 'GTK',
344 install_path = instpath
348 # Tagmanager
349 if bld.env['USE_INCLUDED_REGEX'] == 1:
350 tagmanager_sources.append('tagmanager/regex.c')
351 bld.new_task_gen(
352 features = 'cc cstaticlib',
353 source = tagmanager_sources,
354 name = 'tagmanager',
355 target = 'tagmanager',
356 includes = '. tagmanager/ tagmanager/include/',
357 uselib = 'GTK',
358 install_path = None # do not install this library
361 # Scintilla
362 bld.new_task_gen(
363 features = 'cc cxx cstaticlib',
364 name = 'scintilla',
365 target = 'scintilla',
366 source = scintilla_sources,
367 includes = 'scintilla/ scintilla/include/',
368 uselib = 'GTK',
369 install_path = None, # do not install this library
372 # Geany
373 if bld.env['HAVE_VTE'] == 1:
374 geany_sources.append('src/vte.c')
375 if is_win32:
376 geany_sources.append('src/win32.c')
378 bld.new_task_gen(
379 features = 'cc cxx cprogram',
380 name = 'geany',
381 target = 'geany',
382 source = geany_sources,
383 includes = '. src/ scintilla/include/ tagmanager/include/',
384 uselib = 'GTK GIO WIN32',
385 uselib_local = 'scintilla tagmanager',
386 add_objects = 'geany-rc' if is_win32 else None
389 # geanyfunctions.h
390 bld.new_task_gen(
391 source = 'plugins/genapi.py src/plugins.c',
392 name = 'geanyfunctions.h',
393 before = 'cc cxx',
394 cwd = '%s/plugins' % bld.path.abspath(),
395 rule = 'python genapi.py -q'
398 # Plugins
399 if bld.env['HAVE_PLUGINS'] == 1:
400 build_plugin('classbuilder')
401 build_plugin('demoplugin', False)
402 build_plugin('export')
403 build_plugin('filebrowser')
404 build_plugin('htmlchars')
405 build_plugin('saveactions')
406 build_plugin('splitwindow', not is_win32)
408 # Translations
409 if bld.env['INTLTOOL']:
410 bld.new_task_gen(
411 features = 'intltool_po',
412 podir = 'po',
413 install_path = '${LOCALEDIR}',
414 appname = 'geany'
417 # geany.pc
418 bld.new_task_gen(
419 features = 'subst',
420 source = 'geany.pc.in',
421 target = 'geany.pc',
422 dict = { 'VERSION' : VERSION,
423 'prefix': bld.env['PREFIX'],
424 'exec_prefix': '${prefix}',
425 'libdir': '${exec_prefix}/lib',
426 'includedir': '${prefix}/include',
427 'datarootdir': '${prefix}/share',
428 'datadir': '${datarootdir}',
429 'localedir': '${datarootdir}/locale' },
430 install_path = None if is_win32 else '${LIBDIR}/pkgconfig'
433 if not is_win32:
434 # geany.desktop
435 if bld.env['INTLTOOL']:
436 bld.new_task_gen(
437 features = 'intltool_in',
438 source = 'geany.desktop.in',
439 flags = [ '-d', '-q', '-u', '-c' ],
440 install_path = '${DATADIR}/applications'
443 # geany.1
444 bld.new_task_gen(
445 features = 'subst',
446 source = 'doc/geany.1.in',
447 target = 'geany.1',
448 dict = { 'VERSION' : VERSION,
449 'GEANY_DATA_DIR': bld.env['DATADIR'] + '/geany' },
450 install_path = '${MANDIR}/man1'
453 # geany.spec
454 bld.new_task_gen(
455 features = 'subst',
456 source = 'geany.spec.in',
457 target = 'geany.spec',
458 install_path = None,
459 dict = { 'VERSION' : VERSION }
462 # Doxyfile
463 bld.new_task_gen(
464 features = 'subst',
465 source = 'doc/Doxyfile.in',
466 target = 'doc/Doxyfile',
467 install_path = None,
468 dict = { 'VERSION' : VERSION }
470 else:
471 bld.new_task_gen(
472 features = 'cc',
473 name = 'geany-rc',
474 source = 'geany_private.rc'
478 # Install files
480 if not is_win32:
481 # Headers
482 bld.install_files('${PREFIX}/include/geany', '''
483 src/document.h src/editor.h src/encodings.h src/filetypes.h src/geany.h
484 src/highlighting.h src/keybindings.h src/msgwindow.h src/plugindata.h
485 src/prefs.h src/project.h src/search.h src/stash.h src/support.h
486 src/templates.h src/toolbar.h src/ui_utils.h src/utils.h
487 plugins/geanyplugin.h plugins/geanyfunctions.h''')
488 bld.install_files('${PREFIX}/include/geany/scintilla', '''
489 scintilla/include/SciLexer.h scintilla/include/Scintilla.h
490 scintilla/include/Scintilla.iface scintilla/include/ScintillaWidget.h ''')
491 bld.install_files('${PREFIX}/include/geany/tagmanager', '''
492 tagmanager/include/tm_file_entry.h tagmanager/include/tm_project.h
493 tagmanager/include/tm_source_file.h
494 tagmanager/include/tm_symbol.h tagmanager/include/tm_tag.h
495 tagmanager/include/tm_tagmanager.h tagmanager/include/tm_work_object.h
496 tagmanager/include/tm_workspace.h ''')
497 # Docs
498 base_dir = '${PREFIX}' if is_win32 else '${DOCDIR}'
499 ext = '.txt' if is_win32 else ''
500 html_dir = '' if is_win32 else 'html/'
501 html_name = 'Manual.html' if is_win32 else 'index.html'
502 for f in 'AUTHORS ChangeLog COPYING README NEWS THANKS TODO'.split():
503 bld.install_as("%s/%s%s" % (base_dir, uc_first(f, is_win32), ext), f)
504 bld.install_files('${DOCDIR}/%simages' % html_dir, 'doc/images/*.png')
505 bld.install_as('${DOCDIR}/%s' % uc_first('manual.txt', is_win32), 'doc/geany.txt')
506 bld.install_as('${DOCDIR}/%s%s' % (html_dir, html_name), 'doc/geany.html')
507 bld.install_as('${DOCDIR}/ScintillaLicense.txt', 'scintilla/License.txt')
508 if is_win32:
509 bld.install_as('${DOCDIR}/ReadMe.I18n.txt', 'README.I18N')
510 bld.install_as('${DOCDIR}/Hacking.txt', 'HACKING')
511 # Data
512 dir = '' if is_win32 else 'geany'
513 bld.install_files('${DATADIR}/%s' % dir, 'data/filetype*')
514 bld.install_files('${DATADIR}/%s' % dir, 'data/*.tags')
515 bld.install_files('${DATADIR}/%s' % dir, 'data/snippets.conf')
516 bld.install_files('${DATADIR}/%s' % dir, 'data/ui_toolbar.xml')
517 bld.install_files('${DATADIR}/%s/templates/files' % dir, 'data/templates/files/*.*')
518 bld.install_as('${DATADIR}/%s/GPL-2' % dir, 'COPYING')
519 # Icons
520 bld.install_files('${PREFIX}/share/icons'
521 if is_win32 else '${DATADIR}/icons/hicolor/16x16/apps', 'icons/16x16/*.png')
522 if not is_win32:
523 bld.install_files('${DATADIR}/icons/hicolor/48x48/apps', 'icons/48x48/*.png')
524 bld.install_files('${DATADIR}/icons/hicolor/scalable/apps', 'icons/scalable/*.svg')
527 @taskgen
528 @feature('intltool_po')
529 def write_linguas_file(self):
530 linguas = ''
531 if 'LINGUAS' in Build.bld.env:
532 files = Build.bld.env['LINGUAS']
533 for po_filename in files.split(' '):
534 if os.path.exists ('po/%s.po' % po_filename):
535 linguas += '%s ' % po_filename
536 else:
537 files = os.listdir('%s/po' % self.path.abspath())
538 files.sort()
539 for f in files:
540 if f.endswith('.po'):
541 linguas += '%s ' % f[:-3]
542 f = open("po/LINGUAS", "w")
543 f.write('# This file is autogenerated. Do not edit.\n%s\n' % linguas)
544 f.close()
547 def shutdown():
548 is_win32 = False if not Build.bld else target_is_win32(Build.bld.env)
549 # the following code was taken from midori's WAF script, thanks
550 if not is_win32 and not Options.options.destdir and (Options.commands['install'] or \
551 Options.commands['uninstall']):
552 dir = Build.bld.get_install_path('${DATADIR}/icons/hicolor')
553 icon_cache_updated = False
554 try:
555 Utils.exec_command('gtk-update-icon-cache -q -f -t %s' % dir)
556 Utils.pprint('GREEN', 'GTK icon cache updated.')
557 icon_cache_updated = True
558 except:
559 Utils.pprint('YELLOW', 'Failed to update icon cache for %s.' % dir)
560 if not icon_cache_updated:
561 print 'Icon cache not updated. After install, run this:'
562 print 'gtk-update-icon-cache -q -f -t %s' % dir
564 if Options.options.apidoc:
565 doxyfile = os.path.join(Build.bld.srcnode.abspath(Build.bld.env), 'doc', 'Doxyfile')
566 cmd = Configure.find_program_impl(Build.bld.env, 'doxygen')
567 if cmd:
568 os.chdir('doc')
569 ret = launch('%s %s' % (cmd, doxyfile), 'Generating API reference documentation')
570 else:
571 Utils.pprint('RED',
572 'doxygen could not be found. Please install the doxygen package.')
573 sys.exit(1)
575 if Options.options.htmldoc or Options.options.hackingdoc:
576 # first try rst2html.py as it is the upstream default, fall back to rst2html
577 cmd = Configure.find_program_impl(Build.bld.env, 'rst2html.py')
578 if not cmd:
579 cmd = Configure.find_program_impl(Build.bld.env, 'rst2html')
580 if cmd:
581 if Options.options.hackingdoc:
582 file_in = '../HACKING'
583 file_out = 'hacking.html'
584 msg = 'HACKING HTML'
585 else:
586 file_in = 'geany.txt'
587 file_out = 'geany.html'
588 msg = 'HTML'
589 os.chdir('doc')
590 ret = launch(cmd + ' -stg --stylesheet=geany.css %s %s' % (file_in, file_out),
591 'Generating %s documentation' % msg)
592 else:
593 Utils.pprint('RED',
594 'rst2html.py could not be found. Please install the Python docutils package.')
595 sys.exit(1)
597 if Options.options.update_po:
598 # the following code was taken from midori's WAF script, thanks
599 os.chdir('%s/po' % srcdir)
600 try:
601 try:
602 size_old = os.stat('geany.pot').st_size
603 except:
604 size_old = 0
605 Utils.exec_command('intltool-update --pot -g %s' % APPNAME)
606 size_new = os.stat('geany.pot').st_size
607 if size_new != size_old:
608 Utils.pprint('CYAN', 'Updated POT file.')
609 launch('intltool-update -r -g %s' % APPNAME, 'Updating translations', 'CYAN')
610 else:
611 Utils.pprint('CYAN', 'POT file is up to date.')
612 except:
613 Utils.pprint('RED', 'Failed to generate pot file.')
614 os.chdir('..')
617 # Simple function to execute a command and print its exit status
618 def launch(command, status, success_color='GREEN'):
619 ret = 0
620 Utils.pprint(success_color, status)
621 try:
622 ret = Utils.exec_command(command)
623 except OSError, e:
624 ret = 1
625 print str(e), ":", command
626 except:
627 ret = 1
629 if ret != 0:
630 Utils.pprint('RED', status + ' failed')
632 return ret
635 def print_message(conf, msg, result, color = 'GREEN'):
636 conf.check_message_1(msg)
637 conf.check_message_2(result, color)
640 def uc_first(s, is_win32):
641 if is_win32:
642 return s.title()
643 return s
646 def target_is_win32(env):
647 if sys.platform == 'win32':
648 return True
649 if env and 'CC' in env:
650 cc = env['CC']
651 if not isinstance(cc, str):
652 cc = ''.join(cc)
653 return cc.find('mingw') != -1
654 return False