diff options
author | Xavier Claessens <xavier.claessens@collabora.com> | 2021-05-11 09:18:47 -0400 |
---|---|---|
committer | Xavier Claessens <xclaesse@gmail.com> | 2021-05-12 15:54:37 -0400 |
commit | 4e312c19e693a69b0650ce6c8a8903163c959996 (patch) | |
tree | 6f0eee6b0281536078d9b105a4985f504c9b930b /mesonbuild/modules | |
parent | 44acefd8365c0ccca428e5ef69153c059aa8e575 (diff) | |
download | meson-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
Diffstat (limited to 'mesonbuild/modules')
-rw-r--r-- | mesonbuild/modules/__init__.py | 54 | ||||
-rw-r--r-- | mesonbuild/modules/gnome.py | 15 | ||||
-rw-r--r-- | mesonbuild/modules/hotdoc.py | 3 | ||||
-rw-r--r-- | mesonbuild/modules/qt.py | 4 | ||||
-rw-r--r-- | mesonbuild/modules/windows.py | 5 |
5 files changed, 39 insertions, 42 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: |