[gtkmm/gtkmm-3-24] Meson build: Make it possible to use gtkmm as a subproject



commit 9c3403656538671ec422aa246c030d103c0b6061
Author: Kjell Ahlstedt <kjellahlstedt gmail com>
Date:   Fri Mar 26 16:28:46 2021 +0100

    Meson build: Make it possible to use gtkmm as a subproject
    
    gtk, gdk-pixbuf, epoxy, atkmm, cairomm, pangomm and glibmm can be
    subprojects of gtkmm.
    It's not guaranteed that gtk3 can be a subproject. See gtk#3775

 Makefile.am                      |  7 +++++
 demos/gtk-demo/meson.build       |  4 +--
 docs/reference/meson.build       |  8 +++---
 gdk/gdkmm/meson.build            | 11 ++++---
 gtk/gtkmm/meson.build            | 11 ++++---
 meson.build                      | 62 ++++++++++++++++++++++++++++++++++------
 subprojects/atkmm-1.6.wrap       |  8 ++++++
 subprojects/cairomm-1.0.wrap     |  8 ++++++
 subprojects/gdk-pixbuf.wrap      |  8 ++++++
 subprojects/glibmm-2.4.wrap      |  8 ++++++
 subprojects/gtk+-3.0.wrap        |  8 ++++++
 subprojects/libepoxy.wrap        |  8 ++++++
 subprojects/pangomm-1.4.wrap     |  8 ++++++
 tests/meson.build                |  4 +--
 tools/extra_defs_gen/meson.build |  8 +++++-
 15 files changed, 145 insertions(+), 26 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index 758a8327..b9b540a5 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -70,6 +70,13 @@ EXTRA_DIST = \
   gtk/meson.build \
   gtk/gtkmmconfig.h.meson \
   gtk/gtkmm/meson.build \
+  subprojects/atkmm-1.6.wrap \
+  subprojects/cairomm-1.0.wrap \
+  subprojects/gdk-pixbuf.wrap \
+  subprojects/glibmm-2.4.wrap \
+  subprojects/gtk+-3.0.wrap \
+  subprojects/libepoxy.wrap \
+  subprojects/pangomm-1.4.wrap \
   tests/meson.build \
   tools/dummy-header.py \
   tools/extra_defs_gen/meson.build \
diff --git a/demos/gtk-demo/meson.build b/demos/gtk-demo/meson.build
index 850d5ce8..6a9248f1 100644
--- a/demos/gtk-demo/meson.build
+++ b/demos/gtk-demo/meson.build
@@ -1,6 +1,6 @@
 # demos/gtk-demo
 
