From: John Marshall Date: Wed, 20 May 2020 11:34:44 +0000 (+0100) Subject: build: improve doc build X-Git-Tag: archive/raspbian/1%0.1.106-3+rpi1^2~15^2~8^2~21 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=58e2a1135e3811a3ddcaf93af0f2572e137ce42e;p=babl.git build: improve doc build - change build option to auto/true/false - auto=false if cross build true otherwise - replace xml_insert.sh with python script to allow doc gen on msys --- diff --git a/docs/meson.build b/docs/meson.build index 01b6c30..74984b0 100644 --- a/docs/meson.build +++ b/docs/meson.build @@ -5,7 +5,10 @@ location= 'public_html/babl' scptarget = host + ':' + location + '/' -xml_insert = find_program(join_paths('tools', 'xml_insert.sh')) +xml_insert = find_program( + meson.source_root() / 'tools' / 'xml-insert.py', + native: true +) index_static_html = configure_file( input : 'index-static.html.in', @@ -20,130 +23,85 @@ babl_css = configure_file( ) index_html_tmp_env = [ - 'BABL_PATH='+ join_paths(meson.build_root(), 'extensions'), + 'BABL_PATH=' + meson.build_root() / 'extensions', ] -index_html_tmp = custom_target('index.html.tmp', - input : [ babl_html_dump, ], - output: [ 'index.html.tmp', ], - command: [ - env_bin, - index_html_tmp_env, - babl_html_dump - ], - capture: true, -) - -index_html = custom_target('index.html', - input : [ - index_static_html, - join_paths(meson.source_root(), 'AUTHORS'), - join_paths(meson.source_root(), 'TODO'), - join_paths(meson.source_root(), 'NEWS'), - 'toc', - ], - output: [ 'index.html', ], - command: [ - env_bin, - 'cp', '@INPUT0@', '@OUTPUT@', - '&&', xml_insert, '@OUTPUT@', 'AUTHORS', '@INPUT1@', - '&&', xml_insert, '@OUTPUT@', 'TODO', '@INPUT2@', - '&&', xml_insert, '@OUTPUT@', 'NEWS', '@INPUT3@', - '&&', xml_insert, '@OUTPUT@', 'TOC', '@INPUT4@', - ], - build_by_default: true, -) - -Reference_html = custom_target('Reference.html', - input : [ - 'Reference-static.html', - 'toc', - index_html_tmp, - ], - output: [ 'Reference.html', ], - command: [ - env_bin, - 'cp', '@INPUT0@', '@OUTPUT@', - '&&', xml_insert, '@OUTPUT@', 'TOC', '@INPUT1@', - '&&', xml_insert, '@OUTPUT@', 'BablBase', '@INPUT2@', - ], - build_by_default: true, -) - - -CMYK_html = custom_target('CMYK.html', - input : [ - 'CMYK-static.html', - 'toc', - ], - output: [ 'CMYK.html', ], - command: [ - env_bin, - 'cp', '@INPUT0@', '@OUTPUT@', - '&&', xml_insert, '@OUTPUT@', 'TOC', '@INPUT1@', - ], - build_by_default: true, -) - -OldNews_html = custom_target('OldNews.html', - input : [ - 'OldNews-static.html', - 'toc', - ], - output: [ 'OldNews.html', ], - command: [ - env_bin, - 'cp', '@INPUT0@', '@OUTPUT@', - '&&', xml_insert, '@OUTPUT@', 'TOC', '@INPUT1@', - ], - build_by_default: true, -) - - - -Glossary_html = custom_target('Glossary.html', - input : [ - 'Glossary-static.html', - 'toc', - ], - output: [ 'Glossary.html', ], - command: [ - env_bin, - 'cp', '@INPUT0@', '@OUTPUT@', - '&&', xml_insert, '@OUTPUT@', 'TOC', '@INPUT1@', - ], - build_by_default: true, -) +# Don't build babl ref if cannot run compiled objects in this env +if env_bin.found() and cc_can_run # and not meson.is_cross_build() + index_html_tmp = custom_target('index.html.tmp', + input : [ babl_html_dump, ], + output: [ 'index.html.tmp', ], + command: [ + env_bin, + index_html_tmp_env, + babl_html_dump + ], + capture: true, + ) +else + warning('Cannot create babl reference in this environment') + index_html_tmp = 'index.html.tmp' +endif + +TOC = files('toc') +html_files = { + 'index': [index_static_html, [ + ['AUTHORS', files(meson.source_root() / 'AUTHORS')], + ['TODO', files(meson.source_root() / 'TODO')], + ['NEWS', files(meson.source_root() / 'NEWS')], + ['TOC', TOC], + ]], + 'Reference': ['auto', [ + ['BablBase', index_html_tmp], + ['TOC', TOC], + ]], + 'CMYK': ['auto', [ + ['TOC', TOC] + ]], + 'OldNews': ['auto', [ + ['TOC', TOC], + ]], + 'Glossary': ['auto', [ + ['TOC', TOC], + ]], + 'ColorManagement': ['auto', [ + ['TOC', TOC], + ]], + 'UnifiedAlpha': ['auto', [ + ['TOC', TOC], + ]], +} + +foreach _file, _parms : html_files + if '@0@'.format(_parms[0]) == 'auto' + _in = '@0@-static.html'.format(_file) + else + _in = _parms[0] + endif + _out = '@0@.html'.format(_file) + + inserts = [] + foreach _parm : _parms[1] + inserts += ['--insert', _parm[0], _parm[1]] + endforeach + + _tgt = custom_target(_out, + input: _in, + output: _out, + command: [ + xml_insert, + '--output' , '@OUTPUT@', + inserts, + '@INPUT@', + ], + build_by_default: true + ) + if _file == 'index' + index_html = _tgt + endif +endforeach -ColorManagement_html = custom_target('ColorManagement.html', - input : [ - 'ColorManagement-static.html', - 'toc', - ], - output: [ 'ColorManagement.html', ], - command: [ - env_bin, - 'cp', '@INPUT0@', '@OUTPUT@', - '&&', xml_insert, '@OUTPUT@', 'TOC', '@INPUT1@', - ], - build_by_default: true, -) - -UnifiedAlpha_html = custom_target('UnifiedAlpha.html', - input : [ - 'UnifiedAlpha-static.html', - 'toc', - ], - output: [ 'UnifiedAlpha.html', ], - command: [ - env_bin, - 'cp', '@INPUT0@', '@OUTPUT@', - '&&', xml_insert, '@OUTPUT@', 'TOC', '@INPUT1@', - ], - build_by_default: true, -) - run_target('push_web', command: [ 'scp', index_html, index_static_html, babl_css, scptarget, diff --git a/meson.build b/meson.build index a66bd96..85fd6c3 100644 --- a/meson.build +++ b/meson.build @@ -342,14 +342,22 @@ w3m_bin = find_program('w3m', required: false, native: true) ################################################################################ # Build flags -build_docs = false - -if get_option('with-docs') - if cc_can_run and env_bin.found() and not platform_win32 - build_docs = true - else - warning('Unable to generate docs in this environment') +# Docs - don't build by default in cross-build environments +# can't build if no env binary +build_docs = true +build_docs_msg = '' +if get_option('with-docs') != 'false' and not env_bin.found() + build_docs = false + build_docs_msg = '(env program not available)' + warning('env is required to build documentation') +elif get_option('with-docs') == 'auto' + if meson.is_cross_build() + build_docs = false + build_docs_msg = '(configure with -Ddocs=true to cross-build docs)' endif +elif get_option('with-docs') == 'false' + build_docs = false + build_docs_msg = '(disabled)' endif @@ -376,6 +384,7 @@ if build_docs subdir('docs') endif +# Create README file from web page if w3m_bin.found() and build_docs custom_target('README', input: index_html, @@ -387,6 +396,7 @@ if w3m_bin.found() and build_docs '@INPUT@', ], capture: true, + build_by_default: true ) endif diff --git a/meson_options.txt b/meson_options.txt index 2bc57f6..442eb65 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,7 +1,7 @@ # Optional features option('with-docs', - type: 'boolean', - value: 'true', + type: 'combo', + choices: ['auto', 'true', 'false'], description: 'build documentation' ) option('enable-gir', diff --git a/tools/xml-insert.py b/tools/xml-insert.py new file mode 100644 index 0000000..cbe63dc --- /dev/null +++ b/tools/xml-insert.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python3 +# +# Utility script to insert an xml snippet into an existing document +# +# Re-implements xml_insert.sh in python with extra options to send the +# output to a new file. +# +# Copyright John Marshall 2020 +# + +from __future__ import print_function + +import os +import sys +import argparse + +class Args(): + def __init__(self): + parser = argparse.ArgumentParser() + parser.add_argument( + '--output', + metavar='OUTPUT_FILE', + help='output file - otherwise output to STDOUT' + ) + parser.add_argument( + '--insert', + action='append', + nargs=2, + required=True, + metavar=('TAG', 'INSERT_FILE'), + help='insert file tag and file name' + ) + parser.add_argument( + 'FILE', + metavar='INPUT_FILE', + help='input file' + ) + + self.input = os.path.realpath(parser.parse_args().FILE) + if parser.parse_args().output: + self.output = os.path.realpath(parser.parse_args().output) + else: + self.output = None + self.inserts = parser.parse_args().insert + + +def main(): + args = Args() + + try: + in_file = open(args.input, 'r') + except IOError: + print('cannot access input file ' + args.input, + file=sys.stderr) + sys.exit(1) + + doc = in_file.read().splitlines() + in_file.close() + + # get insert files + inserts = args.inserts + for insert in inserts: + ins_tag = '' + + # find tag instances in input file + indices = [] + for i, line in enumerate(doc): + if ins_tag in line: + indices.append(i) + + if not indices: + print(ins_tag + ' not in input file - skipping', + file=sys.stderr) + continue + + # read in insert file + try: + ins_file = open(os.path.realpath(insert[1]), 'r') + except IOError: + print ('cannot open insert file %s - skipping' % insert[1], + file=sys.stderr) + continue + + if ins_file: + ins_doc = ins_file.read().splitlines() + ins_file.close() + + # insert in reverse order so that remaining inert positions + # remain valid + for index in reversed(indices): + doc[index+1:index+1] = ins_doc + + # output to file or stdout + if args.output: + try: + out_file = open(os.path.realpath(args.output), 'w') + except IOError: + print('cannot open output file %s' % args.output) + sys.exit(1) + else: + out_file = sys.stdout + + for line in doc: + print(line, file=out_file) + + sys.exit(0) + + +if __name__ == "__main__": + main() \ No newline at end of file