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/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']
209 except Configure
.ConfigurationError
:
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 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')
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
:
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]',
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]',
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')
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')
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')
331 is_win32
= target_is_win32(bld
.env
)
333 def build_plugin(plugin_name
, install
= True):
335 instpath
= '${PREFIX}/lib' if is_win32
else '${LIBDIR}/geany/'
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
,
346 install_path
= instpath
351 if bld
.env
['USE_INCLUDED_REGEX'] == 1:
352 tagmanager_sources
.append('tagmanager/regex.c')
354 features
= 'cc cstaticlib',
355 source
= tagmanager_sources
,
357 target
= 'tagmanager',
358 includes
= '. tagmanager/ tagmanager/include/',
359 defines
= 'G_LOG_DOMAIN="Tagmanager"',
361 install_path
= None # do not install this library
366 features
= 'cc cxx cstaticlib',
368 target
= 'scintilla',
369 source
= scintilla_sources
,
370 includes
= 'scintilla/ scintilla/include/',
372 install_path
= None, # do not install this library
376 if bld
.env
['HAVE_VTE'] == 1:
377 geany_sources
.append('src/vte.c')
379 geany_sources
.append('src/win32.c')
382 features
= 'cc cxx cprogram',
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
395 source
= 'plugins/genapi.py src/plugins.c',
396 name
= 'geanyfunctions.h',
398 cwd
= '%s/plugins' % bld
.path
.abspath(),
399 rule
= 'python genapi.py -q'
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
)
413 if bld
.env
['INTLTOOL']:
415 features
= 'intltool_po',
417 install_path
= '${LOCALEDIR}',
424 source
= 'geany.pc.in',
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'
439 if bld
.env
['INTLTOOL']:
441 features
= 'intltool_in',
442 source
= 'geany.desktop.in',
443 flags
= [ '-d', '-q', '-u', '-c' ],
444 install_path
= '${DATADIR}/applications'
450 source
= 'doc/geany.1.in',
452 dict = { 'VERSION' : VERSION
,
453 'GEANY_DATA_DIR': bld
.env
['DATADIR'] + '/geany' },
454 install_path
= '${MANDIR}/man1'
460 source
= 'geany.spec.in',
461 target
= 'geany.spec',
463 dict = { 'VERSION' : VERSION
}
469 source
= 'doc/Doxyfile.in',
470 target
= 'doc/Doxyfile',
472 dict = { 'VERSION' : VERSION
}
478 source
= 'geany_private.rc'
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 ''')
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')
513 bld
.install_as('${DOCDIR}/ReadMe.I18n.txt', 'README.I18N')
514 bld
.install_as('${DOCDIR}/Hacking.txt', 'HACKING')
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/files' % dir, 'data/templates/files/*.*')
522 bld
.install_as('${DATADIR}/%s/GPL-2' % dir, 'COPYING')
524 bld
.install_files('${PREFIX}/share/icons'
525 if is_win32
else '${DATADIR}/icons/hicolor/16x16/apps', 'icons/16x16/*.png')
527 bld
.install_files('${DATADIR}/icons/hicolor/48x48/apps', 'icons/48x48/*.png')
528 bld
.install_files('${DATADIR}/icons/hicolor/scalable/apps', 'icons/scalable/*.svg')
532 @feature('intltool_po')
533 def write_linguas_file(self
):
535 if 'LINGUAS' in Build
.bld
.env
:
536 files
= Build
.bld
.env
['LINGUAS']
537 for po_filename
in files
.split(' '):
538 if os
.path
.exists('po/%s.po' % po_filename
):
539 linguas
+= '%s ' % po_filename
541 files
= os
.listdir('%s/po' % self
.path
.abspath())
544 if f
.endswith('.po'):
545 linguas
+= '%s ' % f
[:-3]
546 f
= open("po/LINGUAS", "w")
547 f
.write('# This file is autogenerated. Do not edit.\n%s\n' % linguas
)
552 is_win32
= False if not Build
.bld
else target_is_win32(Build
.bld
.env
)
553 # the following code was taken from midori's WAF script, thanks
554 if not is_win32
and not Options
.options
.destdir
and (Options
.commands
['install'] or \
555 Options
.commands
['uninstall']):
556 dir = Build
.bld
.get_install_path('${DATADIR}/icons/hicolor')
557 icon_cache_updated
= False
559 Utils
.exec_command('gtk-update-icon-cache -q -f -t %s' % dir)
560 Utils
.pprint('GREEN', 'GTK icon cache updated.')
561 icon_cache_updated
= True
563 Utils
.pprint('YELLOW', 'Failed to update icon cache for %s.' % dir)
564 if not icon_cache_updated
:
565 print 'Icon cache not updated. After install, run this:'
566 print 'gtk-update-icon-cache -q -f -t %s' % dir
568 if Options
.options
.apidoc
:
569 doxyfile
= os
.path
.join(Build
.bld
.srcnode
.abspath(Build
.bld
.env
), 'doc', 'Doxyfile')
570 cmd
= Configure
.find_program_impl(Build
.bld
.env
, 'doxygen')
573 ret
= launch('%s %s' % (cmd
, doxyfile
), 'Generating API reference documentation')
576 'doxygen could not be found. Please install the doxygen package.')
579 if Options
.options
.htmldoc
or Options
.options
.hackingdoc
:
580 # first try rst2html.py as it is the upstream default, fall back to rst2html
581 cmd
= Configure
.find_program_impl(Build
.bld
.env
, 'rst2html.py')
583 cmd
= Configure
.find_program_impl(Build
.bld
.env
, 'rst2html')
585 if Options
.options
.hackingdoc
:
586 file_in
= '../HACKING'
587 file_out
= 'hacking.html'
590 file_in
= 'geany.txt'
591 file_out
= 'geany.html'
594 ret
= launch(cmd
+ ' -stg --stylesheet=geany.css %s %s' % (file_in
, file_out
),
595 'Generating %s documentation' % msg
)
598 'rst2html.py could not be found. Please install the Python docutils package.')
601 if Options
.options
.update_po
:
602 # the following code was taken from midori's WAF script, thanks
603 os
.chdir('%s/po' % srcdir
)
606 size_old
= os
.stat('geany.pot').st_size
609 Utils
.exec_command('intltool-update --pot -g %s' % APPNAME
)
610 size_new
= os
.stat('geany.pot').st_size
611 if size_new
!= size_old
:
612 Utils
.pprint('CYAN', 'Updated POT file.')
613 launch('intltool-update -r -g %s' % APPNAME
, 'Updating translations', 'CYAN')
615 Utils
.pprint('CYAN', 'POT file is up to date.')
617 Utils
.pprint('RED', 'Failed to generate pot file.')
621 # Simple function to execute a command and print its exit status
622 def launch(command
, status
, success_color
='GREEN'):
624 Utils
.pprint(success_color
, status
)
626 ret
= Utils
.exec_command(command
)
629 print str(e
), ":", command
634 Utils
.pprint('RED', status
+ ' failed')
639 def print_message(conf
, msg
, result
, color
= 'GREEN'):
640 conf
.check_message_1(msg
)
641 conf
.check_message_2(result
, color
)
644 def uc_first(s
, is_win32
):
650 def target_is_win32(env
):
651 if sys
.platform
== 'win32':
653 if env
and 'CC' in env
:
655 if not isinstance(cc
, str):
657 return cc
.find('mingw') != -1