#! /bin/sh # # Necessary preparations/configurations for the reproduction pipeline. # # Original author: # Mohammad Akhlaghi # Contributing author(s): # Your name # Copyright (C) 2018, Your Name. # # This script is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This script is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # A copy of the GNU General Public License is available at # . # Script settings # --------------- # Stop the script if there are any errors. set -e # Important internal locations # ---------------------------- # # These are defined to help make this script more readable. topdir=$(pwd) installedlink=.local cdir=reproduce/config pdir=$cdir/pipeline pconf=$pdir/LOCAL.mk ptconf=$pdir/LOCAL_tmp.mk poconf=$pdir/LOCAL_old.mk glconf=$cdir/gnuastro/gnuastro-local.conf # Inform the user # --------------- # # Print some basic information so the user gets a feeling of what is going # on and is prepared on what will happen next. echo echo "-----------------------------------------" echo "Reproduction pipeline local configuration" echo "-----------------------------------------" echo echo "Local configuration includes things like top-level directories," echo "or processing steps." echo echo "It is STRONGLY recommended to read the comments, and set the best " echo "values for your system (where necessary)." echo # Identify the downloader tool # ---------------------------- # # We use Wget for the downloading. As of November 12th, cURL couldn't # download Ghostscript's source from its standard address, but Wget # could. Until November 12th, we would check for cURL or Wget, so we # defined this check system here (explained in the next paragraph of this # comment). For now its redundant, but if the fix for cURL is found later, # we can add it back (or add other downloaders). So we'll keep it. # # Since the options specifying the output filename are different between # the two, we'll also specify the output option within the `downloader' # variable. So it is important to first give the output filename after # calling `DOWNLOADER' within the Makefiles, and finish the command with # the web address. print_downloader_notice=1 if type wget > /dev/null; then downloader="wget -O"; else echo "=======" echo "Warning" echo "=======" echo "Couldn't find GNU Wget. It is used for downloading necessary " echo "programs and data if they aren't already present in the specified " echo "directories. Therefore the pipeline will crash if the necessary " echo "files are not already present on the system." echo "=======" echo downloader="no-downloader-found" fi; # Write values obtained so far # ---------------------------- # # We'll start writing of the local configuration file with the values that # have been found so far. sed -e 's|@downloader[@]|'"$downloader"'|g' $pconf.in > $ptconf # Remove possibly existing configuration file? # -------------------------------------------- # # `LOCAL.mk' is the top-most local configuration for the pipeline. If it # already exists when this script is run, we'll make a copy of it as backup # (for example the user might have ran `./configure' by mistake). if [ -f $pconf ]; then # If it already exits, see what the user wants to do. while [ "$userread" != "y" -a "$userread" != "n" ] do read -p"A configuration already exists, re-configure (y/n)? " userread done # Move the configuration if requested. if [ $userread = "y" ]; then if mv $pconf $poconf; then echo "-- Existing configuration moved to '$poconf'." fi else echo "-- Using existing configuration file." fi echo fi # Let user edit local settings # ---------------------------- # # If the configuration file exists at this stage, the user didn't want to # change it. So, we'll open a text editor for the user to read the comments # of the necessary local settings and set the top directories manually. if ! [ -f $pconf ]; then if [ x"$EDITOR" = "x" ]; then userread=$EDITOR else userread=not-an-editor fi while ! $userread $ptconf > /dev/null 2>&1 do read -p"Your favorite text editor: " userread done echo fi # Notice for top of files # ----------------------- # # In case someone opens the files output from the configuration scripts in # a text editor and wants to edit them, it is important to let them know # that their changes are not going to be permenant. function create_file_with_notice() { if echo "# IMPORTANT: file will be RE-WRITTEN after './configure'" > $1 then echo "#" >> $1 echo "# This file was created during the reproduction" >> $1 echo "# pipeline's configuration ('./configure'). Therefore," >> $1 echo "# it is not under version control and any manual " >> $1 echo "# changes to it will be over-written if the pipeline " >> $1 echo "# is re-configured." >> $1 echo "#" >> $1 else exit 1 fi } # --------- Delete for no Gnuastro --------- # Gnuastro's local configuration settings # # The `minmapsize' parameter has been set by the user, so we can read it # and add it to Gnuastro's local configuration file. create_file_with_notice $glconf mm=$(awk '$1=="MINMAPSIZE"{print $3}' $ptconf) echo "# Minimum number of bytes to use HDD/SSD instead of RAM." >> $glconf echo " minmapsize $mm" >> $glconf # ------------------------------------------ # Final pipeline local settings # ----------------------------- # # Make the final file that will be used and delete the temporary file along # with a possible file ending with `~' that is put there by some editors. if ! [ -f $pconf ]; then create_file_with_notice $pconf cat $ptconf >> $pconf fi rm -f $ptconf $ptconf"~" # Read the necessary directories and build the top build directory as well # as the symbolic link to it. lbdir=reproduce/build rm -f $lbdir bdir=$(awk '/BDIR =/ {print $3}' $pconf) ddir=$(awk '/DEPENDENCIES-DIR =/ {print $3}' $pconf) if ! [ -d $bdir ]; then mkdir $bdir; fi absolutebdir=$(readlink -f $bdir) ln -s $absolutebdir $lbdir depdir=$absolutebdir/dependencies if ! [ -d $depdir ]; then mkdir $depdir; fi tardir=$depdir/tarballs if ! [ -d $tardir ]; then mkdir $tardir; fi instdir=$depdir/installed if ! [ -d $instdir ]; then mkdir $instdir; fi rm -f $installedlink ln -s $instdir $installedlink echo "Build directory ready: $absolutebdir"; echo "... 'reproduce/build' is a symbolic link to it (for easy access)."; echo # Notice on build Make and Bash, build top directories # ---------------------------------------------------- tsec=0 echo; echo; echo "----------------"; echo "Necessary reproduction pipeline dependencies will be built in $tsec sec." echo echo "NOTE: the built software will NOT BE INSTALLED on your system, they" echo "are only for local usage by this reproduction pipeline." echo sleep $tsec export USE_LOCAL_BASH=no bindir=$bdir/dependencies/installed/bin make -f reproduce/src/make/dependencies.mk $bindir/bash $bindir/make -j2 # Build the final symbolic links cd $topdir rm -f Makefile ln -s $(pwd)/reproduce/src/make/Top-Makefile Makefile # --------- Delete for no Gnuastro --------- rm -f .gnuastro ln -s $(pwd)/reproduce/config/gnuastro .gnuastro # ------------------------------------------ # Build all the necsesary dependencies # ------------------------------------ # # We will be making all the dependencies before running the top-level # Makefile. To make the job easier, we'll do it in a Makefile, not a # script. Bash and Make were the tools we need to run Makefiles, so we had # to build them in this script. But after this, we can rely on Makefiles. export USE_LOCAL_BASH=yes .local/bin/make -f reproduce/src/make/dependencies.mk -j8 # Print a final notice # -------------------- # # The configuration is now complete, we can inform the user on the next # step(s) to take. echo echo "------" echo "The reproduction pipeline and its environment are SUCCESSFULLY configured." echo "Please run the following command to start." echo echo "(Replace '8' with the number of CPU threads)" echo echo " .local/bin/make -j8" echo echo "To change the configuration later, please re-run './configure'," echo "DO NOT manually edit the relevant files." echo