Fix not destroying 'Make Custom Target' input dialog after first
[geany-mirror.git] / wscript
blob63e28930d6f93fcdfd82ac05441346f9a2c11574
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 conf_get_svn_rev():
122 # try GIT
123 if os.path.exists('.git'):
124 cmds = [ 'git svn find-rev HEAD 2>/dev/null',
125 'git svn find-rev origin/trunk 2>/dev/null',
126 'git svn find-rev trunk 2>/dev/null',
127 'git svn find-rev master 2>/dev/null' ]
128 for c in cmds:
129 try:
130 stdout = Utils.cmd_output(c)
131 if stdout:
132 return stdout.strip()
133 except:
134 pass
135 # try SVN
136 elif os.path.exists('.svn'):
137 try:
138 _env = None if is_win32 else {'LANG' : 'C'}
139 stdout = Utils.cmd_output(cmd='svn info --non-interactive', silent=True, env=_env)
140 lines = stdout.splitlines(True)
141 for line in lines:
142 if line.startswith('Last Changed Rev'):
143 key, value = line.split(': ', 1)
144 return value.strip()
145 except:
146 pass
147 else:
148 pass
149 return '-1'
151 def conf_define_from_opt(define_name, opt_name, default_value, quote=1):
152 if opt_name:
153 if isinstance(opt_name, bool):
154 opt_name = 1
155 conf.define(define_name, opt_name, quote)
156 elif default_value:
157 conf.define(define_name, default_value, quote)
160 conf.check_tool('compiler_cc')
161 is_win32 = target_is_win32(conf.env)
163 conf.check(header_name='fcntl.h')
164 conf.check(header_name='fnmatch.h')
165 conf.check(header_name='glob.h')
166 conf.check(header_name='sys/time.h')
167 conf.check(header_name='sys/types.h')
168 conf.check(header_name='sys/stat.h')
169 conf.define('HAVE_STDLIB_H', 1) # are there systems without stdlib.h?
170 conf.define('STDC_HEADERS', 1) # an optimistic guess ;-)
172 if Options.options.gnu_regex:
173 conf.define('HAVE_REGCOMP', 1, 0)
174 conf.define('USE_INCLUDED_REGEX', 1, 0)
175 else:
176 conf.check(header_name='regex.h')
177 if conf.env['HAVE_REGEX_H'] == 1:
178 conf.check(function_name='regcomp', header_name='regex.h')
179 # fallback to included regex lib
180 if conf.env['HAVE_REGCOMP'] != 1 or conf.env['HAVE_REGEX_H'] != 1:
181 conf.define('HAVE_REGCOMP', 1, 0)
182 conf.define('USE_INCLUDED_REGEX', 1, 0)
183 Utils.pprint('YELLOW', 'Using included GNU regex library.')
185 conf.check(function_name='fgetpos', header_name='stdio.h')
186 conf.check(function_name='ftruncate', header_name='unistd.h')
187 conf.check(function_name='gethostname', header_name='unistd.h')
188 conf.check(function_name='mkstemp', header_name='stdlib.h')
189 conf.check(function_name='strstr', header_name='string.h', mandatory=True)
191 # check for cxx after the header and function checks have been done to ensure they are
192 # checked with cc not cxx
193 conf.check_tool('compiler_cxx misc')
194 if is_win32:
195 conf.check_tool('winres')
196 # we don't require intltool on Windows (it would require Perl) though it works well
197 try:
198 conf.check_tool('intltool')
199 if 'LINGUAS' in os.environ:
200 conf.env['LINGUAS'] = os.environ['LINGUAS']
201 except:
202 pass
205 # GTK / GIO version check
206 conf.check_cfg(package='gtk+-2.0', atleast_version='2.8.0', uselib_store='GTK',
207 mandatory=True, args='--cflags --libs')
208 have_gtk_210 = False
209 gtk_version = conf.check_cfg(modversion='gtk+-2.0', uselib_store='GTK')
210 if gtk_version:
211 if version.LooseVersion(gtk_version) >= version.LooseVersion('2.10.0'):
212 have_gtk_210 = True
213 else:
214 gtk_version = 'Unknown'
215 conf.check_cfg(package='gio-2.0', uselib_store='GIO', args='--cflags --libs', mandatory=False)
217 # Windows specials
218 if is_win32:
219 if conf.env['PREFIX'] == tempfile.gettempdir():
220 # overwrite default prefix on Windows (tempfile.gettempdir() is the Waf default)
221 conf.define('PREFIX', os.path.join(conf.srcdir, '%s-%s' % (APPNAME, VERSION)), 1)
222 conf.define('DOCDIR', os.path.join(conf.env['PREFIX'], 'doc'), 1)
223 conf.define('LOCALEDIR', os.path.join(conf.env['PREFIX'], 'share\locale'), 1)
224 conf.define('LIBDIR', conf.env['PREFIX'], 1)
225 # DATADIR is defined in objidl.h, so we remove it from config.h but keep it in env
226 conf.undefine('DATADIR')
227 conf.env['DATADIR'] = os.path.join(conf.env['PREFIX'], 'data')
228 # hack: we add the parent directory of the first include directory as this is missing in
229 # list returned from pkg-config
230 conf.env['CPPPATH_GTK'].insert(0, os.path.dirname(conf.env['CPPPATH_GTK'][0]))
231 # we don't need -fPIC when compiling on or for Windows
232 if '-fPIC' in conf.env['shlib_CCFLAGS']:
233 conf.env['shlib_CCFLAGS'].remove('-fPIC')
234 if '-fPIC' in conf.env['CXXFLAGS']:
235 conf.env['CXXFLAGS'].remove('-fPIC')
236 conf.env.append_value('program_LINKFLAGS', '-mwindows')
237 conf.env.append_value('LIB_WIN32', [ 'wsock32', 'uuid', 'ole32', 'iberty' ])
238 conf.env['shlib_PATTERN'] = '%s.dll'
239 conf.env['program_PATTERN'] = '%s.exe'
240 else:
241 conf.env['shlib_PATTERN'] = '%s.so'
242 conf_define_from_opt('DOCDIR', Options.options.docdir,
243 os.path.join(conf.env['DATADIR'], 'doc/geany'))
244 conf_define_from_opt('LIBDIR', Options.options.libdir,
245 os.path.join(conf.env['PREFIX'], 'lib'))
246 conf_define_from_opt('MANDIR', Options.options.mandir,
247 os.path.join(conf.env['DATADIR'], 'man'))
249 svn_rev = conf_get_svn_rev()
250 conf.define('ENABLE_NLS', 1)
251 conf.define('GEANY_LOCALEDIR', '' if is_win32 else conf.env['LOCALEDIR'], 1)
252 conf.define('GEANY_DATADIR', 'data' if is_win32 else conf.env['DATADIR'], 1)
253 conf.define('GEANY_DOCDIR', conf.env['DOCDIR'], 1)
254 conf.define('GEANY_LIBDIR', '' if is_win32 else conf.env['LIBDIR'], 1)
255 conf.define('GEANY_PREFIX', '' if is_win32 else conf.env['PREFIX'], 1)
256 conf.define('PACKAGE', APPNAME, 1)
257 conf.define('VERSION', VERSION, 1)
258 conf.define('REVISION', svn_rev, 1)
260 conf.define('GETTEXT_PACKAGE', APPNAME, 1)
262 conf_define_from_opt('HAVE_PLUGINS', not Options.options.no_plugins, None, 0)
263 conf_define_from_opt('HAVE_SOCKET', not Options.options.no_socket, None, 0)
264 conf_define_from_opt('HAVE_VTE', not Options.options.no_vte, None, 0)
266 conf.write_config_header('config.h')
268 Utils.pprint('BLUE', 'Summary:')
269 print_message(conf, 'Install Geany ' + VERSION + ' in', conf.env['PREFIX'])
270 print_message(conf, 'Using GTK version', gtk_version)
271 print_message(conf, 'Build with GTK printing support', have_gtk_210 and 'yes' or 'no')
272 print_message(conf, 'Build with plugin support', Options.options.no_plugins and 'no' or 'yes')
273 print_message(conf, 'Use virtual terminal support', Options.options.no_vte and 'no' or 'yes')
274 if svn_rev != '-1':
275 print_message(conf, 'Compiling Subversion revision', svn_rev)
276 conf.env.append_value('CCFLAGS', '-g -DGEANY_DEBUG'.split())
278 conf.env.append_value('CCFLAGS', '-DHAVE_CONFIG_H')
279 # for now define GEANY_PRIVATE for all files, even though it should just be for src/*.
280 conf.env.append_value('CCFLAGS', '-DGEANY_PRIVATE')
281 # Scintilla flags
282 conf.env.append_value('CXXFLAGS',
283 '-DNDEBUG -DGTK -DGTK2 -DSCI_LEXER -DG_THREADS_IMPL_NONE'.split())
286 def set_options(opt):
287 opt.tool_options('compiler_cc')
288 opt.tool_options('compiler_cxx')
289 opt.tool_options('intltool')
291 if 'configure' in sys.argv:
292 # Features
293 opt.add_option('--disable-plugins', action='store_true', default=False,
294 help='compile without plugin support [default: No]', dest='no_plugins')
295 opt.add_option('--disable-socket', action='store_true', default=False,
296 help='compile without support to detect a running instance [[default: No]',
297 dest='no_socket')
298 opt.add_option('--disable-vte', action='store_true', default=target_is_win32(os.environ),
299 help='compile without support for an embedded virtual terminal [[default: No]',
300 dest='no_vte')
301 opt.add_option('--enable-gnu-regex', action='store_true', default=False,
302 help='compile with included GNU regex library [default: No]', dest='gnu_regex')
303 # Paths
304 opt.add_option('--mandir', type='string', default='',
305 help='man documentation', dest='mandir')
306 opt.add_option('--docdir', type='string', default='',
307 help='documentation root', dest='docdir')
308 opt.add_option('--libdir', type='string', default='',
309 help='object code libraries', dest='libdir')
310 # Actions
311 opt.add_option('--htmldoc', action='store_true', default=False,
312 help='generate HTML documentation', dest='htmldoc')
313 opt.add_option('--hackingdoc', action='store_true', default=False,
314 help='generate HTML documentation from HACKING file', dest='hackingdoc')
315 opt.add_option('--apidoc', action='store_true', default=False,
316 help='generate API reference documentation', dest='apidoc')
317 opt.add_option('--update-po', action='store_true', default=False,
318 help='update the message catalogs for translation', dest='update_po')
321 def build(bld):
322 is_win32 = target_is_win32(bld.env)
324 def build_plugin(plugin_name, install = True):
325 if install:
326 instpath = '${PREFIX}/lib' if is_win32 else '${LIBDIR}/geany/'
327 else:
328 instpath = None
330 bld.new_task_gen(
331 features = 'cc cshlib',
332 source = 'plugins/' + plugin_name + '.c',
333 includes = '. plugins/ src/ scintilla/include tagmanager/include',
334 target = plugin_name,
335 uselib = 'GTK',
336 install_path = instpath
340 # Tagmanager
341 if bld.env['USE_INCLUDED_REGEX'] == 1:
342 tagmanager_sources.append('tagmanager/regex.c')
343 bld.new_task_gen(
344 features = 'cc cstaticlib',
345 source = tagmanager_sources,
346 name = 'tagmanager',
347 target = 'tagmanager',
348 includes = '. tagmanager/ tagmanager/include/',
349 uselib = 'GTK',
350 install_path = None # do not install this library
353 # Scintilla
354 bld.new_task_gen(
355 features = 'cc cxx cstaticlib',
356 name = 'scintilla',
357 target = 'scintilla',
358 source = scintilla_sources,
359 includes = 'scintilla/ scintilla/include/',
360 uselib = 'GTK',
361 install_path = None, # do not install this library
364 # Geany
365 if bld.env['HAVE_VTE'] == 1:
366 geany_sources.append('src/vte.c')
367 if is_win32:
368 geany_sources.append('src/win32.c')
370 bld.new_task_gen(
371 features = 'cc cxx cprogram',
372 name = 'geany',
373 target = 'geany',
374 source = geany_sources,
375 includes = '. src/ scintilla/include/ tagmanager/include/',
376 uselib = 'GTK GIO WIN32',
377 uselib_local = 'scintilla tagmanager',
378 add_objects = 'geany-rc' if is_win32 else None
381 # geanyfunctions.h
382 bld.new_task_gen(
383 source = 'plugins/genapi.py src/plugins.c',
384 name = 'geanyfunctions.h',
385 before = 'cc cxx',
386 cwd = '%s/plugins' % bld.path.abspath(),
387 rule = 'python genapi.py -q'
390 # Plugins
391 if bld.env['HAVE_PLUGINS'] == 1:
392 build_plugin('classbuilder')
393 build_plugin('demoplugin', False)
394 build_plugin('export')
395 build_plugin('filebrowser')
396 build_plugin('htmlchars')
397 build_plugin('saveactions')
398 build_plugin('splitwindow', not is_win32)
400 # Translations
401 if bld.env['INTLTOOL']:
402 bld.new_task_gen(
403 features = 'intltool_po',
404 podir = 'po',
405 install_path = '${LOCALEDIR}',
406 appname = 'geany'
409 # geany.pc
410 bld.new_task_gen(
411 features = 'subst',
412 source = 'geany.pc.in',
413 target = 'geany.pc',
414 dict = { 'VERSION' : VERSION,
415 'prefix': bld.env['PREFIX'],
416 'exec_prefix': '${prefix}',
417 'libdir': '${exec_prefix}/lib',
418 'includedir': '${prefix}/include',
419 'datarootdir': '${prefix}/share',
420 'datadir': '${datarootdir}',
421 'localedir': '${datarootdir}/locale' },
422 install_path = None if is_win32 else '${LIBDIR}/pkgconfig'
425 if not is_win32:
426 # geany.desktop
427 if bld.env['INTLTOOL']:
428 bld.new_task_gen(
429 features = 'intltool_in',
430 source = 'geany.desktop.in',
431 flags = [ '-d', '-q', '-u', '-c' ],
432 install_path = '${DATADIR}/applications'
435 # geany.1
436 bld.new_task_gen(
437 features = 'subst',
438 source = 'doc/geany.1.in',
439 target = 'geany.1',
440 dict = { 'VERSION' : VERSION,
441 'GEANY_DATA_DIR': bld.env['DATADIR'] + '/geany' },
442 install_path = '${MANDIR}/man1'
445 # geany.spec
446 bld.new_task_gen(
447 features = 'subst',
448 source = 'geany.spec.in',
449 target = 'geany.spec',
450 install_path = None,
451 dict = { 'VERSION' : VERSION }
454 # Doxyfile
455 bld.new_task_gen(
456 features = 'subst',
457 source = 'doc/Doxyfile.in',
458 target = 'doc/Doxyfile',
459 install_path = None,
460 dict = { 'VERSION' : VERSION }
462 else:
463 bld.new_task_gen(
464 features = 'cc',
465 name = 'geany-rc',
466 source = 'geany_private.rc'
470 # Install files
472 if not is_win32:
473 # Headers
474 bld.install_files('${PREFIX}/include/geany', '''
475 src/document.h src/editor.h src/encodings.h src/filetypes.h src/geany.h
476 src/highlighting.h src/keybindings.h src/msgwindow.h src/plugindata.h
477 src/prefs.h src/project.h src/search.h src/support.h
478 src/templates.h src/toolbar.h src/ui_utils.h src/utils.h
479 plugins/geanyplugin.h plugins/geanyfunctions.h''')
480 bld.install_files('${PREFIX}/include/geany/scintilla', '''
481 scintilla/include/SciLexer.h scintilla/include/Scintilla.h
482 scintilla/include/Scintilla.iface scintilla/include/ScintillaWidget.h ''')
483 bld.install_files('${PREFIX}/include/geany/tagmanager', '''
484 tagmanager/include/tm_file_entry.h tagmanager/include/tm_project.h
485 tagmanager/include/tm_source_file.h
486 tagmanager/include/tm_symbol.h tagmanager/include/tm_tag.h
487 tagmanager/include/tm_tagmanager.h tagmanager/include/tm_work_object.h
488 tagmanager/include/tm_workspace.h ''')
489 # Docs
490 base_dir = '${PREFIX}' if is_win32 else '${DOCDIR}'
491 ext = '.txt' if is_win32 else ''
492 html_dir = '' if is_win32 else 'html/'
493 html_name = 'Manual.html' if is_win32 else 'index.html'
494 for f in 'AUTHORS ChangeLog COPYING README NEWS THANKS TODO'.split():
495 bld.install_as("%s/%s%s" % (base_dir, uc_first(f, is_win32), ext), f)
496 bld.install_files('${DOCDIR}/%simages' % html_dir, 'doc/images/*.png')
497 bld.install_as('${DOCDIR}/%s' % uc_first('manual.txt', is_win32), 'doc/geany.txt')
498 bld.install_as('${DOCDIR}/%s%s' % (html_dir, html_name), 'doc/geany.html')
499 bld.install_as('${DOCDIR}/ScintillaLicense.txt', 'scintilla/License.txt')
500 if is_win32:
501 bld.install_as('${DOCDIR}/ReadMe.I18n.txt', 'README.I18N')
502 bld.install_as('${DOCDIR}/Hacking.txt', 'HACKING')
503 # Data
504 dir = '' if is_win32 else 'geany'
505 bld.install_files('${DATADIR}/%s' % dir, 'data/filetype*')
506 bld.install_files('${DATADIR}/%s' % dir, 'data/*.tags')
507 bld.install_files('${DATADIR}/%s' % dir, 'data/snippets.conf')
508 bld.install_files('${DATADIR}/%s' % dir, 'data/ui_toolbar.xml')
509 bld.install_files('${DATADIR}/%s/templates/files' % dir, 'data/templates/files/*.*')
510 bld.install_as('${DATADIR}/%s/GPL-2' % dir, 'COPYING')
511 # Icons
512 bld.install_files('${PREFIX}/share/icons'
513 if is_win32 else '${DATADIR}/icons/hicolor/16x16/apps', 'icons/16x16/*.png')
514 if not is_win32:
515 bld.install_files('${DATADIR}/icons/hicolor/48x48/apps', 'icons/48x48/*.png')
516 bld.install_files('${DATADIR}/icons/hicolor/scalable/apps', 'icons/scalable/*.svg')
519 @taskgen
520 @feature('intltool_po')
521 def write_linguas_file(self):
522 linguas = ''
523 if 'LINGUAS' in Build.bld.env:
524 files = Build.bld.env['LINGUAS']
525 for po_filename in files.split(' '):
526 if os.path.exists ('po/%s.po' % po_filename):
527 linguas += '%s ' % po_filename
528 else:
529 files = os.listdir('%s/po' % self.path.abspath())
530 files.sort()
531 for f in files:
532 if f.endswith('.po'):
533 linguas += '%s ' % f[:-3]
534 f = open("po/LINGUAS", "w")
535 f.write('# This file is autogenerated. Do not edit.\n%s\n' % linguas)
536 f.close()
539 def shutdown():
540 is_win32 = False if not Build.bld else target_is_win32(Build.bld.env)
541 # the following code was taken from midori's WAF script, thanks
542 if not is_win32 and not Options.options.destdir and (Options.commands['install'] or \
543 Options.commands['uninstall']):
544 dir = Build.bld.get_install_path('${DATADIR}/icons/hicolor')
545 icon_cache_updated = False
546 try:
547 Utils.exec_command('gtk-update-icon-cache -q -f -t %s' % dir)
548 Utils.pprint('GREEN', 'GTK icon cache updated.')
549 icon_cache_updated = True
550 except:
551 Utils.pprint('YELLOW', 'Failed to update icon cache for %s.' % dir)
552 if not icon_cache_updated:
553 print 'Icon cache not updated. After install, run this:'
554 print 'gtk-update-icon-cache -q -f -t %s' % dir
556 if Options.options.apidoc:
557 doxyfile = os.path.join(Build.bld.srcnode.abspath(Build.bld.env), 'doc', 'Doxyfile')
558 cmd = Configure.find_program_impl(Build.bld.env, 'doxygen')
559 if cmd:
560 os.chdir('doc')
561 ret = launch('%s %s' % (cmd, doxyfile), 'Generating API reference documentation')
562 else:
563 Utils.pprint('RED',
564 'doxygen could not be found. Please install the doxygen package.')
565 sys.exit(1)
567 if Options.options.htmldoc or Options.options.hackingdoc:
568 # first try rst2html.py as it is the upstream default, fall back to rst2html
569 cmd = Configure.find_program_impl(Build.bld.env, 'rst2html.py')
570 if not cmd:
571 cmd = Configure.find_program_impl(Build.bld.env, 'rst2html')
572 if cmd:
573 if Options.options.hackingdoc:
574 file_in = '../HACKING'
575 file_out = 'hacking.html'
576 msg = 'HACKING HTML'
577 else:
578 file_in = 'geany.txt'
579 file_out = 'geany.html'
580 msg = 'HTML'
581 os.chdir('doc')
582 ret = launch(cmd + ' -stg --stylesheet=geany.css %s %s' % (file_in, file_out),
583 'Generating %s documentation' % msg)
584 else:
585 Utils.pprint('RED',
586 'rst2html.py could not be found. Please install the Python docutils package.')
587 sys.exit(1)
589 if Options.options.update_po:
590 # the following code was taken from midori's WAF script, thanks
591 os.chdir('%s/po' % srcdir)
592 try:
593 try:
594 size_old = os.stat('geany.pot').st_size
595 except:
596 size_old = 0
597 Utils.exec_command('intltool-update --pot -g %s' % APPNAME)
598 size_new = os.stat('geany.pot').st_size
599 if size_new != size_old:
600 Utils.pprint('CYAN', 'Updated POT file.')
601 launch('intltool-update -r -g %s' % APPNAME, 'Updating translations', 'CYAN')
602 else:
603 Utils.pprint('CYAN', 'POT file is up to date.')
604 except:
605 Utils.pprint('RED', 'Failed to generate pot file.')
606 os.chdir('..')
609 # Simple function to execute a command and print its exit status
610 def launch(command, status, success_color='GREEN'):
611 ret = 0
612 Utils.pprint(success_color, status)
613 try:
614 ret = Utils.exec_command(command)
615 except OSError, e:
616 ret = 1
617 print str(e), ":", command
618 except:
619 ret = 1
621 if ret != 0:
622 Utils.pprint('RED', status + ' failed')
624 return ret
627 def print_message(conf, msg, result, color = 'GREEN'):
628 conf.check_message_1(msg)
629 conf.check_message_2(result, color)
632 def uc_first(s, is_win32):
633 if is_win32:
634 return s.title()
635 return s
638 def target_is_win32(env):
639 if sys.platform == 'win32':
640 return True
641 if env and 'CC' in env:
642 cc = env['CC']
643 if not isinstance(cc, str):
644 cc = ''.join(cc)
645 return cc.find('mingw') != -1
646 return False