[geany/geany] 53a3ef: Port to the meson build system.

Thomas Martitz git-noreply at geany.org
Thu Apr 7 20:32:27 UTC 2022


Branch:      refs/heads/master
Author:      Thomas Martitz <thomas.martitz at mailbox.org>
Committer:   Thomas Martitz <thomas.martitz at mailbox.org>
Date:        Mon, 14 Mar 2022 21:16:26 UTC
Commit:      53a3eff3601ec4164a4ad80fa892920fb1989268
             https://github.com/geany/geany/commit/53a3eff3601ec4164a4ad80fa892920fb1989268

Log Message:
-----------
Port to the meson build system.

Benefits are blazing fast builds and more user friendly configuration.
This is promised by meson and I would agree in the case of Geany.

Autotools is supported and still the default.

Meson builds might have rough edges but should generally work OK.
Time will tell if it superseeds autotools builds completely.


Modified Paths:
--------------
    .github/workflows/build.yml
    README
    data/meson.build
    doc/meson.build
    icons/meson.build
    meson.build
    meson_options.txt
    plugins/meson.build
    po/meson.build
    tests/meson.build

Modified: .github/workflows/build.yml
63 lines changed, 63 insertions(+), 0 deletions(-)
===================================================================
@@ -102,7 +102,70 @@ jobs:
       - name: ccache statistics
         run: ccache --show-stats
         if: ${{ env.DEBUG == '1' }}
+  linux-meson:
+    name: Linux Meson Build
+    runs-on: ubuntu-20.04
 
+    strategy:
+      fail-fast: false
+
+    env:
+      CC: ccache gcc
+      CXX: ccache g++
+
+    steps:
+      - uses: actions/checkout at v2
+
+      # create and use a timestamp for the cache key: GH Actions will never update a cache
+      # only use an existing cache item or create a new one. To use an existing cache *and*
+      # push back the the updated cache after build, we use a always new cache key (to force
+      # the creation of the cache item at the end) in combination with "restore-keys" as fallback
+      - name: Prepare ccache timestamp
+        id: ccache_cache_timestamp
+        run: echo "::set-output name=timestamp::$(date +%Y-%m-%d-%H-%M)"
+
+      - name: Configure ccache
+        uses: actions/cache at v2
+        with:
+          path: ${{ env.CCACHE_DIR }}
+          key: ${{ runner.os }}-${{ github.job }}-ccache-${{ steps.ccache_cache_timestamp.outputs.timestamp }}
+          restore-keys: ${{ runner.os }}-${{ github.job }}-ccache-
+
+      - name: Show environment
+        run: env | sort
+        if: ${{ env.DEBUG == '1' }}
+
+      - name: Install dependencies
+        run: |
+          sudo apt-get update -qq
+          sudo apt-get install --assume-yes --no-install-recommends \
+            ccache \
+            gettext autopoint \
+            libtool \
+            libgtk-3-dev \
+            doxygen \
+            python3-docutils \
+            python3-lxml \
+            rst2pdf \
+            meson
+
+      - name: Configuration
+        run: |
+          meson _build
+
+      - name: Build
+        run: |
+          ninja -C _build
+
+      - name: Run Tests
+        run: |
+          ninja -C _build test
+
+      # distcheck not applicable, meson exports the source tree per git-archive
+
+      - name: ccache statistics
+        run: ccache --show-stats
+        if: ${{ env.DEBUG == '1' }}
 
   mingw:
     name: Mingw Build


Modified: README
32 lines changed, 32 insertions(+), 0 deletions(-)
===================================================================
@@ -78,6 +78,38 @@ and open the online version instead when requested.
 Installing from a Git clone
 +++++++++++++++++++++++++++
 
