diff options
author | Kjell Ahlstedt <kjellahlstedt@gmail.com> | 2020-03-06 15:15:24 +0000 |
---|---|---|
committer | Kjell Ahlstedt <kjellahlstedt@gmail.com> | 2020-03-06 15:15:24 +0000 |
commit | 8676335f0f0fc1854bf905c49c6c3e817ae32332 (patch) | |
tree | 9cb31b6f15b6bdce2c2653ad4478dcc0d85a379e | |
parent | 1156756136e7ffd0c68fe630c6bceb3d6290203b (diff) | |
parent | b8524eeb00a43d8cadcd7732ab2472d92f818de0 (diff) | |
download | glibmm-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
40 files changed, 2495 insertions, 11 deletions
@@ -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/* |