python: docs processing
[gpgme.git] / lang / python / post_installer.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3
4 # Copyright (C) 2016-2018 g10 Code GmbH
5 # Copyright (C) 2015 Ben McGinnes <ben@adversary.org>
6 #
7 # This library is free software; you can redistribute it and/or
8 # modify it under the terms of the GNU Lesser General Public
9 # License as published by the Free Software Foundation; either
10 # version 2.1 of the License, or (at your option) any later version.
11 #
12 # This library is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 # Lesser General Public License for more details.
16 #
17 # You should have received a copy of the GNU Lesser General Public
18 # License along with this library; if not, write to the Free Software
19 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
20
21 from __future__ import absolute_import, print_function, unicode_literals
22
23 import glob
24 import os
25 import os.path
26 import shutil
27 import subprocess
28 import sys
29 import sysconfig
30
31 from shutil import which
32
33 del absolute_import, print_function, unicode_literals
34
35 try:
36     emacs = os.path.realpath(which("emacs"))
37 except TypeError as e:
38     emacs = None
39
40 try:
41     makeinfo = os.path.realpath(which("makeinfo"))
42 except TypeError as e:
43     makeinfo = None
44
45 try:
46     pandoc = os.path.realpath(which("pandoc"))
47 except TypeError as e:
48     pandoc = None
49
50 try:
51     texinfo = os.path.realpath(which("texinfo"))
52 except TypeError as e:
53     texinfo = None
54
55 docsrc = glob.glob('doc/src/**/*', recursive=True)
56
57 for srcdoc in docsrc:
58     process = subprocess.Popen([emacs, srcdoc, "--batch", "-f",
59                                 "org-texinfo-export-to-texinfo", "--kill"],
60                                 stdout=subprocess.PIPE)
61     procom = process.communicate()
62
63 doctexi1 = glob.glob('doc/src/**/*.texi', recursive=True)
64 doctexi2 = []
65 doctexi3 = []
66
67 for texi in doctexi1:
68     doctexi2.append(os.path.realpath(texi))
69
70 for texdoc in doctexi2:
71     newtex = texdoc.replace("doc/src/", "doc/texinfo/")
72     doctexi3.append(newtex)
73     with open(texdoc, "r") as f:
74         badtex = f.read()
75     goodtex = badtex.replace("@documentencoding UTF-8\n",
76                              "@documentencoding utf-8\n")
77     with open(newtex, "w") as f:
78         f.write(goodtex)
79
80 for srcdoc in docsrc:
81     rstdoc = "{0}.rst".format(srcdoc.replace("doc/src/", "doc/rst/"))
82     process = subprocess.Popen([pandoc, "-f", "org", "-t", "rst+smart", "-o",
83                                 rstdoc, srcdoc], stdout=subprocess.PIPE)
84     procom = process.communicate()
85
86 with open("doc/rst/index.rst", "r") as f:
87     genindex = f.readlines()
88
89 indextop = ['.. GPGME Python Bindings documentation master file, created by\n',
90             '   sphinx-quickstart on Wed Dec  5 09:04:47 2018.\n',
91             '   You can adapt this file completely to your liking, but it should at least\n',
92             '   contain the root `toctree` directive.\n', '\n',
93             'GPGME Python Bindings\n', '=====================\n', '\n',
94             '.. toctree::\n', '   :maxdepth: 3\n', '   :caption: Contents:\n',
95             '\n']
96
97 with open("doc/rst/index.rst", "w") as f:
98     for line in indextop:
99         f.write(line)
100     for line in genindex[5:]:
101         f.write(line)
102
103 with open("doc/rst/Makefile", "w") as f:
104     f.write("""# Minimal makefile for Sphinx documentation
105 #
106
107 # You can set these variables from the command line.
108 SPHINXOPTS    =
109 SPHINXBUILD   = sphinx-build
110 SOURCEDIR     = .
111 BUILDDIR      = _build
112
113 # Put it first so that "make" without argument is like "make help".
114 help:
115         @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
116
117 .PHONY: help Makefile
118
119 # Catch-all target: route all unknown targets to Sphinx using the new
120 # "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
121 %: Makefile
122         @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
123 """)
124
125 print("""
126 You may now generate your preferred documentation format with either Sphinx 
127 or Texinfo.
128 """)
129
130 info_path = os.path.realpath(sysconfig._PREFIX + "/share/info")
131 info_paths = os.environ["INFOPATH"].split(":")
132
133 if info_paths.count(info_path) == 0:
134     info_paths.insert(0, info_path)
135 else:
136     pass
137
138 for ipath in info_paths:
139     if os.path.exists(os.path.realpath(ipath)) is False:
140         info_paths.remove(ipath)
141     else:
142         pass
143
144 # This will very likely require root or sudo access, so running this script
145 # with the same access as used to install the bindings in the first place is
146 # highly recommended.
147 #
148 # bash variant (run in lang/python/doc/texinfo/):
149 #
150 # for x in *.texi:
151 #     makeinfo -v --no-split $x
152 # done ;
153 #
154 # Or to generate HTML:
155 #
156 # for x in *.texi:
157 #     makeinfo -v --no-split --html $x
158 # done ;