1# glib/glibmm
2
3# Input: glibmm_build_dep, glibmm_pcname, maintainer_mode, project_source_root,
4#        generate_binding_py, handle_built_files_py, m4_files, pm_files,
5#        glibmm_libversion, install_includedir, python3, glibmm_rc, gmmproc_dir,
6#        is_host_windows, gmmproc, generate_wrap_init_pl
7# Output: glibmm_hg_ccg_basenames, glibmm_extra_h_files, built_files_root,
8#         glibmm_built_h_file_targets, glibmm_dep
9
10glibmm_defs_basefiles = [
11  'glib.defs',
12  'glib_enums.defs',
13  'glib_functions.defs',
14  'glib_signals.defs',
15  'glib_extra_objects.defs',
16  'gmodule_enums.defs',
17  'gmodule_functions.defs',
18  'gobject_enums.defs',
19  'gobject_functions.defs',
20  'glib_docs.xml',
21  'glib_docs_override.xml',
22]
23
24glibmm_defs_files = []
25foreach file : glibmm_defs_basefiles
26  glibmm_defs_files += '..' / 'src' / file
27endforeach
28
29# Generated from pairs of .hg and .ccg files.
30glibmm_hg_ccg_basenames = [
31  'balancedtree',
32  'binding',
33  'bytes',
34  'bytearray',
35  'checksum',
36  'convert',
37  'date',
38  'datetime',
39  'enums',
40  'fileutils',
41  'iochannel',
42  'keyfile',
43  'markup',
44  'miscutils',
45  'module',
46  'nodetree',
47  'optioncontext',
48  'optionentry',
49  'optiongroup',
50  'regex',
51  'shell',
52  'spawn',
53  'thread',
54  'threads',
55  'timezone',
56  'unicode',
57  'uriutils',
58  'valuearray',
59  'variant',
60  'variantdict',
61  'variantiter',
62  'varianttype',
63]
64
65# Generated from .m4 files.
66glibmm_h_m4_files = [
67  'value_basictypes.h',
68  'variant_basictypes.h',
69]
70
71glibmm_cc_m4_files = [
72  'value_basictypes.cc',
73  'variant_basictypes.cc',
74]
75
76# Pairs of hand-coded .h and .cc files.
77glibmm_extra_h_cc_basenames = [
78  'arrayhandle',
79  'base64',
80  'class',
81  'containers',
82  'debug',
83  'dispatcher',
84  'error',
85  'exception',
86  'exceptionhandler',
87  'extraclassinit',
88  'init',
89  'interface',
90  'main',
91  'object',
92  'objectbase',
93  'pattern',
94  'property',
95  'propertyproxy',
96  'propertyproxy_base',
97  'quark',
98  'random',
99  'sarray',
100  'signalproxy',
101  'signalproxy_connectionnode',
102  'streamiochannel',
103  'stringutils',
104  'threadpool',
105  'timer',
106  'timeval',
107  'ustring',
108  'utility',
109  'value',
110  'value_custom',
111  'variantdbusstring',
112  'vectorutils',
113  'wrap',
114]
115
116glibmm_extra_h_files = [
117  'containerhandle_shared.h',
118  'helperlist.h',
119  'i18n-lib.h',
120  'i18n.h',
121  'listhandle.h',
122  'priorities.h',
123  'refptr.h',
124  'slisthandle.h',
125  'weakref.h',
126  'wrap_init.h',
127]
128
129glibmm_extra_ph_files = [
130  'private' / 'interface_p.h',
131  'private' / 'object_p.h',
132]
133
134glibmm_extra_cc_files = []
135
136foreach file : glibmm_extra_h_cc_basenames
137  glibmm_extra_h_files += file + '.h'
138  glibmm_extra_cc_files += file + '.cc'
139endforeach
140
141install_headers('..' / 'glibmm.h', subdir: glibmm_pcname)
142install_headers(glibmm_extra_h_files, subdir: glibmm_pcname / 'glibmm')
143install_headers(glibmm_extra_ph_files, subdir: glibmm_pcname / 'glibmm' / 'private')
144
145untracked_glibmm = 'untracked' / 'glib' / 'glibmm'
146src_untracked_glibmm = project_source_root / untracked_glibmm
147
148extra_glibmm_objects = []
149glibmm_cpp_args = [ '-DGLIBMM_BUILD=1' ]
150
151# Build the .rc file for Windows builds and link to it
152if is_host_windows
153  windows = import('windows')
154  glibmm_res = windows.compile_resources(glibmm_rc)
155  extra_glibmm_objects += glibmm_res
156endif
157
158if maintainer_mode
159
160  # Maintainer mode. Generate .h and .cc files from .hg and .ccg files in ../src.
161
162  # docs/reference/meson.build needs these.
163  built_files_root = project_build_root
164  glibmm_built_h_file_targets = []
165
166  # Force meson+ninja to generate source files before anything is compiled.
167  # Compilation must depend on these targets.
168  glibmm_built_cc_file_targets = []
169
170  hg_files = []
171  foreach file : glibmm_hg_ccg_basenames
172    hg_files += '..' / 'src' / file + '.hg'
173  endforeach
174
175  # Create wrap_init.cc in project_build_root/glib/glibmm.
176  glibmm_built_cc_file_targets += custom_target('glibmm-wrap_init.cc',
177    input: hg_files,
178    output: 'wrap_init.cc',
179    command: [
180      python3, generate_binding_py, 'generate_wrap_init',
181      gmmproc_dir,
182      '@OUTPUT@',
183      'Glib', # namespace
184      '@INPUT@',
185    ],
186    depend_files: generate_wrap_init_pl,
187    build_by_default: maintainer_mode,
188    install: false,
189  )
190
191  # Create .h/_p.h/.cc files in project_build_root/glib/glibmm
192  # from .hg/.ccg files in project_source_root/glib/src.
193  foreach file : glibmm_hg_ccg_basenames
194    hg_file = '..' / 'src' / file + '.hg'
195    ccg_file = '..' / 'src' / file + '.ccg'
196    built_file_target = custom_target('glibmm-' + file + '.cc',
197      input: [hg_file, ccg_file],
198      output: [file + '.stamp', file + '.cc', file + '.h'],
199      command: [
200        python3, handle_built_files_py, 'gmmproc',
201        gmmproc_dir,
202        project_source_root / 'tools' / 'pm',
203        '@OUTPUT0@',
204        file,
205        meson.current_source_dir() / '..' / 'src',
206        project_source_root / 'tools' / 'm4',
207      ],
208      depend_files: glibmm_defs_files + m4_files + [gmmproc] + pm_files,
209      build_by_default: maintainer_mode,
210      install: false,
211    )
212    glibmm_built_cc_file_targets += built_file_target[1]
213    glibmm_built_h_file_targets += built_file_target[2]
214  endforeach
215
216  # Create .h and .cc files in project_build_root/glib/glibmm
217  # from .m4 files in project_source_root/glib/src.
218  foreach output_file : glibmm_h_m4_files + glibmm_cc_m4_files
219    input_file = '..' / 'src' / output_file + '.m4'
220    built_file_target = custom_target('glibmm-' + output_file,
221      input: input_file,
222      output: output_file,
223      command: [
224        python3, handle_built_files_py, 'build_from_m4',
225        meson.current_source_dir() / '..' / 'src',
226        '@INPUT@',
227        '@OUTPUT@',
228      ],
229      depend_files: '..' / 'src' / 'template.macros.m4',
230      build_by_default: maintainer_mode,
231      install: false,
232    )
233    if output_file.endswith('.cc')
234      glibmm_built_cc_file_targets += built_file_target
235    else
236      glibmm_built_h_file_targets += built_file_target
237    endif
238  endforeach
239
240  # Create dummy_header.h, depending on all generated headers.
241  # It's created if it does not exist, but it's never updated.
242  # It guarantees that all generated headers are built before glibmm_library
243  # is built, at the same time avoiding unnecessary recompilations.
244  # If glibmm_built_h_file_targets would be listed as sources to glibmm_library,
245  # all generated .cc files could be recompiled if one generated .h file has
246  # been changed.
247  built_dummy_h_file_target = custom_target('glibmm-dummy_header.h',
248    input: glibmm_built_h_file_targets,
249    output: 'dummy_header.h',
250    command: [
251      python3, dummy_header_py,
252      '@OUTPUT@',
253    ],
254    build_by_default: maintainer_mode,
255    install: false,
256  )
257
258  extra_include_dirs = ['..']
259
260  glibmm_library = library(glibmm_pcname, extra_glibmm_objects,
261    glibmm_built_cc_file_targets, glibmm_extra_cc_files, built_dummy_h_file_target,
262    include_directories: extra_include_dirs,
263    cpp_args: glibmm_cpp_args,
264    version: glibmm_libversion,
265    dependencies: glibmm_build_dep,
266    install: true,
267  )
268
269  built_h_cc_dir = meson.current_build_dir()
270
271else # not maintainer_mode
272
273  # Not maintainer mode. Compile built source code files in
274  # project_source_root/untracked/glib/glibmm.
275
276  # docs/reference/meson.build needs these.
277  built_files_root = project_source_root / 'untracked'
278  glibmm_built_h_file_targets = []
279
280  # Two cases:
281  # 1. The source code comes from a tarball, where the built files
282  #    are stored in project_source_root/untracked.
283  #    There are no built files in the build tree.
284  # 2. Files have been built in the build tree. Then maintainer_mode has
285  #    been changed from true to false. Files that are missing or not up to date
286  #    in project_source_root/untracked are copied from the build tree.
287
288  # Try to copy built source code files to the source tree.
289  run_command(
290    python3, generate_binding_py, 'copy_built_files',
291    meson.current_build_dir(),
292    src_untracked_glibmm,
293    glibmm_hg_ccg_basenames,
294  )
295  run_command(
296    python3, handle_built_files_py, 'copy_built_files',
297    meson.current_build_dir(),
298    src_untracked_glibmm,
299    glibmm_h_m4_files + glibmm_cc_m4_files,
300  )
301
302  built_cc_files = [ src_untracked_glibmm / 'wrap_init.cc' ]
303  foreach file : glibmm_hg_ccg_basenames
304    built_cc_files += src_untracked_glibmm / file + '.cc'
305  endforeach
306  foreach file : glibmm_cc_m4_files
307    built_cc_files += src_untracked_glibmm / file
308  endforeach
309
310  extra_include_dirs = [ '..', '..' / '..' / 'untracked' / 'glib' ]
311
312  glibmm_library = library(glibmm_pcname, extra_glibmm_objects,
313    built_cc_files, glibmm_extra_cc_files,
314    include_directories: extra_include_dirs,
315    cpp_args: glibmm_cpp_args,
316    version: glibmm_libversion,
317    dependencies: glibmm_build_dep,
318    install: true,
319  )
320
321  built_h_cc_dir = src_untracked_glibmm
322
323endif
324
325# Install built .h and _p.h files.
326meson.add_install_script(
327  python3.path(), generate_binding_py, 'install_built_h_files',
328  built_h_cc_dir,
329  install_includedir / glibmm_pcname / 'glibmm', # subdir below {prefix}
330  glibmm_hg_ccg_basenames
331)
332# Install .h files built from .m4 files.
333meson.add_install_script(
334  python3.path(), handle_built_files_py, 'install_built_h_files',
335  built_h_cc_dir,
336  install_includedir / glibmm_pcname / 'glibmm', # subdir below {prefix}
337  glibmm_h_m4_files,
338)
339
340if not meson.is_subproject()
341  # Distribute built files.
342  # (add_dist_script() is not allowed in a subproject)
343  meson.add_dist_script(
344    python3.path(), generate_binding_py, 'dist_built_files',
345    built_h_cc_dir,
346    untracked_glibmm,
347    glibmm_hg_ccg_basenames,
348  )
349  meson.add_dist_script(
350    python3.path(), handle_built_files_py, 'dist_built_files',
351    built_h_cc_dir,
352    untracked_glibmm,
353    glibmm_h_m4_files + glibmm_cc_m4_files,
354  )
355endif
356
357# This is useful in the main project when glibmm is used as a subproject.
358# It's also used when building example programs and test programs.
359glibmm_dep = declare_dependency(
360  sources: glibmm_built_h_file_targets,
361  link_with: glibmm_library,
362  include_directories: extra_include_dirs,
363  dependencies: glibmm_build_dep,
364)
365