diff --git a/manual/build.py b/manual/build.py index 2007d8d578..f8568be0f8 100755 --- a/manual/build.py +++ b/manual/build.py @@ -17,6 +17,8 @@ import sys, os, subprocess, shutil SPHINX_BUILD = 'sphinx-build2' j, d, a = os.path.join, os.path.dirname, os.path.abspath +BASE = d(a(__file__)) + def sphinx_build(language, base, builder='html', bdir='html', t=None, quiet=True): destdir = j(base, bdir) @@ -29,11 +31,12 @@ def sphinx_build(language, base, builder='html', bdir='html', t=None, quiet=True ans += ['-w', j(destdir, 'sphinx-build-warnings.txt')] if t: ans += ['-t', t] - ans += ['-d', j(base, 'doctrees'), '.', destdir] + ans += ['-d', j(base, 'doctrees'), BASE, destdir] print(' '.join(ans)) subprocess.check_call(ans) return destdir + def build_manual(language, base): sb = partial(sphinx_build, language, base) onlinedir = sb(t='online') @@ -41,6 +44,7 @@ def build_manual(language, base): latexdir = sb('mylatex', 'latex') pwd = os.getcwdu() os.chdir(latexdir) + def run_cmd(cmd): p = subprocess.Popen(cmd, stdout=open(os.devnull, 'wb'), stdin=subprocess.PIPE) p.stdin.close() @@ -63,6 +67,7 @@ def build_manual(language, base): from calibre.ebooks.oeb.polish.container import epub_to_azw3 epub_to_azw3(epub_dest) + def build_pot(base): cmd = [SPHINX_BUILD, '-b', 'gettext', '-t', 'online', '-t', 'gettext', '.', base] print (' '.join(cmd)) @@ -70,7 +75,13 @@ def build_pot(base): os.remove(j(base, 'generated.pot')) return base + +def build_man_pages(language, base): + sphinx_build(language, base, builder='man', bdir=language) + + if __name__ == '__main__': + import argparse os.chdir(d(a(__file__))) os.environ['__appname__'] = __appname__ os.environ['__version__'] = __version__ @@ -81,12 +92,20 @@ if __name__ == '__main__': import json os.environ['ALL_USER_MANUAL_LANGUAGES'] = ' '.join(json.load(open('locale/completed.json', 'rb'))) sphinx_build(language, base, t='online', quiet=False) + print ('Manual built in', j(base, 'html')) else: - language, base = sys.argv[1:] + p = argparse.ArgumentParser() + p.add_argument('language', help='The language to build for') + p.add_argument('base', help='The destination directory') + p.add_argument('--man-pages', default=False, action='store_true', help='Build man pages') + args = p.parse_args() + language, base = args.language, args.base if language == 'gettext': build_pot(base) + elif args.man_pages: + os.environ['CALIBRE_OVERRIDE_LANG'] = language + build_man_pages(language, base) else: os.environ['CALIBRE_OVERRIDE_LANG'] = language build_manual(language, base) - if language != 'gettext': - print ('Manual for', language, 'built in', j(base, 'html')) + print ('Manual for', language, 'built in', j(base, 'html')) diff --git a/setup/commands.py b/setup/commands.py index 9f2590bbab..50389cfbef 100644 --- a/setup/commands.py +++ b/setup/commands.py @@ -8,7 +8,7 @@ __docformat__ = 'restructuredtext en' __all__ = [ 'pot', 'translations', 'get_translations', 'iso639', 'iso3166', - 'build', 'mathjax', + 'build', 'mathjax', 'man_pages', 'gui', 'develop', 'install', 'kakasi', 'coffee', 'rapydscript', 'cacerts', 'recent_uas', 'resources', @@ -64,7 +64,7 @@ recent_uas = RecentUAs() rapydscript = RapydScript() from setup.publish import Manual, TagRelease, Stage1, Stage2, \ - Stage3, Stage4, Stage5, Publish, PublishBetas + Stage3, Stage4, Stage5, Publish, PublishBetas, ManPages manual = Manual() tag_release = TagRelease() stage1 = Stage1() @@ -74,6 +74,7 @@ stage4 = Stage4() stage5 = Stage5() publish = Publish() publish_betas = PublishBetas() +man_pages = ManPages() from setup.upload import (UploadUserManual, UploadDemo, UploadInstallers, UploadToServer, ReUpload) diff --git a/setup/publish.py b/setup/publish.py index cc0c18548b..6d99f614f4 100644 --- a/setup/publish.py +++ b/setup/publish.py @@ -271,6 +271,65 @@ class Manual(Command): shutil.rmtree(path) +class ManPages(Command): + + description = '''Build the man pages ''' + + def add_options(self, parser): + parser.add_option('--man-dir', help='Where to generate the man pages') + parser.add_option('--compress-man-pages', default=False, action='store_true', help='Compress the generated man pages') + + def run(self, opts): + self.build_man_pages(opts.man_dir or 'man-pages', opts.compress_man_pages) + + def build_man_pages(self, dest, compress=False): + dest = os.path.abspath(dest) + if os.path.exists(dest): + shutil.rmtree(dest) + os.makedirs(dest) + self.info('\tCreating man pages in {}...'.format(dest)) + base = self.j(self.d(self.SRC), 'manual') + languages = list( + json.load(open(self.j(base, 'locale', 'completed.json'), 'rb')) + ) + languages = ['en'] + list(set(languages) - {'en'}) + os.environ['ALL_USER_MANUAL_LANGUAGES'] = ' '.join(languages) + try: + os.makedirs(dest) + except EnvironmentError: + pass + jobs = [] + for l in languages: + jobs.append(( + ['calibre-debug', self.j(base, 'build.py'), '--', '--man-pages', l, dest], + '\n\n**************** Building translations for: %s' % l) + ) + if not parallel_build(jobs, self.info, verbose=False): + raise SystemExit(1) + shutil.rmtree(self.j(dest, 'doctrees')) + cwd = os.getcwdu() + os.chdir(dest) + try: + for x in os.listdir('.'): + if x == 'en': + os.rename(x, 'man1') + else: + os.mkdir(self.j(x, 'man1')) + for y in os.listdir(x): + if y != 'man1': + os.rename(self.j(x, y), self.j(x, 'man1', y)) + if compress: + jobs = [] + for dirpath, dirnames, filenames in os.walk('.'): + for f in filenames: + if f.endswith('.1'): + jobs.append((['gzip', '--best', self.j(dirpath, f)], '')) + if not parallel_build(jobs, self.info, verbose=False): + raise SystemExit(1) + finally: + os.chdir(cwd) + + class TagRelease(Command): description = 'Tag a new release in git'