summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/meson/meson/4e312c19e693a69b0650ce6c8a8903163c959996.patch
blob: 76daf019b0709278db843d42282116e01ed73a63 (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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
From 4e312c19e693a69b0650ce6c8a8903163c959996 Mon Sep 17 00:00:00 2001
From: Xavier Claessens <xavier.claessens@collabora.com>
Date: Tue, 11 May 2021 09:18:47 -0400
Subject: [PATCH] gnome: Fix gtkdoc generation

install_scripts used to replace @BUILD_ROOT@ and @SOURCE_ROOT@ but it
was not documented and got removed in Meson 0.58.0. gnome.gtkdoc() was
relying on that behaviour, but it has always been broken in the case the
source or build directory contains spaces.

Fix this by changing get_include_args() to substitue paths directly
which will then get escaped correctly.

Add a unit test that builds GObject documentation which is where this
issue has been spotted.

Fixes: #8744
Upstream-Status: Backport
Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com>
---
 mesonbuild/modules/__init__.py                | 54 +++++++++----------
 mesonbuild/modules/gnome.py                   | 15 +++---
 mesonbuild/modules/hotdoc.py                  |  3 +-
 mesonbuild/modules/qt.py                      |  4 +-
 mesonbuild/modules/windows.py                 |  5 +-
 .../10 gtk-doc/doc/foobar1/foobar-docs.sgml   |  2 +-
 .../doc/foobar1/foobar-sections.txt           | 16 ++++++
 .../10 gtk-doc/doc/foobar1/foobar.types       |  4 ++
 .../10 gtk-doc/doc/foobar1/meson.build        |  6 ++-
 test cases/frameworks/10 gtk-doc/foo.c        | 30 +++++++++++
 .../frameworks/10 gtk-doc/include/foo.h       | 18 +++++++
 test cases/frameworks/10 gtk-doc/meson.build  | 12 +++++
 test cases/frameworks/10 gtk-doc/test.json    |  4 +-
 13 files changed, 127 insertions(+), 46 deletions(-)
 create mode 100644 test cases/frameworks/10 gtk-doc/doc/foobar1/foobar-sections.txt
 create mode 100644 test cases/frameworks/10 gtk-doc/doc/foobar1/foobar.types
 create mode 100644 test cases/frameworks/10 gtk-doc/foo.c

diff --git a/mesonbuild/modules/__init__.py b/mesonbuild/modules/__init__.py
index ddb5e3e6cf3..c0970294c34 100644
--- a/mesonbuild/modules/__init__.py
+++ b/mesonbuild/modules/__init__.py
@@ -56,6 +56,33 @@ def __init__(self, interpreter: 'Interpreter') -> None:
         self.target_machine = interpreter.builtin['target_machine'].held_object
         self.current_node = interpreter.current_node
 
+    def get_include_args(self, include_dirs, prefix='-I'):
+        if not include_dirs:
+            return []
+
+        srcdir = self.environment.get_source_dir()
+        builddir = self.environment.get_build_dir()
+
+        dirs_str = []
+        for dirs in unholder(include_dirs):
+            if isinstance(dirs, str):
+                dirs_str += [f'{prefix}{dirs}']
+                continue
+
+            # Should be build.IncludeDirs object.
+            basedir = dirs.get_curdir()
+            for d in dirs.get_incdirs():
+                expdir = os.path.join(basedir, d)
+                srctreedir = os.path.join(srcdir, expdir)
+                buildtreedir = os.path.join(builddir, expdir)
+                dirs_str += [f'{prefix}{buildtreedir}',
+                             f'{prefix}{srctreedir}']
+            for d in dirs.get_extra_build_dirs():
+                dirs_str += [f'{prefix}{d}']
+
+        return dirs_str
+
+
 class ModuleObject:
     """Base class for all objects returned by modules
     """
@@ -71,33 +98,6 @@ def __init__(self, interpreter: T.Optional['Interpreter'] = None) -> None:
 class ExtensionModule(ModuleObject):
     pass
 
-def get_include_args(include_dirs, prefix='-I'):
-    '''
-    Expand include arguments to refer to the source and build dirs
-    by using @SOURCE_ROOT@ and @BUILD_ROOT@ for later substitution
-    '''
-    if not include_dirs:
-        return []
-
-    dirs_str = []
-    for dirs in unholder(include_dirs):
-        if isinstance(dirs, str):
-            dirs_str += [f'{prefix}{dirs}']
-            continue
-
-        # Should be build.IncludeDirs object.
-        basedir = dirs.get_curdir()
-        for d in dirs.get_incdirs():
-            expdir = os.path.join(basedir, d)
-            srctreedir = os.path.join('@SOURCE_ROOT@', expdir)
-            buildtreedir = os.path.join('@BUILD_ROOT@', expdir)
-            dirs_str += [f'{prefix}{buildtreedir}',
-                         f'{prefix}{srctreedir}']
-        for d in dirs.get_extra_build_dirs():
-            dirs_str += [f'{prefix}{d}']
-
-    return dirs_str
-
 def is_module_library(fname):
     '''
     Check if the file is a library-like file generated by a module-specific
diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py
index d0b053d4f76..c91cda66f8b 100644
--- a/mesonbuild/modules/gnome.py
+++ b/mesonbuild/modules/gnome.py
@@ -26,7 +26,6 @@
 from .. import mesonlib
 from .. import interpreter
 from . import GResourceTarget, GResourceHeaderTarget, GirTarget, TypelibTarget, VapiTarget
-from . import get_include_args
 from . import ExtensionModule
 from . import ModuleReturnValue
 from ..mesonlib import (
@@ -394,7 +393,7 @@ def _get_dependencies_flags(self, deps, state, depends, include_rpath=False,
                     gi_includes.update([girdir])
             if isinstance(dep, InternalDependency):
                 cflags.update(dep.get_compile_args())
-                cflags.update(get_include_args(dep.include_directories))
+                cflags.update(state.get_include_args(dep.include_directories))
                 for lib in unholder(dep.libraries):
                     if isinstance(lib, build.SharedLibrary):
                         internal_ldflags.update(self._get_link_args(state, lib, depends, include_rpath))
@@ -443,7 +442,7 @@ def _get_dependencies_flags(self, deps, state, depends, include_rpath=False,
                     else:
                         external_ldflags.update([lib])
             elif isinstance(dep, (build.StaticLibrary, build.SharedLibrary)):
-                cflags.update(get_include_args(dep.get_include_dirs()))
+                cflags.update(state.get_include_args(dep.get_include_dirs()))
                 depends.append(dep)
             else:
                 mlog.log(f'dependency {dep!r} not handled to build gir files')
@@ -853,7 +852,7 @@ def generate_gir(self, state, args, kwargs):
         scan_command += self._scan_header(kwargs)
         scan_command += self._scan_extra_args(kwargs)
         scan_command += ['-I' + srcdir, '-I' + builddir]
-        scan_command += get_include_args(girtargets_inc_dirs)
+        scan_command += state.get_include_args(girtargets_inc_dirs)
         scan_command += ['--filelist=' + self._make_gir_filelist(state, srcdir, ns, nsversion, girtargets, libsources)]
         scan_command += self._scan_link_withs(state, depends, kwargs)
         scan_command += self._scan_include(state, depends, gir_inc_dirs, kwargs)
@@ -863,8 +862,8 @@ def generate_gir(self, state, args, kwargs):
         scan_command += ['--cflags-begin']
         scan_command += cflags
         scan_command += ['--cflags-end']
-        scan_command += get_include_args(inc_dirs)
-        scan_command += get_include_args(list(gi_includes) + gir_inc_dirs + inc_dirs, prefix='--add-include-path=')
+        scan_command += state.get_include_args(inc_dirs)
+        scan_command += state.get_include_args(list(gi_includes) + gir_inc_dirs + inc_dirs, prefix='--add-include-path=')
         scan_command += list(internal_ldflags)
         scan_command += self._scan_gir_targets(state, girtargets)
         scan_command += self._scan_langs(state, [lc[0] for lc in langs_compilers])
@@ -886,7 +885,7 @@ def generate_gir(self, state, args, kwargs):
 
         typelib_output = f'{ns}-{nsversion}.typelib'
         typelib_cmd = [gicompiler, scan_target, '--output', '@OUTPUT@']
-        typelib_cmd += get_include_args(gir_inc_dirs, prefix='--includedir=')
+        typelib_cmd += state.get_include_args(gir_inc_dirs, prefix='--includedir=')
 
         for incdir in typelib_includes:
             typelib_cmd += ["--includedir=" + incdir]
@@ -1127,7 +1126,7 @@ def _get_build_args(self, kwargs, state, depends):
                     'Gir include dirs should be include_directories().')
 
         cflags.extend(deps_cflags)
-        cflags.extend(get_include_args(inc_dirs))
+        cflags.extend(state.get_include_args(inc_dirs))
         ldflags = []
         ldflags.extend(internal_ldflags)
         ldflags.extend(external_ldflags)
diff --git a/mesonbuild/modules/hotdoc.py b/mesonbuild/modules/hotdoc.py
index bf8cd229c0d..89a5d938ea7 100644
--- a/mesonbuild/modules/hotdoc.py
+++ b/mesonbuild/modules/hotdoc.py
@@ -22,7 +22,6 @@
 from mesonbuild.coredata import MesonException
 from . import ModuleReturnValue
 from . import ExtensionModule
-from . import get_include_args
 from ..dependencies import Dependency, InternalDependency
 from ..interpreterbase import FeatureNew, InvalidArguments, noPosargs, noKwargs
 from ..interpreter import CustomTargetHolder
@@ -191,7 +190,7 @@ def process_dependencies(self, deps):
         for dep in mesonlib.listify(ensure_list(deps)):
             dep = getattr(dep, "held_object", dep)
             if isinstance(dep, InternalDependency):
-                inc_args = get_include_args(dep.include_directories)
+                inc_args = self.state.get_include_args(dep.include_directories)
                 cflags.update([self.replace_dirs_in_string(x)
                                for x in inc_args])
                 cflags.update(self.process_dependencies(dep.libraries))
diff --git a/mesonbuild/modules/qt.py b/mesonbuild/modules/qt.py
index b7389bd59af..1bf0099d1df 100644
--- a/mesonbuild/modules/qt.py
+++ b/mesonbuild/modules/qt.py
@@ -23,7 +23,7 @@
 from ..mesonlib import MesonException, extract_as_list, File, unholder, version_compare
 from ..dependencies import Dependency
 import xml.etree.ElementTree as ET
-from . import ModuleReturnValue, get_include_args, ExtensionModule
+from . import ModuleReturnValue, ExtensionModule
 from ..interpreterbase import noPosargs, permittedKwargs, FeatureNew, FeatureNewKwargs
 from ..interpreter import extract_required_kwarg
 from ..programs import NonExistingExternalProgram
@@ -239,7 +239,7 @@ def preprocess(self, state, args, kwargs):
             ui_gen = build.Generator([self.uic], ui_kwargs)
             ui_output = ui_gen.process_files(f'Qt{self.qt_version} ui', ui_files, state)
             sources.append(ui_output)
-        inc = get_include_args(include_dirs=include_directories)
+        inc = state.get_include_args(include_dirs=include_directories)
         compile_args = []
         for dep in unholder(dependencies):
             if isinstance(dep, Dependency):
diff --git a/mesonbuild/modules/windows.py b/mesonbuild/modules/windows.py
index d7a86380885..c4fdc196681 100644
--- a/mesonbuild/modules/windows.py
+++ b/mesonbuild/modules/windows.py
@@ -19,7 +19,6 @@
 from .. import mlog
 from .. import mesonlib, build
 from ..mesonlib import MachineChoice, MesonException, extract_as_list, unholder
-from . import get_include_args
 from . import ModuleReturnValue
 from . import ExtensionModule
 from ..interpreter import CustomTargetHolder
@@ -83,12 +82,12 @@ def compile_resources(self, state, args, kwargs):
         wrc_depends = extract_as_list(kwargs, 'depends', pop = True)
         for d in wrc_depends:
             if isinstance(d, CustomTargetHolder):
-                extra_args += get_include_args([d.outdir_include()])
+                extra_args += state.get_include_args([d.outdir_include()])
         inc_dirs = extract_as_list(kwargs, 'include_directories', pop = True)
         for incd in inc_dirs:
             if not isinstance(incd.held_object, (str, build.IncludeDirs)):
                 raise MesonException('Resource include dirs should be include_directories().')
-        extra_args += get_include_args(inc_dirs)
+        extra_args += state.get_include_args(inc_dirs)
 
         rescomp, rescomp_type = self._find_resource_compiler(state)
         if rescomp_type == ResourceCompilerType.rc:
diff --git a/test cases/frameworks/10 gtk-doc/doc/foobar1/foobar-docs.sgml b/test cases/frameworks/10 gtk-doc/doc/foobar1/foobar-docs.sgml
index 95f73efdf45..6ccd087dc18 100644
--- a/test cases/frameworks/10 gtk-doc/doc/foobar1/foobar-docs.sgml	
+++ b/test cases/frameworks/10 gtk-doc/doc/foobar1/foobar-docs.sgml	
@@ -35,7 +35,7 @@
     </partintro>
     <xi:include href="xml/foo.xml"/>
     <xi:include href="../../include/bar.xml"/>
-    <xi:include href="xml/foo-version.xml"/>
+    <xi:include href="xml/version.xml"/>
   </reference>
 
 </book>
diff --git a/test cases/frameworks/10 gtk-doc/doc/foobar1/foobar-sections.txt b/test cases/frameworks/10 gtk-doc/doc/foobar1/foobar-sections.txt
new file mode 100644
index 00000000000..d14c8dab010
--- /dev/null
+++ b/test cases/frameworks/10 gtk-doc/doc/foobar1/foobar-sections.txt	
@@ -0,0 +1,16 @@
+<SECTION>
+<FILE>foo</FILE>
+<TITLE>FooObj</TITLE>
+FooObj
+FooObjClass
+foo_do_something
+</SECTION>
+
+<SECTION>
+<FILE>version</FILE>
+<TITLE>version</TITLE>
+FOO_MAJOR_VERSION
+FOO_MINOR_VERSION
+FOO_MICRO_VERSION
+</SECTION>
+
diff --git a/test cases/frameworks/10 gtk-doc/doc/foobar1/foobar.types b/test cases/frameworks/10 gtk-doc/doc/foobar1/foobar.types
new file mode 100644
index 00000000000..0a9c046f3ed
--- /dev/null
+++ b/test cases/frameworks/10 gtk-doc/doc/foobar1/foobar.types	
@@ -0,0 +1,4 @@
+% This include is useless it's a regression test for https://github.com/mesonbuild/meson/issues/8744
+#include <foo.h>
+
+foo_obj_get_type
diff --git a/test cases/frameworks/10 gtk-doc/doc/foobar1/meson.build b/test cases/frameworks/10 gtk-doc/doc/foobar1/meson.build
index 149c6e956aa..f4b3724dbae 100644
--- a/test cases/frameworks/10 gtk-doc/doc/foobar1/meson.build	
+++ b/test cases/frameworks/10 gtk-doc/doc/foobar1/meson.build	
@@ -1,5 +1,9 @@
 gnome.gtkdoc('foobar',
-  src_dir : inc,
+  src_dir : [inc, '.'],
   main_sgml : 'foobar-docs.sgml',
   content_files : [docbook, version_xml],
+  dependencies: foo_dep,
+  # Manually written types file for regression test:
+  # https://github.com/mesonbuild/meson/issues/8744
+  gobject_typesfile: 'foobar.types',
   install : true)
diff --git a/test cases/frameworks/10 gtk-doc/foo.c b/test cases/frameworks/10 gtk-doc/foo.c
new file mode 100644
index 00000000000..36c0639ec08
--- /dev/null
+++ b/test cases/frameworks/10 gtk-doc/foo.c	
@@ -0,0 +1,30 @@
+#include <foo.h>
+
+
+struct _FooObj {
+  GObject parent;
+  int dummy;
+};
+
+G_DEFINE_TYPE(FooObj, foo_obj, G_TYPE_OBJECT)
+
+static void foo_obj_init (FooObj *self)
+{
+}
+
+static void foo_obj_class_init (FooObjClass *klass)
+{
+}
+
+/**
+ * foo_do_something:
+ * @self: self
+ *
+ * Useless function.
+ *
+ * Returns: 0.
+ */
+int foo_do_something(FooObj *self)
+{
+  return 0;
+}
diff --git a/test cases/frameworks/10 gtk-doc/include/foo.h b/test cases/frameworks/10 gtk-doc/include/foo.h
index 7b8946b6a86..510f3d1ecb5 100644
--- a/test cases/frameworks/10 gtk-doc/include/foo.h	
+++ b/test cases/frameworks/10 gtk-doc/include/foo.h	
@@ -1,5 +1,7 @@
 #pragma once
 
+#include <glib-object.h>
+
 /**
  * FooIndecision:
  * @FOO_MAYBE:     Something maybe
@@ -13,3 +15,19 @@ typedef enum {
     FOO_POSSIBLY,
 } FooIndecision;
 
+/**
+ * FooObjClass:
+ *
+ * The class
+ */
+
+/**
+ * FooObj:
+ *
+ * The instance
+ */
+
+#define FOO_TYPE_OBJ foo_obj_get_type()
+G_DECLARE_FINAL_TYPE(FooObj, foo_obj, FOO, OBJ, GObject)
+
+int foo_do_something(FooObj *self);
diff --git a/test cases/frameworks/10 gtk-doc/meson.build b/test cases/frameworks/10 gtk-doc/meson.build
index 5c22ad0afa4..292980fafa7 100644
--- a/test cases/frameworks/10 gtk-doc/meson.build	
+++ b/test cases/frameworks/10 gtk-doc/meson.build	
@@ -24,4 +24,16 @@ if gtkdoc_ver.version_compare('<1.26')
   error('MESON_SKIP_TEST gtk-doc test requires gtkdoc >= 1.26.')
 endif
 
+gobject = dependency('gobject-2.0')
+
+libfoo = library('foo', 'foo.c',
+  include_directories: inc,
+  dependencies: gobject,
+)
+
+foo_dep = declare_dependency(
+  link_with: libfoo,
+  include_directories: inc,
+)
+
 subdir('doc')
diff --git a/test cases/frameworks/10 gtk-doc/test.json b/test cases/frameworks/10 gtk-doc/test.json
index c44126cc741..03ad0595817 100644
--- a/test cases/frameworks/10 gtk-doc/test.json	
+++ b/test cases/frameworks/10 gtk-doc/test.json	
@@ -4,8 +4,8 @@
     {"type": "file", "file": "usr/share/gtk-doc/html/foobar/BAR.html"},
     {"type": "file", "file": "usr/share/gtk-doc/html/foobar/foobar.devhelp2"},
     {"type": "file", "file": "usr/share/gtk-doc/html/foobar/foobar.html"},
-    {"type": "file", "file": "usr/share/gtk-doc/html/foobar/foobar-foo.html"},
-    {"type": "file", "file": "usr/share/gtk-doc/html/foobar/foobar-foo-version.html"},
+    {"type": "file", "file": "usr/share/gtk-doc/html/foobar/FooObj.html"},
+    {"type": "file", "file": "usr/share/gtk-doc/html/foobar/foo-version.html"},
     {"type": "file", "file": "usr/share/gtk-doc/html/foobar/home.png"},
     {"type": "file", "file": "usr/share/gtk-doc/html/foobar/index.html"},
     {"type": "file", "file": "usr/share/gtk-doc/html/foobar/left.png"},