[gimp] Meson port.



commit 65eff6f15049f183a9c0fe82594997e071a50b99
Author: Félix Piédallu <felix piedallu me>
Date:   Wed Nov 1 14:27:13 2017 +0100

    Meson port.

 app-tools/meson.build                          |   15 +
 app/actions/meson.build                        |  104 ++
 app/config/meson.build                         |   74 ++
 app/core/meson.build                           |  263 ++++
 app/dialogs/meson.build                        |   64 +
 app/display/meson.build                        |  108 ++
 app/file-data/meson.build                      |   21 +
 app/file/meson.build                           |   16 +
 app/gegl/meson.build                           |   33 +
 app/git-version.h.in                           |    5 +
 app/gui/meson.build                            |   35 +
 app/menus/meson.build                          |   20 +
 app/meson.build                                |  191 +++
 app/operations/layer-modes-legacy/meson.build  |   29 +
 app/operations/layer-modes/meson.build         |   27 +
 app/operations/meson.build                     |   62 +
 app/operations/tests/meson.build               |   10 +
 app/paint/meson.build                          |   58 +
 app/pdb/meson.build                            |   85 ++
 app/plug-in/meson.build                        |   51 +
 app/propgui/meson.build                        |   31 +
 app/tests/create_test_env.sh                   |   29 +
 app/tests/meson.build                          |   91 ++
 app/text/meson.build                           |   36 +
 app/tools/meson.build                          |  131 ++
 app/vectors/meson.build                        |   26 +
 app/widgets/meson.build                        |  237 ++++
 app/xcf/meson.build                            |   18 +
 build/windows/installer/lang/extractlang.sh    |   11 +
 build/windows/installer/lang/meson.build       |   61 +
 build/windows/installer/meson.build            |    1 +
 build/windows/meson.build                      |   13 +
 cursors/dummy_file.xml                         |    1 +
 cursors/meson.build                            |  214 ++++
 data/brushes/Basic/meson.build                 |   12 +
 data/brushes/Fun/meson.build                   |    5 +
 data/brushes/Legacy/meson.build                |    5 +
 data/brushes/Media/meson.build                 |   13 +
 data/brushes/Sketch/meson.build                |   12 +
 data/brushes/Splatters/meson.build             |   10 +
 data/brushes/Texture/meson.build               |   15 +
 data/brushes/meson.build                       |   17 +
 data/dynamics/Basic/meson.build                |   10 +
 data/dynamics/FX/meson.build                   |    5 +
 data/dynamics/meson.build                      |   26 +
 data/environ/meson.build                       |    5 +
 data/gradients/meson.build                     |   93 ++
 data/images/meson.build                        |   11 +
 data/interpreters/meson.build                  |    3 +
 data/meson.build                               |   16 +
 data/palettes/meson.build                      |   47 +
 data/patterns/Animal/meson.build               |    4 +
 data/patterns/Fabric/meson.build               |    3 +
 data/patterns/Food/meson.build                 |    4 +
 data/patterns/Legacy/meson.build               |   17 +
 data/patterns/Paper/meson.build                |    4 +
 data/patterns/Plant/meson.build                |    3 +
 data/patterns/Sky/meson.build                  |    5 +
 data/patterns/Stone/meson.build                |   17 +
 data/patterns/Water/meson.build                |    6 +
 data/patterns/Wood/meson.build                 |   15 +
 data/patterns/meson.build                      |   20 +
 data/tags/meson.build                          |   30 +
 data/tips/meson.build                          |   43 +
 data/tool-presets/Crop/meson.build             |    9 +
 data/tool-presets/FX/meson.build               |   10 +
 data/tool-presets/Paint/meson.build            |   18 +
 data/tool-presets/Selection/meson.build        |    4 +
 data/tool-presets/Sketch/meson.build           |    8 +
 data/tool-presets/meson.build                  |   15 +
 desktop/meson.build                            |  125 ++
 devel-docs/app/meson.build                     |   98 ++
 devel-docs/libgimp/meson.build                 |   49 +
 devel-docs/libgimpbase/meson.build             |   39 +
 devel-docs/libgimpcolor/meson.build            |   21 +
 devel-docs/libgimpconfig/meson.build           |   30 +
 devel-docs/libgimpmath/meson.build             |   14 +
 devel-docs/libgimpmodule/meson.build           |   23 +
 devel-docs/libgimpthumb/meson.build            |   28 +
 devel-docs/libgimpwidgets/meson.build          |   81 ++
 devel-docs/meson.build                         |   32 +
 devel-docs/tools/meson.build                   |   28 +
 docs/meson.build                               |   63 +
 etc/meson.build                                |   20 +
 icons/Color/meson.build                        |   84 ++
 icons/Legacy/meson.build                       |  556 ++++++++
 icons/Symbolic/meson.build                     |   84 ++
 icons/meson.build                              | 1613 ++++++++++++++++++++++++
 libgimp/meson.build                            |  381 ++++++
 libgimpbase/gimpversion.h.in                   |   68 +
 libgimpbase/meson.build                        |  134 ++
 libgimpcolor/meson.build                       |   76 ++
 libgimpconfig/meson.build                      |   79 ++
 libgimpmath/meson.build                        |   46 +
 libgimpmodule/meson.build                      |   37 +
 libgimpthumb/meson.build                       |   95 ++
 libgimpwidgets/meson.build                     |  206 +++
 m4macros/meson.build                           |    5 +
 menus/meson.build                              |   69 +
 meson.build                                    | 1578 +++++++++++++++++++++++
 meson.make                                     |   29 +
 meson_options.txt                              |   60 +
 modules/meson.build                            |   95 ++
 pdb/meson.build                                |  147 +++
 plug-ins/common/meson.build                    |  180 +++
 plug-ins/file-bmp/meson.build                  |   40 +
 plug-ins/file-dds/meson.build                  |   45 +
 plug-ins/file-exr/meson.build                  |   43 +
 plug-ins/file-faxg3/meson.build                |   39 +
 plug-ins/file-fits/meson.build                 |   39 +
 plug-ins/file-fli/meson.build                  |   39 +
 plug-ins/file-ico/meson.build                  |   41 +
 plug-ins/file-jpeg/meson.build                 |   43 +
 plug-ins/file-psd/meson.build                  |   44 +
 plug-ins/file-raw/meson.build                  |   60 +
 plug-ins/file-sgi/meson.build                  |   39 +
 plug-ins/file-tiff/meson.build                 |   41 +
 plug-ins/file-webp/meson.build                 |   45 +
 plug-ins/flame/meson.build                     |   41 +
 plug-ins/fractal-explorer/examples/meson.build |   37 +
 plug-ins/fractal-explorer/meson.build          |   41 +
 plug-ins/gfig/gfig-examples/meson.build        |   14 +
 plug-ins/gfig/images/meson.build               |   24 +
 plug-ins/gfig/meson.build                      |   57 +
 plug-ins/gimpressionist/Brushes/meson.build    |   66 +
 plug-ins/gimpressionist/Paper/meson.build      |   16 +
 plug-ins/gimpressionist/Presets/meson.build    |   32 +
 plug-ins/gimpressionist/meson.build            |   65 +
 plug-ins/goat-exercises/meson.build            |   66 +
 plug-ins/gradient-flare/flares/meson.build     |   11 +
 plug-ins/gradient-flare/meson.build            |   40 +
 plug-ins/help-browser/meson.build              |   47 +
 plug-ins/help/meson.build                      |   53 +
 plug-ins/ifs-compose/meson.build               |   40 +
 plug-ins/imagemap/images/meson.build           |   16 +
 plug-ins/imagemap/meson.build                  |  161 +++
 plug-ins/lighting/images/meson.build           |   18 +
 plug-ins/lighting/meson.build                  |   47 +
 plug-ins/map-object/meson.build                |   48 +
 plug-ins/meson.build                           |   36 +
 plug-ins/metadata/meson.build                  |   94 ++
 plug-ins/pagecurl/meson.build                  |   71 ++
 plug-ins/print/meson.build                     |   49 +
 plug-ins/pygimp/doc/meson.build                |   25 +
 plug-ins/pygimp/meson.build                    |  155 +++
 plug-ins/pygimp/plug-ins/meson.build           |   27 +
 plug-ins/python/meson.build                    |   53 +
 plug-ins/python/python-console/meson.build     |    5 +
 plug-ins/screenshot/meson.build                |   38 +
 plug-ins/script-fu/ftx/meson.build             |   12 +
 plug-ins/script-fu/meson.build                 |   63 +
 plug-ins/script-fu/scripts/images/meson.build  |    9 +
 plug-ins/script-fu/scripts/meson.build         |   68 +
 plug-ins/script-fu/tinyscheme/meson.build      |   16 +
 plug-ins/selection-to-path/meson.build         |   49 +
 plug-ins/twain/meson.build                     |   39 +
 plug-ins/ui/meson.build                        |   13 +
 po-libgimp/meson.build                         |    1 +
 po-plug-ins/meson.build                        |    1 +
 po-python/meson.build                          |    1 +
 po-script-fu/meson.build                       |    1 +
 po-tags/meson.build                            |    1 +
 po-tips/meson.build                            |    2 +
 po-windows-installer/meson.build               |    2 +
 po/meson.build                                 |    2 +
 themes/meson.build                             |   11 +
 tools/generate_changelog.sh                    |   35 +
 tools/meson.build                              |   37 +
 168 files changed, 11398 insertions(+)
---
diff --git a/app-tools/meson.build b/app-tools/meson.build
new file mode 100644
index 0000000000..40f1add71a
--- /dev/null
+++ b/app-tools/meson.build
@@ -0,0 +1,15 @@
+
+gimp_debug_tool = executable('gimp-debug-tool',
+  'gimp-debug-tool.c',
+  include_directories: rootInclude,
+  dependencies: [
+    fontconfig,
+    gio,
+    gegl,
+    gtk3,
+  ],
+  link_with: [
+    libapp,
+    libappwidgets,
+  ],
+)
diff --git a/app/actions/meson.build b/app/actions/meson.build
new file mode 100644
index 0000000000..0bc17c3df1
--- /dev/null
+++ b/app/actions/meson.build
@@ -0,0 +1,104 @@
+libappactions_sources = [
+  'actions.c',
+  'brush-editor-actions.c',
+  'brushes-actions.c',
+  'buffers-actions.c',
+  'buffers-commands.c',
+  'channels-actions.c',
+  'channels-commands.c',
+  'colormap-actions.c',
+  'colormap-commands.c',
+  'context-actions.c',
+  'context-commands.c',
+  'cursor-info-actions.c',
+  'cursor-info-commands.c',
+  'dashboard-actions.c',
+  'dashboard-commands.c',
+  'data-commands.c',
+  'data-editor-commands.c',
+  'debug-actions.c',
+  'debug-commands.c',
+  'dialogs-actions.c',
+  'dialogs-commands.c',
+  'dock-actions.c',
+  'dock-commands.c',
+  'dockable-actions.c',
+  'dockable-commands.c',
+  'documents-actions.c',
+  'documents-commands.c',
+  'drawable-actions.c',
+  'drawable-commands.c',
+  'dynamics-actions.c',
+  'dynamics-editor-actions.c',
+  'edit-actions.c',
+  'edit-commands.c',
+  'error-console-actions.c',
+  'error-console-commands.c',
+  'file-actions.c',
+  'file-commands.c',
+  'filters-actions.c',
+  'filters-commands.c',
+  'fonts-actions.c',
+  'gimpgeglprocedure.c',
+  'gradient-editor-actions.c',
+  'gradient-editor-commands.c',
+  'gradients-actions.c',
+  'gradients-commands.c',
+  'help-actions.c',
+  'help-commands.c',
+  'image-actions.c',
+  'image-commands.c',
+  'images-actions.c',
+  'images-commands.c',
+  'items-actions.c',
+  'items-commands.c',
+  'layers-actions.c',
+  'layers-commands.c',
+  'mypaint-brushes-actions.c',
+  'palette-editor-actions.c',
+  'palette-editor-commands.c',
+  'palettes-actions.c',
+  'palettes-commands.c',
+  'patterns-actions.c',
+  'plug-in-actions.c',
+  'plug-in-commands.c',
+  'procedure-commands.c',
+  'quick-mask-actions.c',
+  'quick-mask-commands.c',
+  'sample-points-actions.c',
+  'sample-points-commands.c',
+  'select-actions.c',
+  'select-commands.c',
+  'templates-actions.c',
+  'templates-commands.c',
+  'text-editor-actions.c',
+  'text-editor-commands.c',
+  'text-tool-actions.c',
+  'text-tool-commands.c',
+  'tool-options-actions.c',
+  'tool-options-commands.c',
+  'tool-preset-editor-actions.c',
+  'tool-preset-editor-commands.c',
+  'tool-presets-actions.c',
+  'tool-presets-commands.c',
+  'tools-actions.c',
+  'tools-commands.c',
+  'vectors-actions.c',
+  'vectors-commands.c',
+  'view-actions.c',
+  'view-commands.c',
+  'window-actions.c',
+  'window-commands.c',
+  'windows-actions.c',
+  'windows-commands.c',
+]
+
+
+libappactions = static_library('appactions',
+  libappactions_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-Actions"',
+  dependencies: [
+    gegl, gdk_pixbuf, gtk3,
+  ],
+)
diff --git a/app/config/meson.build b/app/config/meson.build
new file mode 100644
index 0000000000..4b675e7549
--- /dev/null
+++ b/app/config/meson.build
@@ -0,0 +1,74 @@
+
+appconfigenums = custom_target('config-enums.c',
+  input : [ 'config-enums.h', ],
+  output: [ 'config-enums.c', ],
+  command: app_mkenums_custom_target_command,
+  capture: true,
+)
+
+libappconfig_sources = [
+  'gimpconfig-dump.c',
+  'gimpconfig-file.c',
+  'gimpconfig-utils.c',
+  'gimpcoreconfig.c',
+  'gimpdialogconfig.c',
+  'gimpdisplayconfig.c',
+  'gimpdisplayoptions.c',
+  'gimpgeglconfig.c',
+  'gimpguiconfig.c',
+  'gimplangrc.c',
+  'gimppluginconfig.c',
+  'gimprc-deserialize.c',
+  'gimprc-serialize.c',
+  'gimprc-unknown.c',
+  'gimprc.c',
+  'gimpxmlparser.c',
+  appconfigenums,
+]
+
+libappconfig = static_library('appconfig',
+  libappconfig_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-Config"',
+  dependencies: [
+    cairo, gegl, gdk_pixbuf, gio, gio_specific, gtk3, libmypaint,
+  ],
+)
+
+test('app-config',
+  executable('test-config',
+    [ 'test-config.c', app_debug_files, ],
+    include_directories: [ rootInclude, rootAppInclude, ],
+
+    dependencies: [
+      gegl, gio, gio_specific,
+      appstream_glib,
+    ],
+    link_with: [
+      libgimpbase,
+      libgimpconfig,
+      libgimpcolor,
+      libgimpmath,
+      libgimpmodule,
+      libgimpthumb,
+
+      libappcore,
+      libappconfig,
+      libappfile,
+      libappfiledata,
+      libappgegl,
+      libappinternalprocs,
+      libapplayermodes,
+      libapplayermodeslegacy,
+      libappoperations,
+      libapppaint,
+      libapppdb,
+      libappplugin,
+      libapptext,
+      libappvectors,
+      libappxcf,
+    ],
+    install: false,
+  ),
+  suite: 'app'
+)
diff --git a/app/core/meson.build b/app/core/meson.build
new file mode 100644
index 0000000000..007ec8c9e3
--- /dev/null
+++ b/app/core/meson.build
@@ -0,0 +1,263 @@
+
+appcoreenums = custom_target('core-enums',
+  input : [ 'core-enums.h', ],
+  output: [ 'core-enums.c', ],
+  command: app_mkenums_custom_target_command,
+  capture: true,
+)
+
+appcoremarshal = gnome.genmarshal('gimpmarshal',
+  prefix: 'gimp_marshal',
+  sources: 'gimpmarshal.list',
+  install_header: false,
+)
+
+
+
+libappcore_sources = [
+  'gimp-atomic.c',
+  'gimp-batch.c',
+  'gimp-cairo.c',
+  'gimp-contexts.c',
+  'gimp-data-factories.c',
+  'gimp-edit.c',
+  'gimp-filter-history.c',
+  'gimp-gradients.c',
+  'gimp-gui.c',
+  'gimp-internal-data.c',
+  'gimp-memsize.c',
+  'gimp-modules.c',
+  'gimp-palettes.c',
+  'gimp-parallel.cc',
+  'gimp-parasites.c',
+  'gimp-spawn.c',
+  'gimp-tags.c',
+  'gimp-templates.c',
+  'gimp-transform-resize.c',
+  'gimp-transform-utils.c',
+  'gimp-units.c',
+  'gimp-user-install.c',
+  'gimp-utils.c',
+  'gimp.c',
+  'gimpasync.c',
+  'gimpasyncset.c',
+  'gimpauxitem.c',
+  'gimpauxitemundo.c',
+  'gimpbacktrace-linux.c',
+  'gimpbacktrace-none.c',
+  'gimpbacktrace-windows.c',
+  'gimpbezierdesc.c',
+  'gimpboundary.c',
+  'gimpbrush-boundary.c',
+  'gimpbrush-load.c',
+  'gimpbrush-save.c',
+  'gimpbrush-transform.cc',
+  'gimpbrush.c',
+  'gimpbrushcache.c',
+  'gimpbrushclipboard.c',
+  'gimpbrushgenerated-load.c',
+  'gimpbrushgenerated-save.c',
+  'gimpbrushgenerated.c',
+  'gimpbrushpipe-load.c',
+  'gimpbrushpipe-save.c',
+  'gimpbrushpipe.c',
+  'gimpbuffer.c',
+  'gimpcancelable.c',
+  'gimpchannel-combine.c',
+  'gimpchannel-select.c',
+  'gimpchannel.c',
+  'gimpchannelpropundo.c',
+  'gimpchannelundo.c',
+  'gimpchunkiterator.c',
+  'gimpcontainer-filter.c',
+  'gimpcontainer.c',
+  'gimpcontext.c',
+  'gimpcoords-interpolate.c',
+  'gimpcoords.c',
+  'gimpcurve-load.c',
+  'gimpcurve-map.c',
+  'gimpcurve-save.c',
+  'gimpcurve.c',
+  'gimpdashpattern.c',
+  'gimpdata.c',
+  'gimpdatafactory.c',
+  'gimpdataloaderfactory.c',
+  'gimpdisplay.c',
+  'gimpdocumentlist.c',
+  'gimpdrawable-bucket-fill.c',
+  'gimpdrawable-combine.c',
+  'gimpdrawable-edit.c',
+  'gimpdrawable-equalize.c',
+  'gimpdrawable-fill.c',
+  'gimpdrawable-filters.c',
+  'gimpdrawable-floating-selection.c',
+  'gimpdrawable-foreground-extract.c',
+  'gimpdrawable-gradient.c',
+  'gimpdrawable-histogram.c',
+  'gimpdrawable-levels.c',
+  'gimpdrawable-offset.c',
+  'gimpdrawable-operation.c',
+  'gimpdrawable-preview.c',
+  'gimpdrawable-shadow.c',
+  'gimpdrawable-stroke.c',
+  'gimpdrawable-transform.c',
+  'gimpdrawable.c',
+  'gimpdrawablefilter.c',
+  'gimpdrawablemodundo.c',
+  'gimpdrawablepropundo.c',
+  'gimpdrawablestack.c',
+  'gimpdrawableundo.c',
+  'gimpdynamics-load.c',
+  'gimpdynamics-save.c',
+  'gimpdynamics.c',
+  'gimpdynamicsoutput.c',
+  'gimperror.c',
+  'gimpextension-error.c',
+  'gimpextension.c',
+  'gimpextensionmanager.c',
+  'gimpfilloptions.c',
+  'gimpfilter.c',
+  'gimpfilteredcontainer.c',
+  'gimpfilterstack.c',
+  'gimpfloatingselectionundo.c',
+  'gimpgradient-load.c',
+  'gimpgradient-save.c',
+  'gimpgradient.c',
+  'gimpgrid.c',
+  'gimpgrouplayer.c',
+  'gimpgrouplayerundo.c',
+  'gimpguide.c',
+  'gimpguideundo.c',
+  'gimphistogram.c',
+  'gimpidtable.c',
+  'gimpimage-arrange.c',
+  'gimpimage-color-profile.c',
+  'gimpimage-colormap.c',
+  'gimpimage-convert-indexed.c',
+  'gimpimage-convert-precision.c',
+  'gimpimage-convert-type.c',
+  'gimpimage-crop.c',
+  'gimpimage-duplicate.c',
+  'gimpimage-flip.c',
+  'gimpimage-grid.c',
+  'gimpimage-guides.c',
+  'gimpimage-item-list.c',
+  'gimpimage-merge.c',
+  'gimpimage-metadata.c',
+  'gimpimage-new.c',
+  'gimpimage-pick-color.c',
+  'gimpimage-pick-item.c',
+  'gimpimage-preview.c',
+  'gimpimage-quick-mask.c',
+  'gimpimage-resize.c',
+  'gimpimage-rotate.c',
+  'gimpimage-sample-points.c',
+  'gimpimage-scale.c',
+  'gimpimage-snap.c',
+  'gimpimage-symmetry.c',
+  'gimpimage-transform.c',
+  'gimpimage-undo-push.c',
+  'gimpimage-undo.c',
+  'gimpimage.c',
+  'gimpimagefile.c',
+  'gimpimageundo.c',
+  'gimpimageviewable.c',
+  'gimpitem-exclusive.c',
+  'gimpitem-linked.c',
+  'gimpitem-preview.c',
+  'gimpitem.c',
+  'gimpitempropundo.c',
+  'gimpitemstack.c',
+  'gimpitemtree.c',
+  'gimpitemundo.c',
+  'gimplayer-floating-selection.c',
+  'gimplayer-new.c',
+  'gimplayer.c',
+  'gimplayermask.c',
+  'gimplayermaskpropundo.c',
+  'gimplayermaskundo.c',
+  'gimplayerpropundo.c',
+  'gimplayerstack.c',
+  'gimplayerundo.c',
+  'gimplineart.c',
+  'gimplist.c',
+  'gimpmaskundo.c',
+  'gimpmybrush-load.c',
+  'gimpmybrush.c',
+  'gimpobject.c',
+  'gimpobjectqueue.c',
+  'gimppaintinfo.c',
+  'gimppalette-import.c',
+  'gimppalette-load.c',
+  'gimppalette-save.c',
+  'gimppalette.c',
+  'gimppalettemru.c',
+  'gimpparamspecs-desc.c',
+  'gimpparamspecs-duplicate.c',
+  'gimpparamspecs.c',
+  'gimpparasitelist.c',
+  'gimppattern-load.c',
+  'gimppattern-save.c',
+  'gimppattern.c',
+  'gimppatternclipboard.c',
+  'gimppdbprogress.c',
+  'gimppickable-auto-shrink.c',
+  'gimppickable-contiguous-region.cc',
+  'gimppickable.c',
+  'gimpprogress.c',
+  'gimpprojectable.c',
+  'gimpprojection.c',
+  'gimpsamplepoint.c',
+  'gimpsamplepointundo.c',
+  'gimpscanconvert.c',
+  'gimpselection.c',
+  'gimpsettings.c',
+  'gimpstrokeoptions.c',
+  'gimpsubprogress.c',
+  'gimpsymmetry-mandala.c',
+  'gimpsymmetry-mirror.c',
+  'gimpsymmetry-tiling.c',
+  'gimpsymmetry.c',
+  'gimptag.c',
+  'gimptagcache.c',
+  'gimptagged.c',
+  'gimptaggedcontainer.c',
+  'gimptempbuf.c',
+  'gimptemplate.c',
+  'gimptilehandlerprojectable.c',
+  'gimptoolinfo.c',
+  'gimptooloptions.c',
+  'gimptoolpreset-load.c',
+  'gimptoolpreset-save.c',
+  'gimptoolpreset.c',
+  'gimptreehandler.c',
+  'gimptriviallycancelablewaitable.c',
+  'gimpuncancelablewaitable.c',
+  'gimpundo.c',
+  'gimpundostack.c',
+  'gimpunit.c',
+  'gimpviewable.c',
+  'gimpwaitable.c',
+  appcoreenums,
+  appcoremarshal,
+  cursors_sources,
+  pickers_sources,
+  icons_core_sources,
+]
+
+libappcore = static_library('appcore',
+  libappcore_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-Core"',
+  dependencies: [
+    cairo,
+    gegl,
+    gdk_pixbuf,
+    libmypaint,
+    gexiv2,
+    appstream_glib,
+    math,
+    dl,
+    libunwind,
+  ],
+)
diff --git a/app/dialogs/meson.build b/app/dialogs/meson.build
new file mode 100644
index 0000000000..c6281767c4
--- /dev/null
+++ b/app/dialogs/meson.build
@@ -0,0 +1,64 @@
+libappdialogs_sources = [
+  'about-dialog.c',
+  'action-search-dialog.c',
+  'channel-options-dialog.c',
+  'color-profile-dialog.c',
+  'color-profile-import-dialog.c',
+  'convert-indexed-dialog.c',
+  'convert-precision-dialog.c',
+  'data-delete-dialog.c',
+  'dialogs-constructors.c',
+  'dialogs.c',
+  'extensions-dialog.c',
+  'file-open-dialog.c',
+  'file-open-location-dialog.c',
+  'file-save-dialog.c',
+  'fill-dialog.c',
+  'grid-dialog.c',
+  'image-merge-layers-dialog.c',
+  'image-new-dialog.c',
+  'image-properties-dialog.c',
+  'image-scale-dialog.c',
+  'input-devices-dialog.c',
+  'item-options-dialog.c',
+  'keyboard-shortcuts-dialog.c',
+  'layer-add-mask-dialog.c',
+  'layer-options-dialog.c',
+  'lebl-dialog.c',
+  'module-dialog.c',
+  'palette-import-dialog.c',
+  'preferences-dialog-utils.c',
+  'preferences-dialog.c',
+  'print-size-dialog.c',
+  'quit-dialog.c',
+  'resize-dialog.c',
+  'resolution-calibrate-dialog.c',
+  'scale-dialog.c',
+  'stroke-dialog.c',
+  'template-options-dialog.c',
+  'tips-dialog.c',
+  'tips-parser.c',
+  'user-install-dialog.c',
+  'vectors-export-dialog.c',
+  'vectors-import-dialog.c',
+  'vectors-options-dialog.c',
+  gitversion_h,
+]
+
+# Auto-generated sources
+libappdialogs_sources += [
+  custom_target('authors.h',
+    input : [ 'authors.xsl', meson.source_root() / 'authors.xml' ],
+    output: [ 'authors.h' ],
+    command: [ xsltproc, '-o', '@OUTPUT@', '@INPUT0@', '@INPUT1@' ],
+  )
+]
+
+libappdialogs = static_library('appdialogs',
+  libappdialogs_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-Dialogs"',
+  dependencies: [
+    gegl, gtk3,
+  ],
+)
diff --git a/app/display/meson.build b/app/display/meson.build
new file mode 100644
index 0000000000..05a8494dab
--- /dev/null
+++ b/app/display/meson.build
@@ -0,0 +1,108 @@
+
+appdisplayenums = custom_target('display-enums.c',
+  input : [ 'display-enums.h', ],
+  output: [ 'display-enums.c', ],
+  command: app_mkenums_custom_target_command,
+  capture: true,
+)
+
+libappdisplay_sources = [
+  'gimpcanvas-style.c',
+  'gimpcanvas.c',
+  'gimpcanvasarc.c',
+  'gimpcanvasboundary.c',
+  'gimpcanvasbufferpreview.c',
+  'gimpcanvascanvasboundary.c',
+  'gimpcanvascorner.c',
+  'gimpcanvascursor.c',
+  'gimpcanvasgrid.c',
+  'gimpcanvasgroup.c',
+  'gimpcanvasguide.c',
+  'gimpcanvashandle.c',
+  'gimpcanvasitem-utils.c',
+  'gimpcanvasitem.c',
+  'gimpcanvaslayerboundary.c',
+  'gimpcanvasline.c',
+  'gimpcanvaspassepartout.c',
+  'gimpcanvaspath.c',
+  'gimpcanvaspen.c',
+  'gimpcanvaspolygon.c',
+  'gimpcanvasprogress.c',
+  'gimpcanvasproxygroup.c',
+  'gimpcanvasrectangle.c',
+  'gimpcanvasrectangleguides.c',
+  'gimpcanvassamplepoint.c',
+  'gimpcanvastextcursor.c',
+  'gimpcanvastransformguides.c',
+  'gimpcanvastransformpreview.c',
+  'gimpcursorview.c',
+  'gimpdisplay-foreach.c',
+  'gimpdisplay-handlers.c',
+  'gimpdisplay.c',
+  'gimpdisplayshell-actions.c',
+  'gimpdisplayshell-appearance.c',
+  'gimpdisplayshell-autoscroll.c',
+  'gimpdisplayshell-callbacks.c',
+  'gimpdisplayshell-close.c',
+  'gimpdisplayshell-cursor.c',
+  'gimpdisplayshell-dnd.c',
+  'gimpdisplayshell-draw.c',
+  'gimpdisplayshell-expose.c',
+  'gimpdisplayshell-filter-dialog.c',
+  'gimpdisplayshell-filter.c',
+  'gimpdisplayshell-grab.c',
+  'gimpdisplayshell-handlers.c',
+  'gimpdisplayshell-icon.c',
+  'gimpdisplayshell-items.c',
+  'gimpdisplayshell-layer-select.c',
+  'gimpdisplayshell-profile.c',
+  'gimpdisplayshell-progress.c',
+  'gimpdisplayshell-render.c',
+  'gimpdisplayshell-rotate-dialog.c',
+  'gimpdisplayshell-rotate.c',
+  'gimpdisplayshell-rulers.c',
+  'gimpdisplayshell-scale-dialog.c',
+  'gimpdisplayshell-scale.c',
+  'gimpdisplayshell-scroll.c',
+  'gimpdisplayshell-scrollbars.c',
+  'gimpdisplayshell-selection.c',
+  'gimpdisplayshell-title.c',
+  'gimpdisplayshell-tool-events.c',
+  'gimpdisplayshell-transform.c',
+  'gimpdisplayshell-utils.c',
+  'gimpdisplayshell.c',
+  'gimpimagewindow.c',
+  'gimpmotionbuffer.c',
+  'gimpmultiwindowstrategy.c',
+  'gimpnavigationeditor.c',
+  'gimpscalecombobox.c',
+  'gimpsinglewindowstrategy.c',
+  'gimpstatusbar.c',
+  'gimptoolcompass.c',
+  'gimptooldialog.c',
+  'gimptoolgui.c',
+  'gimptoolgyroscope.c',
+  'gimptoolhandlegrid.c',
+  'gimptoolline.c',
+  'gimptoolpath.c',
+  'gimptoolpolygon.c',
+  'gimptoolrectangle.c',
+  'gimptoolrotategrid.c',
+  'gimptoolsheargrid.c',
+  'gimptooltransformgrid.c',
+  'gimptoolwidget.c',
+  'gimptoolwidgetgroup.c',
+  appdisplayenums,
+  gitversion_h,
+
+  appcoremarshal,
+]
+
+libappdisplay = static_library('appdisplay',
+  libappdisplay_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-Display"',
+  dependencies: [
+    gegl, gtk3,
+  ],
+)
diff --git a/app/file-data/meson.build b/app/file-data/meson.build
new file mode 100644
index 0000000000..8a21f3c14a
--- /dev/null
+++ b/app/file-data/meson.build
@@ -0,0 +1,21 @@
+
+libappfiledata_sources = [
+  'file-data-gbr.c',
+  'file-data-gex.c',
+  'file-data-gih.c',
+  'file-data-pat.c',
+  'file-data.c',
+]
+
+libappfiledata = static_library('appfiledata',
+  libappfiledata_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-File-Data"',
+  dependencies: [
+    appstream_glib,
+    cairo,
+    gdk_pixbuf,
+    gegl,
+    libarchive,
+  ],
+)
diff --git a/app/file/meson.build b/app/file/meson.build
new file mode 100644
index 0000000000..5ed43957f2
--- /dev/null
+++ b/app/file/meson.build
@@ -0,0 +1,16 @@
+libappfile_sources = [
+  'file-import.c',
+  'file-open.c',
+  'file-remote.c',
+  'file-save.c',
+  'file-utils.c',
+]
+
+libappfile = static_library('appfile',
+  libappfile_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-File"',
+  dependencies: [
+    gegl, gdk_pixbuf,
+  ],
+)
diff --git a/app/gegl/meson.build b/app/gegl/meson.build
new file mode 100644
index 0000000000..50ef7a096a
--- /dev/null
+++ b/app/gegl/meson.build
@@ -0,0 +1,33 @@
+
+appgeglenums = custom_target('gimp-gegl-enums.c',
+  input : [ 'gimp-gegl-enums.h', ],
+  output: [ 'gimp-gegl-enums.c', ],
+  command: app_mkenums_custom_target_command,
+  capture: true,
+)
+
+libappgegl_sources = [
+  'gimp-babl-compat.c',
+  'gimp-babl.c',
+  'gimp-gegl-apply-operation.c',
+  'gimp-gegl-loops-sse2.c',
+  'gimp-gegl-loops.cc',
+  'gimp-gegl-mask-combine.cc',
+  'gimp-gegl-mask.c',
+  'gimp-gegl-nodes.c',
+  'gimp-gegl-tile-compat.c',
+  'gimp-gegl-utils.c',
+  'gimp-gegl.c',
+  'gimpapplicator.c',
+  'gimptilehandlervalidate.c',
+  appgeglenums,
+]
+
+libappgegl = static_library('appgegl',
+  libappgegl_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-GEGL"',
+  dependencies: [
+    cairo, gegl, gdk_pixbuf,
+  ],
+)
diff --git a/app/git-version.h.in b/app/git-version.h.in
new file mode 100644
index 0000000000..2adb4479f6
--- /dev/null
+++ b/app/git-version.h.in
@@ -0,0 +1,5 @@
+#pragma once
+
+#define GIMP_GIT_VERSION          "@GIMP_GIT_VERSION@"
+#define GIMP_GIT_VERSION_ABBREV   "@GIMP_GIT_VERSION_ABBREV@"
+#define GIMP_GIT_LAST_COMMIT_YEAR "@GIMP_GIT_LAST_COMMIT_YEAR@"
diff --git a/app/gui/meson.build b/app/gui/meson.build
new file mode 100644
index 0000000000..25f56fcccb
--- /dev/null
+++ b/app/gui/meson.build
@@ -0,0 +1,35 @@
+
+gimpdbusservice_gen = gnome.gdbus_codegen(
+  'gimpdbusservice-generated',
+  'dbus-service.xml',
+  interface_prefix: 'org.gimp.GIMP.',
+  namespace: 'GimpDBusService',
+)
+
+libappgui_sources = [
+  'gimpdbusservice.c',
+  'gimpuiconfigurer.c',
+  'gui-message.c',
+  'gui-unique.c',
+  'gui-vtable.c',
+  'gui.c',
+  'icon-themes.c',
+  'session.c',
+  'splash.c',
+  'themes.c',
+  gimpdbusservice_gen,
+]
+
+# Workaround for generated header included in other directories.
+configInclude = include_directories('.')
+
+
+libappgui = static_library('appgui',
+  libappgui_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-GUI"',
+  dependencies: [
+    cairo, dbus_glib, gegl, gdk_pixbuf, gio_specific, gtk3
+  ],
+  install: false,
+)
diff --git a/app/menus/meson.build b/app/menus/meson.build
new file mode 100644
index 0000000000..3f406698e8
--- /dev/null
+++ b/app/menus/meson.build
@@ -0,0 +1,20 @@
+libappmenus_sources = [
+  'dockable-menu.c',
+  'file-menu.c',
+  'filters-menu.c',
+  'image-menu.c',
+  'menus.c',
+  'plug-in-menus.c',
+  'tool-options-menu.c',
+  'window-menu.c',
+  'windows-menu.c',
+]
+
+libappmenus = static_library('appmenus',
+  libappmenus_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-Menus"',
+  dependencies: [
+    gegl, gtk3
+  ],
+)
diff --git a/app/meson.build b/app/meson.build
new file mode 100644
index 0000000000..1a387eea3e
--- /dev/null
+++ b/app/meson.build
@@ -0,0 +1,191 @@
+rootAppInclude = include_directories('.')
+
+app_mkenums_custom_target_command = [
+  gimp_mkenums,
+  '--fhead','#include "config.h"\n'
+          + '#include <gio/gio.h>\n'
+          + '#include "libgimpbase/gimpbase.h"\n'
+          + '#include "core/core-enums.h"\n'
+          + '#include "@INPUT@"\n'
+          + '#include "gimp-intl.h"\n',
+  gimp_mkenums_custom_target_commonargs,
+]
+
+subdir('actions')
+subdir('core')
+subdir('dialogs')
+subdir('display')
+subdir('file')
+subdir('file-data')
+subdir('gegl')
+subdir('gui')
+subdir('menus')
+subdir('operations')
+subdir('paint')
+subdir('pdb')
+subdir('plug-in')
+subdir('propgui')
+subdir('text')
+subdir('tools')
+subdir('vectors')
+subdir('widgets')
+subdir('xcf')
+
+
+# For app/config
+app_debug_files = files(
+  'gimp-debug.c',
+  'gimp-log.c',
+)
+
+# Top-level library
+
+libapp_sources = [
+  'app.c',
+  'errors.c',
+  'gimp-debug.c',
+  'gimp-log.c',
+  'gimp-version.c',
+  'language.c',
+  'sanity.c',
+  'signals.c',
+  'tests.c',
+  'unique.c',
+  gitversion_h,
+  gimpdbusservice_gen,
+]
+
+libapp = static_library('app',
+  libapp_sources,
+  include_directories: [ rootInclude, rootAppInclude, configInclude, ],
+  c_args: [ '-DG_LOG_DOMAIN="Gimp"', '-DGIMP_APP_GLUE_COMPILATION', ],
+  dependencies: [
+    gegl, gdk_pixbuf, gtk3,
+  ],
+)
+
+
+# Those subdirs need to link againts the first ones
+subdir('config')
+# subdir('tests')
+
+
+
+app_links = [
+  libappconfig,
+  libappcore,
+  libappfile,
+  libappfiledata,
+  libappgegl,
+  libappinternalprocs,
+  libapplayermodes,
+  libapplayermodeslegacy,
+  libappoperations,
+  libapppaint,
+  libapppdb,
+  libappplugin,
+  libapptext,
+  libappvectors,
+  libappxcf,
+  libgimpbase,
+  libgimpcolor,
+  libgimpconfig,
+  libgimpmath,
+  libgimpmodule,
+  libgimpthumb,
+]
+
+app_gui_links = [
+  libappactions,
+  libappdialogs,
+  libappdisplay,
+  libappgui,
+  libappmenus,
+  libapppropgui,
+  libapptools,
+  libappwidgets,
+  libgimpwidgets,
+]
+
+app_deps = [
+  gio, gtk3, pangocairo, pangoft2, gegl, lcms, gexiv2, drmingw, rpc, dbghelp,
+]
+
+# Executables
+
+if platform_windows
+  console_rc_name = 'gimp-console-'+ gimp_app_version
+  gimp_app_console_rc = configure_file(
+    input : gimp_plugins_rc,
+    output: console_rc_name + '.rc',
+    copy: true,
+  )
+  console_rc_file = windows.compile_resources(
+    gimp_app_console_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(console_rc_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(console_rc_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+
+  gui_rc_name = 'gimp-'+ gimp_app_version
+  gimp_app_gui_rc = configure_file(
+    input : gimp_plugins_rc,
+    output: gui_rc_name + '.rc',
+    copy: true,
+  )
+  gui_rc_file = windows.compile_resources(
+    gimp_app_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(gui_rc_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(gui_rc_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+
+else
+  console_rc_file = []
+  gui_rc_file = []
+endif
+
+
+gimpconsole_exe = executable('gimp-console-'+gimp_app_version,
+  'main.c',
+  libapp_sources,
+  console_rc_file,
+  c_args: [
+    '-DG_LOG_DOMAIN="Gimp"',
+    '-DGIMP_APP_GLUE_COMPILATION',
+    '-DGIMP_CONSOLE_COMPILATION',
+  ],
+  include_directories: rootInclude,
+  dependencies: app_deps,
+  link_with: [
+    app_links,
+  ],
+  install: true,
+)
+
+gimpmain_exe = executable('gimp-'+gimp_app_version,
+  'main.c',
+  libapp_sources,
+  gui_rc_file,
+  c_args: [
+    '-DG_LOG_DOMAIN="Gimp"',
+    '-DGIMP_APP_GLUE_COMPILATION',
+  ],
+  include_directories: rootInclude,
+  dependencies: app_deps,
+  link_with: [
+    app_links,
+    app_gui_links,
+  ],
+  install: true,
+)
diff --git a/app/operations/layer-modes-legacy/meson.build b/app/operations/layer-modes-legacy/meson.build
new file mode 100644
index 0000000000..7fa8409fbc
--- /dev/null
+++ b/app/operations/layer-modes-legacy/meson.build
@@ -0,0 +1,29 @@
+libapplayermodeslegacy_sources = [
+  'gimpoperationadditionlegacy.c',
+  'gimpoperationburnlegacy.c',
+  'gimpoperationdarkenonlylegacy.c',
+  'gimpoperationdifferencelegacy.c',
+  'gimpoperationdividelegacy.c',
+  'gimpoperationdodgelegacy.c',
+  'gimpoperationgrainextractlegacy.c',
+  'gimpoperationgrainmergelegacy.c',
+  'gimpoperationhardlightlegacy.c',
+  'gimpoperationhslcolorlegacy.c',
+  'gimpoperationhsvhuelegacy.c',
+  'gimpoperationhsvsaturationlegacy.c',
+  'gimpoperationhsvvaluelegacy.c',
+  'gimpoperationlightenonlylegacy.c',
+  'gimpoperationmultiplylegacy.c',
+  'gimpoperationscreenlegacy.c',
+  'gimpoperationsoftlightlegacy.c',
+  'gimpoperationsubtractlegacy.c',
+]
+
+libapplayermodeslegacy = static_library('applayermodeslegacy',
+  libapplayermodeslegacy_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-Layer-Modes-Legacy"',
+  dependencies: [
+    cairo, gegl, gdk_pixbuf,
+  ],
+)
diff --git a/app/operations/layer-modes/meson.build b/app/operations/layer-modes/meson.build
new file mode 100644
index 0000000000..5031c4a344
--- /dev/null
+++ b/app/operations/layer-modes/meson.build
@@ -0,0 +1,27 @@
+libapplayermodes_sources = [
+  'gimp-layer-modes.c',
+  'gimpoperationantierase.c',
+  'gimpoperationbehind.c',
+  'gimpoperationdissolve.c',
+  'gimpoperationerase.c',
+  'gimpoperationlayermode-blend.c',
+  'gimpoperationlayermode-composite-sse2.c',
+  'gimpoperationlayermode-composite.c',
+  'gimpoperationlayermode.c',
+  'gimpoperationmerge.c',
+  'gimpoperationnormal-sse2.c',
+  'gimpoperationnormal-sse4.c',
+  'gimpoperationnormal.c',
+  'gimpoperationpassthrough.c',
+  'gimpoperationreplace.c',
+  'gimpoperationsplit.c',
+]
+
+libapplayermodes = static_library('applayermodes',
+  libapplayermodes_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-Layer-Modes"',
+  dependencies: [
+    cairo, gegl, gdk_pixbuf,
+  ],
+)
diff --git a/app/operations/meson.build b/app/operations/meson.build
new file mode 100644
index 0000000000..40ec2707a0
--- /dev/null
+++ b/app/operations/meson.build
@@ -0,0 +1,62 @@
+
+appoperationsenums = custom_target('operations-enums.c',
+  input : [ 'operations-enums.h', ],
+  output: [ 'operations-enums.c', ],
+  command: app_mkenums_custom_target_command,
+  capture: true,
+)
+
+
+libappoperations_sources = [
+  'gimp-operation-config.c',
+  'gimp-operations.c',
+  'gimpbrightnesscontrastconfig.c',
+  'gimpcageconfig.c',
+  'gimpcolorbalanceconfig.c',
+  'gimpcurvesconfig.c',
+  'gimphuesaturationconfig.c',
+  'gimplevelsconfig.c',
+  'gimpoperationborder.c',
+  'gimpoperationbrightnesscontrast.c',
+  'gimpoperationbuffersourcevalidate.c',
+  'gimpoperationcagecoefcalc.c',
+  'gimpoperationcagetransform.c',
+  'gimpoperationcolorbalance.c',
+  'gimpoperationcolorize.c',
+  'gimpoperationcomposecrop.c',
+  'gimpoperationcurves.c',
+  'gimpoperationdesaturate.c',
+  'gimpoperationequalize.c',
+  'gimpoperationfillsource.c',
+  'gimpoperationflood.c',
+  'gimpoperationgradient.c',
+  'gimpoperationgrow.c',
+  'gimpoperationhistogramsink.c',
+  'gimpoperationhuesaturation.c',
+  'gimpoperationlevels.c',
+  'gimpoperationmaskcomponents.cc',
+  'gimpoperationoffset.c',
+  'gimpoperationpointfilter.c',
+  'gimpoperationposterize.c',
+  'gimpoperationprofiletransform.c',
+  'gimpoperationscalarmultiply.c',
+  'gimpoperationsemiflatten.c',
+  'gimpoperationsetalpha.c',
+  'gimpoperationshrink.c',
+  'gimpoperationthreshold.c',
+  'gimpoperationthresholdalpha.c',
+  appoperationsenums
+]
+
+libappoperations = static_library('appoperations',
+  libappoperations_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-Operations"',
+  dependencies: [
+    cairo, gegl, gdk_pixbuf,
+  ],
+)
+
+subdir('layer-modes')
+subdir('layer-modes-legacy')
+subdir('tests')
diff --git a/app/operations/tests/meson.build b/app/operations/tests/meson.build
new file mode 100644
index 0000000000..65bc8b6d18
--- /dev/null
+++ b/app/operations/tests/meson.build
@@ -0,0 +1,10 @@
+
+executable('test-operations',
+  'test-operations.c',
+  include_directories: [ rootInclude, rootAppInclude, ],
+
+  dependencies: [
+    cairo, gegl, gdk_pixbuf, glib, pangocairo, pangoft2,
+  ],
+  build_by_default: false,
+)
diff --git a/app/paint/meson.build b/app/paint/meson.build
new file mode 100644
index 0000000000..c9d014f8a4
--- /dev/null
+++ b/app/paint/meson.build
@@ -0,0 +1,58 @@
+
+apppaintenums = custom_target('paint-enums.c',
+  input : [ 'paint-enums.h', ],
+  output: [ 'paint-enums.c', ],
+  command: app_mkenums_custom_target_command,
+  capture: true,
+)
+
+
+libapppaint_sources = [
+  'gimp-paint.c',
+  'gimpairbrush.c',
+  'gimpairbrushoptions.c',
+  'gimpbrushcore-loops.cc',
+  'gimpbrushcore.c',
+  'gimpclone.c',
+  'gimpcloneoptions.c',
+  'gimpconvolve.c',
+  'gimpconvolveoptions.c',
+  'gimpdodgeburn.c',
+  'gimpdodgeburnoptions.c',
+  'gimperaser.c',
+  'gimperaseroptions.c',
+  'gimpheal.c',
+  'gimpink-blob.c',
+  'gimpink.c',
+  'gimpinkoptions.c',
+  'gimpinkundo.c',
+  'gimpmybrushcore.c',
+  'gimpmybrushoptions.c',
+  'gimpmybrushsurface.c',
+  'gimppaintbrush.c',
+  'gimppaintcore-loops.cc',
+  'gimppaintcore-stroke.c',
+  'gimppaintcore.c',
+  'gimppaintcoreundo.c',
+  'gimppaintoptions.c',
+  'gimppencil.c',
+  'gimppenciloptions.c',
+  'gimpperspectiveclone.c',
+  'gimpperspectivecloneoptions.c',
+  'gimpsmudge.c',
+  'gimpsmudgeoptions.c',
+  'gimpsourcecore.c',
+  'gimpsourceoptions.c',
+  apppaintenums,
+
+  appcoremarshal,
+]
+
+libapppaint = static_library('apppaint',
+  libapppaint_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-Paint"',
+  dependencies: [
+    cairo, gegl, gdk_pixbuf, libmypaint,
+  ],
+)
diff --git a/app/pdb/meson.build b/app/pdb/meson.build
new file mode 100644
index 0000000000..5e871ed352
--- /dev/null
+++ b/app/pdb/meson.build
@@ -0,0 +1,85 @@
+libapppdb_sources = [
+  'gimp-pdb-compat.c',
+  'gimppdb-query.c',
+  'gimppdb-utils.c',
+  'gimppdb.c',
+  'gimppdbcontext.c',
+  'gimppdberror.c',
+  'gimpprocedure.c',
+]
+libappinternalprocs_sources = [
+  'brush-cmds.c',
+  'brush-select-cmds.c',
+  'brushes-cmds.c',
+  'buffer-cmds.c',
+  'channel-cmds.c',
+  'context-cmds.c',
+  'debug-cmds.c',
+  'display-cmds.c',
+  'drawable-cmds.c',
+  'drawable-color-cmds.c',
+  'drawable-edit-cmds.c',
+  'dynamics-cmds.c',
+  'edit-cmds.c',
+  'fileops-cmds.c',
+  'floating-sel-cmds.c',
+  'font-select-cmds.c',
+  'fonts-cmds.c',
+  'gimp-cmds.c',
+  'gimprc-cmds.c',
+  'gradient-cmds.c',
+  'gradient-select-cmds.c',
+  'gradients-cmds.c',
+  'help-cmds.c',
+  'image-cmds.c',
+  'image-color-profile-cmds.c',
+  'image-convert-cmds.c',
+  'image-grid-cmds.c',
+  'image-guides-cmds.c',
+  'image-sample-points-cmds.c',
+  'image-select-cmds.c',
+  'image-transform-cmds.c',
+  'image-undo-cmds.c',
+  'internal-procs.c',
+  'item-cmds.c',
+  'item-transform-cmds.c',
+  'layer-cmds.c',
+  'message-cmds.c',
+  'paint-tools-cmds.c',
+  'palette-cmds.c',
+  'palette-select-cmds.c',
+  'palettes-cmds.c',
+  'pattern-cmds.c',
+  'pattern-select-cmds.c',
+  'patterns-cmds.c',
+  'pdb-cmds.c',
+  'plug-in-cmds.c',
+  'plug-in-compat-cmds.c',
+  'progress-cmds.c',
+  'selection-cmds.c',
+  'text-layer-cmds.c',
+  'text-tool-cmds.c',
+  'unit-cmds.c',
+  'vectors-cmds.c',
+
+  appcoremarshal,
+]
+
+libapppdb = static_library('apppdb',
+  libapppdb_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-PDB"',
+  dependencies: [
+    cairo, gegl, gdk_pixbuf,
+  ],
+)
+
+
+libappinternalprocs = static_library('appinternalprocs',
+  libappinternalprocs_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-PDB"',
+  dependencies: [
+    cairo, gegl, gdk_pixbuf,
+  ],
+)
diff --git a/app/plug-in/meson.build b/app/plug-in/meson.build
new file mode 100644
index 0000000000..486896d427
--- /dev/null
+++ b/app/plug-in/meson.build
@@ -0,0 +1,51 @@
+
+apppluginenums = custom_target('plug-in-enums.c',
+  input : [ 'plug-in-enums.h', ],
+  output: [ 'plug-in-enums.c', ],
+  command: app_mkenums_custom_target_command,
+  capture: true,
+)
+
+
+libappplugin_sources = [
+  'gimpenvirontable.c',
+  'gimpgpparams.c',
+  'gimpinterpreterdb.c',
+  'gimpplugin-cleanup.c',
+  'gimpplugin-context.c',
+  'gimpplugin-message.c',
+  'gimpplugin-proc.c',
+  'gimpplugin-progress.c',
+  'gimpplugin.c',
+  'gimpplugindebug.c',
+  'gimpplugindef.c',
+  'gimppluginerror.c',
+  'gimppluginmanager-call.c',
+  'gimppluginmanager-data.c',
+  'gimppluginmanager-file-procedure.c',
+  'gimppluginmanager-file.c',
+  'gimppluginmanager-help-domain.c',
+  'gimppluginmanager-locale-domain.c',
+  'gimppluginmanager-menu-branch.c',
+  'gimppluginmanager-query.c',
+  'gimppluginmanager-restore.c',
+  'gimppluginmanager.c',
+  'gimppluginprocedure.c',
+  'gimppluginprocframe.c',
+  'gimppluginshm.c',
+  'gimptemporaryprocedure.c',
+  'plug-in-menu-path.c',
+  'plug-in-rc.c',
+  apppluginenums,
+
+  appcoremarshal,
+]
+
+libappplugin = static_library('appplug-in',
+  libappplugin_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-Plug-In"',
+  dependencies: [
+    cairo, gegl, gdk_pixbuf,
+  ],
+)
diff --git a/app/propgui/meson.build b/app/propgui/meson.build
new file mode 100644
index 0000000000..724a0dd430
--- /dev/null
+++ b/app/propgui/meson.build
@@ -0,0 +1,31 @@
+libapppropgui_sources = [
+  'gimppropgui-channel-mixer.c',
+  'gimppropgui-color-balance.c',
+  'gimppropgui-color-rotate.c',
+  'gimppropgui-color-to-alpha.c',
+  'gimppropgui-convolution-matrix.c',
+  'gimppropgui-diffraction-patterns.c',
+  'gimppropgui-eval.c',
+  'gimppropgui-generic.c',
+  'gimppropgui-hue-saturation.c',
+  'gimppropgui-motion-blur-circular.c',
+  'gimppropgui-motion-blur-linear.c',
+  'gimppropgui-motion-blur-zoom.c',
+  'gimppropgui-newsprint.c',
+  'gimppropgui-panorama-projection.c',
+  'gimppropgui-recursive-transform.c',
+  'gimppropgui-shadows-highlights.c',
+  'gimppropgui-spiral.c',
+  'gimppropgui-supernova.c',
+  'gimppropgui-utils.c',
+  'gimppropgui.c',
+]
+
+libapppropgui = static_library('apppropgui',
+  libapppropgui_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-PropGUI"',
+  dependencies: [
+    gegl, gtk3,
+  ],
+)
diff --git a/app/tests/create_test_env.sh b/app/tests/create_test_env.sh
new file mode 100644
index 0000000000..4bf5bfd458
--- /dev/null
+++ b/app/tests/create_test_env.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+# Copy tests resources
+for dir in files gimpdir gimpdir-empty; do
+    rm -rf "${MESON_BUILD_ROOT}/${MESON_SUBDIR}/${dir}"
+    cp -r "${MESON_SOURCE_ROOT}/${MESON_SUBDIR}/${dir}" \
+        "${MESON_BUILD_ROOT}/${MESON_SUBDIR}"
+done
+
+# Link to Color icon theme for tests
+IconsRoot="${MESON_SOURCE_ROOT}/icons/Color"
+IconsDirs=$(find "${IconsRoot}" -name [0-9]* -type d -printf '%f\n' | sort -n)
+for dir in ${IconsDirs} ; do
+    mkdir  "${MESON_BUILD_ROOT}/${MESON_SUBDIR}/gimp-test-icon-theme/hicolor/${dir}x${dir}" -p
+    LnName="${MESON_BUILD_ROOT}/${MESON_SUBDIR}/gimp-test-icon-theme/hicolor/${dir}x${dir}/apps"
+    rm -rf "${LnName}"
+    ln -s "${IconsRoot}/${dir}" "${LnName}"
+done
+
+LnName="${MESON_BUILD_ROOT}/${MESON_SUBDIR}/gimp-test-icon-theme/hicolor/index.theme"
+rm -rf "${LnName}"
+ln -s "${IconsRoot}/index.theme" "${LnName}"
+
+
+# Create output dirs
+rm -rf "${MESON_BUILD_ROOT}/${MESON_SUBDIR}/gimpdir-output"
+for dir in brushes gradients patterns; do
+    mkdir -p "${MESON_BUILD_ROOT}/${MESON_SUBDIR}/gimpdir-output/${dir}"
+done
diff --git a/app/tests/meson.build b/app/tests/meson.build
new file mode 100644
index 0000000000..9d456b46e5
--- /dev/null
+++ b/app/tests/meson.build
@@ -0,0 +1,91 @@
+
+apptests_includes = [
+  rootInclude, rootAppInclude
+]
+apptests_deps = [
+  pangocairo, pangoft2, gtk3, dbus_glib, gegl, appstream_glib,
+]
+apptests_links = [
+  libapp,
+  libappactions,
+  libappconfig,
+  libappcore,
+  libappdialogs,
+  libappdialogs,
+  libappdisplay,
+  libappfile,
+  libappgegl,
+  libappgui,
+  libappinternalprocs,
+  libapplayermodes,
+  libapplayermodeslegacy,
+  libappmenus,
+  libappoperations,
+  libapppaint,
+  libapppdb,
+  libappplugin,
+  libapppropgui,
+  libapptext,
+  libapptools,
+  libappvectors,
+  libappwidgets,
+  libappxcf,
+  libgimpbase,
+  libgimpcolor,
+  libgimpconfig,
+  libgimpmath,
+  libgimpmodule,
+  libgimpthumb,
+  libgimpwidgets,
+]
+
+
+libapptestutils_sources = [
+  'gimp-app-test-utils.c',
+  'gimp-test-session-utils.c',
+]
+
+libapptestutils = static_library('apptestutils',
+  libapptestutils_sources,
+  include_directories: apptests_includes,
+  dependencies: apptests_deps,
+  link_with: apptests_links,
+)
+
+apptests_links += libapptestutils
+
+
+app_tests = [
+  'core',
+  'gimpidtable',
+  'save-and-export',
+  'session-2-8-compatibility-multi-window',
+  'session-2-8-compatibility-single-window',
+  'single-window-mode',
+  # 'tools',
+  'ui',
+  'xcf',
+]
+
+foreach test_name : app_tests
+  test_exe = executable(test_name,
+    'test-@0@.c'.format(test_name),
+    include_directories: apptests_includes,
+    dependencies: apptests_deps,
+    link_with: apptests_links,
+  )
+
+  test(test_name,
+    test_exe,
+    env: [
+      'GIMP_TESTING_ABS_TOP_SRCDIR='  + meson.build_root(),
+      'GIMP_TESTING_ABS_TOP_BUILDDIR='+ meson.build_root(),
+      'GIMP_TESTING_PLUGINDIRS=' +      meson.build_root()/'plug-ins'/'common',
+      'GIMP_TESTING_PLUGINDIRS_BASENAME_IGNORES=mkgen.pl',
+    ],
+    suite: 'app',
+  )
+
+endforeach
+
+run_target('create_test_env', command: find_program('create_test_env.sh'))
diff --git a/app/text/meson.build b/app/text/meson.build
new file mode 100644
index 0000000000..d3cf312ecc
--- /dev/null
+++ b/app/text/meson.build
@@ -0,0 +1,36 @@
+
+apptextenums = custom_target('text-enums.c',
+  input : [ 'text-enums.h', ],
+  output: [ 'text-enums.c', ],
+  command: app_mkenums_custom_target_command,
+  capture: true,
+)
+
+libapptext_sources = [
+  'gimpfont.c',
+  'gimpfontfactory.c',
+  'gimptext-compat.c',
+  'gimptext-parasite.c',
+  'gimptext-vectors.c',
+  'gimptext-xlfd.c',
+  'gimptext.c',
+  'gimptextlayer-transform.c',
+  'gimptextlayer-xcf.c',
+  'gimptextlayer.c',
+  'gimptextlayout-render.c',
+  'gimptextlayout.c',
+  'gimptextundo.c',
+  apptextenums,
+
+  appcoremarshal,
+]
+
+
+libapptext = static_library('apptext',
+  libapptext_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-Text"',
+  dependencies: [
+    gegl, gdk_pixbuf, harfbuzz, pangocairo, pangoft2,
+  ],
+)
diff --git a/app/tools/meson.build b/app/tools/meson.build
new file mode 100644
index 0000000000..fa0bdb96fd
--- /dev/null
+++ b/app/tools/meson.build
@@ -0,0 +1,131 @@
+
+apptoolsenums = custom_target('tools-enums.c',
+  input : [ 'tools-enums.h', ],
+  output: [ 'tools-enums.c', ],
+  command: app_mkenums_custom_target_command,
+  capture: true,
+)
+
+libapptools_sources = [
+  'gimp-tools.c',
+  'gimp-tool-options-manager.c',
+  'gimpairbrushtool.c',
+  'gimpalignoptions.c',
+  'gimpaligntool.c',
+  'gimpbrightnesscontrasttool.c',
+  'gimpbrushtool.c',
+  'gimpbucketfilloptions.c',
+  'gimpbucketfilltool.c',
+  'gimpbycolorselecttool.c',
+  'gimpcageoptions.c',
+  'gimpcagetool.c',
+  'gimpcloneoptions-gui.c',
+  'gimpclonetool.c',
+  'gimpcoloroptions.c',
+  'gimpcolorpickeroptions.c',
+  'gimpcolorpickertool.c',
+  'gimpcolortool.c',
+  'gimpconvolvetool.c',
+  'gimpcropoptions.c',
+  'gimpcroptool.c',
+  'gimpcurvestool.c',
+  'gimpdodgeburntool.c',
+  'gimpdrawtool.c',
+  'gimpeditselectiontool.c',
+  'gimpellipseselecttool.c',
+  'gimperasertool.c',
+  'gimpfilteroptions.c',
+  'gimpfiltertool-settings.c',
+  'gimpfiltertool-widgets.c',
+  'gimpfiltertool.c',
+  'gimpflipoptions.c',
+  'gimpfliptool.c',
+  'gimpforegroundselectoptions.c',
+  'gimpforegroundselecttool.c',
+  'gimpforegroundselecttoolundo.c',
+  'gimpfreeselecttool.c',
+  'gimpfuzzyselecttool.c',
+  'gimpgegltool.c',
+  'gimpgenerictransformtool.c',
+  'gimpgradientoptions.c',
+  'gimpgradienttool-editor.c',
+  'gimpgradienttool.c',
+  'gimpguidetool.c',
+  'gimphandletransformoptions.c',
+  'gimphandletransformtool.c',
+  'gimphealtool.c',
+  'gimphistogramoptions.c',
+  'gimpinkoptions-gui.c',
+  'gimpinktool.c',
+  'gimpiscissorsoptions.c',
+  'gimpiscissorstool.c',
+  'gimplevelstool.c',
+  'gimpmagnifyoptions.c',
+  'gimpmagnifytool.c',
+  'gimpmeasureoptions.c',
+  'gimpmeasuretool.c',
+  'gimpmoveoptions.c',
+  'gimpmovetool.c',
+  'gimpmybrushoptions-gui.c',
+  'gimpmybrushtool.c',
+  'gimpnpointdeformationoptions.c',
+  'gimpnpointdeformationtool.c',
+  'gimpoffsettool.c',
+  'gimpoperationtool.c',
+  'gimppaintbrushtool.c',
+  'gimppaintoptions-gui.c',
+  'gimppainttool-paint.c',
+  'gimppainttool.c',
+  'gimppenciltool.c',
+  'gimpperspectiveclonetool.c',
+  'gimpperspectivetool.c',
+  'gimppolygonselecttool.c',
+  'gimprectangleoptions.c',
+  'gimprectangleselectoptions.c',
+  'gimprectangleselecttool.c',
+  'gimpregionselectoptions.c',
+  'gimpregionselecttool.c',
+  'gimprotatetool.c',
+  'gimpsamplepointtool.c',
+  'gimpscaletool.c',
+  'gimpseamlesscloneoptions.c',
+  'gimpseamlessclonetool.c',
+  'gimpselectionoptions.c',
+  'gimpselectiontool.c',
+  'gimpsheartool.c',
+  'gimpsmudgetool.c',
+  'gimpsourcetool.c',
+  'gimptextoptions.c',
+  'gimptexttool-editor.c',
+  'gimptexttool.c',
+  'gimpthresholdtool.c',
+  'gimptilehandleriscissors.c',
+  'gimptool-progress.c',
+  'gimptool.c',
+  'gimptoolcontrol.c',
+  'gimptooloptions-gui.c',
+  'gimptools-utils.c',
+  'gimptransformgridoptions.c',
+  'gimptransformgridtool.c',
+  'gimptransformgridtoolundo.c',
+  'gimptransformoptions.c',
+  'gimptransformtool.c',
+  'gimpunifiedtransformtool.c',
+  'gimpvectoroptions.c',
+  'gimpvectortool.c',
+  'gimpwarpoptions.c',
+  'gimpwarptool.c',
+  'tool_manager.c',
+  apptoolsenums,
+
+  appcoremarshal,
+]
+
+libapptools = static_library('apptools',
+  libapptools_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-Tools"',
+  dependencies: [
+    gegl, gtk3,
+  ],
+)
diff --git a/app/vectors/meson.build b/app/vectors/meson.build
new file mode 100644
index 0000000000..d517bee916
--- /dev/null
+++ b/app/vectors/meson.build
@@ -0,0 +1,26 @@
+libappvectors_sources = [
+  'gimpanchor.c',
+  'gimpbezierstroke.c',
+  'gimpstroke-new.c',
+  'gimpstroke.c',
+  'gimpvectors-compat.c',
+  'gimpvectors-export.c',
+  'gimpvectors-import.c',
+  'gimpvectors-preview.c',
+  'gimpvectors-warp.c',
+  'gimpvectors.c',
+  'gimpvectorsmodundo.c',
+  'gimpvectorspropundo.c',
+  'gimpvectorsundo.c',
+
+  appcoremarshal,
+]
+
+libappvectors = static_library('appvectors',
+  libappvectors_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-Vectors"',
+  dependencies: [
+    cairo, gegl, gdk_pixbuf,
+  ],
+)
diff --git a/app/widgets/meson.build b/app/widgets/meson.build
new file mode 100644
index 0000000000..52aa3009c9
--- /dev/null
+++ b/app/widgets/meson.build
@@ -0,0 +1,237 @@
+
+appwidgetsenums = custom_target('widgets-enums.c',
+  input : [ 'widgets-enums.h', ],
+  output: [ 'widgets-enums.c', ],
+  command: app_mkenums_custom_target_command,
+  capture: true,
+)
+
+
+libappwidgets_sources = [
+  'gimpaction-history.c',
+  'gimpaction.c',
+  'gimpactioneditor.c',
+  'gimpactionfactory.c',
+  'gimpactiongroup.c',
+  'gimpactionimpl.c',
+  'gimpactionview.c',
+  'gimpblobeditor.c',
+  'gimpbrusheditor.c',
+  'gimpbrushfactoryview.c',
+  'gimpbrushselect.c',
+  'gimpbuffersourcebox.c',
+  'gimpbufferview.c',
+  'gimpcairo-wilber.c',
+  'gimpcellrendererbutton.c',
+  'gimpcellrendererdashes.c',
+  'gimpcellrendererviewable.c',
+  'gimpchanneltreeview.c',
+  'gimpcircle.c',
+  'gimpclipboard.c',
+  'gimpcolorbar.c',
+  'gimpcolordialog.c',
+  'gimpcolordisplayeditor.c',
+  'gimpcoloreditor.c',
+  'gimpcolorframe.c',
+  'gimpcolorhistory.c',
+  'gimpcolormapeditor.c',
+  'gimpcolormapselection.c',
+  'gimpcolorpanel.c',
+  'gimpcolorselectorpalette.c',
+  'gimpcombotagentry.c',
+  'gimpcomponenteditor.c',
+  'gimpcontainerbox.c',
+  'gimpcontainercombobox.c',
+  'gimpcontainereditor.c',
+  'gimpcontainerentry.c',
+  'gimpcontainericonview.c',
+  'gimpcontainerpopup.c',
+  'gimpcontainertreestore.c',
+  'gimpcontainertreeview-dnd.c',
+  'gimpcontainertreeview.c',
+  'gimpcontainerview-utils.c',
+  'gimpcontainerview.c',
+  'gimpcontrollereditor.c',
+  'gimpcontrollerinfo.c',
+  'gimpcontrollerkeyboard.c',
+  'gimpcontrollerlist.c',
+  'gimpcontrollermouse.c',
+  'gimpcontrollers.c',
+  'gimpcontrollerwheel.c',
+  'gimpcriticaldialog.c',
+  'gimpcursor.c',
+  'gimpcurveview.c',
+  'gimpdashboard.c',
+  'gimpdasheditor.c',
+  'gimpdataeditor.c',
+  'gimpdatafactoryview.c',
+  'gimpdeviceeditor.c',
+  'gimpdeviceinfo-coords.c',
+  'gimpdeviceinfo.c',
+  'gimpdeviceinfoeditor.c',
+  'gimpdevicemanager.c',
+  'gimpdevices.c',
+  'gimpdevicestatus.c',
+  'gimpdial.c',
+  'gimpdialogfactory.c',
+  'gimpdnd-xds.c',
+  'gimpdnd.c',
+  'gimpdock.c',
+  'gimpdockable.c',
+  'gimpdockbook.c',
+  'gimpdockcolumns.c',
+  'gimpdockcontainer.c',
+  'gimpdocked.c',
+  'gimpdockwindow.c',
+  'gimpdocumentview.c',
+  'gimpdrawabletreeview.c',
+  'gimpdynamicseditor.c',
+  'gimpdynamicsfactoryview.c',
+  'gimpdynamicsoutputeditor.c',
+  'gimpeditor.c',
+  'gimpenumaction.c',
+  'gimperrorconsole.c',
+  'gimperrordialog.c',
+  'gimpexportdialog.c',
+  'gimpextensionlist.c',
+  'gimpextensiondetails.c',
+  'gimpfgbgeditor.c',
+  'gimpfgbgview.c',
+  'gimpfiledialog.c',
+  'gimpfileprocview.c',
+  'gimpfilleditor.c',
+  'gimpfontfactoryview.c',
+  'gimpfontselect.c',
+  'gimpgradienteditor.c',
+  'gimpgradientselect.c',
+  'gimpgrideditor.c',
+  'gimphandlebar.c',
+  'gimphelp.c',
+  'gimphistogrambox.c',
+  'gimphistogrameditor.c',
+  'gimphistogramview.c',
+  'gimpiconpicker.c',
+  'gimpimagecommenteditor.c',
+  'gimpimageeditor.c',
+  'gimpimageparasiteview.c',
+  'gimpimageprofileview.c',
+  'gimpimagepropview.c',
+  'gimpimageview.c',
+  'gimpitemtreeview.c',
+  'gimplanguagecombobox.c',
+  'gimplanguageentry.c',
+  'gimplanguagestore-parser.c',
+  'gimplanguagestore.c',
+  'gimplayermodebox.c',
+  'gimplayermodecombobox.c',
+  'gimplayertreeview.c',
+  'gimpmenudock.c',
+  'gimpmenufactory.c',
+  'gimpmessagebox.c',
+  'gimpmessagedialog.c',
+  'gimpmeter.c',
+  'gimpnavigationview.c',
+  'gimpopendialog.c',
+  'gimpoverlaybox.c',
+  'gimpoverlaychild.c',
+  'gimpoverlaydialog.c',
+  'gimpoverlayframe.c',
+  'gimppaletteeditor.c',
+  'gimppaletteselect.c',
+  'gimppaletteview.c',
+  'gimppanedbox.c',
+  'gimppatternfactoryview.c',
+  'gimppatternselect.c',
+  'gimppdbdialog.c',
+  'gimppickablebutton.c',
+  'gimppickablepopup.c',
+  'gimppixbuf.c',
+  'gimppluginview.c',
+  'gimppolar.c',
+  'gimppopup.c',
+  'gimpprefsbox.c',
+  'gimpprocedureaction.c',
+  'gimpprogressbox.c',
+  'gimpprogressdialog.c',
+  'gimppropwidgets.c',
+  'gimpradioaction.c',
+  'gimprender.c',
+  'gimpsamplepointeditor.c',
+  'gimpsavedialog.c',
+  'gimpsearchpopup.c',
+  'gimpselectiondata.c',
+  'gimpselectioneditor.c',
+  'gimpsessioninfo-aux.c',
+  'gimpsessioninfo-book.c',
+  'gimpsessioninfo-dock.c',
+  'gimpsessioninfo-dockable.c',
+  'gimpsessioninfo.c',
+  'gimpsessionmanaged.c',
+  'gimpsettingsbox.c',
+  'gimpsettingseditor.c',
+  'gimpsizebox.c',
+  'gimpspinscale.c',
+  'gimpstringaction.c',
+  'gimpstrokeeditor.c',
+  'gimpsymmetryeditor.c',
+  'gimptagentry.c',
+  'gimptagpopup.c',
+  'gimptemplateeditor.c',
+  'gimptemplateview.c',
+  'gimptextbuffer-serialize.c',
+  'gimptextbuffer.c',
+  'gimptexteditor.c',
+  'gimptextproxy.c',
+  'gimptextstyleeditor.c',
+  'gimptexttag.c',
+  'gimpthumbbox.c',
+  'gimptoggleaction.c',
+  'gimptoolbox-color-area.c',
+  'gimptoolbox-dnd.c',
+  'gimptoolbox-image-area.c',
+  'gimptoolbox-indicator-area.c',
+  'gimptoolbox.c',
+  'gimptooleditor.c',
+  'gimptooloptionseditor.c',
+  'gimptoolpalette.c',
+  'gimptoolpreseteditor.c',
+  'gimptoolpresetfactoryview.c',
+  'gimptranslationstore.c',
+  'gimpuimanager.c',
+  'gimpundoeditor.c',
+  'gimpvectorstreeview.c',
+  'gimpview-popup.c',
+  'gimpview.c',
+  'gimpviewablebox.c',
+  'gimpviewablebutton.c',
+  'gimpviewabledialog.c',
+  'gimpviewrenderer-frame.c',
+  'gimpviewrenderer-utils.c',
+  'gimpviewrenderer.c',
+  'gimpviewrendererbrush.c',
+  'gimpviewrendererbuffer.c',
+  'gimpviewrendererdrawable.c',
+  'gimpviewrenderergradient.c',
+  'gimpviewrendererimage.c',
+  'gimpviewrendererimagefile.c',
+  'gimpviewrendererlayer.c',
+  'gimpviewrendererpalette.c',
+  'gimpviewrenderervectors.c',
+  'gimpwidgets-constructors.c',
+  'gimpwidgets-utils.c',
+  'gimpwindow.c',
+  'gimpwindowstrategy.c',
+  appwidgetsenums,
+
+  appcoremarshal,
+]
+
+
+libappwidgets = static_library('appwidgets',
+  libappwidgets_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-Widgets"',
+  dependencies: [
+    gegl, gtk3,
+  ],
+)
diff --git a/app/xcf/meson.build b/app/xcf/meson.build
new file mode 100644
index 0000000000..44198e92dc
--- /dev/null
+++ b/app/xcf/meson.build
@@ -0,0 +1,18 @@
+libappxcf_sources = [
+  'xcf-load.c',
+  'xcf-read.c',
+  'xcf-save.c',
+  'xcf-seek.c',
+  'xcf-utils.c',
+  'xcf-write.c',
+  'xcf.c',
+]
+
+libappxcf = static_library('appxcf',
+  libappxcf_sources,
+  include_directories: [ rootInclude, rootAppInclude, ],
+  c_args: '-DG_LOG_DOMAIN="Gimp-XCF"',
+  dependencies: [
+    cairo, gegl, gdk_pixbuf, zlib
+  ],
+)
diff --git a/build/windows/installer/lang/extractlang.sh b/build/windows/installer/lang/extractlang.sh
new file mode 100644
index 0000000000..a1cad742da
--- /dev/null
+++ b/build/windows/installer/lang/extractlang.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+prefix=$1
+encoding=$2
+infile=$3
+
+#replace [] with \[\]
+prefix=$(echo "$prefix" | sed 's/[][]/\\\0/g')
+
+#echo to stdout
+sed '/^\w\+'"$prefix"'=/{s/\(.\)'"$prefix"'/\1/;n};/^\w.*=/d' "$infile" \
+| iconv -f UTF-8 -t "$encoding"
diff --git a/build/windows/installer/lang/meson.build b/build/windows/installer/lang/meson.build
new file mode 100644
index 0000000000..c86aeabf66
--- /dev/null
+++ b/build/windows/installer/lang/meson.build
@@ -0,0 +1,61 @@
+isl_input = custom_target('setup.isl',
+  input : 'setup.isl.in',
+  output: 'setup.isl',
+  command: [
+    intltool_merge,
+    '--desktop-style',
+    '--utf8',
+    '--multiple-output',
+    '--cache=' + '@OUTDIR@' / 'intltool-merge-cache',
+    po_windows_installer_dir,
+    '@INPUT@',
+    '@OUTPUT@',
+  ]
+)
+
+languages = [
+  { 'code': 'ca',    },
+  { 'code': 'cs',    'encoding': 'WINDOWS-1250', },
+  { 'code': 'da',    },
+  { 'code': 'de',    },
+  { 'code': 'el',    'encoding': 'WINDOWS-1253', },
+  { 'code': 'en',    'prefix': '', },
+  { 'code': 'eo',    'encoding': 'ISO-8859-3',   },
+  { 'code': 'es',    },
+  { 'code': 'eu',    },
+  { 'code': 'fr',    },
+  { 'code': 'hu',    'encoding': 'WINDOWS-1250', },
+  { 'code': 'id',    'encoding': 'ISO-8859-1',   },
+  { 'code': 'is',    },
+  { 'code': 'it',    },
+  { 'code': 'ko',    'encoding': 'EUC-KR',       },
+  { 'code': 'lv',    'encoding': 'ISO-8859-13',  },
+  { 'code': 'nl',    },
+  { 'code': 'pl',    'encoding': 'WINDOWS-1250', },
+  { 'code': 'pt_BR', },
+  { 'code': 'ru',    'encoding': 'WINDOWS-1251', },
+  { 'code': 'sl',    'encoding': 'WINDOWS-1250', },
+  { 'code': 'sv',    },
+  { 'code': 'tr',    'encoding': 'WINDOWS-1254', },
+  { 'code': 'zh_CN', 'encoding': 'WINDOWS-936',  },
+  { 'code': 'zh_TW', 'encoding': 'CP950',        },
+]
+
+extractlang = find_program('extractlang.sh')
+
+all_isl = []
+foreach language : languages
+  lang_code    = language.get('code')
+  lang_prefix  = language.get('prefix', '[@0@]'.format(code))
+  lang_encoding= language.get('encoding', 'WINDOWS-1252')
+
+  islfile = '@0  setup isl'.format(lang_code)
+
+  all_isl += custom_target(islfile,
+    input : isl_input,
+    output: islfile,
+    command: [ extractlang, lang_prefix, lang_encoding, '@INPUT@' ],
+    capture: true,
+    build_by_default: true,
+  )
+endforeach
diff --git a/build/windows/installer/meson.build b/build/windows/installer/meson.build
new file mode 100644
index 0000000000..55564fb4b4
--- /dev/null
+++ b/build/windows/installer/meson.build
@@ -0,0 +1 @@
+subdir('lang')
diff --git a/build/windows/meson.build b/build/windows/meson.build
new file mode 100644
index 0000000000..28362f6e10
--- /dev/null
+++ b/build/windows/meson.build
@@ -0,0 +1,13 @@
+# Windows specific
+
+gimp_plugins_rc = configure_file(
+  input : 'gimp-plug-ins.rc.in',
+  output: 'gimp-plug-ins.rc',
+  configuration: versionconfig,
+)
+
+gimp_app_rc = configure_file(
+  input : 'gimp.rc.in',
+  output: 'gimp.rc',
+  configuration: versionconfig,
+)
diff --git a/cursors/dummy_file.xml b/cursors/dummy_file.xml
new file mode 100644
index 0000000000..460d12560c
--- /dev/null
+++ b/cursors/dummy_file.xml
@@ -0,0 +1 @@
+@DATA@
diff --git a/cursors/meson.build b/cursors/meson.build
new file mode 100644
index 0000000000..2f08b2f7a0
--- /dev/null
+++ b/cursors/meson.build
@@ -0,0 +1,214 @@
+tool_cursors = [
+  'cursor-bad.png',
+  'cursor-bad-x2.png',
+  'cursor-color-picker.png',
+  'cursor-color-picker-x2.png',
+  'cursor-corner-bottom-left.png',
+  'cursor-corner-bottom-left-x2.png',
+  'cursor-corner-bottom-right.png',
+  'cursor-corner-bottom-right-x2.png',
+  'cursor-corner-bottom.png',
+  'cursor-corner-bottom-x2.png',
+  'cursor-corner-left.png',
+  'cursor-corner-left-x2.png',
+  'cursor-corner-right.png',
+  'cursor-corner-right-x2.png',
+  'cursor-corner-top-left.png',
+  'cursor-corner-top-left-x2.png',
+  'cursor-corner-top-right.png',
+  'cursor-corner-top-right-x2.png',
+  'cursor-corner-top.png',
+  'cursor-corner-top-x2.png',
+  'cursor-crosshair-small.png',
+  'cursor-crosshair-small-x2.png',
+  'cursor-crosshair.png',
+  'cursor-crosshair-x2.png',
+  'cursor-mouse.png',
+  'cursor-mouse-x2.png',
+  'cursor-move.png',
+  'cursor-move-x2.png',
+  'cursor-none.png',
+  'cursor-none-x2.png',
+  'cursor-side-bottom-left.png',
+  'cursor-side-bottom-left-x2.png',
+  'cursor-side-bottom-right.png',
+  'cursor-side-bottom-right-x2.png',
+  'cursor-side-bottom.png',
+  'cursor-side-bottom-x2.png',
+  'cursor-side-left.png',
+  'cursor-side-left-x2.png',
+  'cursor-side-right.png',
+  'cursor-side-right-x2.png',
+  'cursor-side-top-left.png',
+  'cursor-side-top-left-x2.png',
+  'cursor-side-top-right.png',
+  'cursor-side-top-right-x2.png',
+  'cursor-side-top.png',
+  'cursor-side-top-x2.png',
+  'cursor-zoom.png',
+  'cursor-zoom-x2.png',
+
+  'modifier-anchor.png',
+  'modifier-anchor-x2.png',
+  'modifier-background.png',
+  'modifier-background-x2.png',
+  'modifier-bad.png',
+  'modifier-bad-x2.png',
+  'modifier-control.png',
+  'modifier-control-x2.png',
+  'modifier-foreground.png',
+  'modifier-foreground-x2.png',
+  'modifier-intersect.png',
+  'modifier-intersect-x2.png',
+  'modifier-join.png',
+  'modifier-join-x2.png',
+  'modifier-minus.png',
+  'modifier-minus-x2.png',
+  'modifier-move.png',
+  'modifier-move-x2.png',
+  'modifier-pattern.png',
+  'modifier-pattern-x2.png',
+  'modifier-plus.png',
+  'modifier-plus-x2.png',
+  'modifier-resize.png',
+  'modifier-resize-x2.png',
+  'modifier-rotate.png',
+  'modifier-rotate-x2.png',
+  'modifier-select.png',
+  'modifier-select-x2.png',
+  'modifier-zoom.png',
+  'modifier-zoom-x2.png',
+
+  'tool-airbrush.png',
+  'tool-airbrush-x2.png',
+  'tool-blur.png',
+  'tool-blur-x2.png',
+  'tool-bucket-fill.png',
+  'tool-bucket-fill-x2.png',
+  'tool-burn.png',
+  'tool-burn-x2.png',
+  'tool-clone.png',
+  'tool-clone-x2.png',
+  'tool-color-picker.png',
+  'tool-color-picker-x2.png',
+  'tool-crop.png',
+  'tool-crop-x2.png',
+  'tool-dodge.png',
+  'tool-dodge-x2.png',
+  'tool-ellipse-select.png',
+  'tool-ellipse-select-x2.png',
+  'tool-eraser.png',
+  'tool-eraser-x2.png',
+  'tool-flip-horizontal.png',
+  'tool-flip-horizontal-x2.png',
+  'tool-flip-vertical.png',
+  'tool-flip-vertical-x2.png',
+  'tool-free-select.png',
+  'tool-free-select-x2.png',
+  'tool-fuzzy-select.png',
+  'tool-fuzzy-select-x2.png',
+  'tool-gradient.png',
+  'tool-gradient-x2.png',
+  'tool-hand.png',
+  'tool-hand-x2.png',
+  'tool-heal.png',
+  'tool-heal-x2.png',
+  'tool-ink.png',
+  'tool-ink-x2.png',
+  'tool-iscissors.png',
+  'tool-iscissors-x2.png',
+  'tool-measure.png',
+  'tool-measure-x2.png',
+  'tool-move.png',
+  'tool-move-x2.png',
+  'tool-paintbrush.png',
+  'tool-paintbrush-x2.png',
+  'tool-paths-anchor.png',
+  'tool-paths-anchor-x2.png',
+  'tool-paths-control.png',
+  'tool-paths-control-x2.png',
+  'tool-paths-segment.png',
+  'tool-paths-segment-x2.png',
+  'tool-paths.png',
+  'tool-paths-x2.png',
+  'tool-pencil.png',
+  'tool-pencil-x2.png',
+  'tool-perspective.png',
+  'tool-perspective-x2.png',
+  'tool-polygon-select.png',
+  'tool-polygon-select-x2.png',
+  'tool-rect-select.png',
+  'tool-rect-select-x2.png',
+  'tool-resize.png',
+  'tool-resize-x2.png',
+  'tool-rotate.png',
+  'tool-rotate-x2.png',
+  'tool-shear.png',
+  'tool-shear-x2.png',
+  'tool-smudge.png',
+  'tool-smudge-x2.png',
+  'tool-text.png',
+  'tool-text-x2.png',
+  'tool-warp.png',
+  'tool-warp-x2.png',
+  'tool-zoom.png',
+  'tool-zoom-x2.png',
+]
+
+color_picker_cursors = [
+  'cursor-color-picker.png',
+]
+
+cursors_resourcename = 'gimp-tool-cursors'
+cursors_xml_content  = '<?xml version="1.0" encoding="UTF-8"?>\n'
+cursors_xml_content += '<gresources>\n'
+cursors_xml_content += '  <gresource prefix="/org/gimp/tool-cursors">\n'
+foreach cursor : tool_cursors
+  cursors_xml_content+='    <file preprocess="to-pixdata">'+ cursor +'</file>\n'
+endforeach
+cursors_xml_content += '  </gresource>\n'
+cursors_xml_content += '</gresources>\n'
+
+cursors_xml_data = configuration_data()
+cursors_xml_data.set('DATA', cursors_xml_content)
+cursors_xml = configure_file(
+  input : 'dummy_file.xml',
+  output: cursors_resourcename + '.gresource.xml',
+  configuration: cursors_xml_data,
+)
+
+
+pickers_resourcename = 'gimp-color-picker-cursors'
+pickers_xml_content  = '<?xml version="1.0" encoding="UTF-8"?>\n'
+pickers_xml_content += '<gresources>\n'
+pickers_xml_content += '  <gresource prefix="/org/gimp/color-picker-cursors">\n'
+foreach cursor : color_picker_cursors
+  pickers_xml_content+='    <file preprocess="to-pixdata">'+ cursor +'</file>\n'
+endforeach
+pickers_xml_content += '  </gresource>\n'
+pickers_xml_content += '  <gresource prefix="/org/gimp/color-picker-cursors-raw">\n'
+foreach cursor : color_picker_cursors
+  pickers_xml_content+='    <file                        >'+ cursor +'</file>\n'
+endforeach
+pickers_xml_content += '  </gresource>\n'
+pickers_xml_content += '</gresources>\n'
+
+pickers_xml_data = configuration_data()
+pickers_xml_data.set('DATA', pickers_xml_content)
+pickers_xml = configure_file(
+  input : 'dummy_file.xml',
+  output: pickers_resourcename + '.gresource.xml',
+  configuration: pickers_xml_data,
+)
+
+cursors_sources = gnome.compile_resources(
+  cursors_resourcename,
+  cursors_xml,
+  c_name: cursors_resourcename.underscorify(),
+)
+
+pickers_sources = gnome.compile_resources(
+  pickers_resourcename,
+  pickers_xml,
+  c_name: pickers_resourcename.underscorify(),
+)
diff --git a/data/brushes/Basic/meson.build b/data/brushes/Basic/meson.build
new file mode 100644
index 0000000000..b32ed8d7e7
--- /dev/null
+++ b/data/brushes/Basic/meson.build
@@ -0,0 +1,12 @@
+brushes = files(
+  '1-pixel.vbr',
+  'Block-01.vbr',
+  'Block-02.vbr',
+  'Block-03.vbr',
+  'Hardness-025.vbr',
+  'Hardness-050.vbr',
+  'Hardness-075.vbr',
+  'Hardness-100.vbr',
+  'pixel.gbr',
+  'Star.vbr',
+)
diff --git a/data/brushes/Fun/meson.build b/data/brushes/Fun/meson.build
new file mode 100644
index 0000000000..f52fd85266
--- /dev/null
+++ b/data/brushes/Fun/meson.build
@@ -0,0 +1,5 @@
+brushes = files(
+  'GEGL-goat.gih',
+  'pepper.gbr',
+  'Wilber.gih',
+)
diff --git a/data/brushes/Legacy/meson.build b/data/brushes/Legacy/meson.build
new file mode 100644
index 0000000000..46a0bd4036
--- /dev/null
+++ b/data/brushes/Legacy/meson.build
@@ -0,0 +1,5 @@
+brushes = files(
+  'confetti.gbr',
+  'confetti.gih',
+  'vine.gih',
+)
diff --git a/data/brushes/Media/meson.build b/data/brushes/Media/meson.build
new file mode 100644
index 0000000000..33d62d9b64
--- /dev/null
+++ b/data/brushes/Media/meson.build
@@ -0,0 +1,13 @@
+brushes = files(
+  'Acrylic-01.gih',
+  'Acrylic-02.gih',
+  'Acrylic-03.gih',
+  'Acrylic-04.gih',
+  'Acrylic-05.gih',
+  'Bristles-01.gbr',
+  'Bristles-02.gbr',
+  'Bristles-03.gbr',
+  'Oils-01.gbr',
+  'Oils-02.gbr',
+  'Oils-03.gbr',
+)
diff --git a/data/brushes/Sketch/meson.build b/data/brushes/Sketch/meson.build
new file mode 100644
index 0000000000..39dfbb2f48
--- /dev/null
+++ b/data/brushes/Sketch/meson.build
@@ -0,0 +1,12 @@
+brushes = files(
+  'Chalk-01.gih',
+  'Chalk-02.gih',
+  'Chalk-03.gih',
+  'Charcoal-01.gbr',
+  'Charcoal-02.gbr',
+  'Charcoal-03.gih',
+  'Pencil-01.gih',
+  'Pencil-02.gih',
+  'Pencil-03.gih',
+  'Pencil-Scratch.gbr',
+)
diff --git a/data/brushes/Splatters/meson.build b/data/brushes/Splatters/meson.build
new file mode 100644
index 0000000000..d6f8b219c3
--- /dev/null
+++ b/data/brushes/Splatters/meson.build
@@ -0,0 +1,10 @@
+brushes = files(
+  'Grunge-01.gih',
+  'Sparks-Hose.gih',
+  'Splats-01.gih',
+  'Splats-02.gih',
+  'Sponge-01.gbr',
+  'Sponge-01.gbr',
+  'Sponge-02.gbr',
+  'Sponge-02.gbr',
+)
diff --git a/data/brushes/Texture/meson.build b/data/brushes/Texture/meson.build
new file mode 100644
index 0000000000..a1dea9765e
--- /dev/null
+++ b/data/brushes/Texture/meson.build
@@ -0,0 +1,15 @@
+brushes = files(
+  'Cell-01.gbr',
+  'Cell-02.gbr',
+  'Hatch-Pen-01.gbr',
+  'Smoke.gbr',
+  'Texture-01.gbr',
+  'Texture-02.gbr',
+  'Vegetation-01.gbr',
+  'Grass.gih',
+  'Stone-Work-01.gih',
+  'Texture-Hose-01.gih',
+  'Texture-Hose-02.gih',
+  'Texture-Hose-03.gih',
+  'Vegetation-02.gih',
+)
diff --git a/data/brushes/meson.build b/data/brushes/meson.build
new file mode 100644
index 0000000000..07cf63a364
--- /dev/null
+++ b/data/brushes/meson.build
@@ -0,0 +1,17 @@
+brushes_types = [
+  'Basic',
+  'Fun',
+  'Legacy',
+  'Media',
+  'Sketch',
+  'Splatters',
+  'Texture',
+]
+
+foreach brushes_type : brushes_types
+  subdir(brushes_type)
+  install_data(
+    brushes,
+    install_dir: gimpdatadir / 'brushes' / brushes_type,
+  )
+endforeach
diff --git a/data/dynamics/Basic/meson.build b/data/dynamics/Basic/meson.build
new file mode 100644
index 0000000000..a93e0f9438
--- /dev/null
+++ b/data/dynamics/Basic/meson.build
@@ -0,0 +1,10 @@
+dynamics = files(
+  'Basic-Simple.gdyn',
+  'Dynamics-Random.gdyn',
+  'Negative-Size-Pressure.gdyn',
+  'Pen-Generic.gdyn',
+  'Pencil-Generic.gdyn',
+  'Pencil-Shader.gdyn',
+  'Pressure-Opacity.gdyn',
+  'Pressure-Size.gdyn',
+)
diff --git a/data/dynamics/FX/meson.build b/data/dynamics/FX/meson.build
new file mode 100644
index 0000000000..9df99d25fa
--- /dev/null
+++ b/data/dynamics/FX/meson.build
@@ -0,0 +1,5 @@
+dynamics = files(
+  'Confetti.gdyn',
+  'Perspective.gdyn',
+  'Speed_Size_Opacity.gdyn',
+)
diff --git a/data/dynamics/meson.build b/data/dynamics/meson.build
new file mode 100644
index 0000000000..e12a7578e3
--- /dev/null
+++ b/data/dynamics/meson.build
@@ -0,0 +1,26 @@
+dynamics = files(
+  'Basic-Dynamics.gdyn',
+  'Color-From-Gradient.gdyn',
+  'Dynamics-Off.gdyn',
+  'Fade-Tapering.gdyn',
+  'Random-Color.gdyn',
+  'Tilt-Angle.gdyn',
+  'Track-Direction.gdyn',
+  'Velocity-Tapering.gdyn',
+)
+
+install_data(dynamics,
+  install_dir: gimpdatadir / 'dynamics',
+)
+
+dynamics_types = [
+  'Basic',
+  'FX',
+]
+foreach dynamics_type : dynamics_types
+  subdir(dynamics_type)
+  install_data(
+    dynamics,
+    install_dir: gimpdatadir / 'dynamics' / dynamics_type,
+  )
+endforeach
diff --git a/data/environ/meson.build b/data/environ/meson.build
new file mode 100644
index 0000000000..9829cb3e1e
--- /dev/null
+++ b/data/environ/meson.build
@@ -0,0 +1,5 @@
+install_data(
+  'default.env',
+  'python.env',
+  install_dir: gimpplugindir / 'environ',
+)
diff --git a/data/gradients/meson.build b/data/gradients/meson.build
new file mode 100644
index 0000000000..ad2a9b8502
--- /dev/null
+++ b/data/gradients/meson.build
@@ -0,0 +1,93 @@
+gradients = files(
+  'Abstract_1.ggr',
+  'Abstract_2.ggr',
+  'Abstract_3.ggr',
+  'Aneurism.ggr',
+  'Blinds.ggr',
+  'Blue_Green.ggr',
+  'Browns.ggr',
+  'Brushed_Aluminium.ggr',
+  'Burning_Paper.ggr',
+  'Burning_Transparency.ggr',
+  'Caribbean_Blues.ggr',
+  'CD_Half.ggr',
+  'CD.ggr',
+  'Coffee.ggr',
+  'Cold_Steel_2.ggr',
+  'Cold_Steel.ggr',
+  'Crown_molding.ggr',
+  'Dark_1.ggr',
+  'Deep_Sea.ggr',
+  'Default.ggr',
+  'Flare_Glow_Angular_1.ggr',
+  'Flare_Glow_Radial_1.ggr',
+  'Flare_Glow_Radial_2.ggr',
+  'Flare_Glow_Radial_3.ggr',
+  'Flare_Glow_Radial_4.ggr',
+  'Flare_Radial_101.ggr',
+  'Flare_Radial_102.ggr',
+  'Flare_Radial_103.ggr',
+  'Flare_Rays_Radial_1.ggr',
+  'Flare_Rays_Radial_2.ggr',
+  'Flare_Rays_Size_1.ggr',
+  'Flare_Sizefac_101.ggr',
+  'Four_bars.ggr',
+  'Full_saturation_spectrum_CCW.ggr',
+  'Full_saturation_spectrum_CW.ggr',
+  'Golden.ggr',
+  'Greens.ggr',
+  'Horizon_1.ggr',
+  'Horizon_2.ggr',
+  'Incandescent.ggr',
+  'Land_1.ggr',
+  'Land_and_Sea.ggr',
+  'Metallic_Something.ggr',
+  'Nauseating_Headache.ggr',
+  'Neon_Cyan.ggr',
+  'Neon_Green.ggr',
+  'Neon_Yellow.ggr',
+  'Pastel_Rainbow.ggr',
+  'Pastels.ggr',
+  'Purples.ggr',
+  'Radial_Eyeball_Blue.ggr',
+  'Radial_Eyeball_Brown.ggr',
+  'Radial_Eyeball_Green.ggr',
+  'Radial_Glow_1.ggr',
+  'Radial_Rainbow_Hoop.ggr',
+  'Rounded_edge.ggr',
+  'Shadows_1.ggr',
+  'Shadows_2.ggr',
+  'Shadows_3.ggr',
+  'Skyline_polluted.ggr',
+  'Skyline.ggr',
+  'Square_Wood_Frame.ggr',
+  'Sunrise.ggr',
+  'Three_bars_sin.ggr',
+  'Tropical_Colors.ggr',
+  'Tube_Red.ggr',
+  'Wood_1.ggr',
+  'Wood_2.ggr',
+  'Yellow_Contrast.ggr',
+  'Yellow_Orange.ggr',
+)
+
+
+gradients_obsolete = files(
+  'French_flag.ggr',
+  'French_flag_smooth.ggr',
+  'German_flag.ggr',
+  'German_flag_smooth.ggr',
+  'Mexican_flag.ggr',
+  'Mexican_flag_smooth.ggr',
+  'Romanian_flag.ggr',
+  'Romanian_flag_smooth.ggr',
+)
+
+install_data(
+  gradients,
+  install_dir: gimpdatadir / 'gradients',
+)
+install_data(
+  gradients_obsolete,
+  install_dir: gimpdatadir / 'gradients' / 'gimp-obsolete-files',
+)
diff --git a/data/images/meson.build b/data/images/meson.build
new file mode 100644
index 0000000000..7ecce25387
--- /dev/null
+++ b/data/images/meson.build
@@ -0,0 +1,11 @@
+
+images = [
+  'gimp-splash.png',
+  'wilber.png',
+]
+images += stable ? 'gimp-logo.png' : 'gimp-devel-logo.png'
+
+install_data(
+  images,
+  install_dir: gimpdatadir / 'images',
+)
diff --git a/data/interpreters/meson.build b/data/interpreters/meson.build
new file mode 100644
index 0000000000..b25636db33
--- /dev/null
+++ b/data/interpreters/meson.build
@@ -0,0 +1,3 @@
+install_data('default.interp',
+  install_dir: gimpplugindir / 'interpreters',
+)
diff --git a/data/meson.build b/data/meson.build
new file mode 100644
index 0000000000..b6472b70c7
--- /dev/null
+++ b/data/meson.build
@@ -0,0 +1,16 @@
+subdir('brushes')
+subdir('dynamics')
+subdir('environ')
+subdir('gradients')
+subdir('images')
+subdir('interpreters')
+subdir('palettes')
+subdir('patterns')
+subdir('tags')
+subdir('tips')
+subdir('tool-presets')
+
+
+meson.add_install_script('sh', '-c',
+  'mkdir -p $MESON_INSTALL_DESTDIR_PREFIX/@0@'.format(gimpdatadir / 'fonts')
+)
diff --git a/data/palettes/meson.build b/data/palettes/meson.build
new file mode 100644
index 0000000000..d5d1b467b6
--- /dev/null
+++ b/data/palettes/meson.build
@@ -0,0 +1,47 @@
+
+palettes = files(
+  'Bears.gpl',
+  'Bgold.gpl',
+  'Blues.gpl',
+  'Borders.gpl',
+  'Browns_And_Yellows.gpl',
+  'Caramel.gpl',
+  'Cascade.gpl',
+  'China.gpl',
+  'Coldfire.gpl',
+  'Cool_Colors.gpl',
+  'Cranes.gpl',
+  'Dark_pastels.gpl',
+  'Default.gpl',
+  'Ega.gpl',
+  'Firecode.gpl',
+  'Gold.gpl',
+  'Grayblue.gpl',
+  'Grays.gpl',
+  'GrayViolet.gpl',
+  'Greens.gpl',
+  'Hilite.gpl',
+  'Khaki.gpl',
+  'Lights.gpl',
+  'Muted.gpl',
+  'Named_Colors.gpl',
+  'News3.gpl',
+  'Op2.gpl',
+  'Paintjet.gpl',
+  'Pastels.gpl',
+  'Plasma.gpl',
+  'Reds_And_Purples.gpl',
+  'Reds.gpl',
+  'Royal.gpl',
+  'Tango.gpl',
+  'Topographic.gpl',
+  'Visibone_2.gpl',
+  'Visibone.gpl',
+  'Volcano.gpl',
+  'Warm_Colors.gpl',
+  'Web.gpl',
+)
+
+install_data(palettes,
+  install_dir: gimpdatadir / 'palettes',
+)
diff --git a/data/patterns/Animal/meson.build b/data/patterns/Animal/meson.build
new file mode 100644
index 0000000000..d981aa9382
--- /dev/null
+++ b/data/patterns/Animal/meson.build
@@ -0,0 +1,4 @@
+patterns = files(
+  'leather.pat',
+  'leopard.pat',
+)
diff --git a/data/patterns/Fabric/meson.build b/data/patterns/Fabric/meson.build
new file mode 100644
index 0000000000..61e015f54d
--- /dev/null
+++ b/data/patterns/Fabric/meson.build
@@ -0,0 +1,3 @@
+patterns = files(
+  'burlap.pat',
+)
diff --git a/data/patterns/Food/meson.build b/data/patterns/Food/meson.build
new file mode 100644
index 0000000000..fc15d00988
--- /dev/null
+++ b/data/patterns/Food/meson.build
@@ -0,0 +1,4 @@
+patterns = files(
+  'choc_swirl.pat',
+  'java.pat',
+)
diff --git a/data/patterns/Legacy/meson.build b/data/patterns/Legacy/meson.build
new file mode 100644
index 0000000000..d275602389
--- /dev/null
+++ b/data/patterns/Legacy/meson.build
@@ -0,0 +1,17 @@
+patterns = files(
+  '3dgreen.pat',
+  'blue.pat',
+  'bluegrid.pat',
+  'bluesquares.pat',
+  'blueweb.pat',
+  'fibers.pat',
+  'nops.pat',
+  'pastel.pat',
+  'qube1.pat',
+  'recessed.pat',
+  'redcube.pat',
+  'sm_squares.pat',
+  'Stripes1px.pat',
+  'Stripes2px.pat',
+  'warning.pat',
+)
diff --git a/data/patterns/Paper/meson.build b/data/patterns/Paper/meson.build
new file mode 100644
index 0000000000..f4ac28b000
--- /dev/null
+++ b/data/patterns/Paper/meson.build
@@ -0,0 +1,4 @@
+patterns = files(
+  'crinklepaper.pat',
+  'paper.pat',
+)
diff --git a/data/patterns/Plant/meson.build b/data/patterns/Plant/meson.build
new file mode 100644
index 0000000000..bd6df9d10b
--- /dev/null
+++ b/data/patterns/Plant/meson.build
@@ -0,0 +1,3 @@
+patterns = files(
+  'leaves.pat',
+)
diff --git a/data/patterns/Sky/meson.build b/data/patterns/Sky/meson.build
new file mode 100644
index 0000000000..51fe53551f
--- /dev/null
+++ b/data/patterns/Sky/meson.build
@@ -0,0 +1,5 @@
+patterns = files(
+  'lightning.pat',
+  'sky.pat',
+  'starfield.pat',
+)
diff --git a/data/patterns/Stone/meson.build b/data/patterns/Stone/meson.build
new file mode 100644
index 0000000000..482349d3ca
--- /dev/null
+++ b/data/patterns/Stone/meson.build
@@ -0,0 +1,17 @@
+patterns = files(
+  'amethyst.pat',
+  'brick.pat',
+  'cracked.pat',
+  'Craters.pat',
+  'granite1.pat',
+  'ground1.pat',
+  'marble1.pat',
+  'marble2.pat',
+  'marble3.pat',
+  'Moonfoot.pat',
+  'pink_marble.pat',
+  'rock.pat',
+  'slate.pat',
+  'stone33.pat',
+  'terra.pat',
+)
diff --git a/data/patterns/Water/meson.build b/data/patterns/Water/meson.build
new file mode 100644
index 0000000000..b67c9fd9d1
--- /dev/null
+++ b/data/patterns/Water/meson.build
@@ -0,0 +1,6 @@
+patterns = files(
+  'electric.pat',
+  'ice.pat',
+  'pool.pat',
+  'rain.pat',
+)
diff --git a/data/patterns/Wood/meson.build b/data/patterns/Wood/meson.build
new file mode 100644
index 0000000000..03625f5fe9
--- /dev/null
+++ b/data/patterns/Wood/meson.build
@@ -0,0 +1,15 @@
+patterns = files(
+  'bark.pat',
+  'burlwood.pat',
+  'corkboard.pat',
+  'parque1.pat',
+  'parque2.pat',
+  'parque3.pat',
+  'pine.pat',
+  'walnut.pat',
+  'wood1.pat',
+  'wood2.pat',
+  'wood3.pat',
+  'wood4.pat',
+  'wood5.pat',
+)
diff --git a/data/patterns/meson.build b/data/patterns/meson.build
new file mode 100644
index 0000000000..1bfec359c3
--- /dev/null
+++ b/data/patterns/meson.build
@@ -0,0 +1,20 @@
+patterns_types = [
+  'Animal',
+  'Fabric',
+  'Food',
+  'Legacy',
+  'Paper',
+  'Plant',
+  'Sky',
+  'Stone',
+  'Water',
+  'Wood',
+]
+
+foreach patterns_type : patterns_types
+  subdir(patterns_type)
+  install_data(
+    patterns,
+    install_dir: gimpdatadir / 'patterns' / patterns_type,
+  )
+endforeach
diff --git a/data/tags/meson.build b/data/tags/meson.build
new file mode 100644
index 0000000000..ea57a16c16
--- /dev/null
+++ b/data/tags/meson.build
@@ -0,0 +1,30 @@
+
+xmlfilename = 'gimp-tags-default.xml'
+
+gimp_tags_default = custom_target(xmlfilename,
+  input : xmlfilename+'.in',
+  output: xmlfilename,
+
+  command: [
+    intltool_merge,
+    potags_dir,
+    '@INPUT@',
+    '@OUTPUT@',
+    '--xml-style',
+    '--utf8',
+    '--cache=' + '@OUTDIR@' / 'intltool-merge-cache',
+  ],
+  install: true,
+  install_dir: gimpdatadir / 'tags',
+)
+
+if xmllint.found()
+  run_target('validate-tags',
+    command: [
+      xmllint,
+      '--noout',
+      '--path', meson.current_source_dir(),
+      '--valid', gimp_tags_default,
+    ],
+  )
+endif
diff --git a/data/tips/meson.build b/data/tips/meson.build
new file mode 100644
index 0000000000..526a70b36e
--- /dev/null
+++ b/data/tips/meson.build
@@ -0,0 +1,43 @@
+
+xmlfilename = 'gimp-tips.xml'
+
+gimp_tips = custom_target(xmlfilename,
+  input : xmlfilename+'.in',
+  output: xmlfilename,
+
+  command: [
+    intltool_merge,
+    potips_dir,
+    '@INPUT@',
+    '@OUTPUT@',
+    '--xml-style',
+    '--utf8',
+    '--cache=' + '@OUTDIR@' / 'intltool-merge-cache',
+  ],
+  install: true,
+  install_dir: gimpdatadir / 'tips',
+)
+
+fortunes_tips = custom_target('fortunes-tips',
+  input : [ gimp_tips, 'fortunes.xsl', ],
+  output: 'fortunes-tips',
+  command: [
+    xsltproc,
+    '--stringparam', 'lang', 'en',
+    '--path', meson.current_source_dir(),
+    '--output', '@OUTPUT@',
+    '@INPUT1@',
+    '@INPUT0@',
+  ],
+)
+
+if xmllint.found()
+  run_target('validate-tips',
+    command: [
+      xmllint,
+      '--noout',
+      '--path', meson.current_source_dir(),
+      '--valid', gimp_tips,
+    ],
+  )
+endif
diff --git a/data/tool-presets/Crop/meson.build b/data/tool-presets/Crop/meson.build
new file mode 100644
index 0000000000..048c830143
--- /dev/null
+++ b/data/tool-presets/Crop/meson.build
@@ -0,0 +1,9 @@
+tool_presets = files(
+  '16_10.gtp',
+  '16_9.gtp',
+  '3_2-Landscape.gtp',
+  '3_2-Portrait.gtp',
+  '4_3-Landscape.gtp',
+  '4_3-Portrait.gtp',
+  'Square.gtp',
+)
diff --git a/data/tool-presets/FX/meson.build b/data/tool-presets/FX/meson.build
new file mode 100644
index 0000000000..5486c74844
--- /dev/null
+++ b/data/tool-presets/FX/meson.build
@@ -0,0 +1,10 @@
+tool_presets = files(
+  'Crop-16-9.gtp',
+  'Crop-Composition.gtp',
+  'Fill-Paper.gtp',
+  'FX-Confetti.gtp',
+  'FX-Radial-Softlight.gtp',
+  'Glow-Lights.gtp',
+  'Smooth-Clone.gtp',
+  'Vignette.gtp',
+)
diff --git a/data/tool-presets/Paint/meson.build b/data/tool-presets/Paint/meson.build
new file mode 100644
index 0000000000..48df7a1e1f
--- /dev/null
+++ b/data/tool-presets/Paint/meson.build
@@ -0,0 +1,18 @@
+tool_presets = files(
+  'Airbrush-Color-From-Gradient.gtp',
+  'Airbrush.gtp',
+  'Basic-Knife.gtp',
+  'Basic-Round-Detail.gtp',
+  'Basic-Round.gtp',
+  'Bristles.gtp',
+  'Eraser-Hard.gtp',
+  'Noise.gtp',
+  'Paintbrush-Color-From-Gradient.gtp',
+  'Pencil-Color-From-Gradient.gtp',
+  'Smudge-Rough.gtp',
+  'Smudge-Soft.gtp',
+  'Soft-Oil.gtp',
+  'Splatters.gtp',
+  'Structure.gtp',
+  'Vegetal.gtp',
+)
diff --git a/data/tool-presets/Selection/meson.build b/data/tool-presets/Selection/meson.build
new file mode 100644
index 0000000000..39ba55b245
--- /dev/null
+++ b/data/tool-presets/Selection/meson.build
@@ -0,0 +1,4 @@
+tool_presets = files(
+  'Circle-200px.gtp',
+  'Feathered-Selection.gtp',
+)
diff --git a/data/tool-presets/Sketch/meson.build b/data/tool-presets/Sketch/meson.build
new file mode 100644
index 0000000000..71127e50b5
--- /dev/null
+++ b/data/tool-presets/Sketch/meson.build
@@ -0,0 +1,8 @@
+tool_presets = files(
+  'Blue-Pen.gtp',
+  'Eraser-Soft.gtp',
+  'Ink-Smooth.gtp',
+  'Ink-Thin.gtp',
+  'Pencil-Soft.gtp',
+  'Pencil.gtp',
+)
diff --git a/data/tool-presets/meson.build b/data/tool-presets/meson.build
new file mode 100644
index 0000000000..38cf9f75d5
--- /dev/null
+++ b/data/tool-presets/meson.build
@@ -0,0 +1,15 @@
+tool_presets_types = [
+  'Crop',
+  'FX',
+  'Paint',
+  'Selection',
+  'Sketch',
+]
+
+foreach tool_presets_type : tool_presets_types
+  subdir(tool_presets_type)
+  install_data(
+    tool_presets,
+    install_dir: gimpdatadir / 'tool-presets' / tool_presets_type,
+  )
+endforeach
diff --git a/desktop/meson.build b/desktop/meson.build
new file mode 100644
index 0000000000..2b34ad7d59
--- /dev/null
+++ b/desktop/meson.build
@@ -0,0 +1,125 @@
+sizes = [
+  '16',
+  '22',
+  '24',
+  '32',
+  '48',
+  '64',
+  '256',
+]
+
+foreach size : sizes
+  sizedir = size+'x'+size
+  install_data(sizedir / 'gimp.png',
+    install_dir: get_option('datadir') / 'icons' / 'hicolor' / sizedir / 'apps'
+  )
+endforeach
+
+desktopfilename = 'gimp.desktop'
+
+desktop_conf = configuration_data()
+desktop_conf.set('GIMP_COMMAND',      gimp_command)
+desktop_conf.set('GIMP_VERSION',      gimp_version)
+desktop_conf.set('GIMP_APP_VERSION',  gimp_app_version)
+desktop_conf.set('MIME_TYPES',        ';'.join(MIMEtypes))
+desktop_conf.set('BUG_REPORT_URL',    bug_report_url)
+
+desktopfilein = configure_file(
+  input : desktopfilename+'.in.in',
+  output: desktopfilename+'.in',
+  configuration: desktop_conf,
+)
+
+desktopfile = custom_target(desktopfilename,
+  input : [ desktopfilein, ],
+  output: [ desktopfilename, ],
+  command: [
+    intltool_merge,
+    po_dir,
+    '@INPUT@',
+    '@OUTPUT@',
+    '--desktop-style',
+    '--utf8',
+    '--cache=' + '@OUTDIR@' / 'intltool-merge-cache',
+  ],
+  install: true,
+  install_dir: get_option('datadir') / 'applications',
+)
+
+appdatafilename = 'org.gimp.GIMP.appdata.xml'
+appdatafilein = configure_file(
+  input : appdatafilename+'.in.in',
+  output: appdatafilename+'.in',
+  configuration: desktop_conf,
+)
+appdatafile = custom_target(appdatafilename,
+  input : [ appdatafilein, ],
+  output: [ appdatafilename, ],
+  command: [
+    intltool_merge,
+    po_dir,
+    '@INPUT@',
+    '@OUTPUT@',
+    '--xml-style',
+    '--utf8',
+    '--cache=' + '@OUTDIR@' / 'intltool-merge-cache',
+  ],
+  install: true,
+  install_dir: get_option('datadir') / 'metainfo',
+)
+
+metainfofilename = 'gimp-data-extras.metainfo.xml'
+metainfofilein = configure_file(
+  input : metainfofilename+'.in.in',
+  output: metainfofilename+'.in',
+  configuration: desktop_conf,
+)
+metainfofile = custom_target(metainfofilename,
+  input : [ metainfofilein, ],
+  output: [ metainfofilename, ],
+  command: [
+    intltool_merge,
+    po_dir,
+    '@INPUT@',
+    '@OUTPUT@',
+    '--xml-style',
+    '--utf8',
+    '--cache=' + '@OUTDIR@' / 'intltool-merge-cache',
+  ],
+  install: true,
+  install_dir: get_option('datadir') / 'appdata',
+)
+
+if desktop_validate.found()
+  run_target('validate-desktop',
+    command: [ desktop_validate, desktopfile ],
+  )
+endif
+
+if appstream_util.found()
+  test('appdata_file',
+    appstream_util,
+    args: [ 'validate-relax', appdatafile ],
+    env: [
+      'GIMP_TESTING_ABS_TOP_BUILDDIR=' + meson.build_root(),
+    ],
+    suite: 'desktop',
+  )
+
+  test('metainfo_file',
+    appstream_util,
+    args: [ 'validate-relax', metainfofile ],
+    env: [
+      'GIMP_TESTING_ABS_TOP_BUILDDIR=' + meson.build_root(),
+    ],
+    suite: 'desktop',
+  )
+
+  test('desktop_file',
+    find_program('test-desktop.sh'),
+    env: [
+      'GIMP_TESTING_ABS_TOP_BUILDDIR=' + meson.build_root(),
+    ],
+    suite: 'desktop',
+  )
+endif
diff --git a/devel-docs/app/meson.build b/devel-docs/app/meson.build
new file mode 100644
index 0000000000..c250b6519d
--- /dev/null
+++ b/devel-docs/app/meson.build
@@ -0,0 +1,98 @@
+module_name = 'app'
+
+app_libs = shared_library('app',
+  include_directories: [ rootInclude, rootAppInclude, configInclude, ],
+
+  link_whole: [
+
+    libappconfig,
+    libappcore,
+    libappfile,
+    libappfiledata,
+    libappgegl,
+    libappinternalprocs,
+    libapplayermodes,
+    libapplayermodeslegacy,
+    libappoperations,
+    libapppaint,
+    libapppdb,
+    libappplugin,
+    libapptext,
+    libappvectors,
+    libappxcf,
+
+    libappactions,
+    libappdialogs,
+    libappdisplay,
+    libappgui,
+    libappmenus,
+    libapppropgui,
+    libapptools,
+    libappwidgets,
+  ],
+
+  link_with: [
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpmodule,
+    libgimpthumb,
+    libgimpwidgets,
+  ],
+  dependencies: [
+    gegl, gdk_pixbuf, gtk3,
+  ],
+)
+
+
+gnome.gtkdoc(module_name,
+  main_sgml: module_name + '-docs.sgml',
+  gobject_typesfile: files(module_name + '.types'),
+  src_dir: meson.source_root() / 'app',
+
+  content_files: [],
+  ignore_headers: [
+    'gimp-intl.h',
+    'gimpdbusservice-glue.h',
+    'gimphelp-ids.h',
+    'gimpimage-convert-data.h',
+    'gimpimage-convert-fsdither.h',
+    'gimprc-blurbs.h',
+  ],
+
+  dependencies: [
+    fontconfig, freetype2, gtk3, harfbuzz, pangocairo,
+    gegl,
+    declare_dependency(
+      include_directories: rootInclude,
+      link_with: [
+      app_libs,
+
+      libgimpbase,
+      libgimpcolor,
+      libgimpconfig,
+      libgimpmath,
+      libgimpmodule,
+      libgimpthumb,
+      libgimpwidgets,
+    ])
+  ],
+
+  scan_args: scan_args_common,
+  mkdb_args: mkdb_args_common,
+  c_args: [
+    '-UGTK_DISABLE_SINGLE_INCLUDES',
+    '-fdiagnostics-color=always',
+  ],
+
+  fixxref_args:  [
+    '--extra-dir=' + devel_docs_build_root / 'libgimpbase'    / 'html',
+    '--extra-dir=' + devel_docs_build_root / 'libgimpcolor'   / 'html',
+    '--extra-dir=' + devel_docs_build_root / 'libgimpconfig'  / 'html',
+    '--extra-dir=' + devel_docs_build_root / 'libgimpmath'    / 'html',
+    '--extra-dir=' + devel_docs_build_root / 'libgimpwidgets' / 'html',
+  ],
+
+  install: true,
+)
diff --git a/devel-docs/libgimp/meson.build b/devel-docs/libgimp/meson.build
new file mode 100644
index 0000000000..50738ebc24
--- /dev/null
+++ b/devel-docs/libgimp/meson.build
@@ -0,0 +1,49 @@
+module_name = 'libgimp3'
+
+
+gnome.gtkdoc(module_name,
+  main_sgml: module_name + '-docs.sgml',
+  gobject_typesfile: files(module_name + '.types'),
+  src_dir: meson.source_root() / 'libgimp',
+
+  ignore_headers: [
+    'gimp-debug.h',
+    'gimp-private.h',
+    'gimp-shm.h',
+    'gimppdb-private.h',
+    'gimppdbprocedure.h',
+    'gimptilebackendplugin.h',
+    'gimpunit_pdb.h',
+    'gimpunitcache.h',
+    'libgimp-intl.h',
+    'stdplugins-intl.h',
+  ],
+
+  dependencies: [
+    fontconfig, freetype2, gtk3, harfbuzz, pangocairo,
+    declare_dependency(
+      include_directories: rootInclude,
+      link_with: [
+        libgimp,
+        libgimpui,
+        libgimpbase,
+        libgimpcolor,
+        libgimpconfig,
+        libgimpmath,
+        libgimpui,
+        libgimpwidgets,
+      ]
+    )
+  ],
+
+  scan_args: scan_args_common,
+  mkdb_args: mkdb_args_common,
+
+  fixxref_args:  [
+    '--extra-dir='+ devel_docs_build_root / 'libgimpbase'    / 'html',
+    '--extra-dir='+ devel_docs_build_root / 'libgimpcolor'   / 'html',
+    '--extra-dir='+ devel_docs_build_root / 'libgimpconfig'  / 'html',
+    '--extra-dir='+ devel_docs_build_root / 'libgimpmath'    / 'html',
+    '--extra-dir='+ devel_docs_build_root / 'libgimpwidgets' / 'html',
+  ],
+)
diff --git a/devel-docs/libgimpbase/meson.build b/devel-docs/libgimpbase/meson.build
new file mode 100644
index 0000000000..1b1a7232ae
--- /dev/null
+++ b/devel-docs/libgimpbase/meson.build
@@ -0,0 +1,39 @@
+module_name = 'libgimpbase3'
+
+
+gnome.gtkdoc(module_name,
+  main_sgml: module_name + '-docs.sgml',
+
+  gobject_typesfile: files(module_name + '.types'),
+
+  src_dir: meson.source_root() / 'libgimpbase',
+
+  content_files: [
+  ],
+  ignore_headers: [
+    'gimpbase-private.h',
+    'gimpbase.h',
+    'gimpcompatenums.h',
+    'gimpprotocol.h',
+    'gimpreloc.h',
+    'gimpwin32-io.h',
+    'gimpwire.h',
+  ],
+
+  dependencies: [
+    fontconfig, freetype2, gtk3, harfbuzz, pangocairo,
+    declare_dependency(link_with: [
+      libgimpbase,
+    ]),
+  ],
+  scanobjs_args: [
+  ],
+  scan_args: scan_args_common,
+  mkdb_args: mkdb_args_common,
+  fixxref_args:  [
+  ],
+  html_assets: [
+  ],
+  html_args: [
+  ],
+)
diff --git a/devel-docs/libgimpcolor/meson.build b/devel-docs/libgimpcolor/meson.build
new file mode 100644
index 0000000000..24a11660e9
--- /dev/null
+++ b/devel-docs/libgimpcolor/meson.build
@@ -0,0 +1,21 @@
+module_name = 'libgimpcolor3'
+
+
+gnome.gtkdoc(module_name,
+  main_sgml: module_name + '-docs.sgml',
+  gobject_typesfile: files(module_name + '.types'),
+  src_dir: meson.source_root() / 'libgimpcolor',
+
+  ignore_headers: [
+  ],
+
+  dependencies: [
+    fontconfig, freetype2, gtk3, harfbuzz, pangocairo,
+    declare_dependency(link_with: [
+      libgimpbase,
+      libgimpcolor,
+    ]),
+  ],
+  scan_args: scan_args_common,
+  mkdb_args: mkdb_args_common,
+)
diff --git a/devel-docs/libgimpconfig/meson.build b/devel-docs/libgimpconfig/meson.build
new file mode 100644
index 0000000000..13316d1161
--- /dev/null
+++ b/devel-docs/libgimpconfig/meson.build
@@ -0,0 +1,30 @@
+module_name = 'libgimpconfig3'
+
+
+gnome.gtkdoc(module_name,
+  main_sgml: module_name + '-docs.sgml',
+  gobject_typesfile: files(module_name + '.types'),
+  src_dir: meson.source_root() / 'libgimpconfig',
+
+  ignore_headers: [
+  ],
+
+  dependencies: [
+    fontconfig, freetype2, gtk3, harfbuzz, pangocairo,
+    declare_dependency(
+      include_directories: rootInclude,
+      link_with: [
+      libgimpbase,
+      libgimpcolor,
+      libgimpmath,
+      libgimpconfig,
+    ]),
+  ],
+  scan_args: scan_args_common,
+  mkdb_args: mkdb_args_common,
+  fixxref_args:  [
+    '--extra-dir='+ devel_docs_build_root / 'libgimpbase'  / 'html',
+    '--extra-dir='+ devel_docs_build_root / 'libgimpcolor' / 'html',
+    '--extra-dir='+ devel_docs_build_root / 'libgimpmath'  / 'html',
+  ],
+)
diff --git a/devel-docs/libgimpmath/meson.build b/devel-docs/libgimpmath/meson.build
new file mode 100644
index 0000000000..bf838c084a
--- /dev/null
+++ b/devel-docs/libgimpmath/meson.build
@@ -0,0 +1,14 @@
+module_name = 'libgimpmath3'
+
+
+gnome.gtkdoc(module_name,
+  main_sgml: module_name + '-docs.sgml',
+  gobject_typesfile: files(module_name + '.types'),
+  src_dir: meson.source_root() / 'libgimpmath',
+
+  dependencies: [
+    fontconfig, freetype2, gtk3, harfbuzz, pangocairo,
+  ],
+  scan_args: scan_args_common,
+  mkdb_args: mkdb_args_common,
+)
diff --git a/devel-docs/libgimpmodule/meson.build b/devel-docs/libgimpmodule/meson.build
new file mode 100644
index 0000000000..64ec711983
--- /dev/null
+++ b/devel-docs/libgimpmodule/meson.build
@@ -0,0 +1,23 @@
+module_name = 'libgimpmodule3'
+
+
+gnome.gtkdoc(module_name,
+  main_sgml: module_name + '-docs.sgml',
+  gobject_typesfile: files(module_name + '.types'),
+  src_dir: meson.source_root() / 'libgimpmodule',
+
+  dependencies: [
+    fontconfig, freetype2, gtk3, harfbuzz, pangocairo,
+    declare_dependency(
+      include_directories: rootInclude,
+      link_with: [
+        libgimpmodule,
+      ],
+    )
+  ],
+
+  scan_args: scan_args_common + [
+    '--deprecated-guards="GIMP_DISABLE_DEPRECATED"'
+  ],
+  mkdb_args: mkdb_args_common,
+)
diff --git a/devel-docs/libgimpthumb/meson.build b/devel-docs/libgimpthumb/meson.build
new file mode 100644
index 0000000000..f38545da9a
--- /dev/null
+++ b/devel-docs/libgimpthumb/meson.build
@@ -0,0 +1,28 @@
+module_name = 'libgimpthumb3'
+
+
+gnome.gtkdoc(module_name,
+  main_sgml: module_name + '-docs.sgml',
+  gobject_typesfile: files(module_name + '.types'),
+  src_dir:  meson.source_root() / 'libgimpthumb',
+
+  ignore_headers: [
+    'libgimpthumb.h',
+  ],
+
+  dependencies: [
+    fontconfig, freetype2, gtk3, harfbuzz, pangocairo,
+    declare_dependency(
+    include_directories: rootInclude,
+    link_with: [
+      libgimpmath,
+      libgimpthumb,
+    ]),
+  ],
+
+  scan_args: scan_args_common,
+  mkdb_args: mkdb_args_common,
+  fixxref_args:  [
+    '--extra-dir='+ devel_docs_build_root / 'libgimpmath' / 'html',
+  ],
+)
diff --git a/devel-docs/libgimpwidgets/meson.build b/devel-docs/libgimpwidgets/meson.build
new file mode 100644
index 0000000000..213dccaabd
--- /dev/null
+++ b/devel-docs/libgimpwidgets/meson.build
@@ -0,0 +1,81 @@
+module_name = 'libgimpwidgets3'
+
+
+gnome.gtkdoc(module_name,
+  main_sgml: module_name + '-docs.sgml',
+  gobject_typesfile: files(module_name + '.types'),
+  src_dir: meson.source_root() / 'libgimpwidgets',
+
+  content_files: [
+    'visual-index.xml'
+  ],
+  ignore_headers: [
+    'gimp-color-picker-cursors.h',
+    'gimp-icon-pixbufs.h',
+    'gimpcolorprofilestore-private.h',
+    'gimpeevl.h',
+    'gimpwidgets-private.h',
+  ],
+
+  dependencies: [
+    fontconfig, freetype2, gtk3, harfbuzz, pangocairo,
+    declare_dependency(
+      include_directories: rootInclude,
+      link_with: [
+      libgimpbase,
+      libgimpcolor,
+      libgimpmath,
+      libgimpconfig,
+      libgimpwidgets,
+    ]),
+  ],
+  scanobjs_args: [
+    '--type-init-func=do { void babl_init (void); babl_init (); } while (0)',
+  ],
+  c_args: [
+    '-DGIMP_ENABLE_CONTROLLER_UNDER_CONSTRUCTION',
+    '-UGIMP_DISABLE_DEPRECATED',
+  ],
+  scan_args: scan_args_common,
+  mkdb_args: mkdb_args_common,
+  fixxref_args:  [
+    '--extra-dir='+ devel_docs_build_root / 'libgimp'       / 'html',
+    '--extra-dir='+ devel_docs_build_root / 'libgimpbase'   / 'html',
+    '--extra-dir='+ devel_docs_build_root / 'libgimpcolor'  / 'html',
+    '--extra-dir='+ devel_docs_build_root / 'libgimpconfig' / 'html',
+    '--extra-dir='+ devel_docs_build_root / 'libgimpmath'   / 'html',
+  ],
+  html_assets: [
+    'images' / 'gimp-widget-browser.png',
+    'images' / 'gimp-widget-busy-box.png',
+    'images' / 'gimp-widget-button.png',
+    'images' / 'gimp-widget-chain-button.png',
+    'images' / 'gimp-widget-color-area.png',
+    'images' / 'gimp-widget-color-button.png',
+    'images' / 'gimp-widget-color-hex-entry.png',
+    'images' / 'gimp-widget-color-notebook.png',
+    'images' / 'gimp-widget-color-profile-combo-box.png',
+    'images' / 'gimp-widget-color-profile-view.png',
+    'images' / 'gimp-widget-color-scale.png',
+    'images' / 'gimp-widget-color-scales.png',
+    'images' / 'gimp-widget-color-select.png',
+    'images' / 'gimp-widget-color-selection.png',
+    'images' / 'gimp-widget-dialog.png',
+    'images' / 'gimp-widget-enum-combo-box.png',
+    'images' / 'gimp-widget-enum-label.png',
+    'images' / 'gimp-widget-file-entry.png',
+    'images' / 'gimp-widget-frame.png',
+    'images' / 'gimp-widget-hint-box.png',
+    'images' / 'gimp-widget-int-combo-box.png',
+    'images' / 'gimp-widget-memsize-entry.png',
+    'images' / 'gimp-widget-number-pair-entry.png',
+    'images' / 'gimp-widget-offset-area.png',
+    'images' / 'gimp-widget-page-selector.png',
+    'images' / 'gimp-widget-path-editor.png',
+    'images' / 'gimp-widget-pick-button.png',
+    'images' / 'gimp-widget-preview-area.png',
+    'images' / 'gimp-widget-ruler.png',
+    'images' / 'gimp-widget-string-combo-box.png',
+    'images' / 'gimp-widget-unit-combo-box.png',
+  ],
+)
diff --git a/devel-docs/meson.build b/devel-docs/meson.build
new file mode 100644
index 0000000000..1cf1b94b39
--- /dev/null
+++ b/devel-docs/meson.build
@@ -0,0 +1,32 @@
+devel_docs_build_root = meson.current_build_dir()
+
+version_data = configuration_data()
+version_data.set('GIMP_VERSION', gimp_version)
+configure_file(
+  input : 'version.in',
+  output: 'version',
+  configuration: version_data,
+)
+
+scan_args_common = [
+  '--deprecated-guards=GIMP_DISABLE_DEPRECATED',
+]
+
+mkdb_args_common = [
+  '--name-space=gimp',
+]
+
+
+if get_option('gtk-doc-app')
+  subdir('app')
+endif
+
+subdir('libgimp')
+subdir('libgimpbase')
+subdir('libgimpcolor')
+subdir('libgimpconfig')
+subdir('libgimpmath')
+subdir('libgimpmodule')
+subdir('libgimpthumb')
+subdir('libgimpwidgets')
+subdir('tools')
diff --git a/devel-docs/tools/meson.build b/devel-docs/tools/meson.build
new file mode 100644
index 0000000000..a4b8211081
--- /dev/null
+++ b/devel-docs/tools/meson.build
@@ -0,0 +1,28 @@
+if have_doc_shooter
+
+doc_shooter_sources = [
+  'shadow.c',
+  'shooter.c',
+  'units.c',
+  'widgets.c',
+]
+
+doc_shooter = executable('doc-shooter',
+  doc_shooter_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gdk_pixbuf, gegl, fontconfig, math,
+  ],
+  c_args: '-DTOP_SRCDIR="@0@"'.format(meson.source_root()),
+  link_with: [
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpmodule,
+    libgimpwidgets,
+  ],
+  install: false,
+)
+
+endif
diff --git a/docs/meson.build b/docs/meson.build
new file mode 100644
index 0000000000..4666d3b951
--- /dev/null
+++ b/docs/meson.build
@@ -0,0 +1,63 @@
+
+# Configure_file is just here to rename the files
+manconf = configuration_data()
+manconf.set('GIMP_VERSION',   gimp_version)
+manconf.set('gimpdatadir',    prefix / gimpdatadir)
+manconf.set('gimplocaledir',  prefix / localedir)
+manconf.set('gimpplugindir',  prefix / gimpplugindir)
+manconf.set('manpage_gimpdir', '$XDG_CONFIG_HOME/' + gimpdir / gimp_app_version)
+manconf.set('gimpsysconfdir', prefix / gimpsysconfdir)
+manconf.set('mypaint_brushes_dir', libmypaint_brushes_dir)
+
+
+man_files = [
+  configure_file(
+    input : 'gimptool.1.in',
+    output: 'gimptool-' + gimp_app_version + '.1',
+    configuration: manconf,
+  ),
+  configure_file(
+    input : 'gimptool.1.in',
+    output: 'gimptool.1',
+    configuration: manconf,
+  ),
+
+  configure_file(
+    input : 'gimprc.5.in',
+    output: 'gimprc-' + gimp_app_version + '.5',
+    configuration: manconf,
+  ),
+  configure_file(
+    input : 'gimprc.5.in',
+    output: 'gimprc.5',
+    configuration: manconf,
+  ),
+]
+
+if enable_console_bin
+  man_files += configure_file(
+    input : 'gimp.1.in',
+    output: 'gimp-console-' + gimp_app_version + '.1',
+    configuration: manconf,
+  )
+  man_files += configure_file(
+    input : 'gimp.1.in',
+    output: 'gimp-console.1',
+    configuration: manconf,
+  )
+endif
+
+if enable_default_bin
+  man_files +=  configure_file(
+    input : 'gimp.1.in',
+    output: 'gimp-' + gimp_app_version + '.1',
+    configuration: manconf,
+  )
+  man_files +=  configure_file(
+    input : 'gimp.1.in',
+    output: 'gimp.1',
+    configuration: manconf,
+  )
+endif
+
+install_man(man_files)
diff --git a/etc/meson.build b/etc/meson.build
new file mode 100644
index 0000000000..4d2aa14241
--- /dev/null
+++ b/etc/meson.build
@@ -0,0 +1,20 @@
+etcconf = configuration_data()
+etcconf.set('mypaint_brushes_dir', libmypaint_brushes_dir)
+
+
+install_data(
+  [
+    'controllerrc',
+    configure_file(
+      input : 'gimprc.in',
+      output: 'gimprc',
+      configuration: etcconf,
+    ),
+    'gimp.css',
+    'menurc',
+    'sessionrc',
+    'templaterc',
+    'unitrc',
+  ],
+  install_dir: gimpsysconfdir,
+)
diff --git a/icons/Color/meson.build b/icons/Color/meson.build
new file mode 100644
index 0000000000..bd96ec5f15
--- /dev/null
+++ b/icons/Color/meson.build
@@ -0,0 +1,84 @@
+
+if have_vector_icons
+  all_icons = [
+    [ 'scalable', color_vector_scalable ],
+    [ '24x24',    color_vector_24 ],
+    [ '64x64',    bitmap_64system ],
+  ]
+else
+  all_icons = [
+    [ '12x12',    bitmap_12 ],
+    [ '16x16',    bitmap_16 ],
+    [ '18x18',    bitmap_18 ],
+    [ '20x20',    bitmap_20 ],
+    [ '22x22',    bitmap_22 ],
+    [ '24x24',    bitmap_24 ],
+    [ '32x32',    bitmap_32 ],
+    [ '48x48',    bitmap_48 ],
+    [ '64x64',    bitmap_64 + bitmap_64system ],
+    [ '96x96',    bitmap_96 ],
+    [ '128x128',  bitmap_128 ],
+    [ '192x192',  bitmap_192 ],
+    [ '256x256',  bitmap_256 ],
+  ]
+endif
+
+
+install_data('index.theme',
+  install_dir: gimpiconsdir / theme,
+)
+
+foreach icon_info : all_icons
+  icons_dir = icon_info[0]
+  icons_list= icon_info[1]
+  install_data(icons_list,
+    install_dir: gimpiconsdir / theme / icons_dir / 'apps',
+  )
+endforeach
+
+
+icons_core = [ '64/dialog-question.png', ]
+icons_imgs = [ '64/gimp-wilber-eek.png', ]
+
+resourcename = 'gimp-core-pixbufs'
+xml_content  = '<?xml version="1.0" encoding="UTF-8"?>\n'
+xml_content += '<gresources>\n'
+xml_content += '  <gresource prefix="/org/gimp/icons">\n'
+foreach file : icons_core
+  xml_content+='    <file preprocess="to-pixdata">'+ file +'</file>\n'
+endforeach
+xml_content += '  </gresource>\n'
+xml_content += '</gresources>\n'
+
+xml_file = configure_file(
+  output: resourcename + '.gresource.xml',
+  command: [ 'echo', xml_content ],
+  capture: true,
+)
+icons_core_sources = gnome.compile_resources(
+  resourcename,
+  xml_file,
+  c_name: resourcename.underscorify(),
+)
+
+
+resourcename = 'gimp-icon-pixbufs'
+xml_content  = '<?xml version="1.0" encoding="UTF-8"?>\n'
+xml_content += '<gresources>\n'
+xml_content += '  <gresource prefix="/org/gimp/icons">\n'
+foreach file : icons_imgs
+  xml_content+='    <file preprocess="to-pixdata">'+ file +'</file>\n'
+endforeach
+xml_content += '  </gresource>\n'
+xml_content += '</gresources>\n'
+
+xml_file = configure_file(
+  output: resourcename + '.gresource.xml',
+  command: [ 'echo', xml_content ],
+  capture: true,
+)
+icons_imgs_sources = gnome.compile_resources(
+  resourcename,
+  xml_file,
+  c_name: resourcename.underscorify(),
+)
diff --git a/icons/Legacy/meson.build b/icons/Legacy/meson.build
new file mode 100644
index 0000000000..900fc2ca21
--- /dev/null
+++ b/icons/Legacy/meson.build
@@ -0,0 +1,556 @@
+
+install_data('index.theme',
+  install_dir: gimpiconsdir / theme,
+)
+
+legacy_icons_12 = [
+  '12/gimp-close.png',
+  '12/gimp-default-colors.png',
+  '12/gimp-linked.png',
+  '12/gimp-menu-left.png',
+  '12/gimp-menu-right.png',
+  '12/gimp-quick-mask-off.png',
+  '12/gimp-quick-mask-on.png',
+  '12/gimp-swap-colors.png',
+  '12/gimp-visible.png',
+  '12/gimp-zoom-follow-window.png',
+]
+legacy_icons_16 = [
+  '16/gimp-anchor.png',
+  '16/gimp-cap-butt.png',
+  '16/gimp-cap-round.png',
+  '16/gimp-cap-square.png',
+  '16/gimp-center.png',
+  '16/gimp-channel-alpha.png',
+  '16/gimp-channel-blue.png',
+  '16/gimp-channel-gray.png',
+  '16/gimp-channel-green.png',
+  '16/gimp-channel-indexed.png',
+  '16/gimp-channel-red.png',
+  '16/gimp-channel.png',
+  '16/gimp-channels.png',
+  '16/gimp-color-pick-from-screen.png',
+  '16/gimp-color-triangle.png',
+  '16/gimp-colormap.png',
+  '16/gimp-controller-keyboard.png',
+  '16/gimp-controller-linux-input.png',
+  '16/gimp-controller-midi.png',
+  '16/gimp-controller-wheel.png',
+  '16/gimp-controller.png',
+  '16/gimp-convert-grayscale.png',
+  '16/gimp-convert-indexed.png',
+  '16/gimp-convert-rgb.png',
+  '16/gimp-cursor.png',
+  '16/gimp-curve-free.png',
+  '16/gimp-curve-smooth.png',
+  '16/gimp-device-status.png',
+  '16/gimp-display-filter-colorblind.png',
+  '16/gimp-display-filter-contrast.png',
+  '16/gimp-display-filter-gamma.png',
+  '16/gimp-display-filter-lcms.png',
+  '16/gimp-display-filter-proof.png',
+  '16/gimp-display-filter.png',
+  '16/gimp-duplicate.png',
+  '16/gimp-dynamics.png',
+  '16/gimp-flip-horizontal.png',
+  '16/gimp-flip-vertical.png',
+  '16/gimp-floating-selection.png',
+  '16/gimp-gegl.png',
+  '16/gimp-gradient-bilinear.png',
+  '16/gimp-gradient-conical-asymmetric.png',
+  '16/gimp-gradient-conical-symmetric.png',
+  '16/gimp-gradient-linear.png',
+  '16/gimp-gradient-radial.png',
+  '16/gimp-gradient-shapeburst-angular.png',
+  '16/gimp-gradient-shapeburst-dimpled.png',
+  '16/gimp-gradient-shapeburst-spherical.png',
+  '16/gimp-gradient-spiral-anticlockwise.png',
+  '16/gimp-gradient-spiral-clockwise.png',
+  '16/gimp-gradient-square.png',
+  '16/gimp-grid.png',
+  '16/gimp-histogram-linear.png',
+  '16/gimp-histogram-logarithmic.png',
+  '16/gimp-histogram.png',
+  '16/gimp-image.png',
+  '16/gimp-images.png',
+  '16/gimp-info.png',
+  '16/gimp-input-device.png',
+  '16/gimp-invert.png',
+  '16/gimp-join-bevel.png',
+  '16/gimp-join-miter.png',
+  '16/gimp-join-round.png',
+  '16/gimp-landscape.png',
+  '16/gimp-layer-mask.png',
+  '16/gimp-layer-to-imagesize.png',
+  '16/gimp-layer.png',
+  '16/gimp-layers.png',
+  '16/gimp-list.png',
+  '16/gimp-merge-down.png',
+  '16/gimp-move-to-screen.png',
+  '16/gimp-navigation.png',
+  '16/gimp-paste-as-new.png',
+  '16/gimp-paste-into.png',
+  '16/gimp-path-stroke.png',
+  '16/gimp-path.png',
+  '16/gimp-paths.png',
+  '16/gimp-plugin.png',
+  '16/gimp-portrait.png',
+  '16/gimp-prefs-folders-brushes.png',
+  '16/gimp-prefs-folders-dynamics.png',
+  '16/gimp-prefs-folders-environ.png',
+  '16/gimp-prefs-folders-fonts.png',
+  '16/gimp-prefs-folders-gradients.png',
+  '16/gimp-prefs-folders-icon-themes.png',
+  '16/gimp-prefs-folders-interp.png',
+  '16/gimp-prefs-folders-modules.png',
+  '16/gimp-prefs-folders-palettes.png',
+  '16/gimp-prefs-folders-patterns.png',
+  '16/gimp-prefs-folders-plug-ins.png',
+  '16/gimp-prefs-folders-scripts.png',
+  '16/gimp-prefs-folders-themes.png',
+  '16/gimp-prefs-folders-tool-plug-ins.png',
+  '16/gimp-prefs-folders-tool-presets.png',
+  '16/gimp-prefs-folders-tools.png',
+  '16/gimp-prefs-icon-theme.png',
+  '16/gimp-prefs-image-windows.png',
+  '16/gimp-prefs-interface.png',
+  '16/gimp-prefs-theme.png',
+  '16/gimp-prefs-toolbox.png',
+  '16/gimp-prefs-window-management.png',
+  '16/gimp-print-resolution.png',
+  '16/gimp-reset.png',
+  '16/gimp-reshow-filter.png',
+  '16/gimp-resize.png',
+  '16/gimp-rotate-180.png',
+  '16/gimp-rotate-270.png',
+  '16/gimp-rotate-90.png',
+  '16/gimp-sample-point.png',
+  '16/gimp-scale.png',
+  '16/gimp-selection-add.png',
+  '16/gimp-selection-all.png',
+  '16/gimp-selection-border.png',
+  '16/gimp-selection-grow.png',
+  '16/gimp-selection-intersect.png',
+  '16/gimp-selection-none.png',
+  '16/gimp-selection-replace.png',
+  '16/gimp-selection-shrink.png',
+  '16/gimp-selection-stroke.png',
+  '16/gimp-selection-subtract.png',
+  '16/gimp-selection-to-channel.png',
+  '16/gimp-selection-to-path.png',
+  '16/gimp-selection.png',
+  '16/gimp-shape-circle.png',
+  '16/gimp-shape-diamond.png',
+  '16/gimp-shape-square.png',
+  '16/gimp-template.png',
+  '16/gimp-text-layer.png',
+  '16/gimp-toilet-paper.png',
+  '16/gimp-tool-airbrush.png',
+  '16/gimp-tool-align.png',
+  '16/gimp-tool-blur.png',
+  '16/gimp-tool-brightness-contrast.png',
+  '16/gimp-tool-bucket-fill.png',
+  '16/gimp-tool-by-color-select.png',
+  '16/gimp-tool-cage.png',
+  '16/gimp-tool-clone.png',
+  '16/gimp-tool-color-balance.png',
+  '16/gimp-tool-color-picker.png',
+  '16/gimp-tool-colorize.png',
+  '16/gimp-tool-crop.png',
+  '16/gimp-tool-curves.png',
+  '16/gimp-tool-desaturate.png',
+  '16/gimp-tool-dodge.png',
+  '16/gimp-tool-ellipse-select.png',
+  '16/gimp-tool-eraser.png',
+  '16/gimp-tool-flip.png',
+  '16/gimp-tool-foreground-select.png',
+  '16/gimp-tool-free-select.png',
+  '16/gimp-tool-fuzzy-select.png',
+  '16/gimp-tool-gradient.png',
+  '16/gimp-tool-handle-transform.png',
+  '16/gimp-tool-heal.png',
+  '16/gimp-tool-hue-saturation.png',
+  '16/gimp-tool-ink.png',
+  '16/gimp-tool-iscissors.png',
+  '16/gimp-tool-levels.png',
+  '16/gimp-tool-measure.png',
+  '16/gimp-tool-move.png',
+  '16/gimp-tool-mypaint-brush.png',
+  '16/gimp-tool-n-point-deformation.png',
+  '16/gimp-tool-options.png',
+  '16/gimp-tool-paintbrush.png',
+  '16/gimp-tool-path.png',
+  '16/gimp-tool-pencil.png',
+  '16/gimp-tool-perspective-clone.png',
+  '16/gimp-tool-perspective.png',
+  '16/gimp-tool-posterize.png',
+  '16/gimp-tool-preset.png',
+  '16/gimp-tool-rect-select.png',
+  '16/gimp-tool-rotate.png',
+  '16/gimp-tool-scale.png',
+  '16/gimp-tool-seamless-clone.png',
+  '16/gimp-tool-shear.png',
+  '16/gimp-tool-smudge.png',
+  '16/gimp-tool-text.png',
+  '16/gimp-tool-threshold.png',
+  '16/gimp-tool-unified-transform.png',
+  '16/gimp-tool-warp.png',
+  '16/gimp-tool-zoom.png',
+  '16/gimp-tools.png',
+  '16/gimp-transparency.png',
+  '16/gimp-undo-history.png',
+  '16/gimp-user-manual.png',
+  '16/gimp-video.png',
+  '16/gimp-warning.png',
+  '16/gimp-web.png',
+  '16/gimp-wilber.png',
+  '16/gtk-edit.png',
+]
+legacy_icons_18 = [
+  '18/gimp-color-picker-black.png',
+  '18/gimp-color-picker-gray.png',
+  '18/gimp-color-picker-white.png',
+]
+legacy_icons_20 = [
+  '20/gimp-linked.png',
+  '20/gimp-visible.png',
+]
+legacy_icons_22 = [
+  '22/gimp-char-picker.png',
+  '22/gimp-dynamics.png',
+  '22/gimp-histogram.png',
+  '22/gimp-input-device.png',
+  '22/gimp-letter-spacing.png',
+  '22/gimp-line-spacing.png',
+  '22/gimp-path.png',
+  '22/gimp-paths.png',
+  '22/gimp-prefs-color-management.png',
+  '22/gimp-prefs-controllers.png',
+  '22/gimp-prefs-default-grid.png',
+  '22/gimp-prefs-display.png',
+  '22/gimp-prefs-folders-brushes.png',
+  '22/gimp-prefs-folders-dynamics.png',
+  '22/gimp-prefs-folders-environ.png',
+  '22/gimp-prefs-folders-fonts.png',
+  '22/gimp-prefs-folders-gradients.png',
+  '22/gimp-prefs-folders-icon-themes.png',
+  '22/gimp-prefs-folders-interp.png',
+  '22/gimp-prefs-folders-modules.png',
+  '22/gimp-prefs-folders-palettes.png',
+  '22/gimp-prefs-folders-patterns.png',
+  '22/gimp-prefs-folders-plug-ins.png',
+  '22/gimp-prefs-folders-scripts.png',
+  '22/gimp-prefs-folders-themes.png',
+  '22/gimp-prefs-folders-tool-plug-ins.png',
+  '22/gimp-prefs-folders-tool-presets.png',
+  '22/gimp-prefs-folders-tools.png',
+  '22/gimp-prefs-folders.png',
+  '22/gimp-prefs-help-system.png',
+  '22/gimp-prefs-icon-theme.png',
+  '22/gimp-prefs-image-title.png',
+  '22/gimp-prefs-image-windows.png',
+  '22/gimp-prefs-input-devices.png',
+  '22/gimp-prefs-interface.png',
+  '22/gimp-prefs-new-image.png',
+  '22/gimp-prefs-playground.png',
+  '22/gimp-prefs-session.png',
+  '22/gimp-prefs-system-resources.png',
+  '22/gimp-prefs-theme.png',
+  '22/gimp-prefs-tool-options.png',
+  '22/gimp-prefs-toolbox.png',
+  '22/gimp-prefs-window-management.png',
+  '22/gimp-tool-preset.png',
+  '22/gimp-wilber.png',
+]
+legacy_tools_22 = [
+  '22/gimp-gegl.png',
+  '22/gimp-tool-airbrush.png',
+  '22/gimp-tool-align.png',
+  '22/gimp-tool-blur.png',
+  '22/gimp-tool-brightness-contrast.png',
+  '22/gimp-tool-bucket-fill.png',
+  '22/gimp-tool-by-color-select.png',
+  '22/gimp-tool-cage.png',
+  '22/gimp-tool-clone.png',
+  '22/gimp-tool-color-balance.png',
+  '22/gimp-tool-color-picker.png',
+  '22/gimp-tool-colorize.png',
+  '22/gimp-tool-crop.png',
+  '22/gimp-tool-curves.png',
+  '22/gimp-tool-desaturate.png',
+  '22/gimp-tool-dodge.png',
+  '22/gimp-tool-ellipse-select.png',
+  '22/gimp-tool-eraser.png',
+  '22/gimp-tool-flip.png',
+  '22/gimp-tool-foreground-select.png',
+  '22/gimp-tool-free-select.png',
+  '22/gimp-tool-fuzzy-select.png',
+  '22/gimp-tool-gradient.png',
+  '22/gimp-tool-handle-transform.png',
+  '22/gimp-tool-heal.png',
+  '22/gimp-tool-hue-saturation.png',
+  '22/gimp-tool-ink.png',
+  '22/gimp-tool-iscissors.png',
+  '22/gimp-tool-levels.png',
+  '22/gimp-tool-measure.png',
+  '22/gimp-tool-move.png',
+  '22/gimp-tool-mypaint-brush.png',
+  '22/gimp-tool-n-point-deformation.png',
+  '22/gimp-tool-paintbrush.png',
+  '22/gimp-tool-path.png',
+  '22/gimp-tool-pencil.png',
+  '22/gimp-tool-perspective-clone.png',
+  '22/gimp-tool-perspective.png',
+  '22/gimp-tool-posterize.png',
+  '22/gimp-tool-rect-select.png',
+  '22/gimp-tool-rotate.png',
+  '22/gimp-tool-scale.png',
+  '22/gimp-tool-seamless-clone.png',
+  '22/gimp-tool-shear.png',
+  '22/gimp-tool-smudge.png',
+  '22/gimp-tool-text.png',
+  '22/gimp-tool-threshold.png',
+  '22/gimp-tool-unified-transform.png',
+  '22/gimp-tool-warp.png',
+  '22/gimp-tool-zoom.png',
+]
+legacy_icons_24 = [
+  '24/gimp-center.png',
+  '24/gimp-channel-alpha.png',
+  '24/gimp-channel-blue.png',
+  '24/gimp-channel-gray.png',
+  '24/gimp-channel-green.png',
+  '24/gimp-channel-indexed.png',
+  '24/gimp-channel-red.png',
+  '24/gimp-channel.png',
+  '24/gimp-channels.png',
+  '24/gimp-colormap.png',
+  '24/gimp-controller-keyboard.png',
+  '24/gimp-controller-linux-input.png',
+  '24/gimp-controller-midi.png',
+  '24/gimp-controller-wheel.png',
+  '24/gimp-controller.png',
+  '24/gimp-cursor.png',
+  '24/gimp-device-status.png',
+  '24/gimp-display-filter-colorblind.png',
+  '24/gimp-display-filter-contrast.png',
+  '24/gimp-display-filter-gamma.png',
+  '24/gimp-display-filter-lcms.png',
+  '24/gimp-display-filter-proof.png',
+  '24/gimp-display-filter.png',
+  '24/gimp-floating-selection.png',
+  '24/gimp-gravity-east.png',
+  '24/gimp-gravity-north-east.png',
+  '24/gimp-gravity-north-west.png',
+  '24/gimp-gravity-north.png',
+  '24/gimp-gravity-south-east.png',
+  '24/gimp-gravity-south-west.png',
+  '24/gimp-gravity-south.png',
+  '24/gimp-gravity-west.png',
+  '24/gimp-hcenter.png',
+  '24/gimp-hchain-broken.png',
+  '24/gimp-hchain.png',
+  '24/gimp-hfill.png',
+  '24/gimp-image.png',
+  '24/gimp-images.png',
+  '24/gimp-info.png',
+  '24/gimp-layer-mask.png',
+  '24/gimp-layer.png',
+  '24/gimp-layers.png',
+  '24/gimp-move-to-screen.png',
+  '24/gimp-print-resolution.png',
+  '24/gimp-sample-point.png',
+  '24/gimp-template.png',
+  '24/gimp-text-dir-ltr.png',
+  '24/gimp-text-dir-rtl.png',
+  '24/gimp-text-layer.png',
+  '24/gimp-toilet-paper.png',
+  '24/gimp-tool-options.png',
+  '24/gimp-tools.png',
+  '24/gimp-transparency.png',
+  '24/gimp-undo-history.png',
+  '24/gimp-user-manual.png',
+  '24/gimp-vcenter.png',
+  '24/gimp-vchain-broken.png',
+  '24/gimp-vchain.png',
+  '24/gimp-vfill.png',
+  '24/gimp-video.png',
+  '24/gimp-warning.png',
+  '24/gimp-web.png',
+]
+legacy_icons_32 = [
+  '32/gimp-channel-alpha.png',
+  '32/gimp-channel-blue.png',
+  '32/gimp-channel-gray.png',
+  '32/gimp-channel-green.png',
+  '32/gimp-channel-indexed.png',
+  '32/gimp-channel-red.png',
+  '32/gimp-channel.png',
+  '32/gimp-floating-selection.png',
+  '32/gimp-image.png',
+  '32/gimp-layer-mask.png',
+  '32/gimp-layer.png',
+  '32/gimp-text-layer.png',
+  '32/gimp-user-manual.png',
+  '32/gimp-wilber.png',
+]
+legacy_icons_48 = [
+  '48/gimp-channel-alpha.png',
+  '48/gimp-channel-blue.png',
+  '48/gimp-channel-gray.png',
+  '48/gimp-channel-green.png',
+  '48/gimp-channel-indexed.png',
+  '48/gimp-channel-red.png',
+  '48/gimp-channel.png',
+  '48/gimp-floating-selection.png',
+  '48/gimp-image.png',
+  '48/gimp-layer-mask.png',
+  '48/gimp-layer.png',
+  '48/gimp-prefs-color-management.png',
+  '48/gimp-prefs-controllers.png',
+  '48/gimp-prefs-default-comment.png',
+  '48/gimp-prefs-default-grid.png',
+  '48/gimp-prefs-display.png',
+  '48/gimp-prefs-folders-brushes.png',
+  '48/gimp-prefs-folders-dynamics.png',
+  '48/gimp-prefs-folders-environ.png',
+  '48/gimp-prefs-folders-fonts.png',
+  '48/gimp-prefs-folders-gradients.png',
+  '48/gimp-prefs-folders-icon-themes.png',
+  '48/gimp-prefs-folders-interp.png',
+  '48/gimp-prefs-folders-modules.png',
+  '48/gimp-prefs-folders-palettes.png',
+  '48/gimp-prefs-folders-patterns.png',
+  '48/gimp-prefs-folders-plug-ins.png',
+  '48/gimp-prefs-folders-scripts.png',
+  '48/gimp-prefs-folders-themes.png',
+  '48/gimp-prefs-folders-tool-plug-ins.png',
+  '48/gimp-prefs-folders-tool-presets.png',
+  '48/gimp-prefs-folders-tools.png',
+  '48/gimp-prefs-folders.png',
+  '48/gimp-prefs-help-system.png',
+  '48/gimp-prefs-icon-theme.png',
+  '48/gimp-prefs-image-title.png',
+  '48/gimp-prefs-image-windows.png',
+  '48/gimp-prefs-input-devices.png',
+  '48/gimp-prefs-interface.png',
+  '48/gimp-prefs-new-image.png',
+  '48/gimp-prefs-playground.png',
+  '48/gimp-prefs-session.png',
+  '48/gimp-prefs-system-resources.png',
+  '48/gimp-prefs-theme.png',
+  '48/gimp-prefs-tool-options.png',
+  '48/gimp-prefs-toolbox.png',
+  '48/gimp-prefs-window-management.png',
+  '48/gimp-text-layer.png',
+  '48/gimp-wilber.png',
+]
+legacy_icons_64 = [
+  '64/gimp-error.png',
+  '64/gimp-frame.png',
+  '64/gimp-info.png',
+  '64/gimp-question.png',
+  '64/gimp-texture.png',
+  '64/gimp-user-manual.png',
+  '64/gimp-warning.png',
+  '64/gimp-wilber-eek.png',
+  '64/gimp-wilber-outline.png',
+  '64/gimp-wilber.png',
+]
+legacy_icons_96 = [
+  '96/gimp-wilber-outline.png',
+  '96/gimp-wilber.png',
+]
+legacy_icons_128 = [
+  '128/gimp-wilber-outline.png',
+  '128/gimp-wilber.png',
+]
+legacy_icons_192 = [
+  '192/gimp-wilber-outline.png',
+  '192/gimp-wilber.png',
+]
+legacy_icons_256 = [
+  '256/gimp-wilber-outline.png',
+  '256/gimp-wilber.png',
+]
+
+all_legacy_icons = [
+  [ '12x12',    legacy_icons_12 ],
+  [ '16x16',    legacy_icons_16 ],
+  [ '18x18',    legacy_icons_18 ],
+  [ '20x20',    legacy_icons_20 ],
+  [ '22x22',    legacy_icons_22 ],
+  [ '24x24',    legacy_icons_24 ],
+  [ '32x32',    legacy_icons_32 ],
+  [ '48x48',    legacy_icons_48 ],
+  [ '64x64',    legacy_icons_64 ],
+  [ '96x96',    legacy_icons_96 ],
+  [ '128x128',  legacy_icons_128 ],
+  [ '192x192',  legacy_icons_192 ],
+  [ '256x256',  legacy_icons_256 ],
+]
+all_legacy_tools = [
+  [ '22x22',    legacy_tools_22 ],
+]
+
+foreach icon_info : all_legacy_icons
+  icons_dir = icon_info[0]
+  icons_list= icon_info[1]
+  install_data(icons_list,
+    install_dir: gimpiconsdir / theme / icons_dir / 'apps',
+  )
+endforeach
+foreach icon_info : all_legacy_tools
+  icons_dir = icon_info[0]
+  icons_list= icon_info[1]
+  install_data(icons_list,
+  install_dir: gimpiconsdir / theme / icons_dir / 'tools',
+  )
+endforeach
+
+
+icons_core = [ '64/gimp-question.png', ]
+icons_imgs = [ '64/gimp-wilber-eek.png', ]
+
+resourcename = 'gimp-core-pixbufs'
+xml_content  = '<?xml version="1.0" encoding="UTF-8"?>\n'
+xml_content += '<gresources>\n'
+xml_content += '  <gresource prefix="/org/gimp/icons">\n'
+foreach file : icons_core
+  xml_content+='    <file preprocess="to-pixdata">'+ file +'</file>\n'
+endforeach
+xml_content += '  </gresource>\n'
+xml_content += '</gresources>\n'
+
+xml_file = configure_file(
+  output: resourcename + '.gresource.xml',
+  command: [ 'echo', xml_content ],
+  capture: true,
+)
+# icons_core_sources = gnome.compile_resources(
+#   resourcename,
+#   xml_file,
+#   c_name: resourcename.underscorify(),
+# )
+
+
+resourcename = 'gimp-icon-pixbufs'
+xml_content  = '<?xml version="1.0" encoding="UTF-8"?>\n'
+xml_content += '<gresources>\n'
+xml_content += '  <gresource prefix="/org/gimp/icons">\n'
+foreach file : icons_imgs
+  xml_content+='    <file preprocess="to-pixdata">'+ file +'</file>\n'
+endforeach
+xml_content += '  </gresource>\n'
+xml_content += '</gresources>\n'
+
+xml_file = configure_file(
+  output: resourcename + '.gresource.xml',
+  command: [ 'echo', xml_content ],
+  capture: true,
+)
+# icons_imgs_sources = gnome.compile_resources(
+#   resourcename,
+#   xml_file,
+#   c_name: resourcename.underscorify(),
+# )
diff --git a/icons/Symbolic/meson.build b/icons/Symbolic/meson.build
new file mode 100644
index 0000000000..697756ec8a
--- /dev/null
+++ b/icons/Symbolic/meson.build
@@ -0,0 +1,84 @@
+
+if have_vector_icons
+  all_icons = [
+    [ 'scalable', symbolic_vector_scalable ],
+    [ '24x24',    symbolic_vector_24 ],
+    # [ '64x64',    bitmap_64system ],
+  ]
+else
+  all_icons = [
+    [ '12x12',    bitmap_12 ],
+    [ '16x16',    bitmap_16 ],
+    [ '18x18',    bitmap_18 ],
+    [ '20x20',    bitmap_20 ],
+    [ '22x22',    bitmap_22 ],
+    [ '24x24',    bitmap_24 ],
+    [ '32x32',    bitmap_32 ],
+    [ '48x48',    bitmap_48 ],
+    [ '64x64',    bitmap_64 + bitmap_64system ],
+    [ '96x96',    bitmap_96 ],
+    [ '128x128',  bitmap_128 ],
+    [ '192x192',  bitmap_192 ],
+    [ '256x256',  bitmap_256 ],
+  ]
+endif
+
+
+install_data('index.theme',
+  install_dir: gimpiconsdir / theme,
+)
+
+foreach icon_info : all_icons
+  icons_dir = icon_info[0]
+  icons_list= icon_info[1]
+  install_data(icons_list,
+    install_dir: gimpiconsdir / theme / icons_dir / 'apps',
+  )
+endforeach
+
+
+icons_core = [ '64/gimp-question.png', ]
+icons_imgs = [ '64/gimp-wilber-eek.png', ]
+
+resourcename = 'gimp-core-pixbufs'
+xml_content  = '<?xml version="1.0" encoding="UTF-8"?>\n'
+xml_content += '<gresources>\n'
+xml_content += '  <gresource prefix="/org/gimp/icons">\n'
+foreach file : icons_core
+  xml_content+='    <file preprocess="to-pixdata">'+ file +'</file>\n'
+endforeach
+xml_content += '  </gresource>\n'
+xml_content += '</gresources>\n'
+
+xml_file = configure_file(
+  output: resourcename + '.gresource.xml',
+  command: [ 'echo', xml_content ],
+  capture: true,
+)
+# icons_core_sources = gnome.compile_resources(
+#   resourcename,
+#   xml_file,
+#   c_name: resourcename.underscorify(),
+# )
+
+
+resourcename = 'gimp-icon-pixbufs'
+xml_content  = '<?xml version="1.0" encoding="UTF-8"?>\n'
+xml_content += '<gresources>\n'
+xml_content += '  <gresource prefix="/org/gimp/icons">\n'
+foreach file : icons_imgs
+  xml_content+='    <file preprocess="to-pixdata">'+ file +'</file>\n'
+endforeach
+xml_content += '  </gresource>\n'
+xml_content += '</gresources>\n'
+
+xml_file = configure_file(
+  output: resourcename + '.gresource.xml',
+  command: [ 'echo', xml_content ],
+  capture: true,
+)
+# icons_imgs_sources = gnome.compile_resources(
+#   resourcename,
+#   xml_file,
+#   c_name: resourcename.underscorify(),
+# )
diff --git a/icons/meson.build b/icons/meson.build
new file mode 100644
index 0000000000..5e93e94f43
--- /dev/null
+++ b/icons/meson.build
@@ -0,0 +1,1613 @@
+
+color_vector_scalable = [
+  'scalable/dialog-error.svg',
+  'scalable/dialog-information.svg',
+  'scalable/dialog-question.svg',
+  'scalable/dialog-warning.svg',
+  'scalable/document-new.svg',
+  'scalable/document-open.svg',
+  'scalable/document-open-recent.svg',
+  'scalable/document-print.svg',
+  'scalable/document-revert.svg',
+  'scalable/document-save.svg',
+  'scalable/document-save-as.svg',
+  'scalable/edit-clear.svg',
+  'scalable/edit-copy.svg',
+  'scalable/edit-cut.svg',
+  'scalable/edit-delete.svg',
+  'scalable/edit-paste.svg',
+  'scalable/edit-redo.svg',
+  'scalable/edit-undo.svg',
+  'scalable/folder.svg',
+  'scalable/folder-new.svg',
+  'scalable/format-indent-more.svg',
+  'scalable/format-justify-fill.svg',
+  'scalable/format-justify-center.svg',
+  'scalable/format-justify-left.svg',
+  'scalable/format-justify-right.svg',
+  'scalable/format-text-direction-ltr.svg',
+  'scalable/format-text-direction-rtl.svg',
+  'scalable/go-bottom.svg',
+  'scalable/go-down.svg',
+  'scalable/go-first.svg',
+  'scalable/go-home.svg',
+  'scalable/go-last.svg',
+  'scalable/go-next.svg',
+  'scalable/go-previous.svg',
+  'scalable/go-top.svg',
+  'scalable/go-up.svg',
+  'scalable/help-about.svg',
+  'scalable/list-add.svg',
+  'scalable/list-remove.svg',
+  'scalable/media-floppy.svg',
+  'scalable/media-optical.svg',
+  'scalable/media-playback-pause.svg',
+  'scalable/media-playback-start.svg',
+  'scalable/media-record.svg',
+  'scalable/media-seek-backward.svg',
+  'scalable/media-skip-backward.svg',
+  'scalable/media-skip-forward.svg',
+  'scalable/object-flip-horizontal.svg',
+  'scalable/object-flip-vertical.svg',
+  'scalable/object-rotate-left.svg',
+  'scalable/object-rotate-right.svg',
+  'scalable/preferences-system.svg',
+  'scalable/process-stop.svg',
+  'scalable/system-run.svg',
+  'scalable/view-fullscreen.svg',
+  'scalable/view-refresh.svg',
+  'scalable/window-close.svg',
+  'scalable/window-new.svg',
+  'scalable/zoom-fit-best.svg',
+  'scalable/zoom-in.svg',
+  'scalable/zoom-original.svg',
+  'scalable/zoom-out.svg',
+
+  'scalable/gtk-cancel.svg',
+  'scalable/gtk-edit.svg',
+  'scalable/gtk-no.svg',
+  'scalable/gtk-ok.svg',
+  'scalable/gtk-select-color.svg',
+  'scalable/gtk-select-font.svg',
+  'scalable/gtk-yes.svg',
+
+  'scalable/gimp-anchor.svg',
+  'scalable/gimp-attach.svg',
+  'scalable/gimp-business-card.svg',
+  'scalable/gimp-cap-butt.svg',
+  'scalable/gimp-cap-round.svg',
+  'scalable/gimp-cap-square.svg',
+  'scalable/gimp-center.svg',
+  'scalable/gimp-channel-alpha.svg',
+  'scalable/gimp-channel-blue.svg',
+  'scalable/gimp-channel-gray.svg',
+  'scalable/gimp-channel-green.svg',
+  'scalable/gimp-channel-indexed.svg',
+  'scalable/gimp-channel-red.svg',
+  'scalable/gimp-channels.svg',
+  'scalable/gimp-channel.svg',
+  'scalable/gimp-char-picker.svg',
+  'scalable/gimp-clipboard.svg',
+  'scalable/gimp-close.svg',
+  'scalable/gimp-close-all.svg',
+  'scalable/gimp-colormap.svg',
+  'scalable/gimp-color-picker-black.svg',
+  'scalable/gimp-color-picker-gray.svg',
+  'scalable/gimp-color-picker-white.svg',
+  'scalable/gimp-color-pick-from-screen.svg',
+  'scalable/gimp-color-cmyk.svg',
+  'scalable/gimp-color-space-linear.svg',
+  'scalable/gimp-color-space-non-linear.svg',
+  'scalable/gimp-color-space-perceptual.svg',
+  'scalable/gimp-color-triangle.svg',
+  'scalable/gimp-color-water.svg',
+  'scalable/gimp-controller-keyboard.svg',
+  'scalable/gimp-controller-linux-input.svg',
+  'scalable/gimp-controller-midi.svg',
+  'scalable/gimp-controller.svg',
+  'scalable/gimp-controller-wheel.svg',
+  'scalable/gimp-convert-grayscale.svg',
+  'scalable/gimp-convert-indexed.svg',
+  'scalable/gimp-convert-rgb.svg',
+  'scalable/gimp-cursor.svg',
+  'scalable/gimp-curve-free.svg',
+  'scalable/gimp-curve-point-corner.svg',
+  'scalable/gimp-curve-point-smooth.svg',
+  'scalable/gimp-curve-smooth.svg',
+  'scalable/gimp-dashboard.svg',
+  'scalable/gimp-default-colors.svg',
+  'scalable/gimp-detach.svg',
+  'scalable/gimp-device-status.svg',
+  'scalable/gimp-display.svg',
+  'scalable/gimp-display-filter-clip-warning.svg',
+  'scalable/gimp-display-filter-colorblind.svg',
+  'scalable/gimp-display-filter-contrast.svg',
+  'scalable/gimp-display-filter-gamma.svg',
+  'scalable/gimp-display-filter-lcms.svg',
+  'scalable/gimp-display-filter-proof.svg',
+  'scalable/gimp-display-filter.svg',
+  'scalable/gimp-duplicate.svg',
+  'scalable/gimp-dynamics.svg',
+  'scalable/gimp-file-manager.svg',
+  'scalable/gimp-floating-selection.svg',
+  'scalable/gimp-gegl.svg',
+  'scalable/gimp-gradient-bilinear.svg',
+  'scalable/gimp-gradient-conical-asymmetric.svg',
+  'scalable/gimp-gradient-conical-symmetric.svg',
+  'scalable/gimp-gradient-linear.svg',
+  'scalable/gimp-gradient-radial.svg',
+  'scalable/gimp-gradient-shapeburst-angular.svg',
+  'scalable/gimp-gradient-shapeburst-dimpled.svg',
+  'scalable/gimp-gradient-shapeburst-spherical.svg',
+  'scalable/gimp-gradient-spiral-anticlockwise.svg',
+  'scalable/gimp-gradient-spiral-clockwise.svg',
+  'scalable/gimp-gradient-square.svg',
+  'scalable/gimp-gravity-east.svg',
+  'scalable/gimp-gravity-north-east.svg',
+  'scalable/gimp-gravity-north.svg',
+  'scalable/gimp-gravity-north-west.svg',
+  'scalable/gimp-gravity-south-east.svg',
+  'scalable/gimp-gravity-south.svg',
+  'scalable/gimp-gravity-south-west.svg',
+  'scalable/gimp-gravity-west.svg',
+  'scalable/gimp-grid.svg',
+  'scalable/gimp-group-layer.svg',
+  'scalable/gimp-hcenter.svg',
+  'scalable/gimp-hchain-broken.svg',
+  'scalable/gimp-hchain.svg',
+  'scalable/gimp-hfill.svg',
+  'scalable/gimp-histogram-linear.svg',
+  'scalable/gimp-histogram-logarithmic.svg',
+  'scalable/gimp-histogram.svg',
+  'scalable/gimp-images.svg',
+  'scalable/gimp-image.svg',
+  'scalable/gimp-image-open.svg',
+  'scalable/gimp-image-reload.svg',
+  'scalable/gimp-input-device.svg',
+  'scalable/gimp-invert.svg',
+  'scalable/gimp-join-bevel.svg',
+  'scalable/gimp-join-miter.svg',
+  'scalable/gimp-join-round.svg',
+  'scalable/gimp-landscape.svg',
+  'scalable/gimp-layer-mask.svg',
+  'scalable/gimp-layers.svg',
+  'scalable/gimp-layer.svg',
+  'scalable/gimp-layer-to-imagesize.svg',
+  'scalable/gimp-letter-spacing.svg',
+  'scalable/gimp-line-spacing.svg',
+  'scalable/gimp-linked.svg',
+  'scalable/gimp-list.svg',
+  'scalable/gimp-marker.svg',
+  'scalable/gimp-menu-left.svg',
+  'scalable/gimp-menu-right.svg',
+  'scalable/gimp-merge-down.svg',
+  'scalable/gimp-move-to-screen.svg',
+  'scalable/gimp-navigation.svg',
+  'scalable/gimp-paste-as-new.svg',
+  'scalable/gimp-paste-into.svg',
+  'scalable/gimp-path.svg',
+  'scalable/gimp-paths.svg',
+  'scalable/gimp-path-stroke.svg',
+  'scalable/gimp-pattern.svg',
+  'scalable/gimp-plugin.svg',
+  'scalable/gimp-portrait.svg',
+  'scalable/gimp-prefs-color-management.svg',
+  'scalable/gimp-prefs-controllers.svg',
+  'scalable/gimp-prefs-default-comment.svg',
+  'scalable/gimp-prefs-default-grid.svg',
+  'scalable/gimp-prefs-display.svg',
+  'scalable/gimp-prefs-folders.svg',
+  'scalable/gimp-prefs-folders-brushes.svg',
+  'scalable/gimp-prefs-folders-dynamics.svg',
+  'scalable/gimp-prefs-folders-environ.svg',
+  'scalable/gimp-prefs-folders-fonts.svg',
+  'scalable/gimp-prefs-folders-gradients.svg',
+  'scalable/gimp-prefs-folders-icon-themes.svg',
+  'scalable/gimp-prefs-folders-interp.svg',
+  'scalable/gimp-prefs-folders-modules.svg',
+  'scalable/gimp-prefs-folders-mypaint-brushes.svg',
+  'scalable/gimp-prefs-folders-palettes.svg',
+  'scalable/gimp-prefs-folders-patterns.svg',
+  'scalable/gimp-prefs-folders-plug-ins.svg',
+  'scalable/gimp-prefs-folders-scripts.svg',
+  'scalable/gimp-prefs-folders-themes.svg',
+  'scalable/gimp-prefs-folders-tool-plug-ins.svg',
+  'scalable/gimp-prefs-folders-tool-presets.svg',
+  'scalable/gimp-prefs-folders-tools.svg',
+  'scalable/gimp-prefs-help-system.svg',
+  'scalable/gimp-prefs-icon-theme.svg',
+  'scalable/gimp-prefs-image-title.svg',
+  'scalable/gimp-prefs-image-windows.svg',
+  'scalable/gimp-prefs-image-windows-appearance.svg',
+  'scalable/gimp-prefs-image-windows-snapping.svg',
+  'scalable/gimp-prefs-import-export.svg',
+  'scalable/gimp-prefs-input-devices.svg',
+  'scalable/gimp-prefs-interface.svg',
+  'scalable/gimp-prefs-new-image.svg',
+  'scalable/gimp-prefs-playground.svg',
+  'scalable/gimp-prefs-session.svg',
+  'scalable/gimp-prefs-system-resources.svg',
+  'scalable/gimp-prefs-theme.svg',
+  'scalable/gimp-prefs-toolbox.svg',
+  'scalable/gimp-prefs-tool-options.svg',
+  'scalable/gimp-prefs-window-management.svg',
+  'scalable/gimp-quick-mask-off.svg',
+  'scalable/gimp-quick-mask-on.svg',
+  'scalable/gimp-reset.svg',
+  'scalable/gimp-reshow-filter.svg',
+  'scalable/gimp-resize.svg',
+  'scalable/gimp-rotate-180.svg',
+  'scalable/gimp-sample-point.svg',
+  'scalable/gimp-scale.svg',
+  'scalable/gimp-selection.svg',
+  'scalable/gimp-selection-add.svg',
+  'scalable/gimp-selection-all.svg',
+  'scalable/gimp-selection-border.svg',
+  'scalable/gimp-selection-grow.svg',
+  'scalable/gimp-selection-intersect.svg',
+  'scalable/gimp-selection-none.svg',
+  'scalable/gimp-selection-replace.svg',
+  'scalable/gimp-selection-shrink.svg',
+  'scalable/gimp-selection-stroke.svg',
+  'scalable/gimp-selection-subtract.svg',
+  'scalable/gimp-selection-to-channel.svg',
+  'scalable/gimp-selection-to-path.svg',
+  'scalable/gimp-shape-circle.svg',
+  'scalable/gimp-shape-diamond.svg',
+  'scalable/gimp-shape-square.svg',
+  'scalable/gimp-shred.svg',
+  'scalable/gimp-smartphone.svg',
+  'scalable/gimp-swap-colors.svg',
+  'scalable/gimp-symmetry.svg',
+  'scalable/gimp-template.svg',
+  'scalable/gimp-text-dir-ttb-rtl.svg',
+  'scalable/gimp-text-dir-ttb-rtl-upright.svg',
+  'scalable/gimp-text-dir-ttb-ltr.svg',
+  'scalable/gimp-text-dir-ttb-ltr-upright.svg',
+  'scalable/gimp-text-layer.svg',
+  'scalable/gimp-toilet-paper.svg',
+  'scalable/gimp-tool-airbrush.svg',
+  'scalable/gimp-tool-align.svg',
+  'scalable/gimp-tool-blur.svg',
+  'scalable/gimp-tool-brightness-contrast.svg',
+  'scalable/gimp-tool-bucket-fill.svg',
+  'scalable/gimp-tool-by-color-select.svg',
+  'scalable/gimp-tool-cage.svg',
+  'scalable/gimp-tool-clone.svg',
+  'scalable/gimp-tool-color-balance.svg',
+  'scalable/gimp-tool-colorize.svg',
+  'scalable/gimp-tool-color-picker.svg',
+  'scalable/gimp-tool-color-temperature.svg',
+  'scalable/gimp-tool-crop.svg',
+  'scalable/gimp-tool-curves.svg',
+  'scalable/gimp-tool-desaturate.svg',
+  'scalable/gimp-tool-dodge.svg',
+  'scalable/gimp-tool-ellipse-select.svg',
+  'scalable/gimp-tool-eraser.svg',
+  'scalable/gimp-tool-exposure.svg',
+  'scalable/gimp-tool-flip.svg',
+  'scalable/gimp-tool-foreground-select.svg',
+  'scalable/gimp-tool-free-select.svg',
+  'scalable/gimp-tool-fuzzy-select.svg',
+  'scalable/gimp-tool-gradient.svg',
+  'scalable/gimp-tool-handle-transform.svg',
+  'scalable/gimp-tool-heal.svg',
+  'scalable/gimp-tool-hue-saturation.svg',
+  'scalable/gimp-tool-ink.svg',
+  'scalable/gimp-tool-iscissors.svg',
+  'scalable/gimp-tool-levels.svg',
+  'scalable/gimp-tool-measure.svg',
+  'scalable/gimp-tool-move.svg',
+  'scalable/gimp-tool-mypaint-brush.svg',
+  'scalable/gimp-tool-n-point-deformation.svg',
+  'scalable/gimp-tool-offset.svg',
+  'scalable/gimp-tool-options.svg',
+  'scalable/gimp-tool-paintbrush.svg',
+  'scalable/gimp-tool-path.svg',
+  'scalable/gimp-tool-pencil.svg',
+  'scalable/gimp-tool-perspective-clone.svg',
+  'scalable/gimp-tool-perspective.svg',
+  'scalable/gimp-tool-posterize.svg',
+  'scalable/gimp-tool-preset.svg',
+  'scalable/gimp-tool-rect-select.svg',
+  'scalable/gimp-tool-rotate.svg',
+  'scalable/gimp-tool-scale.svg',
+  'scalable/gimp-tool-seamless-clone.svg',
+  'scalable/gimp-tool-shadows-highlights.svg',
+  'scalable/gimp-tool-shear.svg',
+  'scalable/gimp-tool-smudge.svg',
+  'scalable/gimp-tools.svg',
+  'scalable/gimp-tool-text.svg',
+  'scalable/gimp-tool-threshold.svg',
+  'scalable/gimp-tool-unified-transform.svg',
+  'scalable/gimp-tool-warp.svg',
+  'scalable/gimp-tool-zoom.svg',
+  'scalable/gimp-transparency.svg',
+  'scalable/gimp-undo-history.svg',
+  'scalable/gimp-user-manual.svg',
+  'scalable/gimp-vcenter.svg',
+  'scalable/gimp-vchain.svg',
+  'scalable/gimp-vchain-broken.svg',
+  'scalable/gimp-vfill.svg',
+  'scalable/gimp-video.svg',
+  'scalable/gimp-visible.svg',
+  'scalable/gimp-web.svg',
+  'scalable/gimp-wilber.svg',
+  'scalable/gimp-wilber-eek.svg',
+  'scalable/gimp-wilber-outline.svg',
+  'scalable/gimp-zoom-follow-window.svg',
+]
+color_vector_24 = [
+  '24/dialog-error.svg',
+  '24/dialog-information.svg',
+  '24/dialog-question.svg',
+  '24/dialog-warning.svg',
+  '24/document-print.svg',
+  '24/media-floppy.svg',
+  '24/media-optical.svg',
+
+  '24/gtk-select-color.svg',
+
+  '24/gimp-business-card.svg',
+  '24/gimp-center.svg',
+  '24/gimp-channel.svg',
+  '24/gimp-channel-alpha.svg',
+  '24/gimp-channel-blue.svg',
+  '24/gimp-channel-gray.svg',
+  '24/gimp-channel-green.svg',
+  '24/gimp-channel-indexed.svg',
+  '24/gimp-channel-red.svg',
+  '24/gimp-channels.svg',
+  '24/gimp-char-picker.svg',
+  '24/gimp-colormap.svg',
+  '24/gimp-color-space-linear.svg',
+  '24/gimp-color-space-non-linear.svg',
+  '24/gimp-color-space-perceptual.svg',
+  '24/gimp-controller.svg',
+  '24/gimp-controller-keyboard.svg',
+  '24/gimp-controller-linux-input.svg',
+  '24/gimp-controller-midi.svg',
+  '24/gimp-controller-wheel.svg',
+  '24/gimp-cursor.svg',
+  '24/gimp-device-status.svg',
+  '24/gimp-display.svg',
+  '24/gimp-display-filter.svg',
+  '24/gimp-display-filter-clip-warning.svg',
+  '24/gimp-display-filter-colorblind.svg',
+  '24/gimp-display-filter-contrast.svg',
+  '24/gimp-display-filter-gamma.svg',
+  '24/gimp-display-filter-lcms.svg',
+  '24/gimp-display-filter-proof.svg',
+  '24/gimp-dynamics.svg',
+  '24/gimp-floating-selection.svg',
+  '24/gimp-gegl.svg',
+  '24/gimp-grid.svg',
+  '24/gimp-histogram.svg',
+  '24/gimp-image.svg',
+  '24/gimp-images.svg',
+  '24/gimp-landscape.svg',
+  '24/gimp-layer.svg',
+  '24/gimp-layer-mask.svg',
+  '24/gimp-layers.svg',
+  '24/gimp-letter-spacing.svg',
+  '24/gimp-line-spacing.svg',
+  '24/gimp-move-to-screen.svg',
+  '24/gimp-navigation.svg',
+  '24/gimp-path.svg',
+  '24/gimp-paths.svg',
+  '24/gimp-portrait.svg',
+  '24/gimp-prefs-color-management.svg',
+  '24/gimp-prefs-controllers.svg',
+  '24/gimp-prefs-default-comment.svg',
+  '24/gimp-prefs-default-grid.svg',
+  '24/gimp-prefs-display.svg',
+  '24/gimp-prefs-folders.svg',
+  '24/gimp-prefs-folders-brushes.svg',
+  '24/gimp-prefs-folders-dynamics.svg',
+  '24/gimp-prefs-folders-environ.svg',
+  '24/gimp-prefs-folders-fonts.svg',
+  '24/gimp-prefs-folders-gradients.svg',
+  '24/gimp-prefs-folders-icon-themes.svg',
+  '24/gimp-prefs-folders-interp.svg',
+  '24/gimp-prefs-folders-modules.svg',
+  '24/gimp-prefs-folders-mypaint-brushes.svg',
+  '24/gimp-prefs-folders-palettes.svg',
+  '24/gimp-prefs-folders-patterns.svg',
+  '24/gimp-prefs-folders-plug-ins.svg',
+  '24/gimp-prefs-folders-scripts.svg',
+  '24/gimp-prefs-folders-themes.svg',
+  '24/gimp-prefs-folders-tool-plug-ins.svg',
+  '24/gimp-prefs-folders-tool-presets.svg',
+  '24/gimp-prefs-folders-tools.svg',
+  '24/gimp-prefs-help-system.svg',
+  '24/gimp-prefs-icon-theme.svg',
+  '24/gimp-prefs-image-title.svg',
+  '24/gimp-prefs-image-windows.svg',
+  '24/gimp-prefs-image-windows-appearance.svg',
+  '24/gimp-prefs-image-windows-snapping.svg',
+  '24/gimp-prefs-import-export.svg',
+  '24/gimp-prefs-input-devices.svg',
+  '24/gimp-prefs-interface.svg',
+  '24/gimp-prefs-new-image.svg',
+  '24/gimp-prefs-playground.svg',
+  '24/gimp-prefs-session.svg',
+  '24/gimp-prefs-system-resources.svg',
+  '24/gimp-prefs-theme.svg',
+  '24/gimp-prefs-toolbox.svg',
+  '24/gimp-prefs-tool-options.svg',
+  '24/gimp-prefs-window-management.svg',
+  '24/gimp-resize.svg',
+  '24/gimp-sample-point.svg',
+  '24/gimp-scale.svg',
+  '24/gimp-selection.svg',
+  '24/gimp-smartphone.svg',
+  '24/gimp-symmetry.svg',
+  '24/gimp-template.svg',
+  '24/gimp-text-layer.svg',
+  '24/gimp-tool-airbrush.svg',
+  '24/gimp-tool-align.svg',
+  '24/gimp-tool-blur.svg',
+  '24/gimp-tool-brightness-contrast.svg',
+  '24/gimp-tool-bucket-fill.svg',
+  '24/gimp-tool-by-color-select.svg',
+  '24/gimp-tool-cage.svg',
+  '24/gimp-tool-clone.svg',
+  '24/gimp-tool-color-balance.svg',
+  '24/gimp-tool-color-picker.svg',
+  '24/gimp-tool-colorize.svg',
+  '24/gimp-tool-crop.svg',
+  '24/gimp-tool-curves.svg',
+  '24/gimp-tool-desaturate.svg',
+  '24/gimp-tool-dodge.svg',
+  '24/gimp-tool-eraser.svg',
+  '24/gimp-tool-ellipse-select.svg',
+  '24/gimp-tool-exposure.svg',
+  '24/gimp-tool-flip.svg',
+  '24/gimp-tool-foreground-select.svg',
+  '24/gimp-tool-free-select.svg',
+  '24/gimp-tool-fuzzy-select.svg',
+  '24/gimp-tool-gradient.svg',
+  '24/gimp-tool-handle-transform.svg',
+  '24/gimp-tool-heal.svg',
+  '24/gimp-tool-hue-saturation.svg',
+  '24/gimp-tool-ink.svg',
+  '24/gimp-tool-iscissors.svg',
+  '24/gimp-tool-levels.svg',
+  '24/gimp-tool-mypaint-brush.svg',
+  '24/gimp-tool-measure.svg',
+  '24/gimp-tool-n-point-deformation.svg',
+  '24/gimp-tool-offset.svg',
+  '24/gimp-tool-options.svg',
+  '24/gimp-tool-paintbrush.svg',
+  '24/gimp-tool-path.svg',
+  '24/gimp-tool-pencil.svg',
+  '24/gimp-tool-perspective.svg',
+  '24/gimp-tool-perspective-clone.svg',
+  '24/gimp-tool-posterize.svg',
+  '24/gimp-tool-preset.svg',
+  '24/gimp-tool-rect-select.svg',
+  '24/gimp-tool-rotate.svg',
+  '24/gimp-tools.svg',
+  '24/gimp-tool-scale.svg',
+  '24/gimp-tool-seamless-clone.svg',
+  '24/gimp-tool-shadows-highlights.svg',
+  '24/gimp-tool-shear.svg',
+  '24/gimp-tool-smudge.svg',
+  '24/gimp-tool-threshold.svg',
+  '24/gimp-tool-unified-transform.svg',
+  '24/gimp-tool-text.svg',
+  '24/gimp-tool-warp.svg',
+  '24/gimp-tool-zoom.svg',
+  '24/gimp-transparency.svg',
+  '24/gimp-undo-history.svg',
+  '24/gimp-user-manual.svg',
+  '24/gimp-video.svg',
+  '24/gimp-web.svg',
+  '24/gimp-wilber.svg',
+]
+
+symbolic_vector_scalable = [
+  'scalable/dialog-error-symbolic.svg',
+  'scalable/dialog-information-symbolic.svg',
+  'scalable/dialog-question-symbolic.svg',
+  'scalable/dialog-warning-symbolic.svg',
+  'scalable/document-new-symbolic.svg',
+  'scalable/document-open-recent-symbolic.svg',
+  'scalable/document-open-symbolic.svg',
+  'scalable/document-print-symbolic.svg',
+  'scalable/document-revert-symbolic.svg',
+  'scalable/document-save-as-symbolic.svg',
+  'scalable/document-save-symbolic.svg',
+  'scalable/edit-clear-symbolic.svg',
+  'scalable/edit-copy-symbolic.svg',
+  'scalable/edit-cut-symbolic.svg',
+  'scalable/edit-delete-symbolic.svg',
+  'scalable/edit-paste-symbolic.svg',
+  'scalable/edit-redo-symbolic.svg',
+  'scalable/edit-undo-symbolic.svg',
+  'scalable/folder-new-symbolic.svg',
+  'scalable/folder-symbolic.svg',
+  'scalable/format-indent-more-symbolic.svg',
+  'scalable/format-justify-center-symbolic.svg',
+  'scalable/format-justify-fill-symbolic.svg',
+  'scalable/format-justify-left-symbolic.svg',
+  'scalable/format-justify-right-symbolic.svg',
+  'scalable/format-text-direction-ltr-symbolic.svg',
+  'scalable/format-text-direction-rtl-symbolic.svg',
+  'scalable/go-bottom-symbolic.svg',
+  'scalable/go-down-symbolic.svg',
+  'scalable/go-first-symbolic.svg',
+  'scalable/go-home-symbolic.svg',
+  'scalable/go-last-symbolic.svg',
+  'scalable/go-next-symbolic.svg',
+  'scalable/go-previous-symbolic.svg',
+  'scalable/go-top-symbolic.svg',
+  'scalable/go-up-symbolic.svg',
+  'scalable/help-about-symbolic.svg',
+  'scalable/list-add-symbolic.svg',
+  'scalable/list-remove-symbolic.svg',
+  'scalable/media-floppy-symbolic.svg',
+  'scalable/media-optical-symbolic.svg',
+  'scalable/media-playback-pause-symbolic.svg',
+  'scalable/media-playback-start-symbolic.svg',
+  'scalable/media-seek-backward-symbolic.svg',
+  'scalable/media-skip-backward-symbolic.svg',
+  'scalable/media-skip-forward-symbolic.svg',
+  'scalable/object-flip-horizontal-symbolic.svg',
+  'scalable/object-flip-vertical-symbolic.svg',
+  'scalable/object-rotate-left-symbolic.svg',
+  'scalable/object-rotate-right-symbolic.svg',
+  'scalable/preferences-system-symbolic.svg',
+  'scalable/process-stop-symbolic.svg',
+  'scalable/system-run-symbolic.svg',
+  'scalable/view-fullscreen-symbolic.svg',
+  'scalable/view-refresh-symbolic.svg',
+  'scalable/window-close-symbolic.svg',
+  'scalable/window-new-symbolic.svg',
+  'scalable/zoom-fit-best-symbolic.svg',
+  'scalable/zoom-in-symbolic.svg',
+  'scalable/zoom-original-symbolic.svg',
+  'scalable/zoom-out-symbolic.svg',
+
+  'scalable/gtk-cancel-symbolic.svg',
+  'scalable/gtk-edit-symbolic.svg',
+  'scalable/gtk-no-symbolic.svg',
+  'scalable/gtk-ok-symbolic.svg',
+  'scalable/gtk-select-color-symbolic.svg',
+  'scalable/gtk-select-font-symbolic.svg',
+  'scalable/gtk-yes-symbolic.svg',
+
+  'scalable/gimp-anchor-symbolic.svg',
+  'scalable/gimp-attach-symbolic.svg',
+  'scalable/gimp-business-card-symbolic.svg',
+  'scalable/gimp-cap-butt-symbolic.svg',
+  'scalable/gimp-cap-round-symbolic.svg',
+  'scalable/gimp-cap-square-symbolic.svg',
+  'scalable/gimp-center-symbolic.svg',
+  'scalable/gimp-channel-alpha-symbolic.svg',
+  'scalable/gimp-channel-blue-symbolic.svg',
+  'scalable/gimp-channel-gray-symbolic.svg',
+  'scalable/gimp-channel-green-symbolic.svg',
+  'scalable/gimp-channel-indexed-symbolic.svg',
+  'scalable/gimp-channel-red-symbolic.svg',
+  'scalable/gimp-channel-symbolic.svg',
+  'scalable/gimp-channels-symbolic.svg',
+  'scalable/gimp-char-picker-symbolic.svg',
+  'scalable/gimp-clipboard-symbolic.svg',
+  'scalable/gimp-close-all-symbolic.svg',
+  'scalable/gimp-close-symbolic.svg',
+  'scalable/gimp-color-cmyk-symbolic.svg',
+  'scalable/gimp-color-pick-from-screen-symbolic.svg',
+  'scalable/gimp-color-picker-black-symbolic.svg',
+  'scalable/gimp-color-picker-gray-symbolic.svg',
+  'scalable/gimp-color-picker-white-symbolic.svg',
+  'scalable/gimp-color-space-linear-symbolic.svg',
+  'scalable/gimp-color-space-non-linear-symbolic.svg',
+  'scalable/gimp-color-space-perceptual-symbolic.svg',
+  'scalable/gimp-color-triangle-symbolic.svg',
+  'scalable/gimp-color-water-symbolic.svg',
+  'scalable/gimp-colormap-symbolic.svg',
+  'scalable/gimp-controller-keyboard-symbolic.svg',
+  'scalable/gimp-controller-linux-input-symbolic.svg',
+  'scalable/gimp-controller-midi-symbolic.svg',
+  'scalable/gimp-controller-symbolic.svg',
+  'scalable/gimp-controller-wheel-symbolic.svg',
+  'scalable/gimp-convert-grayscale-symbolic.svg',
+  'scalable/gimp-convert-indexed-symbolic.svg',
+  'scalable/gimp-convert-rgb-symbolic.svg',
+  'scalable/gimp-cursor-symbolic.svg',
+  'scalable/gimp-curve-free-symbolic.svg',
+  'scalable/gimp-curve-smooth-symbolic.svg',
+  'scalable/gimp-dashboard-symbolic.svg',
+  'scalable/gimp-default-colors-symbolic.svg',
+  'scalable/gimp-detach-symbolic.svg',
+  'scalable/gimp-device-status-symbolic.svg',
+  'scalable/gimp-display-filter-clip-warning-symbolic.svg',
+  'scalable/gimp-display-filter-colorblind-symbolic.svg',
+  'scalable/gimp-display-filter-contrast-symbolic.svg',
+  'scalable/gimp-display-filter-gamma-symbolic.svg',
+  'scalable/gimp-display-filter-lcms-symbolic.svg',
+  'scalable/gimp-display-filter-proof-symbolic.svg',
+  'scalable/gimp-display-filter-symbolic.svg',
+  'scalable/gimp-display-symbolic.svg',
+  'scalable/gimp-duplicate-symbolic.svg',
+  'scalable/gimp-dynamics-symbolic.svg',
+  'scalable/gimp-file-manager-symbolic.svg',
+  'scalable/gimp-floating-selection-symbolic.svg',
+  'scalable/gimp-gegl-symbolic.svg',
+  'scalable/gimp-gradient-bilinear-symbolic.svg',
+  'scalable/gimp-gradient-conical-asymmetric-symbolic.svg',
+  'scalable/gimp-gradient-conical-symmetric-symbolic.svg',
+  'scalable/gimp-gradient-linear-symbolic.svg',
+  'scalable/gimp-gradient-radial-symbolic.svg',
+  'scalable/gimp-gradient-shapeburst-angular-symbolic.svg',
+  'scalable/gimp-gradient-shapeburst-dimpled-symbolic.svg',
+  'scalable/gimp-gradient-shapeburst-spherical-symbolic.svg',
+  'scalable/gimp-gradient-spiral-anticlockwise-symbolic.svg',
+  'scalable/gimp-gradient-spiral-clockwise-symbolic.svg',
+  'scalable/gimp-gradient-square-symbolic.svg',
+  'scalable/gimp-gravity-east-symbolic.svg',
+  'scalable/gimp-gravity-north-east-symbolic.svg',
+  'scalable/gimp-gravity-north-symbolic.svg',
+  'scalable/gimp-gravity-north-west-symbolic.svg',
+  'scalable/gimp-gravity-south-east-symbolic.svg',
+  'scalable/gimp-gravity-south-symbolic.svg',
+  'scalable/gimp-gravity-south-west-symbolic.svg',
+  'scalable/gimp-gravity-west-symbolic.svg',
+  'scalable/gimp-grid-symbolic.svg',
+  'scalable/gimp-group-layer-symbolic.svg',
+  'scalable/gimp-hcenter-symbolic.svg',
+  'scalable/gimp-hchain-broken-symbolic.svg',
+  'scalable/gimp-hchain-symbolic.svg',
+  'scalable/gimp-hfill-symbolic.svg',
+  'scalable/gimp-histogram-linear-symbolic.svg',
+  'scalable/gimp-histogram-logarithmic-symbolic.svg',
+  'scalable/gimp-histogram-symbolic.svg',
+  'scalable/gimp-image-open-symbolic.svg',
+  'scalable/gimp-image-reload-symbolic.svg',
+  'scalable/gimp-image-symbolic.svg',
+  'scalable/gimp-images-symbolic.svg',
+  'scalable/gimp-input-device-symbolic.svg',
+  'scalable/gimp-invert-symbolic.svg',
+  'scalable/gimp-join-bevel-symbolic.svg',
+  'scalable/gimp-join-miter-symbolic.svg',
+  'scalable/gimp-join-round-symbolic.svg',
+  'scalable/gimp-landscape-symbolic.svg',
+  'scalable/gimp-layer-mask-symbolic.svg',
+  'scalable/gimp-layer-symbolic.svg',
+  'scalable/gimp-layer-to-imagesize-symbolic.svg',
+  'scalable/gimp-layers-symbolic.svg',
+  'scalable/gimp-letter-spacing-symbolic.svg',
+  'scalable/gimp-line-spacing-symbolic.svg',
+  'scalable/gimp-linked-symbolic.svg',
+  'scalable/gimp-list-symbolic.svg',
+  'scalable/gimp-menu-left-symbolic.svg',
+  'scalable/gimp-menu-right-symbolic.svg',
+  'scalable/gimp-merge-down-symbolic.svg',
+  'scalable/gimp-move-to-screen-symbolic.svg',
+  'scalable/gimp-navigation-symbolic.svg',
+  'scalable/gimp-paste-as-new-symbolic.svg',
+  'scalable/gimp-paste-into-symbolic.svg',
+  'scalable/gimp-path-stroke-symbolic.svg',
+  'scalable/gimp-path-symbolic.svg',
+  'scalable/gimp-paths-symbolic.svg',
+  'scalable/gimp-pattern-symbolic.svg',
+  'scalable/gimp-plugin-symbolic.svg',
+  'scalable/gimp-portrait-symbolic.svg',
+  'scalable/gimp-prefs-color-management-symbolic.svg',
+  'scalable/gimp-prefs-controllers-symbolic.svg',
+  'scalable/gimp-prefs-default-comment-symbolic.svg',
+  'scalable/gimp-prefs-default-grid-symbolic.svg',
+  'scalable/gimp-prefs-display-symbolic.svg',
+  'scalable/gimp-prefs-folders-brushes-symbolic.svg',
+  'scalable/gimp-prefs-folders-dynamics-symbolic.svg',
+  'scalable/gimp-prefs-folders-environ-symbolic.svg',
+  'scalable/gimp-prefs-folders-fonts-symbolic.svg',
+  'scalable/gimp-prefs-folders-gradients-symbolic.svg',
+  'scalable/gimp-prefs-folders-icon-themes-symbolic.svg',
+  'scalable/gimp-prefs-folders-interp-symbolic.svg',
+  'scalable/gimp-prefs-folders-modules-symbolic.svg',
+  'scalable/gimp-prefs-folders-mypaint-brushes-symbolic.svg',
+  'scalable/gimp-prefs-folders-palettes-symbolic.svg',
+  'scalable/gimp-prefs-folders-patterns-symbolic.svg',
+  'scalable/gimp-prefs-folders-plug-ins-symbolic.svg',
+  'scalable/gimp-prefs-folders-scripts-symbolic.svg',
+  'scalable/gimp-prefs-folders-symbolic.svg',
+  'scalable/gimp-prefs-folders-themes-symbolic.svg',
+  'scalable/gimp-prefs-folders-tool-plug-ins-symbolic.svg',
+  'scalable/gimp-prefs-folders-tool-presets-symbolic.svg',
+  'scalable/gimp-prefs-folders-tools-symbolic.svg',
+  'scalable/gimp-prefs-help-system-symbolic.svg',
+  'scalable/gimp-prefs-icon-theme-symbolic.svg',
+  'scalable/gimp-prefs-image-title-symbolic.svg',
+  'scalable/gimp-prefs-image-windows-appearance-symbolic.svg',
+  'scalable/gimp-prefs-image-windows-snapping-symbolic.svg',
+  'scalable/gimp-prefs-image-windows-symbolic.svg',
+  'scalable/gimp-prefs-import-export-symbolic.svg',
+  'scalable/gimp-prefs-input-devices-symbolic.svg',
+  'scalable/gimp-prefs-interface-symbolic.svg',
+  'scalable/gimp-prefs-new-image-symbolic.svg',
+  'scalable/gimp-prefs-playground-symbolic.svg',
+  'scalable/gimp-prefs-session-symbolic.svg',
+  'scalable/gimp-prefs-system-resources-symbolic.svg',
+  'scalable/gimp-prefs-theme-symbolic.svg',
+  'scalable/gimp-prefs-tool-options-symbolic.svg',
+  'scalable/gimp-prefs-toolbox-symbolic.svg',
+  'scalable/gimp-prefs-window-management-symbolic.svg',
+  'scalable/gimp-quick-mask-off-symbolic.svg',
+  'scalable/gimp-quick-mask-on-symbolic.svg',
+  'scalable/gimp-reset-symbolic.svg',
+  'scalable/gimp-reshow-filter-symbolic.svg',
+  'scalable/gimp-resize-symbolic.svg',
+  'scalable/gimp-rotate-180-symbolic.svg',
+  'scalable/gimp-sample-point-symbolic.svg',
+  'scalable/gimp-scale-symbolic.svg',
+  'scalable/gimp-selection-add-symbolic.svg',
+  'scalable/gimp-selection-all-symbolic.svg',
+  'scalable/gimp-selection-border-symbolic.svg',
+  'scalable/gimp-selection-grow-symbolic.svg',
+  'scalable/gimp-selection-intersect-symbolic.svg',
+  'scalable/gimp-selection-none-symbolic.svg',
+  'scalable/gimp-selection-replace-symbolic.svg',
+  'scalable/gimp-selection-shrink-symbolic.svg',
+  'scalable/gimp-selection-stroke-symbolic.svg',
+  'scalable/gimp-selection-subtract-symbolic.svg',
+  'scalable/gimp-selection-symbolic.svg',
+  'scalable/gimp-selection-to-channel-symbolic.svg',
+  'scalable/gimp-selection-to-path-symbolic.svg',
+  'scalable/gimp-shape-circle-symbolic.svg',
+  'scalable/gimp-shape-diamond-symbolic.svg',
+  'scalable/gimp-shape-square-symbolic.svg',
+  'scalable/gimp-shred-symbolic.svg',
+  'scalable/gimp-smartphone-symbolic.svg',
+  'scalable/gimp-swap-colors-symbolic.svg',
+  'scalable/gimp-symmetry-symbolic.svg',
+  'scalable/gimp-template-symbolic.svg',
+  'scalable/gimp-text-dir-ttb-ltr-symbolic.svg',
+  'scalable/gimp-text-dir-ttb-ltr-upright-symbolic.svg',
+  'scalable/gimp-text-dir-ttb-rtl-symbolic.svg',
+  'scalable/gimp-text-dir-ttb-rtl-upright-symbolic.svg',
+  'scalable/gimp-text-layer-symbolic.svg',
+  'scalable/gimp-toilet-paper-symbolic.svg',
+  'scalable/gimp-tool-airbrush-symbolic.svg',
+  'scalable/gimp-tool-align-symbolic.svg',
+  'scalable/gimp-tool-blur-symbolic.svg',
+  'scalable/gimp-tool-brightness-contrast-symbolic.svg',
+  'scalable/gimp-tool-bucket-fill-symbolic.svg',
+  'scalable/gimp-tool-by-color-select-symbolic.svg',
+  'scalable/gimp-tool-cage-symbolic.svg',
+  'scalable/gimp-tool-clone-symbolic.svg',
+  'scalable/gimp-tool-color-balance-symbolic.svg',
+  'scalable/gimp-tool-color-picker-symbolic.svg',
+  'scalable/gimp-tool-color-temperature-symbolic.svg',
+  'scalable/gimp-tool-colorize-symbolic.svg',
+  'scalable/gimp-tool-crop-symbolic.svg',
+  'scalable/gimp-tool-curves-symbolic.svg',
+  'scalable/gimp-tool-desaturate-symbolic.svg',
+  'scalable/gimp-tool-dodge-symbolic.svg',
+  'scalable/gimp-tool-ellipse-select-symbolic.svg',
+  'scalable/gimp-tool-eraser-symbolic.svg',
+  'scalable/gimp-tool-exposure-symbolic.svg',
+  'scalable/gimp-tool-flip-symbolic.svg',
+  'scalable/gimp-tool-foreground-select-symbolic.svg',
+  'scalable/gimp-tool-free-select-symbolic.svg',
+  'scalable/gimp-tool-fuzzy-select-symbolic.svg',
+  'scalable/gimp-tool-gradient-symbolic.svg',
+  'scalable/gimp-tool-handle-transform-symbolic.svg',
+  'scalable/gimp-tool-heal-symbolic.svg',
+  'scalable/gimp-tool-hue-saturation-symbolic.svg',
+  'scalable/gimp-tool-ink-symbolic.svg',
+  'scalable/gimp-tool-iscissors-symbolic.svg',
+  'scalable/gimp-tool-levels-symbolic.svg',
+  'scalable/gimp-tool-measure-symbolic.svg',
+  'scalable/gimp-tool-move-symbolic.svg',
+  'scalable/gimp-tool-mypaint-brush-symbolic.svg',
+  'scalable/gimp-tool-n-point-deformation-symbolic.svg',
+  'scalable/gimp-tool-offset-symbolic.svg',
+  'scalable/gimp-tool-options-symbolic.svg',
+  'scalable/gimp-tool-paintbrush-symbolic.svg',
+  'scalable/gimp-tool-path-symbolic.svg',
+  'scalable/gimp-tool-pencil-symbolic.svg',
+  'scalable/gimp-tool-perspective-clone-symbolic.svg',
+  'scalable/gimp-tool-perspective-symbolic.svg',
+  'scalable/gimp-tool-posterize-symbolic.svg',
+  'scalable/gimp-tool-preset-symbolic.svg',
+  'scalable/gimp-tool-rect-select-symbolic.svg',
+  'scalable/gimp-tool-rotate-symbolic.svg',
+  'scalable/gimp-tool-scale-symbolic.svg',
+  'scalable/gimp-tool-seamless-clone-symbolic.svg',
+  'scalable/gimp-tool-shadows-highlights-symbolic.svg',
+  'scalable/gimp-tool-shear-symbolic.svg',
+  'scalable/gimp-tool-smudge-symbolic.svg',
+  'scalable/gimp-tool-text-symbolic.svg',
+  'scalable/gimp-tool-threshold-symbolic.svg',
+  'scalable/gimp-tool-unified-transform-symbolic.svg',
+  'scalable/gimp-tool-warp-symbolic.svg',
+  'scalable/gimp-tool-zoom-symbolic.svg',
+  'scalable/gimp-tools-symbolic.svg',
+  'scalable/gimp-transparency-symbolic.svg',
+  'scalable/gimp-undo-history-symbolic.svg',
+  'scalable/gimp-user-manual-symbolic.svg',
+  'scalable/gimp-vcenter-symbolic.svg',
+  'scalable/gimp-vchain-broken-symbolic.svg',
+  'scalable/gimp-vchain-symbolic.svg',
+  'scalable/gimp-vfill-symbolic.svg',
+  'scalable/gimp-video-symbolic.svg',
+  'scalable/gimp-visible-symbolic.svg',
+  'scalable/gimp-web-symbolic.svg',
+  'scalable/gimp-wilber-eek-symbolic.svg',
+  'scalable/gimp-wilber-outline-symbolic.svg',
+  'scalable/gimp-wilber-symbolic.svg',
+  'scalable/gimp-zoom-follow-window-symbolic.svg',
+]
+symbolic_vector_24 = [
+  '24/dialog-error-symbolic.svg',
+  '24/dialog-information-symbolic.svg',
+  '24/dialog-question-symbolic.svg',
+  '24/dialog-warning-symbolic.svg',
+  '24/document-print-symbolic.svg',
+  '24/media-floppy-symbolic.svg',
+  '24/media-optical-symbolic.svg',
+
+  '24/gtk-select-color-symbolic.svg',
+
+  '24/gimp-business-card-symbolic.svg',
+  '24/gimp-center-symbolic.svg',
+  '24/gimp-channel-alpha-symbolic.svg',
+  '24/gimp-channel-blue-symbolic.svg',
+  '24/gimp-channel-gray-symbolic.svg',
+  '24/gimp-channel-green-symbolic.svg',
+  '24/gimp-channel-indexed-symbolic.svg',
+  '24/gimp-channel-red-symbolic.svg',
+  '24/gimp-channel-symbolic.svg',
+  '24/gimp-channels-symbolic.svg',
+  '24/gimp-char-picker-symbolic.svg',
+  '24/gimp-color-space-linear-symbolic.svg',
+  '24/gimp-color-space-non-linear-symbolic.svg',
+  '24/gimp-color-space-perceptual-symbolic.svg',
+  '24/gimp-colormap-symbolic.svg',
+  '24/gimp-controller-keyboard-symbolic.svg',
+  '24/gimp-controller-linux-input-symbolic.svg',
+  '24/gimp-controller-midi-symbolic.svg',
+  '24/gimp-controller-symbolic.svg',
+  '24/gimp-controller-wheel-symbolic.svg',
+  '24/gimp-cursor-symbolic.svg',
+  '24/gimp-device-status-symbolic.svg',
+  '24/gimp-display-filter-clip-warning-symbolic.svg',
+  '24/gimp-display-filter-colorblind-symbolic.svg',
+  '24/gimp-display-filter-contrast-symbolic.svg',
+  '24/gimp-display-filter-gamma-symbolic.svg',
+  '24/gimp-display-filter-lcms-symbolic.svg',
+  '24/gimp-display-filter-proof-symbolic.svg',
+  '24/gimp-display-filter-symbolic.svg',
+  '24/gimp-display-symbolic.svg',
+  '24/gimp-dynamics-symbolic.svg',
+  '24/gimp-floating-selection-symbolic.svg',
+  '24/gimp-gegl-symbolic.svg',
+  '24/gimp-grid-symbolic.svg',
+  '24/gimp-histogram-symbolic.svg',
+  '24/gimp-image-symbolic.svg',
+  '24/gimp-images-symbolic.svg',
+  '24/gimp-landscape-symbolic.svg',
+  '24/gimp-layer-mask-symbolic.svg',
+  '24/gimp-layer-symbolic.svg',
+  '24/gimp-layers-symbolic.svg',
+  '24/gimp-letter-spacing-symbolic.svg',
+  '24/gimp-line-spacing-symbolic.svg',
+  '24/gimp-move-to-screen-symbolic.svg',
+  '24/gimp-navigation-symbolic.svg',
+  '24/gimp-path-symbolic.svg',
+  '24/gimp-paths-symbolic.svg',
+  '24/gimp-portrait-symbolic.svg',
+  '24/gimp-prefs-color-management-symbolic.svg',
+  '24/gimp-prefs-controllers-symbolic.svg',
+  '24/gimp-prefs-default-comment-symbolic.svg',
+  '24/gimp-prefs-default-grid-symbolic.svg',
+  '24/gimp-prefs-display-symbolic.svg',
+  '24/gimp-prefs-folders-brushes-symbolic.svg',
+  '24/gimp-prefs-folders-dynamics-symbolic.svg',
+  '24/gimp-prefs-folders-environ-symbolic.svg',
+  '24/gimp-prefs-folders-fonts-symbolic.svg',
+  '24/gimp-prefs-folders-gradients-symbolic.svg',
+  '24/gimp-prefs-folders-icon-themes-symbolic.svg',
+  '24/gimp-prefs-folders-interp-symbolic.svg',
+  '24/gimp-prefs-folders-modules-symbolic.svg',
+  '24/gimp-prefs-folders-mypaint-brushes-symbolic.svg',
+  '24/gimp-prefs-folders-palettes-symbolic.svg',
+  '24/gimp-prefs-folders-patterns-symbolic.svg',
+  '24/gimp-prefs-folders-plug-ins-symbolic.svg',
+  '24/gimp-prefs-folders-scripts-symbolic.svg',
+  '24/gimp-prefs-folders-symbolic.svg',
+  '24/gimp-prefs-folders-themes-symbolic.svg',
+  '24/gimp-prefs-folders-tool-plug-ins-symbolic.svg',
+  '24/gimp-prefs-folders-tool-presets-symbolic.svg',
+  '24/gimp-prefs-folders-tools-symbolic.svg',
+  '24/gimp-prefs-help-system-symbolic.svg',
+  '24/gimp-prefs-icon-theme-symbolic.svg',
+  '24/gimp-prefs-image-title-symbolic.svg',
+  '24/gimp-prefs-image-windows-appearance-symbolic.svg',
+  '24/gimp-prefs-image-windows-snapping-symbolic.svg',
+  '24/gimp-prefs-image-windows-symbolic.svg',
+  '24/gimp-prefs-import-export-symbolic.svg',
+  '24/gimp-prefs-input-devices-symbolic.svg',
+  '24/gimp-prefs-interface-symbolic.svg',
+  '24/gimp-prefs-new-image-symbolic.svg',
+  '24/gimp-prefs-playground-symbolic.svg',
+  '24/gimp-prefs-session-symbolic.svg',
+  '24/gimp-prefs-system-resources-symbolic.svg',
+  '24/gimp-prefs-theme-symbolic.svg',
+  '24/gimp-prefs-tool-options-symbolic.svg',
+  '24/gimp-prefs-toolbox-symbolic.svg',
+  '24/gimp-prefs-window-management-symbolic.svg',
+  '24/gimp-resize-symbolic.svg',
+  '24/gimp-sample-point-symbolic.svg',
+  '24/gimp-scale-symbolic.svg',
+  '24/gimp-selection-symbolic.svg',
+  '24/gimp-smartphone-symbolic.svg',
+  '24/gimp-symmetry-symbolic.svg',
+  '24/gimp-template-symbolic.svg',
+  '24/gimp-text-layer-symbolic.svg',
+  '24/gimp-tool-airbrush-symbolic.svg',
+  '24/gimp-tool-align-symbolic.svg',
+  '24/gimp-tool-blur-symbolic.svg',
+  '24/gimp-tool-brightness-contrast-symbolic.svg',
+  '24/gimp-tool-bucket-fill-symbolic.svg',
+  '24/gimp-tool-by-color-select-symbolic.svg',
+  '24/gimp-tool-cage-symbolic.svg',
+  '24/gimp-tool-clone-symbolic.svg',
+  '24/gimp-tool-color-balance-symbolic.svg',
+  '24/gimp-tool-color-picker-symbolic.svg',
+  '24/gimp-tool-colorize-symbolic.svg',
+  '24/gimp-tool-crop-symbolic.svg',
+  '24/gimp-tool-curves-symbolic.svg',
+  '24/gimp-tool-desaturate-symbolic.svg',
+  '24/gimp-tool-dodge-symbolic.svg',
+  '24/gimp-tool-ellipse-select-symbolic.svg',
+  '24/gimp-tool-eraser-symbolic.svg',
+  '24/gimp-tool-exposure-symbolic.svg',
+  '24/gimp-tool-flip-symbolic.svg',
+  '24/gimp-tool-foreground-select-symbolic.svg',
+  '24/gimp-tool-free-select-symbolic.svg',
+  '24/gimp-tool-fuzzy-select-symbolic.svg',
+  '24/gimp-tool-gradient-symbolic.svg',
+  '24/gimp-tool-handle-transform-symbolic.svg',
+  '24/gimp-tool-heal-symbolic.svg',
+  '24/gimp-tool-hue-saturation-symbolic.svg',
+  '24/gimp-tool-ink-symbolic.svg',
+  '24/gimp-tool-iscissors-symbolic.svg',
+  '24/gimp-tool-levels-symbolic.svg',
+  '24/gimp-tool-measure-symbolic.svg',
+  '24/gimp-tool-mypaint-brush-symbolic.svg',
+  '24/gimp-tool-n-point-deformation-symbolic.svg',
+  '24/gimp-tool-offset-symbolic.svg',
+  '24/gimp-tool-options-symbolic.svg',
+  '24/gimp-tool-paintbrush-symbolic.svg',
+  '24/gimp-tool-path-symbolic.svg',
+  '24/gimp-tool-pencil-symbolic.svg',
+  '24/gimp-tool-perspective-clone-symbolic.svg',
+  '24/gimp-tool-perspective-symbolic.svg',
+  '24/gimp-tool-posterize-symbolic.svg',
+  '24/gimp-tool-preset-symbolic.svg',
+  '24/gimp-tool-rect-select-symbolic.svg',
+  '24/gimp-tool-rotate-symbolic.svg',
+  '24/gimp-tool-scale-symbolic.svg',
+  '24/gimp-tool-seamless-clone-symbolic.svg',
+  '24/gimp-tool-shadows-highlights-symbolic.svg',
+  '24/gimp-tool-shear-symbolic.svg',
+  '24/gimp-tool-smudge-symbolic.svg',
+  '24/gimp-tool-text-symbolic.svg',
+  '24/gimp-tool-threshold-symbolic.svg',
+  '24/gimp-tool-unified-transform-symbolic.svg',
+  '24/gimp-tool-warp-symbolic.svg',
+  '24/gimp-tool-zoom-symbolic.svg',
+  '24/gimp-tools-symbolic.svg',
+  '24/gimp-transparency-symbolic.svg',
+  '24/gimp-undo-history-symbolic.svg',
+  '24/gimp-user-manual-symbolic.svg',
+  '24/gimp-video-symbolic.svg',
+  '24/gimp-web-symbolic.svg',
+  '24/gimp-wilber-symbolic.svg',
+]
+
+bitmap_12 = [
+  '12/gimp-attach.png',
+  '12/gimp-close.png',
+  '12/gimp-default-colors.png',
+  '12/gimp-detach.png',
+  '12/gimp-linked.png',
+  '12/gimp-menu-left.png',
+  '12/gimp-menu-right.png',
+  '12/gimp-quick-mask-off.png',
+  '12/gimp-quick-mask-on.png',
+  '12/gimp-swap-colors.png',
+  '12/gimp-visible.png',
+  '12/gimp-zoom-follow-window.png',
+]
+bitmap_16 = [
+  '16/dialog-information.png',
+  '16/document-new.png',
+  '16/document-open-recent.png',
+  '16/document-open.png',
+  '16/document-print.png',
+  '16/document-revert.png',
+  '16/document-save-as.png',
+  '16/document-save.png',
+  '16/edit-clear.png',
+  '16/edit-copy.png',
+  '16/edit-cut.png',
+  '16/edit-delete.png',
+  '16/edit-paste.png',
+  '16/edit-redo.png',
+  '16/edit-undo.png',
+  '16/folder-new.png',
+  '16/folder.png',
+  '16/gimp-anchor.png',
+  '16/gimp-business-card.png',
+  '16/gimp-cap-butt.png',
+  '16/gimp-cap-round.png',
+  '16/gimp-cap-square.png',
+  '16/gimp-center.png',
+  '16/gimp-channel-alpha.png',
+  '16/gimp-channel-blue.png',
+  '16/gimp-channel-gray.png',
+  '16/gimp-channel-green.png',
+  '16/gimp-channel-indexed.png',
+  '16/gimp-channel-red.png',
+  '16/gimp-channel.png',
+  '16/gimp-channels.png',
+  '16/gimp-char-picker.png',
+  '16/gimp-clipboard.png',
+  '16/gimp-close-all.png',
+  '16/gimp-color-cmyk.png',
+  '16/gimp-color-pick-from-screen.png',
+  '16/gimp-color-space-linear.png',
+  '16/gimp-color-space-perceptual.png',
+  '16/gimp-color-triangle.png',
+  '16/gimp-color-water.png',
+  '16/gimp-colormap.png',
+  '16/gimp-controller-keyboard.png',
+  '16/gimp-controller-linux-input.png',
+  '16/gimp-controller-midi.png',
+  '16/gimp-controller-wheel.png',
+  '16/gimp-controller.png',
+  '16/gimp-convert-grayscale.png',
+  '16/gimp-convert-indexed.png',
+  '16/gimp-convert-rgb.png',
+  '16/gimp-cursor.png',
+  '16/gimp-curve-free.png',
+  '16/gimp-curve-smooth.png',
+  '16/gimp-dashboard.png',
+  '16/gimp-device-status.png',
+  '16/gimp-display-filter-clip-warning.png',
+  '16/gimp-display-filter-colorblind.png',
+  '16/gimp-display-filter-contrast.png',
+  '16/gimp-display-filter-gamma.png',
+  '16/gimp-display-filter-lcms.png',
+  '16/gimp-display-filter-proof.png',
+  '16/gimp-display-filter.png',
+  '16/gimp-display.png',
+  '16/gimp-duplicate.png',
+  '16/gimp-dynamics.png',
+  '16/gimp-error.png',
+  '16/gimp-file-manager.png',
+  '16/gimp-flip-horizontal.png',
+  '16/gimp-flip-vertical.png',
+  '16/gimp-floating-selection.png',
+  '16/gimp-gegl.png',
+  '16/gimp-gradient-bilinear.png',
+  '16/gimp-gradient-conical-asymmetric.png',
+  '16/gimp-gradient-conical-symmetric.png',
+  '16/gimp-gradient-linear.png',
+  '16/gimp-gradient-radial.png',
+  '16/gimp-gradient-shapeburst-angular.png',
+  '16/gimp-gradient-shapeburst-dimpled.png',
+  '16/gimp-gradient-shapeburst-spherical.png',
+  '16/gimp-gradient-spiral-anticlockwise.png',
+  '16/gimp-gradient-spiral-clockwise.png',
+  '16/gimp-gradient-square.png',
+  '16/gimp-grid.png',
+  '16/gimp-group-layer.png',
+  '16/gimp-histogram-linear.png',
+  '16/gimp-histogram-logarithmic.png',
+  '16/gimp-histogram.png',
+  '16/gimp-image-open.png',
+  '16/gimp-image-reload.png',
+  '16/gimp-image.png',
+  '16/gimp-images.png',
+  '16/gimp-info.png',
+  '16/gimp-input-device.png',
+  '16/gimp-invert.png',
+  '16/gimp-join-bevel.png',
+  '16/gimp-join-miter.png',
+  '16/gimp-join-round.png',
+  '16/gimp-landscape.png',
+  '16/gimp-layer-mask.png',
+  '16/gimp-layer-to-imagesize.png',
+  '16/gimp-layer.png',
+  '16/gimp-layers.png',
+  '16/gimp-list.png',
+  '16/gimp-merge-down.png',
+  '16/gimp-move-to-screen.png',
+  '16/gimp-navigation.png',
+  '16/gimp-paste-as-new.png',
+  '16/gimp-paste-into.png',
+  '16/gimp-path-stroke.png',
+  '16/gimp-path.png',
+  '16/gimp-paths.png',
+  '16/gimp-pattern.png',
+  '16/gimp-plugin.png',
+  '16/gimp-portrait.png',
+  '16/gimp-prefs-folders-brushes.png',
+  '16/gimp-prefs-folders-dynamics.png',
+  '16/gimp-prefs-folders-environ.png',
+  '16/gimp-prefs-folders-fonts.png',
+  '16/gimp-prefs-folders-gradients.png',
+  '16/gimp-prefs-folders-icon-themes.png',
+  '16/gimp-prefs-folders-interp.png',
+  '16/gimp-prefs-folders-modules.png',
+  '16/gimp-prefs-folders-mypaint-brushes.png',
+  '16/gimp-prefs-folders-palettes.png',
+  '16/gimp-prefs-folders-patterns.png',
+  '16/gimp-prefs-folders-plug-ins.png',
+  '16/gimp-prefs-folders-scripts.png',
+  '16/gimp-prefs-folders-themes.png',
+  '16/gimp-prefs-folders-tool-plug-ins.png',
+  '16/gimp-prefs-folders-tool-presets.png',
+  '16/gimp-prefs-folders-tools.png',
+  '16/gimp-prefs-icon-theme.png',
+  '16/gimp-prefs-image-windows.png',
+  '16/gimp-prefs-import-export.png',
+  '16/gimp-prefs-interface.png',
+  '16/gimp-prefs-theme.png',
+  '16/gimp-prefs-toolbox.png',
+  '16/gimp-prefs-window-management.png',
+  '16/gimp-question.png',
+  '16/gimp-reset.png',
+  '16/gimp-reshow-filter.png',
+  '16/gimp-resize.png',
+  '16/gimp-rotate-180.png',
+  '16/gimp-rotate-270.png',
+  '16/gimp-rotate-90.png',
+  '16/gimp-sample-point.png',
+  '16/gimp-scale.png',
+  '16/gimp-selection-add.png',
+  '16/gimp-selection-all.png',
+  '16/gimp-selection-border.png',
+  '16/gimp-selection-grow.png',
+  '16/gimp-selection-intersect.png',
+  '16/gimp-selection-none.png',
+  '16/gimp-selection-replace.png',
+  '16/gimp-selection-shrink.png',
+  '16/gimp-selection-stroke.png',
+  '16/gimp-selection-subtract.png',
+  '16/gimp-selection-to-channel.png',
+  '16/gimp-selection-to-path.png',
+  '16/gimp-selection.png',
+  '16/gimp-shape-circle.png',
+  '16/gimp-shape-diamond.png',
+  '16/gimp-shape-square.png',
+  '16/gimp-shred.png',
+  '16/gimp-smartphone.png',
+  '16/gimp-symmetry.png',
+  '16/gimp-template.png',
+  '16/gimp-text-layer.png',
+  '16/gimp-toilet-paper.png',
+  '16/gimp-tool-airbrush.png',
+  '16/gimp-tool-align.png',
+  '16/gimp-tool-blur.png',
+  '16/gimp-tool-brightness-contrast.png',
+  '16/gimp-tool-bucket-fill.png',
+  '16/gimp-tool-by-color-select.png',
+  '16/gimp-tool-cage.png',
+  '16/gimp-tool-clone.png',
+  '16/gimp-tool-color-balance.png',
+  '16/gimp-tool-color-picker.png',
+  '16/gimp-tool-color-temperature.png',
+  '16/gimp-tool-colorize.png',
+  '16/gimp-tool-crop.png',
+  '16/gimp-tool-curves.png',
+  '16/gimp-tool-desaturate.png',
+  '16/gimp-tool-dodge.png',
+  '16/gimp-tool-ellipse-select.png',
+  '16/gimp-tool-eraser.png',
+  '16/gimp-tool-exposure.png',
+  '16/gimp-tool-flip.png',
+  '16/gimp-tool-foreground-select.png',
+  '16/gimp-tool-free-select.png',
+  '16/gimp-tool-fuzzy-select.png',
+  '16/gimp-tool-gradient.png',
+  '16/gimp-tool-handle-transform.png',
+  '16/gimp-tool-heal.png',
+  '16/gimp-tool-hue-saturation.png',
+  '16/gimp-tool-ink.png',
+  '16/gimp-tool-iscissors.png',
+  '16/gimp-tool-levels.png',
+  '16/gimp-tool-measure.png',
+  '16/gimp-tool-move.png',
+  '16/gimp-tool-mypaint-brush.png',
+  '16/gimp-tool-n-point-deformation.png',
+  '16/gimp-tool-options.png',
+  '16/gimp-tool-paintbrush.png',
+  '16/gimp-tool-path.png',
+  '16/gimp-tool-pencil.png',
+  '16/gimp-tool-perspective-clone.png',
+  '16/gimp-tool-perspective.png',
+  '16/gimp-tool-posterize.png',
+  '16/gimp-tool-preset.png',
+  '16/gimp-tool-rect-select.png',
+  '16/gimp-tool-rotate.png',
+  '16/gimp-tool-scale.png',
+  '16/gimp-tool-seamless-clone.png',
+  '16/gimp-tool-shadows-highlights.png',
+  '16/gimp-tool-shear.png',
+  '16/gimp-tool-smudge.png',
+  '16/gimp-tool-text.png',
+  '16/gimp-tool-threshold.png',
+  '16/gimp-tool-unified-transform.png',
+  '16/gimp-tool-warp.png',
+  '16/gimp-tool-zoom.png',
+  '16/gimp-tools.png',
+  '16/gimp-transparency.png',
+  '16/gimp-undo-history.png',
+  '16/gimp-user-manual.png',
+  '16/gimp-video.png',
+  '16/gimp-warning.png',
+  '16/gimp-web.png',
+  '16/gimp-wilber.png',
+  '16/go-bottom.png',
+  '16/go-down.png',
+  '16/go-first.png',
+  '16/go-home.png',
+  '16/go-last.png',
+  '16/go-next.png',
+  '16/go-previous.png',
+  '16/go-top.png',
+  '16/go-up.png',
+  '16/gtk-cancel.png',
+  '16/gtk-edit.png',
+  '16/gtk-no.png',
+  '16/gtk-ok.png',
+  '16/gtk-select-color.png',
+  '16/gtk-select-font.png',
+  '16/gtk-yes.png',
+  '16/help-about.png',
+  '16/list-add.png',
+  '16/list-remove.png',
+  '16/media-floppy.png',
+  '16/media-optical.png',
+  '16/media-playback-pause.png',
+  '16/media-playback-start.png',
+  '16/media-seek-backward.png',
+  '16/media-skip-backward.png',
+  '16/media-skip-forward.png',
+  '16/preferences-system.png',
+  '16/process-stop.png',
+  '16/system-run.png',
+  '16/view-fullscreen.png',
+  '16/view-refresh.png',
+  '16/window-close.png',
+  '16/window-new.png',
+  '16/zoom-fit-best.png',
+  '16/zoom-in.png',
+  '16/zoom-original.png',
+  '16/zoom-out.png',
+]
+bitmap_18 = [
+  '18/gimp-color-picker-black.png',
+  '18/gimp-color-picker-gray.png',
+  '18/gimp-color-picker-white.png',
+]
+bitmap_20 = [
+  '20/gimp-linked.png',
+  '20/gimp-visible.png',
+]
+bitmap_22 = [
+  '22/folder.png',
+  '22/format-indent-more.png',
+  '22/format-justify-center.png',
+  '22/format-justify-fill.png',
+  '22/format-justify-left.png',
+  '22/format-justify-right.png',
+  '22/gimp-char-picker.png',
+  '22/gimp-dynamics.png',
+  '22/gimp-histogram.png',
+  '22/gimp-input-device.png',
+  '22/gimp-landscape.png',
+  '22/gimp-letter-spacing.png',
+  '22/gimp-line-spacing.png',
+  '22/gimp-path.png',
+  '22/gimp-paths.png',
+  '22/gimp-portrait.png',
+  '22/gimp-prefs-color-management.png',
+  '22/gimp-prefs-controllers.png',
+  '22/gimp-prefs-default-grid.png',
+  '22/gimp-prefs-display.png',
+  '22/gimp-prefs-folders-brushes.png',
+  '22/gimp-prefs-folders-dynamics.png',
+  '22/gimp-prefs-folders-environ.png',
+  '22/gimp-prefs-folders-fonts.png',
+  '22/gimp-prefs-folders-gradients.png',
+  '22/gimp-prefs-folders-icon-themes.png',
+  '22/gimp-prefs-folders-interp.png',
+  '22/gimp-prefs-folders-modules.png',
+  '22/gimp-prefs-folders-mypaint-brushes.png',
+  '22/gimp-prefs-folders-palettes.png',
+  '22/gimp-prefs-folders-patterns.png',
+  '22/gimp-prefs-folders-plug-ins.png',
+  '22/gimp-prefs-folders-scripts.png',
+  '22/gimp-prefs-folders-themes.png',
+  '22/gimp-prefs-folders-tool-plug-ins.png',
+  '22/gimp-prefs-folders-tool-presets.png',
+  '22/gimp-prefs-folders-tools.png',
+  '22/gimp-prefs-folders.png',
+  '22/gimp-prefs-help-system.png',
+  '22/gimp-prefs-icon-theme.png',
+  '22/gimp-prefs-image-title.png',
+  '22/gimp-prefs-image-windows-appearance.png',
+  '22/gimp-prefs-image-windows-snapping.png',
+  '22/gimp-prefs-image-windows.png',
+  '22/gimp-prefs-import-export.png',
+  '22/gimp-prefs-input-devices.png',
+  '22/gimp-prefs-interface.png',
+  '22/gimp-prefs-new-image.png',
+  '22/gimp-prefs-playground.png',
+  '22/gimp-prefs-session.png',
+  '22/gimp-prefs-system-resources.png',
+  '22/gimp-prefs-theme.png',
+  '22/gimp-prefs-tool-options.png',
+  '22/gimp-prefs-toolbox.png',
+  '22/gimp-prefs-window-management.png',
+  '22/gimp-tool-preset.png',
+  '22/gimp-wilber.png',
+]
+bitmap_24 = [
+  '24/dialog-information.png',
+  '24/document-print.png',
+  '24/gimp-attach.png',
+  '24/gimp-business-card.png',
+  '24/gimp-center.png',
+  '24/gimp-channel-alpha.png',
+  '24/gimp-channel-blue.png',
+  '24/gimp-channel-gray.png',
+  '24/gimp-channel-green.png',
+  '24/gimp-channel-indexed.png',
+  '24/gimp-channel-red.png',
+  '24/gimp-channel.png',
+  '24/gimp-channels.png',
+  '24/gimp-colormap.png',
+  '24/gimp-controller-keyboard.png',
+  '24/gimp-controller-linux-input.png',
+  '24/gimp-controller-midi.png',
+  '24/gimp-controller-wheel.png',
+  '24/gimp-controller.png',
+  '24/gimp-cursor.png',
+  '24/gimp-detach.png',
+  '24/gimp-device-status.png',
+  '24/gimp-display-filter-colorblind.png',
+  '24/gimp-display-filter-contrast.png',
+  '24/gimp-display-filter-gamma.png',
+  '24/gimp-display-filter-lcms.png',
+  '24/gimp-display-filter-proof.png',
+  '24/gimp-display-filter.png',
+  '24/gimp-display.png',
+  '24/gimp-error.png',
+  '24/gimp-floating-selection.png',
+  '24/gimp-gegl.png',
+  '24/gimp-gravity-east.png',
+  '24/gimp-gravity-north-east.png',
+  '24/gimp-gravity-north-west.png',
+  '24/gimp-gravity-north.png',
+  '24/gimp-gravity-south-east.png',
+  '24/gimp-gravity-south-west.png',
+  '24/gimp-gravity-south.png',
+  '24/gimp-gravity-west.png',
+  '24/gimp-grid.png',
+  '24/gimp-hcenter.png',
+  '24/gimp-hchain-broken.png',
+  '24/gimp-hchain.png',
+  '24/gimp-hfill.png',
+  '24/gimp-image.png',
+  '24/gimp-images.png',
+  '24/gimp-info.png',
+  '24/gimp-layer-mask.png',
+  '24/gimp-layer.png',
+  '24/gimp-layers.png',
+  '24/gimp-move-to-screen.png',
+  '24/gimp-navigation.png',
+  '24/gimp-question.png',
+  '24/gimp-resize.png',
+  '24/gimp-sample-point.png',
+  '24/gimp-scale.png',
+  '24/gimp-selection.png',
+  '24/gimp-smartphone.png',
+  '24/gimp-symmetry.png',
+  '24/gimp-template.png',
+  '24/gimp-text-dir-ltr.png',
+  '24/gimp-text-dir-rtl.png',
+  '24/gimp-text-layer.png',
+  '24/gimp-toilet-paper.png',
+  '24/gimp-tool-airbrush.png',
+  '24/gimp-tool-align.png',
+  '24/gimp-tool-blur.png',
+  '24/gimp-tool-brightness-contrast.png',
+  '24/gimp-tool-bucket-fill.png',
+  '24/gimp-tool-by-color-select.png',
+  '24/gimp-tool-cage.png',
+  '24/gimp-tool-clone.png',
+  '24/gimp-tool-color-balance.png',
+  '24/gimp-tool-color-picker.png',
+  '24/gimp-tool-colorize.png',
+  '24/gimp-tool-crop.png',
+  '24/gimp-tool-curves.png',
+  '24/gimp-tool-desaturate.png',
+  '24/gimp-tool-dodge.png',
+  '24/gimp-tool-ellipse-select.png',
+  '24/gimp-tool-eraser.png',
+  '24/gimp-tool-flip.png',
+  '24/gimp-tool-foreground-select.png',
+  '24/gimp-tool-free-select.png',
+  '24/gimp-tool-fuzzy-select.png',
+  '24/gimp-tool-gradient.png',
+  '24/gimp-tool-handle-transform.png',
+  '24/gimp-tool-heal.png',
+  '24/gimp-tool-hue-saturation.png',
+  '24/gimp-tool-ink.png',
+  '24/gimp-tool-iscissors.png',
+  '24/gimp-tool-levels.png',
+  '24/gimp-tool-measure.png',
+  '24/gimp-tool-move.png',
+  '24/gimp-tool-mypaint-brush.png',
+  '24/gimp-tool-n-point-deformation.png',
+  '24/gimp-tool-options.png',
+  '24/gimp-tool-paintbrush.png',
+  '24/gimp-tool-path.png',
+  '24/gimp-tool-pencil.png',
+  '24/gimp-tool-perspective-clone.png',
+  '24/gimp-tool-perspective.png',
+  '24/gimp-tool-posterize.png',
+  '24/gimp-tool-preset.png',
+  '24/gimp-tool-rect-select.png',
+  '24/gimp-tool-rotate.png',
+  '24/gimp-tool-scale.png',
+  '24/gimp-tool-seamless-clone.png',
+  '24/gimp-tool-shear.png',
+  '24/gimp-tool-smudge.png',
+  '24/gimp-tool-text.png',
+  '24/gimp-tool-threshold.png',
+  '24/gimp-tool-unified-transform.png',
+  '24/gimp-tool-warp.png',
+  '24/gimp-tool-zoom.png',
+  '24/gimp-tools.png',
+  '24/gimp-transparency.png',
+  '24/gimp-undo-history.png',
+  '24/gimp-user-manual.png',
+  '24/gimp-vcenter.png',
+  '24/gimp-vchain-broken.png',
+  '24/gimp-vchain.png',
+  '24/gimp-vfill.png',
+  '24/gimp-video.png',
+  '24/gimp-warning.png',
+  '24/gimp-web.png',
+  '24/gtk-select-color.png',
+  '24/media-floppy.png',
+  '24/media-optical.png',
+]
+bitmap_32 = [
+  '32/gimp-channel-alpha.png',
+  '32/gimp-channel-blue.png',
+  '32/gimp-channel-gray.png',
+  '32/gimp-channel-green.png',
+  '32/gimp-channel-indexed.png',
+  '32/gimp-channel-red.png',
+  '32/gimp-channel.png',
+  '32/gimp-floating-selection.png',
+  '32/gimp-image.png',
+  '32/gimp-layer-mask.png',
+  '32/gimp-layer.png',
+  '32/gimp-text-layer.png',
+  '32/gimp-user-manual.png',
+  '32/gimp-wilber.png',
+]
+bitmap_48 = [
+  '48/folder.png',
+  '48/gimp-channel-alpha.png',
+  '48/gimp-channel-blue.png',
+  '48/gimp-channel-gray.png',
+  '48/gimp-channel-green.png',
+  '48/gimp-channel-indexed.png',
+  '48/gimp-channel-red.png',
+  '48/gimp-channel.png',
+  '48/gimp-floating-selection.png',
+  '48/gimp-image.png',
+  '48/gimp-layer-mask.png',
+  '48/gimp-layer.png',
+  '48/gimp-prefs-color-management.png',
+  '48/gimp-prefs-controllers.png',
+  '48/gimp-prefs-default-comment.png',
+  '48/gimp-prefs-default-grid.png',
+  '48/gimp-prefs-display.png',
+  '48/gimp-prefs-folders-brushes.png',
+  '48/gimp-prefs-folders-dynamics.png',
+  '48/gimp-prefs-folders-environ.png',
+  '48/gimp-prefs-folders-fonts.png',
+  '48/gimp-prefs-folders-gradients.png',
+  '48/gimp-prefs-folders-icon-themes.png',
+  '48/gimp-prefs-folders-interp.png',
+  '48/gimp-prefs-folders-modules.png',
+  '48/gimp-prefs-folders-mypaint-brushes.png',
+  '48/gimp-prefs-folders-palettes.png',
+  '48/gimp-prefs-folders-patterns.png',
+  '48/gimp-prefs-folders-plug-ins.png',
+  '48/gimp-prefs-folders-scripts.png',
+  '48/gimp-prefs-folders-themes.png',
+  '48/gimp-prefs-folders-tool-plug-ins.png',
+  '48/gimp-prefs-folders-tool-presets.png',
+  '48/gimp-prefs-folders-tools.png',
+  '48/gimp-prefs-folders.png',
+  '48/gimp-prefs-help-system.png',
+  '48/gimp-prefs-icon-theme.png',
+  '48/gimp-prefs-image-title.png',
+  '48/gimp-prefs-image-windows-appearance.png',
+  '48/gimp-prefs-image-windows-snapping.png',
+  '48/gimp-prefs-image-windows.png',
+  '48/gimp-prefs-import-export.png',
+  '48/gimp-prefs-input-devices.png',
+  '48/gimp-prefs-interface.png',
+  '48/gimp-prefs-new-image.png',
+  '48/gimp-prefs-playground.png',
+  '48/gimp-prefs-session.png',
+  '48/gimp-prefs-system-resources.png',
+  '48/gimp-prefs-theme.png',
+  '48/gimp-prefs-tool-options.png',
+  '48/gimp-prefs-toolbox.png',
+  '48/gimp-prefs-window-management.png',
+  '48/gimp-text-layer.png',
+  '48/gimp-wilber.png',
+]
+bitmap_64 = [
+  '64/dialog-information.png',
+  '64/gimp-user-manual.png',
+  '64/gimp-wilber-eek.png',
+  '64/gimp-wilber-outline.png',
+  '64/gimp-wilber.png',
+]
+bitmap_64system = [
+  '64/dialog-error.png',
+  '64/dialog-information.png',
+  '64/dialog-question.png',
+  '64/dialog-warning.png',
+]
+bitmap_96 = [
+  '96/gimp-wilber-outline.png',
+  '96/gimp-wilber.png',
+]
+bitmap_128 = [
+  '128/folder.png',
+  '128/gimp-wilber-outline.png',
+  '128/gimp-wilber.png',
+]
+bitmap_192 = [
+  '192/gimp-wilber-outline.png',
+  '192/gimp-wilber.png',
+]
+bitmap_256 = [
+  '256/folder.png',
+  '256/gimp-wilber-outline.png',
+  '256/gimp-wilber.png',
+]
+
+gimpiconsdir = gimpdatadir / 'icons'
+
+themes = [
+  'Color',
+  # 'Legacy',
+  'Symbolic',
+]
+
+foreach theme : themes
+  subdir(theme)
+endforeach
+
+install_data('index.theme',
+  install_dir: gimpiconsdir / 'hicolor',
+)
diff --git a/libgimp/meson.build b/libgimp/meson.build
new file mode 100644
index 0000000000..9995640f2f
--- /dev/null
+++ b/libgimp/meson.build
@@ -0,0 +1,381 @@
+
+gimpenums_notail = custom_target('gimpenums.c.notail',
+  input : [ 'gimpenums.h', ],
+  output: [ 'gimpenums.c.notail', ],
+  command: [
+    gimp_mkenums,
+    '--fhead','#include "config.h"\n'
+            + '#include <gio/gio.h>\n'
+            + '#include <gegl.h>\n'
+            + '#undef GIMP_DISABLE_DEPRECATED\n'
+            + '#include "libgimpbase/gimpbase.h"\n'
+            + '#include "libgimpbase/gimpbase-private.h"\n'
+            + '#include "libgimpconfig/gimpconfigenums.h"\n'
+            + '#include "gimpenums.h"\n',
+    gimp_mkenums_custom_target_commonargs,
+  ],
+  capture: true,
+)
+
+gimpenums = custom_target('gimpenums.c',
+  input : [ gimpenums_notail, 'gimpenums.c.tail', ],
+  output: [ 'gimpenums.c', ],
+  command: [ 'cat', '@INPUT@' ],
+  capture: true,
+)
+
+gimpuimarshal = gnome.genmarshal('gimpuimarshal',
+  prefix: '_gimpui_marshal',
+  sources: 'gimpuimarshal.list',
+  install_header: false,
+)
+
+pdb_wrappers_sources = [
+  'gimp_pdb.c',
+  'gimpbrush_pdb.c',
+  'gimpbrushes_pdb.c',
+  'gimpbrushselect_pdb.c',
+  'gimpbuffer_pdb.c',
+  'gimpchannel_pdb.c',
+  'gimpcontext_pdb.c',
+  'gimpdebug_pdb.c',
+  'gimpdisplay_pdb.c',
+  'gimpdrawable_pdb.c',
+  'gimpdrawablecolor_pdb.c',
+  'gimpdrawableedit_pdb.c',
+  'gimpdynamics_pdb.c',
+  'gimpedit_pdb.c',
+  'gimpfileops_pdb.c',
+  'gimpfloatingsel_pdb.c',
+  'gimpfonts_pdb.c',
+  'gimpfontselect_pdb.c',
+  'gimpgimprc_pdb.c',
+  'gimpgradient_pdb.c',
+  'gimpgradients_pdb.c',
+  'gimpgradientselect_pdb.c',
+  'gimphelp_pdb.c',
+  'gimpimage_pdb.c',
+  'gimpimagecolorprofile_pdb.c',
+  'gimpimageconvert_pdb.c',
+  'gimpimagegrid_pdb.c',
+  'gimpimageguides_pdb.c',
+  'gimpimagesamplepoints_pdb.c',
+  'gimpimageselect_pdb.c',
+  'gimpimagetransform_pdb.c',
+  'gimpimageundo_pdb.c',
+  'gimpitem_pdb.c',
+  'gimpitemtransform_pdb.c',
+  'gimplayer_pdb.c',
+  'gimpmessage_pdb.c',
+  'gimppainttools_pdb.c',
+  'gimppalette_pdb.c',
+  'gimppalettes_pdb.c',
+  'gimppaletteselect_pdb.c',
+  'gimppattern_pdb.c',
+  'gimppatterns_pdb.c',
+  'gimppatternselect_pdb.c',
+  'gimpprogress_pdb.c',
+  'gimpselection_pdb.c',
+  'gimptextlayer_pdb.c',
+  'gimptexttool_pdb.c',
+  'gimpvectors_pdb.c',
+]
+
+pdb_wrappers_headers = [
+  'gimp_pdb_headers.h',
+  'gimp_pdb.h',
+  'gimpbrush_pdb.h',
+  'gimpbrushes_pdb.h',
+  'gimpbrushselect_pdb.h',
+  'gimpbuffer_pdb.h',
+  'gimpchannel_pdb.h',
+  'gimpcontext_pdb.h',
+  'gimpdebug_pdb.h',
+  'gimpdisplay_pdb.h',
+  'gimpdrawable_pdb.h',
+  'gimpdrawablecolor_pdb.h',
+  'gimpdrawableedit_pdb.h',
+  'gimpdynamics_pdb.h',
+  'gimpedit_pdb.h',
+  'gimpfileops_pdb.h',
+  'gimpfloatingsel_pdb.h',
+  'gimpfonts_pdb.h',
+  'gimpfontselect_pdb.h',
+  'gimpgimprc_pdb.h',
+  'gimpgradient_pdb.h',
+  'gimpgradients_pdb.h',
+  'gimpgradientselect_pdb.h',
+  'gimphelp_pdb.h',
+  'gimpimage_pdb.h',
+  'gimpimagecolorprofile_pdb.h',
+  'gimpimageconvert_pdb.h',
+  'gimpimagegrid_pdb.h',
+  'gimpimageguides_pdb.h',
+  'gimpimagesamplepoints_pdb.h',
+  'gimpimageselect_pdb.h',
+  'gimpimagetransform_pdb.h',
+  'gimpimageundo_pdb.h',
+  'gimpitem_pdb.h',
+  'gimpitemtransform_pdb.h',
+  'gimplayer_pdb.h',
+  'gimpmessage_pdb.h',
+  'gimppainttools_pdb.h',
+  'gimppalette_pdb.h',
+  'gimppalettes_pdb.h',
+  'gimppaletteselect_pdb.h',
+  'gimppattern_pdb.h',
+  'gimppatterns_pdb.h',
+  'gimppatternselect_pdb.h',
+  'gimpprogress_pdb.h',
+  'gimpselection_pdb.h',
+  'gimptextlayer_pdb.h',
+  'gimptexttool_pdb.h',
+  'gimpvectors_pdb.h',
+]
+
+libgimp_sources_introspectable = [
+  'gimp.c',
+  'gimpbrushselect.c',
+  'gimpchannel.c',
+  'gimpdisplay.c',
+  'gimpdrawable.c',
+  'gimpfileprocedure.c',
+  'gimpfontselect.c',
+  'gimpgimprc.c',
+  'gimpgradientselect.c',
+  'gimpimage.c',
+  'gimpimagecolorprofile.c',
+  'gimpimageprocedure.c',
+  'gimpitem.c',
+  'gimplayer.c',
+  'gimplayermask.c',
+  'gimploadprocedure.c',
+  'gimppaletteselect.c',
+  'gimpparamspecs.c',
+  'gimppatternselect.c',
+  'gimppdb.c',
+  'gimpplugin.c',
+  'gimpprocedure.c',
+  'gimpprogress.c',
+  'gimpsaveprocedure.c',
+  'gimpselection.c',
+  'gimpthumbnailprocedure.c',
+  'gimpvectors.c',
+  gimpenums,
+  pdb_wrappers_sources,
+]
+
+libgimp_sources = [
+  libgimp_sources_introspectable,
+  'gimp-debug.c',
+  'gimp-shm.c',
+  'gimpgpparams.c',
+  'gimppdb_pdb.c',
+  'gimppdbprocedure.c',
+  'gimppixbuf.c',
+  'gimpplugin_pdb.c',
+  'gimpunit_pdb.c',
+  'gimpunitcache.c',
+  'gimptilebackendplugin.c',
+]
+
+libgimp_headers_introspectable = [
+  'gimp.h',
+  'gimpbrushselect.h',
+  'gimpchannel.h',
+  'gimpdisplay.h',
+  'gimpdrawable.h',
+  'gimpenums.h',
+  'gimpfileprocedure.h',
+  'gimpfontselect.h',
+  'gimpgimprc.h',
+  'gimpgradientselect.h',
+  'gimpimage.h',
+  'gimpimagecolorprofile.h',
+  'gimpimageprocedure.h',
+  'gimplayer.h',
+  'gimplayermask.h',
+  'gimploadprocedure.h',
+  'gimppaletteselect.h',
+  'gimpparamspecs.h',
+  'gimppatternselect.h',
+  'gimppdb.h',
+  'gimpplugin.h',
+  'gimpprocedure.h',
+  'gimpprogress.h',
+  'gimpsaveprocedure.h',
+  'gimpselection.h',
+  'gimpthumbnailprocedure.h',
+  'gimptypes.h',
+  'gimpvectors.h',
+]
+
+libgimp_headers = [
+  libgimp_headers_introspectable,
+  'gimpprocedure-params.h',
+]
+
+libgimpui_sources_introspectable = [
+  'gimpaspectpreview.c',
+  'gimpbrushselectbutton.c',
+  'gimpdrawablepreview.c',
+  'gimpexport.c',
+  'gimpfontselectbutton.c',
+  'gimpgradientselectbutton.c',
+  'gimpimagecombobox.c',
+  'gimpimagemetadata.c',
+  'gimpitemcombobox.c',
+  'gimppaletteselectbutton.c',
+  'gimppatternselectbutton.c',
+  'gimpprocbrowserdialog.c',
+  'gimpprocview.c',
+  'gimpprogressbar.c',
+  'gimpselectbutton.c',
+  'gimpui.c',
+  'gimpzoompreview.c',
+]
+
+libgimpui_sources = [
+  libgimpui_sources_introspectable,
+  gimpuimarshal,
+]
+
+libgimpui_headers_introspectable = [
+  'gimpaspectpreview.h',
+  'gimpbrushselectbutton.h',
+  'gimpdrawablepreview.h',
+  'gimpexport.h',
+  'gimpfontselectbutton.h',
+  'gimpgradientselectbutton.h',
+  'gimpimagecombobox.h',
+  'gimpimagemetadata.h',
+  'gimpitemcombobox.h',
+  'gimppaletteselectbutton.h',
+  'gimppatternselectbutton.h',
+  'gimpprocbrowserdialog.h',
+  'gimpprocview.h',
+  'gimpprogressbar.h',
+  'gimpselectbutton.h',
+  'gimpui.h',
+  'gimpuitypes.h',
+  'gimpzoompreview.h',
+]
+
+libgimp_introspectable = [
+  libgimp_sources_introspectable,
+  libgimp_headers_introspectable,
+]
+
+libgimpui_introspectable = [
+  libgimpui_sources_introspectable,
+  libgimpui_headers_introspectable,
+]
+
+
+libgimp = library('gimp-'+ gimp_api_version,
+  libgimp_sources,
+  include_directories: rootInclude,
+  dependencies: [
+    gegl, gexiv2, gtk3, drmingw,
+  ],
+  c_args: [ '-DG_LOG_DOMAIN="LibGimp"', '-DGIMP_COMPILATION', ],
+  link_with: [
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+  ],
+  vs_module_defs: 'gimp.def',
+  install: true,
+  version: so_version,
+)
+
+
+libgimpui = library('gimpui-'+ gimp_api_version,
+  libgimpui_sources,
+  include_directories: rootInclude,
+  dependencies: [
+    gegl, gexiv2, gtk3,
+  ],
+  c_args: [ '-DG_LOG_DOMAIN="LibGimpUI"', '-DGIMP_COMPILATION', ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpmodule,
+    libgimpwidgets,
+  ],
+  vs_module_defs: 'gimpui.def',
+  install: true,
+  version: so_version,
+)
+
+
+install_headers(
+  libgimp_headers,
+  libgimpui_headers_introspectable,
+  subdir: gimp_api_name / 'libgimp',
+)
+
+
+
+### GObject introspection
+
+introspectable_files = [
+  libgimp_introspectable,
+  libgimpui_introspectable,
+  libgimpbase_introspectable,
+  libgimpcolor_introspectable,
+  libgimpconfig_introspectable,
+  libgimpmath_introspectable,
+  libgimpmodule_introspectable,
+  libgimpthumb_introspectable,
+  libgimpwidgets_introspectable,
+  'gimpparamspecs-body.c',
+]
+
+libgimp_gir = gnome.generate_gir(
+  libgimp,
+  libgimpui,
+  libgimpbase,
+  libgimpcolor,
+  libgimpconfig,
+  libgimpmath,
+  libgimpmodule,
+  libgimpthumb,
+  libgimpwidgets,
+
+  sources: introspectable_files,
+  nsversion: gimp_api_version,
+  namespace: 'Gimp',
+  identifier_prefix: 'Gimp',
+  # symbol_prefix: 'gimp',
+
+  extra_args: [
+    '-DGIMP_COMPILATION',
+    '-DGIMP_BASE_COMPILATION',
+    '-DGIMP_COLOR_COMPILATION',
+    '-DGIMP_CONFIG_COMPILATION',
+    '-DGIMP_MATH_COMPILATION',
+    '-DGIMP_MODULE_COMPILATION',
+    '-DGIMP_THUMB_COMPILATION',
+    '-DGIMP_WIDGETS_COMPILATION',
+  ],
+
+  includes: [
+    'Babl-0.1',
+    'cairo-1.0',
+    'GdkPixbuf-2.0',
+    'Gegl-0.4',
+    'Gio-2.0',
+    'GLib-2.0',
+    'GObject-2.0',
+    'Gtk-3.0',
+  ],
+
+  link_with: [
+    libgimpthumb,
+  ],
+
+  include_directories: rootInclude,
+  install: true,
+)
diff --git a/libgimpbase/gimpversion.h.in b/libgimpbase/gimpversion.h.in
new file mode 100644
index 0000000000..2f182da87d
--- /dev/null
+++ b/libgimpbase/gimpversion.h.in
@@ -0,0 +1,68 @@
+#ifndef __GIMP_VERSION_H__
+#define __GIMP_VERSION_H__
+
+/* gimpversion.h.in -> gimpversion.h
+ * This file is configured by Meson. Please modify meson.build files.
+ */
+#if !defined (__GIMP_BASE_H_INSIDE__) && !defined (GIMP_BASE_COMPILATION)
+#error "Only <libgimpbase/gimpbase.h> can be included directly."
+#endif
+
+G_BEGIN_DECLS
+
+
+/**
+ * SECTION: gimpversion
+ * @title: gimpversion
+ * @short_description: Macros and constants useful for determining
+ *                     GIMP's version number and capabilities.
+ *
+ * Macros and constants useful for determining GIMP's version number and
+ * capabilities.
+ **/
+
+/**
+ * GIMP_MAJOR_VERSION:
+ *
+ * The major GIMP version number.
+ **/
+#define GIMP_MAJOR_VERSION                              (@GIMP_MAJOR_VERSION@)
+
+/**
+ * GIMP_MINOR_VERSION:
+ *
+ * The minor GIMP version number.
+ **/
+#define GIMP_MINOR_VERSION                              (@GIMP_MINOR_VERSION@)
+
+/**
+ * GIMP_MICRO_VERSION:
+ *
+ * The micro GIMP version number.
+ **/
+#define GIMP_MICRO_VERSION                              (@GIMP_MICRO_VERSION@)
+
+/**
+ * GIMP_VERSION:
+ *
+ * The GIMP version as a string.
+ **/
+#define GIMP_VERSION                                    "@GIMP_VERSION@"
+
+/**
+ * GIMP_API_VERSION:
+ *
+ * Since: 2.2
+ **/
+#define GIMP_API_VERSION                                "@GIMP_API_VERSION@"
+
+#define GIMP_CHECK_VERSION(major, minor, micro) \
+    (GIMP_MAJOR_VERSION > (major) || \
+     (GIMP_MAJOR_VERSION == (major) && GIMP_MINOR_VERSION > (minor)) || \
+     (GIMP_MAJOR_VERSION == (major) && GIMP_MINOR_VERSION == (minor) && \
+      GIMP_MICRO_VERSION >= (micro)))
+
+
+G_END_DECLS
+
+#endif /* __GIMP_VERSION_H__ */
diff --git a/libgimpbase/meson.build b/libgimpbase/meson.build
new file mode 100644
index 0000000000..2ee70f15e6
--- /dev/null
+++ b/libgimpbase/meson.build
@@ -0,0 +1,134 @@
+
+gimpversion = configure_file(
+  input : 'gimpversion.h.in',
+  output: 'gimpversion.h',
+  configuration: versionconfig,
+)
+
+
+gimpbaseenums = custom_target('gimpbaseenums.c',
+  input : [ 'gimpbaseenums.h', ],
+  output: [ 'gimpbaseenums.c', ],
+  command: [
+    gimp_mkenums,
+    '--fhead','#include "config.h"\n'
+            + '#include <glib-object.h>\n'
+            + '#undef GIMP_DISABLE_DEPRECATED\n'
+            + '#include "gimpbasetypes.h"\n'
+            + '#include "libgimp/libgimp-intl.h"\n',
+    gimp_mkenums_custom_target_commonargs,
+  ],
+  capture: true,
+)
+
+gimpcompatenums = custom_target('gimpcompatenums.c',
+  input : [ 'gimpcompatenums.h', ],
+  output: [ 'gimpcompatenums.c', ],
+  command: [
+    gimp_mkenums,
+    '--fhead','#include "config.h"\n'
+            + '#include <glib-object.h>\n'
+            + '#include "gimpbasetypes.h"\n'
+            + '#include "@INPUT@"\n'
+            + '#include "libgimp/libgimp-intl.h"\n',
+    gimp_mkenums_custom_target_commonargs,
+  ],
+  capture: true,
+)
+
+libgimpbase_sources_introspectable = files(
+  'gimpbasetypes.c',
+  'gimpchecks.c',
+  'gimpcpuaccel.c',
+  'gimpenv.c',
+  'gimpmemsize.c',
+  'gimpmetadata.c',
+  'gimpparamspecs.c',
+  'gimpparasite.c',
+  'gimpparasiteio.c',
+  'gimprectangle.c',
+  'gimpsignal.c',
+  'gimpunit.c',
+  'gimputils.c',
+  'gimpvaluearray.c',
+)
+
+libgimpbase_sources = [
+  libgimpbase_sources_introspectable,
+  'gimpbase-private.c',
+  'gimpprotocol.c',
+  'gimpreloc.c',
+  'gimpwire.c',
+  gimpbaseenums,
+  gimpcompatenums,
+]
+
+libgimpbase_headers_introspectable = files(
+  'gimpbaseenums.h',
+  'gimpbasetypes.h',
+  'gimpchecks.h',
+  'gimpcpuaccel.h',
+  'gimpenv.h',
+  'gimplimits.h',
+  'gimpmemsize.h',
+  'gimpmetadata.h',
+  'gimpparamspecs.h',
+  'gimpparasite.h',
+  'gimpparasiteio.h',
+  'gimprectangle.h',
+  'gimpsignal.h',
+  'gimpunit.h',
+  'gimputils.h',
+  'gimpvaluearray.h',
+) + [
+  gimpversion,
+]
+
+libgimpbase_headers = [
+  libgimpbase_headers_introspectable,
+  'gimpbase.h',
+  gimpversion,
+]
+
+libgimpbase_introspectable = [
+  libgimpbase_sources_introspectable,
+  libgimpbase_headers_introspectable,
+]
+
+
+libgimpbase = library('gimpbase-' + gimp_api_version,
+  libgimpbase_sources,
+  include_directories: rootInclude,
+  dependencies: [
+    gexiv2, gio, math,
+  ],
+  c_args: [
+    '-DG_LOG_DOMAIN="LibGimpBase"',
+    '-DGIMP_BASE_COMPILATION',
+  ],
+  vs_module_defs: 'gimpbase.def',
+  install: true,
+  version: so_version,
+)
+
+install_headers(
+  libgimpbase_headers,
+  subdir: gimp_api_name / 'libgimpbase',
+)
+
+# Test program, not installed
+executable('test-cpu-accel',
+  'test-cpu-accel.c',
+  include_directories: rootInclude,
+  dependencies: [
+    glib,
+  ],
+  c_args: [
+    '-DG_LOG_DOMAIN="LibGimpBase"',
+    '-DGIMP_BASE_COMPILATION',
+  ],
+  link_with: [
+    libgimpbase,
+  ],
+  install: false,
+)
diff --git a/libgimpcolor/meson.build b/libgimpcolor/meson.build
new file mode 100644
index 0000000000..99e7a1ff1f
--- /dev/null
+++ b/libgimpcolor/meson.build
@@ -0,0 +1,76 @@
+
+libgimpcolor_sources = files(
+  'gimpadaptivesupersample.c',
+  'gimpbilinear.c',
+  'gimpcairo.c',
+  'gimpcmyk.c',
+  'gimpcolormanaged.c',
+  'gimpcolorprofile.c',
+  'gimpcolorspace.c',
+  'gimpcolortransform.c',
+  'gimphsl.c',
+  'gimphsv.c',
+  'gimppixbuf.c',
+  'gimprgb-parse.c',
+  'gimprgb.c',
+)
+
+libgimpcolor_headers_introspectable = files(
+  'gimpcolortypes.h',
+  'gimpadaptivesupersample.h',
+  'gimpbilinear.h',
+  'gimpcairo.h',
+  'gimpcmyk.h',
+  'gimpcolormanaged.h',
+  'gimpcolorprofile.h',
+  'gimpcolorspace.h',
+  'gimpcolortransform.h',
+  'gimphsl.h',
+  'gimphsv.h',
+  'gimppixbuf.h',
+  'gimprgb.h',
+)
+
+libgimpcolor_headers = [
+  libgimpcolor_headers_introspectable,
+  'gimpcolor.h',
+]
+
+libgimpcolor_introspectable = [
+  libgimpcolor_sources,
+  libgimpcolor_headers_introspectable,
+]
+
+
+libgimpcolor = library('gimpcolor-' + gimp_api_version,
+  libgimpcolor_sources,
+  include_directories: rootInclude,
+  dependencies: [
+    cairo, gdk_pixbuf, gegl, lcms, math,
+  ],
+  c_args: [ '-DG_LOG_DOMAIN="LibGimpColor"', '-DGIMP_COLOR_COMPILATION', ],
+  link_with: [ libgimpbase, ],
+  vs_module_defs: 'gimpcolor.def',
+  install: true,
+  version: so_version,
+)
+
+install_headers(
+  libgimpcolor_headers,
+  subdir: gimp_api_name / 'libgimpcolor',
+)
+
+
+# Test program, not installed
+executable('test-color-parser',
+  'test-color-parser.c',
+  include_directories: rootInclude,
+  dependencies: [
+    cairo, gdk_pixbuf, gegl, lcms, math,
+    babl,
+    # glib,
+  ],
+  c_args: '-DG_LOG_DOMAIN="LibGimpColor"',
+  link_with: [ libgimpbase, libgimpcolor, ],
+  install: false,
+)
diff --git a/libgimpconfig/meson.build b/libgimpconfig/meson.build
new file mode 100644
index 0000000000..8124a01203
--- /dev/null
+++ b/libgimpconfig/meson.build
@@ -0,0 +1,79 @@
+
+gimpconfigenums = custom_target('gimpconfigenums.c',
+  input : [ 'gimpconfigenums.h', ],
+  output: [ 'gimpconfigenums.c', ],
+  command: [
+    gimp_mkenums,
+    '--fhead','#include "config.h"\n'
+            + '#include <gio/gio.h>\n'
+            + '#include "libgimpbase/gimpbase.h"\n'
+            + '#include "@INPUT@"\n'
+            + '#include "libgimp/libgimp-intl.h"\n',
+    gimp_mkenums_custom_target_commonargs,
+  ],
+  capture: true,
+)
+
+libgimpconfig_sources_introspectable = files(
+  'gimpcolorconfig.c',
+  'gimpconfig-deserialize.c',
+  'gimpconfig-error.c',
+  'gimpconfig-iface.c',
+  'gimpconfig-path.c',
+  'gimpconfig-serialize.c',
+  'gimpconfig-utils.c',
+  'gimpconfigwriter.c',
+  'gimpscanner.c',
+)
+
+libgimpconfig_sources = [
+  libgimpconfig_sources_introspectable,
+  gimpconfigenums,
+]
+
+libgimpconfig_headers_introspectable = files(
+  'gimpcolorconfig.h',
+  'gimpconfig-deserialize.h',
+  'gimpconfig-error.h',
+  'gimpconfig-iface.h',
+  'gimpconfig-params.h',
+  'gimpconfig-path.h',
+  'gimpconfig-serialize.h',
+  'gimpconfig-utils.h',
+  'gimpconfigenums.h',
+  'gimpconfigtypes.h',
+  'gimpconfigwriter.h',
+  'gimpscanner.h',
+)
+
+libgimpconfig_headers = [
+  libgimpconfig_headers_introspectable,
+  'gimpconfig.h',
+]
+
+libgimpconfig_introspectable = [
+  libgimpconfig_headers_introspectable,
+  libgimpconfig_sources_introspectable,
+]
+
+libgimpconfig = library('gimpconfig-' + gimp_api_version,
+  libgimpconfig_sources,
+  include_directories: rootInclude,
+  dependencies: [
+    cairo, gdk_pixbuf, gegl, gio, gio_specific,
+  ],
+  c_args: [ '-DG_LOG_DOMAIN="LibGimpConfig"', '-DGIMP_CONFIG_COMPILATION', ],
+  link_with: [
+    libgimpbase,
+    libgimpcolor,
+    libgimpmath,
+  ],
+  vs_module_defs: 'gimpconfig.def',
+  install: true,
+  version: so_version,
+)
+
+install_headers(
+  libgimpconfig_headers,
+  subdir: gimp_api_name / 'libgimpconfig',
+)
diff --git a/libgimpmath/meson.build b/libgimpmath/meson.build
new file mode 100644
index 0000000000..14424cd54d
--- /dev/null
+++ b/libgimpmath/meson.build
@@ -0,0 +1,46 @@
+
+libgimpmath_sources_introspectable = files(
+  'gimpmatrix.c',
+  'gimpvector.c',
+)
+
+libgimpmath_sources = [
+  libgimpmath_sources_introspectable,
+]
+
+libgimpmath_headers_introspectable = files(
+  'gimpmathtypes.h',
+  'gimpmatrix.h',
+  'gimpvector.h',
+)
+
+libgimpmath_headers = [
+  libgimpmath_headers_introspectable,
+  'gimpmath.h',
+]
+
+libgimpmath_introspectable = [
+  libgimpmath_sources_introspectable,
+  libgimpmath_headers_introspectable,
+]
+
+
+libgimpmath = library('gimpmath-' + gimp_api_version,
+  libgimpmath_sources,
+  include_directories: rootInclude,
+  dependencies: [
+    glib, gobject, math,
+  ],
+  c_args: [ '-DG_LOG_DOMAIN="LibGimpMath"', '-DGIMP_MATH_COMPILATION', ],
+  link_with: [
+    libgimpbase,
+  ],
+  vs_module_defs: 'gimpmath.def',
+  install: true,
+  version: so_version,
+)
+
+install_headers(
+  libgimpmath_headers,
+  subdir: gimp_api_name / 'libgimpmath',
+)
diff --git a/libgimpmodule/meson.build b/libgimpmodule/meson.build
new file mode 100644
index 0000000000..b5289a68a4
--- /dev/null
+++ b/libgimpmodule/meson.build
@@ -0,0 +1,37 @@
+
+libgimpmodule_sources = files(
+  'gimpmodule.c',
+  'gimpmoduledb.c',
+)
+
+libgimpmodule_headers = files(
+  'gimpmodule.h',
+  'gimpmoduledb.h',
+  'gimpmoduletypes.h',
+)
+
+libgimpmodule_introspectable = [
+  libgimpmodule_sources,
+  libgimpmodule_headers,
+]
+
+libgimpmodule = library('gimpmodule-' + gimp_api_version,
+  libgimpmodule_sources,
+  include_directories: rootInclude,
+  dependencies: [
+    gio, glib, gmodule,
+  ],
+  c_args: [ '-DG_LOG_DOMAIN="LibGimpModule"', '-DGIMP_MODULE_COMPILATION', ],
+  link_with: [
+    libgimpbase,
+    libgimpconfig,
+  ],
+  vs_module_defs: 'gimpmodule.def',
+  install: true,
+  version: so_version,
+)
+
+install_headers(
+  libgimpmodule_headers,
+  subdir: gimp_api_name / 'libgimpmodule',
+)
diff --git a/libgimpthumb/meson.build b/libgimpthumb/meson.build
new file mode 100644
index 0000000000..c106bb60a7
--- /dev/null
+++ b/libgimpthumb/meson.build
@@ -0,0 +1,95 @@
+
+gimpthumbenums = custom_target('gimpthumb-enums.c',
+  input : [ 'gimpthumb-enums.h', ],
+  output: [ 'gimpthumb-enums.c', ],
+  command: [
+    gimp_mkenums,
+    '--fhead','#include "config.h"\n'+
+              '#include <glib-object.h>\n'+
+              '#include "gimpthumb-enums.h"\n',
+    '--fprod','/* enumerations from "@filename@" */\n',
+    '--vhead','GType\n'+
+              '@enum_name@_get_type (void)\n'+
+              '{\n'+
+              '  static const G@Type@Value values[] =\n'+
+              '  {',
+    '--vprod','    { @VALUENAME@, @valuedesc@, "@valuenick@" },',
+    '--vtail','    { 0, NULL, NULL }\n'+
+              '  };\n'+
+              '\n'+
+              '  static GType type = 0;\n'+
+              '\n'+
+              '  if (G_UNLIKELY (! type))\n'+
+              '    type = g_@type@_register_static ("@EnumName@", values);\n'+
+              '\n'+
+              '  return type;\n'+
+              '}\n',
+    '@INPUT@',
+  ],
+  capture: true,
+)
+
+libgimpthumb_sources_introspectable = files(
+  'gimpthumb-error.c',
+  'gimpthumb-utils.c',
+  'gimpthumbnail.c',
+)
+
+libgimpthumb_sources = [
+  libgimpthumb_sources_introspectable,
+  gimpthumbenums,
+]
+
+libgimpthumb_headers_introspectable = files(
+  'gimpthumb-enums.h',
+  'gimpthumb-error.h',
+  'gimpthumb-types.h',
+  'gimpthumb-utils.h',
+  'gimpthumbnail.h',
+)
+
+libgimpthumb_headers = [
+  libgimpthumb_headers_introspectable,
+  'gimpthumb.h',
+]
+
+libgimpthumb_introspectable = [
+  libgimpthumb_sources_introspectable,
+  libgimpthumb_headers_introspectable,
+]
+
+libgimpthumb = library('gimpthumb-'+ gimp_api_version,
+  libgimpthumb_sources,
+  include_directories: rootInclude,
+  dependencies: [
+    glib, gobject, gdk_pixbuf, gio,
+  ],
+  c_args: [ '-DG_LOG_DOMAIN="LibGimpThumb"', '-DGIMP_THUMB_COMPILATION', ],
+  link_with:  [
+    libgimpbase,
+  ],
+  vs_module_defs: 'gimpthumb.def',
+  install: true,
+  version: so_version,
+)
+
+install_headers(
+  libgimpthumb_headers,
+  subdir: gimp_api_name / 'libgimpthumb',
+)
+
+
+# Test program, not installed
+gimp_thumbnail_list = executable('gimp-thumbnail-list',
+  'gimp-thumbnail-list.c',
+  include_directories: rootInclude,
+  dependencies: [
+    gdk_pixbuf,
+  ],
+  c_args: '-DG_LOG_DOMAIN="LibGimpThumb"',
+  link_with: [
+    libgimpbase,
+    libgimpthumb,
+  ],
+  install: false,
+)
diff --git a/libgimpwidgets/meson.build b/libgimpwidgets/meson.build
new file mode 100644
index 0000000000..ca8ca647a4
--- /dev/null
+++ b/libgimpwidgets/meson.build
@@ -0,0 +1,206 @@
+
+gimpwidgetsenums = custom_target('gimpwidgetsenums.c',
+  input : [ 'gimpwidgetsenums.h', ],
+  output: [ 'gimpwidgetsenums.c', ],
+  command: [
+    gimp_mkenums,
+    '--fhead','#include "config.h"\n'
+            + '#include <gio/gio.h>\n'
+            + '#include "libgimpbase/gimpbase.h"\n'
+            + '#include "@INPUT@"\n'
+            + '#include "libgimp/libgimp-intl.h"\n',
+    gimp_mkenums_custom_target_commonargs,
+  ],
+  capture: true,
+)
+
+gimpwidgetsmarshal = gnome.genmarshal('gimpwidgetsmarshal',
+  prefix: '_gimp_widgets_marshal',
+  sources: 'gimpwidgetsmarshal.list',
+  install_header: false,
+)
+
+libgimpwidgets_sources_introspectable = files(
+  'gimpbrowser.c',
+  'gimpbusybox.c',
+  'gimpbutton.c',
+  'gimpcairo-utils.c',
+  'gimpcellrenderercolor.c',
+  'gimpcellrenderertoggle.c',
+  'gimpchainbutton.c',
+  'gimpcolorarea.c',
+  'gimpcolorbutton.c',
+  'gimpcolordisplay.c',
+  'gimpcolordisplaystack.c',
+  'gimpcolorhexentry.c',
+  'gimpcolornotebook.c',
+  'gimpcolorprofilechooserdialog.c',
+  'gimpcolorprofilecombobox.c',
+  'gimpcolorprofilestore.c',
+  'gimpcolorprofileview.c',
+  'gimpcolorselection.c',
+  'gimpcolorselector.c',
+  'gimpdialog.c',
+  'gimpenumcombobox.c',
+  'gimpenumlabel.c',
+  'gimpenumstore.c',
+  'gimpenumwidgets.c',
+  'gimpfileentry.c',
+  'gimpframe.c',
+  'gimphelpui.c',
+  'gimphintbox.c',
+  'gimpicons.c',
+  'gimpintcombobox.c',
+  'gimpintstore.c',
+  'gimpmemsizeentry.c',
+  'gimpnumberpairentry.c',
+  'gimpoffsetarea.c',
+  'gimppageselector.c',
+  'gimppatheditor.c',
+  'gimppickbutton.c',
+  'gimppreview.c',
+  'gimppreviewarea.c',
+  'gimppropwidgets.c',
+  'gimpquerybox.c',
+  'gimpruler.c',
+  'gimpscaleentry.c',
+  'gimpscrolledpreview.c',
+  'gimpsizeentry.c',
+  'gimpspinbutton.c',
+  'gimpstringcombobox.c',
+  'gimpunitcombobox.c',
+  'gimpunitstore.c',
+  'gimpwidgets-error.c',
+  'gimpwidgets.c',
+  'gimpwidgetsutils.c',
+  'gimpzoommodel.c',
+)
+
+libgimpwidgets_sources = [
+  libgimpwidgets_sources_introspectable,
+  'gimpcolorscale.c',
+  'gimpcolorscales.c',
+  'gimpcolorselect.c',
+  'gimpcontroller.c',
+  'gimpeevl.c',
+  'gimpwidgets-private.c',
+
+  gimpwidgetsenums,
+  gimpwidgetsmarshal,
+  icons_imgs_sources,
+  cursors_sources,
+  pickers_sources,
+]
+
+libgimpwidgets_headers_introspectable = files(
+  'gimpcolorselection.h',
+  'gimpcolorselector.h',
+  'gimpdialog.h',
+  'gimpenumcombobox.h',
+  'gimpenumlabel.h',
+  'gimpenumstore.h',
+  'gimpenumwidgets.h',
+  'gimpfileentry.h',
+  'gimpframe.h',
+  'gimphelpui.h',
+  'gimphintbox.h',
+  'gimpicons.h',
+  'gimpintcombobox.h',
+  'gimpintstore.h',
+  'gimpmemsizeentry.h',
+  'gimpnumberpairentry.h',
+  'gimpoffsetarea.h',
+  'gimppageselector.h',
+  'gimppatheditor.h',
+  'gimppickbutton.h',
+  'gimppreview.h',
+  'gimppreviewarea.h',
+  'gimppropwidgets.h',
+  'gimpquerybox.h',
+  'gimpruler.h',
+  'gimpscaleentry.h',
+  'gimpscrolledpreview.h',
+  'gimpsizeentry.h',
+  'gimpspinbutton.h',
+  'gimpstringcombobox.h',
+  'gimpunitcombobox.h',
+  'gimpunitstore.h',
+  'gimpwidgets-error.h',
+  'gimpwidgets.h',
+  'gimpwidgetsenums.h',
+  'gimpwidgetstypes.h',
+  'gimpwidgetsutils.h',
+  'gimpzoommodel.h',
+)
+
+libgimpwidgets_headers = [
+  libgimpwidgets_headers_introspectable,
+  'gimpcolorscale.h',
+  'gimpcolorscales.h',
+  'gimpcolorselect.h',
+  'gimpcontroller.h',
+]
+
+libgimpwidgets_introspectable = [
+  libgimpwidgets_sources_introspectable,
+  libgimpwidgets_headers_introspectable,
+]
+
+if gtk3_macos.found()
+  libgimpwidgets_sources += [
+    'gimppickbutton-quartz.c',
+  ]
+else
+  libgimpwidgets_sources += [
+    'gimppickbutton-default.c',
+    'gimppickbutton-kwin.c',
+  ]
+endif
+
+libgimpwidgets = library('gimpwidgets-'+ gimp_api_version,
+  libgimpwidgets_sources,
+  include_directories: rootInclude,
+  dependencies: [
+    gegl, gtk3, lcms, math
+  ],
+  c_args: [ '-DG_LOG_DOMAIN="LibGimpWidgets"', '-DGIMP_WIDGETS_COMPILATION', ],
+  link_with: [
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+  ],
+  vs_module_defs: 'gimpwidgets.def',
+  install: true,
+  version: so_version,
+)
+
+install_headers(
+  libgimpwidgets_headers,
+  subdir: gimp_api_name / 'libgimpwidgets',
+)
+
+
+# Test programs, not installed
+
+test_preview_area = executable('test-preview-area',
+  'test-preview-area.c',
+  include_directories: rootInclude,
+  dependencies: [
+    gtk3,
+  ],
+  c_args: '-DG_LOG_DOMAIN="LibGimpWidgets"',
+  link_with: [ libgimpwidgets, ],
+  install: false,
+  build_by_default: false,
+)
+
+test_eevl = executable('test-eevl',
+  'test-eevl.c',
+  include_directories: rootInclude,
+  dependencies: [
+    glib, gtk3,
+  ],
+  c_args: '-DG_LOG_DOMAIN="LibGimpWidgets"',
+  link_with: [ libgimpwidgets, ],
+  install: false,
+)
diff --git a/m4macros/meson.build b/m4macros/meson.build
new file mode 100644
index 0000000000..3f1455cbca
--- /dev/null
+++ b/m4macros/meson.build
@@ -0,0 +1,5 @@
+install_data([
+    gimp_api_name + '.m4',
+  ],
+  install_dir: get_option('datadir') / 'aclocal',
+)
diff --git a/menus/meson.build b/menus/meson.build
new file mode 100644
index 0000000000..865a747714
--- /dev/null
+++ b/menus/meson.build
@@ -0,0 +1,69 @@
+menus_dir = prefix / gimpdatadir / 'menus'
+
+menus_files = [
+  'brush-editor-menu.xml',
+  'brushes-menu.xml',
+  'buffers-menu.xml',
+  'channels-menu.xml',
+  'colormap-menu.xml',
+  'cursor-info-menu.xml',
+  'dashboard-menu.xml',
+  'documents-menu.xml',
+  'dynamics-editor-menu.xml',
+  'dynamics-menu.xml',
+  'error-console-menu.xml',
+  'fonts-menu.xml',
+  'gradient-editor-menu.xml',
+  'gradients-menu.xml',
+  'images-menu.xml',
+  'layers-menu.xml',
+  'mypaint-brushes-menu.xml',
+  'palette-editor-menu.xml',
+  'palettes-menu.xml',
+  'patterns-menu.xml',
+  'quick-mask-menu.xml',
+  'sample-points-menu.xml',
+  'selection-menu.xml',
+  'templates-menu.xml',
+  'text-editor-toolbar.xml',
+  'text-tool-menu.xml',
+  'tool-options-menu.xml',
+  'tool-preset-editor-menu.xml',
+  'tool-presets-menu.xml',
+  'undo-menu.xml',
+  'vectors-menu.xml',
+]
+
+install_data(menus_files,
+  install_dir: menus_dir,
+)
+
+unstable_menus_args = stable ? [] : [ '--stringparam', 'unstable-menus', 'yes' ]
+
+foreach menu_filegen : [ 'dockable-menu.xml', 'image-menu.xml', ]
+  menus_files += custom_target(menu_filegen,
+    input : [ menu_filegen +'.in', 'menus.xsl', ],
+    output: [ menu_filegen ],
+    command: [
+      xsltproc,
+      '--xinclude',
+      unstable_menus_args,
+      '--output', '@OUTPUT@',
+      '@INPUT1@',
+      '@INPUT0@',
+    ],
+    install: true,
+    install_dir: menus_dir,
+  )
+endforeach
+
+if xmllint.found()
+  run_target('validate_menus',
+    command: [
+      xmllint,
+      '--noout',
+      '--path', meson.current_source_dir(),
+      '@INPUT@', menus_files,
+    ],
+  )
+endif
diff --git a/meson.build b/meson.build
new file mode 100644
index 0000000000..eca6bbc3bd
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,1578 @@
+project('gimp',
+  'c', 'cpp',
+  version: '2.99.1',
+  meson_version: '>=0.50.0',
+  default_options: [
+    'cpp_std=gnu++14',
+  ],
+)
+
+project_url = 'https://gitlab.gnome.org/GNOME/gimp'
+project_url_issues = project_url + '/issues/new'
+
+conf = configuration_data()
+
+################################################################################
+# Project info
+
+prettyname = 'GIMP'
+full_name  = 'GNU Image Manipulation Program'
+
+# General version
+gimp_version = meson.project_version()
+
+package_string= prettyname + ' ' + gimp_version
+
+gimp_app_version_arr = gimp_version.split('.')
+gimp_app_version_major = gimp_app_version_arr[0].to_int()
+gimp_app_version_minor = gimp_app_version_arr[1].to_int()
+gimp_app_version_micro = gimp_app_version_arr[2].to_int()
+
+# Override for Release-candidates
+gimp_app_version = '@0@.@1@'.format(
+  gimp_app_version_major,
+  gimp_app_version_minor
+)
+
+
+# API & pkg-config version
+api_version_major = gimp_app_version_major
+api_version_minor = gimp_app_version_minor
+
+if api_version_minor == 99
+  api_version_major += 1
+  api_version_minor = 0
+endif
+
+gimp_api_version = '@0@.@1@'.format(api_version_major, api_version_minor)
+gimp_api_name = 'gimp-' + gimp_api_version
+
+
+
+gimp_command  = 'gimp-' + gimp_app_version
+
+gettext_package= 'gimp@0@@1@'.format(api_version_major, api_version_minor)
+conf.set_quoted('GETTEXT_PACKAGE', gettext_package)
+
+conf.set_quoted('GIMP_VERSION', gimp_version)
+
+stable = (gimp_app_version_minor % 2 == 0)
+conf.set10('GIMP_UNSTABLE', not stable)
+
+versionconfig = configuration_data()
+versionconfig.set('GIMP_FULL_NAME',     full_name)
+versionconfig.set('GIMP_MAJOR_VERSION', gimp_app_version_major)
+versionconfig.set('GIMP_MINOR_VERSION', gimp_app_version_minor)
+versionconfig.set('GIMP_MICRO_VERSION', gimp_app_version_micro)
+versionconfig.set('GIMP_VERSION',       gimp_version)
+versionconfig.set('GIMP_API_VERSION',   gimp_api_version)
+
+
+# Libtool versionning
+gimp_interface_age = 0
+lt_current = 0
+lt_revision = gimp_app_version_micro
+lt_age = 100*api_version_minor + 0
+so_version = '@0@.@1@.@2@'.format(lt_current, lt_age, lt_revision)
+
+
+################################################################################
+# Get configuration and Meson modules
+
+pkgconfig = import('pkgconfig')
+i18n      = import('i18n')
+gnome     = import('gnome')
+pythonmod = import('python')
+
+cc        = meson.get_compiler('c')
+cxx       = meson.get_compiler('cpp')
+prefix    = get_option('prefix')
+buildtype = get_option('buildtype')
+
+compiler_args = []
+linker_args = []
+
+################################################################################
+# Host system detection
+
+cpu = host_machine.cpu().to_lower()
+
+arch_x86_64 = (cpu == 'x86_64')
+arch_x86    = (cpu.startswith('i') and cpu.endswith('86')) or arch_x86_64
+arch_ppc64  = (cpu == 'ppc64' or cpu == 'powerpc64')
+arch_ppc    = (cpu == 'ppc'   or cpu == 'powerpc') or arch_ppc64
+
+if not (arch_x86 or arch_ppc)
+  error('Unknown host architecture')
+endif
+
+conf.set10('ARCH_X86',    arch_x86)
+conf.set10('ARCH_X86_64', arch_x86_64)
+conf.set10('ARCH_PPC',    arch_ppc)
+conf.set10('ARCH_PPC64',  arch_ppc64)
+
+
+host_os = host_machine.system().to_lower()
+message('Host os: ' + host_os)
+
+platform_linux = (
+  host_os.contains('linux')
+)
+
+platform_windows = (
+  host_os.contains('mingw') or
+  host_os.contains('cygwin') or
+  host_os.contains('windows')
+)
+
+platform_osx = (
+  host_os.contains('machten') or
+  host_os.contains('rhapsody') or
+  host_os.contains('darwin')
+)
+
+conf.set('PLATFORM_OSX', platform_osx)
+
+if platform_windows
+  windows = import('windows')
+  # AC_CHECK_PROG(ms_librarian, lib.exe, yes, no)
+  # AM_CONDITIONAL(MS_LIB_AVAILABLE, test "x$ms_librarian" = xyes)
+  # compiler_args += '-Wl,--large-address-aware'
+endif
+
+
+if cc.get_id() == 'gcc' and cc.version() == '7.2.0'
+  warning('''
+    GCC 7.2.0 has a serious bug affecting GEGL/GIMP. We advise
+    against using this version of the compiler (previous and
+    further versions are fine).
+    See https://bugzilla.gnome.org/show_bug.cgi?id=787222
+  ''')
+endif
+
+
+
+################################################################################
+# Compiler CPU extensions for optimizations
+
+if (get_option('buildtype') == 'release' or
+    get_option('buildtype') == 'debugoptimized')
+
+  # Check for compiler CPU extensions
+  existing_cpu_exts = [
+    '-mfpmath=sse',
+    '-mmmx',
+    '-msse',
+    '-msse2',
+    '-msse4.1',
+  ]
+  supported_cpu_exts = cc.get_supported_arguments(existing_cpu_exts)
+
+  compiler_args += supported_cpu_exts
+
+  conf.set  ('USE_MMX',                   '-mmmx'    in supported_cpu_exts)
+  conf.set  ('USE_SSE',                   '-msse'    in supported_cpu_exts)
+  conf.set10('COMPILE_SSE2_INTRINISICS',  '-msse2'   in supported_cpu_exts)
+  conf.set10('COMPILE_SSE4_1_INTRINISICS','-msse4.1' in supported_cpu_exts)
+
+
+  have_altivec        = false
+  have_altivec_sysctl = false
+  if arch_ppc
+    altivec_args = cc.get_supported_arguments([
+      '-faltivec',
+      '-maltivec',
+      '-mabi=altivec',
+    ])
+
+    if altivec_args != []
+      compiler_args += altivec_args
+      linker_args   += altivec_args
+
+      if host_os.contains('darwin')
+        have_altivec = true
+        have_altivec_sysctl = true
+      elif cc.compiles('''
+        int main() { asm ("vand %v0, %v0, %v0"); return 0; }
+        ''')
+        have_altivec = true
+      endif
+    endif
+  endif
+  conf.set('HAVE_ALTIVEC_SYSCTL', have_altivec_sysctl)
+  conf.set('USE_ALTIVEC',         have_altivec)
+
+endif
+
+
+################################################################################
+# CFlags
+
+
+if get_option('profiling') and cc.get_id() == 'gcc'
+  compiler_args += '-pg'
+  linker_args   += '-pg'
+endif
+
+if get_option('ansi')
+  compiler_args += [ '-ansi', '-pedantic']
+endif
+
+warning_cflags_common = [
+  '-fdiagnostics-show-option',
+  '-fno-common',
+
+  '-Wformat-security',
+  '-Winit-self',
+  '-Wlogical-op',
+  '-Wmissing-declarations',
+  '-Wmissing-format-attribute',
+  '-Wpointer-arith',
+  '-Wreturn-type',
+  '-Wtype-limits',
+
+  # You can uncomment this to debug with less warning outputs
+  '-Wno-deprecated-declarations',
+
+  '-Werror=implicit-function-declaration',
+]
+warning_cflags_c = [
+  '-Wdeclaration-after-statement',
+  '-Wold-style-definition',
+  '-Wno-strict-prototypes',
+]
+warning_cflags_cpp = [
+]
+
+compiler_args += cc.get_supported_arguments(warning_cflags_common)
+add_project_arguments(cc .get_supported_arguments(warning_cflags_c),   language: 'c')
+add_project_arguments(cxx.get_supported_arguments(warning_cflags_cpp), language: 'cpp')
+
+
+# Ensure MSVC-compatible struct packing convention is used when
+# compiling for Win32 with gcc.
+if platform_windows and cc.get_id() == 'gcc'
+  msvc_compat_args = cc.first_supported_argument([
+    '-fnative-struct',
+    '-mms-bitfields',
+  ])
+  if msvc_compat_args == []
+    error('''
+      GCC does not support '-fnative-struct' nor '-mms-bitfields'.
+      Build will be incompatible with GTK+ DLLs.
+    ''')
+  endif
+  compiler_args += msvc_compat_args
+endif
+
+
+conf.set('HAVE__NL_MEASUREMENT_MEASUREMENT',
+  cc.compiles('''
+    #include<langinfo.h>
+    int main() {
+      char c = *((unsigned char *)  nl_langinfo(_NL_MEASUREMENT_MEASUREMENT));
+    }
+  ''')
+)
+
+
+################################################################################
+# Dependencies
+no_dep = dependency('', required: false)
+
+################################################################################
+# Mandatory Dependencies
+
+relocatable_bundle = get_option('relocatable-bundle')
+conf.set('ENABLE_RELOCATABLE_RESOURCES', relocatable_bundle)
+
+
+math              = cc.find_library('m')
+dl                = platform_windows ? no_dep : cc.find_library('dl')
+rpc               = platform_windows ? cc.find_library('rpcrt4') : no_dep
+dbghelp           = platform_windows ? cc.find_library('dbghelp') : no_dep
+winsock           = platform_windows ? cc.find_library('ws2_32') : no_dep
+
+atk               = dependency('atk',                version: '>=2.4.0')
+
+babl              = dependency('babl',               version: '>=0.1.72')
+
+cairo             = dependency('cairo',              version: '>=1.12.2')
+
+dbus_glib         = dependency('dbus-glib-1')
+
+# fontconfig_name   = platform_windows ? 'fontconfig_win32' : 'fontconfig'
+fontconfig_name   = 'fontconfig'
+fontconfig        = dependency(fontconfig_name,      version: '>=2.12.4')
+
+freetype2         = dependency('freetype2',          version: '>=2.1.7')
+
+gdk_pixbuf        = dependency('gdk-pixbuf-2.0',     version: '>=2.30.8')
+
+gegl              = dependency('gegl-0.4',           version: '>=0.4.17')
+
+gexiv2            = dependency('gexiv2',             version: '>=0.10.6')
+
+gio               = dependency('gio-2.0')
+gio_specific_name = platform_windows ? 'gio-windows-2.0' : 'gio-unix-2.0'
+gio_specific      = dependency(gio_specific_name)
+
+glib_version = platform_windows ? '>=2.56.2' : '>=2.54.2'
+glib              = dependency('glib-2.0',           version: glib_version)
+conf.set('G_DISABLE_DEPRECATED',    glib.version().version_compare('>=2.57'))
+
+gobject           = dependency('gobject-2.0',        version: '>=2.54.2')
+gmodule           = dependency('gmodule-no-export-2.0')
+
+gtk3              = dependency('gtk+-3.0',           version: '>=3.16.10')
+
+harfbuzz          = dependency('harfbuzz',           version: '>=0.9.19')
+lcms              = dependency('lcms2',              version: '>=2.8')
+
+libmypaint        = dependency('libmypaint',         version: '>=1.3.0')
+
+libmypaint_brushes= relocatable_bundle ? no_dep : \
+  dependency('mypaint-brushes-1.0', version: '>=1.3.0', required: false)
+
+libmypaint_brushes_dir = libmypaint_brushes.get_pkgconfig_variable(
+  'brushesdir',
+  default: '${gimp_installation_dir}'/'share'/'mypaint-data'/'1.0'/'brushes',
+)
+
+conf.set_quoted('MYPAINT_BRUSHES_DIR', libmypaint_brushes_dir)
+
+pangocairo        = dependency('pangocairo',         version: '>=1.29.4')
+pangoft2          = dependency('pangoft2',           version: '>=1.29.4')
+rsvg              = dependency('librsvg-2.0',        version: '>=2.40.6')
+
+conf.set('PANGO_DISABLE_DEPRECATED',pangocairo.version().version_compare('<1.43'))
+
+
+################################################################################
+# Check for GLib Networking
+
+glib_networking_works_run = cc.run(
+  '''#include <gio/gio.h>
+  int main() {
+    return !g_tls_backend_supports_tls (g_tls_backend_get_default ());
+  }''',
+  dependencies: gio,
+)
+glib_networking_works =(glib_networking_works_run.compiled()
+                    and glib_networking_works_run.returncode() == 0)
+
+if not glib_networking_works
+  if meson.is_cross_build()
+    warning('''
+      Test for glib-networking cannot be performed while cross-compiling.
+      Make sure glib-networking is installed, otherwise GIMP will not be able
+      to display the remote help pages through the help browser, nor will it
+      be able to open remote HTTPS (or other protocol using SSL/TLS) files.
+      HTTPS is becoming the expected standard and should not be considered
+      optional anymore.
+    ''')
+  else
+    error('Test for glib-networking failed. This is required.')
+  endif
+endif
+
+################################################################################
+# Check if Pango is built with a recent fontconfig
+
+pango_check_run = cc.run(
+  '''#include <fontconfig/fontconfig.h>
+  int main() {
+    FcObjectSet *os; os = FcObjectSetBuild (FC_FAMILY, FC_WIDTH);
+  }''',
+  dependencies: fontconfig,
+)
+pango_check =(pango_check_run.compiled()
+          and pango_check_run.returncode() == 0)
+
+if not pango_check
+  warning('\n  *** '.join([
+  'You have a fontconfig >= fontconfig_required_version installed on your',
+  'system, but your Pango library is using an older version. This old version',
+  'is probably in /usr/X11R6. Look at the above output, and note that the',
+  'result for FONTCONFIG_CFLAGS is not in the result for PANGOCAIRO_CFLAGS,',
+  'and that there is likely an extra -I line, other than the ones for GLIB,',
+  'Freetype, and Pango itself. That\'s where your old fontconfig files are.',
+  'Rebuild pango, and make sure that it uses the newer fontconfig.',
+  'The easiest way be sure of this is to simply get rid of the old',
+  'fontconfig. When you rebuild pango, make sure the result for',
+  'FONTCONFIG_CFLAGS is the same as the result here.',
+  ]))
+endif
+
+################################################################################
+# Optional Dependencies
+
+libsocket         = cc.find_library('socket', required: false)
+conf.set('HAVE_LIBSOCKET', libsocket.found())
+
+################################################################################
+# Check for extension support
+
+appstream_glib = dependency('appstream-glib',     version: '>=0.7.7')
+
+libarchive = dependency('libarchive')
+
+
+################################################################################
+# Check for debug console (Win32)
+
+if platform_windows
+  conf.set('ENABLE_WIN32_DEBUG_CONSOLE', get_option('win32-debug-console'))
+endif
+
+################################################################################
+# Check for 32-bit DLLs (Win32 64-bit)
+
+if platform_windows and arch_x86_64
+  conf.set_quoted('WIN32_32BIT_DLL_FOLDER', get_option('win32-32bits-dll-folder'))
+endif
+
+################################################################################
+# Check for detailed backtraces support
+
+## Check for libbacktrace
+
+libbacktrace = ( get_option('libbacktrace')
+  ? cc.find_library('backtrace', has_headers: 'backtrace.h', required: false)
+  : no_dep
+)
+conf.set('HAVE_LIBBACKTRACE', libbacktrace.found())
+
+## Check for libunwind
+libunwind = ( get_option('libunwind')
+  ? dependency('libunwind', version: '>=1.1.0', required: false)
+  : no_dep
+)
+conf.set('HAVE_LIBUNWIND', libunwind.found())
+
+
+## Check for Dr. Mingw
+drmingw = no_dep
+if platform_windows
+  exchndl = cc.find_library('exchndl')
+  exchndl_fn = cc.has_function('ExcHndlSetLogFileNameA', dependencies: exchndl)
+  if exchndl.found() and exchndl_fn
+    drmingw = declare_dependency(dependencies: exchndl)
+  endif
+endif
+conf.set('HAVE_EXCHNDL', drmingw.found())
+
+
+detailed_backtraces = (
+  libbacktrace.found() or
+  libunwind.found() or
+  drmingw.found()
+)
+
+################################################################################
+# Check for x11 support
+
+x11_target = gtk3.get_pkgconfig_variable('targets').contains('x11')
+
+x11   = x11_target ? dependency('x11')    : no_dep
+xmu   = x11_target ? dependency('xmu')    : no_dep
+xext  = x11_target ? dependency('xext')   : no_dep
+xfixes= x11_target ? dependency('xfixes') : no_dep
+x11_deps = [ x11, xmu, xext, xfixes ]
+conf.set('HAVE_XFIXES', xfixes.found())
+
+if x11_target
+  foreach header : [ 'X11/Xmu/WinUtil.h', 'X11/extensions/shape.h', ]
+    if not cc.has_header(header, dependencies: [ xext, xmu ])
+      error('x11 install does not provide required header ' + header)
+    endif
+  endforeach
+
+  foreach function : [ 'XmuClientWindow', 'XShapeGetRectangles', ]
+    if not cc.has_function(function, dependencies: [ xext, xmu ])
+      error('x11 install does not provide required function ' + function)
+    endif
+  endforeach
+endif
+conf.set('HAVE_X11_EXTENSIONS_SHAPE_H', x11_target and cc.has_header('X11/extensions/shape.h'))
+conf.set('HAVE_X11_XMU_WINUTIL_H',      x11_target and cc.has_header('X11/Xmu/WinUtil.h'))
+
+
+# Features requiring x11
+
+have_doc_shooter= x11_target
+
+if get_option('print').disabled()
+  have_print = false
+elif get_option('print').enabled() and not x11_target
+  error('Printing requires x libs')
+else
+  have_print = x11_target
+endif
+
+if get_option('screenshot').disabled()
+  have_screenshot = false
+elif get_option('screenshot').enabled() and not x11_target
+  error('Printing requires x libs')
+else
+  have_screenshot = x11_target
+endif
+
+################################################################################
+# Plugins (optional dependencies)
+
+# The list of MIME types that are supported by plug-ins
+MIMEtypes = [
+  'image/bmp',
+  'image/g3fax',
+  'image/gif',
+  'image/svg+xml',
+  'image/x-compressed-xcf',
+  'image/x-fits',
+  'image/x-gimp-gbr',
+  'image/x-gimp-gih',
+  'image/x-gimp-pat',
+  'image/x-pcx',
+  'image/x-portable-anymap',
+  'image/x-portable-bitmap',
+  'image/x-portable-graymap',
+  'image/x-portable-pixmap',
+  'image/x-psd',
+  'image/x-sgi',
+  'image/x-tga',
+  'image/x-xbitmap',
+  'image/x-xcf',
+  'image/x-xwindowdump',
+]
+
+
+
+libtiff = dependency('libtiff-4', required: get_option('tiff'))
+if libtiff.found()
+  MIMEtypes += 'image/tiff'
+endif
+
+
+libjpeg = dependency('libjpeg', required: get_option('jpeg'))
+conf.set('HAVE_LIBJPEG', libjpeg.found())
+if libjpeg.found()
+  MIMEtypes += 'image/jpeg'
+endif
+
+
+zlib = dependency('zlib')
+MIMEtypes += 'image/x-psp'
+
+bz2 = cc.find_library('bz2')
+
+liblzma = dependency('liblzma', version: '>=5.0.0')
+
+
+ghostscript = cc.find_library('gs', required: get_option('ghostscript'))
+if ghostscript.found()
+  MIMEtypes += 'application/postscript'
+else
+  ghostscript = disabler()
+endif
+
+
+libpng = dependency('libpng', version: '>=1.6.25', required: get_option('png'))
+if libpng.found()
+  MIMEtypes += [ 'image/png', 'image/x-icon']
+endif
+
+
+libmng = cc.find_library('mng', required: get_option('mng'))
+
+libaa = cc.find_library('aa', required: get_option('aa'))
+
+libxpm = dependency('xpm', required: get_option('xpm'))
+if libxpm.found()
+  MIMEtypes += 'image/x-xpixmap'
+endif
+
+
+openexr = dependency('OpenEXR', version: '>=1.6.1', required: get_option('openexr'))
+if openexr.found()
+  MIMEtypes += 'image/x-exr'
+endif
+
+webp_libs = [
+  dependency('libwebp',     version: '>=0.6.0', required: get_option('webp')),
+  dependency('libwebpmux',  version: '>=0.6.0', required: get_option('webp')),
+  dependency('libwebpdemux',version: '>=0.6.0', required: get_option('webp')),
+]
+webp_found = true
+foreach lib : webp_libs
+  webp_found = webp_found and  lib.found()
+endforeach
+
+if webp_found
+  MIMEtypes += 'image/x-webp'
+endif
+
+
+libheif = dependency('libheif', version: '>=1.3.2', required: get_option('heif'))
+conf.set('HAVE_LIBHEIF_4_1_0', libheif.version().version_compare('>=1.4.0'))
+
+if libheif.found()
+  MIMEtypes += [
+    'image/heif',
+    'image/heic',
+  ]
+endif
+
+webkit = dependency('webkit2gtk-4.0', version: '>=2.20.3', required: get_option('webkit'))
+conf.set('HAVE_WEBKIT', webkit.found())
+
+
+if get_option('poppler')
+  poppler = [
+    dependency('poppler-glib', version: '>=0.69.0'),
+    dependency('poppler-data', version: '>=0.4.9'),
+  ]
+else
+  poppler = no_dep
+endif
+
+
+cairopdf = dependency('cairo-pdf', version: '>=1.12.2', required: get_option('cairo-pdf'))
+
+# PDF import support is a granted feature.
+MIMEtypes += 'application/pdf'
+
+wmf = dependency('libwmf', version: '>=0.2.8', required: get_option('wmf'))
+if wmf.found()
+  MIMEtypes += 'image/x-wmf'
+endif
+
+
+openjpeg = dependency('libopenjp2', version: '>=2.1.0', required: get_option('jpeg2000'))
+if openjpeg.found()
+  MIMEtypes += [ 'image/jp2', 'image/jpeg2000', 'image/jpx', ]
+endif
+
+
+xmc = dependency('xcursor', required: get_option('xcursor'))
+if xmc.found()
+  MIMEtypes += 'image/x-xcursor'
+endif
+
+
+alsa = dependency('alsa', version: '>=1.0.0', required: get_option('alsa'))
+conf.set('HAVE_ALSA', alsa.found())
+
+
+if get_option('linux-input').disabled()
+  have_linuxinput = false
+elif get_option('linux-input').enabled() and not cc.has_header('linux/input.h')
+  error('linux/input.h header not found.')
+else
+  have_linuxinput = x11_target
+endif
+
+# DirectX DirectInput
+directx = no_dep
+directx_sdk_path = get_option('directx-sdk-dir')
+if directx_sdk_path != '' and platform_windows
+  if directx_sdk_path.contains(' ') or directx_sdk_path.contains('\\')
+    error('\n'.join([
+      'The DirectX SDK path should be given :',
+      '* without spaces (use MSys mounts)',
+      '* with plain (forward) slashes only,'
+    ]))
+  endif
+
+  directx = declare_dependency(
+    link_with: cc.find_library('dxguid',
+                  dirs:  directx_sdk_path / 'Lib' / 'x86'),
+    include_directories: directx_sdk_path / 'Include',
+  )
+endif
+conf.set('HAVE_DX_DINPUT', directx.found())
+
+gudev = dependency('gudev-1.0', version: '>=167', required: get_option('gudev'))
+conf.set('HAVE_LIBGUDEV', gudev.found())
+
+
+################################################################################
+# Email sending
+email_message = false
+
+sendmail_choice = get_option('with-sendmail')
+if not [ '', 'false', 'no', ].contains(sendmail_choice)
+  if [ 'true', 'yes' ].contains(sendmail_choice)
+    sendmail_path = 'sendmail'
+  else
+    sendmail_path = sendmail_choice
+  endif
+
+  sendmail = find_program(sendmail_path, required: false)
+  if sendmail.found()
+    sendmail_path = sendmail.path()
+  else
+    warning(
+      'Sendmail specified but not found. It should be installed at runtime!'
+    )
+  endif
+
+  email_message = '@0@ (@1@)'.format(true, sendmail_path)
+  conf.set_quoted('SENDMAIL', sendmail_path)
+else
+  xdg_email_path = 'xdg-email'
+  xdg_email = find_program(xdg_email_path, required: false)
+  if xdg_email.found()
+    xdg_email_path = xdg_email.path()
+  else
+    warning(
+      'Xdg-email not found, but required at runtime for email sending.'
+    )
+  endif
+
+  email_message = '@0@ (@1@)'.format(true, xdg_email_path)
+endif
+
+
+################################################################################
+# ISO codes
+
+isocodes = dependency('iso-codes')
+isocodes_prefix = isocodes.get_pkgconfig_variable('prefix')
+isocodes_location = isocodes_prefix / get_option('datadir') / 'xml' / 'iso-codes'
+isocodes_localedir= isocodes_prefix / get_option('datadir') / 'locale'
+conf.set('HAVE_ISO_CODES', isocodes.found())
+
+
+################################################################################
+# Program tools
+
+perl = find_program('perl5', 'perl', 'perl5.005', 'perl5.004', 'perl')
+
+## Python
+
+# By default, we want packagers to install Python plug-ins to get the
+# optimum experience. -Dpython=true will check for a Python 3
+# interpreter and PyGObject, and warns without.
+# It is up to the packager to ensure they are available at run time.
+# This can be useful in particular when cross-compiling since anyway
+# the interpreter is not useful at build time.
+
+python3_required_version = '>=3.6.0'
+
+if get_option('python') == 'never'
+  warning('''
+    You disabled the installation of core Python plug-ins. This is discouraged
+    as it won't provide the full GIMP experience.
+    Note that you may install the Python plug-ins even if you have no Python
+    interpreter at build-time by passing the configure option -Dpython=always.
+    Just make sure that a Python @0@ interpreter is available at run-time.
+  '''.format(python3_required_version))
+
+  have_python = false
+
+else
+  always_install = get_option('python') == 'always'
+
+  python = pythonmod.find_installation('python3', required: false)
+
+  python_found = (
+    python.found() and
+    python.language_version().version_compare(python3_required_version)
+  )
+  if python_found
+    pygobject_found = run_command(
+      python, '-c',
+      '\n'.join([
+        '''import sys, gi''',
+        '''version = '@0@' '''.format('3.0'),
+        '''sys.exit(gi.check_version(version))''',
+      ]),
+    ).returncode() == 0
+    python_found = python_found and pygobject_found
+  endif
+
+  if (not python_found) and (not always_install)
+    error('''
+    Python @0@ or PyGObject was not found.
+    Note that you may install the Python plug-ins even if you have no Python
+    interpreter at build-time by passing the configure option -Dpython=always.
+    Just make sure that a Python @0@ interpreter is available at run-time.
+    '''.format(python3_required_version))
+  endif
+
+  if (not python_found) and (always_install)
+    warning('''
+    Python @0@ or PyGObject was not found.
+    Python plug-ins will be installed anyway but you should make sure that
+    a compatible Python interpreter is available at installation, otherwise
+    installed plug-ins won't be usable.
+    '''.format(python3_required_version))
+  endif
+
+  have_python = python_found or always_install
+endif
+
+## Javascript
+
+if get_option('javascript') == 'never'
+  warning('''
+    You disabled the installation of core Javascript plug-ins. This is
+    discouraged as it won't provide the full GIMP experience.
+    Note that you may install the Javascript plug-ins even if you have no GJS
+    interpreter at build-time by passing the configure option -Djavascript=always.
+    Just make sure that the GJS interpreter is available at run-time.
+  ''')
+  have_javascript = false
+
+else
+  always_install = get_option('javascript') == 'always'
+
+  gjs = find_program('gjs', required: false)
+
+  if (not gjs.found()) and (not always_install)
+    error('''
+    GJS was not found.
+    Note that you may install the Javascript plug-ins even if you have no GJS
+    interpreter at build-time by passing the configure option -Djavascript=always.
+    Just make sure that the GJS interpreter is available at run-time.
+    ''')
+  endif
+
+  if (not gjs.found()) and (always_install)
+    warning('''
+    GJS was not found.
+    JavaScript plug-ins will be installed anyway but you should make sure that
+    the JavaScript interpreter GJS is available at installation, otherwise
+    installed plug-ins won't be usable.
+    ''')
+  endif
+
+  have_javascript = gjs.found() or always_install
+endif
+
+## Lua
+
+if get_option('lua') == 'never'
+  warning('''
+    You disabled the installation of core Lua plug-ins. This is discouraged
+    as it won't provide the full GIMP experience.
+    Note that you may install the Lua plug-ins even if you have no Lua LGI
+    interpreter at build-time by passing the configure option -Dlua=always.
+    Just make sure that the Lua LGI interpreter is available at run-time.
+  ''')
+  have_lua = false
+
+else
+  always_install = get_option('lua') == 'always'
+
+  lua = find_program('luajit', required: false)
+
+  if (not lua.found()) and (not always_install)
+    error('''
+    Luajit was not found.
+    Note that you may install the Lua plug-ins even if you have no Lua LGI
+    interpreter at build-time by passing the configure option -Dlua=always.
+    Just make sure that the Lua LGI interpreter is available at run-time.
+    ''')
+  endif
+
+  if (not lua.found()) and always_install
+    warning('''
+    Luajit was not found.
+    Lua plug-ins will be installed anyway but you should make sure that
+    luajit and LGI are available at installation, otherwise
+    installed plug-ins won't be usable.
+    ''')
+  endif
+
+  have_lua = lua.found() or always_install
+endif
+
+
+# Check for GTK Mac Integration
+if platform_osx and (gtk3.get_pkgconfig_variable('targets').contains('xquartz'))
+  gtk3_macos = dependency('gtk-mac-integration', version: '>=2.0.0')
+else
+  gtk3_macos = no_dep
+endif
+
+# Check for XML tools
+xmllint             = find_program('xmllint', required: false)
+xsltproc            = find_program('xsltproc')
+intltool_merge      = find_program('intltool-merge')
+desktop_validate    = find_program('desktop-file-validate', required: false)
+
+appstream_util = find_program('appstream-util', required: get_option('appdata-test'))
+
+# Check for doc generation tools
+have_gtk_doc = get_option('gtk-doc')
+
+# Check for vector icons
+have_vector_icons = get_option('vec-icons')
+if have_vector_icons
+  # shared-mime-info is needed to correctly detect SVG files
+  # (except on Windows, apparently).
+  if platform_windows
+    warning('''
+      You enabled vector icons on Win32. Make sure to run:
+      $ gdk-pixbuf-query-loaders.exe --update-cache
+      on the target machine (this command generates loaders.cache)
+      so that GdkPixbuf knows where to find the SVG loader.
+    ''')
+  else
+    shared_mime_info = dependency('shared-mime-info')
+  endif
+endif
+
+xvfb_run = find_program('xvfb-run', required: get_option('xvfb-run'))
+conf.set('HAVE_XVFB_RUN', xvfb_run.found())
+
+# Set bug report URL
+
+# Allowing third-party packagers to set their own bugtracker URL, in
+# order to filter first packaging bugs from core bugs.
+bug_report_url = get_option('bug-report-url')
+
+if bug_report_url == ''
+  message('''
+    NOTE: if you plan on packaging GIMP for distribution, it is recommended
+    to override the bug report URL with option:
+      -Dbug-report-url=https://example.com/
+    so that you can filter packaging bugs from core bugs before reporting upstream.
+  ''')
+
+  bug_report_url = project_url_issues
+endif
+conf.set_quoted('PACKAGE_BUGREPORT', project_url_issues)
+conf.set_quoted('BUG_REPORT_URL', bug_report_url)
+
+# Default ICC directory #
+
+# This is necessary because some Unix systems may have a different
+# standard path for color profiles. And in particular, sandbox builds
+# might mount the host system at a different root. This is for
+# instance the case of flatpak which mount the host root at /run/host/.
+
+# if not (platform_osx or platform_windows)
+
+icc_directory = get_option('icc-directory')
+if icc_directory == ''
+  icc_directory = '/usr/share/color/icc'
+endif
+conf.set_quoted('COLOR_PROFILE_DIRECTORY', icc_directory)
+
+# endif
+
+enable_default_bin = get_option('enable-default-bin')
+enable_console_bin = get_option('enable-console-bin')
+
+
+# Possibly change default gimpdir from $XDG_CONFIG_HOME/GIMP/gimp_user_version
+gimpdir = get_option('gimpdir')
+if gimpdir == ''
+  # Default value
+  gimpdir = meson.project_name().to_upper()
+endif
+
+project_subdir = meson.project_name() / gimp_app_version
+gimpdatadir    = get_option('datadir')    / project_subdir
+gimpplugindir  = get_option('libdir')     / project_subdir
+gimpsysconfdir = get_option('sysconfdir') / project_subdir
+gimpmanpagedir = gimpdir
+localedir      = get_option('datadir') / 'locale'
+
+
+
+# Check for internal tools
+defcheck            = find_program('tools'/'defcheck.py')
+extract_vector_icon = find_program('tools'/'extract-vector-icon.sh')
+generate_changelog  = find_program('tools'/'generate_changelog.sh')
+generate_news       = find_program('tools'/'generate-news')
+gimppath2svg        = find_program('tools'/'gimppath2svg.py')
+module_dependencies = find_program('tools'/'module-dependencies.py')
+
+gimp_mkenums        = find_program('tools'/'gimp-mkenums')
+gimp_mkenums_custom_target_commonargs = [
+  '--fprod','/* enumerations from "@basename@" */\n',
+  '--vhead','GType\n'+
+            '@enum_name@_get_type (void)\n'+
+            '{\n'+
+            '  static const G@Type@Value values[] =\n'+
+            '  {',
+  '--vprod','    { @VALUENAME@, "@VALUENAME@", "@valuenick@" },',
+  '--vtail','    { 0, NULL, NULL }\n'+
+            '  };\n',
+  '--dhead','  static const Gimp@Type@Desc descs[] =\n'+
+            '  {',
+  '--dprod','    {\n'+
+            '      @VALUENAME@, @valuedesc@, @valuehelp@\n'+
+            '    },\n'+
+            '    @if (\'@valueabbrev@\' ne \'NULL\')@\n'+
+            '    /* Translators:\n'+
+            '       this is an abbreviated version of @valueudesc@.\n'+
+            '       Keep it short. */\n'+
+            '    { @VALUENAME@, @valueabbrev@, NULL },\n'+
+            '    @endif@',
+  '--dtail','    { 0, NULL, NULL }\n'+
+            '  };\n'+
+            '\n'+
+            '  static GType type = 0;\n'+
+            '\n'+
+            '  if (G_UNLIKELY (! type))\n'+
+            '    {\n'+
+            '      type = g_@type@_register_static ("@EnumName@", values);\n'+
+            '      gimp_type_set_translation_context (type, "@enumnick@");\n'+
+            '      gimp_@type@_set_value_descriptions (type, descs);\n'+
+            '    }\n'+
+            '\n'+
+            '  return type;\n'+
+            '}\n',
+  '@INPUT@',
+]
+
+
+conf.set('ENABLE_NLS',   true)
+conf.set('HAVE_GETTEXT', true)
+
+# localedir = get_option('prefix') / get_option('localedir')
+
+
+################################################################################
+# Miscelaneous configuration
+
+#     #
+##   ## #  ####   ####
+# # # # # #      #    #
+#  #  # #  ####  #
+#     # #      # #
+#     # # #    # #    #
+#     # #  ####   ####
+
+
+
+# Enable support for multiprocessing
+conf.set10('ENABLE_MP', get_option('enable-multiproc'))
+
+# Check for available functions
+foreach fn : [
+    { 'm': 'HAVE_ALLOCA',                   'v': 'alloca', },
+    { 'm': 'HAVE_BACKTRACE',                'v': 'backtrace', },
+    { 'm': 'HAVE_DCGETTEXT',                'v': 'dcgettext', },
+    { 'm': 'HAVE_DIFFTIME',                 'v': 'difftime', },
+    { 'm': 'HAVE_FINITE',                   'v': 'finite', },
+    { 'm': 'HAVE_FINITE',                   'v': 'finite', },
+    { 'm': 'HAVE_FSYNC',                    'v': 'fsync', },
+    { 'm': 'HAVE_GETADDRINFO',              'v': 'getaddrinfo', },
+    { 'm': 'HAVE_GETNAMEINFO',              'v': 'getnameinfo', },
+    { 'm': 'HAVE_GETTEXT',                  'v': 'gettext', },
+    { 'm': 'HAVE_ISFINITE',                 'v': 'isfinite', },
+    { 'm': 'HAVE_MMAP',                     'v': 'mmap', },
+    { 'm': 'HAVE_RINT',                     'v': 'rint', },
+    { 'm': 'HAVE_THR_SELF',                 'v': 'thr_self', },
+    { 'm': 'HAVE_VFORK',                    'v': 'vfork', },
+  ]
+  conf.set(fn['m'],
+    cc.has_function(fn['v']) ? 1 : false
+  )
+endforeach
+
+conf.set('HAVE_BIND_TEXTDOMAIN_CODESET',
+  cc.has_header_symbol('libintl.h', 'bind_textdomain_codeset') ? 1 : false
+)
+conf.set('HAVE_VPRINTF',
+  cc.has_header_symbol('libintl.h', 'vprintf') ? 1 : false
+)
+
+
+# Check for available headers
+foreach header : [
+    { 'm': 'HAVE_ALLOCA_H',       'v': 'alloca.h' },
+    { 'm': 'HAVE_DLFCN_H',        'v': 'dlfcn.h' },
+    { 'm': 'HAVE_EXECINFO_H',     'v': 'execinfo.h' },
+    { 'm': 'HAVE_FCNTL_H',        'v': 'fcntl.h' },
+    { 'm': 'HAVE_IEEEFP_H',       'v': 'ieeefp.h' },
+    { 'm': 'HAVE_INTTYPES_H',     'v': 'inttypes.h' },
+    { 'm': 'HAVE_LOCALE_H',       'v': 'locale.h' },
+    { 'm': 'HAVE_MATH_H',         'v': 'math.h' },
+    { 'm': 'HAVE_MEMORY_H',       'v': 'memory.h' },
+    { 'm': 'HAVE_STDINT_H',       'v': 'stdint.h' },
+    { 'm': 'HAVE_STDLIB_H',       'v': 'stdlib.h' },
+    { 'm': 'HAVE_STRING_H',       'v': 'string.h' },
+    { 'm': 'HAVE_STRINGS_H',      'v': 'strings.h' },
+    { 'm': 'HAVE_SYS_PARAM_H',    'v': 'sys/param.h' },
+    { 'm': 'HAVE_SYS_SELECT_H',   'v': 'sys/select.h' },
+    { 'm': 'HAVE_SYS_STAT_H',     'v': 'sys/stat.h' },
+    { 'm': 'HAVE_SYS_THR_H',      'v': 'sys/thr.h' },
+    { 'm': 'HAVE_SYS_TIME_H',     'v': 'sys/time.h' },
+    { 'm': 'HAVE_SYS_TIMES_H',    'v': 'sys/times.h' },
+    { 'm': 'HAVE_SYS_TYPES_H',    'v': 'sys/types.h' },
+    { 'm': 'HAVE_SYS_WAIT_H',     'v': 'sys/wait.h' },
+    { 'm': 'HAVE_UNISTD_H',       'v': 'unistd.h' },
+    { 'm': 'HAVE_MMAN_H',         'v': 'sys/mman.h' },
+    { 'm': 'HAVE_IPC_H',          'v': 'sys/ipc.h' },
+    { 'm': 'HAVE_SHM_H',          'v': 'sys/shm.h' },
+  ]
+  conf.set(header['m'], cc.has_header(header['v']) ? 1 : false)
+endforeach
+
+
+
+################################################################################
+# Check for shared memory handling
+
+shmem_choice = get_option('shmem-type')
+if shmem_choice == 'auto'
+  shmem_choice = 'sysv'
+
+  # MacOS X has broken SysV shm
+  if platform_osx
+    shmem_choice = 'posix'
+  endif
+  if platform_windows
+    shmem_choice = 'win32'
+  endif
+endif
+
+if shmem_choice == 'sysv'
+  check_ip_rmid_deferred_release = cc.run('''
+  #include <sys/types.h>
+  #include <sys/ipc.h>
+  #include <sys/shm.h>
+  int main() {
+    int id = shmget(IPC_PRIVATE, 4, IPC_CREAT | 0600);
+    if (id == -1)
+      exit(2);
+
+    char *shmaddr = shmat(id, 0, 0);
+    shmctl(id, IPC_RMID, 0);
+    if ((char*) shmat(id, 0, 0) == (char*) -1) {
+      shmdt(shmaddr);
+      exit(1);
+    }
+    shmdt(shmaddr);
+    shmdt(shmaddr);
+    exit(0);
+  }
+  ''').returncode() == 0
+  conf.set('IPC_RMID_DEFERRED_RELEASE', check_ip_rmid_deferred_release)
+  conf.set('USE_SYSV_SHM', true)
+elif shmem_choice == 'posix'
+  conf.set('USE_POSIX_SHM', true)
+endif
+
+
+conf.set('NO_FD_SET',
+  not platform_windows
+  and not cc.compiles('''
+    #include <sys/types.h>
+    int main() { fd_set readMask, writeMask; return 0; }
+  ''')
+)
+
+# GCC attributes
+conf.set('HAVE_FUNC_ATTRIBUTE_DESTRUCTOR',
+  cc.compiles('''__attribute__ ((destructor)) void destructor_fn(void) { }''')
+)
+
+
+
+
+################################################################################
+# Set/regroup common CFlags for subdirs
+
+######
+#     # ###### ###### # #    # ######  ####
+#     # #      #      # ##   # #      #
+#     # #####  #####  # # #  # #####   ####
+#     # #      #      # #  # # #           #
+#     # #      #      # #   ## #      #    #
+######  ###### #      # #    # ######  ####
+
+# Compiler
+conf.set_quoted('CC',             cc.get_id())
+conf.set_quoted('CC_VERSION',     cc.version())
+
+# Names
+conf.set_quoted('GIMP_PACKAGE',   meson.project_name())
+conf.set_quoted('PACKAGE_NAME',   meson.project_name())
+conf.set_quoted('PACKAGE_STRING', package_string)
+conf.set_quoted('GIMP_COMMAND',   gimp_command)
+
+# Versions
+conf.set_quoted('GIMP_APP_VERSION_STRING',gimp_app_version)
+conf.set_quoted('GIMP_APP_VERSION',       gimp_app_version)
+conf.set_quoted('GIMP_USER_VERSION',      gimp_app_version)
+
+conf.set_quoted('GIMP_DATA_VERSION',      gimp_app_version)
+conf.set_quoted('GIMP_PLUGIN_VERSION',    gimp_app_version)
+conf.set_quoted('GIMP_SYSCONF_VERSION',   gimp_app_version)
+conf.set_quoted('GIMP_TOOL_VERSION',      gimp_app_version)
+conf.set_quoted('GIMP_PKGCONFIG_VERSION', gimp_api_version)
+
+# Directories
+conf.set_quoted('PREFIX',          prefix)
+conf.set_quoted('EXEC_PREFIX',     prefix)
+conf.set_quoted('GIMPDIR',         gimpdir)
+conf.set_quoted('GIMPSYSCONFDIR',  prefix / gimpsysconfdir)
+conf.set_quoted('GIMPDATADIR',     prefix / gimpdatadir)
+conf.set_quoted('GIMPPLUGINDIR',   prefix / gimpplugindir)
+conf.set_quoted('PLUGINDIR',       prefix / gimpplugindir)
+conf.set_quoted('LOCALEDIR',       prefix / localedir)
+
+conf.set_quoted('LOCALSTATEDIR',   prefix / get_option('localstatedir'))
+# /usr/com?
+conf.set_quoted('SHAREDSTATEDIR',  prefix / get_option('sharedstatedir'))
+conf.set_quoted('SYSCONFDIR',      prefix / get_option('sysconfdir'))
+conf.set_quoted('BINDIR',          prefix / get_option('bindir'))
+conf.set_quoted('DATAROOTDIR',     prefix / get_option('datadir'))
+conf.set_quoted('INFODIR',         prefix / get_option('infodir'))
+conf.set_quoted('LIBDIR',          prefix / get_option('libdir'))
+conf.set_quoted('LIBEXECDIR',      prefix / get_option('libexecdir'))
+conf.set_quoted('MANDIR',          prefix / get_option('mandir'))
+conf.set_quoted('SBINDIR',         prefix / get_option('sbindir'))
+conf.set_quoted('SYSDATADIR',      prefix / get_option('datadir'))
+
+# Third-party/Misc
+conf.set_quoted('ISO_CODES_LOCATION',    isocodes_location)
+conf.set_quoted('ISO_CODES_LOCALEDIR',   isocodes_localedir)
+
+
+if platform_osx
+  # libgimp_cflags += '-xobjective-c'
+  # libgimp_lflags += ['-framework', 'Cocoa']
+endif
+
+
+################################################################################
+# Generate files
+
+  #####                                   #######
+ #     #  ####  #    # ###### #  ####     #       # #      ######  ####
+ #       #    # ##   # #      # #    #    #       # #      #      #
+ #       #    # # #  # #####  # #         #####   # #      #####   ####
+ #       #    # #  # # #      # #  ###    #       # #      #           #
+ #     # #    # #   ## #      # #    #    #       # #      #      #    #
+  #####   ####  #    # #      #  ####     #       # ###### ######  ####
+
+
+
+gitversion_h1 = vcs_tag(
+  input : 'app/git-version.h.in',
+  output: 'git-version.h.in.1',
+  command: [ 'git', 'describe', '--always', ],
+  replace_string: '@GIMP_GIT_VERSION@',
+  fallback: '',
+)
+gitversion_h2 = vcs_tag(
+  input : gitversion_h1,
+  output: 'git-version.h.in.2',
+  command: [ 'git', 'rev-parse', '--short', 'HEAD', ],
+  replace_string: '@GIMP_GIT_VERSION_ABBREV@',
+  fallback: '',
+)
+gitversion_h = vcs_tag(
+  input : gitversion_h2,
+  output: 'git-version.h',
+  command: [ 'git', 'log', '-n1', '--date=format:%Y', '--pretty=%cd', ],
+  replace_string: '@GIMP_GIT_LAST_COMMIT_YEAR@',
+  fallback: '',
+)
+
+
+install_conf = configuration_data()
+install_conf.set('GIMP_APP_VERSION', gimp_app_version)
+install_conf.set('GIMP_PKGCONFIG_VERSION', gimp_version)
+install_conf.set('GIMP_VERSION', gimp_version)
+install_conf.set('APPSTREAM_GLIB_REQUIRED_VERSION', appstream_glib.version())
+install_conf.set('ATK_REQUIRED_VERSION',          atk         .version())
+install_conf.set('BABL_REQUIRED_VERSION',         babl        .version())
+install_conf.set('CAIRO_PDF_REQUIRED_VERSION',    cairopdf    .version())
+install_conf.set('CAIRO_REQUIRED_VERSION',        cairo       .version())
+install_conf.set('FONTCONFIG_REQUIRED_VERSION',   fontconfig  .version())
+install_conf.set('FREETYPE2_REQUIRED_VERSION',    freetype2   .version())
+install_conf.set('GDK_PIXBUF_REQUIRED_VERSION',   gdk_pixbuf  .version())
+install_conf.set('GEGL_REQUIRED_VERSION',         gegl        .version())
+install_conf.set('GEXIV2_REQUIRED_VERSION',       gexiv2.version())
+install_conf.set('GLIB_REQUIRED_VERSION',         glib        .version())
+install_conf.set('GTK_REQUIRED_VERSION',          gtk3        .version())
+install_conf.set('HARFBUZZ_REQUIRED_VERSION',     harfbuzz    .version())
+install_conf.set('INTLTOOL_REQUIRED_VERSION',     '0.40.1')
+install_conf.set('LCMS_REQUIRED_VERSION',         lcms        .version())
+install_conf.set('LIBHEIF_REQUIRED_VERSION',      libheif     .version())
+install_conf.set('LIBLZMA_REQUIRED_VERSION',      liblzma     .version())
+install_conf.set('LIBMYPAINT_REQUIRED_VERSION',   libmypaint  .version())
+install_conf.set('LIBPNG_REQUIRED_VERSION',       libpng      .version())
+install_conf.set('OPENEXR_REQUIRED_VERSION',      openexr     .version())
+install_conf.set('OPENJPEG_REQUIRED_VERSION',     openjpeg.version())
+install_conf.set('PANGOCAIRO_REQUIRED_VERSION',   pangocairo  .version())
+install_conf.set('POPPLER_DATA_REQUIRED_VERSION', poppler[1]  .version())
+install_conf.set('POPPLER_REQUIRED_VERSION',      poppler[0]  .version())
+install_conf.set('PYTHON3_REQUIRED_VERSION',      '3.6.0')
+install_conf.set('RSVG_REQUIRED_VERSION',         rsvg        .version())
+install_conf.set('WEBKITGTK_REQUIRED_VERSION',    webkit      .version())
+install_conf.set('WEBP_REQUIRED_VERSION',         webp_libs[0].version())
+install_conf.set('WMF_REQUIRED_VERSION',          wmf         .version())
+install_conf.set('XGETTEXT_REQUIRED_VERSION', '0.19')
+
+configure_file(
+  input : 'INSTALL.in',
+  output: 'INSTALL',
+  configuration: install_conf
+)
+
+
+configure_file(
+  output: 'config.h',
+  configuration: conf
+)
+compiler_args +='-DHAVE_CONFIG_H'
+
+
+add_project_arguments(compiler_args, language: [ 'c', 'cpp' ])
+add_project_link_arguments(linker_args, language: [ 'c', 'cpp' ])
+
+################################################################################
+# Miscelaneous targets
+
+
+ #     #                    #######
+ ##   ## #  ####   ####        #      ##   #####   ####  ###### #####  ####
+ # # # # # #      #    #       #     #  #  #    # #    # #        #   #
+ #  #  # #  ####  #            #    #    # #    # #      #####    #    ####
+ #     # #      # #            #    ###### #####  #  ### #        #        #
+ #     # # #    # #    #       #    #    # #   #  #    # #        #   #    #
+ #     # #  ####   ####        #    #    # #    #  ####  ######   #    ####
+
+
+
+custom_target('AUTHORS',
+  input : [ 'authors.xsl', 'authors.xml', ],
+  output: 'AUTHORS',
+  command: [
+    xsltproc,
+    '-o', '@OUTPUT@',
+    '@INPUT@',
+  ],
+  build_by_default: false,
+)
+custom_target('authors.md',
+  input : [ 'authors4gimp-web.xsl', 'authors.xml', ],
+  output: 'authors.md',
+  command: [
+    xsltproc,
+    '--stringparam', 'today', '`date --iso-8601=seconds`',
+    '-o', '@OUTPUT@',
+    '@INPUT@',
+  ],
+  build_by_default: false,
+)
+
+if xmllint.found()
+  run_target('validate-authors',
+    command: [
+      xmllint,
+      '--noout',
+      '--valid', 'authors.xml',
+    ],
+  )
+endif
+
+if have_python
+  # TODO this python script is waiting for autotools directory/files structure
+  custom_target('check-defs',
+    input : [ ],
+    output: [ 'check-defs', ],
+    command: [
+      find_program(meson.source_root() / 'tools' / 'defcheck.py'),
+      meson.source_root(),
+    ],
+    build_by_default: false,
+  )
+endif
+
+custom_target('Changelog',
+  input : [ ],
+  output: [ 'Changelog', ],
+  command: [
+    generate_changelog,
+    meson.source_root(),
+    '@OUTPUT@'
+  ],
+  build_by_default: false,
+)
+
+
+################################################################################
+# Subdirs
+
+
+rootInclude = include_directories('.')
+appInclude  = include_directories('app')
+
+if platform_windows
+  subdir('build/windows')
+
+  if get_option('windows-installer')
+    subdir('po-windows-installer')
+    subdir('build/windows/installer')
+  endif
+endif
+
+# Tools
+subdir('libgimpbase')
+subdir('tools')
+
+# Translations
+subdir('po')
+subdir('po-libgimp')
+subdir('po-plug-ins')
+subdir('po-python')
+subdir('po-script-fu')
+subdir('po-tags')
+subdir('po-tips')
+# Data / Desktop / xml files
+subdir('cursors')
+subdir('data')
+subdir('desktop')
+subdir('etc')
+subdir('icons')
+subdir('m4macros')
+subdir('menus')
+subdir('themes')
+
+# Libraries (order here is important!)
+subdir('libgimpcolor')
+subdir('libgimpmath')
+subdir('libgimpconfig')
+subdir('libgimpmodule')
+subdir('libgimpthumb')
+subdir('libgimpwidgets')
+subdir('libgimp')
+
+# Executables, plugins
+subdir('modules')
+subdir('plug-ins')
+subdir('app')
+subdir('pdb')
+subdir('app-tools')
+
+# Docs
+subdir('docs')
+if have_gtk_doc
+  subdir('devel-docs')
+endif
+
+
+
+pkgconfig.generate(libgimp,
+  filebase: 'gimp-' + gimp_api_version,
+  name: prettyname,
+  description: 'GIMP Library',
+  version: gimp_version,
+  requires: [
+    gdk_pixbuf,
+    cairo,
+    gegl,
+  ],
+  libraries: [
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+  ],
+  subdirs: [
+    gimp_api_name,
+  ],
+  variables: [
+    'datarootdir='    +'${prefix}/'+ get_option('datadir'),
+    'gimpdatadir='    +'${prefix}/'+ gimpdatadir,
+    'gimplibdir='     +'${prefix}/'+ gimpplugindir,
+    'gimpsysconfdir=' + gimpsysconfdir,
+    'gimplocaledir='  +'${prefix}/'+ localedir,
+  ],
+)
+
+pkgconfig.generate(libgimpthumb,
+  filebase: 'gimpthumb-' + gimp_api_version,
+  name: 'GIMP Thumb',
+  description: 'GIMP Thumbnail Library',
+  version: gimp_version,
+  requires: [
+    libgimp,
+    gdk_pixbuf,
+  ],
+  subdirs: [
+    gimp_api_name,
+  ],
+)
+
+pkgconfig.generate(libgimpui,
+  filebase: 'gimpui-' + gimp_api_version,
+  name: 'GIMP UI',
+  description: 'GIMP User Interface Library',
+  version: gimp_version,
+  requires: [
+    libgimp,
+    gtk3,
+  ],
+  libraries: [
+    libgimpwidgets,
+    libgimpmodule,
+  ],
+  subdirs: [
+    gimp_api_name,
+  ],
+)
+
+
+
+################################################################################
+
+final_message = [
+'''Extra Binaries:''',
+'''  gimp-console:        @0@'''.format(enable_console_bin),
+'',
+'''Optional Features:''',
+'''  Language selection:  @0@'''.format(isocodes.found()),
+'''  Vector icons:        @0@'''.format(have_vector_icons),
+'''  Dr. Mingw (Win32):   @0@'''.format(drmingw.found()),
+'''  Relocatable Bundle:  @0@'''.format(relocatable_bundle),
+'''  Default ICC directory:     @0@'''.format(icc_directory),
+'''  32-bit DLL folder (Win32): @0@'''.format(get_option('win32-32bits-dll-folder')),
+'''  Detailed backtraces:       @0@'''.format(detailed_backtraces),
+'',
+'''Optional Plug-Ins:''',
+'''  Ascii Art:           @0@'''.format(libaa.found()),
+'''  Ghostscript:         @0@'''.format(ghostscript.found()),
+'''  Help Browser:        @0@'''.format(webkit.found()),
+'''  JPEG 2000:           @0@'''.format(openjpeg.found()),
+'''  MNG:                 @0@'''.format(libmng.found()),
+'''  OpenEXR:             @0@'''.format(openexr.found()),
+'''  WebP:                @0@'''.format(webp_found),
+'''  Heif:                @0@'''.format(libheif.found()),
+'''  PDF (export):        @0@'''.format(cairopdf.found()),
+'''  Print:               @0@'''.format(have_print),
+'''  Python 3 plug-ins:   @0@'''.format(have_python),
+'''  Javascript plug-ins: @0@'''.format(have_javascript),
+'''  Lua plug-ins:        @0@'''.format(have_lua),
+'''  TWAIN (Win32):       @0@'''.format(platform_windows),
+'''  Webpage:             @0@'''.format(webkit.found()),
+'''  WMF:                 @0@'''.format(wmf.found()),
+'''  X11 Mouse Cursor:    @0@'''.format(xmc.found()),
+'''  XPM:                 @0@'''.format(libxpm.found()),
+'''  Email:               @0@'''.format(email_message),
+'',
+'''Optional Modules:''',
+'''  ALSA (MIDI Input):   @0@'''.format(alsa.found()),
+'''  Linux Input:         @0@ (GUdev support: @1@)'''
+                                .format(have_linuxinput, gudev.found()),
+'''  DirectInput (Win32): @0@'''.format(directx.found()),
+'',
+'''Tests:''',
+'''  Use xvfb-run         @0@'''.format(xvfb_run.found()),
+'''  Test appdata         @0@'''.format(appstream_util.found()),
+'',
+'''Bug report URL: @0@'''.format(bug_report_url),
+]
+
+message('\n'.join(final_message))
diff --git a/meson.make b/meson.make
new file mode 100755
index 0000000000..be6252674c
--- /dev/null
+++ b/meson.make
@@ -0,0 +1,29 @@
+#!/usr/bin/env -S make -f
+default: build
+
+# This file is executable so you can do
+# ./meson.make
+# ./meson.make install
+
+
+prefix = /usr
+prefix = $(HOME)/.local
+
+
+_build:
+       meson _build --prefix=$(prefix)
+
+
+.PHONY: build
+build: | _build
+       ninja -C _build
+
+
+.PHONY: install
+install:
+       ninja -C _build install
+
+
+.PHONY: clean
+clean:
+       rm -rf _build
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 0000000000..8d3a51f868
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,60 @@
+# Build properties
+option('ansi',              type: 'boolean', value: false,description: 'Turn on strict ansi')
+option('enable-console-bin',type: 'boolean', value: true, description: 'Build a console-only binary which 
does not link GTK+')
+option('win32-debug-console',type:'boolean', value: true, description: 'Open a console when starting the 
program')
+option('enable-default-bin',type: 'boolean', value: true, description: 'Build default Gtk+ binary')
+option('enable-multiproc',  type: 'boolean', value: true, description: 'Support for multiple processors')
+option('profiling',         type: 'boolean', value: false,description: 'Enable profiling')
+option('windows-installer', type: 'boolean', value: false,description: 'Generate files needed for the 
Windows installer')
+option('relocatable-bundle',type: 'boolean', value: false,description: 'build with resources considered 
bundled under the same prefix')
+option('shmem-type',        type: 'combo', value: 'auto', description: 'Shared memory transport type', 
choices: [ 'none', 'sysv', 'posix', 'win32', 'auto' ])
+option('bug-report-url',    type: 'string',  value: '',   description: 'URL used by the debug dialog to 
report bugs')
+option('gimpdir',           type: 'string',  value: '',   description: 'Change default gimpdir from 
~/.config/GIMP/2.9 to ~/.config/DIR/2.9 (if relative), or to DIR (if absolute)')
+option('icc-directory',     type: 'string',  value: '',   description: 'Path to default color profiles for 
this system')
+option('directx-sdk-dir',   type: 'string',  value: '',   description: 'Prefix where the DirectX SDK is 
installed(optional)')
+option('with-sendmail',     type: 'string',  value: '',   description: 'Use Sendmail instead of Xdg-email')
+
+option('win32-32bits-dll-folder', type: 'string',  value: '32/bin', description: 'alternative folder with 
32-bit versions of DLL libraries on Windows')
+option('libunwind',         type: 'boolean', value: true, description: 'Build with libunwind for backtrace')
+option('libbacktrace',      type: 'boolean', value: true, description: 'Build with libbacktrace support')
+
+# Features
+
+option('aa',                type: 'feature', value: 'auto', description: 'AA plugin')
+option('alsa',              type: 'feature', value: 'auto', description: 'Alsa support in midi input 
controller')
+option('appdata-test',      type: 'feature', value: 'auto', description: 'Validate the appdata file')
+option('cairo-pdf',         type: 'feature', value: 'auto', description: 'Cairo-pdf support')
+option('ghostscript',       type: 'feature', value: 'auto', description: 'Ghostscript support')
+option('gudev',             type: 'feature', value: 'auto', description: 'Gudev support')
+option('heif',              type: 'feature', value: 'auto', description: 'HEIF support')
+option('jpeg',              type: 'feature', value: 'auto', description: 'Jpeg support')
+option('jpeg2000',          type: 'feature', value: 'auto', description: 'Jpeg-2000 support')
+option('mng',               type: 'feature', value: 'auto', description: 'Mng support')
+option('openexr',           type: 'feature', value: 'auto', description: 'Openexr support')
+option('png',               type: 'feature', value: 'auto', description: 'PNG support')
+option('print',             type: 'feature', value: 'auto', description: 'Print support')
+option('screenshot',        type: 'feature', value: 'auto', description: 'Screensh')
+option('tiff',              type: 'feature', value: 'auto', description: 'TIFF support')
+option('webkit',            type: 'feature', value: 'auto', description: 'Help browser and webpage plugins')
+option('webp',              type: 'feature', value: 'auto', description: 'Webp support')
+option('wmf',               type: 'feature', value: 'auto', description: 'Wmf support')
+option('xcursor',           type: 'feature', value: 'auto', description: 'Xcursor support')
+option('xpm',               type: 'feature', value: 'auto', description: 'XPM support')
+option('xvfb-run',          type: 'feature', value: 'auto', description: 'Use xvfb-run for UI-dependent 
automatic tests')
+
+option('gtk-doc',           type: 'boolean', value: true,   description: 'Build developer documentation')
+option('gtk-doc-app',       type: 'boolean', value: false,  description: 'Build developer documentation for 
app')
+
+option('linux-input',       type: 'feature', value: 'auto', description: 'Linux input event controller 
module')
+option('poppler',           type: 'boolean', value: true,   description: 'Poppler support')
+option('vec-icons',         type: 'boolean', value: true,   description: 'Use vector icons rather than 
raster ones')
+
+option('javascript',        type: 'combo',   value:'error', description: 'Install Javascript plug-ins',
+  choices: [ 'never', 'always', 'error' ],
+)
+option('lua',               type: 'combo',   value:'error', description: 'Install Lua plug-ins',
+  choices: [ 'never', 'always', 'error' ],
+)
+option('python',            type: 'combo',   value:'error', description: 'Install Python 3 plug-ins',
+  choices: [ 'never', 'always', 'error' ],
+)
diff --git a/modules/meson.build b/modules/meson.build
new file mode 100644
index 0000000000..9b50ae0174
--- /dev/null
+++ b/modules/meson.build
@@ -0,0 +1,95 @@
+
+modules_deps = [
+  gtk3, babl, gegl, math,
+]
+
+color_selector_libs = [
+  libgimpcolor,
+  libgimpconfig,
+  libgimpmodule,
+  libgimpwidgets,
+]
+controller_libs = [
+  libgimpmodule,
+  libgimpwidgets,
+]
+display_filter_libs = [
+  libgimpbase,
+  libgimpcolor,
+  libgimpconfig,
+  libgimpmodule,
+  libgimpwidgets,
+]
+
+# Name, Sources, deps, link.
+modules = [
+  {
+    'name': 'color-selector-cmyk',
+    'link': color_selector_libs,
+  }, {
+    'name': 'color-selector-water',
+    'link': color_selector_libs,
+  }, {
+    'name': 'color-selector-wheel',
+    'srcs': [ 'color-selector-wheel.c', 'gimpcolorwheel.c', ],
+    'link': color_selector_libs,
+  }, {
+    'name': 'display-filter-clip-warning',
+    'link': display_filter_libs,
+  }, {
+    'name': 'display-filter-color-blind',
+    'link': display_filter_libs,
+  }, {
+    'name': 'display-filter-aces-rrt',
+    'link': display_filter_libs,
+  }, {
+    'name': 'display-filter-gamma',
+    'link': display_filter_libs,
+  }, {
+    'name': 'display-filter-high-contrast',
+    'link': display_filter_libs,
+  },
+]
+
+if have_linuxinput
+  modules += {
+    'name': 'controller-linux-input',
+    'srcs': [ 'controller-linux-input.c', 'gimpinputdevicestore-gudev.c', ],
+    'deps': gudev,
+    'link': controller_libs,
+  }
+endif
+
+if directx.found()
+  modules += {
+    'name': 'controller-dx-input',
+    'srcs': [ 'controller-dx-dinput.c', 'gimpinputdevicestore-dx.c', ],
+    'deps': directx,
+    'link': [ controller_libs, '-lrpcrt4', ],
+  }
+endif
+
+if not platform_windows
+  modules += {
+    'name': 'controller-midi',
+    'deps': alsa,
+    'link': controller_libs,
+  }
+endif
+
+
+foreach module : modules
+  name = module.get('name')
+  srcs = module.get('srcs', name + '.c')
+  deps = module.get('deps', [])
+  link = module.get('link', [])
+
+  library(name,
+    srcs,
+    include_directories: rootInclude,
+    dependencies: modules_deps + [ deps ],
+    link_with: link,
+    install: true,
+    install_dir: gimpplugindir / 'modules',
+  )
+endforeach
diff --git a/pdb/meson.build b/pdb/meson.build
new file mode 100644
index 0000000000..fdd2530c7e
--- /dev/null
+++ b/pdb/meson.build
@@ -0,0 +1,147 @@
+pdbgen_backup = false
+pdbgen_groups = false
+
+pdb_names = [
+  'brush_select',
+  'brush',
+  'brushes',
+  'buffer',
+  'channel',
+  'context',
+  'debug',
+  'display',
+  'drawable_color',
+  'drawable_edit',
+  'drawable',
+  'dynamics',
+  'edit',
+  'fileops',
+  'floating_sel',
+  'font_select',
+  'fonts',
+  'gimp',
+  'gimprc',
+  'gradient_select',
+  'gradient',
+  'gradients',
+  'help',
+  'image_color_profile',
+  'image_convert',
+  'image_grid',
+  'image_guides',
+  'image_sample_points',
+  'image_select',
+  'image_transform',
+  'image_undo',
+  'image',
+  'item_transform',
+  'item',
+  'layer',
+  'message',
+  'paint_tools',
+  'palette_select',
+  'palette',
+  'palettes',
+  'pattern_select',
+  'pattern',
+  'patterns',
+  'pdb',
+  'plug_in_compat',
+  'plug_in',
+  'progress',
+  'selection',
+  'text_layer',
+  'text_tool',
+  'unit',
+  'vectors',
+]
+
+pdb_sources = []
+foreach name : pdb_names
+  pdb_sources += files('groups' / name + '.pdb')
+endforeach
+
+
+enum_headers = [
+  gimpbaseenums,
+  appconfigenums,
+  appoperationsenums,
+  appcoreenums,
+  apppaintenums,
+]
+
+# Perl environment
+perlsrcdir = meson.current_source_dir()
+perlbindir = meson.current_build_dir()
+
+perl_env = [
+  'PDBGEN_BACKUP=' + (pdbgen_backup ? '1' : '0'),
+  'PDBGEN_GROUPS=' + (pdbgen_groups ? '1' : '0'),
+  'rootme='   + perlbindir,
+  'srcdir='   + perlsrcdir,
+  'destdir='  + meson.build_root(),
+  'builddir=' + meson.build_root(),
+  perl,
+  '-I', perlbindir,
+  '-I', perlsrcdir,
+]
+
+groups_pl_content    = '# This file is autogenerated\n'
+groups_pl_content   += '@groups = qw(\n'
+foreach source : pdb_names
+  groups_pl_content += '    '+ source +'\n'
+endforeach
+groups_pl_content   += ');\n'
+
+
+
+# All perl files
+
+groups_pl = custom_target('groups.pl',
+  input : [ ],
+  output: [ 'groups.pl', ],
+  command: [ 'echo', groups_pl_content, ],
+  capture: true,
+)
+
+enums_pl = custom_target('enums.pl',
+  input : [ 'enumgen.pl', 'enums-external.pl', enum_headers, ],
+  output: [ 'enums.pl', ],
+  command: [
+    perl_env, '@INPUT0@',
+    enum_headers,
+  ],
+)
+
+
+## TODO remove that ?
+
+pdbgen = custom_target('stamp-pdbgen',
+  input : [
+    files(
+      'pdbgen.pl',
+
+      'app.pl',
+      'lib.pl',
+      'pdb.pl',
+      'stddefs.pdb',
+      'util.pl',
+    ),
+    enums_pl,
+    groups_pl,
+    pdb_sources,
+  ],
+  output: [ 'stamp-pdbgen', ],
+  command: [
+    perl_env, '@INPUT0@',
+    'app', 'lib',
+  ],
+)
+
+stamp_enumcode = custom_target('stamp-enum-code',
+  input : [ 'enumcode.pl', ],
+  output: [ 'stamp-enum-code', ],
+  command: [
+    perl_env, '@INPUT0@',
+  ],
+)
diff --git a/plug-ins/common/meson.build b/plug-ins/common/meson.build
new file mode 100644
index 0000000000..753ac6d830
--- /dev/null
+++ b/plug-ins/common/meson.build
@@ -0,0 +1,180 @@
+
+common_plugins_list = [
+  { 'name': 'align-layers', },
+  { 'name': 'animation-optimize', },
+  { 'name': 'animation-play', },
+  { 'name': 'blinds', },
+  { 'name': 'border-average', },
+  { 'name': 'busy-dialog', },
+  { 'name': 'checkerboard', },
+  { 'name': 'cml-explorer', },
+  { 'name': 'colormap-remap', },
+  { 'name': 'compose', },
+  { 'name': 'contrast-retinex', },
+  { 'name': 'crop-zealous',
+    'deps': [ gtk3, gegl, gdk_pixbuf, cairo, ],
+  },
+  { 'name': 'curve-bend', },
+  { 'name': 'decompose', },
+  { 'name': 'depth-merge', },
+  { 'name': 'despeckle', },
+  { 'name': 'destripe', },
+  { 'name': 'file-cel', },
+  { 'name': 'file-compressor',
+    'deps': [ gegl, gdk_pixbuf, cairo, gio, liblzma, bz2, zlib, ],
+  },
+  { 'name': 'file-csource', },
+  { 'name': 'file-desktop-link',
+    'deps': [ gtk3, gegl, gdk_pixbuf, cairo, ],
+  },
+  { 'name': 'file-dicom', },
+  { 'name': 'file-gbr', },
+  { 'name': 'file-gegl', },
+  { 'name': 'file-gif-load',
+    'deps': [ gtk3, gegl, gdk_pixbuf, cairo, ],
+  },
+  { 'name': 'file-gif-save', },
+  { 'name': 'file-gih', },
+  { 'name': 'file-glob',
+    'deps': [ gtk3, gegl, gdk_pixbuf, cairo,  ],
+  },
+  { 'name': 'file-header', },
+  { 'name': 'file-heif',
+    'deps': [ gtk3, gegl, libheif, ],
+  },
+  { 'name': 'file-html-table', },
+  { 'name': 'file-jp2-load',
+    'deps': [ gtk3, gegl, gdk_pixbuf, openjpeg, ],
+  },
+  { 'name': 'file-mng',
+    'deps': [ gtk3, gegl, libmng, libpng, ],
+  },
+  { 'name': 'file-pat', },
+  { 'name': 'file-pcx', },
+  { 'name': 'file-pdf-load',
+    'deps': [ gtk3, gegl, gdk_pixbuf, poppler ],
+  },
+  { 'name': 'file-pdf-save',
+    'deps': [ gtk3, gegl, gdk_pixbuf, poppler, cairo ],
+  },
+  { 'name': 'file-pix', },
+  { 'name': 'file-png',
+    'deps': [ gtk3, gegl, libpng, ],
+  },
+  { 'name': 'file-pnm', },
+  { 'name': 'file-ps',
+    'deps': [ gtk3, gegl, gdk_pixbuf, ghostscript, ],
+  },
+  { 'name': 'file-psp',
+    'deps': [ gtk3, gegl, zlib, ],
+  },
+  { 'name': 'file-raw-data', },
+  { 'name': 'file-sunras', },
+  { 'name': 'file-svg',
+    'deps': [ gtk3, gegl, rsvg, ],
+  },
+  { 'name': 'file-tga', },
+  { 'name': 'file-xbm', },
+  { 'name': 'file-xwd', },
+  { 'name': 'film', },
+  { 'name': 'gradient-map', },
+  { 'name': 'grid', },
+  { 'name': 'guillotine', },
+  { 'name': 'hot', },
+  { 'name': 'jigsaw', },
+  { 'name': 'nl-filter', },
+  { 'name': 'plugin-browser', },
+  { 'name': 'procedure-browser', },
+  { 'name': 'qbist', },
+  { 'name': 'sample-colorize', },
+  { 'name': 'smooth-palette', },
+  { 'name': 'sparkle', },
+  { 'name': 'sphere-designer', },
+  { 'name': 'tile-small', },
+  { 'name': 'tile', },
+  { 'name': 'unit-editor', },
+  { 'name': 'van-gogh-lic', },
+  { 'name': 'warp', },
+  { 'name': 'wavelet-decompose', },
+  { 'name': 'web-browser', },
+]
+
+if platform_windows
+  common_plugins_list += { 'name': 'mail', }
+endif
+
+if wmf.found()
+  common_plugins_list += { 'name': 'file-wmf',
+    'deps': [ gtk3, gegl, wmf, ],
+  }
+endif
+
+if xmc.found()
+  common_plugins_list += { 'name': 'file-xmc',
+    'deps': [ gtk3, gegl, xmc, ],
+  }
+endif
+
+if libxpm.found()
+  common_plugins_list += { 'name': 'file-xpm',
+    'deps': [ gtk3, gegl, libxpm, ],
+  }
+endif
+
+if webkit.found()
+  common_plugins_list += { 'name': 'web-page',
+    'deps': [ gtk3, gegl, gdk_pixbuf, webkit, ],
+  }
+endif
+
+if libaa.found()
+  common_plugins_list += {
+    'name': 'file-aa',
+    'deps': [ gtk3, gegl, gdk_pixbuf, libaa, ],
+  }
+endif
+
+foreach plugin : common_plugins_list
+  plugin_name = plugin.get('name')
+  plugin_sources = [ plugin.get('sources', plugin_name + '.c') ]
+  plugin_deps = plugin.get('deps', [ gtk3, gegl, gdk_pixbuf, ])
+  plugin_cflags = plugin.get('cflags', [])
+
+  if platform_windows
+    plugin_rc = configure_file(
+      input : gimp_plugins_rc,
+      output: plugin_name + '.rc',
+      copy: true,
+    )
+
+    plugin_sources += windows.compile_resources(
+      plugin_rc,
+      args: [
+        '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+        '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+        '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+      ],
+      include_directories: [
+        rootInclude, appInclude,
+      ],
+    )
+  endif
+
+  executable(plugin_name,
+    plugin_sources,
+    include_directories: [ rootInclude, ],
+    link_with : [
+      libgimp,
+      libgimpbase,
+      libgimpcolor,
+      libgimpconfig,
+      libgimpmath,
+      libgimpui,
+      libgimpwidgets,
+    ],
+    dependencies: [ plugin_deps, math ],
+    c_args: plugin_cflags,
+    install: true,
+    install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+  )
+endforeach
diff --git a/plug-ins/file-bmp/meson.build b/plug-ins/file-bmp/meson.build
new file mode 100644
index 0000000000..f681f3d775
--- /dev/null
+++ b/plug-ins/file-bmp/meson.build
@@ -0,0 +1,40 @@
+plugin_name = 'file-bmp'
+
+plugin_sources = [
+  'bmp-load.c',
+  'bmp-save.c',
+  'bmp.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/file-dds/meson.build b/plug-ins/file-dds/meson.build
new file mode 100644
index 0000000000..dfd9c2e3af
--- /dev/null
+++ b/plug-ins/file-dds/meson.build
@@ -0,0 +1,45 @@
+plugin_name = 'file-dds'
+
+plugin_sources = [
+  'dds.c',
+  'color.c',
+  'ddsread.c',
+  'ddswrite.c',
+  'dxt.c',
+  'mipmap.c',
+  'misc.c',
+  'mktables.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, gdk_pixbuf, cairo, math,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/file-exr/meson.build b/plug-ins/file-exr/meson.build
new file mode 100644
index 0000000000..1a14ff1ee0
--- /dev/null
+++ b/plug-ins/file-exr/meson.build
@@ -0,0 +1,43 @@
+if openexr.found()
+
+plugin_name = 'file-exr'
+
+plugin_sources = [
+  'file-exr.c',
+  'openexr-wrapper.cc',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, openexr, lcms,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
+
+endif
diff --git a/plug-ins/file-faxg3/meson.build b/plug-ins/file-faxg3/meson.build
new file mode 100644
index 0000000000..d3f09841a2
--- /dev/null
+++ b/plug-ins/file-faxg3/meson.build
@@ -0,0 +1,39 @@
+plugin_name = 'file-faxg3'
+
+plugin_sources = [
+  'faxg3.c',
+  'g3.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, gdk_pixbuf, cairo,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/file-fits/meson.build b/plug-ins/file-fits/meson.build
new file mode 100644
index 0000000000..f1926ccbdf
--- /dev/null
+++ b/plug-ins/file-fits/meson.build
@@ -0,0 +1,39 @@
+plugin_name = 'file-fits'
+
+plugin_sources = [
+  'fits-io.c',
+  'fits.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/file-fli/meson.build b/plug-ins/file-fli/meson.build
new file mode 100644
index 0000000000..21d83b6081
--- /dev/null
+++ b/plug-ins/file-fli/meson.build
@@ -0,0 +1,39 @@
+plugin_name = 'file-fli'
+
+plugin_sources = [
+  'fli-gimp.c',
+  'fli.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/file-ico/meson.build b/plug-ins/file-ico/meson.build
new file mode 100644
index 0000000000..17ebd71027
--- /dev/null
+++ b/plug-ins/file-ico/meson.build
@@ -0,0 +1,41 @@
+plugin_name = 'file-ico'
+
+plugin_sources = [
+  'ico-dialog.c',
+  'ico-load.c',
+  'ico-save.c',
+  'ico.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, libpng,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/file-jpeg/meson.build b/plug-ins/file-jpeg/meson.build
new file mode 100644
index 0000000000..5a7022b540
--- /dev/null
+++ b/plug-ins/file-jpeg/meson.build
@@ -0,0 +1,43 @@
+plugin_name = 'file-jpeg'
+
+plugin_sources = [
+  'jpeg-icc.c',
+  'jpeg-load.c',
+  'jpeg-quality.c',
+  'jpeg-save.c',
+  'jpeg-settings.c',
+  'jpeg.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, libjpeg, lcms, gexiv2,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/file-psd/meson.build b/plug-ins/file-psd/meson.build
new file mode 100644
index 0000000000..53587a0f06
--- /dev/null
+++ b/plug-ins/file-psd/meson.build
@@ -0,0 +1,44 @@
+plugin_name = 'file-psd'
+
+plugin_sources = [
+  'psd-image-res-load.c',
+  'psd-layer-res-load.c',
+  'psd-load.c',
+  'psd-save.c',
+  'psd-thumb-load.c',
+  'psd-util.c',
+  'psd.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, libjpeg, math, zlib,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/file-raw/meson.build b/plug-ins/file-raw/meson.build
new file mode 100644
index 0000000000..f136c45c13
--- /dev/null
+++ b/plug-ins/file-raw/meson.build
@@ -0,0 +1,60 @@
+
+file_raw_exes = [
+  'file-darktable',
+  'file-raw-placeholder',
+  'file-rawtherapee',
+]
+
+foreach plugin_name : file_raw_exes
+
+  plugin_sources = [
+    plugin_name +'.c',
+    'file-raw-utils.c',
+  ]
+
+  if platform_windows
+    plugin_rc = configure_file(
+      input : gimp_plugins_rc,
+      output: plugin_name + '.rc',
+      copy: true,
+    )
+    plugin_sources += windows.compile_resources(
+      plugin_rc,
+      args: [
+        '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+        '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+        '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+      ],
+      include_directories: [
+        rootInclude, appInclude,
+      ],
+    )
+  endif
+
+
+  executable(plugin_name,
+    plugin_sources,
+    include_directories: [ rootInclude, ],
+    dependencies: [
+      gtk3, gegl,
+    ],
+    link_with: [
+      libgimp,
+      libgimpbase,
+      libgimpcolor,
+      libgimpconfig,
+      libgimpmath,
+      libgimpui,
+      libgimpwidgets,
+    ],
+    install: true,
+    install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+  )
+endforeach
+
+install_data([
+    'file-darktable-export-on-exit.lua',
+    'file-darktable-get-size.lua',
+  ],
+  install_dir: prefix / gimpdatadir / 'file-raw',
+)
diff --git a/plug-ins/file-sgi/meson.build b/plug-ins/file-sgi/meson.build
new file mode 100644
index 0000000000..c25c8f42b4
--- /dev/null
+++ b/plug-ins/file-sgi/meson.build
@@ -0,0 +1,39 @@
+plugin_name = 'file-sgi'
+
+plugin_sources = [
+  'sgi-lib.c',
+  'sgi.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/file-tiff/meson.build b/plug-ins/file-tiff/meson.build
new file mode 100644
index 0000000000..d03d7d2690
--- /dev/null
+++ b/plug-ins/file-tiff/meson.build
@@ -0,0 +1,41 @@
+plugin_name = 'file-tiff'
+
+plugin_sources = [
+  'file-tiff-io.c',
+  'file-tiff-save.c',
+  'file-tiff.c',
+  'file-tiff-load.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, gexiv2, libtiff,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/file-webp/meson.build b/plug-ins/file-webp/meson.build
new file mode 100644
index 0000000000..ac0f0c5dfd
--- /dev/null
+++ b/plug-ins/file-webp/meson.build
@@ -0,0 +1,45 @@
+if webp_found
+
+plugin_name = 'file-webp'
+
+plugin_sources = [
+  'file-webp-dialog.c',
+  'file-webp-load.c',
+  'file-webp-save.c',
+  'file-webp.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, gexiv2, webp_libs,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
+
+endif
diff --git a/plug-ins/flame/meson.build b/plug-ins/flame/meson.build
new file mode 100644
index 0000000000..e77019b39c
--- /dev/null
+++ b/plug-ins/flame/meson.build
@@ -0,0 +1,41 @@
+plugin_name = 'flame'
+
+plugin_sources = [
+  'cmap.c',
+  'flame.c',
+  'libifs.c',
+  'rect.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, math,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/fractal-explorer/examples/meson.build b/plug-ins/fractal-explorer/examples/meson.build
new file mode 100644
index 0000000000..db3ef040ee
--- /dev/null
+++ b/plug-ins/fractal-explorer/examples/meson.build
@@ -0,0 +1,37 @@
+install_data([
+    'Asteroid_Field',
+    'Bar_Code_Label',
+    'Beauty_of_Nature',
+    'Blue_Curtain',
+    'Car_Track',
+    'Energetic_Diamond',
+    'Explosive',
+    'Flower',
+    'Fragments',
+    'Hemp',
+    'High_Voltage',
+    'Hoops',
+    'Ice_Crystal',
+    'Leaves',
+    'Lightning',
+    'Mandelbrot',
+    'Marble',
+    'Marble2',
+    'Medusa',
+    'Nautilus',
+    'Nebula',
+    'Plant',
+    'Rose',
+    'Saturn',
+    'Snow_Crystal',
+    'Soma',
+    'Spark',
+    'Suns',
+    'Tentacles',
+    'The_Green_Place',
+    'Wave',
+    'Wood',
+    'Zooming_Circle',
+  ],
+  install_dir: gimpdatadir / 'fractalexplorer',
+)
diff --git a/plug-ins/fractal-explorer/meson.build b/plug-ins/fractal-explorer/meson.build
new file mode 100644
index 0000000000..247593118e
--- /dev/null
+++ b/plug-ins/fractal-explorer/meson.build
@@ -0,0 +1,41 @@
+subdir('examples')
+
+plugin_name = 'fractal-explorer'
+
+plugin_sources = [
+  'fractal-explorer-dialogs.c',
+  'fractal-explorer.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, math,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/gfig/gfig-examples/meson.build b/plug-ins/gfig/gfig-examples/meson.build
new file mode 100644
index 0000000000..e98d739149
--- /dev/null
+++ b/plug-ins/gfig/gfig-examples/meson.build
@@ -0,0 +1,14 @@
+install_data([
+    'A_star',
+    'curves',
+    'polys',
+    'ring',
+    'ring+star',
+    'simily',
+    'spirals_and_stars',
+    'sprial',
+    'star2',
+    'stars',
+  ],
+  install_dir: gimpdatadir / 'gfig',
+)
diff --git a/plug-ins/gfig/images/meson.build b/plug-ins/gfig/images/meson.build
new file mode 100644
index 0000000000..4131d683cb
--- /dev/null
+++ b/plug-ins/gfig/images/meson.build
@@ -0,0 +1,24 @@
+stock_icons = [
+  'gfig-bezier.png',
+  'gfig-circle.png',
+  'gfig-copy-object.png',
+  'gfig-curve.png',
+  'gfig-delete-object.png',
+  'gfig-ellipse.png',
+  'gfig-line.png',
+  'gfig-logo.png',
+  'gfig-move-object.png',
+  'gfig-move-point.png',
+  'gfig-polygon.png',
+  'gfig-rectangle.png',
+  'gfig-select-object.png',
+  'gfig-show-all.png',
+  'gfig-spiral.png',
+  'gfig-star.png',
+]
+
+gfig_icon_sources = gnome.compile_resources(
+  'gfig-icon-images',
+  'gfig-icon-images.gresource.xml',
+  # source_dir: meson.current_source_directory(),
+)
diff --git a/plug-ins/gfig/meson.build b/plug-ins/gfig/meson.build
new file mode 100644
index 0000000000..00e1fe7631
--- /dev/null
+++ b/plug-ins/gfig/meson.build
@@ -0,0 +1,57 @@
+subdir('gfig-examples')
+subdir('images')
+
+plugin_name = 'gfig'
+
+plugin_sources = [
+  'gfig-arc.c',
+  'gfig-bezier.c',
+  'gfig-circle.c',
+  'gfig-dialog.c',
+  'gfig-dobject.c',
+  'gfig-ellipse.c',
+  'gfig-grid.c',
+  'gfig-icons.c',
+  'gfig-line.c',
+  'gfig-poly.c',
+  'gfig-preview.c',
+  'gfig-rectangle.c',
+  'gfig-spiral.c',
+  'gfig-star.c',
+  'gfig-style.c',
+  'gfig.c',
+  gfig_icon_sources,
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, math,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/gimpressionist/Brushes/meson.build b/plug-ins/gimpressionist/Brushes/meson.build
new file mode 100644
index 0000000000..62fa4bbdbd
--- /dev/null
+++ b/plug-ins/gimpressionist/Brushes/meson.build
@@ -0,0 +1,66 @@
+brushes = [
+  'arrow01.pgm',
+  'ball.ppm',
+  'blob.ppm',
+  'box.ppm',
+  'chalk01.pgm',
+  'cone.ppm',
+  'crayon01.pgm',
+  'crayon02.pgm',
+  'crayon03.pgm',
+  'crayon04.pgm',
+  'crayon05.pgm',
+  'crayon06.pgm',
+  'crayon07.pgm',
+  'crayon08.pgm',
+  'defaultbrush.pgm',
+  'dribble.pgm',
+  'fabric.pgm',
+  'fabric01.pgm',
+  'fabric02.pgm',
+  'fabric03.pgm',
+  'flower01.pgm',
+  'flower02.pgm',
+  'flower03.pgm',
+  'flower04.pgm',
+  'grad01.pgm',
+  'grad02.pgm',
+  'grad03.pgm',
+  'heart.ppm',
+  'leaf01.pgm',
+  'paintbrush01.pgm',
+  'paintbrush02.pgm',
+  'paintbrush03.pgm',
+  'paintbrush04.pgm',
+  'paper01.pgm',
+  'paper02.pgm',
+  'paper03.pgm',
+  'paper04.pgm',
+  'pentagram.pgm',
+  'scribble.pgm',
+  'shape01.pgm',
+  'shape02.pgm',
+  'shape03.pgm',
+  'shape04.pgm',
+  'snow1.pgm',
+  'sphere.ppm',
+  'splat1.pgm',
+  'splat2.pgm',
+  'splat3.pgm',
+  'spunge01.pgm',
+  'spunge02.pgm',
+  'spunge03.pgm',
+  'spunge04.pgm',
+  'spunge05.pgm',
+  'strange01.pgm',
+  'thegimp.pgm',
+  'torus.ppm',
+  'wavy.pgm',
+  'weave.pgm',
+  'worm.pgm',
+]
+
+install_data(
+  brushes,
+  install_dir: gimpdatadir / 'gimpressionist' / 'Brushes',
+)
diff --git a/plug-ins/gimpressionist/Paper/meson.build b/plug-ins/gimpressionist/Paper/meson.build
new file mode 100644
index 0000000000..0564087ba6
--- /dev/null
+++ b/plug-ins/gimpressionist/Paper/meson.build
@@ -0,0 +1,16 @@
+papers = [
+  'bricks.pgm',
+  'bricks2.pgm',
+  'burlap.pgm',
+  'canvas2.pgm',
+  'defaultpaper.pgm',
+  'marble.pgm',
+  'marble2.pgm',
+  'stone.pgm',
+  'struc.pgm',
+]
+
+install_data(
+  papers,
+  install_dir: gimpdatadir / 'gimpressionist' / 'Paper',
+)
diff --git a/plug-ins/gimpressionist/Presets/meson.build b/plug-ins/gimpressionist/Presets/meson.build
new file mode 100644
index 0000000000..b07328a8a5
--- /dev/null
+++ b/plug-ins/gimpressionist/Presets/meson.build
@@ -0,0 +1,32 @@
+presets = [
+  'ApplyCanvas',
+  'Ballpark',
+  'Canvas',
+  'Crosshatch',
+  'Cubism',
+  'Dotify',
+  'Embroidery',
+  'Feathers',
+  'Felt-marker',
+  'Flowerbed',
+  'Furry',
+  'Line-art-2',
+  'Line-art',
+  'Maggot-invasion',
+  'MarbleMadness',
+  'Mossy',
+  'Painted_Rock',
+  'Parquette',
+  'Patchwork',
+  'Ringworks',
+  'Sample',
+  'Smash',
+  'Straws',
+  'Weave',
+  'Wormcan',
+]
+
+install_data(
+  presets,
+  install_dir: gimpdatadir / 'gimpressionist' / 'Presets',
+)
diff --git a/plug-ins/gimpressionist/meson.build b/plug-ins/gimpressionist/meson.build
new file mode 100644
index 0000000000..5ded789c28
--- /dev/null
+++ b/plug-ins/gimpressionist/meson.build
@@ -0,0 +1,65 @@
+subdir('Brushes')
+subdir('Paper')
+subdir('Presets')
+
+plugin_name = 'gimpressionist'
+
+plugin_sources = [
+  'brush.c',
+  'color.c',
+  'general.c',
+  'gimp.c',
+  'gimpressionist.c',
+  'globals.c',
+  'orientation.c',
+  'orientmap.c',
+  'paper.c',
+  'placement.c',
+  'plasma.c',
+  'ppmtool.c',
+  'presets.c',
+  'preview.c',
+  'repaint.c',
+  'size.c',
+  'sizemap.c',
+  'utils.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, math,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  c_args: [
+    '-DDEFAULTPATH="@0@:@1@"'.format(
+      '~/'   / gimpdir      / 'gimpressionist',
+      prefix / gimpdatadir  / 'gimpressionist'
+    ),
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/goat-exercises/meson.build b/plug-ins/goat-exercises/meson.build
new file mode 100644
index 0000000000..3d667d148b
--- /dev/null
+++ b/plug-ins/goat-exercises/meson.build
@@ -0,0 +1,66 @@
+plugin_name = 'goat-exercise'
+
+plugin_sources = [
+  'goat-exercise-c.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, math,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir /  'plug-ins' / plugin_name,
+)
+
+
+install_data(
+  'goat-exercise-c.c',
+  install_dir: gimpplugindir /  'plug-ins' / plugin_name + '-c',
+)
+
+if have_python
+  install_data(
+    'goat-exercise-py3.py',
+    install_dir: gimpplugindir /  'plug-ins' / plugin_name + '-py3',
+  )
+endif
+
+
+if have_javascript
+  install_data(
+    'goat-exercise-gjs.js',
+    install_dir: gimpplugindir /  'plug-ins' / plugin_name + '-gjs',
+  )
+endif
+
+if have_lua
+  install_data(
+    'goat-exercise-lua.lua',
+    install_dir: gimpplugindir /  'plug-ins' / plugin_name + '-lua',
+  )
+endif
diff --git a/plug-ins/gradient-flare/flares/meson.build b/plug-ins/gradient-flare/flares/meson.build
new file mode 100644
index 0000000000..279605ced8
--- /dev/null
+++ b/plug-ins/gradient-flare/flares/meson.build
@@ -0,0 +1,11 @@
+install_data([
+    'Bright_Star',
+    'Classic',
+    'Default',
+    'Distant_Sun',
+    'GFlare_101',
+    'GFlare_102',
+    'Hidden_Planet',
+  ],
+  install_dir: gimpdatadir / 'gflare',
+)
diff --git a/plug-ins/gradient-flare/meson.build b/plug-ins/gradient-flare/meson.build
new file mode 100644
index 0000000000..5ff42de5a0
--- /dev/null
+++ b/plug-ins/gradient-flare/meson.build
@@ -0,0 +1,40 @@
+subdir('flares')
+
+plugin_name = 'gradient-flare'
+
+plugin_sources = [
+  'gradient-flare.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, math,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/help-browser/meson.build b/plug-ins/help-browser/meson.build
new file mode 100644
index 0000000000..443a9c6e2b
--- /dev/null
+++ b/plug-ins/help-browser/meson.build
@@ -0,0 +1,47 @@
+if webkit.found()
+
+plugin_name = 'help-browser'
+
+plugin_sources = [
+  'dialog.c',
+  'gimpthrobber.c',
+  'gimpthrobberaction.c',
+  'help-browser.c',
+  'uri.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, gio, webkit,
+  ],
+  link_with: [
+    help_plugin_lib,
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
+
+endif
diff --git a/plug-ins/help/meson.build b/plug-ins/help/meson.build
new file mode 100644
index 0000000000..14bddaa318
--- /dev/null
+++ b/plug-ins/help/meson.build
@@ -0,0 +1,53 @@
+plugin_name = 'help'
+
+plugin_sources = [
+  # 'gimp-help-lookup.c',
+  'gimphelp.c',
+  'gimphelpdomain.c',
+  'gimphelpitem.c',
+  'gimphelplocale.c',
+  'gimphelpprogress.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+help_plugin_lib = static_library('help_plugin',
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, cairo, gio, gdk_pixbuf,
+  ],
+  install: false,
+)
+
+executable(plugin_name,
+  'help.c',
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, cairo, gio, gdk_pixbuf,
+  ],
+  link_with: [
+    help_plugin_lib,
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/ifs-compose/meson.build b/plug-ins/ifs-compose/meson.build
new file mode 100644
index 0000000000..8c5504ffd3
--- /dev/null
+++ b/plug-ins/ifs-compose/meson.build
@@ -0,0 +1,40 @@
+plugin_name = 'ifs-compose'
+
+plugin_sources = [
+  'ifs-compose-storage.c',
+  'ifs-compose-utils.c',
+  'ifs-compose.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, math,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/imagemap/images/meson.build b/plug-ins/imagemap/images/meson.build
new file mode 100644
index 0000000000..fb093a7130
--- /dev/null
+++ b/plug-ins/imagemap/images/meson.build
@@ -0,0 +1,16 @@
+stock_images = [
+  'imagemap-circle.png',
+  'imagemap-coord.png',
+  'imagemap-dimension.png',
+  'imagemap-java.png',
+  'imagemap-polygon.png',
+  'imagemap-rectangle.png',
+  'imagemap-to-back.png',
+  'imagemap-to-front.png',
+]
+
+imagemap_icon_sources = gnome.compile_resources(
+  'imagemap-icon-images',
+  'imagemap-icon-images.gresource.xml',
+  # source_dir: meson.current_source_directory(),
+)
diff --git a/plug-ins/imagemap/meson.build b/plug-ins/imagemap/meson.build
new file mode 100644
index 0000000000..238bd4096c
--- /dev/null
+++ b/plug-ins/imagemap/meson.build
@@ -0,0 +1,161 @@
+subdir('images')
+
+plugin_name = 'imagemap'
+
+plugin_sources = [
+  'imap_about.c',
+  'imap_browse.c',
+  'imap_cern_lex.c',
+  'imap_cern_parse.c',
+  'imap_circle.c',
+  'imap_cmd_clear.c',
+  'imap_cmd_copy_object.c',
+  'imap_cmd_copy.c',
+  'imap_cmd_create.c',
+  'imap_cmd_cut_object.c',
+  'imap_cmd_cut.c',
+  'imap_cmd_delete_point.c',
+  'imap_cmd_delete.c',
+  'imap_cmd_edit_object.c',
+  'imap_cmd_gimp_guides.c',
+  'imap_cmd_guides.c',
+  'imap_cmd_insert_point.c',
+  'imap_cmd_move_down.c',
+  'imap_cmd_move_sash.c',
+  'imap_cmd_move_selected.c',
+  'imap_cmd_move_to_front.c',
+  'imap_cmd_move_up.c',
+  'imap_cmd_move.c',
+  'imap_cmd_object_down.c',
+  'imap_cmd_object_move.c',
+  'imap_cmd_object_up.c',
+  'imap_cmd_paste.c',
+  'imap_cmd_select_all.c',
+  'imap_cmd_select_next.c',
+  'imap_cmd_select_prev.c',
+  'imap_cmd_select_region.c',
+  'imap_cmd_select.c',
+  'imap_cmd_send_to_back.c',
+  'imap_cmd_unselect_all.c',
+  'imap_cmd_unselect.c',
+  'imap_command.c',
+  'imap_csim_lex.c',
+  'imap_csim_parse.c',
+  'imap_default_dialog.c',
+  'imap_edit_area_info.c',
+  'imap_file.c',
+  'imap_grid.c',
+  'imap_icons.c',
+  'imap_main.c',
+  'imap_menu_funcs.c',
+  'imap_menu.c',
+  'imap_misc.c',
+  'imap_mru.c',
+  'imap_ncsa_lex.c',
+  'imap_ncsa_parse.c',
+  'imap_object_popup.c',
+  'imap_object.c',
+  'imap_polygon.c',
+  'imap_preferences.c',
+  'imap_preview.c',
+  'imap_rectangle.c',
+  'imap_selection.c',
+  'imap_settings.c',
+  'imap_source.c',
+  'imap_statusbar.c',
+  'imap_string.c',
+  'imap_taglist.c',
+  'imap_ui_grid.c',
+  imagemap_icon_sources,
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, math,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
+
+
+
+flex  = find_program('flex',  required: false)
+bison = find_program('bison', required: false)
+
+if flex.found() and bison.found()
+
+  syntaxes = [
+    'cern',
+    'csim',
+    'ncsa',
+  ]
+
+  foreach syntax : syntaxes
+
+    syntax_prefix =  syntax + '_'
+    imapname = 'imap_' + syntax
+
+    custom_target(
+              imapname + '_lex.c',
+      input : imapname + '.l'    ,
+      output: imapname + '_lex.c',
+      command: [
+        flex,
+        '--case-insensitive',
+        '--prefix', syntax_prefix,
+        '--outfile', '@OUTPUT@',
+        '@INPUT@',
+      ],
+    )
+
+    custom_target(
+              imapname + '_parse.c',
+      input : imapname + '.y'      ,
+      output: imapname + '_parse.c',
+      command: [
+        bison, '--yacc',
+        '-d',
+        '--name-prefix', syntax_prefix,
+        '@INPUT@'
+      ],
+    )
+
+    custom_target(
+              imapname + '_parse.h',
+      input : imapname + '.y'      ,
+      output: imapname + '_parse.h',
+      command: [
+        bison, '--yacc',
+        '-d',
+        '--name-prefix', syntax_prefix,
+        '--output', '@OUTPUT@',
+        '@INPUT@'
+      ],
+    )
+
+  endforeach
+endif
diff --git a/plug-ins/lighting/images/meson.build b/plug-ins/lighting/images/meson.build
new file mode 100644
index 0000000000..93e65a4912
--- /dev/null
+++ b/plug-ins/lighting/images/meson.build
@@ -0,0 +1,18 @@
+stock_icons = [
+  'lighting-intensity-ambient-high.png',
+  'lighting-intensity-ambient-low.png',
+  'lighting-intensity-diffuse-high.png',
+  'lighting-intensity-diffuse-low.png',
+  'lighting-reflectivity-diffuse-high.png',
+  'lighting-reflectivity-diffuse-low.png',
+  'lighting-reflectivity-highlight-high.png',
+  'lighting-reflectivity-highlight-low.png',
+  'lighting-reflectivity-specular-high.png',
+  'lighting-reflectivity-specular-low.png',
+]
+
+lighting_icon_sources = gnome.compile_resources(
+  'lighting-icon-images',
+  'lighting-icon-images.gresource.xml',
+  # source_dir: meson.current_source_directory(),
+)
diff --git a/plug-ins/lighting/meson.build b/plug-ins/lighting/meson.build
new file mode 100644
index 0000000000..a3b042009d
--- /dev/null
+++ b/plug-ins/lighting/meson.build
@@ -0,0 +1,47 @@
+subdir('images')
+
+plugin_name = 'lighting'
+
+plugin_sources = [
+  'lighting-apply.c',
+  'lighting-icons.c',
+  'lighting-image.c',
+  'lighting-main.c',
+  'lighting-preview.c',
+  'lighting-shade.c',
+  'lighting-ui.c',
+  lighting_icon_sources,
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, include_directories('.'), ],
+  dependencies: [
+    gtk3, gegl, math,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/map-object/meson.build b/plug-ins/map-object/meson.build
new file mode 100644
index 0000000000..2723901bc3
--- /dev/null
+++ b/plug-ins/map-object/meson.build
@@ -0,0 +1,48 @@
+plugin_name = 'map-object'
+
+plugin_sources = [
+  'arcball.c',
+  'map-object-apply.c',
+  'map-object-icons.c',
+  'map-object-image.c',
+  'map-object-main.c',
+  'map-object-preview.c',
+  'map-object-shade.c',
+  'map-object-ui.c',
+  lighting_icon_sources,
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+
+executable(plugin_name,
+  plugin_sources,
+
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, math,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/meson.build b/plug-ins/meson.build
new file mode 100644
index 0000000000..a0b6c8e8c4
--- /dev/null
+++ b/plug-ins/meson.build
@@ -0,0 +1,36 @@
+subdir('common')
+subdir('file-bmp')
+subdir('file-dds')
+subdir('file-exr')
+subdir('file-faxg3')
+subdir('file-fits')
+subdir('file-fli')
+subdir('file-ico')
+subdir('file-jpeg')
+subdir('file-psd')
+subdir('file-raw')
+subdir('file-sgi')
+subdir('file-tiff')
+subdir('file-webp')
+subdir('flame')
+subdir('fractal-explorer')
+subdir('gfig')
+subdir('gimpressionist')
+subdir('goat-exercises')
+subdir('gradient-flare')
+subdir('help')
+subdir('help-browser')
+subdir('ifs-compose')
+subdir('imagemap')
+subdir('lighting')
+subdir('map-object')
+subdir('metadata')
+subdir('pagecurl')
+subdir('print')
+# subdir('pygimp')
+subdir('python')
+subdir('screenshot')
+subdir('script-fu')
+subdir('selection-to-path')
+subdir('twain')
+subdir('ui')
diff --git a/plug-ins/metadata/meson.build b/plug-ins/metadata/meson.build
new file mode 100644
index 0000000000..41ea75ac2b
--- /dev/null
+++ b/plug-ins/metadata/meson.build
@@ -0,0 +1,94 @@
+
+plugin_name = 'metadata-editor'
+
+plugin_sources = [
+  'metadata-editor.c',
+  'metadata-impexp.c',
+  'metadata-xml.c',
+]
+
+if platform_windows
+  plugin_rc = configure_file(
+    input : gimp_plugins_rc,
+    output: plugin_name + '.rc',
+    copy: true,
+  )
+  plugin_sources += windows.compile_resources(
+    plugin_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, gexiv2,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
+
+###############################################################################
+
+plugin_name = 'metadata-viewer'
+
+plugin_sources = [
+  'metadata-viewer.c',
+]
+
+if platform_windows
+  plugin_rc = configure_file(
+    input : gimp_plugins_rc,
+    output: plugin_name + '.rc',
+    copy: true,
+  )
+  plugin_sources += windows.compile_resources(
+    plugin_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  [
+    'metadata-viewer.c',
+  ],
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, gexiv2,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/pagecurl/meson.build b/plug-ins/pagecurl/meson.build
new file mode 100644
index 0000000000..8222c5a913
--- /dev/null
+++ b/plug-ins/pagecurl/meson.build
@@ -0,0 +1,71 @@
+plugin_name = 'pagecurl'
+
+plugin_sources = [
+  'pagecurl.c',
+]
+
+pagecurl_icons_images = [
+  'curl0.png',
+  'curl1.png',
+  'curl2.png',
+  'curl3.png',
+  'curl4.png',
+  'curl5.png',
+  'curl6.png',
+  'curl7.png',
+]
+resourcename = 'pagecurl-icons'
+xml_content  = '<?xml version="1.0" encoding="UTF-8"?>\n'
+xml_content += '<gresources>\n'
+xml_content += '  <gresource prefix="/org/gimp/icons">\n'
+foreach file : pagecurl_icons_images
+  xml_content+='    <file preprocess="to-pixdata">'+ file +'</file>\n'
+endforeach
+xml_content += '  </gresource>\n'
+xml_content += '</gresources>\n'
+
+xml_file = configure_file(
+  output: resourcename + '.gresource.xml',
+  command: [ 'echo', xml_content ],
+  capture: true,
+)
+
+plugin_sources += gnome.compile_resources(
+  resourcename,
+  xml_file,
+  c_name: resourcename.underscorify(),
+)
+
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl, math,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/print/meson.build b/plug-ins/print/meson.build
new file mode 100644
index 0000000000..1b8ed35651
--- /dev/null
+++ b/plug-ins/print/meson.build
@@ -0,0 +1,49 @@
+if have_print
+
+
+plugin_name = 'print'
+
+plugin_sources = [
+  'print-draw-page.c',
+  'print-page-layout.c',
+  'print-page-setup.c',
+  'print-preview.c',
+  'print-settings.c',
+  'print-utils.c',
+  'print.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
+
+endif
diff --git a/plug-ins/pygimp/doc/meson.build b/plug-ins/pygimp/doc/meson.build
new file mode 100644
index 0000000000..fdc425393a
--- /dev/null
+++ b/plug-ins/pygimp/doc/meson.build
@@ -0,0 +1,25 @@
+
+pygimp_ps = custom_target('pygimp.ps',
+  input : [ 'pygimp.sgml' ],
+  output: [ 'pygimp.ps' ],
+  command: [
+    'db2ps',
+    '@INPUT@'
+  ],
+)
+pygimp_pdf = custom_target('pygimp.pdf',
+  input : [ 'pygimp.sgml' ],
+  output: [ 'pygimp.pdf' ],
+  command: [
+    'db2pdf',
+    '@INPUT@'
+  ],
+)
+pygimp_html = custom_target('pygimp.html',
+  input : [ 'pygimp.sgml' ],
+  output: [ 'pygimp.html' ],
+  command: [
+    'db2html', '--nochunks',
+    '@INPUT@'
+  ],
+)
diff --git a/plug-ins/pygimp/meson.build b/plug-ins/pygimp/meson.build
new file mode 100644
index 0000000000..f0edf37ad3
--- /dev/null
+++ b/plug-ins/pygimp/meson.build
@@ -0,0 +1,155 @@
+if have_python
+
+subdir('doc')
+subdir('plug-ins')
+
+# pwd = meson.current_source_dir()
+# pygtk_generator = generator(pygobjectcodegen,
+#   arguments: [
+#       '--override', pwd / '@BASENAME@.override',
+#       '--register', pygtk_defsdir / 'gdk-types.defs',
+#       '--register', pygtk_defsdir / 'gtk-types.defs',
+#       '--register', pwd / 'gimp-types.defs',
+#       '--register', pwd / 'gimpcolor-types.defs',
+#       '--register', pwd / 'gimpenums-types.defs',
+#       '--prefix', '@BASENAME@',
+#       '@INPUT@',
+#   ],
+#   output: '@BASENAME@.c',
+#   capture: true,
+# )
+
+
+python_so_libs = [
+   {
+    'name': 'gimp',
+    'srcs': [
+      'gimpmodule.c',
+      'pygimp-display.c',
+      'pygimp-drawable.c',
+      'pygimp-image.c',
+      'pygimp-item.c',
+      'pygimp-parasite.c',
+      'pygimp-pdb.c',
+      'pygimp-tile.c',
+      'pygimp-vectors.c',
+    ],
+    'deps': [
+      py2cairo,
+      cairo,
+      gtk3,
+    ],
+    'link': [
+      libgimp,
+      libgimpbase,
+      libgimpcolor,
+      libgimpui,
+    ],
+  },
+  { 'name': '_gimpenums',
+    'srcs': 'gimpenumsmodule.c',
+    'deps': [
+      gobject,
+      cairo,
+      gtk3,
+    ],
+    'link': [
+      libgimp,
+      libgimpbase,
+    ],
+  },
+  { 'name': '_gimpui',
+    'srcs': 'gimpuimodule.c',
+    'deps': [
+      py2cairo,
+      gtk3,
+    ],
+    'link': [
+      libgimp,
+      libgimpbase,
+      libgimpcolor,
+      libgimpconfig,
+      libgimpui,
+      libgimpwidgets
+    ],
+  },
+  { 'name': 'gimpcolor',
+    'srcs': [
+      'gimpcolormodule.c',
+      'pygimp-colors.c',
+    ],
+    'deps': [
+      cairo
+    ],
+    'link': [
+      libgimpcolor,
+    ],
+  },
+  { 'name': 'gimpthumb',
+    'srcs': 'gimpthumbmodule.c',
+    'deps': [],
+    'link': [
+      libgimpthumb,
+    ],
+  },
+]
+
+foreach pylib : python_so_libs
+  name = pylib.get('name')
+  srcs = pylib.get('srcs')
+  deps = pylib.get('deps')
+  link = pylib.get('link')
+
+  shared_library(name,
+    srcs,
+    include_directories: [ rootInclude, ],
+    dependencies: deps + [
+      libpython2, py2gobject,
+      gdk_pixbuf, gegl,
+    ],
+    link_with: link,
+    c_args: '-DGIMP_DEPRECATED_REPLACE_NEW_API',
+    name_prefix: '',
+    install: true,
+    install_dir: gimpplugindir / 'python',
+  )
+endforeach
+
+
+
+install_data([
+    'gimpenums.py',
+    'gimpfu.py',
+    'gimpplugin.py',
+    'gimpshelf.py',
+    'gimpui.py',
+    'pygimp-logo.png',
+  ],
+  install_dir: gimpplugindir / 'python',
+)
+
+path_separator = platform_windows ? ';' : ':'
+
+custom_target('pygimp.env',
+  output: [ 'pygimp.env' ],
+  command: [
+    'echo', path_separator + ' PYTHONPATH=${gimp_plug_in_dir}/python'
+  ],
+  capture: true,
+  install: true,
+  install_dir: gimpplugindir / 'environ',
+)
+custom_target('pygimp.interp',
+  output: [ 'pygimp.interp' ],
+  command: [ 'echo',
+    'python='          + python2.path() + '\n' +
+    'python2='         + python2.path() + '\n' +
+    '/usr/bin/python=' + python2.path() + '\n' +
+    ':Python:E::py::python2:'
+  ],
+  capture: true,
+  install: true,
+  install_dir: gimpplugindir / 'interpreters',
+)
+
+endif
diff --git a/plug-ins/pygimp/plug-ins/meson.build b/plug-ins/pygimp/plug-ins/meson.build
new file mode 100644
index 0000000000..95f08901fd
--- /dev/null
+++ b/plug-ins/pygimp/plug-ins/meson.build
@@ -0,0 +1,27 @@
+plugins = [
+  'colorxhtml',
+  'foggify',
+  'gradients-save-as-css',
+  'histogram-export',
+  'palette-sort',
+  'py-slice',
+  'python-eval',
+  'spyro_plus',
+]
+
+if not stable
+  plugins += [
+    'benchmark-foreground-extract',
+    'clothify',
+    'shadow_bevel',
+    'sphere',
+    'whirlpinch',
+  ]
+endif
+
+foreach plugin : plugins
+  name = plugin
+  srcs = name + '.py'
+
+  install_data(srcs, install_dir: gimpplugindir / name)
+endforeach
diff --git a/plug-ins/python/meson.build b/plug-ins/python/meson.build
new file mode 100644
index 0000000000..302a72a8cd
--- /dev/null
+++ b/plug-ins/python/meson.build
@@ -0,0 +1,53 @@
+if have_python
+
+plugins = [
+  { 'name': 'file-openraster' },
+  { 'name': 'foggify' },
+  { 'name': 'palette-offset' },
+  { 'name': 'palette-to-gradient' },
+  { 'name': 'py-slice' },
+  { 'name': 'spyro-plus' },
+
+  # { 'name': 'colorxhtml' },
+  # { 'name': 'gradients-save-as-css' },
+  # { 'name': 'histogram-export' },
+  # { 'name': 'palette-sort' },
+  # { 'name': 'python-eval' },
+]
+
+if not stable
+  plugins += [
+    # { 'name': 'benchmark-foreground-extract', },
+    # { 'name': 'clothify', },
+    # { 'name': 'shadow_bevel', },
+    # { 'name': 'sphere', },
+    # { 'name': 'whirlpinch', },
+  ]
+endif
+
+subdir('python-console')
+
+foreach plugin : plugins
+  name = plugin.get('name')
+  srcs = plugin.get('srcs', name + '.py')
+
+  install_data(srcs, install_dir: gimpplugindir / name)
+endforeach
+
+
+if python.found()
+  custom_target('pygimp.interp',
+    output: 'pygimp.interp',
+    command: [ 'echo',
+      'python=@0@\n'          .format(python.path()),
+      'python3=@0@\n'         .format(python.path()),
+      '/usr/bin/python=@0@\n' .format(python.path()),
+      ':Python:E::py::python3:'
+    ],
+    capture: true,
+    install: true,
+    install_dir: gimpplugindir / 'interpreters',
+  )
+endif
+
+endif
diff --git a/plug-ins/python/python-console/meson.build b/plug-ins/python/python-console/meson.build
new file mode 100644
index 0000000000..2399c14cbf
--- /dev/null
+++ b/plug-ins/python/python-console/meson.build
@@ -0,0 +1,5 @@
+
+plugins += {
+  'name': 'python-console',
+  'srcs': files('pyconsole.py', 'python-console.py'),
+}
diff --git a/plug-ins/screenshot/meson.build b/plug-ins/screenshot/meson.build
new file mode 100644
index 0000000000..7f4ef677ae
--- /dev/null
+++ b/plug-ins/screenshot/meson.build
@@ -0,0 +1,38 @@
+if have_screenshot
+
+plugin_sources = [
+  'screenshot-freedesktop.c',
+  'screenshot-gnome-shell.c',
+  'screenshot-kwin.c',
+  'screenshot-osx.c',
+  'screenshot-win32.c',
+  'screenshot-x11.c',
+  'screenshot.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources('screenshot-win32.rc')
+endif
+
+
+screenshot = executable('screenshot',
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gtk3, gegl,
+    x11, xmu, xext, xfixes,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
+
+endif
diff --git a/plug-ins/script-fu/ftx/meson.build b/plug-ins/script-fu/ftx/meson.build
new file mode 100644
index 0000000000..b5117c784e
--- /dev/null
+++ b/plug-ins/script-fu/ftx/meson.build
@@ -0,0 +1,12 @@
+
+scriptfu_ftx = static_library('scriptfu-ftx',
+  'ftx.c',
+  include_directories: [ rootInclude, scriptfu_incdir, ],
+  dependencies: [
+    glib,
+  ],
+  c_args: [
+    '-DUSE_INTERFACE=1',
+  ],
+  install: false,
+)
diff --git a/plug-ins/script-fu/meson.build b/plug-ins/script-fu/meson.build
new file mode 100644
index 0000000000..d8fff07da1
--- /dev/null
+++ b/plug-ins/script-fu/meson.build
@@ -0,0 +1,63 @@
+scriptfu_incdir = include_directories('.')
+
+subdir('tinyscheme')
+subdir('ftx')
+subdir('scripts')
+
+plugin_name = 'script-fu'
+
+plugin_sources = [
+  'scheme-wrapper.c',
+  'script-fu-console.c',
+  'script-fu-eval.c',
+  'script-fu-interface.c',
+  'script-fu-regex.c',
+  'script-fu-script.c',
+  'script-fu-scripts.c',
+  'script-fu-server.c',
+  'script-fu-text-console.c',
+  'script-fu-utils.c',
+  'script-fu.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    gegl, gtk3, math, winsock,
+  ],
+  c_args: [
+    '-DSTANDALONE=0',
+    '-DUSE_INTERFACE=1',
+    '-DUSE_STRLWR=0',
+  ],
+  link_whole: [
+    scriptfu_tinyscheme,
+    scriptfu_ftx,
+  ],
+  link_with: [
+    libgimp,
+    libgimpbase,
+    libgimpcolor,
+    libgimpconfig,
+    libgimpmath,
+    libgimpui,
+    libgimpwidgets,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/script-fu/scripts/images/meson.build b/plug-ins/script-fu/scripts/images/meson.build
new file mode 100644
index 0000000000..12d54938c8
--- /dev/null
+++ b/plug-ins/script-fu/scripts/images/meson.build
@@ -0,0 +1,9 @@
+install_data([
+    'beavis.jpg',
+    'texture.jpg',
+    'texture1.jpg',
+    'texture2.jpg',
+    'texture3.jpg',
+  ],
+  install_dir: gimpdatadir / 'scripts' / 'images',
+)
diff --git a/plug-ins/script-fu/scripts/meson.build b/plug-ins/script-fu/scripts/meson.build
new file mode 100644
index 0000000000..840f954240
--- /dev/null
+++ b/plug-ins/script-fu/scripts/meson.build
@@ -0,0 +1,68 @@
+subdir('images')
+
+scripts = [
+  'add-bevel.scm',
+  'addborder.scm',
+  'blend-anim.scm',
+  'burn-in-anim.scm',
+  'carve-it.scm',
+  'chrome-it.scm',
+  'circuit.scm',
+  'clothify.scm',
+  'coffee.scm',
+  'copy-visible.scm',
+  'difference-clouds.scm',
+  'distress-selection.scm',
+  'drop-shadow.scm',
+  'erase-rows.scm',
+  'font-map.scm',
+  'fuzzyborder.scm',
+  'gimp-online.scm',
+  'gradient-example.scm',
+  'grid-system.scm',
+  'guides-from-selection.scm',
+  'guides-new-percent.scm',
+  'guides-new.scm',
+  'guides-remove-all.scm',
+  'lava.scm',
+  'line-nova.scm',
+  'mkbrush.scm',
+  'old-photo.scm',
+  'palette-export.scm',
+  'paste-as-brush.scm',
+  'paste-as-pattern.scm',
+  'perspective-shadow.scm',
+  'plug-in-compat.init',
+  'predator.scm',
+  'reverse-layers.scm',
+  'ripply-anim.scm',
+  'round-corners.scm',
+  'script-fu-compat.init',
+  'script-fu-set-cmap.scm',
+  'script-fu-util.scm',
+  'script-fu.init',
+  'select-to-brush.scm',
+  'select-to-image.scm',
+  'select-to-pattern.scm',
+  'selection-round.scm',
+  'slide.scm',
+  'spinning-globe.scm',
+  'tileblur.scm',
+  'unsharp-mask.scm',
+  'waves-anim.scm',
+  'weave.scm',
+  'xach-effect.scm',
+]
+
+if not stable
+  scripts += [
+    'contactsheet.scm',
+    'test-sphere.scm',
+    'ts-helloworld.scm',
+  ]
+endif
+
+install_data(
+  scripts,
+  install_dir: gimpdatadir / 'scripts',
+)
diff --git a/plug-ins/script-fu/tinyscheme/meson.build b/plug-ins/script-fu/tinyscheme/meson.build
new file mode 100644
index 0000000000..45981df8db
--- /dev/null
+++ b/plug-ins/script-fu/tinyscheme/meson.build
@@ -0,0 +1,16 @@
+
+scriptfu_tinyscheme = static_library('scriptfu-tinyscheme',
+  'scheme.c',
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    glib,
+  ],
+  c_args: [
+    '-DSTANDALONE=0',
+    '-DUSE_ASCII_NAMES=0',
+    '-DUSE_INTERFACE=1',
+    '-DUSE_MATH=1',
+    '-DUSE_STRLWR=0',
+  ],
+  install: false,
+)
diff --git a/plug-ins/selection-to-path/meson.build b/plug-ins/selection-to-path/meson.build
new file mode 100644
index 0000000000..17fe4cc7a3
--- /dev/null
+++ b/plug-ins/selection-to-path/meson.build
@@ -0,0 +1,49 @@
+plugin_name = 'selection-to-path'
+
+plugin_sources = [
+  'curve.c',
+  'edge.c',
+  'fit.c',
+  'math.c',
+  'pxl-outline.c',
+  'selection-to-path-dialog.c',
+  'selection-to-path.c',
+  'spline.c',
+  'vector.c',
+]
+
+if platform_windows
+  plugin_sources += windows.compile_resources(
+    gimp_plugins_rc,
+    args: [
+      '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+      '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+      '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+    ],
+    include_directories: [
+      rootInclude, appInclude,
+    ],
+  )
+endif
+
+plugin_selection_to_path_link = [
+  libgimp,
+  libgimpbase,
+  libgimpcolor,
+  libgimpconfig,
+  libgimpmath,
+  libgimpui,
+  libgimpwidgets,
+]
+plugin_selection_to_path_deps = [
+  gegl, gtk3, math,
+]
+
+selection_to_path = executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  link_with:    plugin_selection_to_path_link,
+  dependencies: plugin_selection_to_path_deps,
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
diff --git a/plug-ins/twain/meson.build b/plug-ins/twain/meson.build
new file mode 100644
index 0000000000..181f611b01
--- /dev/null
+++ b/plug-ins/twain/meson.build
@@ -0,0 +1,39 @@
+if platform_windows
+
+plugin_name = 'twain'
+
+plugin_sources = [
+  'tw_func.c',
+  'tw_util.c',
+  'tw_win.c',
+  'twain.c',
+]
+
+plugin_sources += windows.compile_resources(
+  gimp_plugins_rc,
+  args: [
+    '--define', 'ORIGINALFILENAME_STR="@0@"'.format(plugin_name+'.exe'),
+    '--define', 'INTERNALNAME_STR="@0@"'    .format(plugin_name),
+    '--define', 'TOP_SRCDIR="@0@"'          .format(meson.source_root()),
+  ],
+  include_directories: [
+    rootInclude, appInclude,
+  ],
+)
+
+twain = executable(plugin_name,
+  plugin_sources,
+  include_directories: [ rootInclude, ],
+  dependencies: [
+    glib, gtk3, gegl,
+  ],
+  link_with: [
+    libgimp,
+    libgimpcolor,
+    libgimpbase,
+  ],
+  install: true,
+  install_dir: gimpplugindir / 'plug-ins' / plugin_name,
+)
+
+endif
diff --git a/plug-ins/ui/meson.build b/plug-ins/ui/meson.build
new file mode 100644
index 0000000000..66ec2b0cd6
--- /dev/null
+++ b/plug-ins/ui/meson.build
@@ -0,0 +1,13 @@
+plugin_ui = [
+  'plug-in-file-gif.ui',
+  'plug-in-file-png.ui',
+  'plug-in-file-raw.ui',
+  'plug-in-file-tiff.ui',
+  'plug-in-metadata-editor-calendar.ui',
+  'plug-in-metadata-editor.ui',
+  'plug-in-metadata-viewer.ui',
+]
+
+install_data(plugin_ui,
+  install_dir: gimpdatadir / 'ui' / 'plug-ins',
+)
diff --git a/po-libgimp/meson.build b/po-libgimp/meson.build
new file mode 100644
index 0000000000..9dbc5a5232
--- /dev/null
+++ b/po-libgimp/meson.build
@@ -0,0 +1 @@
+i18n.gettext(gettext_package + '-libgimp', preset: 'glib')
diff --git a/po-plug-ins/meson.build b/po-plug-ins/meson.build
new file mode 100644
index 0000000000..30c6f6f987
--- /dev/null
+++ b/po-plug-ins/meson.build
@@ -0,0 +1 @@
+i18n.gettext(gettext_package + '-std-plug-ins', preset: 'glib')
diff --git a/po-python/meson.build b/po-python/meson.build
new file mode 100644
index 0000000000..9ebb6cbe85
--- /dev/null
+++ b/po-python/meson.build
@@ -0,0 +1 @@
+i18n.gettext(gettext_package + '-python', preset: 'glib')
diff --git a/po-script-fu/meson.build b/po-script-fu/meson.build
new file mode 100644
index 0000000000..e4ed2fa285
--- /dev/null
+++ b/po-script-fu/meson.build
@@ -0,0 +1 @@
+i18n.gettext(gettext_package + '-script-fu', preset: 'glib')
diff --git a/po-tags/meson.build b/po-tags/meson.build
new file mode 100644
index 0000000000..9d943cbae9
--- /dev/null
+++ b/po-tags/meson.build
@@ -0,0 +1 @@
+potags_dir = meson.current_source_dir()
diff --git a/po-tips/meson.build b/po-tips/meson.build
new file mode 100644
index 0000000000..070950ec74
--- /dev/null
+++ b/po-tips/meson.build
@@ -0,0 +1,2 @@
+potips_dir = meson.current_source_dir()
+i18n.gettext(gettext_package + '-tips', preset: 'glib')
diff --git a/po-windows-installer/meson.build b/po-windows-installer/meson.build
new file mode 100644
index 0000000000..34a26b2108
--- /dev/null
+++ b/po-windows-installer/meson.build
@@ -0,0 +1,2 @@
+po_windows_installer_dir = meson.current_source_dir()
+i18n.gettext(gettext_package + '-windows-installer', preset: 'glib')
diff --git a/po/meson.build b/po/meson.build
new file mode 100644
index 0000000000..84381e7b8c
--- /dev/null
+++ b/po/meson.build
@@ -0,0 +1,2 @@
+po_dir = meson.current_source_dir()
+i18n.gettext(gettext_package, preset: 'glib')
diff --git a/themes/meson.build b/themes/meson.build
new file mode 100644
index 0000000000..1236f7a653
--- /dev/null
+++ b/themes/meson.build
@@ -0,0 +1,11 @@
+
+themes = [
+  'System',
+]
+
+foreach theme : themes
+  install_data(
+    theme / 'gimp.css',
+    install_dir: gimpdatadir / 'themes' / theme,
+  )
+endforeach
diff --git a/tools/generate_changelog.sh b/tools/generate_changelog.sh
new file mode 100755
index 0000000000..6311626397
--- /dev/null
+++ b/tools/generate_changelog.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+srcdir="$1"
+output="$2"
+
+echo "Creating ${output} based on git log"
+
+gitdir="${srcdir}/.git"
+
+if [[ ! -d "${gitdir}" ]]; then
+    echo "A git checkout and git-log is required to write changelog in ${output}." \
+    | tee ${output} >&2
+    exit 1
+fi
+
+
+CHANGELOG_START=74424325abb54620b370f2595445b2b2a19fe5e7
+
+( \
+    git log "${CHANGELOG_START}^.." --stat "${srcdir}" | fmt --split-only \
+        > "${output}.tmp" \
+    && [ ${PIPESTATUS[0]} -eq 0 ] \
+    && mv "${output}.tmp" "${output}" -f \
+    && echo "Appending ChangeLog.pre-git" \
+    && cat "${srcdir}/ChangeLog.pre-git" >> "${output}" \
+    && exit 0
+) \
+||\
+( \
+    rm "${output}.tmp" -f \
+    && echo "Failed to generate ChangeLog, your ChangeLog may be outdated" >&2 \
+    && (test -f "${output}" \
+        || echo "git-log is required to generate this file" >> "${output}") \
+    && exit 1
+)
diff --git a/tools/meson.build b/tools/meson.build
new file mode 100644
index 0000000000..b7a73f94a7
--- /dev/null
+++ b/tools/meson.build
@@ -0,0 +1,37 @@
+
+if platform_windows
+  gimp_debug_resume = executable('gimp-debug-resume',
+    'gimp-debug-resume.c',
+  )
+endif
+
+
+gimptool = executable('gimptool-' + gimp_app_version,
+  'gimptool.c',
+  include_directories: rootInclude,
+  dependencies: [
+    gtk3,
+  ],
+  link_with: [
+    libgimpbase,
+  ],
+  c_args: [
+    '-DDATADIR="@0@"'.format(get_option('datadir')),
+  ],
+  install: true,
+)
+
+executable('gimp-test-clipboard-' + gimp_app_version,
+  'gimp-test-clipboard.c',
+  include_directories: rootInclude,
+  dependencies: [
+    gtk3,
+  ],
+  install: true,
+)
+
+executable('kernelgen',
+  'kernelgen.c',
+  include_directories: rootInclude,
+  install: false,
+)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]