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' ]
121 def conf_get_svn_rev():
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' ]
130 stdout
= Utils
.cmd_output(c
)
132 return stdout
.strip()
136 elif os
.path
.exists('.svn'):
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)
142 if line
.startswith('Last Changed Rev'):
143 key
, value
= line
.split(': ', 1)
151 def conf_define_from_opt(define_name
, opt_name
, default_value
, quote
=1):
153 if isinstance(opt_name
, bool):
155 conf
.define(define_name
, opt_name
, quote
)
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)
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')
195 conf
.check_tool('winres')
196 # we don't require intltool on Windows (it would require Perl) though it works well
198 conf
.check_tool('intltool')
199 if 'LINGUAS' in os
.environ
:
200 conf
.env
['LINGUAS'] = os
.environ
['LINGUAS']
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')
209 gtk_version
= conf
.check_cfg(modversion
='gtk+-2.0', uselib_store
='GTK')
211 if version
.LooseVersion(gtk_version
) >= version
.LooseVersion('2.10.0'):
214 gtk_version
= 'Unknown'
215 conf
.check_cfg(package
='gio-2.0', uselib_store
='GIO', args
='--cflags --libs', mandatory
=False)
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'
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')
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')
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
:
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]',
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]',
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')
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')
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')
322 is_win32
= target_is_win32(bld
.env
)
324 def build_plugin(plugin_name
, install
= True):
326 instpath
= '${PREFIX}/lib' if is_win32
else '${LIBDIR}/geany/'
331 features
= 'cc cshlib',
332 source
= 'plugins/' + plugin_name
+ '.c',
333 includes
= '. plugins/ src/ scintilla/include tagmanager/include',
334 target
= plugin_name
,
336 install_path
= instpath
341 if bld
.env
['USE_INCLUDED_REGEX'] == 1:
342 tagmanager_sources
.append('tagmanager/regex.c')
344 features
= 'cc cstaticlib',
345 source
= tagmanager_sources
,
347 target
= 'tagmanager',
348 includes
= '. tagmanager/ tagmanager/include/',
350 install_path
= None # do not install this library
355 features
= 'cc cxx cstaticlib',
357 target
= 'scintilla',
358 source
= scintilla_sources
,
359 includes
= 'scintilla/ scintilla/include/',
361 install_path
= None, # do not install this library
365 if bld
.env
['HAVE_VTE'] == 1:
366 geany_sources
.append('src/vte.c')
368 geany_sources
.append('src/win32.c')
371 features
= 'cc cxx cprogram',
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
383 source
= 'plugins/genapi.py src/plugins.c',
384 name
= 'geanyfunctions.h',
386 cwd
= '%s/plugins' % bld
.path
.abspath(),
387 rule
= 'python genapi.py -q'
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
)
401 if bld
.env
['INTLTOOL']:
403 features
= 'intltool_po',
405 install_path
= '${LOCALEDIR}',
412 source
= 'geany.pc.in',
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'
427 if bld
.env
['INTLTOOL']:
429 features
= 'intltool_in',
430 source
= 'geany.desktop.in',
431 flags
= [ '-d', '-q', '-u', '-c' ],
432 install_path
= '${DATADIR}/applications'
438 source
= 'doc/geany.1.in',
440 dict = { 'VERSION' : VERSION
,
441 'GEANY_DATA_DIR': bld
.env
['DATADIR'] + '/geany' },
442 install_path
= '${MANDIR}/man1'
448 source
= 'geany.spec.in',
449 target
= 'geany.spec',
451 dict = { 'VERSION' : VERSION
}
457 source
= 'doc/Doxyfile.in',
458 target
= 'doc/Doxyfile',
460 dict = { 'VERSION' : VERSION
}
466 source
= 'geany_private.rc'
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 ''')
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')
501 bld
.install_as('${DOCDIR}/ReadMe.I18n.txt', 'README.I18N')
502 bld
.install_as('${DOCDIR}/Hacking.txt', 'HACKING')
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')
512 bld
.install_files('${PREFIX}/share/icons'
513 if is_win32
else '${DATADIR}/icons/hicolor/16x16/apps', 'icons/16x16/*.png')
515 bld
.install_files('${DATADIR}/icons/hicolor/48x48/apps', 'icons/48x48/*.png')
516 bld
.install_files('${DATADIR}/icons/hicolor/scalable/apps', 'icons/scalable/*.svg')
520 @feature('intltool_po')
521 def write_linguas_file(self
):
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
529 files
= os
.listdir('%s/po' % self
.path
.abspath())
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
)
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
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
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')
561 ret
= launch('%s %s' % (cmd
, doxyfile
), 'Generating API reference documentation')
564 'doxygen could not be found. Please install the doxygen package.')
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')
571 cmd
= Configure
.find_program_impl(Build
.bld
.env
, 'rst2html')
573 if Options
.options
.hackingdoc
:
574 file_in
= '../HACKING'
575 file_out
= 'hacking.html'
578 file_in
= 'geany.txt'
579 file_out
= 'geany.html'
582 ret
= launch(cmd
+ ' -stg --stylesheet=geany.css %s %s' % (file_in
, file_out
),
583 'Generating %s documentation' % msg
)
586 'rst2html.py could not be found. Please install the Python docutils package.')
589 if Options
.options
.update_po
:
590 # the following code was taken from midori's WAF script, thanks
591 os
.chdir('%s/po' % srcdir
)
594 size_old
= os
.stat('geany.pot').st_size
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')
603 Utils
.pprint('CYAN', 'POT file is up to date.')
605 Utils
.pprint('RED', 'Failed to generate pot file.')
609 # Simple function to execute a command and print its exit status
610 def launch(command
, status
, success_color
='GREEN'):
612 Utils
.pprint(success_color
, status
)
614 ret
= Utils
.exec_command(command
)
617 print str(e
), ":", command
622 Utils
.pprint('RED', status
+ ' failed')
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
):
638 def target_is_win32(env
):
639 if sys
.platform
== 'win32':
641 if env
and 'CC' in env
:
643 if not isinstance(cc
, str):
645 return cc
.find('mingw') != -1