#!/usr/bin/env bash # Copyright (c) 2018-2019 The University of Sheffield. # 2019-2020 The University of Exeter. # 2018-2020 The University of Paris-Saclay. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # SPDX-License-Identifier: BSD-2-Clause #set -e shopt -s nocasematch # get global configuration if [ -d .git ]; then export `git show -s --format="COMMIT=%H DATE=%cd" --date=short | sed -e 's|-|/|g'` fi source .config print_help() { echo "Usage: install [OPTION] " echo "" echo "Run ..." echo "" echo " --help, -h display this help message" echo " --isabelle, -i isabelle isabelle command used for installation" echo " (default: $ISABELLE)" echo " --skip-patch-and-afp, -s skip installation of Isabelle/DOF patch for" echo " Isabelle and required AFP entries. " echo " USE AT YOUR OWN RISK (default: $SKIP)" } exit_error() { echo "" echo " *** Isabelle/DOF installation FAILED, please check the README.md for help ***" echo "" exit 1 } check_isabelle_version() { echo "* Checking Isabelle version:" if [ "$ISABELLE_VERSION" != "$ACTUAL_ISABELLE_VERSION" ]; then echo " WARNING:" echo " The version of Isabelle (i.e., $ACTUAL_ISABELLE_VERSION) you are using" echo " IS NOT SUPPORTED" echo " by the current version of Isabelle/DOF. Please install a supported" echo " version of Isabelle and rerun the install script, providing the" echo " the \"isabelle\" command as argument." echo " Isabelle ($ISABELLE_VERSION) can be obtained from:" echo " $ISABELLE_URL" echo read -p " Still continue (y/N)? " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then echo " Continuing installation on your OWN risk." else exit_error fi else echo " Success: found supported Isabelle version ($ISABELLE_VERSION)" fi } check_afp_entries() { echo "* Checking availability of AFP entries:" missing="" required="Regular-Sets Functional-Automata" for afp in $required; do res=`$ISABELLE build -n $afp 2>/dev/null || true` if [ "$res" != "" ]; then echo " Success: found APF entry $afp." else echo " Warning: could not find AFP entry $afp." missing="$missing $afp" fi done if [ "$missing" != "" ]; then echo " Trying to install AFP (this might take a few *minutes*) ...." extract="" for e in $missing; do extract="$extract $AFP_DATE/thys/$e" done mkdir -p .afp if curl -s -L $AFP_URL | tar zxf - -C .afp $extract; then for e in $missing; do echo " Registering $e in $ISABELLE_HOME_USER/ROOTS" touch $ISABELLE_HOME_USER/ROOTS grep -q $PWD/.afp/$AFP_DATE/thys/$e $ISABELLE_HOME_USER/ROOTS || echo "$PWD/.afp/$AFP_DATE/thys/$e" >> $ISABELLE_HOME_USER/ROOTS done echo " AFP installation successful." else echo " FAILURE: could not find AFP entries: $missing." echo " Please obtain the AFP from" echo " $AFP_URL" echo " and follow the following instructions:" echo " https://www.isa-afp.org/using.html" exit_error fi fi } check_isa_dof_patch() { echo "* Check availability of Isabelle/DOF patch:" src="src/patches/thy_output.ML" dst="$ISABELLE_HOME/src/Pure/Thy/thy_output.ML" if command -v cmp > /dev/null 2>&1 && cmp -s "$src" "$dst" ; then echo " Success: latest Isabelle/DOF patch already applied" if isabelle process -e 'Thy_Output.set_meta_args_parser' &> /dev/null ; then true else echo " Warning: Isabelle/HOL needs to be rebuild to activate patch." fi else command -v cmp >/dev/null 2>&1 || echo " Warning: cmp not available, cannot check if patch is already applied." echo " Warning: Isabelle/DOF patch is not available or outdated." echo " Trying to patch system ...." if [ ! -f "$dst.backup-by-isadof-installer" ]; then cp -f "$dst" "$dst.backup-by-isadof-installer" || true; fi if (cp -f $src $dst) &> /dev/null; then echo " Applied patch successfully, Isabelle/HOL will be rebuilt during" echo " the next start of Isabelle." else echo " FAILURE: Could not apply Isabelle/DOF patch." echo " Please copy $src to $dst, e.g.:" echo " cp -f $src $dst" echo " and rebuild Isabelle/HOL." exit_error fi fi } check_old_installation(){ echo "* Searching for existing installation:" if [[ -d "$ISABELLE_HOME_USER/DOF" ]]; then echo " Found old installation, moving it to $ISABELLE_HOME_USER/DOF.bak." rm -rf "$ISABELLE_HOME_USER/DOF.bak" mv "$ISABELLE_HOME_USER/DOF" "$ISABELLE_HOME_USER/DOF.bak" else echo " No old installation found." fi } install_and_register(){ echo "* Installing Isabelle/DOF" DIR="$ISABELLE_HOME_USER/DOF/Tools" echo " - Installing Tools in $DIR" mkdir -p "$DIR" cp $GEN_DIR/Tools/* "$DIR" chmod 755 "$DIR"/* DIR="$ISABELLE_HOME_USER/DOF/document-template" echo " - Installing document templates in $DIR" mkdir -p "$DIR" cp $GEN_DIR/scripts/* "$DIR" cp $GEN_DIR/document-templates/* "$DIR" cp $GEN_DIR/DOF/*/*.sty "$DIR" ISABELLE_SHORT_VERSION=`echo $ISABELLE_VERSION | sed -e 's/:.*$//'` sed -i -e "s|%%% CONFIG %%%| \ \\\\renewcommand{\\\\dof@isabelleversion}{$ISABELLE_SHORT_VERSION} \ \\\\renewcommand{\\\\isabellelatestversion}{$DOF_LATEST_ISABELLE} \ \\\\renewcommand{\\\\isabellefullversion}{$ISABELLE_VERSION\\\\xspace} \ \\\\renewcommand{\\\\dof@version}{$DOF_VERSION} \ \\\\renewcommand{\\\\doflatestversion}{$DOF_LATEST_VERSION} \ \\\\renewcommand{\\\\isadoflatestdoi}{$DOF_LATEST_DOI} \ \\\\renewcommand{\\\\isadofgenericdoi}{$DOF_GENERIC_DOI} \ \\\\renewcommand{\\\\isabelleurl}{$ISABELLE_URL} \ \\\\renewcommand{\\\\dofurl}{$DOF_URL} \ \\\\renewcommand{\\\\dof@artifacturl}{https://$DOF_ARTIFACT_HOST/$DOF_ARTIFACT_DIR}|" \ "$DIR/DOF-core.sty" DIR="$ISABELLE_HOME_USER/DOF/latex" echo " - Installing LaTeX styles in $DIR" mkdir -p "$DIR" cp $GEN_DIR/ontologies/*/*.sty "$DIR" DIR="$ISABELLE_HOME_USER/etc" echo " - Registering Isabelle/DOF" mkdir -p "$DIR" if [[ $ISABELLE_TOOLS = *DOF* ]]; then echo " * Tools already registered in $DIR/settings" else echo " * Registering tools in $DIR/settings" echo 'ISABELLE_TOOLS=$ISABELLE_TOOLS:$ISABELLE_HOME_USER/DOF/Tools' \ >> "$DIR/settings" fi if [[ $ISABELLE_DOCS = *DOF* ]]; then echo " * Docs already registered in $DIR/settings" else echo " * Registering docs in $DIR/settings" echo "ISABELLE_DOCS=$PWD/doc"':$ISABELLE_DOCS' \ >> "$DIR/settings" fi sed -i -e "s||$DOF_URL|" $ISABELLE_HOME_USER/DOF/*/* LTX_VERSION="$DATE $DOF_VERSION/$ISABELLE_SHORT_VERSION" sed -i -e "s||$LTX_VERSION|" $ISABELLE_HOME_USER/DOF/*/* touch $ISABELLE_HOME_USER/ROOTS grep -q $PWD'$' $ISABELLE_HOME_USER/ROOTS || echo "$PWD" >> $ISABELLE_HOME_USER/ROOTS } ISABELLE=`command -v isabelle` SKIP="false" while [ $# -gt 0 ] do case "$1" in --isabelle|-i) ISABELLE="$2"; shift;; --skip-patch-and-afp|-s) SKIP="true";; --help|-h) print_help exit 0;; *) print_help exit 1;; esac shift done ACTUAL_ISABELLE_VERSION=`$ISABELLE version` GEN_DIR=src PROG=`echo $0 | sed 's|.*/||'`; VARS=`$ISABELLE getenv ISABELLE_HOME_USER ISABELLE_HOME ISABELLE_TOOLS ISABELLE_DOCS` for i in $VARS; do export "$i" done echo "" echo "Isabelle/DOF Installer" echo "======================" check_isabelle_version if [ "$SKIP" = "true" ]; then echo "* Warning: skipping installation of Isabelle patch and AFP entries." else check_isa_dof_patch check_afp_entries fi check_old_installation install_and_register echo "* Installation successful. Enjoy Isabelle/DOF, you can build the session" echo " Isabelle/DOF and all example documents by executing:" echo " $ISABELLE build -D ." exit 0