Branch: refs/heads/master Author: Enrico Tröger enrico.troeger@uvena.de Committer: Enrico Tröger enrico.troeger@uvena.de Date: Sun, 13 Dec 2015 13:36:12 UTC Commit: 34088fbbb8535539e588520756aa418934b80941 https://github.com/geany/geany/commit/34088fbbb8535539e588520756aa418934b809...
Log Message: ----------- Drop Waf build system support
See #768.
Modified Paths: -------------- .gitignore HACKING Makefile.am doc/geany.txt doc/making-a-release geany.spec.in scripts/wafinit.sh waf wscript
Modified: .gitignore 7 lines changed, 0 insertions(+), 7 deletions(-) =================================================================== @@ -10,7 +10,6 @@ deps.mak .deps/ .libs/ -.lock-waf_* Makefile Makefile.in .dirstamp @@ -20,7 +19,6 @@ Makefile.in #----------------------------------------------------------------------- /aclocal.m4 /autom4te.cache -/_build_ /build-aux/ /build-stamp /codenames @@ -48,8 +46,6 @@ Makefile.in /intltool-* /libtool /localwin32.mk -/.lock-wscript -/.lock-wafbuild /ltmain.sh /m4/lt*.m4 /m4/intltool.m4 @@ -63,9 +59,6 @@ Makefile.in /stamp-h.in /*.tar.* /TODO.* -# extracted Waf directory (without dot on Windows) -/.waf-* -/waf-*
#----------------------------------------------------------------------- # /po/
Modified: HACKING 9 lines changed, 3 insertions(+), 6 deletions(-) =================================================================== @@ -171,9 +171,9 @@ Geany requires GTK >= 2.24 and GLib >= 2.28. API symbols from newer GTK/GLib versions should be avoided or made optional to keep the source code building on older systems.
-It is recommended to use the 2.24 API documentation of the GTK -libs (including GLib, GDK and Pango) has the advantages -that you don't get confused by any newer API additions and you +It is recommended to use the 2.24 API documentation of the GTK +libs (including GLib, GDK and Pango) has the advantages +that you don't get confused by any newer API additions and you don't have to take care about whether you can use them or not.
Coding @@ -484,7 +484,6 @@ Adding a source file foo.[hc] in src/ or plugins/ ------------------------------------------------- * Add foo.c, foo.h to SRCS in path/Makefile.am. * Add foo.o to OBJS in path/makefile.win32. -* Add path/foo.c to geany_sources in wscript. * Add path/foo.c to po/POTFILES.in (for string translation).
Adding a filetype @@ -548,7 +547,6 @@ When adding a lexer, update:
* scintilla/Makefile.am * scintilla/makefile.win32 -* wscript * scintilla/src/Catalogue.cxx - add a LINK_LEXER command *manually*
For syntax highlighting, you will need to edit highlighting.c and @@ -637,7 +635,6 @@ Method `````` * Add foo.c to SRCS in Makefile.am. * Add foo.o to OBJS in makefile.win32. -* Add path/foo.c to geany_sources in wscript. * Add Foo to parsers.h * Add TM_PARSER_FOO to tagmanager/src/tm_parser.h. The list here must follow exactly the order in parsers.h.
Modified: Makefile.am 2 lines changed, 0 insertions(+), 2 deletions(-) =================================================================== @@ -15,8 +15,6 @@ WIN32_BUILD_FILES = \
EXTRA_DIST = \ autogen.sh \ - wscript \ - waf \ geany.desktop.in \ geany.pc.in \ geany.spec \
Modified: doc/geany.txt 67 lines changed, 1 insertions(+), 66 deletions(-) =================================================================== @@ -132,8 +132,7 @@ of these tools are recommended. Autotools based build system ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-The Autotools based build system is very mature and has been well tested. -To use it, you just need the Make tool, preferably GNU Make. +To compile Geany yourself, you just need the Make tool, preferably GNU Make.
Then run the following commands::
@@ -148,65 +147,6 @@ Or via sudo::
% sudo make install
-Waf based build system -^^^^^^^^^^^^^^^^^^^^^^ - -The Waf build system is still quite young and under heavy development but already in a -usable state. In contrast to the Autotools system, Waf needs Python. So before using Waf, you need -to install Python on your system. -The advantage of the Waf build system over the Autotools based build system is that the whole -build process might be a bit faster. Especially when you use the Waf -cache feature for repetitive builds (e.g. when changing only a few source files -to test something) will become much faster since Waf will cache and re-use the -unchanged built files and only compile the changed code again. See `Waf Cache`_ for details. -To build Geany with Waf as run:: - - $ ./waf configure - $ ./waf build - -Then as root:: - - % ./waf install - -Waf cache -````````` - -The Waf build system has a nice and interesting feature which can help to avoid -a lot of unnecessary rebuilding of unchanged code. This often happens when developing new features -or trying to debug something in Geany. -Waf is able to store and retrieve the object files from a cache. This cache is declared -using the environment variable ``WAFCACHE``. -A possible location of the cache directory could be ``~/.cache/waf``. In order to make use of -this, you first need to create this directory:: - - $ mkdir -p ~/.cache/waf - -then add the environment variable to your shell configuration (the following example is for -Bash and should be adjusted to your used shell):: - - export WAFCACHE=/home/username/.cache/waf - -Remember to replace ``username`` with your actual username. - -More information about the Waf cache feature are available at -http://code.google.com/p/waf/wiki/CacheObjectFiles. - -Cleaning the cache -****************** -You should be careful about the size of the cache directory as it may -grow rapidly over time. -Waf doesn't do any cleaning or other house-keeping of the cache yet, so you need to keep it -clean by yourself. -An easy way to keep it clean is to run the following command regularly to remove old -cached files:: - - $ find /home/username/.cache/waf -mtime +14 -exec rm {} ; - -This will delete all files in the cache directory which are older than 14 days. - -For details about the ``find`` command and its options, check its manual page. - - Custom installation ^^^^^^^^^^^^^^^^^^^ The configure script supports several common options, for a detailed @@ -214,11 +154,6 @@ list, type::
$ ./configure --help
-or:: - - $ ./waf --help - -(depending on which build system you use).
You may also want to read the INSTALL file for advanced installation options.
Modified: doc/making-a-release 2 lines changed, 1 insertions(+), 1 deletions(-) =================================================================== @@ -9,7 +9,7 @@ to filter commits by a particular developer name.
Ensure version numbers are all updated in: configure.ac geany_private.rc geany.exe.manifest - win32-config.h wscript doc/geany.txt + win32-config.h doc/geany.txt Ensure release date is updated in: NEWS doc/geany.txt doc/geany.1.in Check GEANY_CODENAME is set in src/geany.h.
Modified: geany.spec.in 4 lines changed, 0 insertions(+), 4 deletions(-) =================================================================== @@ -62,10 +62,6 @@ Geany plug-ins. You do not need to install this package to use Geany.
%prep %setup -q -# remove waf since this isn't needed for the build, we're building the package -# with autotools -rm -f waf -rm -f wscript
%build %configure
Modified: scripts/wafinit.sh 72 lines changed, 0 insertions(+), 72 deletions(-) =================================================================== @@ -1,72 +0,0 @@ -#! /bin/sh -# -# This script creates a "configure" script and a Makefile to imitate autotools -# but Waf is actually used to build - -WAF="./waf" - -# Makefile -cat > Makefile << EOF - -.PHONY: build configure - -all: build - -build: - @$WAF build - -install: - @if test -n "$(DESTDIR)"; then \ - ./waf install --destdir="$(DESTDIR)"; \ - else \ - ./waf install; \ - fi; - -uninstall: - @if test -n "$(DESTDIR)"; then \ - $WAF uninstall --destdir="$(DESTDIR)"; \ - else \ - $WAF uninstall; \ - fi; - -clean: - @$WAF clean - -distclean: - @$WAF distclean - @-rm -f Makefile - -htmldoc: - @$WAF --htmldoc - -apidoc: - @$WAF --apidoc - -configure: - @$WAF configure - -EOF - -template=" -all: build - -build: - cd .. && $WAF build - -" - -echo "$template" > src/Makefile -echo "$template" > tagmanager/Makefile -echo "$template" > scintilla/Makefile -echo "$template" > plugins/Makefile - - -# configure -cat > configure << EOF -#!/bin/sh - -$WAF configure $@ - -EOF - -chmod 755 configure
Modified: waf 0 lines changed, 0 insertions(+), 0 deletions(-) =================================================================== No diff available, check online
Modified: wscript 981 lines changed, 0 insertions(+), 981 deletions(-) =================================================================== @@ -1,981 +0,0 @@ -# -*- coding: utf-8 -*- -# -# WAF build script - this file is part of Geany, a fast and lightweight IDE -# -# Copyright 2008-2012 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de> -# Copyright 2008-2012 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com> -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -""" -This is a WAF build script (http://code.google.com/p/waf/). -It can be used as an alternative build system to autotools -for Geany. It does not (yet) cover all of the autotools tests and -configure options but all important things are working. -"make dist" should be done with autotools, most other targets and -functions should work better (regarding performance and flexibility) -or at least equally. - -Missing features: --enable-binreloc, make targets: dist, pdf (in doc/) -Known issues: Dependency handling is buggy, e.g. if src/document.h is - changed, depending source files are not rebuilt (maybe Waf bug). - -The code of this file itself loosely follows PEP 8 with some exceptions -(line width 100 characters and some other minor things). - -Requires WAF 1.6.1 and Python 2.5 (or later). -""" - - -import sys -import os -import tempfile -from waflib import Logs, Options, Scripting, Utils -from waflib.Build import BuildContext -from waflib.Configure import ConfigurationContext -from waflib.Errors import ConfigurationError, WafError -from waflib.TaskGen import feature, before_method -from waflib.Tools.compiler_c import c_compiler -from waflib.Tools.compiler_cxx import cxx_compiler - - -APPNAME = 'geany' -VERSION = '1.26' -LINGUAS_FILE = os.path.join('po', 'LINGUAS') -MINIMUM_GTK_VERSION = '2.24.0' -MINIMUM_GTK3_VERSION = '3.0.0' -MINIMUM_GLIB_VERSION = '2.28.0' - -GEANY_LIB_VERSION = '0.0.0' - -top = '.' -out = '_build_' - -mio_sources = set(['tagmanager/mio/mio.c']) - -ctags_sources = set([ - 'tagmanager/ctags/abaqus.c', - 'tagmanager/ctags/args.c', - 'tagmanager/ctags/abc.c', - 'tagmanager/ctags/actionscript.c', - 'tagmanager/ctags/asciidoc.c', - 'tagmanager/ctags/asm.c', - 'tagmanager/ctags/basic.c', - 'tagmanager/ctags/c.c', - 'tagmanager/ctags/cobol.c', - 'tagmanager/ctags/conf.c', - 'tagmanager/ctags/css.c', - 'tagmanager/ctags/ctags.c', - 'tagmanager/ctags/diff.c', - 'tagmanager/ctags/docbook.c', - 'tagmanager/ctags/erlang.c', - 'tagmanager/ctags/entry.c', - 'tagmanager/ctags/fortran.c', - 'tagmanager/ctags/get.c', - 'tagmanager/ctags/go.c', - 'tagmanager/ctags/haskell.c', - 'tagmanager/ctags/haxe.c', - 'tagmanager/ctags/html.c', - 'tagmanager/ctags/js.c', - 'tagmanager/ctags/json.c', - 'tagmanager/ctags/keyword.c', - 'tagmanager/ctags/latex.c', - 'tagmanager/ctags/lregex.c', - 'tagmanager/ctags/lua.c', - 'tagmanager/ctags/make.c', - 'tagmanager/ctags/markdown.c', - 'tagmanager/ctags/matlab.c', - 'tagmanager/ctags/nsis.c', - 'tagmanager/ctags/nestlevel.c', - 'tagmanager/ctags/objc.c', - 'tagmanager/ctags/options.c', - 'tagmanager/ctags/parse.c', - 'tagmanager/ctags/pascal.c', - 'tagmanager/ctags/r.c', - 'tagmanager/ctags/perl.c', - 'tagmanager/ctags/php.c', - 'tagmanager/ctags/powershell.c', - 'tagmanager/ctags/python.c', - 'tagmanager/ctags/read.c', - 'tagmanager/ctags/rest.c', - 'tagmanager/ctags/ruby.c', - 'tagmanager/ctags/rust.c', - 'tagmanager/ctags/sh.c', - 'tagmanager/ctags/sort.c', - 'tagmanager/ctags/sql.c', - 'tagmanager/ctags/strlist.c', - 'tagmanager/ctags/txt2tags.c', - 'tagmanager/ctags/tcl.c', - 'tagmanager/ctags/vhdl.c', - 'tagmanager/ctags/verilog.c', - 'tagmanager/ctags/vstring.c']) - -tagmanager_sources = set([ - 'tagmanager/src/tm_source_file.c', - 'tagmanager/src/tm_tag.c', - 'tagmanager/src/tm_workspace.c']) - -scintilla_sources = set(['scintilla/gtk/scintilla-marshal.c']) - -geany_sources = set([ - 'src/about.c', 'src/build.c', 'src/callbacks.c', 'src/dialogs.c', 'src/document.c', - 'src/editor.c', 'src/encodings.c', 'src/filetypes.c', 'src/geanyentryaction.c', - 'src/geanymenubuttonaction.c', 'src/geanyobject.c', 'src/geanywraplabel.c', - 'src/highlighting.c', 'src/keybindings.c', - 'src/keyfile.c', 'src/log.c', 'src/libmain.c', 'src/msgwindow.c', 'src/navqueue.c', 'src/notebook.c', 'src/osx.c', - 'src/plugins.c', 'src/pluginutils.c', 'src/prefix.c', 'src/prefs.c', 'src/printing.c', 'src/project.c', - 'src/sciwrappers.c', 'src/search.c', 'src/socket.c', 'src/spawn.c', 'src/stash.c', - 'src/symbols.c', - 'src/templates.c', 'src/toolbar.c', 'src/tools.c', 'src/sidebar.c', - 'src/ui_utils.c', 'src/utils.c']) - -geany_bin_sources = set(['src/main.c']) - -geany_icons = { - 'hicolor/16x16/apps': ['16x16/classviewer-class.png', - '16x16/classviewer-macro.png', - '16x16/classviewer-member.png', - '16x16/classviewer-method.png', - '16x16/classviewer-namespace.png', - '16x16/classviewer-other.png', - '16x16/classviewer-struct.png', - '16x16/classviewer-var.png', - '16x16/geany.png'], - 'hicolor/16x16/actions': ['16x16/geany-build.png', - '16x16/geany-close-all.png', - '16x16/geany-save-all.png'], - 'hicolor/24x24/actions': ['24x24/geany-build.png', - '24x24/geany-close-all.png', - '24x24/geany-save-all.png'], - 'hicolor/32x32/actions': ['32x32/geany-build.png', - '32x32/geany-close-all.png', - '32x32/geany-save-all.png'], - 'hicolor/32x32/apps': ['32x32/geany.png'], - 'hicolor/48x48/actions': ['48x48/geany-build.png', - '48x48/geany-close-all.png', - '48x48/geany-save-all.png'], - 'hicolor/48x48/apps': ['48x48/geany.png'], - 'hicolor/scalable/apps': ['scalable/geany.svg'], - 'hicolor/scalable/actions': ['scalable/geany-build.svg', - 'scalable/geany-close-all.svg', - 'scalable/geany-save-all.svg'], - 'Tango/16x16/actions': ['tango/16x16/geany-save-all.png'], - 'Tango/24x24/actions': ['tango/24x24/geany-save-all.png'], - 'Tango/32x32/actions': ['tango/32x32/geany-save-all.png'], - 'Tango/48x48/actions': ['tango/48x48/geany-save-all.png'], - 'Tango/scalable/actions': ['tango/scalable/geany-save-all.svg'] -} -geany_icons_indexes = { - 'hicolor': ['index.theme'], - 'Tango': ['tango/index.theme'] -} - - -def configure(conf): - - conf.check_waf_version(mini='1.6.1') - - conf.load('compiler_c') - _check_c99(conf) - is_win32 = _target_is_win32(conf) - - visibility_hidden_supported = conf.check_cc(cflags=['-Werror', '-fvisibility=hidden'], mandatory=False) - conf.check_cc(header_name='fcntl.h', mandatory=False) - conf.check_cc(header_name='fnmatch.h', mandatory=False) - conf.check_cc(header_name='glob.h', mandatory=False) - conf.check_cc(header_name='sys/time.h', mandatory=False) - conf.check_cc(header_name='sys/types.h', mandatory=False) - conf.check_cc(header_name='sys/stat.h', mandatory=False) - conf.define('HAVE_STDLIB_H', 1) # are there systems without stdlib.h? - conf.define('STDC_HEADERS', 1) # an optimistic guess ;-) - _add_to_env_and_define(conf, 'HAVE_REGCOMP', 1) # needed for CTags - - conf.check_cc(function_name='fgetpos', header_name='stdio.h', mandatory=False) - conf.check_cc(function_name='fnmatch', header_name='fnmatch.h', mandatory=False) - conf.check_cc(function_name='ftruncate', header_name='unistd.h', mandatory=False) - conf.check_cc(function_name='mkstemp', header_name='stdlib.h', mandatory=False) - conf.check_cc(function_name='strstr', header_name='string.h') - - conf.check_cc(function_name='pow', header_name='math.h', lib='m', uselib_store='M') - - # check sunOS socket support - if Options.platform == 'sunos': - conf.check_cc(function_name='socket', lib='socket', - header_name='sys/socket.h', uselib_store='SUNOS_SOCKET', mandatory=True) - - # check for cxx after the header and function checks have been done to ensure they are - # checked with cc not cxx - conf.load('compiler_cxx') - if is_win32: - conf.load('winres') - _load_intltool_if_available(conf) - - # GTK / GIO version check - gtk_package_name = 'gtk+-3.0' if conf.options.use_gtk3 else 'gtk+-2.0' - minimum_gtk_version = MINIMUM_GTK3_VERSION if conf.options.use_gtk3 else MINIMUM_GTK_VERSION - conf.check_cfg(package=gtk_package_name, atleast_version=minimum_gtk_version, uselib_store='GTK', - mandatory=True, args='--cflags --libs') - conf.check_cfg(package='glib-2.0', atleast_version=MINIMUM_GLIB_VERSION, uselib_store='GLIB', - mandatory=True, args='--cflags --libs') - conf.check_cfg(package='gmodule-2.0', uselib_store='GMODULE', - mandatory=True, args='--cflags --libs') - conf.check_cfg(package='gio-2.0', uselib_store='GIO', args='--cflags --libs', mandatory=True) - gtk_version = conf.check_cfg(modversion=gtk_package_name, uselib_store='GTK') or 'Unknown' - conf.check_cfg(package='gthread-2.0', uselib_store='GTHREAD', args='--cflags --libs') - if conf.options.enable_mac_integration: - pkgname = 'gtk-mac-integration-gtk3' if conf.options.use_gtk3 else 'gtk-mac-integration-gtk2' - conf.check_cfg(package=pkgname, uselib_store='MAC_INTEGRATION', - mandatory=True, args='--cflags --libs') - # remember GTK version for the build step - conf.env['gtk_package_name'] = gtk_package_name - conf.env['gtk_version'] = gtk_version - conf.env['minimum_gtk_version'] = minimum_gtk_version - conf.env['use_gtk3'] = conf.options.use_gtk3 - - revision = _get_git_rev(conf) - - # rst2html for the HTML manual - if not conf.options.no_html_doc and revision is not None: - try: - conf.env['RST2HTML'] = _find_rst2html(conf) - except WafError: - error_msg = '''Documentation enabled but rst2html not found. -You can explicitly disable building of the HTML manual with --disable-html-docs, -but you then may not have a local copy of the HTML manual.''' - raise WafError(error_msg) - - # Windows specials - if is_win32: - if conf.env['PREFIX'].lower() == tempfile.gettempdir().lower(): - # overwrite default prefix on Windows (tempfile.gettempdir() is the Waf default) - new_prefix = os.path.join(str(conf.root), '%s-%s' % (APPNAME, VERSION)) - _add_to_env_and_define(conf, 'PREFIX', new_prefix, quote=True) - _add_to_env_and_define(conf, 'BINDIR', os.path.join(new_prefix, 'bin'), quote=True) - _add_to_env_and_define(conf, 'DOCDIR', os.path.join(conf.env['PREFIX'], 'doc'), quote=True) - _add_to_env_and_define(conf, 'LIBDIR', '%s/lib' % conf.env['PREFIX'], quote=True) - conf.define('LOCALEDIR', os.path.join('share' 'locale'), quote=True) - # overwrite LOCALEDIR to install message catalogues properly - conf.env['LOCALEDIR'] = os.path.join(conf.env['PREFIX'], 'share', 'locale') - # DATADIR is defined in objidl.h, so we remove it from config.h but keep it in env - conf.undefine('DATADIR') - conf.env['DATADIR'] = os.path.join(conf.env['PREFIX'], 'data') - conf.env.append_value('LINKFLAGS_cprogram', [ - '-mwindows', - '-static-libgcc', - '-static-libstdc++']) - conf.env.append_value('LIB_WIN32', ['wsock32', 'uuid', 'ole32', 'comdlg32']) - else: - conf.env['cshlib_PATTERN'] = '%s.so' - # DATADIR and LOCALEDIR are defined by the intltool tool - # but they are not added to the environment, so we need to - _add_define_to_env(conf, 'DATADIR') - _add_define_to_env(conf, 'LOCALEDIR') - docdir = os.path.join(conf.env['DATADIR'], 'doc', 'geany') - libdir = os.path.join(conf.env['PREFIX'], 'lib') - mandir = os.path.join(conf.env['DATADIR'], 'man') - _define_from_opt(conf, 'DOCDIR', conf.options.docdir, docdir) - _define_from_opt(conf, 'LIBDIR', conf.options.libdir, libdir) - _define_from_opt(conf, 'MANDIR', conf.options.mandir, mandir) - - conf.define('ENABLE_NLS', 1) - conf.define('GEANY_LOCALEDIR', '' if is_win32 else conf.env['LOCALEDIR'], quote=True) - conf.define('GEANY_DATADIR', 'data' if is_win32 else conf.env['DATADIR'], quote=True) - conf.define('GEANY_DOCDIR', conf.env['DOCDIR'], quote=True) - conf.define('GEANY_LIBDIR', '' if is_win32 else conf.env['LIBDIR'], quote=True) - conf.define('GEANY_PREFIX', '' if is_win32 else conf.env['PREFIX'], quote=True) - conf.define('PACKAGE', APPNAME, quote=True) - conf.define('VERSION', VERSION, quote=True) - conf.define('REVISION', revision or '-1', quote=True) - - conf.define('GETTEXT_PACKAGE', APPNAME, quote=True) - - # no VTE on Windows - if is_win32: - conf.options.no_vte = True - - _define_from_opt(conf, 'HAVE_PLUGINS', not conf.options.no_plugins, None) - _define_from_opt(conf, 'HAVE_SOCKET', not conf.options.no_socket, None) - _define_from_opt(conf, 'HAVE_VTE', not conf.options.no_vte, None) - - conf.write_config_header('config.h', remove=False) - - # GEANY_EXPORT_SYMBOL and GEANY_API_SYMBOL - if is_win32: - geanyexport_cflags = [] - geanyexport_defines = ['GEANY_EXPORT_SYMBOL=__declspec(dllexport)'] - elif visibility_hidden_supported: - geanyexport_cflags = ['-fvisibility=hidden'] - geanyexport_defines = ['GEANY_EXPORT_SYMBOL=__attribute__((visibility("default")))'] - else: # unknown, define to nothing - geanyexport_cflags = [] - geanyexport_defines = ['GEANY_EXPORT_SYMBOL='] - geanyexport_defines.append('GEANY_API_SYMBOL=GEANY_EXPORT_SYMBOL') - conf.env['DEFINES_geanyexport'] = geanyexport_defines - conf.env['CFLAGS_geanyexport'] = geanyexport_cflags - conf.env['CXXFLAGS_geanyexport'] = geanyexport_cflags - - # some more compiler flags - conf.env.append_value('CFLAGS', ['-DHAVE_CONFIG_H']) - if conf.env['CC_NAME'] == 'gcc' and '-O' not in ''.join(conf.env['CFLAGS']): - conf.env.append_value('CFLAGS', ['-O2']) - if revision is not None: - conf.env.append_value('CFLAGS', ['-g', '-DGEANY_DEBUG']) - # Scintilla flags - conf.env.append_value('CFLAGS', ['-DGTK']) - conf.env.append_value('CXXFLAGS', - ['-DNDEBUG', '-DGTK', '-DSCI_LEXER', '-DG_THREADS_IMPL_NONE']) - if conf.env['CXX_NAME'] == 'gcc' and '-O' not in ''.join(conf.env['CXXFLAGS']): - conf.env.append_value('CXXFLAGS', ['-O2']) - if revision is not None: - conf.env.append_value('CXXFLAGS', ['-g']) - - # summary - Logs.pprint('BLUE', 'Summary:') - conf.msg('Install Geany ' + VERSION + ' in', conf.env['PREFIX']) - conf.msg('Using GTK version', gtk_version) - conf.msg('Build with plugin support', conf.options.no_plugins and 'no' or 'yes') - conf.msg('Use virtual terminal support', conf.options.no_vte and 'no' or 'yes') - if revision is not None: - conf.msg('Compiling Git revision', revision) - # deprecation warning - _show_deprecation_warning(conf) - - -def _show_deprecation_warning(ctx): - Logs.pprint( - 'RED', - 'The Waf build system is deprecated and will be removed in the removed in Geany 1.27. ' - 'Please use the Autotools build system.') - - -def options(opt): - # Disable MSVC detection on win32: building Geany with MSVC is currently not supported - # If anyone wants to add support for building with MSVC, this hack should be removed. - c_compiler['win32'] = ['gcc'] - cxx_compiler['win32'] = ['g++'] - - opt.load('compiler_cc') - opt.load('compiler_cxx') - opt.load('intltool') - - # Option - opt.add_option('--no-scm', action='store_true', default=False, - help='Disable SCM detection [default: No]', dest='no_scm') - # Features - opt.add_option('--disable-plugins', action='store_true', default=False, - help='compile without plugin support [default: No]', dest='no_plugins') - opt.add_option('--disable-socket', action='store_true', default=False, - help='compile without support to detect a running instance [[default: No]', - dest='no_socket') - opt.add_option('--disable-vte', action='store_true', default=False, - help='compile without support for an embedded virtual terminal [[default: No]', - dest='no_vte') - opt.add_option('--enable-gtk3', action='store_true', default=False, - help='compile with GTK3 support (experimental) [[default: No]', - dest='use_gtk3') - opt.add_option('--enable-mac-integration', action='store_true', default=False, - help='use gtk-mac-integration to enable improved OS X integration [[default: No]', - dest='enable_mac_integration') - opt.add_option('--disable-html-docs', action='store_true', default=False, - help='do not generate HTML documentation using rst2html [[default: No]', - dest='no_html_doc') - # Paths - opt.add_option('--mandir', type='string', default='', - help='man documentation', dest='mandir') - opt.add_option('--docdir', type='string', default='', - help='documentation root', dest='docdir') - opt.add_option('--libdir', type='string', default='', - help='object code libraries', dest='libdir') - - -def build(bld): - is_win32 = _target_is_win32(bld) - bld.add_post_fun(_show_deprecation_warning) - - if bld.cmd == 'clean': - _remove_linguas_file() - if bld.cmd in ('install', 'uninstall'): - bld.add_post_fun(_post_install) - - def build_plugin(plugin_name, install=True, uselib_add=[]): - if install: - instpath = '${LIBDIR}/geany' - else: - instpath = None - - bld( - features = ['c', 'cshlib'], - source = 'plugins/%s.c' % plugin_name, - includes = ['.', 'src/', 'scintilla/include', 'tagmanager/src'], - defines = 'G_LOG_DOMAIN="%s"' % plugin_name, - target = plugin_name, - uselib = ['GTK', 'GLIB', 'GMODULE', 'C99'] + uselib_add, - use = ['geany'], - install_path = instpath) - - # CTags - bld.objects( - features = ['c'], - source = ctags_sources, - name = 'ctags', - target = 'ctags', - includes = ['.', 'tagmanager', 'tagmanager/ctags'], - defines = 'G_LOG_DOMAIN="CTags"', - uselib = ['cshlib', 'GLIB', 'geanyexport', 'C99']) - - # Tagmanager - bld.objects( - features = ['c'], - source = tagmanager_sources, - name = 'tagmanager', - target = 'tagmanager', - includes = ['.', 'tagmanager', 'tagmanager/ctags'], - defines = ['GEANY_PRIVATE', 'G_LOG_DOMAIN="Tagmanager"'], - uselib = ['cshlib', 'GTK', 'GLIB', 'geanyexport', 'C99']) - - # MIO - bld.objects( - features = ['c'], - source = mio_sources, - name = 'mio', - target = 'mio', - includes = ['.', 'tagmanager/mio/'], - defines = 'G_LOG_DOMAIN="MIO"', - uselib = ['cshlib', 'GTK', 'GLIB', 'geanyexport']) - - # Scintilla - files = bld.srcnode.ant_glob('scintilla/**/*.cxx', src=True, dir=False) - scintilla_sources.update([file.path_from(bld.srcnode) for file in files]) - bld.objects( - features = ['c', 'cxx'], - name = 'scintilla', - target = 'scintilla', - source = scintilla_sources, - includes = ['.', 'scintilla/include', 'scintilla/src', 'scintilla/lexlib'], - uselib = ['cshlib', 'cxxshlib', 'GTK', 'GLIB', 'GMODULE', 'M', 'geanyexport']) - - # Geany - if bld.env['HAVE_VTE'] == 1: - geany_sources.add('src/vte.c') - if is_win32: - geany_sources.add('src/win32.c') - geany_bin_sources.add('geany_private.rc') - - def gen_signallist(task): - from xml.etree import ElementTree - - def find_handlers(xml_filename): - tree = ElementTree.parse(xml_filename) - signals = tree.getroot().findall(".//signal") - return [sig.attrib["handler"] for sig in signals] - - handlers = [] - for node in task.inputs: - handlers += find_handlers(node.abspath()) - handlers = sorted(set(handlers)) - - for node in task.outputs: - node.write("/* This file is auto-generated, do not edit. */\n" + - ''.join(["ITEM(%s)\n" % h for h in handlers])) - - # signallist.i - bld( - source = 'data/geany.glade', - target = bld.path.get_bld().make_node('src/signallist.i'), - name = 'signallist.i', - rule = gen_signallist) - - base_uselibs = ['GTK', 'GLIB', 'GMODULE', 'GIO', 'GTHREAD', 'WIN32', 'MAC_INTEGRATION', 'SUNOS_SOCKET', 'M', 'C99'] - - # libgeany - bld.shlib( - features = ['c', 'cxx'], - name = 'geany', - target = 'geany', - source = geany_sources, - includes = ['.', 'scintilla/include', 'tagmanager/src', 'src'], - defines = ['G_LOG_DOMAIN="Geany"', 'GEANY_PRIVATE'], - uselib = base_uselibs + ['geanyexport'], - use = ['scintilla', 'ctags', 'tagmanager', 'mio'], - linkflags = bld.env['LINKFLAGS_cprogram'], - vnum = GEANY_LIB_VERSION, - install_path = '${PREFIX}/bin' if is_win32 else '${LIBDIR}') - - # geany executable - t = bld.program( - features = ['c', 'cxx'], - name = 'geany_bin', - target = 'geany', - source = geany_bin_sources, - includes = ['.', 'scintilla/include', 'tagmanager/src'], - defines = ['G_LOG_DOMAIN="Geany"', 'GEANY_PRIVATE'], - uselib = base_uselibs + ['geanyexport'], - use = ['geany']) - if not is_win32: - # http://www.freehackers.org/~tnagy/testdoc/single.html#common_c - t.rpath = bld.env['LIBDIR'] - - # Plugins - if bld.env['HAVE_PLUGINS'] == 1: - build_plugin('classbuilder') - build_plugin('demoplugin', False) - build_plugin('export', uselib_add=['M']) - build_plugin('filebrowser') - build_plugin('htmlchars') - build_plugin('saveactions') - build_plugin('splitwindow') - - # Translations - if bld.env['INTLTOOL']: - bld( - features = ['linguas', 'intltool_po'], - podir = 'po', - install_path = '${LOCALEDIR}', - appname = 'geany') - - # HTML documentation (build if it is not part of the tree already, as it is required for install) - html_doc_filename = os.path.join(bld.out_dir, 'doc', 'geany.html') - if bld.env['RST2HTML']: - rst2html = bld.env['RST2HTML'] - bld( - source = ['doc/geany.txt'], - deps = ['doc/geany.css'], - target = bld.path.get_bld().make_node('doc/geany.html'), - name = 'geany.html', - cwd = os.path.join(bld.path.abspath(), 'doc'), - rule = '%s -stg --stylesheet=geany.css geany.txt %s' % (rst2html, html_doc_filename)) - - # geany.pc - if is_win32: - # replace backward slashes by forward slashes as they could be interepreted as escape - # characters - geany_pc_prefix = bld.env['PREFIX'].replace('\', '/') - else: - geany_pc_prefix = bld.env['PREFIX'] - bld( - source = 'geany.pc.in', - dct = {'VERSION': VERSION, - 'DEPENDENCIES': '%s >= %s glib-2.0 >= %s' % \ - (bld.env['gtk_package_name'], - bld.env['minimum_gtk_version'], - MINIMUM_GLIB_VERSION), - 'prefix': geany_pc_prefix, - 'exec_prefix': '${prefix}', - 'libdir': '${exec_prefix}/lib', - 'includedir': '${prefix}/include', - 'datarootdir': '${prefix}/share', - 'datadir': '${datarootdir}', - 'localedir': '${datarootdir}/locale'}) - - # geany.nsi - bld( - features = 'subst', - source = 'geany.nsi.in', - target = 'geany.nsi', - dct = {'VERSION': VERSION, - 'GTK_VERSION': bld.env['gtk_version']}, - install_path = None) - - if not is_win32: - # geany.desktop - if bld.env['INTLTOOL']: - bld( - features = 'intltool_in', - source = 'geany.desktop.in', - flags = ['-d', '-q', '-u', '-c'], - install_path = '${DATADIR}/applications') - - # geany.1 - bld( - features = 'subst', - source = 'doc/geany.1.in', - target = 'geany.1', - dct = {'VERSION': VERSION, - 'GEANY_DATA_DIR': bld.env['DATADIR'] + '/geany'}, - install_path = '${MANDIR}/man1') - - # geany.spec - bld( - features = 'subst', - source = 'geany.spec.in', - target = 'geany.spec', - install_path = None, - dct = {'VERSION': VERSION}) - - # Doxyfile - bld( - features = 'subst', - source = 'doc/Doxyfile.in', - target = 'doc/Doxyfile', - install_path = None, - dct = {'VERSION': VERSION, - 'top_builddir': bld.out_dir, - 'top_srcdir': bld.top_dir,}) - - # disable build/install phase interleaving - bld.add_group() - - ### - # Install files - ### - # Headers - bld.install_files('${PREFIX}/include/geany', ''' - src/app.h - src/build.h - src/dialogs.h - src/document.h - src/editor.h - src/encodings.h - src/filetypes.h - src/geany.h - src/highlighting.h - src/keybindings.h - src/main.h - src/msgwindow.h - src/navqueue.h - src/plugindata.h - src/pluginutils.h - src/prefs.h - src/project.h - src/sciwrappers.h - src/search.h - src/spawn.h - src/stash.h - src/support.h - src/symbols.h - src/templates.h - src/toolbar.h - src/ui_utils.h - src/utils.h - src/gtkcompat.h - plugins/geanyplugin.h - plugins/geanyfunctions.h - ''') - bld.install_files('${PREFIX}/include/geany/scintilla', ''' - scintilla/include/SciLexer.h scintilla/include/Scintilla.h - scintilla/include/Scintilla.iface scintilla/include/ScintillaWidget.h - scintilla/include/Sci_Position.h ''') - bld.install_files('${PREFIX}/include/geany/tagmanager', ''' - tagmanager/src/tm_source_file.h - tagmanager/src/tm_tag.h - tagmanager/src/tm_tagmanager.h - tagmanager/src/tm_workspace.h ''') - # Docs - base_dir = '${PREFIX}' if is_win32 else '${DOCDIR}' - ext = '.txt' if is_win32 else '' - for filename in 'AUTHORS ChangeLog COPYING README NEWS THANKS TODO'.split(): - basename = _uc_first(filename, bld) - destination_filename = '%s%s' % (basename, ext) - destination = os.path.join(base_dir, destination_filename) - bld.install_as(destination, filename) - - # install HTML documentation only if it exists, i.e. it was built before - # local_html_doc_filename supports installing HTML doc from in-tree geany.html if it exists - local_html_doc_filename = os.path.join(bld.path.abspath(), 'doc', 'geany.html') - if os.path.exists(html_doc_filename) or os.path.exists(local_html_doc_filename): - html_dir = '' if is_win32 else 'html/' - html_name = 'Manual.html' if is_win32 else 'index.html' - start_dir = bld.path.find_dir('doc/images') - bld.install_files('${DOCDIR}/%simages' % html_dir, start_dir.ant_glob('*.png'), cwd=start_dir) - bld.install_as('${DOCDIR}/%s%s' % (html_dir, html_name), 'doc/geany.html') - - bld.install_as('${DOCDIR}/%s' % _uc_first('manual.txt', bld), 'doc/geany.txt') - bld.install_as('${DOCDIR}/ScintillaLicense.txt', 'scintilla/License.txt') - if is_win32: - bld.install_as('${DOCDIR}/ReadMe.I18n.txt', 'README.I18N') - bld.install_as('${DOCDIR}/Hacking.txt', 'HACKING') - # Data - data_dir = '' if is_win32 else 'geany' - start_dir = bld.path.find_dir('data') - bld.install_as('${DATADIR}/%s/GPL-2' % data_dir, 'COPYING') - bld.install_files('${DATADIR}/%s' % data_dir, start_dir.ant_glob('filetype*'), cwd=start_dir) - bld.install_files('${DATADIR}/%s' % data_dir, start_dir.ant_glob('*.tags'), cwd=start_dir) - bld.install_files('${DATADIR}/%s' % data_dir, 'data/geany.glade') - bld.install_files('${DATADIR}/%s' % data_dir, 'data/snippets.conf') - bld.install_files('${DATADIR}/%s' % data_dir, 'data/ui_toolbar.xml') - if bld.env['use_gtk3']: - bld.install_files('${DATADIR}/%s' % data_dir, 'data/geany.css') - else: - bld.install_files('${DATADIR}/%s' % data_dir, 'data/geany.gtkrc') - - start_dir = bld.path.find_dir('data/colorschemes') - template_dest = '${DATADIR}/%s/colorschemes' % data_dir - bld.install_files(template_dest, start_dir.ant_glob('*'), cwd=start_dir) - start_dir = bld.path.find_dir('data/templates') - template_dest = '${DATADIR}/%s/templates' % data_dir - bld.install_files(template_dest, start_dir.ant_glob('**/*'), cwd=start_dir, relative_trick=True) - # Icons - for dest, srcs in geany_icons.items(): - dest_dir = os.path.join('${PREFIX}/share/icons' if is_win32 else '${DATADIR}/icons', dest) - bld.install_files(dest_dir, srcs, cwd=bld.path.find_dir('icons')) - # install theme indexes on Windows - if is_win32: - for dest, srcs in geany_icons_indexes.items(): - bld.install_files(os.path.join('${PREFIX}/share/icons', dest), srcs, cwd=bld.path.find_dir('icons')) - - -def distclean(ctx): - Scripting.distclean(ctx) - _remove_linguas_file() - - -def _remove_linguas_file(): - # remove LINGUAS file as well - try: - os.unlink(LINGUAS_FILE) - except OSError: - pass - - -@feature('linguas') -@before_method('apply_intltool_po') -def write_linguas_file(self): - if os.path.exists(LINGUAS_FILE): - return - linguas = '' - if 'LINGUAS' in self.env: - files = self.env['LINGUAS'] - for po_filename in files.split(' '): - if os.path.exists('po/%s.po' % po_filename): - linguas += '%s ' % po_filename - else: - files = os.listdir('%s/po' % self.path.abspath()) - files.sort() - for filename in files: - if filename.endswith('.po'): - linguas += '%s ' % filename[:-3] - file_h = open(LINGUAS_FILE, 'w') - file_h.write('# This file is autogenerated. Do not edit.\n%s\n' % linguas) - file_h.close() - - -def _post_install(ctx): - is_win32 = _target_is_win32(ctx) - if is_win32: - return - for d in 'hicolor', 'Tango': - theme_dir = Utils.subst_vars('${DATADIR}/icons/' + d, ctx.env) - icon_cache_updated = False - if not ctx.options.destdir: - ctx.exec_command('gtk-update-icon-cache -q -f -t %s' % theme_dir) - Logs.pprint('GREEN', 'GTK icon cache updated.') - icon_cache_updated = True - if not icon_cache_updated: - Logs.pprint('YELLOW', 'Icon cache not updated. After install, run this:') - Logs.pprint('YELLOW', 'gtk-update-icon-cache -q -f -t %s' % theme_dir) - - -def updatepo(ctx): - """update the message catalogs for internationalization""" - potfile = '%s.pot' % APPNAME - os.chdir('%s/po' % top) - try: - try: - old_size = os.stat(potfile).st_size - except OSError: - old_size = 0 - ctx.exec_command('intltool-update --pot -g %s' % APPNAME) - size_new = os.stat(potfile).st_size - if size_new != old_size: - Logs.pprint('CYAN', 'Updated POT file.') - Logs.pprint('CYAN', 'Updating translations') - ret = ctx.exec_command('intltool-update -r -g %s' % APPNAME) - if ret != 0: - Logs.pprint('RED', 'Updating translations failed') - else: - Logs.pprint('CYAN', 'POT file is up to date.') - except OSError: - Logs.pprint('RED', 'Failed to generate pot file.') - - -def apidoc(ctx): - """generate API reference documentation""" - ctx = BuildContext() # create our own context to have ctx.top_dir - basedir = ctx.top_dir - doxygen = _find_program(ctx, 'doxygen') - doxyfile = '%s/doc/Doxyfile' % ctx.out_dir - Logs.pprint('CYAN', 'Generating API documentation') - ret = ctx.exec_command('%s %s' % (doxygen, doxyfile)) - if ret != 0: - raise WafError('Generating API documentation failed') - - -def hackingdoc(ctx): - """generate HACKING documentation""" - ctx = BuildContext() # create our own context to have ctx.top_dir - Logs.pprint('CYAN', 'Generating HACKING documentation') - cmd = _find_rst2html(ctx) - hacking_file = os.path.join(ctx.top_dir, 'HACKING') - hacking_html_file = os.path.join(ctx.top_dir, 'doc', 'hacking.html') - stylesheet = os.path.join(ctx.top_dir, 'doc', 'geany.css') - ret = ctx.exec_command('%s -stg --stylesheet=%s %s %s' % ( - cmd, stylesheet, hacking_file, hacking_html_file)) - if ret != 0: - raise WafError('Generating HACKING documentation failed') - - -def _find_program(ctx, cmd, **kw): - def noop(*args): - pass - - if ctx is None or not isinstance(ctx, ConfigurationContext): - ctx = ConfigurationContext() - ctx.to_log = noop - ctx.msg = noop - return ctx.find_program(cmd, **kw) - - -def _find_rst2html(ctx): - cmds = ['rst2html', 'rst2html2'] - for command in cmds: - cmd = _find_program(ctx, command, mandatory=False, exts=',.py') - if cmd: - break - if not cmd: - raise WafError( - 'rst2html.py could not be found. Please install the Python docutils package.') - return cmd - - -def _add_define_to_env(conf, key): - value = conf.get_define(key) - # strip quotes - value = value.replace('"', '') - conf.env[key] = value - - -def _add_to_env_and_define(conf, key, value, quote=False): - conf.define(key, value, quote) - conf.env[key] = value - - -def _define_from_opt(conf, define_name, opt_value, default_value, quote=1): - value = default_value - if opt_value: - if isinstance(opt_value, bool): - opt_value = 1 - value = opt_value - - if value is not None: - _add_to_env_and_define(conf, define_name, value, quote) - else: - conf.undefine(define_name) - - -def _get_git_rev(conf): - if conf.options.no_scm: - return - - if not os.path.isdir('.git'): - return - - try: - cmd = 'git rev-parse --short --revs-only HEAD' - revision = conf.cmd_and_log(cmd).strip() - except WafError: - return None - else: - return revision - - -def _load_intltool_if_available(conf): - try: - conf.load('intltool') - if 'LINGUAS' in os.environ: - conf.env['LINGUAS'] = os.environ['LINGUAS'] - except WafError: - # on Windows, we don't hard depend on intltool, on all other platforms raise an error - if not _target_is_win32(conf): - raise - - -def _target_is_win32(ctx): - if 'is_win32' in ctx.env: - # cached - return ctx.env['is_win32'] - is_win32 = None - if sys.platform == 'win32': - is_win32 = True - if is_win32 is None: - if ctx.env and 'CC' in ctx.env: - env_cc = ctx.env['CC'] - if not isinstance(env_cc, str): - env_cc = ''.join(env_cc) - is_win32 = (env_cc.find('mingw') != -1) - if is_win32 is None: - is_win32 = False - # cache for future checks - ctx.env['is_win32'] = is_win32 - return is_win32 - - -def _uc_first(string, ctx): - if _target_is_win32(ctx): - return string.title() - return string - - -# Copied from Geany-Plugins -def _check_c99(conf): - # FIXME: improve some checks? - # TODO: look at Autoconf's C99 checks? - fragment = ''' - // single-line comments - - #include <stdbool.h> - - struct s { int a, b; }; - - // inlines - static inline void fun_inline(struct s param) {} - - int main(void) { - _Bool b = false; - - // variable declaration in for body - for (int i = 0; i < 2; i++); - - // compound literals - fun_inline((struct s) { 1, 2 }); - - // mixed declarations and code - int mixed = 0; - - // named initializers - struct s name_inited = { - .a = 42, - .b = 64 - }; - - return (b || mixed || ! name_inited.a); - } - ''' - - exc = None - # list of flags is stolen from Autoconf 2.69 - flags = ['', '-std=gnu99', '-std=c99', '-c99', '-AC99', - '-D_STDC_C99=', '-qlanglvl=extc99'] - for flag in flags: - try: - desc = ['with flag %s' % flag, 'with no flags'][not flag] - conf.check_cc(fragment=fragment, uselib_store='C99', cflags=flag, - msg="Checking for C99 support (%s)" % desc) - exc = None - break - except ConfigurationError as e: - exc = e - if exc: - raise exc - return True
-------------- This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).