+Using the Meson build system
+++++++++++++++++++++++++++++
+
+N.B. Meson support is still incomplete and a work-in-progress.
+
+Meson requires to chose a separate build directory. Either create
+one, or let meson do it:
+
+`meson build` or `mkdir build; cd build; meson ..`
+
+Either command will configure the build system. The system is probed
+in many ways and system-dependant build files are created. This includes
+location of dependencies and compiler and linker flags required for them.
+
+To build Geany, follow with a `meson compile -C build`
+
+To install Geany, follow the build with a `sudo meson install -C build`.
+
+By default, meson will install Geany to `/usr/local`. A different
+prefix can be selected at the initial command or via reconfiguration:
+
+`meson --prefix /opt build` or `meson configure --prefix /opt build`
+
+Geany has some selectable features that may reduce the required
+build and runtime dependencies. See meson_optionts.txt for a full list.
+
+To turn a feature off, use `-D<feature>=false` when configuring the build,
+for example: `meson configure -Dvte=false build`
+
+Using Autotools
++++++++++++++++
+
 Install Autotools (*autopoint*, *automake*, *autoconf* and *libtool*),
 *gettext*, and the GLib development files **before** running any of the
 following commands, as well as *rst2html* from Docutils (see above for


Modified: data/meson.build
22 lines changed, 22 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,22 @@
+install_subdir('templates',    install_dir: cdata.get('GEANY_DATA_DIR'))
+install_subdir('tags',         install_dir: cdata.get('GEANY_DATA_DIR'))
+install_subdir('colorschemes', install_dir: cdata.get('GEANY_DATA_DIR'))
+
+install_subdir('filedefs',     install_dir: cdata.get('GEANY_DATA_DIR'), exclude_files: 'filetypes.python.in')
+
+configure_file(input: 'filedefs/filetypes.python.in',
+               output: 'filetypes.python',
+               install: true,
+               install_dir: cdata.get('GEANY_DATA_DIR') + '/filedefs',
+               configuration: cdata)
+
+misc = [
+    'filetype_extensions.conf',
+    'snippets.conf',
+    'ui_toolbar.xml',
+    'geany.glade',
+    'geany-3.0.css',
+    'geany-3.20.css',
+    'geany.css',
+]
+install_data(sources: misc, install_dir: cdata.get('GEANY_DATA_DIR'))


Modified: doc/meson.build
138 lines changed, 138 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,138 @@
+configure_file(
+	input: 'geany.1.in',
+	output: 'geany.1',
+	install: true,
+	install_dir: join_paths(join_paths(prefix, get_option('mandir'), 'man1')),
+	configuration: cdata
+)
+
+if rst2pdf.found()
+	custom_target('pdf-manual',
+		input: ['geany.txt'],
+		output: ['geany- at 0@.pdf'.format(cdata.get('VERSION'))],
+		command: [rst2pdf, '@INPUT@', '-o', '@OUTPUT@'],
+		build_by_default: true
+	)
+endif
+
+tarball = run_command('test', '-f', 'geany.html', check: false)
+if tarball.returncode() == 0 or rst2html.found()
+	install_data(
+		'images/build_menu_commands_dialog.png',
+		'images/find_dialog.png',
+		'images/find_in_files_dialog.png',
+		'images/main_window.png',
+		'images/pref_dialog_edit_completions.png',
+		'images/pref_dialog_edit_display.png',
+		'images/pref_dialog_edit_features.png',
+		'images/pref_dialog_edit_indentation.png',
+		'images/pref_dialog_files.png',
+		'images/pref_dialog_gen_misc.png',
+		'images/pref_dialog_gen_startup.png',
+		'images/pref_dialog_interface_interface.png',
+		'images/pref_dialog_interface_notebook.png',
+		'images/pref_dialog_interface_toolbar.png',
+		'images/pref_dialog_keys.png',
+		'images/pref_dialog_printing.png',
+		'images/pref_dialog_templ.png',
+		'images/pref_dialog_tools.png',
+		'images/pref_dialog_various.png',
+		'images/pref_dialog_vte.png',
+		'images/replace_dialog.png',
+		install_dir: join_paths(cdata.get('GEANY_DOC_DIR'), 'html', 'images')
+	)
+	if tarball.returncode() == 0
+		message('Building from tarball, installing prebuild html')
+		geany_html = files('geany.html')
+	else
+		cmd = [rst2html, '-stg', '--stylesheet=@INPUT0@', '@INPUT1@', '@OUTPUT@']
+		geany_html = custom_target('geany.html',
+			input: ['geany.css', 'geany.txt'],
+			output: ['geany.html'],
+			build_by_default: true,
+			command: cmd
+		)
+		custom_target('hacking.html',
+			input: ['geany.css', '../HACKING'],
+			output: ['hacking.html'],
+			build_by_default: true,
+			command: cmd
+		)
+	endif
+	# geany.html is installed as index.html
+	custom_target('index.html',
+		input: [geany_html],
+		output: ['index.html'],
+		command: [ln, '-f', '@INPUT@', '@OUTPUT@'],
+		install: true,
+		install_dir: join_paths(cdata.get('GEANY_DOC_DIR'), 'html')
+	)
+endif
+
+install_data('geany.txt',
+	rename: 'manual.txt',
+	install_dir: cdata.get('GEANY_DOC_DIR')
+)
+
+# Normally, doxygen is required for the gtkdoc headers
+# but it can be disabled if really needed (e.g. if plugins are also disabled),
+# packagers must not disable this!
+if doxygen.found()
+	doxcfg = configuration_data()
+	doxcfg.merge_from(cdata)
+	doxcfg.set('GIRONLY', '@internal')
+	doxcfg.set('HTML', 'YES')
+	doxcfg.set('XML', 'NO')
+	doxcfg.set('SORT', 'YES')
+
+	doxgicfg = doxcfg
+	doxgicfg.set('GIRONLY', '')
+	doxgicfg.set('HTML', 'NO')
+	doxgicfg.set('XML', 'YES')
+	doxgicfg.set('SORT', 'NO')
+
+	dep_doxygen = files([
+		'plugins.dox',
+		'pluginsignals.c',
+		'pluginsymbols.c',
+		'stash-example.c',
+		'stash-gui-example.c'
+	])
+	if python.found()
+		doxyfile_gi = configure_file(
+			input: 'Doxyfile.in',
+			output: 'Doxyfile-gi',
+			configuration: doxgicfg
+		)
+		doxygen_gi = custom_target('doxygen-gi',
+			input: doxyfile_gi,
+			# stamp file due https://github.com/mesonbuild/meson/issues/2320
+			output: 'doxygen-gi.stamp',
+			command: [sh, '-c', 'doxygen "$1" && touch "$2"', 'sh', '@INPUT@', '@OUTPUT@'],
+			depends: libgeany,
+			depend_files: dep_doxygen
+		)
+		gtkdoc_py = find_program('../scripts/gen-api-gtkdoc.py')
+		custom_target('gtkdoc-headers',
+			output: ['geany-gtkdoc.h', 'geany-sciwrappers-gtkdoc.h'],
+			command: [gtkdoc_py, join_paths(meson.current_build_dir(), 'xml'), '-d', '.', '-o', '@OUTPUT0@', '--sci-output', '@OUTPUT1@'],
+			depends: doxygen_gi,
+			install: true,
+			install_dir: join_paths(get_option('includedir'), 'geany', 'gtkdoc')
+		)
+	endif
+	doxyfile = configure_file(
+		input: 'Doxyfile.in',
+		output: 'Doxyfile',
+		configuration: doxcfg
+	)
+	custom_target('doxygen',
+		input: doxyfile,
+		# stamp file due https://github.com/mesonbuild/meson/issues/2320
+		output: 'doxygen.stamp',
+		command: [sh, '-c', 'doxygen "$1" && touch "$2"', 'sh', '@INPUT@', '@OUTPUT@'],
+		depends: libgeany,
+		depend_files: dep_doxygen,
+		build_by_default: true
+	)
+endif


Modified: icons/meson.build
46 lines changed, 46 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,46 @@
+icon_dirs = [ '16x16', '24x24', '32x32', '48x48', 'scalable' ]
+
+# in all resolutions
+app_icon = 'geany'
+
+# in all resolutions
+action_icons = [
+	'geany-build',
+	'geany-close-all',
+	'geany-save-all'
+]
+
+icons_dir = join_paths(get_option('datadir'), 'icons', 'hicolor')
+tango_dir = join_paths(get_option('datadir'), 'icons', 'Tango')
+
+foreach dir : icon_dirs
+    ext = dir == 'scalable' ? '.svg' : '.png'
+    install_data(join_paths(dir, app_icon+ext), install_dir: join_paths(icons_dir, dir, 'apps'))
+    foreach icon : action_icons
+        install_data(join_paths(dir, icon+ext), install_dir: join_paths(icons_dir, dir, 'actions'))
+    endforeach
+    install_data(join_paths('tango', dir, 'geany-save-all'+ext), install_dir: join_paths(tango_dir, dir, 'actions'))
+endforeach
+
+# classviewer icons only in 16x16
+class_icons = [
+	'classviewer-class.png',
+	'classviewer-macro.png',
+	'classviewer-member.png',
+	'classviewer-method.png',
+	'classviewer-namespace.png',
+	'classviewer-other.png',
+	'classviewer-struct.png',
+	'classviewer-var.png'
+]
+
+foreach icon : class_icons
+    install_data(join_paths('16x16', icon), install_dir: join_paths(icons_dir, '16x16', 'apps'))
+endforeach
+
+if meson.version().version_compare('>=0.57.0')
+    gnome.post_install(gtk_update_icon_cache: true)
+else
+    warning('You may need to run `gtk-update-icon-cache` yourself after installing')
+    warning('E.g. gtk-update-icon-cache -f -t ' + join_paths(prefix, icons_dir))
+endif


Modified: meson.build
912 lines changed, 912 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,912 @@
+project('geany', 'c', 'cpp',
+        meson_version: '>= 0.53',
+        version: '1.38',
+        default_options : ['c_std=c11', 'cpp_std=c++17'])
+
+gnome = import('gnome')
+pymod = import('python')
+
+cc = meson.get_compiler('c')
+cxx = meson.get_compiler('cpp')
+prefix = get_option('prefix')
+
+deps_in = [
+	['glib-2.0',    '2.32'],
+	['gmodule-2.0', '2.32'],
+	['gtk+-3.0',    '3.0']
+]
+
+deps = []
+deps_for_pc = ''
+foreach dep : deps_in
+	deps += [dependency(dep[0], version: '>= ' + dep[1])]
+	deps_for_pc += ' ' + dep[0] + ' >= ' + dep[1]
+endforeach
+
+glib = deps[0]
+
+# detect libc
+glibc = false
+if cc.has_header('gnu/libc-version.h')
+	glibc = true
+endif
+
+gnu_source = glibc
+
+cdata = configuration_data()
+check_headers = [
+	'alloca.h',
+	'asprintf.h',
+	'direct.h',
+	'dirent.h',
+	'dlfcn.h',
+	'errno.h',
+	'fcntl.h',
+	'fnmatch.h',
+	'glob.h',
+	'inttypes.h',
+	'io.h',
+	'langinfo.h',
+	'libintl.h',
+	'limits.h',
+	'locale.h',
+	'memory.h',
+	'stdbool.h',
+	'sys/dir.h',
+	'sys/stat.h',
+	'sys/time.h',
+	'sys/types.h',
+	'unistd.h',
+	'wchar.h',
+	'wctype.h',
+]
+
+check_functions = [
+	['alloca', '#include <alloca.h>'],
+	['asprintf', '#include <stdio.h>'],
+	['chsize', '#include <io.h>'],
+	['fnmatch', '#include <fnmatch.h>'],
+	['ftruncate', '#include <unistd.h>'],
+	['isblank', '#include <ctype.h>'],
+	['mbrtowc', '#include <wchar.h>'],
+	['memcpy',  '#include <string.h>'],
+	['mkstemp', '#include <stdlib.h>'],
+	['realpath', '#include <limits.h>\n#include <stdlib.h>'],
+	['regcomp', '#include <regex.h>'],
+	['socket', '#include <sys/socket.h>'],
+	# man page says strings.h but we include only string.h and it works
+	['strcasecmp', '#include <string.h>'],
+	['strncasecmp', '#include <string.h>'],
+	['stricmp', '#include <string.h>'],
+	['strnicmp', '#include <string.h>'],
+	['strerror', '#include <string.h>'],
+	['strstr', '#include <string.h>'],
+	['tempnam', '#include <stdio.h>'],
+	['truncate', '#include <unistd.h>'],
+	['wcrtomb', '#include <wchar.h>'],
+	['wcscoll', '#include <wchar.h>'],
+
+]
+
+foreach h : check_headers
+	define = 'HAVE_' + h.underscorify().to_upper()
+	if cc.has_header(h)
+		cdata.set(define, 1)
+	else
+		cdata.set(define, false)
+	endif
+endforeach
+
+foreach f : check_functions
+	define = 'HAVE_' + f.get(0).underscorify().to_upper()
+	ccprefix = '\n'.join([gnu_source ? '#define _GNU_SOURCE' : '', f.get(1)])
+	if cc.has_function(f.get(0), prefix : ccprefix)
+		cdata.set(define, 1)
+	else
+		cdata.set(define, false)
+	endif
+endforeach
+
+# From configure.ac:
+# non-functions checks for u-ctags.  Not that we really need those as we don't
+# use u-ctags's main, but the corresponding macros have to be defined to
+# something, so simply perform the actual checks.
+#AC_CHECK_DECLS([__environ],,,[[#include <unistd.h>]])
+#AC_CHECK_DECLS([_NSGetEnviron],,,[[#include <crt_externs.h>]])
+# In meson we cannot as easily test for declarations so defining as 0 is easiest
+cdata.set('HAVE_DECL___ENVIRON', 0)
+cdata.set('HAVE_DECL__NSGETENVIRON', 0)
+
+cdata.set_quoted('PACKAGE', 'geany')
+cdata.set_quoted('PACKAGE_BUGREPORT', 'https://github.com/geany/geany/issues')
+cdata.set_quoted('PACKAGE_NAME','Geany')
+cdata.set_quoted('PACKAGE_STRING', 'Geany ' + meson.project_version())
+cdata.set_quoted('PACKAGE_VERSION', meson.project_version())
+cdata.set('GETTEXT_PACKAGE', 'PACKAGE')
+cdata.set('VERSION', meson.project_version())
+cdata.set('ENABLE_NLS', 1)
+if (host_machine.system() == 'windows')
+	cdata.set('HAVE_VTE', false)
+else
+	cdata.set('HAVE_VTE', get_option('vte'))
+endif
+cdata.set('HAVE_PLUGINS', get_option('plugins'))
+cdata.set('HAVE_SOCKET', get_option('socket'))
+if (host_machine.system() == 'windows')
+	cdata.set('GEANY_DATA_DIR', join_paths(prefix, 'data'))
+	cdata.set('GEANY_DOC_DIR', join_paths(prefix))
+else
+	cdata.set('GEANY_DATA_DIR', join_paths(prefix, get_option('datadir'), 'geany'))
+	cdata.set('GEANY_DOC_DIR', join_paths(prefix, get_option('datadir'), 'doc', 'geany'))
+endif
+cdata.set('top_srcdir', meson.source_root())
+cdata.set('top_builddir', meson.build_root())
+
+# for geany.pc (adapted from GTK+)
+pcconf = cdata
+pcconf.set('DEPENDENCIES', deps_for_pc)
+pcconf.set('prefix', get_option('prefix'))
+pcconf.set('libdir', join_paths('${exec_prefix}', get_option('libdir')))
+pcconf.set('includedir', join_paths('${prefix}', get_option('includedir')))
+pcconf.set('datarootdir', join_paths('${prefix}', get_option('datadir')))
+# actually constant, just match autconf
+pcconf.set('exec_prefix', '${prefix}')
+pcconf.set('datadir', '${datarootdir}')
+pcconf.set('localedir', join_paths('${datarootdir}', 'locale'))
+
+# needed programs
+sh = find_program('sh')
+cp = find_program('cp')
+ln = find_program('ln')
+doxygen = find_program('doxygen', required: get_option('api-docs'))
+python = pymod.find_installation('python3', modules: doxygen.found() and get_option('gtkdoc') ? ['lxml'] : [])
+# These two are truly optional
+rst2html = find_program('rst2html', required: get_option('html-docs'))
+rst2pdf = find_program('rst2pdf', required: get_option('pdf-docs'))
+git = find_program('git', required: false)
+if git.found()
+	ret = run_command(git, 'rev-parse', '--short', '--revs-only', 'HEAD', check: true)
+	cdata.set_quoted('REVISION', ret.stdout().strip())
+else
+	cdata.set_quoted('REVISION', '-1')
+endif
+
+python_command = get_option('python-command')
+if python_command == '' or python_command == 'auto'
+	if target_machine.system() == 'windows'
+		python_command = 'py'
+	else
+		python_command = 'python'
+	endif
+endif
+cdata.set('PYTHON_COMMAND', python_command)
+
+configure_file(
+	output : 'config.h',
+	configuration : cdata
+)
+
+configure_file(
+	input: 'geany.pc.in',
+	install: true,
+	install_dir: join_paths(prefix, get_option('libdir'), 'pkgconfig'),
+	output: 'geany.pc',
+	configuration: pcconf
+)
+
+# CFLAGS for basic stuff that only depends on libc
+basic_cflags  = [ '-DHAVE_CONFIG_H=1', '-O2' ]
+if (gnu_source)
+	basic_cflags += '-D_GNU_SOURCE'
+endif
+
+# CFLAGS common between Geany and bundled plugins
+def_cflags = basic_cflags + [
+	'-DGTK',
+# we're using lots of deprecated stuff with gtk3 (often because there is no proper alternative!)
+	'-Wno-deprecated-declarations',
+	'-DGDK_DISABLE_DEPRECATION_WARNINGS',
+	'-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_32',
+	'-DGEANY_PREFIX="@0@"'.format(get_option('prefix')),
+	'-DGEANY_DOCDIR="@0@"'.format(join_paths(prefix, get_option('datadir'), 'doc'))
+]
+foreach d : [ 'includedir', 'libdir', 'libexecdir', 'datadir', 'localedir' ]
+	def_cflags += '-DGEANY_ at 0@="@1@"'.format(d.underscorify().to_upper(), join_paths(prefix, get_option(d)))
+endforeach
+
+# CFLAGS for everything else, i.e. most of Geany
+geany_cflags = def_cflags
+have_gcc4_visibility = cc.has_argument('-fvisibility=hidden')
+geany_cflags += '-DGEANY_PRIVATE'
+if target_machine.system() == 'windows'
+	geany_cflags += '-DGEANY_EXPORT_SYMBOL=__declspec(dllexport)'
+elif have_gcc4_visibility
+	geany_cflags += '-fvisibility=hidden'
+	geany_cflags += '-DGEANY_EXPORT_SYMBOL=__attribute__((visibility("default")))'
+endif
+geany_cflags += '-DGEANY_API_SYMBOL=GEANY_EXPORT_SYMBOL'
+sci_cflags = geany_cflags
+sci_cflags += [ '-std=c++17', '-Wno-non-virtual-dtor', '-DNDEBUG', '-DSCI_LEXER', '-DNO_CXX11_REGEX' ]
+
+iregex = include_directories('ctags/gnu_regex')
+ifnmatch = include_directories('ctags/fnmatch')
+ictags = include_directories('ctags/main', 'ctags/parsers', 'ctags/dsl')
+itagmanager = include_directories('src/tagmanager')
+iscintilla = include_directories('scintilla/include', 'scintilla/lexilla/include')
+igeany = include_directories('src')
+
+install_headers(
+	'scintilla/include/Scintilla.h',
+	'scintilla/include/Scintilla.iface',
+	'scintilla/include/ScintillaWidget.h',
+	'scintilla/include/Sci_Position.h',
+	'scintilla/lexilla/include/SciLexer.h',
+	subdir: 'geany/scintilla'
+)
+
+lexilla = static_library('lexilla',
+	'scintilla/lexilla/include/Lexilla.h',
+	'scintilla/lexilla/include/SciLexer.h',
+	'scintilla/lexilla/lexers/LexAbaqus.cxx',
+	'scintilla/lexilla/lexers/LexAda.cxx',
+	'scintilla/lexilla/lexers/LexAsciidoc.cxx',
+	'scintilla/lexilla/lexers/LexAsm.cxx',
+	'scintilla/lexilla/lexers/LexBash.cxx',
+	'scintilla/lexilla/lexers/LexBasic.cxx',
+	'scintilla/lexilla/lexers/LexBatch.cxx',
+	'scintilla/lexilla/lexers/LexCaml.cxx',
+	'scintilla/lexilla/lexers/LexCmake.cxx',
+	'scintilla/lexilla/lexers/LexCOBOL.cxx',
+	'scintilla/lexilla/lexers/LexCoffeeScript.cxx',
+	'scintilla/lexilla/lexers/LexCPP.cxx',
+	'scintilla/lexilla/lexers/LexCSS.cxx',
+	'scintilla/lexilla/lexers/LexD.cxx',
+	'scintilla/lexilla/lexers/LexDiff.cxx',
+	'scintilla/lexilla/lexers/LexErlang.cxx',
+	'scintilla/lexilla/lexers/LexForth.cxx',
+	'scintilla/lexilla/lexers/LexGDScript.cxx',
+	'scintilla/lexilla/lexers/LexFortran.cxx',
+	'scintilla/lexilla/lexers/LexHaskell.cxx',
+	'scintilla/lexilla/lexers/LexHTML.cxx',
+	'scintilla/lexilla/lexers/LexJulia.cxx',
+	'scintilla/lexilla/lexers/LexLaTeX.cxx',
+	'scintilla/lexilla/lexers/LexLisp.cxx',
+	'scintilla/lexilla/lexers/LexLua.cxx',
+	'scintilla/lexilla/lexers/LexMake.cxx',
+	'scintilla/lexilla/lexers/LexMarkdown.cxx',
+	'scintilla/lexilla/lexers/LexMatlab.cxx',
+	'scintilla/lexilla/lexers/LexNsis.cxx',
+	'scintilla/lexilla/lexers/LexNull.cxx',
+	'scintilla/lexilla/lexers/LexPascal.cxx',
+	'scintilla/lexilla/lexers/LexPerl.cxx',
+	'scintilla/lexilla/lexers/LexPO.cxx',
+	'scintilla/lexilla/lexers/LexPowerShell.cxx',
+	'scintilla/lexilla/lexers/LexProps.cxx',
+	'scintilla/lexilla/lexers/LexPython.cxx',
+	'scintilla/lexilla/lexers/LexR.cxx',
+	'scintilla/lexilla/lexers/LexRuby.cxx',
+	'scintilla/lexilla/lexers/LexRust.cxx',
+	'scintilla/lexilla/lexers/LexSmalltalk.cxx',
+	'scintilla/lexilla/lexers/LexSQL.cxx',
+	'scintilla/lexilla/lexers/LexTCL.cxx',
+	'scintilla/lexilla/lexers/LexTxt2tags.cxx',
+	'scintilla/lexilla/lexers/LexVerilog.cxx',
+	'scintilla/lexilla/lexers/LexVHDL.cxx',
+	'scintilla/lexilla/lexers/LexYAML.cxx',
+	'scintilla/lexilla/lexlib/Accessor.cxx',
+	'scintilla/lexilla/lexlib/Accessor.h',
+	'scintilla/lexilla/lexlib/CatalogueModules.h',
+	'scintilla/lexilla/lexlib/CharacterCategory.cxx',
+	'scintilla/lexilla/lexlib/CharacterCategory.h',
+	'scintilla/lexilla/lexlib/CharacterSet.cxx',
+	'scintilla/lexilla/lexlib/CharacterSet.h',
+	'scintilla/lexilla/lexlib/DefaultLexer.cxx',
+	'scintilla/lexilla/lexlib/DefaultLexer.h',
+	'scintilla/lexilla/lexlib/LexAccessor.cxx',
+	'scintilla/lexilla/lexlib/LexAccessor.h',
+	'scintilla/lexilla/lexlib/LexerBase.cxx',
+	'scintilla/lexilla/lexlib/LexerBase.h',
+	'scintilla/lexilla/lexlib/LexerModule.cxx',
+	'scintilla/lexilla/lexlib/LexerModule.h',
+	'scintilla/lexilla/lexlib/LexerNoExceptions.cxx',
+	'scintilla/lexilla/lexlib/LexerNoExceptions.h',
+	'scintilla/lexilla/lexlib/LexerSimple.cxx',
+	'scintilla/lexilla/lexlib/LexerSimple.h',
+	'scintilla/lexilla/lexlib/OptionSet.h',
+	'scintilla/lexilla/lexlib/PropSetSimple.cxx',
+	'scintilla/lexilla/lexlib/PropSetSimple.h',
+	'scintilla/lexilla/lexlib/SparseState.h',
+	'scintilla/lexilla/lexlib/StringCopy.h',
+	'scintilla/lexilla/lexlib/StyleContext.cxx',
+	'scintilla/lexilla/lexlib/StyleContext.h',
+	'scintilla/lexilla/lexlib/SubStyles.h',
+	'scintilla/lexilla/lexlib/WordList.cxx',
+	'scintilla/lexilla/lexlib/WordList.h',
+	'scintilla/lexilla/src/Lexilla.cxx',
+	cpp_args: sci_cflags,
+	dependencies: deps,
+	include_directories: [
+		iscintilla,
+		include_directories('scintilla/lexilla/lexlib', 'scintilla/lexilla/include')
+	]
+)
+dep_lexilla = declare_dependency(
+	link_with: lexilla,
+	include_directories: include_directories('scintilla/lexilla/include')
+)
+
+scintilla = static_library('scintilla',
+	'scintilla/gtk/Converter.h',
+	'scintilla/gtk/PlatGTK.cxx',
+	'scintilla/gtk/ScintillaGTKAccessible.cxx',
+	'scintilla/gtk/ScintillaGTKAccessible.h',
+	'scintilla/gtk/ScintillaGTK.cxx',
+	'scintilla/gtk/ScintillaGTK.h',
+	'scintilla/gtk/scintilla-marshal.c',
+	'scintilla/gtk/scintilla-marshal.h',
+	'scintilla/include/ILexer.h',
+	'scintilla/include/ILoader.h',
+	'scintilla/include/ScintillaCall.h',
+	'scintilla/include/Scintilla.h',
+	'scintilla/include/ScintillaMessages.h',
+	'scintilla/include/ScintillaStructures.h',
+	'scintilla/include/ScintillaTypes.h',
+	'scintilla/include/ScintillaWidget.h',
+	'scintilla/include/Sci_Position.h',
+	'scintilla/src/AutoComplete.cxx',
+	'scintilla/src/AutoComplete.h',
+	'scintilla/src/CallTip.cxx',
+	'scintilla/src/CallTip.h',
+	'scintilla/src/CaseConvert.cxx',
+	'scintilla/src/CaseConvert.h',
+	'scintilla/src/CaseFolder.cxx',
+	'scintilla/src/CaseFolder.h',
+	'scintilla/src/CellBuffer.cxx',
+	'scintilla/src/CellBuffer.h',
+	'scintilla/src/CharacterCategoryMap.cxx',
+	'scintilla/src/CharacterCategoryMap.h',
+	'scintilla/src/CharacterType.cxx',
+	'scintilla/src/CharacterType.h',
+	'scintilla/src/CharClassify.cxx',
+	'scintilla/src/CharClassify.h',
+	'scintilla/src/ContractionState.cxx',
+	'scintilla/src/ContractionState.h',
+	'scintilla/src/DBCS.cxx',
+	'scintilla/src/DBCS.h',
+	'scintilla/src/Debugging.h',
+	'scintilla/src/Decoration.cxx',
+	'scintilla/src/Decoration.h',
+	'scintilla/src/Document.cxx',
+	'scintilla/src/Document.h',
+	'scintilla/src/EditModel.cxx',
+	'scintilla/src/EditModel.h',
+	'scintilla/src/Editor.cxx',
+	'scintilla/src/Editor.h',
+	'scintilla/src/EditView.cxx',
+	'scintilla/src/EditView.h',
+	'scintilla/src/ElapsedPeriod.h',
+	'scintilla/src/FontQuality.h',
+	'scintilla/src/Geometry.cxx',
+	'scintilla/src/Geometry.h',
+	'scintilla/src/Indicator.cxx',
+	'scintilla/src/Indicator.h',
+	'scintilla/src/KeyMap.cxx',
+	'scintilla/src/KeyMap.h',
+	'scintilla/src/LineMarker.cxx',
+	'scintilla/src/LineMarker.h',
+	'scintilla/src/MarginView.cxx',
+	'scintilla/src/MarginView.h',
+	'scintilla/src/Partitioning.h',
+	'scintilla/src/PerLine.cxx',
+	'scintilla/src/PerLine.h',
+	'scintilla/src/Platform.h',
+	'scintilla/src/PositionCache.cxx',
+	'scintilla/src/PositionCache.h',
+	'scintilla/src/Position.h',
+	'scintilla/src/RESearch.cxx',
+	'scintilla/src/RESearch.h',
+	'scintilla/src/RunStyles.cxx',
+	'scintilla/src/RunStyles.h',
+	'scintilla/src/ScintillaBase.cxx',
+	'scintilla/src/ScintillaBase.h',
+	'scintilla/src/Selection.cxx',
+	'scintilla/src/Selection.h',
+	'scintilla/src/SparseVector.h',
+	'scintilla/src/SplitVector.h',
+	'scintilla/src/Style.cxx',
+	'scintilla/src/Style.h',
+	'scintilla/src/UniConversion.cxx',
+	'scintilla/src/UniConversion.h',
+	'scintilla/src/UniqueString.cxx',
+	'scintilla/src/UniqueString.h',
+	'scintilla/src/ViewStyle.cxx',
+	'scintilla/src/ViewStyle.h',
+	'scintilla/src/XPM.cxx',
+	'scintilla/src/XPM.h',
+	cpp_args: sci_cflags,
+	dependencies: deps + [ dep_lexilla ],
+	include_directories: [
+		iscintilla,
+		include_directories('scintilla/include', 'scintilla/src')
+	]
+)
+dep_scintilla = declare_dependency(
+	link_with: scintilla,
+	include_directories: include_directories('scintilla/include')
+)
+
+if cdata.get('HAVE_FNMATCH') == 1
+	dep_fnmatch = dependency('', required: false)
+else
+	# use fnmatch bundled with ctags
+	fnmatch = static_library('fnmatch',
+		'ctags/fnmatch/fnmatch.c',
+		'ctags/fnmatch/fnmatch.h',
+		include_directories: [ifnmatch],
+		c_args: basic_cflags
+	)
+	dep_fnmatch = declare_dependency(link_with: [fnmatch], include_directories: [ifnmatch])
+endif
+
+if cdata.get('HAVE_REGCOMP') == 1
+	dep_regex = dependency('', required: false)
+else
+	# use regcomp bundled with ctags
+	regex = static_library('regex',
+		'ctags/gnu_regex/regex.c',
+		'ctags/gnu_regex/regex.h',
+		dependencies: [dep_fnmatch],
+		c_args: basic_cflags + [ '-D__USE_GNU' ]
+	)
+	dep_regex = declare_dependency(link_with: [regex], include_directories: [iregex])
+endif
+
+ctags = static_library('ctags',
+	'ctags/dsl/es.c',
+	'ctags/dsl/es.h',
+	'ctags/dsl/optscript.c',
+	'ctags/dsl/optscript.h',
+	'ctags/main/args.c',
+	'ctags/main/args_p.h',
+	'ctags/main/colprint.c',
+	'ctags/main/colprint_p.h',
+	'ctags/main/CommonPrelude.c',
+	'ctags/main/ctags.h',
+	'ctags/main/debug.c',
+	'ctags/main/debug.h',
+	'ctags/main/dependency.c',
+	'ctags/main/dependency.h',
+	'ctags/main/dependency_p.h',
+	'ctags/main/e_msoft.h',
+	'ctags/main/entry.c',
+	'ctags/main/entry.h',
+	'ctags/main/entry_p.h',
+	'ctags/main/entry_private.c',
+	'ctags/main/error.c',
+	'ctags/main/error_p.h',
+	'ctags/main/field.c',
+	'ctags/main/field.h',
+	'ctags/main/field_p.h',
+	'ctags/main/flags.c',
+	'ctags/main/flags_p.h',
+	'ctags/main/fmt.c',
+	'ctags/main/fmt_p.h',
+	'ctags/main/gcc-attr.h',
+	'ctags/main/general.h',
+	'ctags/main/gvars.h',
+	'ctags/main/htable.c',
+	'ctags/main/htable.h',
+	'ctags/main/inline.h',
+	'ctags/main/interactive_p.h',
+	'ctags/main/keyword.c',
+	'ctags/main/keyword.h',
+	'ctags/main/keyword_p.h',
+	'ctags/main/kind.c',
+	'ctags/main/kind.h',
+	'ctags/main/kind_p.h',
+	'ctags/main/lregex.c',
+	'ctags/main/lregex-default.c',
+	'ctags/main/lregex.h',
+	'ctags/main/lregex_p.h',
+	'ctags/main/lxpath.c',
+	'ctags/main/lxpath.h',
+	'ctags/main/lxpath_p.h',
+	'ctags/main/main.c',
+	'ctags/main/main_p.h',
+	'ctags/main/mbcs.c',
+	'ctags/main/mbcs.h',
+	'ctags/main/mbcs_p.h',
+	'ctags/main/mio.c',
+	'ctags/main/mio.h',
+	'ctags/main/nestlevel.c',
+	'ctags/main/nestlevel.h',
+	'ctags/main/numarray.c',
+	'ctags/main/numarray.h',
+	'ctags/main/objpool.c',
+	'ctags/main/objpool.h',
+	'ctags/main/options.c',
+	'ctags/main/options.h',
+	'ctags/main/options_p.h',
+	'ctags/main/param.c',
+	'ctags/main/param.h',
+	'ctags/main/param_p.h',
+	'ctags/main/parse.c',
+	'ctags/main/parse.h',
+	'ctags/main/parse_p.h',
+	'ctags/main/parsers_p.h',
+	'ctags/main/portable-dirent_p.h',
+	'ctags/main/portable-scandir.c',
+	'ctags/main/promise.c',
+	'ctags/main/promise.h',
+	'ctags/main/promise_p.h',
+	'ctags/main/ptag.c',
+	'ctags/main/ptag_p.h',
+	'ctags/main/ptrarray.c',
+	'ctags/main/ptrarray.h',
+	'ctags/main/rbtree.c',
+	'ctags/main/rbtree.h',
+	'ctags/main/read.c',
+	'ctags/main/read.h',
+	'ctags/main/read_p.h',
+	'ctags/main/repoinfo.c',
+	'ctags/main/repoinfo.h',
+	'ctags/main/routines.c',
+	'ctags/main/routines.h',
+	'ctags/main/routines_p.h',
+	'ctags/main/script.c',
+	'ctags/main/script_p.h',
+	'ctags/main/seccomp.c',
+	'ctags/main/selectors.c',
+	'ctags/main/selectors.h',
+	'ctags/main/sort.c',
+	'ctags/main/sort_p.h',
+	'ctags/main/stats.c',
+	'ctags/main/stats_p.h',
+	'ctags/main/strlist.c',
+	'ctags/main/strlist.h',
+	'ctags/main/subparser.h',
+	'ctags/main/subparser_p.h',
+	'ctags/main/tokeninfo.c',
+	'ctags/main/tokeninfo.h',
+	'ctags/main/trace.c',
+	'ctags/main/trace.h',
+	'ctags/main/trashbox.c',
+	'ctags/main/trashbox.h',
+	'ctags/main/trashbox_p.h',
+	'ctags/main/types.h',
+	'ctags/main/unwindi.c',
+	'ctags/main/unwindi.h',
+	'ctags/main/vstring.c',
+	'ctags/main/vstring.h',
+	'ctags/main/writer.c',
+	'ctags/main/writer-ctags.c',
+	'ctags/main/writer-etags.c',
+	'ctags/main/writer-json.c',
+	'ctags/main/writer_p.h',
+	'ctags/main/writer-xref.c',
+	'ctags/main/xtag.c',
+	'ctags/main/xtag.h',
+	'ctags/main/xtag_p.h',
+	'ctags/parsers/abaqus.c',
+	'ctags/parsers/abc.c',
+	'ctags/parsers/asciidoc.c',
+	'ctags/parsers/asm.c',
+	'ctags/parsers/basic.c',
+	'ctags/parsers/bibtex.c',
+	'ctags/parsers/cobol.c',
+	'ctags/parsers/cpreprocessor.c',
+	'ctags/parsers/cpreprocessor.h',
+	'ctags/parsers/css.c',
+	'ctags/parsers/cxx/cxx.c',
+	'ctags/parsers/cxx/cxx_debug.c',
+	'ctags/parsers/cxx/cxx_debug.h',
+	'ctags/parsers/cxx/cxx_debug_type.c',
+	'ctags/parsers/cxx/cxx_keyword.c',
+	'ctags/parsers/cxx/cxx_keyword.h',
+	'ctags/parsers/cxx/cxx_parser_block.c',
+	'ctags/parsers/cxx/cxx_parser.c',
+	'ctags/parsers/cxx/cxx_parser_function.c',
+	'ctags/parsers/cxx/cxx_parser.h',
+	'ctags/parsers/cxx/cxx_parser_internal.h',
+	'ctags/parsers/cxx/cxx_parser_lambda.c',
+	'ctags/parsers/cxx/cxx_parser_namespace.c',
+	'ctags/parsers/cxx/cxx_parser_template.c',
+	'ctags/parsers/cxx/cxx_parser_tokenizer.c',
+	'ctags/parsers/cxx/cxx_parser_typedef.c',
+	'ctags/parsers/cxx/cxx_parser_using.c',
+	'ctags/parsers/cxx/cxx_parser_variable.c',
+	'ctags/parsers/cxx/cxx_qtmoc.c',
+	'ctags/parsers/cxx/cxx_scope.c',
+	'ctags/parsers/cxx/cxx_scope.h',
+	'ctags/parsers/cxx/cxx_subparser.c',
+	'ctags/parsers/cxx/cxx_subparser.h',
+	'ctags/parsers/cxx/cxx_subparser_internal.h',
+	'ctags/parsers/cxx/cxx_tag.c',
+	'ctags/parsers/cxx/cxx_tag.h',
+	'ctags/parsers/cxx/cxx_token.c',
+	'ctags/parsers/cxx/cxx_token_chain.c',
+	'ctags/parsers/cxx/cxx_token_chain.h',
+	'ctags/parsers/cxx/cxx_token.h',
+	'ctags/parsers/diff.c',
+	'ctags/parsers/erlang.c',
+	'ctags/parsers/flex.c',
+	'ctags/parsers/gdscript.c',
+	'ctags/parsers/geany_c.c',
+	'ctags/parsers/geany_docbook.c',
+	'ctags/parsers/geany_fortran.c',
+	'ctags/parsers/geany_lcpp.c',
+	'ctags/parsers/geany_lcpp.h',
+	'ctags/parsers/geany_markdown.c',
+	'ctags/parsers/geany_matlab.c',
+	'ctags/parsers/geany_tcl.c',
+	'ctags/parsers/geany_tex.c',
+	'ctags/parsers/geany_vhdl.c',
+	'ctags/parsers/go.c',
+	'ctags/parsers/haskell.c',
+	'ctags/parsers/haxe.c',
+	'ctags/parsers/html.c',
+	'ctags/parsers/iniconf.c',
+	'ctags/parsers/iniconf.h',
+	'ctags/parsers/jscript.c',
+	'ctags/parsers/json.c',
+	'ctags/parsers/julia.c',
+	'ctags/parsers/lua.c',
+	'ctags/parsers/make.c',
+	'ctags/parsers/make.h',
+	'ctags/parsers/nsis.c',
+	'ctags/parsers/objc.c',
+	'ctags/parsers/pascal.c',
+	'ctags/parsers/perl.c',
+	'ctags/parsers/perl.h',
+	'ctags/parsers/php.c',
+	'ctags/parsers/powershell.c',
+	'ctags/parsers/python.c',
+	'ctags/parsers/r.c',
+	'ctags/parsers/r.h',
+	'ctags/parsers/rst.c',
+	'ctags/parsers/ruby.c',
+	'ctags/parsers/rust.c',
+	'ctags/parsers/sh.c',
+	'ctags/parsers/sql.c',
+	'ctags/parsers/txt2tags.c',
+	'ctags/parsers/verilog.c',
+	c_args: geany_cflags + [ '-DG_LOG_DOMAIN="CTags"',
+	                         '-DEXTERNAL_PARSER_LIST_FILE="src/tagmanager/tm_parsers.h"' ],
+	dependencies: deps + [dep_fnmatch, dep_regex],
+	include_directories: [ictags]
+)
+dep_ctags = declare_dependency(link_with: [ctags], include_directories: [ictags])
+
+install_headers(
+	'src/tagmanager/tm_source_file.h',
+	'src/tagmanager/tm_tag.h',
+	'src/tagmanager/tm_workspace.h',
+	'src/tagmanager/tm_parser.h',
+	subdir: 'geany/tagmanager'
+)
+
+tagmanager = static_library('tagmanager',
+	'src/tagmanager/tm_ctags.h',
+	'src/tagmanager/tm_ctags.c',
+	'src/tagmanager/tm_parser.h',
+	'src/tagmanager/tm_parser.c',
+	'src/tagmanager/tm_parsers.h',
+	'src/tagmanager/tm_source_file.h',
+	'src/tagmanager/tm_source_file.c',
+	'src/tagmanager/tm_tag.h',
+	'src/tagmanager/tm_tag.c',
+	'src/tagmanager/tm_workspace.h',
+	'src/tagmanager/tm_workspace.c',
+	c_args: geany_cflags + [ '-DG_LOG_DOMAIN="Tagmanager"' ],
+	dependencies: [dep_ctags, glib]
+)
+dep_tagmanager = declare_dependency(
+	link_with: tagmanager,
+	include_directories: [itagmanager]
+)
+
+# Generate signallist.i
+gen_src = custom_target('gen-signallist',
+	input : [ 'data/geany.glade' ],
+	output : [ 'signallist.i' ],
+	command : [find_program('scripts/gen-signallist.sh'), '@INPUT@', '@OUTPUT@' ]
+)
+
+win_src = []
+win_deps = []
+if (host_machine.system() == 'windows')
+	win_src += [ 'src/win32.c', 'src/win32.h' ]
+	foreach lib : ['ole32', 'wsock32', 'comdlg32']
+		win_deps += cc.find_library(lib)
+	endforeach
+endif
+
+install_headers(
+	'plugins/geanyfunctions.h',
+	'plugins/geanyplugin.h',
+	'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/gtkcompat.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',
+	subdir: 'geany'
+)
+
+libgeany = shared_library('geany',
+	'src/about.c',
+	'src/about.h',
+	'src/app.h',
+	'src/build.c',
+	'src/build.h',
+	'src/callbacks.c',
+	'src/callbacks.h',
+	'src/dialogs.c',
+	'src/dialogs.h',
+	'src/document.c',
+	'src/document.h',
+	'src/editor.c',
+	'src/editor.h',
+	'src/encodings.c',
+	'src/encodings.h',
+	'src/filetypes.c',
+	'src/filetypes.h',
+	'src/geanyentryaction.c',
+	'src/geanyentryaction.h',
+	'src/geanymenubuttonaction.c',
+	'src/geanymenubuttonaction.h',
+	'src/geanyobject.c',
+	'src/geanyobject.h',
+	'src/geanywraplabel.c',
+	'src/geanywraplabel.h',
+	'src/gtkcompat.h',
+	'src/highlighting.c',
+	'src/highlighting.h',
+	'src/highlightingmappings.h',
+	'src/keybindings.c',
+	'src/keybindings.h',
+	'src/keyfile.c',
+	'src/keyfile.h',
+	'src/log.c',
+	'src/log.h',
+	'src/libmain.c',
+	'src/main.h',
+	'src/geany.h',
+	'src/msgwindow.c',
+	'src/msgwindow.h',
+	'src/navqueue.c',
+	'src/navqueue.h',
+	'src/notebook.c',
+	'src/notebook.h',
+	'src/plugins.c',
+	'src/plugins.h',
+	'src/pluginutils.c',
+	'src/pluginutils.h',
+	'src/prefs.c',
+	'src/prefs.h',
+	'src/printing.c',
+	'src/printing.h',
+	'src/project.c',
+	'src/project.h',
+	'src/sciwrappers.c',
+	'src/sciwrappers.h',
+	'src/search.c',
+	'src/search.h',
+	'src/socket.c',
+	'src/socket.h',
+	'src/spawn.c',
+	'src/spawn.h',
+	'src/stash.c',
+	'src/stash.h',
+	'src/support.h',
+	'src/symbols.c',
+	'src/symbols.h',
+	'src/templates.c',
+	'src/templates.h',
+	'src/toolbar.c',
+	'src/toolbar.h',
+	'src/tools.c',
+	'src/tools.h',
+	'src/sidebar.c',
+	'src/sidebar.h',
+	'src/ui_utils.c',
+	'src/ui_utils.h',
+	'src/utils.c',
+	'src/utils.h',
+	gen_src,
+	win_src,
+	host_machine.system() == 'windows' ? ['src/win32.c',  'src/win32.h'] : [ 'src/vte.c', 'src/vte.h' ],
+	soversion: '0',
+	c_args: geany_cflags + [ '-DG_LOG_DOMAIN="Geany"' ],
+	include_directories: [iscintilla],
+	dependencies: [dep_tagmanager, dep_ctags, dep_scintilla] + deps + win_deps,
+	install: true
+)
+dep_libgeany = declare_dependency(
+	link_with: libgeany,
+	include_directories: [igeany]
+)
+
+executable('geany',
+	'src/main.c',
+	link_with: libgeany,
+	c_args: geany_cflags + [ '-DG_LOG_DOMAIN="Geany"' ],
+	dependencies: deps,
+	build_rpath: meson.build_root(),
+	install_rpath: '$ORIGIN/../' + get_option('libdir'),
+	install: true
+)
+
+i18n = import('i18n')
+
+desktop_file = 'geany.desktop'
+desktop_output_file = i18n.merge_file(
+	type: 'desktop',
+	input: desktop_file + '.in',
+	output: desktop_file,
+	po_dir: 'po',
+	install: true,
+	install_dir: join_paths(get_option('datadir'), 'applications')
+)
+
+subdir('po')
+subdir('data')
+subdir('doc')
+subdir('icons')
+subdir('plugins')
+subdir('tests')
+
+install_data('COPYING', rename: 'GPL-2')
+install_data(
+	'scintilla/License.txt',
+	'scintilla/lexilla/License.txt',
+	rename: [
+		'ScintillaLicense.txt',
+		'LexillaLicense.txt'
+	],
+	install_dir: cdata.get('GEANY_DOC_DIR')
+)
+misc = [
+	'AUTHORS',
+	'COPYING',
+	'ChangeLog',
+	'NEWS',
+	'README',
+	'THANKS',
+	'TODO'
+]
+install_data(misc, install_dir: cdata.get('GEANY_DOC_DIR'))
+if host_machine.system() == 'windows'
+misc_rename = [
+	'Authors.txt',
+	'Changelog.txt',
+	'Copying.txt',
+	'Readme.txt',
+	'News.txt',
+	'Thanks.txt',
+	'Todo.txt'
+]
+install_data(misc, install_dir: prefix, rename: misc_rename)
+endif


Modified: meson_options.txt
8 lines changed, 8 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,8 @@
+option('html-docs', type : 'feature', description : 'enable to generate HTML documentation using rst2html')
+option('pdf-docs', type : 'feature', description : 'enable to generate PDF documentation using rst2pdf')
+option('vte', type : 'boolean', description : 'enable if you want virtual terminal support')
+option('plugins', type : 'boolean', description : 'enable if you want plugin support')
+option('api-docs', type : 'feature', description : 'enable to generate API documentation using Doxygen')
+option('gtkdoc', type : 'boolean', description : 'enable to generate gtk-doc compatible headers for the API')
+option('python-command', type: 'string', description: 'the default Python command')
+option('socket', type: 'boolean', description: 'enable if you want to detect a running instance')


Modified: plugins/meson.build
28 lines changed, 28 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,28 @@
+plugin_inc = [include_directories('..', '../src', '../src/tagmanager')]
+plugin_inc += iscintilla
+
+plugins = [
+	'Demoplugin',
+	'Demoproxy',
+	'Classbuilder',
+	'HTMLChars',
+	'Export',
+	'SaveActions',
+	'FileBrowser',
+	'SplitWindow'
+]
+
+foreach plugin : plugins
+	id = plugin.to_lower()
+	skip_install = id.startswith('demo')
+	shared_module(id,
+		id + '.c',
+		name_prefix: '', # "lib" seems to be the default prefix
+		link_with: libgeany,
+		include_directories: plugin_inc,
+		c_args: [def_cflags, '-DG_LOG_DOMAIN="'+plugin+'"'],
+		dependencies: [deps, dep_libgeany],
+		install_dir: join_paths(prefix, get_option('libdir'), 'geany'),
+		install: not skip_install
+	)
+endforeach


Modified: po/meson.build
1 lines changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1 @@
+i18n.gettext(meson.project_name(), preset: 'glib', install: true)


Modified: tests/meson.build
354 lines changed, 354 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,354 @@
+test_deps = declare_dependency(compile_args: geany_cflags + [ '-DG_LOG_DOMAIN="Geany"' ],
+                               dependencies: [deps, dep_libgeany])
+
+ctags_tests = files([
+	'ctags/1795612.js.tags',
+	'ctags/1850914.js.tags',
+	'ctags/1878155.js.tags',
+	'ctags/1880687.js.tags',
+	'ctags/2023624.js.tags',
+	'ctags/3184782.sql.tags',
+	'ctags/3470609.js.tags',
+	'ctags/3526726.tex.tags',
+	'ctags/68hc11.asm.tags',
+	'ctags/actionscript/as-first-token.as.tags',
+	'ctags/actionscript/classes.as.tags',
+	'ctags/actionscript/const2.as.tags',
+	'ctags/actionscript/const.as.tags',
+	'ctags/actionscript/method-attributes.as.tags',
+	'ctags/actionscript/packages.as.tags',
+	'ctags/actionscript/sampler.as.tags',
+	'ctags/angle_bracket.cpp.tags',
+	'ctags/anonymous_functions.php.tags',
+	'ctags/arraylist.js.tags',
+	'ctags/array_ref_and_out.cs.tags',
+	'ctags/array_spec.f90.tags',
+	'ctags/array-spec.f90.tags',
+	'ctags/attributes.cs.tags',
+	'ctags/auto.f.tags',
+	'ctags/backslashes.c.tags',
+	'ctags/bit_field.c.tags',
+	'ctags/block.f90.tags',
+	'ctags/bracematch.js.tags',
+	'ctags/bug1020715.cpp.tags',
+	'ctags/bug1020715.c.tags',
+	'ctags/bug1086609.c.tags',
+	'ctags/bug1093123.cpp.tags',
+	'ctags/bug1111214-j-chan.v.tags',
+	'ctags/bug1111214.v.tags',
+	'ctags/bug1201689.c.tags',
+	'ctags/bug1447756.java.tags',
+	'ctags/bug1458930.c.tags',
+	'ctags/bug1466117.c.tags',
+	'ctags/bug1491666.c.tags',
+	'ctags/bug1515910.cs.tags',
+	'ctags/bug1548443.cpp.tags',
+	'ctags/bug1563476.cpp.tags',
+	'ctags/bug1570779.sql.tags',
+	'ctags/bug1575055.cpp.tags',
+	'ctags/bug1585745.cpp.tags',
+	'ctags/bug1611054.cs.tags',
+	'ctags/bug1691412.java.tags',
+	'ctags/bug1742588.rb.tags',
+	'ctags/bug1743330.v.tags',
+	'ctags/bug1764143.h.tags',
+	'ctags/bug1764148.py.tags',
+	'ctags/bug1770479.cpp.tags',
+	'ctags/bug1773926.cpp.tags',
+	'ctags/bug1777344.java.tags',
+	'ctags/bug1799340.cpp.tags',
+	'ctags/bug1799343-1.cpp.tags',
+	'ctags/bug1799343-2.cpp.tags',
+	'ctags/bug1800065.cs.tags',
+	'ctags/bug1809024.py.tags',
+	'ctags/bug1830343.cs.tags',
+	'ctags/bug1830344.cs.tags',
+	'ctags/bug1856363.py.tags',
+	'ctags/bug1906062.py.tags',
+	'ctags/bug1907083.cpp.tags',
+	'ctags/bug1924919.cpp.tags',
+	'ctags/bug1938565.sql.tags',
+	'ctags/bug1944150.sql.tags',
+	'ctags/bug1950327.js.tags',
+	'ctags/bug1988026.py.tags',
+	'ctags/bug1988027.py.tags',
+	'ctags/bug1988130.py.tags',
+	'ctags/bug2049723.java.tags',
+	'ctags/bug2075402.py.tags',
+	'ctags/bug2117073.java.tags',
+	'ctags/bug2374109.vhd.tags',
+	'ctags/bug2411878.cs.tags',
+	'ctags/bug2747828.v.tags',
+	'ctags/bug2777310.js.tags',
+	'ctags/bug2781264.rb.tags',
+	'ctags/bug2886870.tex.tags',
+	'ctags/bug2888482.js.tags',
+	'ctags/bug3036476.js.tags',
+	'ctags/bug3168705.py.tags',
+	'ctags/bug3571233.js.tags',
+	'ctags/bug507864.c.tags',
+	'ctags/bug538629.asm.tags',
+	'ctags/bug556645.c.tags',
+	'ctags/bug556646.c.tags',
+	'ctags/bug565813.f90.tags',
+	'ctags/bug612019.pas.tags',
+	'ctags/bug612621.pl.tags',
+	'ctags/bug620288.f.tags',
+	'ctags/bug639639.h.tags',
+	'ctags/bug639644.hpp.tags',
+	'ctags/bug665086.cpp.tags',
+	'ctags/bug670433.f90.tags',
+	'ctags/bug699171.py.tags',
+	'ctags/bug722501.sql.tags',
+	'ctags/bug726712.f90.tags',
+	'ctags/bug726875.f90.tags',
+	'ctags/bug734933.f90.tags',
+	'ctags/bug762027.v.tags',
+	'ctags/bug814263.java.tags',
+	'ctags/bug823000.sql.tags',
+	'ctags/bug842077.pl.tags',
+	'ctags/bug849591.cpp.tags',
+	'ctags/bug852368.cpp.tags',
+	'ctags/bug858165.f90.tags',
+	'ctags/bug872494.cpp.tags',
+	'ctags/bug877956.f90.tags',
+	'ctags/bug960316.v.tags',
+	'ctags/bug961001.v.tags',
+	'ctags/byte.f.tags',
+	'ctags/c-digraphs.c.tags',
+	'ctags/c-trigraphs.c.tags',
+	'ctags/case_sensitivity.php.tags',
+	'ctags/char-selector.f90.tags',
+	'ctags/classes.php.tags',
+	'ctags/cobol/helloworld.cbl.tags',
+	'ctags/cobol/helloworld2.cbl.tags',
+	'ctags/cobol/levels.cbl.tags',
+	'ctags/cobol/quoted-program-id.cbl.tags',
+	'ctags/cobol/simple.cbl.tags',
+	'ctags/common.f.tags',
+	'ctags/complex-return.js.tags',
+	'ctags/continuation.f90.tags',
+	'ctags/continuation.mak.tags',
+	'ctags/countall.sql.tags',
+	'ctags/cpp_destructor.cpp.tags',
+	'ctags/css-at-rules.css.tags',
+	'ctags/css-at-supports.css.tags',
+	'ctags/css-attribute-selectors.css.tags',
+	'ctags/css-comma-no-space.css.tags',
+	'ctags/css-namespace-selectors.css.tags',
+	'ctags/css-pseudo-classes.css.tags',
+	'ctags/css-simple.css.tags',
+	'ctags/css-singlequote-in-comment-issue2.css.tags',
+	'ctags/css-tag-types.css.tags',
+	'ctags/css-trivial.css.tags',
+	'ctags/cython_sample.pyx.tags',
+	'ctags/cython_sample2.pyx.tags',
+	'ctags/cxx11enum.cpp.tags',
+	'ctags/cxx11-final.cpp.tags',
+	'ctags/cxx11-noexcept.cpp.tags',
+	'ctags/cxx11-override.cpp.tags',
+	'ctags/cxx11-raw-strings.cpp.tags',
+	'ctags/cxx14-combined.cpp.tags',
+	'ctags/db-trig.sql.tags',
+	'ctags/debian_432872.f90.tags',
+	'ctags/directives.c.tags',
+	'ctags/dopbl2.f.tags',
+	'ctags/dotted-names.json.tags',
+	'ctags/enum.c.tags',
+	'ctags/enum.f90.tags',
+	'ctags/enum.java.tags',
+	'ctags/enumerators.f90.tags',
+	'ctags/events.cs.tags',
+	'ctags/extern_variable.h.tags',
+	'ctags/forall_module.f90.tags',
+	'ctags/format.pl.tags',
+	'ctags/fortran_associate.f90.tags',
+	'ctags/fortran_line_continuation.f90.tags',
+	'ctags/func_typedef.h.tags',
+	'ctags/geany.nsi.tags',
+	'ctags/general.cs.tags',
+	'ctags/hex2dec.sql.tags',
+	'ctags/implied_program.f.tags',
+	'ctags/indexer.cs.tags',
+	'ctags/infinite_loop.java.tags',
+	'ctags/ingres_procedures.sql.tags',
+	'ctags/initialization.f90.tags',
+	'ctags/interface_indexers.cs.tags',
+	'ctags/interface_properties.cs.tags',
+	'ctags/interfaces.f90.tags',
+	'ctags/internal.cs.tags',
+	'ctags/intro_orig.tex.tags',
+	'ctags/intro.tex.tags',
+	'ctags/invalid_name.f90.tags',
+	'ctags/java_enum.java.tags',
+	'ctags/js-broken-strings.js.tags',
+	'ctags/js-class-related-unterminated.js.tags',
+	'ctags/js-const.js.tags',
+	'ctags/js-implicit-semicolons.js.tags',
+	'ctags/js-let.js.tags',
+	'ctags/js-scope.js.tags',
+	'ctags/js-signature.js.tags',
+	'ctags/js-string-continuation.js.tags',
+	'ctags/js-sub-block-scope.js.tags',
+	'ctags/js-unknown-construct-nesting.js.tags',
+	'ctags/julia-corner_cases.jl.tags',
+	'ctags/jsFunc_tutorial.js.tags',
+	'ctags/keyword_abstract.cs.tags',
+	'ctags/keyword_catch_try.cs.tags',
+	'ctags/keyword_class.cs.tags',
+	'ctags/keyword_const.cs.tags',
+	'ctags/keyword_delegate.cs.tags',
+	'ctags/keyword_enum.cs.tags',
+	'ctags/keyword_event.cs.tags',
+	'ctags/keyword_explicit.cs.tags',
+	'ctags/keyword_extern.cs.tags',
+	'ctags/keyword_implicit.cs.tags',
+	'ctags/keyword_interface.cs.tags',
+	'ctags/keyword_namespace.cs.tags',
+	'ctags/keyword_names.f90.tags',
+	'ctags/keyword_out.cs.tags',
+	'ctags/keyword_override.cs.tags',
+	'ctags/keyword_params.cs.tags',
+	'ctags/keyword_private.cs.tags',
+	'ctags/keyword_protected.cs.tags',
+	'ctags/keyword_public.cs.tags',
+	'ctags/keyword_sealed.cs.tags',
+	'ctags/keyword_static.cs.tags',
+	'ctags/keyword_struct.cs.tags',
+	'ctags/keyword_virtual.cs.tags',
+	'ctags/keyword_volatile.cs.tags',
+	'ctags/labels.sql.tags',
+	'ctags/lanus.for.tags',
+	'ctags/line_directives.c.tags',
+	'ctags/local.c.tags',
+	'ctags/macros.c.tags',
+	'ctags/make-comment-in-rule.mak.tags',
+	'ctags/make-gnumake-pattern-rules.mak.tags',
+	'ctags/make-multi-target.mak.tags',
+	'ctags/make-parentheses.mak.tags',
+	'ctags/make-target-with-parentheses.mak.tags',
+	'ctags/make-variable-on-cmdline.mak.tags',
+	'ctags/masm.asm.tags',
+	'ctags/matlab_backtracking.m.tags',
+	'ctags/matlab_test.m.tags',
+	'ctags/maze.erl.tags',
+	'ctags/members.f90.tags',
+	'ctags/misc_types.f90.tags',
+	'ctags/misc_types.f.tags',
+	'ctags/mode.php.tags',
+	'ctags/moniker.x68.asm.tags',
+	'ctags/namelist.f.tags',
+	'ctags/namespace.cpp.tags',
+	'ctags/namespaces2.php.tags',
+	'ctags/namespaces.php.tags',
+	'ctags/no_terminator.js.tags',
+	'ctags/non-ascii-ident1.php.tags',
+	'ctags/numlib.f90.tags',
+	'ctags/objectivec_implementation.mm.tags',
+	'ctags/objectivec_interface.mm.tags',
+	'ctags/objectivec_property.mm.tags',
+	'ctags/objectivec_protocol.mm.tags',
+	'ctags/Package.pm.tags',
+	'ctags/php5_5_class_kw.php.tags',
+	'ctags/parenthesis-rvalue.js.tags',
+	'ctags/preprocessor.f90.tags',
+	'ctags/procedure_pointer_module.f90.tags',
+	'ctags/procpoint.f90.tags',
+	'ctags/property.cs.tags',
+	'ctags/prototype.h.tags',
+	'ctags/pure_elem.f95.tags',
+	'ctags/py_constructor_arglist.py.tags',
+	'ctags/py-skipped-string.py.tags',
+	'ctags/python-anonymous-nestlevel_ctags-bug-356.py.tags',
+	'ctags/python-comments.py.tags',
+	'ctags/qualified_types.f90.tags',
+	'ctags/random.sql.tags',
+	'ctags/readlob.sql.tags',
+	'ctags/readlong.sql.tags',
+	'ctags/recursive.f95.tags',
+	'ctags/refcurs.sql.tags',
+	'ctags/regexp.js.tags',
+	'ctags/return-hint.zep.tags',
+	'ctags/return-types.go.tags',
+	'ctags/ruby-block-call.rb.tags',
+	'ctags/ruby-doc.rb.tags',
+	'ctags/ruby-namespaced-class.rb.tags',
+	'ctags/ruby-scope-after-anonymous-class.rb.tags',
+	'ctags/ruby-sf-bug-364.rb.tags',
+	'ctags/rules.t2t.tags',
+	'ctags/sample.t2t.tags',
+	'ctags/secondary_fcn_name.js.tags',
+	'ctags/semicolon.f90.tags',
+	'ctags/shebang.js.tags',
+	'ctags/signature.cpp.tags',
+	'ctags/simple.abc.tags',
+	'ctags/simple.asciidoc.tags',
+	'ctags/simple.bas.tags',
+	'ctags/simple.conf.tags',
+	'ctags/simple.d.tags',
+	'ctags/simple.diff.tags',
+	'ctags/simple.docbook.tags',
+	'ctags/simple.hs.tags',
+	'ctags/simple.hx.tags',
+	'ctags/simple.html.tags',
+	'ctags/simple.inp.tags',
+	'ctags/simple.js.tags',
+	'ctags/simple.json.tags',
+	'ctags/simple.ksh.tags',
+	'ctags/simple.lua.tags',
+	'ctags/simple.mak.tags',
+	'ctags/simple.md.tags',
+	'ctags/simple.php.tags',
+	'ctags/simple.pl.tags',
+	'ctags/simple.ps1.tags',
+	'ctags/simple.py.tags',
+	'ctags/simple.rb.tags',
+	'ctags/simple.rst.tags',
+	'ctags/simple.sh.tags',
+	'ctags/simple.tcl.tags',
+	'ctags/simple.vala.tags',
+	'ctags/simple.zep.tags',
+	'ctags/size_t_wchar_t_alias.d.tags',
+	'ctags/size_t_wchar_t_typedef.c.tags',
+	'ctags/spurious_label_tags.c.tags',
+	'ctags/sql_single_quote.sql.tags',
+	'ctags/square_parens.f90.tags',
+	'ctags/state_machine.v.tags',
+	'ctags/static_array.c.tags',
+	'ctags/stdcall.f.tags',
+	'ctags/strings.php.tags',
+	'ctags/strings.rb.tags',
+	'ctags/structure.f.tags',
+	'ctags/tabindent.py.tags',
+	'ctags/test.erl.tags',
+	'ctags/test.go.tags',
+	'ctags/test.py.tags',
+	'ctags/test.vhd.tags',
+	'ctags/test_input.rs.tags',
+	'ctags/test_input2.rs.tags',
+	'ctags/titles.t2t.tags',
+	'ctags/traffic_signal.v.tags',
+	'ctags/traits.php.tags',
+	'ctags/ui5.controller.js.tags',
+	'ctags/union.f.tags',
+	'ctags/value.f.tags',
+	'ctags/var-and-return-type.cpp.tags',
+	'ctags/whitespaces.php.tags'
+])
+
+runner = find_program('ctags/runner.sh')
+foreach t : ctags_tests
+	test('@0@'.format(t), runner,
+	     args: [join_paths(meson.build_root(), 'geany'), t],
+	     env: ['top_srcdir='+meson.source_root(), 'top_builddir=' + meson.build_root()])
+endforeach
+
+process_order_sources = files([
+	'ctags/process_order.c.tags',
+	'ctags/process_order_1.h',
+	'ctags/process_order_2.h'
+])
+test('ctags/processing-order', runner,
+     args: [join_paths(meson.build_root(), 'geany'), '--result', process_order_sources],
+     env: ['top_srcdir='+meson.source_root(), 'top_builddir='+meson.build_root()])
+test('utils', executable('test_utils', 'test_utils.c', dependencies: test_deps))



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Commits mailing list