Remove printf added for debugging
[geany-mirror.git] / wscript
blob9216141b1c3751c4a84e1508e9ab6b9cf2ed87c4
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' % dir, 'data/templates/*')
522 bld.install_files('${DATADIR}/%s/templates/files' % dir, 'data/templates/files/*.*')
523 bld.install_as('${DATADIR}/%s/GPL-2' % dir, 'COPYING')
524 # Icons
525 bld.install_files('${PREFIX}/share/icons'
526 if is_win32 else '${DATADIR}/icons/hicolor/16x16/apps', 'icons/16x16/*.png')
527 if not is_win32:
528 bld.install_files('${DATADIR}/icons/hicolor/48x48/apps', 'icons/48x48/*.png')
529 bld.install_files('${DATADIR}/icons/hicolor/scalable/apps', 'icons/scalable/*.svg')
532 @taskgen
533 @feature('intltool_po')
534 def write_linguas_file(self):
535 linguas = ''
536 if 'LINGUAS' in Build.bld.env:
537 files = Build.bld.env['LINGUAS']
538 for po_filename in files.split(' '):
539 if os.path.exists('po/%s.po' % po_filename):
540 linguas += '%s ' % po_filename
541 else:
542 files = os.listdir('%s/po' % self.path.abspath())
543 files.sort()
544 for f in files:
545 if f.endswith('.po'):
546 linguas += '%s ' % f[:-3]
547 f = open("po/LINGUAS", "w")
548 f.write('# This file is autogenerated. Do not edit.\n%s\n' % linguas)
549 f.close()
552 def shutdown():
553 is_win32 = False if not Build.bld else target_is_win32(Build.bld.env)
554 # the following code was taken from midori's WAF script, thanks
555 if not is_win32 and not Options.options.destdir and (Options.commands['install'] or \
556 Options.commands['uninstall']):
557 dir = Build.bld.get_install_path('${DATADIR}/icons/hicolor')
558 icon_cache_updated = False
559 try:
560 Utils.exec_command('gtk-update-icon-cache -q -f -t %s' % dir)
561 Utils.pprint('GREEN', 'GTK icon cache updated.')
562 icon_cache_updated = True
563 except:
564 Utils.pprint('YELLOW', 'Failed to update icon cache for %s.' % dir)
565 if not icon_cache_updated:
566 print 'Icon cache not updated. After install, run this:'
567 print 'gtk-update-icon-cache -q -f -t %s' % dir
569 if Options.options.apidoc:
570 doxyfile = os.path.join(Build.bld.srcnode.abspath(Build.bld.env), 'doc', 'Doxyfile')
571 cmd = Configure.find_program_impl(Build.bld.env, 'doxygen')
572 if cmd:
573 os.chdir('doc')
574 ret = launch('%s %s' % (cmd, doxyfile), 'Generating API reference documentation')
575 else:
576 Utils.pprint('RED',
577 'doxygen could not be found. Please install the doxygen package.')
578 sys.exit(1)
580 if Options.options.htmldoc or Options.options.hackingdoc:
581 # first try rst2html.py as it is the upstream default, fall back to rst2html
582 cmd = Configure.find_program_impl(Build.bld.env, 'rst2html.py')
583 if not cmd:
584 cmd = Configure.find_program_impl(Build.bld.env, 'rst2html')
585 if cmd:
586 if Options.options.hackingdoc:
587 file_in = '../HACKING'
588 file_out = 'hacking.html'
589 msg = 'HACKING HTML'
590 else:
591 file_in = 'geany.txt'
592 file_out = 'geany.html'
593 msg = 'HTML'
594 os.chdir('doc')
595 ret = launch(cmd + ' -stg --stylesheet=geany.css %s %s' % (file_in, file_out),
596 'Generating %s documentation' % msg)
597 else:
598 Utils.pprint('RED',
599 'rst2html.py could not be found. Please install the Python docutils package.')
600 sys.exit(1)
602 if Options.options.update_po:
603 # the following code was taken from midori's WAF script, thanks
604 os.chdir('%s/po' % srcdir)
605 try:
606 try:
607 size_old = os.stat('geany.pot').st_size
608 except:
609 size_old = 0
610 Utils.exec_command('intltool-update --pot -g %s' % APPNAME)
611 size_new = os.stat('geany.pot').st_size
612 if size_new != size_old:
613 Utils.pprint('CYAN', 'Updated POT file.')
614 launch('intltool-update -r -g %s' % APPNAME, 'Updating translations', 'CYAN')
615 else:
616 Utils.pprint('CYAN', 'POT file is up to date.')
617 except:
618 Utils.pprint('RED', 'Failed to generate pot file.')
619 os.chdir('..')
622 # Simple function to execute a command and print its exit status
623 def launch(command, status, success_color='GREEN'):
624 ret = 0
625 Utils.pprint(success_color, status)
626 try:
627 ret = Utils.exec_command(command)
628 except OSError, e:
629 ret = 1
630 print str(e), ":", command
631 except:
632 ret = 1
634 if ret != 0:
635 Utils.pprint('RED', status + ' failed')
637 return ret
640 def print_message(conf, msg, result, color = 'GREEN'):
641 conf.check_message_1(msg)
642 conf.check_message_2(result, color)
645 def uc_first(s, is_win32):
646 if is_win32:
647 return s.title()
648 return s
651 def target_is_win32(env):
652 if sys.platform == 'win32':
653 return True
654 if env and 'CC' in env:
655 cc = env['CC']
656 if not isinstance(cc, str):
657 cc = ''.join(cc)
658 return cc.find('mingw') != -1
659 return False