summaryrefslogtreecommitdiffstats
path: root/admin
diff options
context:
space:
mode:
Diffstat (limited to 'admin')
-rwxr-xr-xadmin/build-doc161
-rw-r--r--admin/doc-read-the-docs.txt2
-rw-r--r--admin/doc-requirements.txt4
-rwxr-xr-xadmin/serve-doc32
4 files changed, 199 insertions, 0 deletions
diff --git a/admin/build-doc b/admin/build-doc
new file mode 100755
index 00000000..7a23c7d4
--- /dev/null
+++ b/admin/build-doc
@@ -0,0 +1,161 @@
+#!/bin/sh
+
+cd "$(dirname "$0")"
+cd ..
+TOPDIR=`pwd`
+
+install -d -m0755 build-doc
+
+if command -v dpkg >/dev/null; then
+ packages=`cat ${TOPDIR}/doc_deps.deb.txt`
+ for package in $packages; do
+ if [ "$(dpkg --status -- $package 2>&1 | sed -n 's/^Status: //p')" != "install ok installed" ]; then
+ # add a space after old values
+ missing="${missing:+$missing }$package"
+ fi
+ done
+ if [ -n "$missing" ]; then
+ echo "$0: missing required packages, please install them:" 1>&2
+ echo "sudo apt-get install -o APT::Install-Recommends=true $missing" 1>&2
+ exit 1
+ fi
+elif command -v yum >/dev/null; then
+ python_package="python$(rpm --eval '%{python3_pkgversion}')"
+ for package in "$python_package"-devel "$python_package"-pip "$python_package"-virtualenv doxygen ditaa ant libxml2-devel libxslt-devel "$python_package"-Cython graphviz; do
+ if ! rpm -q --whatprovides $package >/dev/null ; then
+ missing="${missing:+$missing }$package"
+ fi
+ done
+ if [ -n "$missing" ]; then
+ echo "$0: missing required packages, please install them:" 1>&2
+ echo "yum install $missing"
+ exit 1
+ fi
+else
+ for command in virtualenv doxygen ant ditaa cython; do
+ command -v "$command" > /dev/null;
+ ret_code=$?
+ if [ $ret_code -ne 0 ]; then
+ # add a space after old values
+ missing="${missing:+$missing }$command"
+ fi
+ done
+ if [ -n "$missing" ]; then
+ echo "$0: missing required command, please install them:" 1>&2
+ echo "$missing"
+ exit 1
+ fi
+fi
+
+# Don't enable -e until after running all the potentially-erroring checks
+# for availability of commands
+set -e
+
+cat $TOPDIR/src/osd/PG.h $TOPDIR/src/osd/PG.cc | $TOPDIR/doc/scripts/gen_state_diagram.py > $TOPDIR/doc/dev/peering_graph.generated.dot
+
+cd build-doc
+
+[ -z "$vdir" ] && vdir="$TOPDIR/build-doc/virtualenv"
+
+if [ ! -e $vdir ]; then
+ virtualenv --python=python3 --system-site-packages $vdir
+fi
+$vdir/bin/pip install --quiet -r $TOPDIR/admin/doc-requirements.txt
+
+install -d -m0755 \
+ $TOPDIR/build-doc/output/html \
+ $TOPDIR/build-doc/output/man
+
+# To avoid having to build librbd to build the Python bindings to build the docs,
+# create a dummy librbd.so that allows the module to be imported by sphinx.
+# the module are imported by the "automodule::" directive.
+mkdir -p $vdir/lib
+export LD_LIBRARY_PATH="$vdir/lib"
+export PYTHONPATH=$TOPDIR/src/pybind
+
+# FIXME(sileht): I dunno how to pass the include-dirs correctly with pip
+# for build_ext step, it should be:
+# --global-option=build_ext --global-option="--cython-include-dirs $TOPDIR/src/pybind/rados/"
+# but that doesn't work, so copying the file in the rbd module directly, that's ok for docs
+for bind in rados rbd cephfs rgw; do
+ if [ ${bind} != rados ]; then
+ cp -f $TOPDIR/src/pybind/rados/rados.pxd $TOPDIR/src/pybind/${bind}/
+ fi
+ ln -sf lib${bind}.so.1 $vdir/lib/lib${bind}.so
+ gcc -shared -o $vdir/lib/lib${bind}.so.1 -xc /dev/null
+ BUILD_DOC=1 \
+ CFLAGS="-iquote$TOPDIR/src/include" \
+ CPPFLAGS="-iquote$TOPDIR/src/include" \
+ LDFLAGS="-L$vdir/lib -Wl,--no-as-needed" \
+ $vdir/bin/pip install --upgrade $TOPDIR/src/pybind/${bind}
+ # rgwfile_version(), librgw_create(), rgw_mount()
+ # since py3.5, distutils adds postfix in between ${bind} and so
+ lib_fn=$vdir/lib/python*/*-packages/${bind}.*.so
+ if [ ! -e $lib_fn ]; then
+ lib_fn=$vdir/lib/python*/*-packages/${bind}.so
+ fi
+ nm $lib_fn | grep -E "U (lib)?${bind}" | \
+ awk '{ print "void "$2"(void) {}" }' | \
+ gcc -shared -o $vdir/lib/lib${bind}.so.1 -xc -
+ if [ ${bind} != rados ]; then
+ rm -f $TOPDIR/src/pybind/${bind}/rados.pxd
+ fi
+done
+
+if [ -z "$@" ]; then
+ sphinx_targets="html man"
+else
+ sphinx_targets=$@
+fi
+for target in $sphinx_targets; do
+ builder=$target
+ case $target in
+ html)
+ builder=dirhtml
+ extra_opt="-D graphviz_output_format=svg"
+ ;;
+ man)
+ extra_opt="-t man"
+ ;;
+ esac
+ # Build with -W so that warnings are treated as errors and this fails
+ $vdir/bin/sphinx-build -W -a -b $builder $extra_opt -d doctrees \
+ $TOPDIR/doc $TOPDIR/build-doc/output/$target
+
+
+done
+
+# build the releases.json. this reads in the yaml version and dumps
+# out the json representation of the same file. the resulting releases.json
+# should be served from the root of hosted site.
+$vdir/bin/python << EOF > $TOPDIR/build-doc/output/html/releases.json
+from __future__ import print_function
+import datetime
+import json
+import yaml
+
+def json_serialize(obj):
+ if isinstance(obj, datetime.date):
+ return obj.isoformat()
+
+with open("$TOPDIR/doc/releases/releases.yml", 'r') as fp:
+ releases = yaml.load(fp)
+ print(json.dumps(releases, indent=2, default=json_serialize))
+EOF
+
+#
+# Build and install JavaDocs
+#
+JAVADIR=$TOPDIR/src/java
+
+# Clean and build JavaDocs
+rm -rf $JAVADIR/doc
+ant -buildfile $JAVADIR/build.xml docs
+
+# Create clean target directory
+JAVA_OUTDIR=$TOPDIR/build-doc/output/html/api/libcephfs-java/javadoc
+rm -rf $JAVA_OUTDIR
+mkdir $JAVA_OUTDIR
+
+# Copy JavaDocs to target directory
+cp -a $JAVADIR/doc/* $JAVA_OUTDIR/
diff --git a/admin/doc-read-the-docs.txt b/admin/doc-read-the-docs.txt
new file mode 100644
index 00000000..b65cc463
--- /dev/null
+++ b/admin/doc-read-the-docs.txt
@@ -0,0 +1,2 @@
+plantweb
+git+https://github.com/readthedocs/readthedocs-sphinx-search@master
diff --git a/admin/doc-requirements.txt b/admin/doc-requirements.txt
new file mode 100644
index 00000000..0af3bde9
--- /dev/null
+++ b/admin/doc-requirements.txt
@@ -0,0 +1,4 @@
+Sphinx == 2.1.2
+git+https://github.com/ceph/sphinx-ditaa.git@py3#egg=sphinx-ditaa
+breathe == 4.13.1
+pyyaml >= 5.1.2
diff --git a/admin/serve-doc b/admin/serve-doc
new file mode 100755
index 00000000..96da048e
--- /dev/null
+++ b/admin/serve-doc
@@ -0,0 +1,32 @@
+#!/usr/bin/python
+from __future__ import print_function
+
+import SimpleHTTPServer
+import SocketServer
+import os
+import sys
+
+path = os.path.dirname(sys.argv[0])
+os.chdir(path)
+os.chdir('..')
+os.chdir('build-doc/output/html')
+
+class ReusingTCPServer(SimpleHTTPServer.SimpleHTTPRequestHandler):
+ allow_reuse_address = True
+
+ def send_head(self):
+ # horrible kludge because SimpleHTTPServer is buggy wrt
+ # slash-redirecting of requests with query arguments, and will
+ # redirect to /foo?q=bar/ -- wrong slash placement
+ self.path = self.path.split('?', 1)[0]
+ return SimpleHTTPServer.SimpleHTTPRequestHandler.send_head(self)
+
+httpd = SocketServer.TCPServer(
+ ("", 8080),
+ ReusingTCPServer,
+ )
+try:
+ print("Serving doc at port: http://localhost:8080")
+ httpd.serve_forever()
+except KeyboardInterrupt:
+ pass