summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKjell Ahlstedt <kjellahlstedt@gmail.com>2020-03-06 15:15:24 +0000
committerKjell Ahlstedt <kjellahlstedt@gmail.com>2020-03-06 15:15:24 +0000
commit8676335f0f0fc1854bf905c49c6c3e817ae32332 (patch)
tree9cb31b6f15b6bdce2c2653ad4478dcc0d85a379e
parent1156756136e7ffd0c68fe630c6bceb3d6290203b (diff)
parentb8524eeb00a43d8cadcd7732ab2472d92f818de0 (diff)
downloadglibmm-8676335f0f0fc1854bf905c49c6c3e817ae32332.tar.gz
Merge branch 'kjellahl/meson-build-2-62' into 'glibmm-2-62'
Build with Meson (glibmm-2-62) See merge request GNOME/glibmm!28
-rw-r--r--.gitignore6
-rw-r--r--MSVC_NMake/build-rules-msvc.mak31
-rw-r--r--MSVC_NMake/config-msvc.mak6
-rw-r--r--MSVC_NMake/gendef/meson.build9
-rw-r--r--MSVC_NMake/generate-msvc.mak4
-rw-r--r--MSVC_NMake/giomm/meson.build17
-rw-r--r--MSVC_NMake/glibmm/meson.build17
-rw-r--r--MSVC_NMake/install.mak4
-rw-r--r--Makefile.am35
-rw-r--r--README.win323
-rw-r--r--docs/reference/meson.build170
-rw-r--r--examples/meson.build73
-rw-r--r--gio/giomm/meson.build417
-rw-r--r--gio/giommconfig.h.meson40
-rw-r--r--gio/meson.build29
-rw-r--r--glib/glibmm/meson.build387
-rw-r--r--glib/glibmmconfig.h.in1
-rw-r--r--glib/glibmmconfig.h.meson163
-rw-r--r--glib/meson.build121
-rw-r--r--meson.build262
-rw-r--r--meson_options.txt12
-rw-r--r--tests/meson.build63
-rwxr-xr-xtools/build_scripts/compile-schemas.py30
-rwxr-xr-xtools/build_scripts/dummy-header.py15
-rwxr-xr-xtools/build_scripts/handle-built-files.py182
-rw-r--r--tools/conf_tests/allows_static_inline_npos.cc21
-rw-r--r--tools/conf_tests/can_assign_non_extern_c_functions_to_extern_c_cb.cc22
-rw-r--r--tools/conf_tests/can_use_dynamic_cast_in_unused_template_wo_def.cc21
-rw-r--r--tools/conf_tests/can_use_namespaces_inside_externc.cc25
-rw-r--r--tools/conf_tests/can_use_thread_local.cc5
-rw-r--r--tools/conf_tests/have_disambiguous_const_template_specializations.cc37
-rw-r--r--tools/conf_tests/have_std_iterator_traits.cc11
-rw-r--r--tools/conf_tests/have_sun_reverse_iterator.cc11
-rw-r--r--tools/conf_tests/have_template_sequence_ctors.cc17
-rw-r--r--tools/conf_tests/have_wide_stream.cc12
-rw-r--r--tools/conf_tests/member_functions_member_templates.cc41
-rw-r--r--tools/conf_tests/std_time_t_is_not_int32.cc20
-rw-r--r--tools/extra_defs_gen/meson.build26
-rw-r--r--tools/meson.build101
-rw-r--r--untracked/README39
40 files changed, 2495 insertions, 11 deletions
diff --git a/.gitignore b/.gitignore
index 9a319900..bfdb5dd2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -179,3 +179,9 @@ giommconfig.h
/tools/extra_defs_gen/generate_defs_glib
/tools/generate_wrap_init.pl
/tools/gmmproc
+
+# untracked/
+untracked/build_scripts/
+untracked/docs/
+untracked/gio/
+untracked/glib/
diff --git a/MSVC_NMake/build-rules-msvc.mak b/MSVC_NMake/build-rules-msvc.mak
index d9045e7f..f6d5c2fc 100644
--- a/MSVC_NMake/build-rules-msvc.mak
+++ b/MSVC_NMake/build-rules-msvc.mak
@@ -18,6 +18,11 @@
$<
<<
+{..\untracked\glib\glibmm\}.cc{vs$(PDBVER)\$(CFG)\$(PLAT)\glibmm\}.obj::
+ $(CXX) $(LIBGLIBMM_CFLAGS) $(CFLAGS_NOGL) /Fovs$(VSVER)\$(CFG)\$(PLAT)\glibmm\ /Fdvs$(VSVER)\$(CFG)\$(PLAT)\glibmm\ /c @<<
+$<
+<<
+
{..\glib\glibmm\}.cc{vs$(PDBVER)\$(CFG)\$(PLAT)\glibmm\}.obj::
$(CXX) $(LIBGLIBMM_CFLAGS) $(CFLAGS_NOGL) /Fovs$(PDBVER)\$(CFG)\$(PLAT)\glibmm\ /Fdvs$(PDBVER)\$(CFG)\$(PLAT)\glibmm\ /c @<<
$<
@@ -25,9 +30,10 @@ $<
{..\glib\src\}.cc.m4{vs$(PDBVER)\$(CFG)\$(PLAT)\glibmm\}.obj:
@if not exist $(@D)\ $(MAKE) /f Makefile.vc CFG=$(CFG) $(@D)
- @for %%s in ($(<D)\*.cc.m4 $(<D)\*.h.m4) do @if not exist ..\glib\glibmm\%%~ns if not exist $(@D)\%%~ns $(M4) -I$(<D:\=/) %%s $(<D:\=/)/template.macros.m4 > $(@D)\%%~ns
+ @for %%s in ($(<D)\*.cc.m4 $(<D)\*.h.m4) do @if not exist ..\glib\glibmm\%%~ns if not exist ..\untracked\glib\glibmm\%%~ns if not exist $(@D)\%%~ns $(M4) -I$(<D:\=/) %%s $(<D:\=/)/template.macros.m4 > $(@D)\%%~ns
@if exist $(@D)\$(<B) $(CXX) $(LIBGLIBMM_CFLAGS) $(CFLAGS_NOGL) /Fo$(@D)\ /Fd$(@D)\ /c $(@D)\$(<B)
@if exist ..\glib\glibmm\$(<B) $(CXX) $(LIBGLIBMM_CFLAGS) $(CFLAGS_NOGL) /Fo$(@D)\ /Fd$(@D)\ /c ..\glib\glibmm\$(<B)
+ @if exist ..\untracked\glib\glibmm\$(<B) $(CXX) $(LIBGLIBMM_CFLAGS) $(CFLAGS_NOGL) /Fo$(@D)\ /Fd$(@D)\ /c ..\untracked\glib\glibmm\$(<B)
{..\glib\src\}.ccg{vs$(PDBVER)\$(CFG)\$(PLAT)\glibmm\}.obj:
@if not exist $(@D)\private\ $(MAKE) /f Makefile.vc CFG=$(CFG) $(@D)\private
@@ -40,6 +46,11 @@ $<
$<
<<
+{..\untracked\gio\giomm\}.cc{vs$(PDBVER)\$(CFG)\$(PLAT)\giomm\}.obj::
+ $(CXX) $(LIBGIOMM_CFLAGS) $(CFLAGS_NOGL) /Fovs$(VSVER)\$(CFG)\$(PLAT)\giomm\ /Fdvs$(VSVER)\$(CFG)\$(PLAT)\giomm\ /c @<<
+$<
+<<
+
{..\gio\giomm\}.cc{vs$(PDBVER)\$(CFG)\$(PLAT)\giomm\}.obj::
$(CXX) $(LIBGIOMM_CFLAGS) $(CFLAGS_NOGL) /Fovs$(PDBVER)\$(CFG)\$(PLAT)\giomm\ /Fdvs$(PDBVER)\$(CFG)\$(PLAT)\giomm\ /c @<<
$<
@@ -53,7 +64,7 @@ $<
{..\tools\extra_defs_gen\}.cc{vs$(PDBVER)\$(CFG)\$(PLAT)\glib-extra-defs-gen\}.obj::
@if not exist vs$(PDBVER)\$(CFG)\$(PLAT)\glib-extra-defs-gen\ $(MAKE) /f Makefile.vc CFG=$(CFG) vs$(PDBVER)\$(CFG)\$(PLAT)\glib-extra-defs-gen
- $(CXX) $(GLIBMM_BASE_CFLAGS) $(GLIBMM_EXTRA_INCLUDES) $(CFLAGS_NOGL) /Fovs$(PDBVER)\$(CFG)\$(PLAT)\glib-extra-defs-gen\ /Fdvs$(PDBVER)\$(CFG)\$(PLAT)\glib-extra-defs-gen\ /c @<<
+ $(CXX) $(GLIBMM_BASE_CFLAGS) /DGLIBMM_GEN_EXTRA_DEFS_BUILD $(GLIBMM_EXTRA_INCLUDES) $(CFLAGS_NOGL) /Fovs$(PDBVER)\$(CFG)\$(PLAT)\glib-extra-defs-gen\ /Fdvs$(PDBVER)\$(CFG)\$(PLAT)\glib-extra-defs-gen\ /c @<<
$<
<<
@@ -68,9 +79,12 @@ vs$(PDBVER)\$(CFG)\$(PLAT)\glib-extra-defs-gen\generate_extra_defs.obj: ..\tool
$(GLIBMM_LIB): $(GLIBMM_DLL)
$(GIOMM_LIB): $(GIOMM_DLL)
-$(GLIBMM_EXTRA_DEFS_GEN_LIB): vs$(PDBVER)\$(CFG)\$(PLAT)\glib-extra-defs-gen\generate_extra_defs.obj
- lib $(ARFLAGS_NOLTCG) /out:$@ $**
-
+$(GLIBMM_EXTRA_DEFS_GEN_LIB): $(GLIBMM_EXTRA_DEFS_GEN_DLL)
+$(GLIBMM_EXTRA_DEFS_GEN_DLL): vs$(PDBVER)\$(CFG)\$(PLAT)\glib-extra-defs-gen\generate_extra_defs.obj
+ link /DLL $(LDFLAGS_NOLTCG) $(GOBJECT_LIBS) /implib:$(GLIBMM_EXTRA_DEFS_GEN_LIB) -out:$@ @<<
+$**
+<<
+ @-if exist $@.manifest mt /manifest $@.manifest /outputresource:$@;2
# Rules for linking DLLs
# Format is as follows (the mt command is needed for MSVC 2005/2008 builds):
@@ -234,7 +248,12 @@ clean:
@-del /f /q vs$(PDBVER)\$(CFG)\$(PLAT)\*.ilk
@-del /f /q vs$(PDBVER)\$(CFG)\$(PLAT)\*.exp
@-del /f /q vs$(PDBVER)\$(CFG)\$(PLAT)\*.lib
- @-del pkg-ver.mak
+ @-del /f /q vs$(VSVER)\$(CFG)\$(PLAT)\*.exe
+ @-del /f /q vs$(VSVER)\$(CFG)\$(PLAT)\*.dll
+ @-del /f /q vs$(VSVER)\$(CFG)\$(PLAT)\*.pdb
+ @-del /f /q vs$(VSVER)\$(CFG)\$(PLAT)\*.ilk
+ @-del /f /q vs$(VSVER)\$(CFG)\$(PLAT)\*.exp
+ @-del /f /q vs$(VSVER)\$(CFG)\$(PLAT)\*.lib
@-del ..\tools\generate_wrap_init.pl
@-del ..\tools\gmmproc
@-del /f /q vs$(PDBVER)\$(CFG)\$(PLAT)\gschemas.compiled
diff --git a/MSVC_NMake/config-msvc.mak b/MSVC_NMake/config-msvc.mak
index b2d2d31e..872e9cb0 100644
--- a/MSVC_NMake/config-msvc.mak
+++ b/MSVC_NMake/config-msvc.mak
@@ -24,12 +24,14 @@ M4 = m4
GLIBMM_BASE_CFLAGS = \
/Ivs$(PDBVER)\$(CFG)\$(PLAT) \
+ /I..\untracked\glib /I..\untracked\glib\glibmm \
/I..\glib /I..\glib\glibmm /I.\glibmm \
/wd4530 /EHsc \
/FImsvc_recommended_pragmas.h
GIOMM_BASE_CFLAGS = \
/Ivs$(PDBVER)\$(CFG)\$(PLAT) \
+ /I..\untracked\gio /I..\untracked\gio\giomm \
/I..\gio /I..\gio\giomm /I.\giomm \
$(GLIBMM_BASE_CFLAGS)
@@ -64,7 +66,9 @@ GLIBMM_LIBNAME = glibmm-vc$(PDBVER)0$(DEBUG_SUFFIX)-$(GLIBMM_MAJOR_VERSION)_$(GL
GLIBMM_DLL = vs$(PDBVER)\$(CFG)\$(PLAT)\$(GLIBMM_LIBNAME).dll
GLIBMM_LIB = vs$(PDBVER)\$(CFG)\$(PLAT)\$(GLIBMM_LIBNAME).lib
-GLIBMM_EXTRA_DEFS_GEN_LIB = vs$(PDBVER)\$(CFG)\$(PLAT)\glibmm_generate_extra_defs-$(GLIBMM_MAJOR_VERSION).$(GLIBMM_MINOR_VERSION).lib
+GLIBMM_EXTRA_DEFS_GEN_LIBNAME = glibmm_generate_extra_defs-$(GLIBMM_MAJOR_VERSION).$(GLIBMM_MINOR_VERSION)
+GLIBMM_EXTRA_DEFS_GEN_LIB = vs$(PDBVER)\$(CFG)\$(PLAT)\$(GLIBMM_EXTRA_DEFS_GEN_LIBNAME).lib
+GLIBMM_EXTRA_DEFS_GEN_DLL = vs$(PDBVER)\$(CFG)\$(PLAT)\$(GLIBMM_EXTRA_DEFS_GEN_LIBNAME).dll
GIOMM_LIBNAME = giomm-vc$(PDBVER)0$(DEBUG_SUFFIX)-$(GLIBMM_MAJOR_VERSION)_$(GLIBMM_MINOR_VERSION)
diff --git a/MSVC_NMake/gendef/meson.build b/MSVC_NMake/gendef/meson.build
new file mode 100644
index 00000000..3dc9cc25
--- /dev/null
+++ b/MSVC_NMake/gendef/meson.build
@@ -0,0 +1,9 @@
+# MSVC_NMake/gendef
+
+# Input: is_msvc
+# Output: gendef
+
+# Used to generate the .def file required to obtain the import .lib file
+if is_msvc
+ gendef = executable('gendef', 'gendef.cc', install: false)
+endif
diff --git a/MSVC_NMake/generate-msvc.mak b/MSVC_NMake/generate-msvc.mak
index 20113d5e..ed897e5e 100644
--- a/MSVC_NMake/generate-msvc.mak
+++ b/MSVC_NMake/generate-msvc.mak
@@ -37,8 +37,6 @@ vs$(PDBVER)\$(CFG)\$(PLAT)\giomm\wrap_init.cc: $(giomm_real_hg)
# Generate pre-generated resources and configuration headers (builds from GIT)
prep-git-build: pkg-ver.mak
- $(MAKE) /f Makefile.vc CFG=$(CFG) GENERATE_VERSIONED_FILES=1 glibmm\glibmm.rc giomm\giomm.rc giomm\giommconfig.h
- $(MAKE) /f Makefile.vc CFG=$(CFG) gen-perl-scripts-real
gen-perl-scripts-real: pkg-ver.mak
$(MAKE) /f Makefile.vc CFG=$(CFG) GENERATE_VERSIONED_FILES=1 ..\tools\gmmproc ..\tools\generate_wrap_init.pl
@@ -108,3 +106,5 @@ pkg-ver.mak: ..\configure.ac
@echo for /f "tokens=1,2,3 delims=." %%%%a IN ("%glibmm_ver%") do (echo PKG_MAJOR_VERSION=%%%%a^& echo PKG_MINOR_VERSION=%%%%b^& echo PKG_MICRO_VERSION=%%%%c)^>$@>>pkg-ver.bat
@pkg-ver.bat
@del ver.txt pkg-ver.bat
+ $(MAKE) /f Makefile.vc CFG=$(CFG) GENERATE_VERSIONED_FILES=1 glibmm\glibmm.rc giomm\giomm.rc giomm\giommconfig.h
+ $(MAKE) /f Makefile.vc CFG=$(CFG) gen-perl-scripts-real
diff --git a/MSVC_NMake/giomm/meson.build b/MSVC_NMake/giomm/meson.build
new file mode 100644
index 00000000..658147df
--- /dev/null
+++ b/MSVC_NMake/giomm/meson.build
@@ -0,0 +1,17 @@
+# MSVC_NMake/giomm
+
+# Input: pkg_conf_data, giommconfig_h
+# Output: giomm_rc
+
+giomm_rc = configure_file(
+ input: 'giomm.rc.in',
+ output: '@BASENAME@',
+ configuration: pkg_conf_data,
+)
+
+# Copy the generated configuration header into the MSVC project directory.
+configure_file(
+ input: giommconfig_h,
+ output: 'giommconfig.h',
+ copy: true,
+)
diff --git a/MSVC_NMake/glibmm/meson.build b/MSVC_NMake/glibmm/meson.build
new file mode 100644
index 00000000..5112281c
--- /dev/null
+++ b/MSVC_NMake/glibmm/meson.build
@@ -0,0 +1,17 @@
+# MSVC_NMake/glibmm
+
+# Input: pkg_conf_data, glibmmconfig_h
+# Output: glibmm_rc
+
+glibmm_rc = configure_file(
+ input: 'glibmm.rc.in',
+ output: '@BASENAME@',
+ configuration: pkg_conf_data,
+)
+
+# Copy the generated configuration header into the MSVC project directory.
+configure_file(
+ input: glibmmconfig_h,
+ output: 'glibmmconfig.h',
+ copy: true,
+)
diff --git a/MSVC_NMake/install.mak b/MSVC_NMake/install.mak
index f5c1f097..87606515 100644
--- a/MSVC_NMake/install.mak
+++ b/MSVC_NMake/install.mak
@@ -15,7 +15,9 @@ install: all
@copy /b vs$(PDBVER)\$(CFG)\$(PLAT)\$(GIOMM_LIBNAME).dll $(PREFIX)\bin
@copy /b vs$(PDBVER)\$(CFG)\$(PLAT)\$(GIOMM_LIBNAME).pdb $(PREFIX)\bin
@copy /b vs$(PDBVER)\$(CFG)\$(PLAT)\$(GIOMM_LIBNAME).lib $(PREFIX)\lib
- @copy /b $(GLIBMM_EXTRA_DEFS_GEN_LIB) $(PREFIX)\lib
+ @copy /b vs$(PDBVER)\$(CFG)\$(PLAT)\$(GLIBMM_EXTRA_DEFS_GEN_LIBNAME).dll $(PREFIX)\bin
+ @copy /b vs$(PDBVER)\$(CFG)\$(PLAT)\$(GLIBMM_EXTRA_DEFS_GEN_LIBNAME).pdb $(PREFIX)\bin
+ @copy /b vs$(PDBVER)\$(CFG)\$(PLAT)\$(GLIBMM_EXTRA_DEFS_GEN_LIBNAME).lib $(PREFIX)\lib
@copy ..\glib\glibmm.h "$(PREFIX)\include\glibmm-$(GLIBMM_MAJOR_VERSION).$(GLIBMM_MINOR_VERSION)\"
@copy ..\gio\giomm.h "$(PREFIX)\include\giomm-$(GLIBMM_MAJOR_VERSION).$(GLIBMM_MINOR_VERSION)\"
@for %h in ($(glibmm_files_all_h)) do @if exist ..\glib\glibmm\%h copy ..\glib\glibmm\%h "$(PREFIX)\include\glibmm-$(GLIBMM_MAJOR_VERSION).$(GLIBMM_MINOR_VERSION)\glibmm\%h"
diff --git a/Makefile.am b/Makefile.am
index 1b366b4c..f2f18f7d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -52,6 +52,41 @@ dist_noinst_DATA = $(text_files) $(msvc_files)
dist_noinst_SCRIPTS = autogen.sh
DISTCLEANFILES = $(filter %mmconfig.h,$(msvc_files))
+# Distribute files needed when building glibmm with Meson.
+
+EXTRA_DIST = \
+ meson.build \
+ meson_options.txt \
+ MSVC_NMake/gendef/meson.build \
+ MSVC_NMake/giomm/meson.build \
+ MSVC_NMake/glibmm/meson.build \
+ docs/reference/meson.build \
+ examples/meson.build \
+ glib/meson.build \
+ glib/glibmmconfig.h.meson \
+ glib/glibmm/meson.build \
+ gio/meson.build \
+ gio/giommconfig.h.meson \
+ gio/giomm/meson.build \
+ tests/meson.build \
+ tools/meson.build \
+ tools/build_scripts/compile-schemas.py \
+ tools/build_scripts/dummy-header.py \
+ tools/build_scripts/handle-built-files.py \
+ tools/conf_tests/allows_static_inline_npos.cc \
+ tools/conf_tests/can_assign_non_extern_c_functions_to_extern_c_cb.cc \
+ tools/conf_tests/can_use_dynamic_cast_in_unused_template_wo_def.cc \
+ tools/conf_tests/can_use_namespaces_inside_externc.cc \
+ tools/conf_tests/can_use_thread_local.cc \
+ tools/conf_tests/have_disambiguous_const_template_specializations.cc \
+ tools/conf_tests/have_std_iterator_traits.cc \
+ tools/conf_tests/have_sun_reverse_iterator.cc \
+ tools/conf_tests/have_template_sequence_ctors.cc \
+ tools/conf_tests/have_wide_stream.cc \
+ tools/conf_tests/member_functions_member_templates.cc \
+ tools/conf_tests/std_time_t_is_not_int32.cc \
+ tools/extra_defs_gen/meson.build \
+ untracked/README
# Auto-generate the ChangeLog file from the git log on make dist
include $(top_srcdir)/build/dist-changelog.am
diff --git a/README.win32 b/README.win32
index b1303326..62bcea3d 100644
--- a/README.win32
+++ b/README.win32
@@ -78,7 +78,8 @@ with a few manual steps required, namely to:
-Make a new copy of the entire source tree to some location, where the build
is to be done; then in $(srcroot)\MSVC_NMake run
nmake /f Makefile.vc CFG=[release|debug] prep-git-build, which will copy and generate
- the following files with the proper info:
+ the following files with the proper info (this step may also be needed if the following
+ files are not present in the unpacked source tarball):
--$(srcroot)\MSVC_NMake\glibmm\glibmmconfig.h
--$(srcroot)\MSVC_NMake\giomm\giommconfig.h
--$(srcroot)\MSVC_NMake\glibmm\glibmm.rc
diff --git a/docs/reference/meson.build b/docs/reference/meson.build
new file mode 100644
index 00000000..e9582df6
--- /dev/null
+++ b/docs/reference/meson.build
@@ -0,0 +1,170 @@
+# docs/reference
+
+# Input: built_files_root, project_source_root, glibmm_pcname, giomm_pcname,
+# perl, glibmm_hg_ccg_basenames, giomm_hg_ccg_basenames,
+# glibmm_extra_h_files, giomm_extra_h_files, glibmm_built_h_file_targets,
+# giomm_built_h_file_targets, install_datadir, python3, doc_reference_py,
+# build_documentation
+# Output: install_docdir, install_devhelpdir
+
+tag_file_modules = [
+ 'mm-common-libstdc++',
+ 'sigc++-2.0',
+]
+doxygen_tagfiles = ''
+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: '')
+ if htmlrefpub == ''
+ htmlrefpub = htmlrefdir
+ elif htmlrefdir == ''
+ htmlrefdir = htmlrefpub
+ endif
+ doxygen_tagfiles += ' "' + doxytagfile + '=' + htmlrefpub + '"'
+ if not htmlrefdir.endswith('/')
+ htmlrefdir += '/'
+ endif
+ docinstall_flags += ['-l', doxytagfile.split('/')[-1] + '@' + htmlrefdir]
+ endif
+endforeach
+
+book_name = glibmm_pcname
+book_title = meson.project_name() + ' Reference Manual'
+
+# Configuration data for Doxyfile.
+doc_conf_data = configuration_data()
+doc_conf_data.set('configure_input',
+ 'docs/reference/Doxyfile. Generated from Doxyfile.in by meson.configure_file().')
+doc_conf_data.set('PACKAGE_NAME', meson.project_name())
+doc_conf_data.set('PACKAGE_VERSION', meson.project_version())
+doc_conf_data.set('abs_top_builddir', built_files_root)
+doc_conf_data.set('abs_top_srcdir', project_source_root)
+doc_conf_data.set('GLIBMM_MODULE_NAME', book_name)
+doc_conf_data.set('DOXYGEN_TAGFILES', doxygen_tagfiles)
+doc_conf_data.set('PERL', perl.found() ? perl.path() : '')
+
+configure_file(
+ input: 'Doxyfile.in',
+ output: '@BASENAME@',
+ configuration: doc_conf_data,
+)
+
+# Installation directories relative to {prefix}.
+install_docdir = install_datadir / 'doc' / book_name
+install_reference_docdir = install_docdir / 'reference'
+install_image_docdir = install_docdir / 'images'
+install_devhelpdir = install_datadir / 'devhelp' / 'books' / book_name
+
+if not build_documentation
+ # Documentation shall not be built or installed.
+ # Return to the calling meson.build file.
+ subdir_done()
+endif
+
+# Built input .h files to Doxygen.
+built_h_files = []
+foreach file : glibmm_hg_ccg_basenames
+ built_h_files += built_files_root / 'glib' / 'glibmm' / file + '.h'
+endforeach
+foreach file : giomm_hg_ccg_basenames
+ built_h_files += built_files_root / 'gio' / 'giomm' / file + '.h'
+endforeach
+
+# Hand-coded input .h files to Doxygen.
+src_h_files = []
+foreach file : glibmm_extra_h_files
+ if file != 'wrap_init.h'
+ src_h_files += project_source_root / 'glib' / 'glibmm' / file
+ endif
+endforeach
+foreach file : giomm_extra_h_files
+ if file != 'wrap_init.h'
+ src_h_files += project_source_root / 'gio' / 'giomm' / file
+ endif
+endforeach
+src_h_files += project_source_root / 'glib' / 'glibmm.h'
+src_h_files += project_source_root / 'gio' / 'giomm.h'
+
+doctool_dir = project_source_root / 'untracked' / 'docs' # MMDOCTOOLDIR
+doctool_dist_dir = 'untracked' / 'docs' # Relative to MESON_DIST_ROOT
+
+doc_h_files = src_h_files
+if glibmm_built_h_file_targets.length() + giomm_built_h_file_targets.length() > 0
+ # .h files have been generated from .hg files (maintainer mode).
+ # Use built_h_file_targets instead of built_h_files here, or else Meson won't
+ # know that Doxygen must not be executed until the .h files have been built.
+ doc_h_files += glibmm_built_h_file_targets + giomm_built_h_file_targets
+else
+ # All .h files are stored in the source tree (not maintainer mode).
+ doc_h_files += built_h_files
+endif
+
+# Can't use @INPUT@ in the command. It requires absolute file paths.
+# Paths in built_h_file_targets are relative to project_build_root.
+tag_file = custom_target('html_and_tag',
+ input: doc_h_files,
+ output: book_name + '.tag',
+ command: [
+ python3, doc_reference_py, 'doxygen',
+ doctool_dir,
+ '@OUTPUT@',
+ src_h_files,
+ built_h_files,
+ ],
+ build_by_default: build_documentation,
+ install: true,
+ install_dir: install_reference_docdir,
+)
+
+devhelp_file = custom_target('devhelp',
+ input: tag_file,
+ output: book_name + '.devhelp2',
+ command: [
+ python3, doc_reference_py, 'devhelp',
+ doctool_dir,
+ '@INPUT@',
+ '@OUTPUT@',
+ book_name,
+ book_title,
+ ],
+ build_by_default: build_documentation,
+)
+
+# Install Devhelp file and html files.
+meson.add_install_script(
+ python3.path(), doc_reference_py, 'install_doc',
+ doctool_dir,
+ devhelp_file.full_path(),
+ install_devhelpdir,
+ install_reference_docdir / 'html',
+ docinstall_flags
+)
+
+# Install images.
+image_basefiles = [
+ 'gtkmm_logo.gif',
+ 'top.gif',
+]
+image_files = []
+foreach file : image_basefiles
+ image_files += '..' / 'images' / file
+endforeach
+
+install_data(image_files, install_dir: install_image_docdir)
+
+if not meson.is_subproject()
+ # Distribute built files and files copied by mm-common-get.
+ # (add_dist_script() is not allowed in a subproject)
+ meson.add_dist_script(
+ python3.path(), doc_reference_py, 'dist_doc',
+ doctool_dir,
+ doctool_dist_dir,
+ meson.current_build_dir(),
+ tag_file.full_path(),
+ devhelp_file.full_path(),
+ )
+endif
diff --git a/examples/meson.build b/examples/meson.build
new file mode 100644
index 00000000..a4ba9cf2
--- /dev/null
+++ b/examples/meson.build
@@ -0,0 +1,73 @@
+# examples
+
+# input: glibmm_dep, giomm_dep, build_examples, compile_schemas_py
+
+examples = [
+# [[dir-name], exe-name, [sources], giomm-example (not just glibmm-example)]
+ [['compose'], 'example', ['main.cc'], false],
+ [['dbus'], 'session_bus_service', ['session_bus_service.cc'], true],
+ [['dbus'], 'server_without_bus', ['server_without_bus.cc'], true],
+ [['dbus'], 'client_bus_listnames', ['client_bus_listnames.cc'], true],
+ [['keyfile'], 'example', ['main.cc'], false],
+ [['markup'], 'parser', ['parser.cc'], false],
+ [['network'], 'resolver', ['resolver.cc'], true],
+ [['network'], 'socket-client', ['socket-client.cc'], true],
+ [['network'], 'socket-server', ['socket-server.cc'], true],
+ [['options'], 'example', ['main.cc'], false],
+ [['properties'], 'example', ['properties_example.cc'], false],
+ [['regex'], 'example', ['main.cc'], false],
+ [['settings'], 'settings', ['settings.cc', 'org.gtkmm.demo.gschema.xml'], true],
+ [['thread'], 'dispatcher', ['dispatcher.cc'], false],
+ [['thread'], 'dispatcher2', ['dispatcher2.cc'], false],
+ [['thread'], 'thread', ['thread.cc'], false],
+ [['thread'], 'threadpool', ['threadpool.cc'], false],
+]
+
+if not is_host_windows
+ examples += [
+ [['child_watch'], 'child_watch', ['main.cc'], false],
+ [['iochannel_stream'], 'example', ['fdstream.cc', 'main.cc'], false],
+ ]
+endif
+
+
+# import('gnome').compile_schemas() can't be use here.
+# It can only compile schemas in the current directory.
+glib_compile_schemas = find_program('glib-compile-schemas', required: false)
+
+foreach ex : examples
+ dir = ''
+ foreach dir_part : ex[0]
+ dir = dir / dir_part
+ endforeach
+ ex_name = (dir / ex[1]).underscorify()
+ ex_sources = []
+ foreach src : ex[2]
+ if src.endswith('.gschema.xml')
+ if glib_compile_schemas.found()
+ custom_target(dir.underscorify() + '_schemas',
+ input: dir / src,
+ output: dir.underscorify() + '_gschemas.compiled',
+ command: [
+ python3, compile_schemas_py,
+ meson.current_source_dir() / dir,
+ meson.current_build_dir() / dir,
+ '@OUTPUT@'
+ ],
+ build_by_default: build_examples,
+ install: false,
+ )
+ endif
+ else
+ ex_sources += dir / src
+ endif
+ endforeach
+
+ executable(ex_name, ex_sources,
+ cpp_args: ['-DGLIBMM_DISABLE_DEPRECATED', '-DGIOMM_DISABLE_DEPRECATED'],
+ dependencies: ex[3] ? giomm_dep : glibmm_dep,
+ gui_app: false,
+ build_by_default: build_examples,
+ install: false,
+ )
+endforeach
diff --git a/gio/giomm/meson.build b/gio/giomm/meson.build
new file mode 100644
index 00000000..a64cb8c7
--- /dev/null
+++ b/gio/giomm/meson.build
@@ -0,0 +1,417 @@
+# gio/giomm
+
+# Input: giomm_build_dep, giomm_pcname, maintainer_mode, project_source_root,
+# generate_binding_py, handle_built_files_py, m4_files, pm_files,
+# glibmm_libversion, install_includedir, python3, giomm_rc, gmmproc_dir,
+# is_host_windows, gendef, gmmproc, generate_wrap_init_pl
+# Output: giomm_hg_ccg_basenames, giomm_extra_h_files, built_files_root,
+# giomm_built_h_file_targets, giomm_dep
+
+giomm_defs_basefiles = [
+ 'gio.defs',
+ 'gio_enums.defs',
+ 'gio_methods.defs',
+ 'gio_signals.defs',
+ 'gio_extra_objects.defs',
+ 'gio_vfuncs.defs',
+ 'gio_docs.xml',
+ 'gio_docs_override.xml',
+]
+
+giomm_defs_files = []
+foreach file : giomm_defs_basefiles
+ giomm_defs_files += '..' / 'src' / file
+endforeach
+
+# Generated from pairs of .hg and .ccg files.
+giomm_any_hg_ccg_basenames = [
+ 'action',
+ 'actiongroup',
+ 'actionmap',
+ 'applaunchcontext',
+ 'appinfo',
+ 'application',
+ 'applicationcommandline',
+ 'asyncinitable',
+ 'asyncresult',
+ 'bufferedinputstream',
+ 'bufferedoutputstream',
+ 'cancellable',
+ 'charsetconverter',
+ 'converter',
+ 'converterinputstream',
+ 'converteroutputstream',
+ 'credentials',
+ 'datainputstream',
+ 'dataoutputstream',
+ 'dbusactiongroup',
+ 'dbusaddress',
+ 'dbusauthobserver',
+ 'dbusconnection',
+ 'dbuserror',
+ 'dbuserrorutils',
+ 'dbusinterface',
+ 'dbusinterfaceskeleton',
+ 'dbusinterfacevtable',
+ 'dbusintrospection',
+ 'dbusmenumodel',
+ 'dbusmessage',
+ 'dbusmethodinvocation',
+ 'dbusobject',
+ 'dbusobjectmanager',
+ 'dbusobjectmanagerclient',
+ 'dbusobjectmanagerserver',
+ 'dbusobjectproxy',
+ 'dbusobjectskeleton',
+ 'dbusownname',
+ 'dbusproxy',
+ 'dbusserver',
+ 'dbussubtreevtable',
+ 'dbusutils',
+ 'dbuswatchname',
+ 'drive',
+ 'emblem',
+ 'emblemedicon',
+ 'enums',
+ 'error',
+ 'file',
+ 'fileattributeinfo',
+ 'fileattributeinfolist',
+ 'fileenumerator',
+ 'fileicon',
+ 'fileinfo',
+ 'fileinputstream',
+ 'fileiostream',
+ 'filemonitor',
+ 'filenamecompleter',
+ 'fileoutputstream',
+ 'filterinputstream',
+ 'filteroutputstream',
+ 'icon',
+ 'inetaddress',
+ 'inetsocketaddress',
+ 'initable',
+ 'inputstream',
+ 'iostream',
+ 'listmodel',
+ 'liststore',
+ 'loadableicon',
+ 'memoryinputstream',
+ 'memoryoutputstream',
+ 'menuattributeiter',
+ 'menulinkiter',
+ 'menu',
+ 'menuitem',
+ 'menumodel',
+ 'mount',
+ 'mountoperation',
+ 'networkaddress',
+ 'networkmonitor',
+ 'networkservice',
+ 'notification',
+ 'outputstream',
+ 'permission',
+ 'pollableinputstream',
+ 'pollableoutputstream',
+ 'proxy',
+ 'proxyaddress',
+ 'proxyresolver',
+ 'remoteactiongroup',
+ 'resolver',
+ 'resource',
+ 'seekable',
+ 'settings',
+ 'settingsschema',
+ 'settingsschemakey',
+ 'settingsschemasource',
+ 'simpleaction',
+ 'simpleactiongroup',
+ 'simpleiostream',
+ 'simplepermission',
+ 'socket',
+ 'socketaddress',
+ 'socketaddressenumerator',
+ 'socketclient',
+ 'socketconnectable',
+ 'socketconnection',
+ 'socketcontrolmessage',
+ 'socketlistener',
+ 'socketservice',
+ 'srvtarget',
+ 'tcpconnection',
+ 'tcpwrapperconnection',
+ 'threadedsocketservice',
+ 'themedicon',
+ 'tlscertificate',
+ 'tlsclientconnection',
+ 'tlsconnection',
+ 'tlsdatabase',
+ 'tlsinteraction',
+ 'tlspassword',
+ 'tlsserverconnection',
+ 'volume',
+ 'volumemonitor',
+ 'zlibdecompressor',
+ 'zlibcompressor',
+]
+
+giomm_posix_hg_ccg_basenames = [
+ 'unixconnection',
+ 'unixcredentialsmessage',
+ 'unixfdlist',
+ 'unixfdmessage',
+ 'unixinputstream',
+ 'unixoutputstream',
+ 'unixsocketaddress',
+]
+
+giomm_not_mac_hg_ccg_basenames = [
+ 'desktopappinfo',
+]
+
+# All .hg/.ccg files, regardless of type of host.
+giomm_hg_ccg_basenames = \
+ giomm_any_hg_ccg_basenames + \
+ giomm_posix_hg_ccg_basenames + \
+ giomm_not_mac_hg_ccg_basenames
+
+# Used .hg/.ccg files in present type of host.
+giomm_used_hg_ccg_basenames = giomm_any_hg_ccg_basenames
+if not is_host_windows
+ giomm_used_hg_ccg_basenames += giomm_posix_hg_ccg_basenames
+ if not is_os_cocoa
+ giomm_used_hg_ccg_basenames += giomm_not_mac_hg_ccg_basenames
+ endif
+endif
+
+# Pairs of hand-coded .h and .cc files.
+giomm_extra_h_cc_basenames = [
+ 'contenttype',
+ 'init',
+ 'socketsource',
+]
+
+giomm_extra_h_files = [
+ 'wrap_init.h',
+]
+
+giomm_extra_cc_files = [
+ 'slot_async.cc',
+]
+
+foreach file : giomm_extra_h_cc_basenames
+ giomm_extra_h_files += file + '.h'
+ giomm_extra_cc_files += file + '.cc'
+endforeach
+
+install_headers('..' / 'giomm.h', subdir: giomm_pcname)
+install_headers(giomm_extra_h_files, subdir: giomm_pcname / 'giomm')
+
+untracked_giomm = 'untracked' / 'gio' / 'giomm'
+src_untracked_giomm = project_source_root / untracked_giomm
+
+if maintainer_mode
+
+ # Maintainer mode. Generate .h and .cc files from .hg and .ccg files in ../src.
+
+ # docs/reference/meson.build needs these.
+ built_files_root = project_build_root
+ giomm_built_h_file_targets = []
+
+ # Force meson+ninja to generate source files before anything is compiled.
+ # Compilation must depend on these targets.
+ giomm_used_built_cc_file_targets = []
+ giomm_used_built_h_file_targets = []
+
+ hg_files = []
+ foreach file : giomm_hg_ccg_basenames
+ hg_files += '..' / 'src' / file + '.hg'
+ endforeach
+
+ # Create wrap_init.cc in project_build_root/gio/giomm.
+ giomm_used_built_cc_file_targets += custom_target('giomm-wrap_init.cc',
+ input: hg_files,
+ output: 'wrap_init.cc',
+ command: [
+ python3, generate_binding_py, 'generate_wrap_init',
+ gmmproc_dir,
+ '@OUTPUT@',
+ 'Gio', # namespace
+ '@INPUT@',
+ ],
+ depend_files: generate_wrap_init_pl,
+ build_by_default: maintainer_mode,
+ install: false,
+ )
+
+ # Create .h/_p.h/.cc files in project_build_root/gio/giomm
+ # from .hg/.ccg files in project_source_root/gio/src.
+ foreach file : giomm_hg_ccg_basenames
+ hg_file = '..' / 'src' / file + '.hg'
+ ccg_file = '..' / 'src' / file + '.ccg'
+ built_file_target = custom_target('giomm-' + file + '.cc',
+ input: [hg_file, ccg_file],
+ output: [file + '.stamp', file + '.cc', file + '.h'],
+ command: [
+ python3, handle_built_files_py, 'gmmproc',
+ gmmproc_dir,
+ project_source_root / 'tools' / 'pm',
+ '@OUTPUT0@',
+ file,
+ meson.current_source_dir() / '..' / 'src',
+ project_source_root / 'tools' / 'm4',
+ ],
+ depend_files: giomm_defs_files + m4_files + [gmmproc] + pm_files,
+ build_by_default: maintainer_mode,
+ install: false,
+ )
+ giomm_built_h_file_targets += built_file_target[2]
+ if giomm_used_hg_ccg_basenames.contains(file)
+ giomm_used_built_cc_file_targets += built_file_target[1]
+ giomm_used_built_h_file_targets += built_file_target[2]
+ endif
+ endforeach
+
+ # Create dummy_header.h, depending on all generated headers.
+ # It's created if it does not exist, but it's never updated.
+ # It guarantees that all generated headers are built before giomm_library
+ # is built, at the same time avoiding unnecessary recompilations.
+ # If giomm_used_built_h_file_targets would be listed as sources to giomm_library,
+ # all generated .cc files could be recompiled if one generated .h file has
+ # been changed.
+ built_dummy_h_file_target = custom_target('giomm-dummy_header.h',
+ input: giomm_used_built_h_file_targets,
+ output: 'dummy_header.h',
+ command: [
+ python3, dummy_header_py,
+ '@OUTPUT@',
+ ],
+ build_by_default: maintainer_mode,
+ install: false,
+ )
+
+ extra_include_dirs = ['..', '..' / '..' / 'glib']
+ gio_int_lib = static_library('giomm-int',
+ giomm_used_built_cc_file_targets, giomm_extra_cc_files, built_dummy_h_file_target,
+ include_directories: extra_include_dirs,
+ cpp_args: '-DGIOMM_BUILD=1',
+ dependencies: giomm_build_dep,
+ link_with: glibmm_library,
+ install: false,
+ )
+
+ built_h_cc_dir = meson.current_build_dir()
+
+else # not maintainer_mode
+
+ # Not maintainer mode. Compile built source code files in
+ # project_source_root/untracked/gio/giomm.
+
+ giomm_used_built_h_file_targets = []
+
+ # docs/reference/meson.build needs these.
+ built_files_root = project_source_root / 'untracked'
+ giomm_built_h_file_targets = []
+
+ # Two cases:
+ # 1. The source code comes from a tarball, where the built files
+ # are stored in project_source_root/untracked.
+ # There are no built files in the build tree.
+ # 2. Files have been built in the build tree. Then maintainer_mode has
+ # been changed from true to false. Files that are missing or not up to date
+ # in project_source_root/untracked are copied from the build tree.
+
+ # Try to copy built source code files to the source tree.
+ run_command(
+ python3, generate_binding_py, 'copy_built_files',
+ meson.current_build_dir(),
+ src_untracked_giomm,
+ giomm_hg_ccg_basenames,
+ )
+
+ built_cc_files = [ src_untracked_giomm / 'wrap_init.cc' ]
+ foreach file : giomm_used_hg_ccg_basenames
+ built_cc_files += src_untracked_giomm / file + '.cc'
+ endforeach
+
+ extra_include_dirs = [ '..', '..' / '..' / 'untracked' / 'gio',
+ '..' / '..' / 'glib', '..' / '..' / 'untracked' / 'glib',
+ ]
+
+ # We need this so that we can run gendef.exe to get the .def file
+ # needed for obtaining the .lib file for the giomm DLL
+ gio_int_lib = static_library('giomm-int',
+ built_cc_files, giomm_extra_cc_files,
+ include_directories: extra_include_dirs,
+ cpp_args: '-DGIOMM_BUILD=1',
+ dependencies: giomm_build_dep,
+ link_with: glibmm_library,
+ install: false,
+ )
+
+ built_h_cc_dir = src_untracked_giomm
+
+endif
+
+giomm_def = []
+giomm_extra_link_args = []
+extra_giomm_objects = []
+
+if is_msvc
+ giomm_def = custom_target('giomm.def',
+ output: 'giomm.def',
+ depends: gio_int_lib,
+ command: [ gendef,
+ '@OUTPUT@',
+ '@0@-@1@.dll'.format(giomm_pcname, glibmm_libversion.split('.')[0]),
+ gio_int_lib.full_path(),
+ ],
+ install: false,
+ )
+ giomm_extra_link_args = ['/def:@0@'.format(giomm_def.full_path())]
+endif
+
+# Build the .rc file for Windows builds and link to it
+if is_host_windows
+ windows = import('windows')
+ giomm_res = windows.compile_resources(giomm_rc)
+ extra_giomm_objects += giomm_res
+endif
+
+giomm_library = library(giomm_pcname, extra_giomm_objects,
+ objects: gio_int_lib.extract_all_objects(),
+ version: glibmm_libversion,
+ dependencies: giomm_build_dep,
+ link_depends: giomm_def,
+ link_args: giomm_extra_link_args,
+ link_with: glibmm_library,
+ install: true,
+)
+
+# Install built .h and _p.h files.
+meson.add_install_script(
+ python3.path(), generate_binding_py, 'install_built_h_files',
+ built_h_cc_dir,
+ install_includedir / giomm_pcname / 'giomm', # subdir below {prefix}
+ giomm_used_hg_ccg_basenames
+)
+
+if not meson.is_subproject()
+ # Distribute built files.
+ # (add_dist_script() is not allowed in a subproject)
+ meson.add_dist_script(
+ python3.path(), generate_binding_py, 'dist_built_files',
+ built_h_cc_dir,
+ untracked_giomm,
+ giomm_hg_ccg_basenames,
+ )
+endif
+
+# This is useful in the main project when giomm is used as a subproject.
+# It's also used when building example programs and test programs.
+giomm_dep = declare_dependency(
+ sources: glibmm_built_h_file_targets + giomm_used_built_h_file_targets,
+ link_with: [glibmm_library, giomm_library],
+ include_directories: extra_include_dirs,
+ dependencies: giomm_build_dep,
+)
diff --git a/gio/giommconfig.h.meson b/gio/giommconfig.h.meson
new file mode 100644
index 00000000..82aedddf
--- /dev/null
+++ b/gio/giommconfig.h.meson
@@ -0,0 +1,40 @@
+#ifndef _GIOMM_CONFIG_H
+#define _GIOMM_CONFIG_H
+
+#include <glibmmconfig.h>
+
+/* Define to omit deprecated API from the library. */
+#mesondefine GIOMM_DISABLE_DEPRECATED
+
+/* Major version number of giomm. */
+#mesondefine GIOMM_MAJOR_VERSION
+
+/* Minor version number of giomm. */
+#mesondefine GIOMM_MINOR_VERSION
+
+/* Micro version number of giomm. */
+#mesondefine GIOMM_MICRO_VERSION
+
+/* Define if giomm is built as a static library */
+#mesondefine GIOMM_STATIC_LIB
+
+// Enable DLL-specific stuff only when not building a static library
+#if !defined(__CYGWIN__) && defined(__MINGW32__) && !defined(GIOMM_STATIC_LIB)
+# define GIOMM_DLL 1
+#endif
+
+#ifdef GIOMM_DLL
+# if defined(GIOMM_BUILD) && defined(_WINDLL)
+ /* Do not dllexport as it is handled by gendef on MSVC */
+# define GIOMM_API
+# elif !defined(GIOMM_BUILD)
+# define GIOMM_API __declspec(dllimport)
+# else
+ /* Build a static library */
+# define GIOMM_API
+# endif /* GIOMM_BUILD - _WINDLL */
+#else
+# define GIOMM_API
+#endif /* GIOMM_DLL */
+
+#endif /* _GIOMM_CONFIG_H */
diff --git a/gio/meson.build b/gio/meson.build
new file mode 100644
index 00000000..4213109f
--- /dev/null
+++ b/gio/meson.build
@@ -0,0 +1,29 @@
+# gio
+
+# Input: pkg_conf_data, giomm_pcname, install_pkgconfigdir,
+# Output: install_giommconfigdir, giommconfig_h
+
+configure_file(
+ input: 'giomm.pc.in',
+ output: giomm_pcname + '.pc',
+ configuration: pkg_conf_data,
+ install_dir: install_pkgconfigdir,
+)
+
+giomm_pkg_uninst_conf_data = configuration_data()
+giomm_pkg_uninst_conf_data.merge_from(pkg_conf_data)
+giomm_pkg_uninst_conf_data.set('srcdir', meson.current_source_dir())
+
+configure_file(
+ input: 'giomm-uninstalled.pc.in',
+ output: giomm_pcname + '-uninstalled.pc',
+ configuration: giomm_pkg_uninst_conf_data,
+)
+
+install_giommconfigdir = install_libdir / giomm_pcname / 'include'
+giommconfig_h = configure_file(
+ input: 'giommconfig.h.meson',
+ output: 'giommconfig.h',
+ configuration: pkg_conf_data,
+ install_dir: install_giommconfigdir,
+)
diff --git a/glib/glibmm/meson.build b/glib/glibmm/meson.build
new file mode 100644
index 00000000..c69dd3c8
--- /dev/null
+++ b/glib/glibmm/meson.build
@@ -0,0 +1,387 @@
+# glib/glibmm
+
+# Input: glibmm_build_dep, glibmm_pcname, maintainer_mode, project_source_root,
+# generate_binding_py, handle_built_files_py, m4_files, pm_files,
+# glibmm_libversion, install_includedir, python3, glibmm_rc, gmmproc_dir,
+# is_host_windows, gendef, gmmproc, generate_wrap_init_pl
+# Output: glibmm_hg_ccg_basenames, glibmm_extra_h_files, built_files_root,
+# glibmm_built_h_file_targets, glibmm_dep
+
+glibmm_defs_basefiles = [
+ 'glib.defs',
+ 'glib_enums.defs',
+ 'glib_functions.defs',
+ 'glib_signals.defs',
+ 'glib_extra_objects.defs',
+ 'gmodule_enums.defs',
+ 'gmodule_functions.defs',
+ 'gobject_enums.defs',
+ 'gobject_functions.defs',
+ 'glib_docs.xml',
+ 'glib_docs_override.xml',
+]
+
+glibmm_defs_files = []
+foreach file : glibmm_defs_basefiles
+ glibmm_defs_files += '..' / 'src' / file
+endforeach
+
+# Generated from pairs of .hg and .ccg files.
+glibmm_hg_ccg_basenames = [
+ 'balancedtree',
+ 'binding',
+ 'bytes',
+ 'bytearray',
+ 'checksum',
+ 'convert',
+ 'date',
+ 'datetime',
+ 'enums',
+ 'fileutils',
+ 'iochannel',
+ 'keyfile',
+ 'markup',
+ 'miscutils',
+ 'module',
+ 'nodetree',
+ 'optioncontext',
+ 'optionentry',
+ 'optiongroup',
+ 'regex',
+ 'shell',
+ 'spawn',
+ 'thread',
+ 'threads',
+ 'timezone',
+ 'unicode',
+ 'uriutils',
+ 'valuearray',
+ 'variant',
+ 'variantdict',
+ 'variantiter',
+ 'varianttype',
+]
+
+# Generated from .m4 files.
+glibmm_h_m4_files = [
+ 'value_basictypes.h',
+ 'variant_basictypes.h',
+]
+
+glibmm_cc_m4_files = [
+ 'value_basictypes.cc',
+ 'variant_basictypes.cc',
+]
+
+# Pairs of hand-coded .h and .cc files.
+glibmm_extra_h_cc_basenames = [
+ 'arrayhandle',
+ 'base64',
+ 'class',
+ 'containers',
+ 'debug',
+ 'dispatcher',
+ 'error',
+ 'exception',
+ 'exceptionhandler',
+ 'extraclassinit',
+ 'init',
+ 'interface',
+ 'main',
+ 'object',
+ 'objectbase',
+ 'pattern',
+ 'property',
+ 'propertyproxy',
+ 'propertyproxy_base',
+ 'quark',
+ 'random',
+ 'sarray',
+ 'signalproxy',
+ 'signalproxy_connectionnode',
+ 'streamiochannel',
+ 'stringutils',
+ 'threadpool',
+ 'timer',
+ 'timeval',
+ 'ustring',
+ 'utility',
+ 'value',
+ 'value_custom',
+ 'variantdbusstring',
+ 'vectorutils',
+ 'wrap',
+]
+
+glibmm_extra_h_files = [
+ 'containerhandle_shared.h',
+ 'helperlist.h',
+ 'i18n-lib.h',
+ 'i18n.h',
+ 'listhandle.h',
+ 'priorities.h',
+ 'refptr.h',
+ 'slisthandle.h',
+ 'weakref.h',
+ 'wrap_init.h',
+]
+
+glibmm_extra_ph_files = [
+ 'private' / 'interface_p.h',
+ 'private' / 'object_p.h',
+]
+
+glibmm_extra_cc_files = []
+
+foreach file : glibmm_extra_h_cc_basenames
+ glibmm_extra_h_files += file + '.h'
+ glibmm_extra_cc_files += file + '.cc'
+endforeach
+
+install_headers('..' / 'glibmm.h', subdir: glibmm_pcname)
+install_headers(glibmm_extra_h_files, subdir: glibmm_pcname / 'glibmm')
+install_headers(glibmm_extra_ph_files, subdir: glibmm_pcname / 'glibmm' / 'private')
+
+untracked_glibmm = 'untracked' / 'glib' / 'glibmm'
+src_untracked_glibmm = project_source_root / untracked_glibmm
+
+if maintainer_mode
+
+ # Maintainer mode. Generate .h and .cc files from .hg and .ccg files in ../src.
+
+ # docs/reference/meson.build needs these.
+ built_files_root = project_build_root
+ glibmm_built_h_file_targets = []
+
+ # Force meson+ninja to generate source files before anything is compiled.
+ # Compilation must depend on these targets.
+ glibmm_built_cc_file_targets = []
+
+ hg_files = []
+ foreach file : glibmm_hg_ccg_basenames
+ hg_files += '..' / 'src' / file + '.hg'
+ endforeach
+
+ # Create wrap_init.cc in project_build_root/glib/glibmm.
+ glibmm_built_cc_file_targets += custom_target('glibmm-wrap_init.cc',
+ input: hg_files,
+ output: 'wrap_init.cc',
+ command: [
+ python3, generate_binding_py, 'generate_wrap_init',
+ gmmproc_dir,
+ '@OUTPUT@',
+ 'Glib', # namespace
+ '@INPUT@',
+ ],
+ depend_files: generate_wrap_init_pl,
+ build_by_default: maintainer_mode,
+ install: false,
+ )
+
+ # Create .h/_p.h/.cc files in project_build_root/glib/glibmm
+ # from .hg/.ccg files in project_source_root/glib/src.
+ foreach file : glibmm_hg_ccg_basenames
+ hg_file = '..' / 'src' / file + '.hg'
+ ccg_file = '..' / 'src' / file + '.ccg'
+ built_file_target = custom_target('glibmm-' + file + '.cc',
+ input: [hg_file, ccg_file],
+ output: [file + '.stamp', file + '.cc', file + '.h'],
+ command: [
+ python3, handle_built_files_py, 'gmmproc',
+ gmmproc_dir,
+ project_source_root / 'tools' / 'pm',
+ '@OUTPUT0@',
+ file,
+ meson.current_source_dir() / '..' / 'src',
+ project_source_root / 'tools' / 'm4',
+ ],
+ depend_files: glibmm_defs_files + m4_files + [gmmproc] + pm_files,
+ build_by_default: maintainer_mode,
+ install: false,
+ )
+ glibmm_built_cc_file_targets += built_file_target[1]
+ glibmm_built_h_file_targets += built_file_target[2]
+ endforeach
+
+ # Create .h and .cc files in project_build_root/glib/glibmm
+ # from .m4 files in project_source_root/glib/src.
+ foreach output_file : glibmm_h_m4_files + glibmm_cc_m4_files
+ input_file = '..' / 'src' / output_file + '.m4'
+ built_file_target = custom_target('glibmm-' + output_file,
+ input: input_file,
+ output: output_file,
+ command: [
+ python3, handle_built_files_py, 'build_from_m4',
+ meson.current_source_dir() / '..' / 'src',
+ '@INPUT@',
+ '@OUTPUT@',
+ ],
+ depend_files: '..' / 'src' / 'template.macros.m4',
+ build_by_default: maintainer_mode,
+ install: false,
+ )
+ if output_file.endswith('.cc')
+ glibmm_built_cc_file_targets += built_file_target
+ else
+ glibmm_built_h_file_targets += built_file_target
+ endif
+ endforeach
+
+ # Create dummy_header.h, depending on all generated headers.
+ # It's created if it does not exist, but it's never updated.
+ # It guarantees that all generated headers are built before glibmm_library
+ # is built, at the same time avoiding unnecessary recompilations.
+ # If glibmm_built_h_file_targets would be listed as sources to glibmm_library,
+ # all generated .cc files could be recompiled if one generated .h file has
+ # been changed.
+ built_dummy_h_file_target = custom_target('glibmm-dummy_header.h',
+ input: glibmm_built_h_file_targets,
+ output: 'dummy_header.h',
+ command: [
+ python3, dummy_header_py,
+ '@OUTPUT@',
+ ],
+ build_by_default: maintainer_mode,
+ install: false,
+ )
+
+ extra_include_dirs = ['..']
+ glib_int_lib = static_library('glibmm-int',
+ glibmm_built_cc_file_targets, glibmm_extra_cc_files, built_dummy_h_file_target,
+ include_directories: extra_include_dirs,
+ cpp_args: '-DGLIBMM_BUILD=1',
+ dependencies: glibmm_build_dep,
+ install: false,
+ )
+
+ built_h_cc_dir = meson.current_build_dir()
+
+else # not maintainer_mode
+
+ # Not maintainer mode. Compile built source code files in
+ # project_source_root/untracked/glib/glibmm.
+
+ # docs/reference/meson.build needs these.
+ built_files_root = project_source_root / 'untracked'
+ glibmm_built_h_file_targets = []
+
+ # Two cases:
+ # 1. The source code comes from a tarball, where the built files
+ # are stored in project_source_root/untracked.
+ # There are no built files in the build tree.
+ # 2. Files have been built in the build tree. Then maintainer_mode has
+ # been changed from true to false. Files that are missing or not up to date
+ # in project_source_root/untracked are copied from the build tree.
+
+ # Try to copy built source code files to the source tree.
+ run_command(
+ python3, generate_binding_py, 'copy_built_files',
+ meson.current_build_dir(),
+ src_untracked_glibmm,
+ glibmm_hg_ccg_basenames,
+ )
+ run_command(
+ python3, handle_built_files_py, 'copy_built_files',
+ meson.current_build_dir(),
+ src_untracked_glibmm,
+ glibmm_h_m4_files + glibmm_cc_m4_files,
+ )
+
+ built_cc_files = [ src_untracked_glibmm / 'wrap_init.cc' ]
+ foreach file : glibmm_hg_ccg_basenames
+ built_cc_files += src_untracked_glibmm / file + '.cc'
+ endforeach
+ foreach file : glibmm_cc_m4_files
+ built_cc_files += src_untracked_glibmm / file
+ endforeach
+
+ extra_include_dirs = [ '..', '..' / '..' / 'untracked' / 'glib' ]
+
+ # We need this so that we can run gendef.exe to get the .def file
+ # needed for obtaining the .lib file for the glibmm DLL
+ glib_int_lib = static_library('glibmm-int',
+ built_cc_files, glibmm_extra_cc_files,
+ include_directories: extra_include_dirs,
+ cpp_args: '-DGLIBMM_BUILD=1',
+ dependencies: glibmm_build_dep,
+ install: false,
+ )
+
+ built_h_cc_dir = src_untracked_glibmm
+
+endif
+
+glibmm_def = []
+glibmm_extra_link_args = []
+extra_glibmm_objects = []
+
+if is_msvc
+ glibmm_def = custom_target('glibmm.def',
+ output: 'glibmm.def',
+ depends: glib_int_lib,
+ command: [ gendef,
+ '@OUTPUT@',
+ '@0@-@1@.dll'.format(glibmm_pcname, glibmm_libversion.split('.')[0]),
+ glib_int_lib.full_path(),
+ ],
+ install: false,
+ )
+ glibmm_extra_link_args = ['/def:@0@'.format(glibmm_def.full_path())]
+endif
+
+# Build the .rc file for Windows builds and link to it
+if is_host_windows
+ windows = import('windows')
+ glibmm_res = windows.compile_resources(glibmm_rc)
+ extra_glibmm_objects += glibmm_res
+endif
+
+glibmm_library = library(glibmm_pcname, extra_glibmm_objects,
+ objects: glib_int_lib.extract_all_objects(),
+ version: glibmm_libversion,
+ dependencies: glibmm_build_dep,
+ link_depends: glibmm_def,
+ link_args: glibmm_extra_link_args,
+ install: true,
+)
+
+# Install built .h and _p.h files.
+meson.add_install_script(
+ python3.path(), generate_binding_py, 'install_built_h_files',
+ built_h_cc_dir,
+ install_includedir / glibmm_pcname / 'glibmm', # subdir below {prefix}
+ glibmm_hg_ccg_basenames
+)
+# Install .h files built from .m4 files.
+meson.add_install_script(
+ python3.path(), handle_built_files_py, 'install_built_h_files',
+ built_h_cc_dir,
+ install_includedir / glibmm_pcname / 'glibmm', # subdir below {prefix}
+ glibmm_h_m4_files,
+)
+
+if not meson.is_subproject()
+ # Distribute built files.
+ # (add_dist_script() is not allowed in a subproject)
+ meson.add_dist_script(
+ python3.path(), generate_binding_py, 'dist_built_files',
+ built_h_cc_dir,
+ untracked_glibmm,
+ glibmm_hg_ccg_basenames,
+ )
+ meson.add_dist_script(
+ python3.path(), handle_built_files_py, 'dist_built_files',
+ built_h_cc_dir,
+ untracked_glibmm,
+ glibmm_h_m4_files + glibmm_cc_m4_files,
+ )
+endif
+
+# This is useful in the main project when glibmm is used as a subproject.
+# It's also used when building example programs and test programs.
+glibmm_dep = declare_dependency(
+ sources: glibmm_built_h_file_targets,
+ link_with: glibmm_library,
+ include_directories: extra_include_dirs,
+ dependencies: glibmm_build_dep,
+)
diff --git a/glib/glibmmconfig.h.in b/glib/glibmmconfig.h.in
index e5639cb7..abaaeb31 100644
--- a/glib/glibmmconfig.h.in
+++ b/glib/glibmmconfig.h.in
@@ -110,6 +110,7 @@
# define GLIBMM_CAN_USE_DYNAMIC_CAST_IN_UNUSED_TEMPLATE_WITHOUT_DEFINITION 1
# define GLIBMM_CAN_ASSIGN_NON_EXTERN_C_FUNCTIONS_TO_EXTERN_C_CALLBACKS 1
# define GLIBMM_CAN_USE_NAMESPACES_INSIDE_EXTERNC 1
+# define GLIBMM_CAN_USE_THREAD_LOCAL 1
# define GLIBMM_PROPERTIES_ENABLED 1
# define GLIBMM_VFUNCS_ENABLED 1
# define GLIBMM_EXCEPTIONS_ENABLED 1
diff --git a/glib/glibmmconfig.h.meson b/glib/glibmmconfig.h.meson
new file mode 100644
index 00000000..12e80ac6
--- /dev/null
+++ b/glib/glibmmconfig.h.meson
@@ -0,0 +1,163 @@
+#ifndef _GLIBMM_CONFIG_H
+#define _GLIBMM_CONFIG_H
+
+/* Define to omit deprecated API from the library. */
+#mesondefine GLIBMM_DISABLE_DEPRECATED
+
+/* Major version number of glibmm. */
+#mesondefine GLIBMM_MAJOR_VERSION
+
+/* Minor version number of glibmm. */
+#mesondefine GLIBMM_MINOR_VERSION
+
+/* Micro version number of glibmm. */
+#mesondefine GLIBMM_MICRO_VERSION
+
+/* Define if glibmm is built as a static library */
+#mesondefine GLIBMM_STATIC_LIB
+
+/* The size of wchar_t, as computed by sizeof. */
+#mesondefine GLIBMM_SIZEOF_WCHAR_T
+
+/* Defined when the -Ddebug-refcounting configure argument was given */
+#mesondefine GLIBMM_DEBUG_REFCOUNTING
+
+/* This is always set. This is only for backwards compatibility. */
+#define GLIBMM_DEFAULT_SIGNAL_HANDLERS_ENABLED 1
+
+/* This is always set. This is only for backwards compatibility. */
+#define GLIBMM_EXCEPTIONS_ENABLED 1
+
+/* This is always set. This is only for backwards compatibility. */
+#define GLIBMM_VFUNCS_ENABLED 1
+
+/* This is always set. This is only for backwards compatibility. */
+#define GLIBMM_PROPERTIES_ENABLED 1
+
+/* This is always set. This is only for backwards compatibility.
+ * All acceptable C++ compilers have namespace std. */
+#define GLIBMM_HAVE_NAMESPACE_STD 1
+
+/* Dummy macro definition for compatibility with old code that expects
+ * it to be defined. */
+#define GLIBMM_USING_STD(Symbol)
+
+#ifdef _WIN32
+ /* Win32 compilers have a lot of varation */
+# if defined(_MSC_VER)
+# define GLIBMM_MSC 1
+# define GLIBMM_WIN32 1
+# define GLIBMM_DLL 1
+# elif defined(__CYGWIN__)
+# define GLIBMM_CONFIGURE 1
+# elif defined(__MINGW32__)
+# define GLIBMM_WIN32 1
+# define GLIBMM_CONFIGURE 1
+# else
+ /* AIX clR compiler complains about this even though it doesn't get this far */
+# error "Unknown architecture (send me gcc --dumpspecs or equiv)"
+# endif
+#else
+# define GLIBMM_CONFIGURE 1
+#endif /* _WIN32 */
+
+#ifdef GLIBMM_CONFIGURE
+
+/* Define only on Mac OS, COCOA */
+#mesondefine GLIBMM_OS_COCOA
+
+/* Define if extern "C" and extern "C++" function pointers are compatible. */
+#mesondefine GLIBMM_CAN_ASSIGN_NON_EXTERN_C_FUNCTIONS_TO_EXTERN_C_CALLBACKS
+
+/* Define if non-instantiated templates may dynamic_cast<> to an undefined
+ type. */
+#mesondefine GLIBMM_CAN_USE_DYNAMIC_CAST_IN_UNUSED_TEMPLATE_WITHOUT_DEFINITION
+
+/* Define if the compiler honors namespaces inside extern "C" blocks. */
+#mesondefine GLIBMM_CAN_USE_NAMESPACES_INSIDE_EXTERNC
+
+/* Defined when the SUN Forte C++ compiler is being used. */
+#mesondefine GLIBMM_COMPILER_SUN_FORTE
+
+/* Defined if a static member variable may be initialized inline to
+ std::string::npos */
+#mesondefine GLIBMM_HAVE_ALLOWS_STATIC_INLINE_NPOS
+
+/* Defined when time_t is not equivalent to gint32, meaning that it can be
+ used for a method overload */
+#mesondefine GLIBMM_HAVE_C_STD_TIME_T_IS_NOT_INT32
+
+/* Define if the compiler disambiguates template specializations for const and
+ non-const types. */
+#mesondefine GLIBMM_HAVE_DISAMBIGUOUS_CONST_TEMPLATE_SPECIALIZATIONS
+
+/* Defined if std::iterator_traits<> is standard-conforming */
+#mesondefine GLIBMM_HAVE_STD_ITERATOR_TRAITS
+
+/* Defined if std::reverse_iterator is in Sun libCstd style */
+#mesondefine GLIBMM_HAVE_SUN_REVERSE_ITERATOR
+
+/* Defined if the STL containers have templated sequence ctors */
+#mesondefine GLIBMM_HAVE_TEMPLATE_SEQUENCE_CTORS
+
+/* Define to 1 if wide stream is available. */
+#mesondefine GLIBMM_HAVE_WIDE_STREAM
+
+/* Define if C++ member functions may refer to member templates. */
+#mesondefine GLIBMM_MEMBER_FUNCTIONS_MEMBER_TEMPLATES
+
+/* Define if the thread_local keyword is supported. */
+#mesondefine GLIBMM_CAN_USE_THREAD_LOCAL
+
+#endif /* GLIBMM_CONFIGURE */
+
+#ifdef GLIBMM_MSC
+# define GLIBMM_HAVE_STD_ITERATOR_TRAITS 1
+# define GLIBMM_HAVE_TEMPLATE_SEQUENCE_CTORS 1
+# define GLIBMM_HAVE_WIDE_STREAM 1
+# define GLIBMM_HAVE_DISAMBIGUOUS_CONST_TEMPLATE_SPECIALIZATIONS 1
+# define GLIBMM_HAVE_C_STD_TIME_T_IS_NOT_INT32 1
+# define GLIBMM_CAN_USE_DYNAMIC_CAST_IN_UNUSED_TEMPLATE_WITHOUT_DEFINITION 1
+# define GLIBMM_CAN_ASSIGN_NON_EXTERN_C_FUNCTIONS_TO_EXTERN_C_CALLBACKS 1
+# define GLIBMM_CAN_USE_NAMESPACES_INSIDE_EXTERNC 1
+# pragma warning (disable: 4786 4355 4800 4181)
+
+#if (_MSC_VER < 1900)
+/* The C++-11 keywords noexcept and thread_local are supported on
+ * Visual Studio 2013 via Microsoft-specific extensions, but are
+ * supported directly in Visual Studio 2015
+ */
+
+#define _ALLOW_KEYWORD_MACROS 1
+
+#ifndef noexcept
+#define noexcept _NOEXCEPT
+#endif
+
+#ifndef thread_local
+#define thread_local __declspec (thread)
+#endif
+
+#endif /* _MSC_VER < 1900 */
+#endif /* GLIBMM_MSC */
+
+/* Enable DLL-specific stuff only when not building a static library */
+#if !defined(__CYGWIN__) && defined(__MINGW32__) && !defined(GLIBMM_STATIC_LIB)
+# define GLIBMM_DLL 1
+#endif
+
+#ifdef GLIBMM_DLL
+# if defined(GLIBMM_BUILD) && defined(_WINDLL)
+ /* Do not dllexport as it is handled by gendef on MSVC */
+# define GLIBMM_API
+# elif !defined(GLIBMM_BUILD)
+# define GLIBMM_API __declspec(dllimport)
+# else
+ /* Build a static library */
+# define GLIBMM_API
+# endif /* GLIBMM_BUILD - _WINDLL */
+#else
+# define GLIBMM_API
+#endif /* GLIBMM_DLL */
+
+#endif /* _GLIBMM_CONFIG_H */
diff --git a/glib/meson.build b/glib/meson.build
new file mode 100644
index 00000000..1b918c00
--- /dev/null
+++ b/glib/meson.build
@@ -0,0 +1,121 @@
+# glib
+
+# Input: install_prefix, install_libdir, install_datadir, install_includedir,
+# glibmm_pcname, giomm_pcname, glibmm_api_version, glibmm_requires,
+# giomm_requires, build_deprecated_api, install_pkgconfigdir,
+# is_os_cocoa, cpp_compiler, glibmm_major_version, glibmm_minor_version,
+# glibmm_micro_version
+# Output: pkg_conf_data, install_glibmmconfigdir, glibmmconfig_h
+
+pkg_conf_data = configuration_data()
+pkg_conf_data.set('prefix', install_prefix)
+pkg_conf_data.set('exec_prefix', '${prefix}')
+pkg_conf_data.set('libdir', '${exec_prefix}' / install_libdir)
+pkg_conf_data.set('datarootdir', '${prefix}' / install_datadir)
+pkg_conf_data.set('datadir', '${datarootdir}')
+pkg_conf_data.set('includedir', '${prefix}' / install_includedir)
+pkg_conf_data.set('PACKAGE_TARNAME', meson.project_name())
+pkg_conf_data.set('PACKAGE_VERSION', meson.project_version())
+pkg_conf_data.set('GLIBMM_MODULE_NAME', glibmm_pcname)
+pkg_conf_data.set('GLIBMM_API_VERSION', glibmm_api_version)
+pkg_conf_data.set('GLIBMM_MODULES', glibmm_requires)
+pkg_conf_data.set('GIOMM_MODULE_NAME', giomm_pcname)
+pkg_conf_data.set('GIOMM_API_VERSION', glibmm_api_version)
+pkg_conf_data.set('GIOMM_MODULES', giomm_requires)
+if not build_deprecated_api
+ pkg_conf_data.set('GLIBMM_DISABLE_DEPRECATED', 1)
+ pkg_conf_data.set('GIOMM_DISABLE_DEPRECATED', 1)
+endif
+pkg_conf_data.set('GLIBMM_MAJOR_VERSION', glibmm_major_version)
+pkg_conf_data.set('GLIBMM_MINOR_VERSION', glibmm_minor_version)
+pkg_conf_data.set('GLIBMM_MICRO_VERSION', glibmm_micro_version)
+pkg_conf_data.set('GIOMM_MAJOR_VERSION', glibmm_major_version)
+pkg_conf_data.set('GIOMM_MINOR_VERSION', glibmm_minor_version)
+pkg_conf_data.set('GIOMM_MICRO_VERSION', glibmm_micro_version)
+if get_option('default_library') == 'static'
+ pkg_conf_data.set('GLIBMM_STATIC_LIB', 1)
+ pkg_conf_data.set('GIOMM_STATIC_LIB', 1)
+endif
+
+configure_file(
+ input: 'glibmm.pc.in',
+ output: glibmm_pcname + '.pc',
+ configuration: pkg_conf_data,
+ install_dir: install_pkgconfigdir,
+)
+
+glibmm_pkg_uninst_conf_data = configuration_data()
+glibmm_pkg_uninst_conf_data.merge_from(pkg_conf_data)
+glibmm_pkg_uninst_conf_data.set('srcdir', meson.current_source_dir())
+
+configure_file(
+ input: 'glibmm-uninstalled.pc.in',
+ output: glibmm_pcname + '-uninstalled.pc',
+ configuration: glibmm_pkg_uninst_conf_data,
+)
+
+glibmm_config_conf_data = configuration_data()
+glibmm_config_conf_data.merge_from(pkg_conf_data)
+if get_option('debug-refcounting')
+ glibmm_config_conf_data.set('GLIBMM_DEBUG_REFCOUNTING', 1)
+endif
+if is_os_cocoa
+ glibmm_config_conf_data.set('GLIBMM_OS_COCOA', 1)
+endif
+glibmm_config_conf_data.set('GLIBMM_SIZEOF_WCHAR_T', cpp_compiler.sizeof('wchar_t'))
+
+# Leave GLIBMM_COMPILER_SUN_FORTE undefined. It's not used by glibmm itself.
+# The Sun Forte compiler (a.k.a. Sun WorkShop) is not one of the compilers
+# that Meson recognizes. According to Wikipedia it's old, and has been
+# replaced by Oracle Developer Studio.
+# https://en.wikipedia.org/wiki/Oracle_Developer_Studio
+#if ???
+# glibmm_config_conf_data.set('GLIBMM_COMPILER_SUN_FORTE', 1)
+#endif
+
+conf_tests = [
+# [preprocessor-macro-name, file-name, message]
+ ['GLIBMM_HAVE_WIDE_STREAM', 'have_wide_stream.cc', 'Wide stream support'],
+ ['GLIBMM_HAVE_STD_ITERATOR_TRAITS', 'have_std_iterator_traits.cc',
+ 'std::iterator_traits<> is standard-conforming'],
+ ['GLIBMM_HAVE_SUN_REVERSE_ITERATOR', 'have_sun_reverse_iterator.cc',
+ 'std::reverse_iterator is in Sun libCstd style'],
+ ['GLIBMM_HAVE_TEMPLATE_SEQUENCE_CTORS', 'have_template_sequence_ctors.cc',
+ 'STL containers have templated sequence ctors'],
+ ['GLIBMM_HAVE_DISAMBIGUOUS_CONST_TEMPLATE_SPECIALIZATIONS',
+ 'have_disambiguous_const_template_specializations.cc',
+ 'Disambiguates template specializations for const and non-const types'],
+ ['GLIBMM_CAN_USE_DYNAMIC_CAST_IN_UNUSED_TEMPLATE_WITHOUT_DEFINITION',
+ 'can_use_dynamic_cast_in_unused_template_wo_def.cc',
+ 'Non-instantiated templates may dynamic_cast<> to an undefined type'],
+ ['GLIBMM_CAN_ASSIGN_NON_EXTERN_C_FUNCTIONS_TO_EXTERN_C_CALLBACKS',
+ 'can_assign_non_extern_c_functions_to_extern_c_cb.cc',
+ 'extern "C" and extern "C++" function pointers are compatible'],
+ ['GLIBMM_HAVE_ALLOWS_STATIC_INLINE_NPOS', 'allows_static_inline_npos.cc',
+ 'A static member variable may be initialized inline to std::string::npos'],
+ ['GLIBMM_MEMBER_FUNCTIONS_MEMBER_TEMPLATES',
+ 'member_functions_member_templates.cc',
+ 'Member functions can refer to spezialized member function templates'],
+ ['GLIBMM_CAN_USE_NAMESPACES_INSIDE_EXTERNC',
+ 'can_use_namespaces_inside_externc.cc',
+ 'extern "C" functions in the global namespace, even inside a namespace'],
+ ['GLIBMM_CAN_USE_THREAD_LOCAL', 'can_use_thread_local.cc', 'thread_local support'],
+ ['GLIBMM_HAVE_C_STD_TIME_T_IS_NOT_INT32', 'std_time_t_is_not_int32.cc',
+ 'std::time_t and gint32 are typedefs of different builtin types'],
+]
+
+foreach conf_test : conf_tests
+ if cpp_compiler.compiles(
+ files('..' / 'tools' / 'conf_tests' / conf_test[1]),
+ name: conf_test[2])
+ glibmm_config_conf_data.set(conf_test[0], 1)
+ endif
+endforeach
+
+install_glibmmconfigdir = install_libdir / glibmm_pcname / 'include'
+glibmmconfig_h = configure_file(
+ input: 'glibmmconfig.h.meson',
+ output: 'glibmmconfig.h',
+ configuration: glibmm_config_conf_data,
+ install_dir: install_glibmmconfigdir,
+)
diff --git a/meson.build b/meson.build
new file mode 100644
index 00000000..366e26e0
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,262 @@
+# This file is part of glibmm.
+
+project('glibmm', 'cpp',
+ version: '2.62.0',
+ license: 'LGPLv2.1+',
+ default_options: [
+ 'cpp_std=c++11'
+ ],
+ meson_version: '>= 0.50.0', # required for python3.path()
+)
+
+glibmm_api_version = '2.4'
+glibmm_pcname = meson.project_name() + '-' + glibmm_api_version
+giomm_pcname = 'giomm-' + glibmm_api_version
+
+glibmm_version_array = meson.project_version().split('.')
+glibmm_major_version = glibmm_version_array[0].to_int()
+glibmm_minor_version = glibmm_version_array[1].to_int()
+glibmm_micro_version = glibmm_version_array[2].to_int()
+
+# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
+# The relation between libtool's current:revison:age interface versioning
+# and the .so filename, .so.x.y.z, is
+# x = current - age
+# y = age
+# z = revision
+# If libtool_soversion is updated as described in libtool's documentation,
+# x.y.z will usually *not* be equal to meson.project_version().
+libtool_soversion = [4, 0, 3]
+glibmm_libversion = '@0@.@1@.@2@'.format(
+ libtool_soversion[0] - libtool_soversion[2],
+ libtool_soversion[2],
+ libtool_soversion[1])
+
+# Use these instead of meson.source_root() and meson.build_root() in subdirectories.
+# source_root() and build_root() are not useful, if this is a subproject.
+project_source_root = meson.current_source_dir()
+project_build_root = meson.current_build_dir()
+
+cpp_compiler = meson.get_compiler('cpp')
+is_msvc = cpp_compiler.get_id() == 'msvc'
+is_host_windows = host_machine.system() == 'windows'
+
+is_os_cocoa = false
+if not is_host_windows
+ # This test for Mac OS is copied from glib. If the result of glib's test
+ # is ever made available outside glib, use glib's result instead of this test.
+ # glib: https://bugzilla.gnome.org/show_bug.cgi?id=780309
+ # glibmm: https://bugzilla.gnome.org/show_bug.cgi?id=781947
+ is_os_cocoa = cpp_compiler.compiles(
+ '''#include <Cocoa/Cocoa.h>
+ #ifdef GNUSTEP_BASE_VERSION
+ #error "Detected GNUstep, not Cocoa"
+ #endif''',
+ name: 'Mac OS X Cocoa support'
+ )
+endif
+
+python3 = import('python').find_installation()
+python_version = python3.language_version()
+python_version_req = '>= 3.5'
+if not python_version.version_compare(python_version_req)
+ error('Requires Python @0@, found @1@.'.format(python_version_req, python_version))
+endif
+
+# Do we build from a git repository?
+# Suppose we do if and only if a '.git' directory or file exists.
+cmd_py = '''
+import os
+import sys
+sys.exit(os.path.isdir("@0@") or os.path.isfile("@0@"))
+'''.format(project_source_root / '.git')
+is_git_build = run_command(python3, '-c', cmd_py).returncode() != 0
+
+# Options.
+maintainer_mode_opt = get_option('maintainer-mode')
+maintainer_mode = maintainer_mode_opt == 'true' or \
+ (maintainer_mode_opt == 'if-git-build' and is_git_build)
+warning_level = get_option('warnings')
+build_deprecated_api = get_option('build-deprecated-api')
+build_documentation_opt = get_option('build-documentation')
+build_documentation = build_documentation_opt == 'true' or \
+ (build_documentation_opt == 'if-maintainer-mode' and maintainer_mode)
+build_examples = get_option('build-examples')
+
+# Installation directories are relative to {prefix}.
+install_prefix = get_option('prefix')
+install_includedir = get_option('includedir')
+install_libdir = get_option('libdir')
+install_datadir = get_option('datadir')
+install_pkgconfigdir = install_libdir / 'pkgconfig'
+
+# Dependencies. <pkg> = glib and gio
+# <pkg>mm_build_dep: Dependencies when building the <pkg>mm library.
+# <pkg>mm_dep (created in <pkg>/<pkg>mm/meson.build):
+# Dependencies when using the <pkg>mm library.
+
+sigcxx_req = '>= 2.9.1'
+glib_req = '>= 2.61.2'
+
+# There are pkg-config files for sigc++ and glib on MSVC, so just use that.
+sigcxx_dep = dependency('sigc++-2.0', version: sigcxx_req)
+glib_dep = dependency('glib-2.0', version: glib_req)
+gobject_dep = dependency('gobject-2.0', version: glib_req)
+gmodule_dep = dependency('gmodule-2.0', version: glib_req)
+
+glibmm_build_dep = [sigcxx_dep, glib_dep, gobject_dep, gmodule_dep]
+glibmm_requires = [
+ 'sigc++-2.0', sigcxx_req,
+ 'glib-2.0', glib_req,
+ 'gobject-2.0', glib_req,
+ 'gmodule-2.0', glib_req,
+]
+
+gio_dep = dependency('gio-2.0', version: glib_req)
+giomm_build_dep = glibmm_build_dep + [gio_dep]
+giomm_requires = glibmm_requires + ['gio-2.0', glib_req]
+if not is_host_windows
+ gio_unix_dep = dependency('gio-unix-2.0', version: glib_req)
+ giomm_build_dep += gio_unix_dep
+ giomm_requires += ['gio-unix-2.0', glib_req]
+endif
+
+glibmm_requires = ' '.join(glibmm_requires)
+giomm_requires = ' '.join(giomm_requires)
+
+# Some dependencies are required only in maintainer mode and/or if
+# reference documentation shall be built.
+mm_common_get = find_program('mm-common-get', required: maintainer_mode)
+m4 = find_program('m4', required: maintainer_mode) # Used by gmmproc
+perl = find_program('perl', required: maintainer_mode or build_documentation)
+doxygen = find_program('doxygen', required: build_documentation)
+dot = find_program('dot', required: build_documentation) # Used by Doxygen
+xsltproc = find_program('xsltproc', required: build_documentation)
+
+# Where to find gmmproc and generate_wrap_init.pl.
+gmmproc_dir = project_build_root / 'tools'
+
+# Script files copied to 'untracked' by mm-common-get.
+script_dir = project_source_root / 'untracked' / 'build_scripts'
+generate_binding_py = script_dir / 'generate-binding.py'
+doc_reference_py = script_dir / 'doc-reference.py'
+dist_changelog_py = script_dir / 'dist-changelog.py'
+dist_build_scripts_py = script_dir / 'dist-build-scripts.py'
+
+if maintainer_mode and mm_common_get.found()
+ # Copy files to untracked/build_scripts and untracked/docs.
+ run_command(mm_common_get, '--force', script_dir,
+ project_source_root / 'untracked' / 'docs')
+endif
+
+# glibmm's own script files.
+glibmm_script_dir = project_source_root / 'tools' / 'build_scripts'
+handle_built_files_py = glibmm_script_dir / 'handle-built-files.py'
+dummy_header_py = glibmm_script_dir / 'dummy-header.py'
+compile_schemas_py = glibmm_script_dir / 'compile-schemas.py'
+
+# Set compiler warnings.
+warning_flags = []
+if warning_level == 'min'
+ if is_msvc
+ warning_flags = ['/W3']
+ else
+ warning_flags = ['-Wall']
+ endif
+elif warning_level == 'max' or warning_level == 'fatal'
+ if is_msvc
+ warning_flags = ['/W4']
+ else
+ warning_flags = '-pedantic -Wall -Wextra -Wformat-security -Wsuggest-override -Wshadow -Wno-long-long'.split()
+ endif
+ if warning_level == 'fatal'
+ if is_msvc
+ warning_flags += ['/WX']
+ else
+ warning_flags += ['-Werror']
+ endif
+ deprecations = 'G SIGCXX'.split()
+ foreach d : deprecations
+ warning_flags += '-D@0@_DISABLE_DEPRECATED'.format(d)
+ endforeach
+ endif
+endif
+
+warning_flags = cpp_compiler.get_supported_arguments(warning_flags)
+add_project_arguments(warning_flags, language: 'cpp')
+
+# MSVC: Ignore warnings that aren't really harmful, but make those
+# that should not be overlooked stand out.
+if is_msvc
+ disabled_warnings = cpp_compiler.get_supported_arguments([
+ '/FImsvc_recommended_pragmas.h', '/wd4146', '/wd4267', '/wd4530', '/wd4589'
+ ])
+ add_project_arguments(disabled_warnings, language: 'cpp')
+endif
+
+subdir('tools')
+subdir('MSVC_NMake/gendef')
+subdir('glib')
+subdir('MSVC_NMake/glibmm')
+subdir('glib/glibmm')
+subdir('gio')
+subdir('MSVC_NMake/giomm')
+subdir('gio/giomm')
+subdir('examples')
+subdir('tests')
+subdir('docs/reference')
+
+if not meson.is_subproject()
+ # Add a ChangeLog file to the distribution directory.
+ # (add_dist_script() is not allowed in a subproject)
+ meson.add_dist_script(
+ python3.path(), dist_changelog_py,
+ project_source_root,
+ )
+ # Add build scripts to the distribution directory, and delete .gitignore
+ # files and an empty $MESON_DIST_ROOT/build/ directory.
+ meson.add_dist_script(
+ python3.path(), dist_build_scripts_py,
+ project_source_root,
+ 'untracked' / 'build_scripts',
+ )
+endif
+
+# Print a summary.
+real_maintainer_mode = ''
+if maintainer_mode_opt == 'if-git-build'
+ real_maintainer_mode = ' (@0@)'.format(maintainer_mode)
+endif
+
+real_build_documentation = ''
+if build_documentation_opt == 'if-maintainer-mode'
+ real_build_documentation = ' (@0@)'.format(build_documentation)
+endif
+
+summary = [
+ '',
+ '------',
+ meson.project_name() + ' ' + meson.project_version(),
+ '',
+ ' Maintainer mode: @0@@1@'.format(maintainer_mode_opt, real_maintainer_mode),
+ ' Compiler warnings: @0@'.format(warning_level),
+ ' Build deprecated API: @0@'.format(build_deprecated_api),
+ 'Build HTML documentation: @0@@1@'.format(build_documentation_opt, real_build_documentation),
+ ' Build example programs: @0@'.format(build_examples),
+ 'Directories:',
+ ' prefix: @0@'.format(install_prefix),
+ ' includedir: @0@'.format(install_prefix / install_includedir),
+ ' includeglibmmdir: @0@'.format(install_prefix / install_includedir / glibmm_pcname),
+ ' includegiommdir: @0@'.format(install_prefix / install_includedir / giomm_pcname),
+ ' libdir: @0@'.format(install_prefix / install_libdir),
+ ' glibmmconfigdir: @0@'.format(install_prefix / install_glibmmconfigdir),
+ ' giommconfigdir: @0@'.format(install_prefix / install_giommconfigdir),
+ ' m4dir: @0@'.format(install_prefix / install_m4dir),
+ ' pkgconfigdir: @0@'.format(install_prefix / install_pkgconfigdir),
+ ' datadir: @0@'.format(install_prefix / install_datadir),
+ ' docdir: @0@'.format(install_prefix / install_docdir),
+ ' devhelpdir: @0@'.format(install_prefix / install_devhelpdir),
+ '------'
+]
+
+message('\n'.join(summary))
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 00000000..b5a526c3
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,12 @@
+option('maintainer-mode', type: 'combo', choices: ['false', 'if-git-build', 'true'],
+ value: 'if-git-build', description: 'Generate source code from .hg and .ccg files')
+option('warnings', type: 'combo', choices: ['no', 'min', 'max', 'fatal'], value: 'fatal',
+ description: 'Compiler warning level')
+option('build-deprecated-api', type: 'boolean', value: true,
+ description: 'Build deprecated API and include it in the library')
+option('build-documentation', type: 'combo', choices: ['false', 'if-maintainer-mode', 'true'],
+ value: 'if-maintainer-mode', description: 'Build and install the documentation')
+option('debug-refcounting', type: 'boolean', value: false,
+ description: 'Print debug messages in connection with reference counting')
+option('build-examples', type: 'boolean', value: true,
+ description: 'Build example programs')
diff --git a/tests/meson.build b/tests/meson.build
new file mode 100644
index 00000000..4b7c5de1
--- /dev/null
+++ b/tests/meson.build
@@ -0,0 +1,63 @@
+# tests
+
+# input: glibmm_dep, giomm_dep
+
+test_programs = [
+# [[dir-name], exe-name, [sources], giomm-example (not just glibmm-example)]
+ [['giomm_asyncresult_sourceobject'], 'test', ['main.cc'], true],
+ [['giomm_ioerror'], 'test', ['main.cc'], true],
+ [['giomm_ioerror_and_iodbuserror'], 'test', ['main.cc'], true],
+ [['giomm_listmodel'], 'test', ['main.cc'], true],
+ [['giomm_memoryinputstream'], 'test', ['main.cc'], true],
+ [['giomm_simple'], 'test', ['main.cc'], true],
+ [['giomm_tls_client'], 'test', ['main.cc'], true],
+ [['glibmm_base64'], 'test', ['main.cc'], false],
+ [['glibmm_binding'], 'test', ['main.cc'], false],
+ [['glibmm_bool_arrayhandle'], 'test', ['main.cc'], false],
+ [['glibmm_bool_vector'], 'test', ['main.cc'], false],
+ [['glibmm_btree'], 'test', ['main.cc'], false],
+ [['glibmm_buildfilename'], 'test', ['main.cc'], false],
+ [['glibmm_bytearray'], 'test', ['main.cc'], false],
+ [['glibmm_date'], 'test', ['main.cc'], false],
+ [['glibmm_interface_implementation'], 'test', ['main.cc'], true],
+ [['glibmm_interface_move'], 'test', ['main.cc'], false],
+ [['glibmm_mainloop'], 'test', ['main.cc'], false],
+ [['glibmm_nodetree'], 'test', ['main.cc'], false],
+ [['glibmm_null_containerhandle'], 'test', ['main.cc'], true],
+ [['glibmm_null_vectorutils'], 'test', ['main.cc'], true],
+ [['glibmm_object_move'], 'test', ['main.cc'], false],
+ [['glibmm_objectbase_move'], 'test', ['main.cc'], false],
+ [['glibmm_refptr'], 'test', ['main.cc'], false],
+ [['glibmm_refptr_sigc_bind'], 'test', ['main.cc'], false],
+ [['glibmm_ustring_compose'], 'test', ['main.cc'], false],
+ [['glibmm_ustring_format'], 'test', ['main.cc'], false],
+ [['glibmm_ustring_make_valid'], 'test', ['main.cc'], false],
+ [['glibmm_ustring_sprintf'], 'test', ['main.cc'], false],
+ [['glibmm_value'], 'test', ['main.cc'], false],
+ [['glibmm_valuearray'], 'test', ['main.cc'], false],
+ [['glibmm_variant'], 'test', ['main.cc'], false],
+ [['glibmm_vector'], 'test', ['main.cc'], true],
+ [['glibmm_weakref'], 'test', ['main.cc'], true],
+]
+
+foreach ex : test_programs
+ dir = ''
+ foreach dir_part : ex[0]
+ dir = dir / dir_part
+ endforeach
+ ex_name = (dir / ex[1]).underscorify()
+ ex_sources = []
+ foreach src : ex[2]
+ ex_sources += dir / src
+ endforeach
+
+ exe_file = executable(ex_name, ex_sources,
+ cpp_args: ['-DGLIBMM_DISABLE_DEPRECATED', '-DGIOMM_DISABLE_DEPRECATED'],
+ dependencies: ex[3] ? giomm_dep : glibmm_dep,
+ gui_app: false,
+ build_by_default: true,
+ install: false,
+ )
+
+ test(ex_name, exe_file)
+endforeach
diff --git a/tools/build_scripts/compile-schemas.py b/tools/build_scripts/compile-schemas.py
new file mode 100755
index 00000000..e0136e32
--- /dev/null
+++ b/tools/build_scripts/compile-schemas.py
@@ -0,0 +1,30 @@
+#!/usr/bin/env python3
+
+# External command, intended to be called with custom_target() in meson.build
+
+# argv[1] argv[2] argv[3]
+# compile-schemas.py <schema_dir> <target_dir> <output_file>
+
+import os
+import sys
+import subprocess
+import shutil
+
+schema_dir = sys.argv[1]
+target_dir = sys.argv[2]
+output_file = sys.argv[3]
+
+# Create the target directory, if it does not exist.
+os.makedirs(target_dir, exist_ok=True)
+
+cmd = [
+ 'glib-compile-schemas',
+ '--strict',
+ '--targetdir=' + target_dir,
+ schema_dir,
+]
+
+result = subprocess.run(cmd)
+if result.returncode == 0:
+ shutil.copy(os.path.join(target_dir, 'gschemas.compiled'), output_file)
+sys.exit(result.returncode)
diff --git a/tools/build_scripts/dummy-header.py b/tools/build_scripts/dummy-header.py
new file mode 100755
index 00000000..8c614645
--- /dev/null
+++ b/tools/build_scripts/dummy-header.py
@@ -0,0 +1,15 @@
+#!/usr/bin/env python3
+
+# External command, intended to be called with custom_target() in meson.build.
+
+# dummy-header.py <output_file>
+
+import os
+import sys
+
+output_file = sys.argv[1]
+
+# A dummy header file is created if it does not exist, but it's never updated.
+if not os.path.isfile(output_file):
+ with open(output_file, 'w') as f:
+ f.write('// Dummy header file. Created and used by meson.build\n')
diff --git a/tools/build_scripts/handle-built-files.py b/tools/build_scripts/handle-built-files.py
new file mode 100755
index 00000000..1b23f166
--- /dev/null
+++ b/tools/build_scripts/handle-built-files.py
@@ -0,0 +1,182 @@
+#!/usr/bin/env python3
+
+# External command, intended to be called with run_command(), custom_target(),
+# meson.add_install_script() and meson.add_dist_script().
+
+# argv[1] argv[2:]
+# handle-built-files.py <subcommand> <xxx>...
+
+import os
+import sys
+import shutil
+import subprocess
+from pathlib import Path
+
+subcommand = sys.argv[1]
+
+# Invoked from custom_target() in meson.build.
+# This is similar to gmmproc() in mm-common's generate-binding.py.
+# It's slightly different because glibmm uses its uninstalled gmmproc.
+def gmmproc():
+ # argv[2] argv[3] argv[4] argv[5] argv[6] argv[7:]
+ # <gmmproc_dir> <pm_dir> <output_file> <basefilename> <src_dir> <m4_dirs>...
+
+ # <gmmproc_dir> is an absolute path in the build directory.
+ # <pm_dir> is an absolute path in the source directory.
+ # <output_file> is a relative or absolute path in the build directory.
+ # <src_dir> is an absolute path in the source directory.
+ # <m4_dirs> are absolute paths in the source directory.
+ gmmproc_dir = sys.argv[2]
+ pm_dir = sys.argv[3]
+ output_file = sys.argv[4]
+ output_dir = os.path.dirname(output_file)
+ basefilename = sys.argv[5] # name without filetype
+ src_dir = sys.argv[6]
+
+ include_m4_dirs = []
+ for dir in sys.argv[7:]:
+ include_m4_dirs += ['-I', dir]
+
+ # Create the private/ directory, if it does not exist.
+ os.makedirs(os.path.join(output_dir, 'private'), exist_ok=True)
+
+ # gmmproc generates output_dir/basefilename.cc, output_dir/basefilename.h
+ # and output_dir/private/{basefilename}_p.h
+ cmd = [
+ 'perl',
+ '-I' + pm_dir,
+ '--',
+ os.path.join(gmmproc_dir, 'gmmproc'),
+ ] + include_m4_dirs + [
+ '--defs',
+ src_dir,
+ basefilename,
+ src_dir,
+ output_dir,
+ ]
+ result = subprocess.run(cmd)
+ if result.returncode:
+ return result.returncode
+
+ # gmmproc does not update the timestamps of output files that have not changed.
+ # That's by design, to avoid unnecessary recompilations.
+ # The updated timestamp of output_file shows meson that this custom_target()
+ # has been updated.
+ Path(output_file).touch(exist_ok=True)
+ return 0
+
+# Invoked from custom_target() in meson.build.
+def build_from_m4():
+ # argv[2] argv[3] argv[4]
+ # <include_dir> <input_file> <output_file>
+
+ include_dir = sys.argv[2]
+ input_file = sys.argv[3]
+ output_file = sys.argv[4]
+
+ # Create the destination directory, if it does not exist.
+ output_dir = os.path.dirname(output_file)
+ os.makedirs(output_dir, exist_ok=True)
+
+ cmd = [
+ 'm4',
+ '-I', include_dir,
+ input_file,
+ ]
+ output_file_obj = open(output_file, mode='w')
+ result = subprocess.run(cmd, stdout=output_file_obj)
+ output_file_obj.close()
+
+ return result.returncode
+
+# Invoked from meson.add_install_script().
+def install_built_h_files():
+ # argv[2] argv[3] argv[4:]
+ # <built_h_dir> <install_subdir> <built_h_files>...
+
+ # <built_h_dir> is an absolute path in the build directory or source directory.
+ # <install_subdir> is an installation directory, relative to {prefix}.
+ built_h_dir = sys.argv[2]
+ install_dir_root = os.path.join(os.getenv('MESON_INSTALL_DESTDIR_PREFIX'), sys.argv[3])
+
+ for file in sys.argv[4:]:
+ path_h = os.path.join(built_h_dir, file)
+ rel_dir = os.path.dirname(file)
+ if rel_dir:
+ install_dir = os.path.join(install_dir_root, rel_dir)
+ else:
+ install_dir = install_dir_root
+ print('Installing ', path_h, ' to ', install_dir)
+
+ # Create the installation directory, if it does not exist.
+ os.makedirs(install_dir, exist_ok=True)
+
+ # shutil.copy2() copies timestamps and some other file metadata.
+ shutil.copy2(path_h, install_dir)
+ return 0
+
+# Invoked from meson.add_dist_script().
+def dist_built_files(is_msvc_files=False):
+ # argv[2] argv[3] argv[4:]
+ # <built_h_cc_dir> <dist_dir> <built_files>...
+
+ # <built_h_cc_dir> is an absolute path in the build directory or source directory.
+ # <dist_dir> is a distribution directory, relative to MESON_DIST_ROOT.
+ built_h_cc_dir = sys.argv[2]
+ dist_dir_root = os.path.join(os.getenv('MESON_DIST_ROOT'), sys.argv[3])
+ dist_dir = dist_dir_root
+
+ # Distribute .h and .cc files built from .m4 files, or generated MSVC files.
+ for file in sys.argv[4:]:
+ if not is_msvc_files:
+ dist_dir = os.path.join(dist_dir_root, os.path.dirname(file))
+
+ # Create the distribution directory, if it does not exist.
+ os.makedirs(dist_dir, exist_ok=True)
+
+ shutil.copy(os.path.join(built_h_cc_dir, file), dist_dir)
+ return 0
+
+# Invoked from run_command() in meson.build.
+def copy_built_files():
+ # argv[2] argv[3] argv[4:]
+ # <from_dir> <to_dir> <file_names>...
+
+ # <from_dir> is an absolute or relative path of the directory to copy from.
+ # <to_dir> is an absolute or relative path of the directory to copy to.
+ from_dir_root = sys.argv[2]
+ to_dir_root = sys.argv[3]
+
+ # Copy some built files if they exist in from_dir, but not in the destination
+ # directory, or if they are not up to date in the destination directory.
+ # (The term "source directory" is avoided here, because from_dir might not
+ # be what Meson calls a source directory as opposed to a build directory.)
+
+ # Copy .h and .cc files built from .m4 files.
+ for file in sys.argv[4:]:
+ from_file = os.path.join(from_dir_root, file)
+ to_file = os.path.join(to_dir_root, file)
+ if os.path.isfile(from_file) and ((not os.path.isfile(to_file))
+ or (os.stat(from_file).st_mtime > os.stat(to_file).st_mtime)):
+
+ # Create the destination directory, if it does not exist.
+ os.makedirs(os.path.dirname(to_file), exist_ok=True)
+
+ shutil.copy(from_file, to_file)
+ return 0
+
+# ----- Main -----
+if subcommand == 'gmmproc':
+ sys.exit(gmmproc())
+if subcommand == 'build_from_m4':
+ sys.exit(build_from_m4())
+if subcommand == 'install_built_h_files':
+ sys.exit(install_built_h_files())
+if subcommand == 'dist_built_files':
+ sys.exit(dist_built_files())
+if subcommand == 'copy_built_files':
+ sys.exit(copy_built_files())
+if subcommand == 'dist_gen_msvc_files':
+ sys.exit(dist_built_files(True))
+print(sys.argv[0], ': illegal subcommand,', subcommand)
+sys.exit(1)
diff --git a/tools/conf_tests/allows_static_inline_npos.cc b/tools/conf_tests/allows_static_inline_npos.cc
new file mode 100644
index 00000000..ac11b5d4
--- /dev/null
+++ b/tools/conf_tests/allows_static_inline_npos.cc
@@ -0,0 +1,21 @@
+// Configuration-time test program, used in Meson build.
+// Check whether a static member variable may be initialized inline to std::string::npos.
+// The MipsPro (IRIX) compiler does not like this.
+// Corresponds to the M4 macro GLIBMM_CXX_ALLOWS_STATIC_INLINE_NPOS.
+
+#include <string>
+#include <iostream>
+
+class ustringtest
+{
+public:
+ // The MipsPro compiler (IRIX) says "The indicated constant value is not known",
+ // so we need to initialize the static member data elsewhere.
+ static const std::string::size_type ustringnpos = std::string::npos;
+};
+
+int main()
+{
+ std::cout << "npos=" << ustringtest::ustringnpos << std::endl;
+ return 0;
+}
diff --git a/tools/conf_tests/can_assign_non_extern_c_functions_to_extern_c_cb.cc b/tools/conf_tests/can_assign_non_extern_c_functions_to_extern_c_cb.cc
new file mode 100644
index 00000000..d3c937fb
--- /dev/null
+++ b/tools/conf_tests/can_assign_non_extern_c_functions_to_extern_c_cb.cc
@@ -0,0 +1,22 @@
+// Configuration-time test program, used in Meson build.
+// Check whether the compiler allows us to use a non-extern "C" function,
+// such as a static member function, to an extern "C" function pointer,
+// such as a GTK callback.
+// Corresponds to the M4 macro GLIBMM_CXX_CAN_ASSIGN_NON_EXTERN_C_FUNCTIONS_TO_EXTERN_C_CALLBACKS.
+
+extern "C"
+{
+struct somestruct
+{
+ void (*callback) (int);
+};
+} // extern "C"
+
+void somefunction(int) {}
+
+int main()
+{
+ somestruct something;
+ something.callback = &somefunction;
+ return 0;
+}
diff --git a/tools/conf_tests/can_use_dynamic_cast_in_unused_template_wo_def.cc b/tools/conf_tests/can_use_dynamic_cast_in_unused_template_wo_def.cc
new file mode 100644
index 00000000..9620d80c
--- /dev/null
+++ b/tools/conf_tests/can_use_dynamic_cast_in_unused_template_wo_def.cc
@@ -0,0 +1,21 @@
+// Configuration-time test program, used in Meson build.
+// Check whether the compiler allows us to define a template that uses
+// dynamic_cast<> with an object whose type is not defined, even if we do
+// not use that template before we have defined the type. This should
+// probably not be allowed anyway.
+// Corresponds to the M4 macro GLIBMM_CXX_CAN_USE_DYNAMIC_CAST_IN_UNUSED_TEMPLATE_WITHOUT_DEFINITION.
+
+class SomeClass;
+
+SomeClass* some_function();
+
+template <class T>
+class SomeTemplate
+{
+ static bool do_something()
+ {
+ // This does not compile with the MipsPro (IRIX) compiler
+ // even if we don't use this template at all.
+ return (dynamic_cast<T*>(some_function()) != 0);
+ }
+};
diff --git a/tools/conf_tests/can_use_namespaces_inside_externc.cc b/tools/conf_tests/can_use_namespaces_inside_externc.cc
new file mode 100644
index 00000000..6d303cf0
--- /dev/null
+++ b/tools/conf_tests/can_use_namespaces_inside_externc.cc
@@ -0,0 +1,25 @@
+// Configuration-time test program, used in Meson build.
+// Check whether the compiler puts extern "C" functions in the global
+// namespace, even inside a namespace declaration. The AIX xlC compiler does
+// this, and also gets confused if we declare the namespace again inside the
+// extern "C" block.
+// Corresponds to the M4 macro GLIBMM_CXX_CAN_USE_NAMESPACES_INSIDE_EXTERNC.
+
+namespace test
+{
+
+extern "C" { void do_something(); }
+
+class Something
+{
+ int i;
+ friend void do_something();
+};
+
+void do_something()
+{
+ Something something;
+ something.i = 1;
+}
+
+} // namespace test
diff --git a/tools/conf_tests/can_use_thread_local.cc b/tools/conf_tests/can_use_thread_local.cc
new file mode 100644
index 00000000..ee21c3c0
--- /dev/null
+++ b/tools/conf_tests/can_use_thread_local.cc
@@ -0,0 +1,5 @@
+// Configuration-time test program, used in Meson build.
+// Check for thread_local support.
+// Corresponds to the M4 macro GLIBMM_CXX_CAN_USE_THREAD_LOCAL.
+
+thread_local int i = 0;
diff --git a/tools/conf_tests/have_disambiguous_const_template_specializations.cc b/tools/conf_tests/have_disambiguous_const_template_specializations.cc
new file mode 100644
index 00000000..3f4eaf1f
--- /dev/null
+++ b/tools/conf_tests/have_disambiguous_const_template_specializations.cc
@@ -0,0 +1,37 @@
+// Configuration-time test program, used in Meson build.
+// Check whether the compiler finds it ambiguous to have both const and
+// non-const template specializations. The SUN Forte compiler has this
+// problem, though we are not 100% sure that it's a C++ standard violation.
+// Corresponds to the M4 macro GLIBMM_CXX_CAN_DISAMBIGUATE_CONST_TEMPLATE_SPECIALIZATIONS.
+
+template <class T> class Foo {};
+
+template <class T> class Traits
+{
+public:
+ const char* whoami() { return "generic template"; }
+};
+
+template <class T> class Traits< Foo<T> >
+{
+public:
+ const char* whoami() { return "partial specialization for Foo<T>"; }
+};
+
+template <class T> class Traits< Foo<const T> >
+{
+public:
+ const char* whoami() { return "partial specialization for Foo<const T>"; }
+};
+
+int main()
+{
+ Traits<int> it;
+ Traits< Foo<int> > fit;
+ Traits< Foo<const int> > cfit;
+
+ (void) it.whoami();
+ (void) fit.whoami();
+ (void) cfit.whoami();
+ return 0;
+}
diff --git a/tools/conf_tests/have_std_iterator_traits.cc b/tools/conf_tests/have_std_iterator_traits.cc
new file mode 100644
index 00000000..1e1f2b0f
--- /dev/null
+++ b/tools/conf_tests/have_std_iterator_traits.cc
@@ -0,0 +1,11 @@
+// Configuration-time test program, used in Meson build.
+// Check for standard-conforming std::iterator_traits<>.
+// Corresponds to the M4 macro GLIBMM_CXX_HAS_STD_ITERATOR_TRAITS.
+
+#include <iterator>
+
+int main()
+{
+ typedef std::iterator_traits<char*>::value_type ValueType;
+ return 0;
+}
diff --git a/tools/conf_tests/have_sun_reverse_iterator.cc b/tools/conf_tests/have_sun_reverse_iterator.cc
new file mode 100644
index 00000000..43721e01
--- /dev/null
+++ b/tools/conf_tests/have_sun_reverse_iterator.cc
@@ -0,0 +1,11 @@
+// Configuration-time test program, used in Meson build.
+// Check for Sun libCstd style std::reverse_iterator,
+// Corresponds to the M4 macro GLIBMM_CXX_HAS_SUN_REVERSE_ITERATOR.
+
+#include <iterator>
+
+int main()
+{
+ typedef std::reverse_iterator<char*, std::random_access_iterator_tag, char, char&, char*, int> ReverseIter;
+ return 0;
+}
diff --git a/tools/conf_tests/have_template_sequence_ctors.cc b/tools/conf_tests/have_template_sequence_ctors.cc
new file mode 100644
index 00000000..6423684b
--- /dev/null
+++ b/tools/conf_tests/have_template_sequence_ctors.cc
@@ -0,0 +1,17 @@
+// Configuration-time test program, used in Meson build.
+// Check whether the STL containers have templated sequence ctors,
+// Corresponds to the M4 macro GLIBMM_CXX_HAS_TEMPLATE_SEQUENCE_CTORS.
+
+#include <vector>
+#include <deque>
+#include <list>
+
+int main()
+{
+ const int array[8] = { 0, };
+ std::vector<int> test_vector(&array[0], &array[8]);
+ std::deque<short> test_deque(test_vector.begin(), test_vector.end());
+ std::list<long> test_list(test_deque.begin(), test_deque.end());
+ test_vector.assign(test_list.begin(), test_list.end());
+ return 0;
+}
diff --git a/tools/conf_tests/have_wide_stream.cc b/tools/conf_tests/have_wide_stream.cc
new file mode 100644
index 00000000..9cfd19dd
--- /dev/null
+++ b/tools/conf_tests/have_wide_stream.cc
@@ -0,0 +1,12 @@
+// Configuration-time test program, used in Meson build.
+// Check whether std::wostringstream exists.
+// Corresponds to some code in configure.ac.
+
+#include <sstream>
+
+int main()
+{
+ std::wostringstream s;
+ (void) s.str();
+ return 0;
+}
diff --git a/tools/conf_tests/member_functions_member_templates.cc b/tools/conf_tests/member_functions_member_templates.cc
new file mode 100644
index 00000000..b005ad57
--- /dev/null
+++ b/tools/conf_tests/member_functions_member_templates.cc
@@ -0,0 +1,41 @@
+// Configuration-time test program, used in Meson build.
+// Test whether the compiler allows member functions to refer to spezialized
+// member function templates.
+// Corresponds to the M4 macro GLIBMM_CXX_MEMBER_FUNCTIONS_MEMBER_TEMPLATES.
+
+struct foo
+{
+ template <class C> inline void doit();
+ void thebug();
+};
+
+template <class C>
+inline void foo::doit()
+{}
+
+struct bar
+{
+ void neitherabug();
+};
+
+void bar::neitherabug()
+{
+ void (foo::*func)();
+ func = &foo::doit<int>;
+ (void)func;
+}
+
+void foo::thebug()
+{
+ void (foo::*func)();
+ func = &foo::doit<int>; // the compiler bugs usually show here
+ (void)func;
+}
+
+int main()
+{
+ void (foo::*func)();
+ func = &foo::doit<int>;
+ (void)func;
+ return 0;
+}
diff --git a/tools/conf_tests/std_time_t_is_not_int32.cc b/tools/conf_tests/std_time_t_is_not_int32.cc
new file mode 100644
index 00000000..5dff2abb
--- /dev/null
+++ b/tools/conf_tests/std_time_t_is_not_int32.cc
@@ -0,0 +1,20 @@
+// Configuration-time test program, used in Meson build.
+// Test whether std::time_t and gint32 are typedefs of the same builting type.
+// If they aren't then they can be used for method overload.
+// Corresponds to the M4 macro GLIBMM_C_STD_TIME_T_IS_NOT_INT32.
+
+#include <ctime>
+
+int main()
+{
+ typedef signed int gint32;
+ class Test
+ {
+ void something(gint32 val)
+ {}
+
+ void something(std::time_t val)
+ {}
+ };
+ return 0;
+}
diff --git a/tools/extra_defs_gen/meson.build b/tools/extra_defs_gen/meson.build
new file mode 100644
index 00000000..900943c9
--- /dev/null
+++ b/tools/extra_defs_gen/meson.build
@@ -0,0 +1,26 @@
+# tools/extra_defs_gen
+
+# Input: is_msvc, glibmm_build_dep, giomm_build_dep, glibmm_api_version,
+# glibmm_libversion
+# Output: -
+
+glibmm_generate_extra_defs_library = library(
+ 'glibmm_generate_extra_defs-' + glibmm_api_version,
+ 'generate_extra_defs.cc',
+ version: glibmm_libversion,
+ cpp_args: '-DGLIBMM_GEN_EXTRA_DEFS_BUILD',
+ dependencies: glibmm_build_dep,
+ install: true,
+)
+
+executable('generate_defs_glib', 'generate_defs_glib.cc',
+ dependencies: glibmm_build_dep,
+ link_with: glibmm_generate_extra_defs_library,
+ install: false,
+)
+
+executable('generate_defs_gio', 'generate_defs_gio.cc',
+ dependencies: giomm_build_dep,
+ link_with: glibmm_generate_extra_defs_library,
+ install: false,
+)
diff --git a/tools/meson.build b/tools/meson.build
new file mode 100644
index 00000000..0bc35106
--- /dev/null
+++ b/tools/meson.build
@@ -0,0 +1,101 @@
+# tools
+
+# Input: perl, m4, install_prefix, install_libdir, glibmm_pcname
+# Output: m4_files, install_m4dir, pm_files, install_pmdir, gmmproc,
+# generate_wrap_init_pl
+
+subdir('extra_defs_gen')
+
+install_procdir = install_libdir / glibmm_pcname / 'proc'
+
+# Configuration data for gmmproc.
+gmmproc_conf_data = configuration_data()
+gmmproc_conf_data.set('PERL', perl.found() ? perl.path() : '')
+gmmproc_conf_data.set('configure_input', 'tools/gmmproc. Generated from gmmproc.in')
+gmmproc_conf_data.set('prefix', install_prefix)
+gmmproc_conf_data.set('exec_prefix', '${prefix}')
+gmmproc_conf_data.set('libdir', '${exec_prefix}' / install_libdir)
+gmmproc_conf_data.set('GLIBMM_MODULE_NAME', glibmm_pcname)
+gmmproc_conf_data.set('M4', m4.found() ? '/'.join(m4.path().split('\\')) : '')
+gmmproc_conf_data.set('PACKAGE_VERSION', meson.project_version())
+
+gmmproc = configure_file(
+ input: 'gmmproc.in',
+ output: '@BASENAME@',
+ configuration: gmmproc_conf_data,
+ install_dir: install_procdir,
+)
+
+# Configuration data for generate_wrap_init.pl.
+gen_wrap_init_conf_data = configuration_data()
+gen_wrap_init_conf_data.set('PERL', perl.found() ? perl.path() : '')
+gen_wrap_init_conf_data.set('configure_input',
+ 'tools/generate_wrap_init.pl. Generated from generate_wrap_init.pl.in')
+
+generate_wrap_init_pl = configure_file(
+ input: 'generate_wrap_init.pl.in',
+ output: '@BASENAME@',
+ configuration: gen_wrap_init_conf_data,
+ install_dir: install_procdir,
+)
+
+# Install m4 files for reuse by other *mm projects, when building from git.
+m4_basefiles = [
+ 'base.m4',
+ 'class_boxedtype.m4',
+ 'class_boxedtype_static.m4',
+ 'class_generic.m4',
+ 'class_gobject.m4',
+ 'class_interface.m4',
+ 'class_opaque_copyable.m4',
+ 'class_opaque_refcounted.m4',
+ 'class_shared.m4',
+ 'compare.m4',
+ 'convert.m4',
+ 'convert_base.m4',
+ 'convert_gio.m4',
+ 'convert_glib.m4',
+ 'convert_glibmm.m4',
+ 'ctor.m4',
+ 'doc.m4',
+ 'enum.m4',
+ 'gerror.m4',
+ 'initialize.m4',
+ 'initialize_base.m4',
+ 'initialize_gio.m4',
+ 'initialize_glib.m4',
+ 'initialize_glibmm.m4',
+ 'member.m4',
+ 'method.m4',
+ 'property.m4',
+ 'signal.m4',
+ 'vfunc.m4',
+]
+m4_files = []
+foreach file : m4_basefiles
+ m4_files += 'm4' / file
+endforeach
+m4_files = files(m4_files)
+install_m4dir = install_procdir / 'm4'
+install_data(m4_files, install_dir: install_m4dir)
+
+# Install pm files for reuse by other *mm projects, when building from git.
+pm_basefiles = [
+ 'DocsParser.pm',
+ 'Enum.pm',
+ 'Function.pm',
+ 'FunctionBase.pm',
+ 'GtkDefs.pm',
+ 'Object.pm',
+ 'Output.pm',
+ 'Property.pm',
+ 'Util.pm',
+ 'WrapParser.pm',
+]
+pm_files = []
+foreach file : pm_basefiles
+ pm_files += 'pm' / file
+endforeach
+pm_files = files(pm_files)
+install_pmdir = install_procdir / 'pm'
+install_data(pm_files, install_dir: install_pmdir)
diff --git a/untracked/README b/untracked/README
new file mode 100644
index 00000000..0b591d40
--- /dev/null
+++ b/untracked/README
@@ -0,0 +1,39 @@
+untracked/README
+
+This directory contains files not tracked by a source code control program,
+such as git. (This README file is the exception.)
+
+The files can have one of two origins.
+
+1. Copied by the mm-common-get command.
+2. Generated when glibmm is built.
+
+Files of type 2 exist here only if glibmm is built with maintainer-mode=false,
+or the directory comes from a tarball.
+Files of both types exist here only if glibmm is built with Meson,
+or the tarball is created with Meson.
+
+1. Files copied by mm-common-get
+--------------------------------
+untracked/docs/doc-install.pl
+ doc-postprocess.pl
+ doxygen-extra.css
+ tagfile-to-devhelp2.xsl
+untracked/build_scripts/dist-build-scripts.py
+ dist-changelog.py
+ doc-reference.py
+ generate-binding.py
+
+mm-common-get may copy more files, but they are not used by glibmm.
+
+2. Generated files
+------------------
+untracked/gio/giomm/*.h
+ *.cc
+ private/*_p.h
+untracked/glib/glibmm/*.h
+ *.cc
+ private/*_p.h
+untracked/docs/reference/glibmm-2.4.devhelp2
+ glibmm-2.4.tag
+ html/*