71fed56e4a
The "which" utility is not guaranteed to be installed either, and if it is, its behavior is not portable either. This means that when various programs are installed, the `which` check will report a fatal error because the which tool did not exist and the shell returned a nonzero status when attempting to fork+exec. If it did exist, it might not be an implementation of `which` that returns nonzero when commands do not exist. The general scripting suggestion is to use the "command -v" shell builtin; this is required to exist in all POSIX 2008 compliant shells, and is thus guaranteed to work everywhere. For some in-depth discussions on the topic, see: - https://mywiki.wooledge.org/BashFAQ/081 - https://unix.stackexchange.com/questions/85249/why-not-use-which-what-to-use-then/85250#85250 Examples of open-source shells likely to be installed as /bin/sh on Linux, which implement the 15-year-old standard: ash, bash, busybox, dash, ksh, mksh and zsh. This commit updates the build system to configure and build correctly on systems without `which`. Change-Id: I23dbde5c7f104dd610fd5f78c82bf9a7d0cc1930 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/160663 Tested-by: Jenkins Tested-by: Ilmari Lauhakangas <ilmari.lauhakangas@libreoffice.org> Reviewed-by: Ilmari Lauhakangas <ilmari.lauhakangas@libreoffice.org>
281 lines
8.1 KiB
Bash
Executable file
281 lines
8.1 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
#
|
|
# This file is part of the LibreOffice project.
|
|
#
|
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
#
|
|
# Doxygen / README doc generation
|
|
#
|
|
# See git for contributors
|
|
#
|
|
|
|
function header {
|
|
title=$1
|
|
breadcrumb=$2
|
|
output=$3
|
|
|
|
cat - > $output <<EOF
|
|
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
|
<html>
|
|
<head>
|
|
<title>$title</title>
|
|
|
|
<style>
|
|
* { margin: 0; padding: 0; }
|
|
body { font-family: sans-serif; font-size: 12px; }
|
|
#head { padding: 20px; background: #00A500; }
|
|
#head a { color: #000; }
|
|
#body { padding: 20px; }
|
|
#foot { padding: 10px; font-size: 9px; border-top: 1px #18A303 solid; margin-top: 25px; }
|
|
p { line-height: 1.7em; margin-bottom: 1em; }
|
|
pre { margin-bottom: 0.5em; }
|
|
.multi-col { -moz-column-width: 20em; -webkit-column-width: 20em; -moz-column-gap: 1em; -webkit-column-gap: 1em; }
|
|
h1 { margin-bottom: 0.5em; }
|
|
h2,h3,h4 { margin: 1.3em 0 0.5em 0; }
|
|
ul, ol { margin: 0.5em 1.5em; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div id="head">
|
|
<h1>$title</h1>
|
|
<p>$breadcrumb</p>
|
|
</div>
|
|
<div id="body" style="multi-col">
|
|
EOF
|
|
}
|
|
|
|
function footer {
|
|
output=$1
|
|
|
|
cat - >> $output <<EOF
|
|
|
|
</div>
|
|
<div id="foot">
|
|
<small>
|
|
<p>Generated by Libreoffice <a href="https://git.libreoffice.org/core/+/refs/heads/master/solenv/bin/mkdocs.sh">Module Description Tool</a></p>
|
|
<p>Last updated:
|
|
EOF
|
|
LANG= date >> $output
|
|
cat - >> $output <<EOF
|
|
</p>
|
|
</small>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
EOF
|
|
|
|
}
|
|
|
|
function proc_text {
|
|
# Local links: [[...]]
|
|
# Git links: [git:...]
|
|
# Other remote links: [...]
|
|
# Headings: == bleh ==
|
|
# Paragraphs: \n\n
|
|
sed -re ' s/\[\[([-_a-zA-Z0-9]+)\]\]/<a href="\1.html">\1<\/a>/g' - \
|
|
| sed -re ' s/\[git:([^]]+)\]/<a href="https:\/\/git.libreoffice.org\/core\/+\/refs\/heads\/master\/\1">\1<\/a>/g' \
|
|
| sed -re ' s/\[([^]]+)\]/<a href="\1">\1<\/a>/g' \
|
|
| sed -re ' s/====([^=]+)====/<h4>\1<\/h4>/g' \
|
|
| sed -re ' s/===([^=]+)===/<h3>\1<\/h3>/g' \
|
|
| sed -re ' s/==([^=]+)==/<h2>\1<\/h2>/g' \
|
|
| sed -re ':a;N;$!ba;s/\n\n/<\/p><p>/g' \
|
|
| awk 'BEGIN { print "<p>" } { print } END { print "</p>" }'
|
|
}
|
|
|
|
function proc_text_markdown {
|
|
sed -re ' s/\[git:([^]]+)\]/<a href="\.\.\/\1">\1<\/a>/g'
|
|
}
|
|
|
|
function check_cmd {
|
|
cmds_needed="$1"
|
|
error_msg="$2"
|
|
|
|
found=0; cmd=
|
|
for cmd_needed in $cmds_needed; do
|
|
command -v $cmd_needed > /dev/null && { found=1; cmd=$cmd_needed; }
|
|
done
|
|
if [ $found = 0 ]; then
|
|
echo "$error_msg" >&2
|
|
exit 1
|
|
fi
|
|
export "${cmds_needed%% *}"=$cmd
|
|
}
|
|
|
|
function setup {
|
|
parm=$1
|
|
if [ -z "${!parm}" ] ; then
|
|
echo "grep \"${parm}=\" ./config_host.mk | sed -re \" s/${parm}=//\")"
|
|
echo "$parm=$(grep \"${parm}=\" ./config_host.mk | sed -re \" s/${parm}=//\")"
|
|
eval "$parm=$(grep \"${parm}=\" ./config_host.mk | sed -re \" s/${parm}=//\")"
|
|
fi
|
|
if [ -z "${!parm}" ] ; then
|
|
echo "could not determine $parm" >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# binaries that we need
|
|
check_cmd doxygen "You need doxygen for doc generation"
|
|
check_cmd dot "You need the graphviz tools to create the nice inheritance graphs"
|
|
check_cmd "markdown markdown2 markdown2-3" "You need either markdown or markdown2 in order to convert README.md into html"
|
|
|
|
# suck setup
|
|
setup "SOLARINC"
|
|
shopt -s nullglob
|
|
|
|
# Title of the documentation
|
|
DOXYGEN_PROJECT_PREFIX="LibreOffice"
|
|
|
|
# get list of modules
|
|
if [ -z "$INPUT_PROJECTS" ]; then
|
|
INPUT_PROJECTS="`ls */Module_*.mk | sed 's#/.*##'`"
|
|
fi
|
|
|
|
|
|
# output directory for generated documentation
|
|
BASE_OUTPUT="$1"
|
|
mkdir -p "$BASE_OUTPUT" || {
|
|
echo "Cannot create $BASE_OUTPUT"
|
|
exit 1
|
|
}
|
|
|
|
# paths for binary and configuration file
|
|
BASE_PATH=`pwd`
|
|
DOXYGEN_CFG="$2"
|
|
if test ! -f "$DOXYGEN_CFG"; then
|
|
echo "doxygen.cfg not found"
|
|
exit 1
|
|
fi
|
|
|
|
# strip -I. and bin -I prefix; exclude system headers
|
|
DOXYGEN_INCLUDE_PATH=`echo $SOLARINC | sed -e 's/-I\.//g' -e 's/ -I/ /'g -e 's/ -isystem/ /g' -e 's|/usr/[^ ]*| |g'`
|
|
|
|
# setup version string
|
|
DOXYGEN_VERSION="master"
|
|
|
|
|
|
###################################################
|
|
#
|
|
# Generate docs
|
|
#
|
|
###################################################
|
|
|
|
# cleanup
|
|
echo "cleaning up" && rm -rf $BASE_OUTPUT/*
|
|
|
|
# make the stuff world-readable
|
|
umask 022
|
|
|
|
# generate docs
|
|
echo "generating doxygen docs"
|
|
DOXYGEN_REF_TAGFILES=""
|
|
for PROJECT in $INPUT_PROJECTS;
|
|
do
|
|
# avoid processing of full project subdirs, only add source and inc
|
|
|
|
# project header files can be in $PROJECT/inc and/or include/$PROJECT
|
|
if [ -d "$PROJECT/inc" ]; then
|
|
PROJECT_INCLUDE="$PROJECT/inc"
|
|
else
|
|
PROJECT_INCLUDE=""
|
|
fi
|
|
|
|
if [ -d "include/$PROJECT" ]; then
|
|
PROJECT_INCLUDE="$PROJECT_INCLUDE include/$PROJECT"
|
|
if [ "$PROJECT" = "sal" ]; then
|
|
PROJECT_INCLUDE="$PROJECT_INCLUDE include/osl include/rtl"
|
|
fi
|
|
fi
|
|
|
|
DOXYGEN_INPUT=`printf "%s" "$PROJECT/source $PROJECT_INCLUDE"`
|
|
|
|
DOXYGEN_OUTPUT="$BASE_OUTPUT/$PROJECT"
|
|
DOXYGEN_OUR_TAGFILE="$DOXYGEN_OUTPUT/$PROJECT.tags"
|
|
DOXYGEN_PROJECTNAME="$DOXYGEN_PROJECT_PREFIX Module $PROJECT"
|
|
|
|
# export variables referenced in doxygen config file
|
|
export DOXYGEN_INPUT
|
|
export DOXYGEN_OUTPUT
|
|
export DOXYGEN_INCLUDE_PATH
|
|
export DOXYGEN_VERSION
|
|
export DOXYGEN_OUR_TAGFILE
|
|
export DOXYGEN_REF_TAGFILES
|
|
export DOXYGEN_PROJECTNAME
|
|
|
|
# debug
|
|
echo "Calling $DOXYGEN_PATH/doxygen $DOXYGEN_CFG with"
|
|
echo "Input: $DOXYGEN_INPUT"
|
|
echo "Output: $DOXYGEN_OUTPUT"
|
|
echo "Include: $DOXYGEN_INCLUDE_PATH"
|
|
echo "Version: $DOXYGEN_VERSION"
|
|
echo "Tagfile: $DOXYGEN_OUR_TAGFILE"
|
|
echo "Ref-Tags: $DOXYGEN_REF_TAGFILES"
|
|
echo "Title: $DOXYGEN_PROJECTNAME"
|
|
|
|
nice -15 doxygen "$DOXYGEN_CFG" >>$BASE_OUTPUT/doxygen.log 2>&1 || exit 1
|
|
|
|
# setup referenced tagfiles for next round
|
|
DOXYGEN_REF_TAGFILES="$DOXYGEN_REF_TAGFILES $DOXYGEN_OUR_TAGFILE=$BASE_URL/$PROJECT/html"
|
|
done
|
|
|
|
# generate entry page
|
|
echo "generating index page"
|
|
header "LibreOffice Modules" " " "$BASE_OUTPUT/index.html"
|
|
for module_name in *; do
|
|
if [ -d $module_name ]; then
|
|
cur_file=$(echo $module_name/README.md)
|
|
if [ -f "$cur_file" ]; then
|
|
# write index.html entry
|
|
text=$(echo -e "<h2><a href=\"${module_name}.html\">${module_name}</a></h2>\n")
|
|
|
|
if [ ${cur_file: -3} == ".md" ]; then
|
|
# This is a markdown file.
|
|
header_text="$(head -n1 $cur_file)"
|
|
header_text="$(echo ${header_text} | sed -e 's/^\#*//g')"
|
|
text="${text}${header_text}"
|
|
else
|
|
text="${text}$(head -n1 $cur_file | proc_text)"
|
|
fi
|
|
echo -e "$text" >> "$BASE_OUTPUT/index.html"
|
|
|
|
# write detailed module content
|
|
header "$module_name" "<a href=\"index.html\">LibreOffice</a> » ${module_name}" "$BASE_OUTPUT/${module_name}.html"
|
|
text="<p><b>View module in:</b>"
|
|
text="${text} <a href=\"https://git.libreoffice.org/core/+/refs/heads/master/${module_name}\">git</a>"
|
|
if $(echo $INPUT_PROJECTS | grep -q $module_name); then
|
|
text="${text} <a href=\"${module_name}/html/classes.html\">Doxygen</a>"
|
|
fi
|
|
text="${text} </p><p> </p>"
|
|
echo -e "$text" >> "$BASE_OUTPUT/${module_name}.html"
|
|
|
|
if [ ${cur_file: -3} == ".md" ]; then
|
|
# This is a markdown file.
|
|
text="$(${markdown} $cur_file | proc_text_markdown)"
|
|
echo -e "$text" >> "$BASE_OUTPUT/${module_name}.html"
|
|
else
|
|
proc_text < $cur_file >> "$BASE_OUTPUT/${module_name}.html"
|
|
fi
|
|
footer "$BASE_OUTPUT/${module_name}.html"
|
|
else
|
|
empty_modules[${#empty_modules[*]}]=$module_name
|
|
fi
|
|
fi
|
|
done
|
|
|
|
if [ ${#empty_modules[*]} -gt 10 ]; then
|
|
echo -e "<p> </p><p>READMEs were not available for these modules:</p><ul>\n" >> "$BASE_OUTPUT/index.html"
|
|
for module_name in "${empty_modules[@]}"; do
|
|
# Do not process these directories
|
|
if [[ "$module_name" =~ ^(autom4te.cache|dictionaries|docs|helpcompiler|helpcontent2|include|instdir|lo|translations|workdir)$ ]]; then
|
|
continue
|
|
fi
|
|
echo -e "<li><a href=\"https://git.libreoffice.org/core/+/refs/heads/master/${module_name}\">${module_name}</a></li>\n" >> "$BASE_OUTPUT/index.html"
|
|
done
|
|
echo -e "</ul>\n" >> "$BASE_OUTPUT/index.html"
|
|
fi
|
|
|
|
footer "$BASE_OUTPUT/index.html"
|
|
|
|
## done
|