diff options
-rwxr-xr-x | configure | 417 | ||||
-rw-r--r-- | reproduce/config/pipeline/LOCAL.mk.in | 93 | ||||
-rw-r--r-- | reproduce/src/make/dependencies-basic.mk | 128 | ||||
-rw-r--r-- | reproduce/src/make/dependencies.mk | 34 |
4 files changed, 410 insertions, 262 deletions
@@ -40,6 +40,7 @@ set -e # These are defined to help make this script more readable. topdir=$(pwd) installedlink=.local +lbdir=reproduce/build cdir=reproduce/config pdir=$cdir/pipeline @@ -52,6 +53,58 @@ 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 # --------------- # @@ -73,6 +126,36 @@ 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 # ---------------------------- # @@ -88,157 +171,211 @@ echo # 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; - - +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 -# 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 +# Build directory +# --------------- +if [ $rewritepconfig = yes ]; then + cat <<EOF + +=============== +Build directory +=============== + +The "source" (this directory) and "build" directories are treated +separately. This greatly helps in managing the many intermediate files that +are created during the build. The intermediate build files don't need to be +archived or backed up: you can always re-build them with this reproduction +pipeline. The build directory also needs a relatively large amount of free +space (atleast serveral Giga-bytes). + +'$lbdir' (a symbolic link to the build directory) will also be created +during this configuration. It can help encourage you to set the actual +build directory in a very different address from this one (one that can be +deleted and has large volume), while having easy access to it from here. + +EOF + bdir="" + junkname=pure-junk-974adfkj38 + while [ x$bdir == x ] + do + # Ask the user. + read -p"Please enter the top build directory: " inbdir + + # If it exists, see if we can write in it. If not, try making it. + if [ -d $inbdir ]; then + if mkdir $inbdir/$junkname 2> /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 -# 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." +# Dependency tarball directory +# ---------------------------- +if [ $rewritepconfig = yes ]; then + junkddir="/optional/path" + ddir=$junkddir + cat <<EOF + +--------------------------------------- +(OPTIONAL) Dependency tarball directory +--------------------------------------- + +To ensure an identical build environment, the pipeline will use its own +build of the programs it needs. Therefore the tarball of the relevant +programs are necessary for this pipeline. If a tarball isn't present in the +specified directory, *IT WILL BE DOWNLOADED* by the pipeline. + +Therefore, if you don't specify any directory here, or it doesn't contain +the tarball of a dependency, it is necessary to have an internet +connection. The pipeline will download the tarballs it needs automatically. + +EOF + read -p"(OPTIONAL) Directory of dependency tarballs ($ddir): " tmpddir + if [ x"$tmpddir" != x ]; then + ddir=$tmpddir + echo " -- Using '$ddir'" 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 +# Memory mapping minimum size +# --------------------------- +if [ $rewritegconfig = yes ]; then + defaultminmapsize=1000000000 + minmapsize=$defaultminmapsize + cat <<EOF +--------------------------- +Minimum memory mapping size +--------------------------- +Some programs (for example Gnuastro) can deal with cases where the local +system doesn't have enough memory (RAM) to keep large files. For example, +they will create memory-mapped (mmap) files on the HDD or SSD and +read/write to/from them instead of RAM. This will ofcourse, slow down the +processing, but atleast the program won't crash. +Since the memory requirements of different systems are different and it has +no effect on the software's final result, the minimum size of an allocated +array to warrant a mapping to HDD/SSD instead of RAM must also be defined +here. This value will be used in the programs that support this feature. +EOF -# 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 + read -p"Minimum memory mapping size in bytes (default: $minmapsize): " \ + tmpminmapsize + if [ x"$tmpminmapsize" != x ]; then + minmapsize=$tmpminmapsize + echo " -- Using '$minmapsize'" fi -} +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 -# ------------------------------------------ +# Write the parameters into the local configuration file. +if [ $rewritepconfig = yes ]; then + create_file_with_notice $pconf + sed -e's|@bdir[@]|'"$bdir"'|' \ + -e's|@ddir[@]|'"$ddir"'|' \ + -e's|@downloader[@]|'"$downloader"'|' \ + $pconf.in >> $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 -# 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 +# --------- 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 -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 +# Setup the top-level directories +# ------------------------------- +rm -f $lbdir +ln -s $bdir $lbdir -depdir=$absolutebdir/dependencies +depdir=$bdir/dependencies if ! [ -d $depdir ]; then mkdir $depdir; fi tardir=$depdir/tarballs @@ -250,56 +387,39 @@ 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 +# --------- Delete for no Gnuastro --------- +rm -f .gnuastro +ln -s $(pwd)/reproduce/config/gnuastro .gnuastro +# ------------------------------------------ -# Notice on build Make and Bash, build top directories -# ---------------------------------------------------- -tsec=0 -echo; -echo; -echo "----------------"; +# 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." +echo "are only for local usage by this reproduction pipeline (in '$bdir/dependencies/installed')" 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 +make -f reproduce/src/make/dependencies-basic.mk #-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 -# ------------------------------------ +# 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. -export USE_LOCAL_BASH=yes -.local/bin/make -f reproduce/src/make/dependencies.mk -j8 +.local/bin/make -f reproduce/src/make/dependencies.mk #-j8 @@ -311,10 +431,10 @@ export USE_LOCAL_BASH=yes # The configuration is now complete, we can inform the user on the next # step(s) to take. echo -echo "------" +echo "----------------" echo "The reproduction pipeline and its environment are SUCCESSFULLY configured." -echo "Please run the following command to start." echo +echo "Please run the following command to start." echo "(Replace '8' with the number of CPU threads)" echo echo " .local/bin/make -j8" @@ -322,3 +442,14 @@ 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 diff --git a/reproduce/config/pipeline/LOCAL.mk.in b/reproduce/config/pipeline/LOCAL.mk.in index b74d9f6..d6bf2c0 100644 --- a/reproduce/config/pipeline/LOCAL.mk.in +++ b/reproduce/config/pipeline/LOCAL.mk.in @@ -1,89 +1,4 @@ -# Top-level user specific directories. Note the points below: -# -# - The VALUES to these directories are initially JUST PLACE-HOLDERS! -# Please correct them based on your system. -# -# - The directories don't need to necessarily exist. If they do not exist, -# they will be created and the necessary data will be downloaded into -# them. Ofcourse provided that you have write permissions and an internet -# connection. -# -# - Do not use the tilde expansion `~' or variables for your home -# directory. Please use the full address, for example -# `/home/your-user-name'. -# -# - An ending forward-slash `/' is NOT necessary. In the pipeline, all -# these variables will be followed by a `/', so if you put a `/' at the -# end of the value here, you will see a `//' in the printed outputs -# during the processing. This has no technical problem, but can make -# reading the outputs harder and is thus not recommended. - - - - - -# Build directory -# --------------- -# -# This is where the intermediate outputs of each step are kept. -# -# Why a separate build directory? So the source and configuration files for -# this reproduction pipeline do not get crowded by all the -# intermediate/derivative files. Also to make synchronization and backups -# more easy: the contents of the build directory do not need to be backed -# up since they can be reproduced and they can be large. -# -# IMPORTANT NOTE: Keep atleast one blank space before and after `='. -BDIR = /path/of/directory/for/building - - - - - -# (OPTIONAL) Dependencies directory -# --------------------------------- -# -# To ensure an identical build environment, the pipeline will use its own -# build of the programs it needs. Therefore the tarball of the relevant -# programs are necessary for this pipeline. If a tarball isn't present in -# the specified directory, it will be downloaded by the pipeline. Therefore -# an internet connection will be mandatory. -# -# Important note: Keep atleast one blank space before and after `='. -DEPENDENCIES-DIR = /optional/path/to/directory/containing/tarballs - - - - - -# (OPTIONAL) Memory mapping minimum size -# -------------------------------------- -# -# Some programs (for example Gnuastro) can deal with cases where the local -# system doesn't have enough memory (RAM) to keep large files there. For -# example, they will create memory-mapped (`mmap' for short) files on the -# HDD or SSD and read/write to them instead of RAM. This will ofcourse, -# slow down the processing, but atleast the program won't crash. -# -# Since the memory requirements of different systems are different and it -# has no effect on the software's final result, the minimum size of an -# allocated array to warrant a mapping to HDD/SSD instead of RAM must also -# be defined here. This value will be used in the programs that support -# this feature. -MINMAPSIZE = 1000000000 - - - - - -# (OPTIONAL) Downloader program -# ----------------------------- -# -# The downloder program (and its output option name, for example `wget -O' -# or `curl -o') that will be used if any of the necessary datasets aren't -# already available on the system. -# -# This is usually set at an early stage of the configuration system -# automatically before the file is opened for editing by the user. It is -# thus recommended to not modify it manually. -DOWNLOADER = @downloader@ +# Local pipeline configuration. +BDIR = @bdir@ +DEPENDENCIES-DIR = @ddir@ +DOWNLOADER = @downloader@ diff --git a/reproduce/src/make/dependencies-basic.mk b/reproduce/src/make/dependencies-basic.mk new file mode 100644 index 0000000..dad9c5f --- /dev/null +++ b/reproduce/src/make/dependencies-basic.mk @@ -0,0 +1,128 @@ +# Build the VERY BASIC reproduction pipeline dependencies (programs and +# libraries). +# +# ------------------------------------------------------------------------ +# !!!!! IMPORTANT NOTES !!!!! +# +# This Makefile will be run by the initial `./configure' script. It is not +# included into the reproduction pipe after that. +# +# This Makefile builds very low-level and basic tools like GNU Bash and GNU +# Make. Therefore this is the only Makefile in the reproduction pipeline +# where you MUST NOT assume that modern GNU Bash or GNU Make are used. +# +# This Makefile is a very simplified version of `dependencies.mk' in the +# same directory. See there for more comments. +# +# ------------------------------------------------------------------------ +# +# Original author: +# Mohammad Akhlaghi <mohammad@akhlaghi.org> +# Contributing author(s): +# Your name <your@email.address> +# Copyright (C) 2018, Your Name. +# +# This Makefile 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 Makefile 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 +# <http://www.gnu.org/licenses/>. + + +# Top level environment +include reproduce/config/pipeline/LOCAL.mk +include reproduce/config/pipeline/dependency-versions.mk + +ddir = $(BDIR)/dependencies +tdir = $(BDIR)/dependencies/tarballs +idir = $(BDIR)/dependencies/installed +ibdir = $(BDIR)/dependencies/installed/bin +ildir = $(BDIR)/dependencies/installed/lib + +top-level-programs = bash make +all: $(foreach p, $(top-level-programs), $(ibdir)/$(p)) + + + + + +# Tarballs +# -------- +# +# Prepare tarballs. Difference with that in `dependencies.mk': `.ONESHELL' +# is not recognized by some versions of Make (even older GNU Makes). So +# we'll have to make sure the recipe doesn't break into multiple shell +# calls (so we can preserve the variables). +tarballs = $(foreach t, bash-$(bash-version).tar.gz \ + make-$(make-version).tar.gz \ + , $(tdir)/$(t) ) +$(tarballs): $(tdir)/%: + if [ -f $(DEPENDENCIES-DIR)/$* ]; then \ + cp $(DEPENDENCIES-DIR)/$* $@; \ + else \ + n=$$(echo $* | sed -e's/[0-9\-]/ /g' -e's/\./ /g' \ + | awk '{print $$1}' ); \ + \ + mergenames=1; \ + if [ $$n = bash ]; then w=http://ftp.gnu.org/gnu/bash; \ + elif [ $$n = make ]; then w=http://akhlaghi.org/src; \ + else \ + echo; echo; echo; \ + echo "'$$n' not recognized as a dependency name to download." \ + echo; echo; echo; \ + exit 1; \ + fi; \ + \ + if [ $$mergenames = 1 ]; then tarballurl=$$w/"$*"; \ + else tarballurl=$$w; \ + fi; \ + echo "Downloading $$tarballurl"; \ + $(DOWNLOADER) $@ $$tarballurl; \ + fi + + + + + +# Build system rules +# ------------------ +gbuild = cd $(ddir); rm -rf $(2); tar xf $(tdir)/$(1); cd $(2); \ + if [ $(3)x = staticx ]; then \ + opts="CFLAGS=--static --disable-shared"; \ + fi; \ + ./configure $$opts $(4) --prefix=$(idir); make $(5); \ + check="$(6)"; if [ x"$$check" != x ]; then $$check; fi; \ + make install; cd ..; rm -rf $(2) + + + + + +# GNU Bash +# -------- +# +# Everything is standard and we can make it statically. +$(ibdir)/bash: $(tdir)/bash-$(bash-version).tar.gz + $(call gbuild,$(subst $(tdir),,$<), bash-$(bash-version), static) + + + + + +# GNU Make +# -------- +# +# Unfortunately GNU Make needs dynamic linking in two instances: when +# loading objects (dynamically linked libraries), or when using the +# `getpwnam' function (for tilde expansion). The first can be disabled with +# `--disable-load', but unfortunately I don't know any way to fix the +# second. So, we'll have to build it dynamically for now. +$(ibdir)/make: $(tdir)/make-$(make-version).tar.gz + $(call gbuild,$(subst $(tdir),,$<), make-$(make-version)) diff --git a/reproduce/src/make/dependencies.mk b/reproduce/src/make/dependencies.mk index 1a0a5d1..1e29973 100644 --- a/reproduce/src/make/dependencies.mk +++ b/reproduce/src/make/dependencies.mk @@ -6,10 +6,6 @@ # This Makefile will be run by the initial `./configure' script. It is not # included into the reproduction pipe after that. # -# This Makefile also builds GNU Bash and GNU Make. Therefore this is the -# only Makefile in the reproduction pipeline where you MUST NOT assume that -# GNU Bash or GNU Make are to be used. -# # ------------------------------------------------------------------------ # # Original author: @@ -48,17 +44,10 @@ ildir = $(BDIR)/dependencies/installed/lib top-level-programs = ls gawk gs grep libtool sed git astnoisechisel all: $(foreach p, $(top-level-programs), $(ibdir)/$(p)) -# This Makefile will be called to also build Bash locally. So when we don't -# have it yet, we'll have to use the system's bash. -ifeq ($(USE_LOCAL_BASH),yes) -SHELL := $(ibdir)/bash -else -SHELL := /bin/sh -endif - # Other basic environment settings. .ONESHELL: -.SHELLFLAGS = -ec +.SHELLFLAGS := -ec +SHELL := $(ibdir)/bash PATH := $(ibdir):$(PATH) LDFLAGS := -L$(ildir) $(LDFLAGS) CPPFLAGS := -I$(idir)/include $(CPPFLAGS) @@ -78,8 +67,7 @@ LD_LIBRARY_PATH := $(ildir):$(LD_LIBRARY_PATH) # convention, but include the name/version in their tarball names with # another format, we'll do the modification before the download so the # downloaded file has our desired format. -tarballs = $(foreach t, bash-$(bash-version).tar.gz \ - cfitsio-$(cfitsio-version).tar.gz \ +tarballs = $(foreach t, cfitsio-$(cfitsio-version).tar.gz \ cmake-$(cmake-version).tar.gz \ coreutils-$(coreutils-version).tar.xz \ curl-$(curl-version).tar.gz \ @@ -94,7 +82,6 @@ tarballs = $(foreach t, bash-$(bash-version).tar.gz \ libtool-$(libtool-version).tar.gz \ libgit2-$(libgit2-version).tar.gz \ sed-$(sed-version).tar.xz \ - make-$(make-version).tar.gz \ wcslib-$(wcslib-version).tar.bz2 \ zlib-$(zlib-version).tar.gz \ , $(tdir)/$(t) ) @@ -109,8 +96,7 @@ $(tarballs): $(tdir)/%: # Set the top download link of the requested tarball. mergenames=1 - if [ $$n = bash ]; then w=http://ftp.gnu.org/gnu/bash - elif [ $$n = cfitsio ]; then + if [ $$n = cfitsio ]; then mergenames=0 v=$$(echo $(cfitsio-version) | sed -e's/\.//' \ | awk '{l=length($1); \ @@ -133,7 +119,6 @@ $(tarballs): $(tdir)/%: elif [ $$n = libgit ]; then mergenames=0 w=https://github.com/libgit2/libgit2/archive/v$(libgit2-version).tar.gz - elif [ $$n = make ]; then w=http://akhlaghi.org/src elif [ $$n = sed ]; then w=http://ftp.gnu.org/gnu/sed elif [ $$n = tiff ]; then w=https://download.osgeo.org/libtiff elif [ $$n = wcslib ]; then w=ftp://ftp.atnf.csiro.au/pub/software/wcslib @@ -239,21 +224,10 @@ $(ildir)/libz.a: $(tdir)/zlib-$(zlib-version).tar.gz # Programs # -------- -$(ibdir)/bash: $(tdir)/bash-$(bash-version).tar.gz - $(call gbuild,$(subst $(tdir),,$<), bash-$(bash-version), static) - $(ibdir)/cmake: $(tdir)/cmake-$(cmake-version).tar.gz \ $(ibdir)/ls $(call cbuild,$(subst $(tdir),,$<), cmake-$(cmake-version)) -# Unfortunately GNU Make needs dynamic linking in two instances: when -# loading objects (dynamically linked libraries), or when using the -# `getpwnam' function (for tilde expansion). The first can be disabled with -# `--disable-load', but unfortunately I don't know any way to fix the -# second. So, we'll have to build it dynamically for now. -$(ibdir)/make: $(tdir)/make-$(make-version).tar.gz - $(call gbuild,$(subst $(tdir),,$<), make-$(make-version)) - $(ibdir)/ls: $(tdir)/coreutils-$(coreutils-version).tar.xz $(call gbuild,$(subst $(tdir),,$<), coreutils-$(coreutils-version), \ static) |