-# Input: gtkmm_dep, epoxy_dep, build_demos, gui_app_ldflags, gtkmm_extra_gendef_cpp_args
+# Input: gtkmm_own_dep, epoxy_dep, build_demos, gui_app_ldflags, gtkmm_extra_gendef_cpp_args
 # Output: -
 
 gtkmm_demo_cc_files = [
@@ -46,7 +46,7 @@ if epoxy_dep.found()
 
   executable('gtkmm-demo',
     gtkmm_demo_cc_files, demo_resources,
-    dependencies: [gtkmm_dep, epoxy_dep],
+    dependencies: [gtkmm_own_dep, epoxy_dep],
     gui_app: true,
     build_by_default: build_demos,
     link_args: gui_app_ldflags,
diff --git a/docs/reference/meson.build b/docs/reference/meson.build
index 4d696625..4e65bc42 100644
--- a/docs/reference/meson.build
+++ b/docs/reference/meson.build
@@ -4,7 +4,7 @@
 #        gdkmm_hg_ccg_basenames, gtkmm_hg_ccg_basenames, build_documentation,
 #        gdkmm_extra_h_files, gtkmm_extra_h_files, gdkmm_built_h_file_targets,
 #        gtkmm_built_h_file_targets, install_datadir, python3, doc_reference_py
-# Output: install_docdir, install_devhelpdir
+# Output: install_docdir, install_devhelpdir, tag_file
 
 tag_file_modules = [
   'mm-common-libstdc++',
@@ -19,9 +19,9 @@ docinstall_flags = []
 foreach module : tag_file_modules
   depmod = dependency(module, required: false)
   if depmod.found()
-    doxytagfile = depmod.get_pkgconfig_variable('doxytagfile')
-    htmlrefpub = depmod.get_pkgconfig_variable('htmlrefpub', default: '')
-    htmlrefdir = depmod.get_pkgconfig_variable('htmlrefdir', default: '')
+    doxytagfile = depmod.get_variable(pkgconfig: 'doxytagfile', internal: 'doxytagfile')
+    htmlrefpub = depmod.get_variable(pkgconfig: 'htmlrefpub', internal: 'htmlrefpub', default_value: '')
+    htmlrefdir = depmod.get_variable(pkgconfig: 'htmlrefdir', internal: 'htmlrefdir', default_value: '')
     if htmlrefpub == ''
       htmlrefpub = htmlrefdir
     elif htmlrefdir == ''
diff --git a/gdk/gdkmm/meson.build b/gdk/gdkmm/meson.build
index 0832b106..9c7efa7b 100644
--- a/gdk/gdkmm/meson.build
+++ b/gdk/gdkmm/meson.build
@@ -6,7 +6,7 @@
 #        build_deprecated_api, gmmproc_extra_m4_dirs, is_host_windows,
 #        gdkmm_extra_gendef_cpp_args, gdkmm_libname, macos_darwin_versions
 # Output: gdkmm_hg_ccg_basenames, gdkmm_extra_h_files, built_files_root,
-#         gdkmm_built_h_file_targets, gdkmm_used_built_h_file_targets, gdkmm_dep
+#         gdkmm_built_h_file_targets, gdkmm_used_built_h_file_targets, gdkmm_own_dep
 
 gdkmm_defs_basefiles = [
   'gdk.defs',
@@ -226,6 +226,7 @@ endif
 if build_shared_libs_directly
   gdkmm_library = library(gdkmm_libname, extra_gdkmm_objects,
     gdk_gen_sources, built_dummy_h_file_target, gdkmm_extra_cc_files,
+    implicit_include_directories: false,
     include_directories: extra_include_dirs,
     cpp_args: gdkmm_cpp_args,
     version: gtkmm_libversion,
@@ -240,6 +241,7 @@ else
   # needed for obtaining the .lib file for the gdkmm DLL
   gdk_int_lib = static_library('gdkmm-int',
     gdk_gen_sources, built_dummy_h_file_target, gdkmm_extra_cc_files,
+    implicit_include_directories: false,
     include_directories: extra_include_dirs,
     cpp_args: gdkmm_cpp_args,
     dependencies: gdkmm_build_dep,
@@ -262,6 +264,7 @@ else
     objects: gdk_int_lib.extract_all_objects(),
     version: gtkmm_libversion,
     darwin_versions: macos_darwin_versions,
+    implicit_include_directories: false,
     dependencies: gdkmm_build_dep,
     link_depends: gdkmm_def,
     link_args: gdkmm_extra_link_args,
@@ -288,9 +291,9 @@ if not meson.is_subproject()
   )
 endif
 
-# This is useful in the main project when gdkmm is used as a subproject.
-# It's also used when building demo programs and test programs.
-gdkmm_dep = declare_dependency(
+# This is used when building demo programs and test programs.
+# It's also a part of gdkmm_dep, when gdkmm is a subproject.
+gdkmm_own_dep = declare_dependency(
   sources: gdkmm_used_built_h_file_targets,
   link_with: gdkmm_library,
   include_directories: extra_include_dirs,
diff --git a/gtk/gtkmm/meson.build b/gtk/gtkmm/meson.build
index 2a2ba545..5fc22d59 100644
--- a/gtk/gtkmm/meson.build
+++ b/gtk/gtkmm/meson.build
@@ -7,7 +7,7 @@
 #        gdkmm_library, gdkmm_used_built_h_file_targets, gtkmm_extra_gendef_cpp_args,
 #        gtkmm_libname, macos_darwin_versions
 # Output: gtkmm_hg_ccg_basenames, gtkmm_extra_h_files, built_files_root,
-#         gtkmm_built_h_file_targets, gtkmm_dep
+#         gtkmm_built_h_file_targets, gtkmm_own_dep
 
 gtkmm_defs_basefiles = [
   'gtk.defs',
@@ -492,6 +492,7 @@ endif
 if build_shared_libs_directly
   gtkmm_library = library(gtkmm_libname, extra_gtkmm_objects,
     gtk_gen_sources, built_dummy_h_file_target, gtkmm_extra_used_cc_files,
+    implicit_include_directories: false,
     include_directories: extra_include_dirs,
     cpp_args: gtkmm_cpp_args,
     version: gtkmm_libversion,
@@ -507,6 +508,7 @@ else
   # needed for obtaining the .lib file for the gtkmm DLL
   gtk_int_lib = static_library('gtkmm-int',
     gtk_gen_sources, built_dummy_h_file_target, gtkmm_extra_used_cc_files,
+    implicit_include_directories: false,
     include_directories: extra_include_dirs,
     cpp_args: gtkmm_cpp_args,
     dependencies: gtkmm_build_dep,
@@ -530,6 +532,7 @@ else
     objects: gtk_int_lib.extract_all_objects(),
     version: gtkmm_libversion,
     darwin_versions: macos_darwin_versions,
+    implicit_include_directories: false,
     dependencies: gtkmm_build_dep,
     link_depends: gtkmm_def,
     link_args: gtkmm_extra_link_args,
@@ -557,9 +560,9 @@ if not meson.is_subproject()
   )
 endif
 
-# This is useful in the main project when gtkmm is used as a subproject.
-# It's also used when building demo programs and test programs.
-gtkmm_dep = declare_dependency(
+# This is used when building demo programs and test programs.
+# It's also a part of gtkmm_dep, when gtkmm is a subproject.
+gtkmm_own_dep = declare_dependency(
   sources: gdkmm_used_built_h_file_targets + gtkmm_used_built_h_file_targets,
   link_with: [gdkmm_library, gtkmm_library],
   include_directories: extra_include_dirs,
diff --git a/meson.build b/meson.build
index 13b883eb..1153b243 100644
--- a/meson.build
+++ b/meson.build
@@ -7,7 +7,8 @@ project('gtkmm', 'c', 'cpp',
   default_options: [
     'cpp_std=c++11'
   ],
-  meson_version: '>= 0.50.0', # required for python3.path()
+  meson_version: '>= 0.54.0', # required for meson.override_dependency()
+                              # and dep.get_variable(internal:)
 )
 
 gtkmm_api_version = '3.0'
@@ -133,23 +134,35 @@ glibmm_dep = dependency('glibmm-2.@0@'.format(glibmm_req_minor_ver), version: gl
 giomm_dep = dependency('giomm-2.@0@'.format(glibmm_req_minor_ver), version: glibmm_req)
 
 # Where to find gmmproc and generate_wrap_init.pl.
-gmmproc_dir = glibmm_dep.get_pkgconfig_variable('gmmprocdir')
+gmmproc_dir = glibmm_dep.get_variable(pkgconfig: 'gmmprocdir', internal: 'gmmprocdir')
 
-gmmproc_extra_m4_dirs = [pangomm_dep.get_pkgconfig_variable('gmmprocm4dir')]
+gmmproc_extra_m4_dirs = [pangomm_dep.get_variable(pkgconfig: 'gmmprocm4dir', internal: 'gmmprocm4dir')]
 if atkmm_dep.found()
-  gmmproc_extra_m4_dirs += [atkmm_dep.get_pkgconfig_variable('gmmprocm4dir')]
+  gmmproc_extra_m4_dirs += [atkmm_dep.get_variable(pkgconfig: 'gmmprocm4dir', internal: 'gmmprocm4dir')]
 endif
 
 # Is X11 backend available?
 if build_x11_api_opt == 'false'
   build_x11_api = false
 else
-  backends = gtk_dep.get_pkgconfig_variable('targets').split()
+  if gtk_dep.type_name() == 'internal'
+    x11_enabled_in_gdk = subproject('gtk+-3.0').get_variable('x11_enabled', fallback: true)
+    if x11_enabled_in_gdk != subproject('gtk+-3.0').get_variable('x11_enabled', fallback: false)
+      if is_host_windows or host_machine.system() == 'darwin'
+        # X11 is never supported on Windows or MacOS.
+        x11_enabled_in_gdk = false
+      else
+        warning('Variable x11_enabled not found in gtk+-3.0. Assuming X11 backend is supported.')
+      endif
+    endif
+  else # gtk_dep from pkgconfig
+    x11_enabled_in_gdk = gtk_dep.get_variable(pkgconfig: 'targets').contains('x11')
+  endif
   if build_x11_api_opt == 'if-enabled-in-gdk'
-    build_x11_api = backends.contains('x11')
+    build_x11_api = x11_enabled_in_gdk
   else # build_x11_api_opt == 'true'
     build_x11_api = true
-    if not backends.contains('x11')
+    if not x11_enabled_in_gdk
       error('Requested X11 backend not supported by installed gdk.')
     endif
   endif
@@ -174,8 +187,15 @@ endif
 
 # not Windows
 if host_machine.system() != 'windows'
-  gtk_unix_print_dep = dependency('gtk+-unix-print-3.0')
-  gtkmm_build_dep += [gtk_unix_print_dep]
+  # gtk+-unix-print-3.0 consists of only header files (no library).
+  # In gtk's source directory, those header files are stored in the same
+  # directory as other gtk/gtk files. No extra directory need be searched for
+  # header files, when gtk is used uninstalled.
+  gtk_unix_print_dep = dependency('gtk+-unix-print-3.0',
+                       required: gtk_dep.type_name() != 'internal')
+  if gtk_unix_print_dep.found()
+    gtkmm_build_dep += [gtk_unix_print_dep]
+  endif
   gtkmm_requires += ['gtk+-unix-print-3.0', '']
 endif
 
@@ -357,6 +377,30 @@ if not meson.is_subproject()
     'untracked' / 'build_scripts',
     dont_distribute,
   )
+else
+  # This is a subproject.
+  gdkmm_dep = declare_dependency(
+    dependencies: gdkmm_own_dep,
+    variables: {
+      'doxytagfile': tag_file.full_path(),
+      'htmlrefdir': install_prefix / install_docdir / 'reference' / 'html',
+      'htmlrefpub': 'http://library.gnome.org/devel/' + pkg_conf_data.get_unquoted('PACKAGE_TARNAME') + 
'/unstable/'
+    }
+  )
+  gtkmm_dep = declare_dependency(
+    dependencies: gtkmm_own_dep,
+    variables: {
+      'gmmprocm4dir': project_source_root / 'tools' / 'm4',
+      'doxytagfile': tag_file.full_path(),
+      'htmlrefdir': install_prefix / install_docdir / 'reference' / 'html',
+      'htmlrefpub': 'http://library.gnome.org/devel/' + pkg_conf_data.get_unquoted('PACKAGE_TARNAME') + 
'/unstable/'
+    }
+  )
+
+  # A main project that looks for gdkmm_pcname.pc and gtkmm_pcname.pc
+  # shall find gdkmm_dep and gtkmm_dep.
+  meson.override_dependency(gdkmm_pcname, gdkmm_dep)
+  meson.override_dependency(gtkmm_pcname, gtkmm_dep)
 endif
 
 # Print a summary.
diff --git a/subprojects/atkmm-1.6.wrap b/subprojects/atkmm-1.6.wrap
new file mode 100644
index 00000000..8fcdba6d
--- /dev/null
+++ b/subprojects/atkmm-1.6.wrap
@@ -0,0 +1,8 @@
+[wrap-git]
+directory=atkmm-1.6
+url=https://gitlab.gnome.org/GNOME/atkmm.git
+revision=atkmm-2-28
+depth=1
+
+[provide]
+dependency_names = atkmm-1.6
diff --git a/subprojects/cairomm-1.0.wrap b/subprojects/cairomm-1.0.wrap
new file mode 100644
index 00000000..7210ecf2
--- /dev/null
+++ b/subprojects/cairomm-1.0.wrap
@@ -0,0 +1,8 @@
+[wrap-git]
+directory=cairomm-1.0
+url=https://gitlab.freedesktop.org/cairo/cairomm.git
+revision=cairomm-1-14
+depth=1
+
+[provide]
+dependency_names = cairomm-1.0
diff --git a/subprojects/gdk-pixbuf.wrap b/subprojects/gdk-pixbuf.wrap
new file mode 100644
index 00000000..7d13de8a
--- /dev/null
+++ b/subprojects/gdk-pixbuf.wrap
@@ -0,0 +1,8 @@
+[wrap-git]
+directory=gdk-pixbuf
+url=https://gitlab.gnome.org/GNOME/gdk-pixbuf.git
+revision=master
+depth=1
+
+[provide]
+gdk-pixbuf-2.0 = gdkpixbuf_dep
diff --git a/subprojects/glibmm-2.4.wrap b/subprojects/glibmm-2.4.wrap
new file mode 100644
index 00000000..a7f7855d
--- /dev/null
+++ b/subprojects/glibmm-2.4.wrap
@@ -0,0 +1,8 @@
+[wrap-git]
+directory=glibmm-2.4
+url=https://gitlab.gnome.org/GNOME/glibmm.git
+revision=glibmm-2-66
+depth=1
+
+[provide]
+dependency_names = glibmm-2.4, giomm-2.4
diff --git a/subprojects/gtk+-3.0.wrap b/subprojects/gtk+-3.0.wrap
new file mode 100644
index 00000000..6002f2dc
--- /dev/null
+++ b/subprojects/gtk+-3.0.wrap
@@ -0,0 +1,8 @@
+[wrap-git]
+directory=gtk+-3
+url=https://gitlab.gnome.org/GNOME/gtk.git
+revision=gtk-3-24
+depth=1
+
+[provide]
+gtk+-3.0 = libgtk_dep
diff --git a/subprojects/libepoxy.wrap b/subprojects/libepoxy.wrap
new file mode 100644
index 00000000..ad4f6cb7
--- /dev/null
+++ b/subprojects/libepoxy.wrap
@@ -0,0 +1,8 @@
+[wrap-git]
+directory=libepoxy
+url=https://github.com/anholt/libepoxy.git
+revision=master
+depth=1
+
+[provide]
+epoxy = libepoxy_dep
diff --git a/subprojects/pangomm-1.4.wrap b/subprojects/pangomm-1.4.wrap
new file mode 100644
index 00000000..ddd5b364
--- /dev/null
+++ b/subprojects/pangomm-1.4.wrap
@@ -0,0 +1,8 @@
+[wrap-git]
+directory=pangomm-1.4
+url=https://gitlab.gnome.org/GNOME/pangomm.git
+revision=pangomm-2-46
+depth=1
+
+[provide]
+dependency_names = pangomm-1.4
diff --git a/tests/meson.build b/tests/meson.build
index 778cbffa..0018d3da 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -1,6 +1,6 @@
 # tests
 
-# Input: gdkmm_dep, gtkmm_dep, build_tests, gui_app_ldflags, gtkmm_extra_gendef_cpp_args
+# Input: gdkmm_own_dep, gtkmm_own_dep, build_tests, gui_app_ldflags, gtkmm_extra_gendef_cpp_args
 # Output: -
 
 test_programs = [
@@ -34,7 +34,7 @@ foreach ex : test_programs
   endforeach
 
   exe_file = executable(ex_name, ex_sources,
-    dependencies: ex[3] ? gtkmm_dep : gdkmm_dep,
+    dependencies: ex[3] ? gtkmm_own_dep : gdkmm_own_dep,
     gui_app: ex[3],
     build_by_default: build_tests,
     link_args: ex[3] ? gui_app_ldflags : [],
diff --git a/tools/extra_defs_gen/meson.build b/tools/extra_defs_gen/meson.build
index 942afcde..148b84c0 100644
--- a/tools/extra_defs_gen/meson.build
+++ b/tools/extra_defs_gen/meson.build
@@ -1,12 +1,18 @@
 # tools/extra_defs_gen
 
 # Input: cpp_compiler, gdkmm_build_dep, gtkmm_build_dep, install_libdir,
-#        gtkmm_pcname, msvc14x_toolset_ver
+#        gtkmm_pcname, msvc14x_toolset_ver, glibmm_dep
 # Output: m4_files, install_m4dir
 
 glibmm_generate_extra_defs_dep = cpp_compiler.find_library(
   'glibmm_generate_extra_defs@0@-2.4'.format(msvc14x_toolset_ver),
+  required: glibmm_dep.type_name() != 'internal',
 )
+if not glibmm_generate_extra_defs_dep.found()
+  glibmm_generate_extra_defs_dep = dependency(
+    '', fallback: ['glibmm-2.4', 'glibmm_generate_extra_defs_dep'],
+  )
+endif
 
 executable('generate_defs_gdk', 'generate_defs_gdk.cc',
   dependencies: [gdkmm_build_dep, glibmm_generate_extra_defs_dep],


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