ceph/admin/build-doc
Hector Martin 9cca28a917 pybind: convert librbd bindings to Cython
ctypes is fundamentally incapable of providing safe callback support
(exceptions during callbacks are not handled properly). To fix this, and also
gain more flexibility, rewrite/port the librbd bindings to Cython instead.
Other Python bindings are expected to migrate to Cython in the future.

Reference: http://tracker.ceph.com/issues/13115

To support this, this change also:
- Introduces a Makefile for pybind which calls setup.py
- Updates the installation files for packages
- Adds a hack to admin/build-doc to build a dummy librbd, avoiding the need to
  build the entire client library just to generate documentation (Sphinx needs
  to be able to import rbd.so, which depends on librbd.so symbols).

With contributions by Josh Durgin <jdurgin@redhat.com>

Signed-off-by: Hector Martin <marcan@marcan.st>
2015-12-02 00:41:17 +09:00

101 lines
2.9 KiB
Bash
Executable File

#!/bin/sh
cd "$(dirname "$0")"
cd ..
TOPDIR=`pwd`
install -d -m0755 build-doc
if command -v dpkg >/dev/null; then
for package in python-dev python-pip python-virtualenv doxygen ditaa ant libxml2-dev libxslt1-dev cython; do
if [ "$(dpkg --status -- $package|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 $missing"
exit 1
fi
elif command -v yum >/dev/null; then
for package in python-devel python-pip python-virtualenv doxygen ditaa ant libxml-devel libxslt-devel Cython; do
if ! rpm -q $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 src/osd/PG.h src/osd/PG.cc | doc/scripts/gen_state_diagram.py > doc/dev/peering_graph.generated.dot
cd build-doc
[ -z "$vdir" ] && vdir="./virtualenv"
if [ ! -e $vdir ]; then
virtualenv --system-site-packages $vdir
fi
$vdir/bin/pip install --quiet -r ../admin/doc-requirements.txt
install -d -m0755 \
output/html \
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.
mkdir -p $vdir/lib
export LD_LIBRARY_PATH="$vdir/lib"
export PYTHONPATH=`pwd`/../src/pybind
ln -sf librbd.so.1 $vdir/lib/librbd.so
gcc -shared -o $vdir/lib/librbd.so.1 -xc /dev/null
CFLAGS="-iquote `pwd`/../src/include" \
CPPFLAGS="-iquote `pwd`/../src/include" \
LDFLAGS="-L$vdir/lib -Wl,--no-as-needed" \
$vdir/bin/pip install `pwd`/../src/pybind
nm $vdir/lib/python*/*-packages/rbd.so | grep 'U rbd_' | \
awk '{ print "void "$2"(void) {}" }' | \
gcc -shared -o $vdir/lib/librbd.so.1 -xc -
$vdir/bin/sphinx-build -a -n -b dirhtml -d doctrees ../doc output/html
$vdir/bin/sphinx-build -a -b man -d doctrees ../doc output/man
#
# 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=output/html/api/libcephfs-java/javadoc
rm -rf $JAVA_OUTDIR
mkdir $JAVA_OUTDIR
# Copy JavaDocs to target directory
cp -a $JAVADIR/doc/* $JAVA_OUTDIR/