summaryrefslogtreecommitdiff
path: root/skeletonmm/skeleton/skeletonmm/meson.build
blob: ae36c58d234b821db82ca5b083f7e77ada578128 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# skeleton/skeletonmm

# Input: skeletonmm_build_dep, skeletonmm_pcname, maintainer_mode, project_source_root,
#        generate_binding, m4_files, skeletonmm_libversion, install_includedir,
#        dist_cmd, python3
# Output: hg_ccg_basenames, extra_h_files, built_file_targets, built_files_root,
#         skeletonmm_dep

defs_basefiles = [
  'skeleton.defs',
  'skeleton_methods.defs',
  'skeleton_enums.defs',
  'skeleton_signals.defs',
  'skeleton_vfuncs.defs',
  'skeleton_docs.xml',
]

defs_files = []
foreach file : defs_basefiles
  defs_files += '..' / 'src' / file
endforeach

hg_ccg_basenames = [
  'skeleton',
]

extra_cc_files = [
]

extra_h_files = [
  'wrap_init.h',
]

install_headers('..' / 'skeletonmm.h', subdir: skeletonmm_pcname)
install_headers(extra_h_files, subdir: skeletonmm_pcname / 'skeletonmm')

untracked_skeletonmm = 'untracked' / 'skeleton' / 'skeletonmm'
src_untracked_skeletonmm = project_source_root / untracked_skeletonmm

if maintainer_mode

  # Maintainer mode. Generate .h and .cc files from .hg and .ccg files in ../src.

  # doc/reference/meson.build needs this.
  built_files_root = project_build_root

  hg_files = []
  foreach file : hg_ccg_basenames
    hg_files += '..' / 'src' / file + '.hg'
  endforeach

  # Create wrap_init.cc in project_build_root/skeleton/skeletonmm.
  wrap_init_target = custom_target('wrap_init.cc',
    input: hg_files,
    output: 'wrap_init.cc',
    command: [
      python3, generate_binding, 'generate_wrap_init',
      gmmproc_dir,
      '@OUTPUT@',
      'Skeleton', # namespace
      '@INPUT@',
    ],
    build_by_default: maintainer_mode,
    install: false,
  )

  # Force meson+ninja to generate source files before anything is compiled.
  # Compilation must depend on these targets.
  built_file_targets = []

  # Create .h/_p.h/.cc files from .hg/.ccg files in project_build_root/skeleton/skeletonmm.
  foreach file : hg_ccg_basenames
    hg_file = '..' / 'src' / file + '.hg'
    ccg_file = '..' / 'src' / file + '.ccg'
    built_file_targets += custom_target(file + '.cc',
      input: [hg_file, ccg_file],
      output: [file + '.stamp', file + '.cc'],
      command: [
        python3, generate_binding, 'gmmproc',
        gmmproc_dir,
        '@OUTPUT0@',
        file,
        meson.current_source_dir() / '..' / 'src',
        project_source_root / 'tools' / 'm4',
      ],
      depend_files: defs_files + m4_files,
      build_by_default: maintainer_mode,
      install: false,
    )
  endforeach

  extra_include_dirs = ['..']
  skeletonmm_library = library(skeletonmm_pcname,
    wrap_init_target, built_file_targets, extra_cc_files,
    version: skeletonmm_libversion,
    include_directories: extra_include_dirs,
    dependencies: skeletonmm_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/skeleton/skeletonmm.

  # doc/reference/meson.build needs these.
  built_file_targets = []
  built_files_root = project_source_root / 'untracked'

  # 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, 'copy_built_files',
    meson.current_build_dir(),
    src_untracked_skeletonmm,
    hg_ccg_basenames,
  )

  built_cc_files = [ src_untracked_skeletonmm / 'wrap_init.cc' ]
  foreach file : hg_ccg_basenames
    built_cc_files += src_untracked_skeletonmm / file + '.cc'
  endforeach

  extra_include_dirs = [ '..', '..' / '..' / 'untracked' / 'skeleton' ]
  skeletonmm_library = library(skeletonmm_pcname,
    built_cc_files, extra_cc_files,
    version: skeletonmm_libversion,
    include_directories: extra_include_dirs,
    dependencies: skeletonmm_build_dep,
    install: true,
  )

  built_h_cc_dir = src_untracked_skeletonmm

endif

# Install built .h and _p.h files.
meson.add_install_script(
  python3.path(), generate_binding, 'install_built_h_files',
  built_h_cc_dir,
  install_includedir / skeletonmm_pcname / 'skeletonmm', # subdir below {prefix}
  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(), dist_cmd,
    python3.path(), generate_binding, 'dist_built_files',
    built_h_cc_dir,
    untracked_skeletonmm,
    hg_ccg_basenames,
  )
endif

# This is useful in the main project when skeletonmm is used as a subproject.
# It's also used when building example programs and test programs.
skeletonmm_dep = declare_dependency(
  link_with: skeletonmm_library,
  include_directories: extra_include_dirs,
  dependencies: skeletonmm_build_dep
)