diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2016-09-28 17:03:58 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-28 17:03:58 -0400 |
commit | 0a4957627a1e7bc88a74e9398fdf3b6e17cd7b05 (patch) | |
tree | 4d7f460c09f6d409545cde4e843a62af5ea98784 | |
parent | 154763f81bba9b90d734ba92aa6a992123b273fc (diff) | |
parent | bb3823e6f4f8332be25d33e07af0d6059f304d51 (diff) | |
download | meson-0a4957627a1e7bc88a74e9398fdf3b6e17cd7b05.zip meson-0a4957627a1e7bc88a74e9398fdf3b6e17cd7b05.tar.gz meson-0a4957627a1e7bc88a74e9398fdf3b6e17cd7b05.tar.bz2 |
Merge pull request #808 from thiblahute/gtkdoc
Fix various gtkdoc issues
-rw-r--r-- | mesonbuild/modules/gnome.py | 179 | ||||
-rw-r--r-- | mesonbuild/scripts/gtkdochelper.py | 88 |
2 files changed, 184 insertions, 83 deletions
diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py index 4f72d2f..11abf88 100644 --- a/mesonbuild/modules/gnome.py +++ b/mesonbuild/modules/gnome.py @@ -16,7 +16,7 @@ functionality such as gobject-introspection and gresources.''' from .. import build -import os, sys +import os import subprocess from ..mesonlib import MesonException from .. import dependencies @@ -94,21 +94,20 @@ class GnomeModule: return stdout.split('\n')[:-1] - def get_link_args(self, state, lib, depends): + def get_link_args(self, state, lib, depends=None): link_command = ['-l%s' % lib.name] if isinstance(lib, build.SharedLibrary): link_command += ['-L%s' % os.path.join(state.environment.get_build_dir(), lib.subdir)] - depends.append(lib) + if depends: + depends.append(lib) return link_command def get_include_args(self, state, include_dirs, prefix='-I'): if not include_dirs: return [] - build_to_src = os.path.relpath(state.environment.get_source_dir(), - state.environment.get_build_dir()) dirs_str = [] for incdirs in include_dirs: if hasattr(incdirs, "held_object"): @@ -124,14 +123,72 @@ class GnomeModule: basedir = dirs.get_curdir() for d in dirs.get_incdirs(): expdir = os.path.join(basedir, d) - srctreedir = os.path.join(build_to_src, expdir) - dirs_str += ['%s%s' % (prefix, expdir), + srctreedir = os.path.join(state.environment.get_source_dir(), expdir) + buildtreedir = os.path.join(state.environment.get_build_dir(), expdir) + dirs_str += ['%s%s' % (prefix, buildtreedir), '%s%s' % (prefix, srctreedir)] for d in dirs.get_extra_build_dirs(): dirs_str += ['%s%s' % (prefix, d)] return dirs_str + def get_dependencies_flags(self, deps, state, depends=None): + cflags = set() + ldflags = set() + gi_includes = set() + if not isinstance(deps, list): + deps = [deps] + + for dep in deps: + if hasattr(dep, 'held_object'): + dep = dep.held_object + if isinstance(dep, dependencies.InternalDependency): + cflags.update(self.get_include_args( state, dep.include_directories)) + for lib in dep.libraries: + ldflags.update(self.get_link_args(state, lib.held_object, depends)) + libdepflags = self.get_dependencies_flags(lib.held_object.get_external_deps(), state, depends) + cflags.update(libdepflags[0]) + ldflags.update(libdepflags[1]) + gi_includes.update(libdepflags[2]) + extdepflags = self.get_dependencies_flags(dep.ext_deps, state, depends) + cflags.update(extdepflags[0]) + ldflags.update(extdepflags[1]) + gi_includes.update(extdepflags[2]) + for source in dep.sources: + if isinstance(source.held_object, GirTarget): + gi_includes.update([os.path.join(state.environment.get_build_dir(), + source.held_object.get_subdir())]) + # This should be any dependency other than an internal one. + elif isinstance(dep, dependencies.Dependency): + cflags.update(dep.get_compile_args()) + for lib in dep.get_link_args(): + if (os.path.isabs(lib) and + # For PkgConfigDependency only: + getattr(dep, 'is_libtool', False)): + ldflags.update(["-L%s" % os.path.dirname(lib)]) + libname = os.path.basename(lib) + if libname.startswith("lib"): + libname = libname[3:] + libname = libname.split(".so")[0] + lib = "-l%s" % libname + # Hack to avoid passing some compiler options in + if lib.startswith("-W"): + continue + ldflags.update([lib]) + + if isinstance(dep, dependencies.PkgConfigDependency): + girdir = dep.get_variable("girdir") + if girdir: + gi_includes.update([girdir]) + elif isinstance(dep, (build.StaticLibrary, build.SharedLibrary)): + for incd in dep.get_include_dirs(): + cflags.update(incd.get_incdirs()) + else: + mlog.log('dependency %s not handled to build gir files' % dep) + continue + + return cflags, ldflags, gi_includes + def generate_gir(self, state, args, kwargs): if len(args) != 1: raise MesonException('Gir takes one argument') @@ -221,52 +278,10 @@ class GnomeModule: deps = [deps] deps = (girtarget.get_all_link_deps() + girtarget.get_external_deps() + deps) - for dep in deps: - if hasattr(dep, 'held_object'): - dep = dep.held_object - if isinstance(dep, dependencies.InternalDependency): - scan_command += self.get_include_args( - state, - dep.include_directories) - for lib in dep.libraries: - scan_command += self.get_link_args(state, lib.held_object, - depends) - for source in dep.sources: - if isinstance(source.held_object, GirTarget): - scan_command += [ - "--add-include-path=%s" % ( - os.path.join(state.environment.get_build_dir(), - source.held_object.get_subdir()), - ) - ] - # This should be any dependency other than an internal one. - elif isinstance(dep, dependencies.Dependency): - scan_command += dep.get_compile_args() - for lib in dep.get_link_args(): - if (os.path.isabs(lib) and - # For PkgConfigDependency only: - getattr(dep, 'is_libtool', False)): - scan_command += ["-L%s" % os.path.dirname(lib)] - libname = os.path.basename(lib) - if libname.startswith("lib"): - libname = libname[3:] - libname = libname.split(".so")[0] - lib = "-l%s" % libname - # Hack to avoid passing some compiler options in - if lib.startswith("-W"): - continue - scan_command += [lib] - - if isinstance(dep, dependencies.PkgConfigDependency): - girdir = dep.get_variable("girdir") - if girdir: - scan_command += ["--add-include-path=%s" % (girdir, )] - elif isinstance(dep, (build.StaticLibrary, build.SharedLibrary)): - for incd in dep.get_include_dirs(): - scan_command += incd.get_incdirs() - else: - mlog.log('dependency %s not handled to build gir files' % dep) - continue + cflags, ldflags, gi_includes = self.get_dependencies_flags(deps, state, depends) + scan_command += list(cflags) + list(ldflags) + for i in gi_includes: + scan_command += ['--add-include-path=%s' % i] inc_dirs = kwargs.pop('include_directories', []) if not isinstance(inc_dirs, list): @@ -377,12 +392,40 @@ class GnomeModule: '--modulename=' + modulename] args += self.unpack_args('--htmlargs=', 'html_args', kwargs) args += self.unpack_args('--scanargs=', 'scan_args', kwargs) + args += self.unpack_args('--scanobjsargs=', 'scanobjs_args', kwargs) + args += self.unpack_args('--gobjects-types-file=', 'gobject_typesfile', kwargs, state) args += self.unpack_args('--fixxrefargs=', 'fixxref_args', kwargs) + args += self.unpack_args('--html-assets=', 'html_assets', kwargs, state) + args += self.unpack_args('--content-files=', 'content_files', kwargs, state) + args += self.unpack_args('--installdir=', 'install_dir', kwargs, state) + args += self.get_build_args(kwargs, state) res = [build.RunTarget(targetname, command[0], command[1:] + args, [], state.subdir)] if kwargs.get('install', True): res.append(build.InstallScript(command + args)) return res + def get_build_args(self, kwargs, state): + args = [] + cflags, ldflags, gi_includes = self.get_dependencies_flags(kwargs.get('dependencies', []), state) + inc_dirs = kwargs.get('include_directories', []) + if not isinstance(inc_dirs, list): + inc_dirs = [inc_dirs] + for incd in inc_dirs: + if not isinstance(incd.held_object, (str, build.IncludeDirs)): + raise MesonException( + 'Gir include dirs should be include_directories().') + cflags.update(self.get_include_args(state, inc_dirs)) + if cflags: + args += ['--cflags=%s' % ' '.join(cflags)] + if ldflags: + args += ['--ldflags=%s' % ' '.join(ldflags)] + compiler = state.environment.coredata.compilers.get('c') + if compiler: + args += ['--cc=%s' % ' '.join(compiler.get_exelist())] + args += ['--ld=%s' % ' '.join(compiler.get_linker_exelist())] + + return args + def gtkdoc_html_dir(self, state, args, kwarga): if len(args) != 1: raise MesonException('Must have exactly one argument.') @@ -392,18 +435,24 @@ class GnomeModule: return os.path.join('share/gtkdoc/html', modulename) - def unpack_args(self, arg, kwarg_name, kwargs): - try: - new_args = kwargs[kwarg_name] - if not isinstance(new_args, list): - new_args = [new_args] - for i in new_args: - if not isinstance(i, str): - raise MesonException('html_args values must be strings.') - except KeyError: - return[] - if len(new_args) > 0: - return [arg + '@@'.join(new_args)] + def unpack_args(self, arg, kwarg_name, kwargs, expend_file_state=None): + if kwarg_name not in kwargs: + return [] + + new_args = kwargs[kwarg_name] + if not isinstance(new_args, list): + new_args = [new_args] + args = [] + for i in new_args: + if expend_file_state and isinstance(i, mesonlib.File): + i = os.path.join(expend_file_state.environment.get_build_dir(), i.subdir, i.fname) + elif not isinstance(i, str): + raise MesonException(kwarg_name + ' values must be strings.') + args.append(i) + + if args: + return [arg + '@@'.join(args)] + return [] def gdbus_codegen(self, state, args, kwargs): diff --git a/mesonbuild/scripts/gtkdochelper.py b/mesonbuild/scripts/gtkdochelper.py index 0c87717..e87a379 100644 --- a/mesonbuild/scripts/gtkdochelper.py +++ b/mesonbuild/scripts/gtkdochelper.py @@ -30,7 +30,16 @@ parser.add_argument('--mainfile', dest='mainfile') parser.add_argument('--modulename', dest='modulename') parser.add_argument('--htmlargs', dest='htmlargs', default='') parser.add_argument('--scanargs', dest='scanargs', default='') +parser.add_argument('--scanobjsargs', dest='scanobjsargs', default='') +parser.add_argument('--gobjects-types-file', dest='gobject_typesfile', default='') parser.add_argument('--fixxrefargs', dest='fixxrefargs', default='') +parser.add_argument('--ld', dest='ld', default='') +parser.add_argument('--cc', dest='cc', default='') +parser.add_argument('--ldflags', dest='ldflags', default='') +parser.add_argument('--cflags', dest='cflags', default='') +parser.add_argument('--content-files', dest='content_files', default='') +parser.add_argument('--html-assets', dest='html_assets', default='') +parser.add_argument('--installdir', dest='install_dir') def gtkdoc_run_check(cmd, cwd): p = subprocess.Popen(cmd, cwd=cwd, @@ -45,15 +54,49 @@ def gtkdoc_run_check(cmd, cwd): raise MesonException('\n'.join(err_msg)) def build_gtkdoc(source_root, build_root, doc_subdir, src_subdir, - main_file, module, html_args, scan_args, fixxref_args): + main_file, module, html_args, scan_args, fixxref_args, + gobject_typesfile, scanobjs_args, ld, cc, ldflags, cflags, + html_assets, content_files): + print("Building documentation for %s" % module) + abs_src = os.path.join(source_root, src_subdir) + doc_src = os.path.join(source_root, doc_subdir) abs_out = os.path.join(build_root, doc_subdir) htmldir = os.path.join(abs_out, 'html') + + content_files += [main_file] + sections = os.path.join(doc_src, module + "-sections.txt") + if os.path.exists(sections): + content_files.append(sections) + + # Copy files to build directory + for f in content_files: + f_abs = os.path.join(doc_src, f) + shutil.copyfile(f_abs, os.path.join( + abs_out, os.path.basename(f_abs))) + + shutil.rmtree(htmldir, ignore_errors=True) + try: + os.mkdir(htmldir) + except Exception: + pass + + for f in html_assets: + f_abs = os.path.join(doc_src, f) + shutil.copyfile(f_abs, os.path.join(htmldir, os.path.basename(f_abs))) + scan_cmd = ['gtkdoc-scan', '--module=' + module, '--source-dir=' + abs_src] + scan_args gtkdoc_run_check(scan_cmd, abs_out) + if gobject_typesfile: + scanobjs_cmd = ['gtkdoc-scangobj'] + scanobjs_args + [gobject_typesfile, + '--module=' + module, '--cflags=' + cflags, '--ldflags=' + ldflags] + + gtkdoc_run_check(scanobjs_cmd, abs_out) + + # Make docbook files if main_file.endswith('sgml'): modeflag = '--sgml-mode' @@ -62,21 +105,16 @@ def build_gtkdoc(source_root, build_root, doc_subdir, src_subdir, mkdb_cmd = ['gtkdoc-mkdb', '--module=' + module, '--output-format=xml', + '--expand-content-files=', modeflag, '--source-dir=' + abs_src] - main_abs = os.path.join(source_root, doc_subdir, main_file) if len(main_file) > 0: # Yes, this is the flag even if the file is in xml. mkdb_cmd.append('--main-sgml-file=' + main_file) gtkdoc_run_check(mkdb_cmd, abs_out) # Make HTML documentation - shutil.rmtree(htmldir, ignore_errors=True) - try: - os.mkdir(htmldir) - except Exception: - pass - mkhtml_cmd = ['gtkdoc-mkhtml', + mkhtml_cmd = ['gtkdoc-mkhtml', '--path=' + abs_src, module, ] + html_args @@ -109,28 +147,42 @@ def run(args): scanargs = options.scanargs.split('@@') else: scanargs = [] + if len(options.scanobjsargs) > 0: + scanobjsargs = options.scanobjsargs.split('@@') + else: + scanobjsargs = [] if len(options.fixxrefargs) > 0: fixxrefargs = options.fixxrefargs.split('@@') else: fixxrefargs = [] - build_gtkdoc(options.sourcedir, - options.builddir, - options.subdir, - options.headerdir, - options.mainfile, - options.modulename, - htmlargs, - scanargs, - fixxrefargs) + build_gtkdoc( + options.sourcedir, + options.builddir, + options.subdir, + options.headerdir, + options.mainfile, + options.modulename, + htmlargs, + scanargs, + fixxrefargs, + options.gobject_typesfile, + scanobjsargs, + options.ld, + options.cc, + options.ldflags, + options.cflags, + options.html_assets.split('@@') if options.html_assets else [], + options.content_files.split('@@') if options.content_files else []) if 'MESON_INSTALL_PREFIX' in os.environ: + install_dir = options.install_dir if options.install_dir else options.modulename destdir = os.environ.get('DESTDIR', '') installdir = destdir_join(destdir, os.environ['MESON_INSTALL_PREFIX']) install_gtkdoc(options.builddir, options.subdir, installdir, 'share/gtk-doc/html', - options.modulename) + install_dir) return 0 if __name__ == '__main__': |