#! /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 lbdir=reproduce/build 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 # Delete final target of configuration # ------------------------------------ # # Without the top-level `Makefile' the user can't run `make' in this # directory. But we only want to make it available when we know everything # else is set up. So we'll delete it at the start of this configuration and # reset the link in the absolute end. rm -f Makefile # Notice for top of generated 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 can 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 echo; echo "Can't write to $1"; echo; exit 1 fi } # Get absolute address # -------------------- # # Since the build directory will go into a symbolic link, we want it to be # an absolute address. With this function we can make sure of that. function absolute_dir() { echo "$(cd "$(dirname "$inbdir")" && pwd )/$(basename "$inbdir")" } # 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 # What to do with 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). rewritepconfig=yes rewritegconfig=yes if [ -f $pconf ] || [ -f $glconf ]; then # If it already exits, see what the user wants to do. echo "Atleast one local configuration file already exists." echo while [ "$userread" != "y" -a "$userread" != "n" ] do read -p"Re-write existing configuration file(s) (y/n)? " userread done # Set `rewriteconfig'. if [ $userread = "n" ]; then if [ -f $pconf ]; then rewritepconfig=no; fi if [ -f $glconf ]; then rewritegconfig=no; fi fi echo fi # 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. if [ $rewritepconfig = yes ]; then 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; fi # Build directory # --------------- if [ $rewritepconfig = yes ]; then cat < /dev/null; then bdir=$(absolute_dir $inbdir) echo " -- Build directory: '$bdir'" rm -rf $inbdir/$junkname else echo " -- Can't write in '$inbdir'" fi else if mkdir $inbdir 2> /dev/null; then bdir=$(absolute_dir $inbdir) echo " -- Build directory set to (the newly created): '$bdir'" else echo " -- Can't create '$inbdir'" fi fi done fi # Dependency tarball directory # ---------------------------- if [ $rewritepconfig = yes ]; then junkddir="/optional/path" ddir=$junkddir cat <> $pconf else # Read the values from existing configuration file. inbdir=$(awk '$1=="BDIR" {print $NF}' $pconf) ddir=$(awk '$1=="DEPENDENCIES-DIR" {print $NF}' $pconf) downloader=$(awk '$1=="DOWNLOADER" {print $NF}' $pconf) # Make sure `bdir' is an absolute path and it exists. bdir=$(absolute_dir $inbdir) if ! [ -d $bdir ]; then mkdir $bdir; fi fi # --------- Delete for no Gnuastro --------- # Get the version of Gnuastro that must be used. depverfile=reproduce/config/pipeline/dependency-versions.mk gversion=$(awk '$1=="gnuastro-version" {print $NF}' $depverfile) # Gnuastro's local configuration settings if [ $rewritegconfig = yes ]; then create_file_with_notice $glconf echo "# Minimum number of bytes to use HDD/SSD instead of RAM." >> $glconf echo " minmapsize $minmapsize" >> $glconf echo >> $glconf echo "# Version of Gnuastro that must be used." >> $glconf echo " onlyversion $gversion" >> $glconf else ingversion=$(awk '$1=="onlyversion" {print $NF}' $glconf) if [ x$ingversion != x$gversion ]; then echo "______________________________________________________" echo "!!!!!!!!!!!!!!!!!!CONFIGURATION ERROR!!!!!!!!!!!!!!!!!" echo echo "Gnuastro's version in '$glconf' ($ingversion) doesn't match the tarball version that this pipeline was designed to use in '$depverfile' ($gversion). Please re-run after removing the former file:" echo echo " $ rm $glconf" echo " $ ./configure" echo echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" echo exit 1 fi fi # ------------------------------------------ # Setup the top-level directories # ------------------------------- rm -f $lbdir ln -s $bdir $lbdir depdir=$bdir/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 # --------- Delete for no Gnuastro --------- rm -f .gnuastro ln -s $(pwd)/reproduce/config/gnuastro .gnuastro # ------------------------------------------ # Build basic dependencies # ------------------------ tsec=10 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 (in '$bdir/dependencies/installed')" echo sleep $tsec make -f reproduce/src/make/dependencies-basic.mk #-j2 # Rest of 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. .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 echo "Please run the following command to start." 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 # Final target: the Makefile # -------------------------- # # To see why this is the last step of the configuration, see above (when we # delete the top-level Makefile at the start of this script). ln -s $(pwd)/reproduce/src/make/Top-Makefile Makefile