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.
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)
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).
53 from distutils
import version
54 from TaskGen
import taskgen
, feature
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' ]
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',
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' ]
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',
115 'src/templates.c', 'src/toolbar.c', 'src/tools.c', 'src/sidebar.c',
116 'src/ui_utils.c', 'src/utils.c' ]
122 cmd
= 'git ls-files >/dev/null 2>&1'
123 return (Utils
.exec_command(cmd
) == 0)
126 return os
.path
.exists('.svn')
128 def conf_get_svn_rev():
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'
138 stdout
= Utils
.cmd_output(c
)
140 return stdout
.strip()
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)
150 if line
.startswith('Last Changed Rev'):
151 key
, value
= line
.split(': ', 1)
159 def conf_define_from_opt(define_name
, opt_name
, default_value
, quote
=1):
161 if isinstance(opt_name
, bool):
163 conf
.define(define_name
, opt_name
, quote
)
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)
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')
203 conf
.check_tool('winres')
204 # we don't require intltool on Windows (it would require Perl) though it works well
206 conf
.check_tool('intltool')
207 if 'LINGUAS' in os
.environ
:
208 conf
.env
['LINGUAS'] = os
.environ
['LINGUAS']
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')
217 gtk_version
= conf
.check_cfg(modversion
='gtk+-2.0', uselib_store
='GTK')
219 if version
.LooseVersion(gtk_version
) >= version
.LooseVersion('2.10.0'):
222 gtk_version
= 'Unknown'
223 conf
.check_cfg(package
='gio-2.0', uselib_store
='GIO', args
='--cflags --libs', mandatory
=False)
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'
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')
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')
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
:
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]',
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]',
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')
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')
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')
330 is_win32
= target_is_win32(bld
.env
)
332 def build_plugin(plugin_name
, install
= True):
334 instpath
= '${PREFIX}/lib' if is_win32
else '${LIBDIR}/geany/'
339 features
= 'cc cshlib',
340 source
= 'plugins/' + plugin_name
+ '.c',
341 includes
= '. plugins/ src/ scintilla/include tagmanager/include',
342 target
= plugin_name
,
344 install_path
= instpath
349 if bld
.env
['USE_INCLUDED_REGEX'] == 1:
350 tagmanager_sources
.append('tagmanager/regex.c')
352 features
= 'cc cstaticlib',
353 source
= tagmanager_sources
,
355 target
= 'tagmanager',
356 includes
= '. tagmanager/ tagmanager/include/',
358 install_path
= None # do not install this library
363 features
= 'cc cxx cstaticlib',
365 target
= 'scintilla',
366 source
= scintilla_sources
,
367 includes
= 'scintilla/ scintilla/include/',
369 install_path
= None, # do not install this library
373 if bld
.env
['HAVE_VTE'] == 1:
374 geany_sources
.append('src/vte.c')
376 geany_sources
.append('src/win32.c')
379 features
= 'cc cxx cprogram',
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
391 source
= 'plugins/genapi.py src/plugins.c',
392 name
= 'geanyfunctions.h',
394 cwd
= '%s/plugins' % bld
.path
.abspath(),
395 rule
= 'python genapi.py -q'
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
)
409 if bld
.env
['INTLTOOL']:
411 features
= 'intltool_po',
413 install_path
= '${LOCALEDIR}',
420 source
= 'geany.pc.in',
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'
435 if bld
.env
['INTLTOOL']:
437 features
= 'intltool_in',
438 source
= 'geany.desktop.in',
439 flags
= [ '-d', '-q', '-u', '-c' ],
440 install_path
= '${DATADIR}/applications'
446 source
= 'doc/geany.1.in',
448 dict = { 'VERSION' : VERSION
,
449 'GEANY_DATA_DIR': bld
.env
['DATADIR'] + '/geany' },
450 install_path
= '${MANDIR}/man1'
456 source
= 'geany.spec.in',
457 target
= 'geany.spec',
459 dict = { 'VERSION' : VERSION
}
465 source
= 'doc/Doxyfile.in',
466 target
= 'doc/Doxyfile',
468 dict = { 'VERSION' : VERSION
}
474 source
= 'geany_private.rc'
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 ''')
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')
509 bld
.install_as('${DOCDIR}/ReadMe.I18n.txt', 'README.I18N')
510 bld
.install_as('${DOCDIR}/Hacking.txt', 'HACKING')
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')
520 bld
.install_files('${PREFIX}/share/icons'
521 if is_win32
else '${DATADIR}/icons/hicolor/16x16/apps', 'icons/16x16/*.png')
523 bld
.install_files('${DATADIR}/icons/hicolor/48x48/apps', 'icons/48x48/*.png')
524 bld
.install_files('${DATADIR}/icons/hicolor/scalable/apps', 'icons/scalable/*.svg')
528 @feature('intltool_po')
529 def write_linguas_file(self
):
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
537 files
= os
.listdir('%s/po' % self
.path
.abspath())
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
)
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
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
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')
569 ret
= launch('%s %s' % (cmd
, doxyfile
), 'Generating API reference documentation')
572 'doxygen could not be found. Please install the doxygen package.')
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')
579 cmd
= Configure
.find_program_impl(Build
.bld
.env
, 'rst2html')
581 if Options
.options
.hackingdoc
:
582 file_in
= '../HACKING'
583 file_out
= 'hacking.html'
586 file_in
= 'geany.txt'
587 file_out
= 'geany.html'
590 ret
= launch(cmd
+ ' -stg --stylesheet=geany.css %s %s' % (file_in
, file_out
),
591 'Generating %s documentation' % msg
)
594 'rst2html.py could not be found. Please install the Python docutils package.')
597 if Options
.options
.update_po
:
598 # the following code was taken from midori's WAF script, thanks
599 os
.chdir('%s/po' % srcdir
)
602 size_old
= os
.stat('geany.pot').st_size
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')
611 Utils
.pprint('CYAN', 'POT file is up to date.')
613 Utils
.pprint('RED', 'Failed to generate pot file.')
617 # Simple function to execute a command and print its exit status
618 def launch(command
, status
, success_color
='GREEN'):
620 Utils
.pprint(success_color
, status
)
622 ret
= Utils
.exec_command(command
)
625 print str(e
), ":", command
630 Utils
.pprint('RED', status
+ ' failed')
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
):
646 def target_is_win32(env
):
647 if sys
.platform
== 'win32':
649 if env
and 'CC' in env
:
651 if not isinstance(cc
, str):
653 return cc
.find('mingw') != -1