#! /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 # ---------------------------- # # If cURL is already present, that will be used, otherwise, we'll use # Wget. 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 curl > /dev/null; then downloader="curl -o" elif type wget > /dev/null; then downloader="wget -O"; else echo "=======" echo "Warning" echo "=======" echo "Couldn't find any of the 'curl' or 'wget' programs. They are used" echo "for downloading necessary programs and data if they aren't already" echo "present in the specified directories. Therefore the pipeline will" echo "crash if the necessary 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=10 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 -j2 -f reproduce/src/make/dependencies.mk $bindir/bash $bindir/make # 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