aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2021-05-11 09:18:47 -0400
committerXavier Claessens <xclaesse@gmail.com>2021-05-12 15:54:37 -0400
commit4e312c19e693a69b0650ce6c8a8903163c959996 (patch)
tree6f0eee6b0281536078d9b105a4985f504c9b930b
parent44acefd8365c0ccca428e5ef69153c059aa8e575 (diff)
downloadmeson-4e312c19e693a69b0650ce6c8a8903163c959996.zip
meson-4e312c19e693a69b0650ce6c8a8903163c959996.tar.gz
meson-4e312c19e693a69b0650ce6c8a8903163c959996.tar.bz2
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
-rw-r--r--mesonbuild/modules/__init__.py54
-rw-r--r--mesonbuild/modules/gnome.py15
-rw-r--r--mesonbuild/modules/hotdoc.py3
-rw-r--r--mesonbuild/modules/qt.py4
-rw-r--r--mesonbuild/modules/windows.py5
-rw-r--r--test cases/frameworks/10 gtk-doc/doc/foobar1/foobar-docs.sgml2
-rw-r--r--test cases/frameworks/10 gtk-doc/doc/foobar1/foobar-sections.txt16
-rw-r--r--test cases/frameworks/10 gtk-doc/doc/foobar1/foobar.types4
-rw-r--r--test cases/frameworks/10 gtk-doc/doc/foobar1/meson.build6
-rw-r--r--test cases/frameworks/10 gtk-doc/foo.c30
-rw-r--r--test cases/frameworks/10 gtk-doc/include/foo.h18
-rw-r--r--test cases/frameworks/10 gtk-doc/meson.build12
-rw-r--r--test cases/frameworks/10 gtk-doc/test.json4
13 files changed, 127 insertions, 46 deletions
diff --git a/mesonbuild/modules/__init__.py b/mesonbuild/modules/__init__.py
index ddb5e3e..c097029 100644
--- a/mesonbuild/modules/__init__.py
+++ b/mesonbuild/modules/__init__.py
@@ -56,6 +56,33 @@ class ModuleState:
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 @@ class ModuleObject:
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 d0b053d..c91cda6 100644
--- a/mesonbuild/modules/gnome.py
+++ b/mesonbuild/modules/gnome.py
@@ -26,7 +26,6 @@ from .. import mlog
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 @@ class GnomeModule(ExtensionModule):
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 @@ class GnomeModule(ExtensionModule):
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 @@ class GnomeModule(ExtensionModule):
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 @@ class GnomeModule(ExtensionModule):
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 @@ class GnomeModule(ExtensionModule):
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 @@ class GnomeModule(ExtensionModule):
'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 bf8cd22..89a5d93 100644
--- a/mesonbuild/modules/hotdoc.py
+++ b/mesonbuild/modules/hotdoc.py
@@ -22,7 +22,6 @@ from mesonbuild import mlog, build
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 @@ class HotdocTargetBuilder:
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 b7389bd..1bf0099 100644
--- a/mesonbuild/modules/qt.py
+++ b/mesonbuild/modules/qt.py
@@ -23,7 +23,7 @@ from .. import mesonlib
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 @@ class QtBaseModule(ExtensionModule):
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 d7a8638..c4fdc19 100644
--- a/mesonbuild/modules/windows.py
+++ b/mesonbuild/modules/windows.py
@@ -19,7 +19,6 @@ import re
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 @@ class WindowsModule(ExtensionModule):
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 95f73ef..6ccd087 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 0000000..d14c8da
--- /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 0000000..0a9c046
--- /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 149c6e9..f4b3724 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 0000000..36c0639
--- /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 7b8946b..510f3d1 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 5c22ad0..292980f 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 c44126c..03ad059 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"},