summaryrefslogtreecommitdiff
path: root/glib/glibmm
diff options
context:
space:
mode:
authorKjell Ahlstedt <kjellahlstedt@gmail.com>2020-03-01 13:30:00 +0100
committerKjell Ahlstedt <kjellahlstedt@gmail.com>2020-03-01 13:30:00 +0100
commitd378578484718d267bf429ef2e6eded695446b46 (patch)
treee0a38dc5fc9848012df87e56a460f74401f0e487 /glib/glibmm
parent1df52bb90b7ca3780043b16acf5bb5eb483876f8 (diff)
downloadglibmm-d378578484718d267bf429ef2e6eded695446b46.tar.gz
Add support for building glibmm with Meson
glibmm can be built with either Autotools or Meson. See MR !27
Diffstat (limited to 'glib/glibmm')
-rw-r--r--glib/glibmm/meson.build373
1 files changed, 373 insertions, 0 deletions
diff --git a/glib/glibmm/meson.build b/glib/glibmm/meson.build
new file mode 100644
index 00000000..29acfdac
--- /dev/null
+++ b/glib/glibmm/meson.build
@@ -0,0 +1,373 @@
+# 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
+# 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',
+ 'timezone',
+ 'unicode',
+ 'uriutils',
+ '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 = [
+ 'base64',
+ 'class',
+ 'debug',
+ 'dispatcher',
+ 'error',
+ 'exceptionhandler',
+ 'extraclassinit',
+ 'init',
+ 'interface',
+ 'main',
+ 'object',
+ 'objectbase',
+ 'pattern',
+ 'property',
+ 'propertyproxy',
+ 'propertyproxy_base',
+ 'quark',
+ 'random',
+ 'signalproxy',
+ 'signalproxy_connectionnode',
+ 'stringutils',
+ 'timer',
+ 'ustring',
+ 'utility',
+ 'value',
+ 'value_custom',
+ 'variantdbusstring',
+ 'vectorutils',
+ 'wrap',
+]
+
+glibmm_extra_h_files = [
+ 'containerhandle_shared.h',
+ 'i18n-lib.h',
+ 'i18n.h',
+ 'priorities.h',
+ 'refptr.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@',
+ ],
+ 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 + 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 = ['..']
+ glibmm_library = library(glibmm_pcname,
+ glibmm_built_cc_file_targets, glibmm_extra_cc_files, built_dummy_h_file_target,
+ version: glibmm_libversion,
+ include_directories: extra_include_dirs,
+ cpp_args: '-DGLIBMM_BUILD=1',
+ dependencies: glibmm_build_dep,
+ install: true,
+ )
+
+ 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,
+ )
+
+ 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,
+ )
+
+ built_h_cc_dir = src_untracked_glibmm
+
+endif
+
+# 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,
+)