Merge pull request #808 from thiblahute/gtkdoc
Fix various gtkdoc issues
This commit is contained in:
commit
0a4957627a
|
@ -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):
|
||||
|
|
|
@ -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__':
|
||||
|
|
Loading…
Reference in New Issue