aboutsummaryrefslogtreecommitdiff
path: root/reproduce/software/shell/configure.sh
diff options
context:
space:
mode:
Diffstat (limited to 'reproduce/software/shell/configure.sh')
-rwxr-xr-xreproduce/software/shell/configure.sh258
1 files changed, 180 insertions, 78 deletions
diff --git a/reproduce/software/shell/configure.sh b/reproduce/software/shell/configure.sh
index 593b1d9..2b4300b 100755
--- a/reproduce/software/shell/configure.sh
+++ b/reproduce/software/shell/configure.sh
@@ -48,7 +48,7 @@ need_gfortran=0
# --------------------
#
# These are defined to help make this script more readable.
-topdir=$(pwd)
+topdir="$(pwd)"
optionaldir="/optional/path"
adir=reproduce/analysis/config
cdir=reproduce/software/config
@@ -96,7 +96,8 @@ create_file_with_notice ()
# an absolute address. With this function we can make sure of that.
absolute_dir ()
{
- if stat "$1" 1> /dev/null; then
+ address="$1"
+ if stat "$address" 1> /dev/null; then
echo "$(cd "$(dirname "$1")" && pwd )/$(basename "$1")"
else
exit 1;
@@ -136,18 +137,18 @@ check_permission ()
{
# Make a `junk' file, activate its executable flag and record its
# permissions generally.
- local junkfile=$1/check_permission_tmp_file
- rm -f $junkfile
- echo "Don't let my short life go to waste" > $junkfile
- chmod +x $junkfile
- local perm_before=$(ls -l $junkfile | awk '{print $1}')
+ local junkfile="$1"/check_permission_tmp_file
+ rm -f "$junkfile"
+ echo "Don't let my short life go to waste" > "$junkfile"
+ chmod +x "$junkfile"
+ local perm_before=$(ls -l "$junkfile" | awk '{print $1}')
# Now, remove the executable flag and record the permissions.
- chmod -x $junkfile
- local perm_after=$(ls -l $junkfile | awk '{print $1}')
+ chmod -x "$junkfile"
+ local perm_after=$(ls -l "$junkfile" | awk '{print $1}')
# Clean up before leaving the function
- rm -f $junkfile
+ rm -f "$junkfile"
# If the permissions are equal, the filesystem doesn't allow
# permissions.
@@ -187,8 +188,8 @@ check_permission ()
free_space_warning()
{
fs_threshold=$1
- fs_destpath=$2
- return $(df $fs_destpath \
+ IFS='"' fs_destpath="$2"
+ return $(df "$fs_destpath" \
| awk 'FNR==2 {if($4>'$fs_threshold') print 1; \
else print 0; }')
}
@@ -224,6 +225,62 @@ fi
+# Collect CPU information
+# -----------------------
+#
+# When the project is built, the type of a machine that built it also has
+# to to be documented. This way, if different results or behaviors are
+# observed in software-related or analysis-related phases of the project,
+# it would be easier to track down the root cause. So far this is just
+# later recorded as a LaTeX macro to be put in the final paper, but it
+# could be used in a more systematic way to optimize/revise project
+# workflow and build.
+hw_class=$(uname -m)
+if [ x$kernelname = xLinux ]; then
+ byte_order=$(lscpu \
+ | grep 'Byte Order' \
+ | awk '{ \
+ for(i=3;i<NF;++i) \
+ printf "%s ", $i; \
+ printf "%s", $NF}')
+ address_sizes=$(lscpu \
+ | grep 'Address sizes' \
+ | awk '{ \
+ for(i=3;i<NF;++i) \
+ printf "%s ", $i; \
+ printf "%s", $NF}')
+elif [ x$on_mac_os = xyes ]; then
+ hw_byteorder=$(sysctl -n hw.byteorder)
+ if [ x$hw_byteorder = x1234 ]; then byte_order="Little Endian";
+ elif [ x$hw_byteorder = x4321 ]; then byte_order="Big Endian";
+ fi
+ address_size_physical=$(sysctl -n machdep.cpu.address_bits.phyiscal)
+ address_size_virtual=$(sysctl -n machdep.cpu.address_bits.virtual)
+ address_sizes="$address_size_physical bits physical, "
+ address_sizes+="$address_size_virtual bits virtual"
+else
+ byte_order="unrecognized"
+ address_sizes="unrecognized"
+ cat <<EOF
+______________________________________________________
+!!!!!!! WARNING !!!!!!!
+
+Machine byte order and address sizes could not be recognized. You can add
+the necessary steps in the 'reproduce/software/shell/configure.sh' script
+(just above this error message), or contact us with this web-form:
+
+ https://savannah.nongnu.org/support/?func=additem&group=reproduce
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+EOF
+ sleep 5
+fi
+
+
+
+
+
# Check for C/C++ compilers
# -------------------------
#
@@ -717,7 +774,7 @@ fi
# Build directory
# ---------------
-currentdir=$(pwd)
+currentdir="$(pwd)"
if [ $rewritepconfig = yes ]; then
cat <<EOF
@@ -746,7 +803,7 @@ directory). The build directory cannot be a subdirectory of the source.
EOF
bdir=
junkname=pure-junk-974adfkj38
- while [ x$bdir = x ]
+ while [ x"$bdir" = x ]
do
# Ask the user (if not already set on the command-line).
if [ x"$build_dir" = x ]; then
@@ -761,31 +818,31 @@ EOF
fi
# If it exists, see if we can write in it. If not, try making it.
- if [ -d $build_dir ]; then
- if mkdir $build_dir/$junkname 2> /dev/null; then
+ if [ -d "$build_dir" ]; then
+ if echo "test" > "$build_dir"/$junkname ; then
+ rm -f "$build_dir"/$junkname
instring="the already existing"
- bdir=$(absolute_dir $build_dir)
- rm -rf $build_dir/$junkname
+ bdir="$(absolute_dir "$build_dir")"
else
echo " ** Can't write in '$build_dir'";
fi
else
- if mkdir $build_dir 2> /dev/null; then
+ if mkdir "$build_dir" 2> /dev/null; then
instring="the newly created"
- bdir=$(absolute_dir $build_dir)
+ bdir="$(absolute_dir "$build_dir")"
else
echo " ** Can't create '$build_dir'";
fi
fi
- # If its given, make sure it isn't a subdirectory of the source
+ # If it is given, make sure it isn't a subdirectory of the source
# directory.
if ! [ x"$bdir" = x ]; then
if echo "$bdir/" \
- | grep '^'$currentdir 2> /dev/null > /dev/null; then
+ | grep '^'"$currentdir" 2> /dev/null > /dev/null; then
# If it was newly created, it will be empty, so delete it.
- if ! [ "$(ls -A $bdir)" ]; then rm --dir $bdir; fi
+ if ! [ "$(ls -A $bdir)" ]; then rm --dir "$bdir"; fi
# Inform the user that this is not acceptable and reset `bdir'.
bdir=
@@ -793,10 +850,30 @@ EOF
fi
fi
- # If everything is fine until now, see if we're able to manipulate
- # file permissions.
+ # If things are fine so far, make sure it does not contain a space
+ # or other meta-characters which can cause problems during software
+ # building.
+ if ! [ x"$bdir" = x ]; then
+ hasmeta=0;
+ case $bdir in *['!'\@\#\$\%\^\&\*\(\)\+\;\ ]* ) hasmeta=1 ;; esac
+ if [ $hasmeta = 1 ]; then
+
+ # If it was newly created, it will be empty, so delete it.
+ if ! [ "$(ls -A "$bdir")" ]; then rm --dir "$bdir"; fi
+
+ # Inform the user and set 'bdir' to empty again.
+ bdir=
+ echo " ** Build directory should not contain meta-characters"
+ echo " ** (like SPACE, %, \$, !, ;, or parenthesis, among "
+ echo " ** others): they can interrup the build for some software."
+ fi
+ fi
+
+ # If everything is still fine so far, see if we're able to
+ # manipulate file permissions in the directory's filesystem and if
+ # so, see if there is atleast 5GB free space.
if ! [ x"$bdir" = x ]; then
- if ! $(check_permission $bdir); then
+ if ! $(IFS='"' check_permission "$bdir"); then
# Unable to handle permissions well
bdir=
echo " ** File permissions can't be modified in this directory"
@@ -804,7 +881,7 @@ EOF
# Able to handle permissions, now check for 5GB free space
# in the given partition (note that the number is in units
# of 1024 bytes). If this is not the case, print a warning.
- if $(free_space_warning 5000000 $bdir); then
+ if $(free_space_warning 5000000 "$bdir"); then
echo " !! LESS THAN 5GB FREE SPACE IN: $bdir"
echo " !! We recommend choosing another partition."
echo " !! Build will continue in 5 seconds..."
@@ -817,7 +894,7 @@ EOF
# reset `build_dir' to blank, so it continues asking for another
# directory and let the user know that they must select a new
# directory.
- if [ x$bdir = x ]; then
+ if [ x"$bdir" = x ]; then
build_dir=
echo " ** Please select another directory."
echo ""
@@ -834,9 +911,9 @@ fi
# Input directory
# ---------------
if [ x"$input_dir" = x ]; then
- indir=$optionaldir
+ indir="$optionaldir"
else
- indir=$input_dir
+ indir="$input_dir"
fi
noninteractive_sleep=2
if [ $rewritepconfig = yes ] && [ x"$input_dir" = x ]; then
@@ -878,7 +955,7 @@ EOF
# In case an input-directory is given, write it in 'indir'.
if [ x$inindir != x ]; then
- indir=$(absolute_dir $inindir)
+ indir="$(absolute_dir "$inindir")"
echo " -- Using '$indir'"
fi
fi
@@ -922,7 +999,7 @@ EOF
# If given, write the software directory.
if [ x"$tmpddir" != x ]; then
- ddir=$(absolute_dir $tmpddir)
+ ddir="$(absolute_dir "$tmpddir")"
echo " -- Using '$ddir'"
fi
fi
@@ -946,11 +1023,18 @@ if [ $rewritepconfig = yes ]; then
-e's|@groupname[@]|'"$reproducible_paper_group_name"'|' \
$pconf.in >> $pconf
else
- # Read the values from existing configuration file.
- inbdir=$(awk '$1=="BDIR" {print $3}' $pconf)
-
- # Read the software directory.
- ddir=$(awk '$1=="DEPENDENCIES-DIR" {print $3}' $pconf)
+ # Read the values from existing configuration file. Note that the build
+ # directory may have space characters. Even though we currently check
+ # against it, we hope to be able to remove this condition in the
+ # future.
+ inbdir=$(awk '$1=="BDIR" { for(i=3; i<NF; i++) \
+ printf "%s ", $i; \
+ printf "%s", $NF }' $pconf)
+
+ # Read the software directory (same as 'inbdir' above about space).
+ ddir=$(awk '$1=="DEPENDENCIES-DIR" { for(i=3; i<NF; i++) \
+ printf "%s ", $i; \
+ printf "%s", $NF}' $pconf)
# The downloader command may contain multiple elements, so we'll just
# change the (in memory) first and second tokens to empty space and
@@ -968,9 +1052,9 @@ else
# Make sure `bdir' is an absolute path and it exists.
berr=0
ierr=0
- bdir=$(absolute_dir $inbdir)
+ bdir="$(absolute_dir "$inbdir")"
- if ! [ -d $bdir ]; then if ! mkdir $bdir; then berr=1; err=1; fi; fi
+ if ! [ -d "$bdir" ]; then if ! mkdir "$bdir"; then berr=1; err=1; fi; fi
if [ $err = 1 ]; then
cat <<EOF
@@ -1013,10 +1097,10 @@ fi
# (without the user noticing), in the end of this script we make a file and
# we'll delete it here (at the start). Therefore if the script crashed in
# the middle that file won't exist.
-sdir=$bdir/software
-finaltarget=$sdir/configuration-done.txt
-if ! [ -d $sdir ]; then mkdir $sdir; fi
-rm -f $finaltarget
+sdir="$bdir"/software
+finaltarget="$sdir"/configuration-done.txt
+if ! [ -d "$sdir" ]; then mkdir "$sdir"; fi
+rm -f "$finaltarget"
@@ -1030,56 +1114,56 @@ rm -f $finaltarget
# analysis Makefiles (thus making them hard to read), we are just building
# them here
# Software tarballs
-tardir=$sdir/tarballs
-if ! [ -d $tardir ]; then mkdir $tardir; fi
+tardir="$sdir"/tarballs
+if ! [ -d "$tardir" ]; then mkdir "$tardir"; fi
# Installed software
-instdir=$sdir/installed
-if ! [ -d $instdir ]; then mkdir $instdir; fi
+instdir="$sdir"/installed
+if ! [ -d "$instdir" ]; then mkdir "$instdir"; fi
# To record software versions and citation.
-verdir=$instdir/version-info
-if ! [ -d $verdir ]; then mkdir $verdir; fi
+verdir="$instdir"/version-info
+if ! [ -d "$verdir" ]; then mkdir "$verdir"; fi
# Program and library versions and citation.
-ibidir=$verdir/proglib
-if ! [ -d $ibidir ]; then mkdir $ibidir; fi
+ibidir="$verdir"/proglib
+if ! [ -d "$ibidir" ]; then mkdir "$ibidir"; fi
# Python module versions and citation.
-ipydir=$verdir/python
-if ! [ -d $ipydir ]; then mkdir $ipydir; fi
+ipydir="$verdir"/python
+if ! [ -d "$ipydir" ]; then mkdir "$ipydir"; fi
# Used software BibTeX entries.
-ictdir=$verdir/cite
-if ! [ -d $ictdir ]; then mkdir $ictdir; fi
+ictdir="$verdir"/cite
+if ! [ -d "$ictdir" ]; then mkdir "$ictdir"; fi
# TeXLive versions.
-itidir=$verdir/tex
-if ! [ -d $itidir ]; then mkdir $itidir; fi
+itidir="$verdir"/tex
+if ! [ -d "$itidir" ]; then mkdir "$itidir"; fi
# Top-level LaTeX.
-texdir=$bdir/tex
-if ! [ -d $texdir ]; then mkdir $texdir; fi
+texdir="$bdir"/tex
+if ! [ -d "$texdir" ]; then mkdir "$texdir"; fi
# LaTeX macros.
-mtexdir=$texdir/macros
-if ! [ -d $mtexdir ]; then mkdir $mtexdir; fi
+mtexdir="$texdir"/macros
+if ! [ -d "$mtexdir" ]; then mkdir "$mtexdir"; fi
# TeX build directory. If built in a group scenario, the TeX build
# directory must be separate for each member (so they can work on their
# relevant parts of the paper without conflicting with each other).
if [ "x$reproducible_paper_group_name" = x ]; then
- texbdir=$texdir/build
+ texbdir="$texdir"/build
else
user=$(whoami)
- texbdir=$texdir/build-$user
+ texbdir="$texdir"/build-$user
fi
-if ! [ -d $texbdir ]; then mkdir $texbdir; fi
+if ! [ -d "$texbdir" ]; then mkdir "$texbdir"; fi
# TiKZ (for building figures within LaTeX).
-tikzdir=$texbdir/tikz
-if ! [ -d $tikzdir ]; then mkdir $tikzdir; fi
+tikzdir="$texbdir"/tikz
+if ! [ -d "$tikzdir" ]; then mkdir "$tikzdir"; fi
# If 'tex/build' and 'tex/tikz' are symbolic links then 'rm -f' will delete
@@ -1107,14 +1191,14 @@ fi
# safe, we are deleting all the links on each re-configure of the project.
rm -f .build .local
-ln -s $bdir .build
-ln -s $instdir .local
-ln -s $texdir tex/build
-ln -s $tikzdir tex/tikz
+ln -s "$bdir" .build
+ln -s "$instdir" .local
+ln -s "$texdir" tex/build
+ln -s "$tikzdir" tex/tikz
# --------- Delete for no Gnuastro ---------
rm -f .gnuastro
-ln -s $topdir/reproduce/analysis/config/gnuastro .gnuastro
+ln -s "$topdir"/reproduce/analysis/config/gnuastro .gnuastro
# ------------------------------------------
@@ -1130,8 +1214,8 @@ ln -s $topdir/reproduce/analysis/config/gnuastro .gnuastro
# project names). Maybe later, we can use something like `mktemp' to add
# random characters to this name and make it unique to every run (even for
# a single user).
-tmpblddir=$sdir/build-tmp
-rm -rf $tmpblddir/* $tmpblddir # If its a link, we need to empty its
+tmpblddir="$sdir"/build-tmp
+rm -rf "$tmpblddir"/* "$tmpblddir" # If its a link, we need to empty its
# contents first, then itself.
# Set the top-level shared memory location.
@@ -1143,12 +1227,12 @@ fi
# there (in RAM), build a temporary directory for this project.
needed_space=2000000
if [ x"$shmdir" != x ]; then
- available_space=$(df $shmdir | awk 'NR==2{print $4}')
+ available_space=$(df "$shmdir" | awk 'NR==2{print $4}')
if [ $available_space -gt $needed_space ]; then
dirname=$(pwd | sed -e's/\// /g' \
| awk '{l=NF-1; printf("%s-%s",$l, $NF)}')
- tbshmdir=$shmdir/"$dirname"-$(whoami)
- if ! [ -d $tbshmdir ]; then mkdir $tbshmdir; fi
+ tbshmdir="$shmdir"/"$dirname"-$(whoami)
+ if ! [ -d "$tbshmdir" ]; then mkdir "$tbshmdir"; fi
fi
else
tbshmdir=""
@@ -1157,8 +1241,8 @@ fi
# If a shared memory directory was created set `build-tmp' to be a
# symbolic link to it. Otherwise, just build the temporary build
# directory under the project build directory.
-if [ x$tbshmdir = x ]; then mkdir $tmpblddir;
-else ln -s $tbshmdir $tmpblddir;
+if [ x"$tbshmdir" = x ]; then mkdir "$tmpblddir";
+else ln -s "$tbshmdir" "$tmpblddir";
fi
@@ -1527,6 +1611,24 @@ fi
+# Report machine architecture
+# ---------------------------
+#
+# Report hardware
+hwparam="$mtexdir/hardware-parameters.tex"
+
+# Add the text to the ${hwparam} file. Since harware class might include
+# underscore, it must be replaced with '\_', otherwise pdftex would
+# complain and break the build process when doing ./project make.
+hw_class_fixed="$(echo $hw_class | sed -e 's/_/\\_/')"
+.local/bin/echo "\\newcommand{\\machinearchitecture}{$hw_class_fixed}" > $hwparam
+.local/bin/echo "\\newcommand{\\machinebyteorder}{$byte_order}" >> $hwparam
+.local/bin/echo "\\newcommand{\\machineaddresssizes}{$address_sizes}" >> $hwparam
+
+
+
+
+
# Clean the temporary build directory
# ---------------------------------
#