# Setup functions and settings used in subdirectories. # # Their setup.sh script sources this file. # csh gives the error "Unknown colorls variable `su'." when used with newer # options supported by Zsh or GNU ls. unset LS_COLORS # Check if the given program is installed. Returns 0 if it exists, 1 # otherwise; so it can be used in if. installed() { which $1 2>&1 | perl -ne 'if (not m{^/}) { exit 1 }' } # Print the current OS. The following OS are supported at the moment: # - Debian (debian) # - Gentoo (gentoo) # - Mac OS X (darwin) # If an unsupported OS is used an error is printed. os() { if [ -f /etc/debian_version ]; then echo debian elif [ -f /etc/gentoo-release ]; then echo gentoo elif [ x`uname` = xDarwin ]; then echo darwin else echo unsupported OS! >&2 return 1 fi } # Creates a symbolic link for file $1 in dirname of $2 with name of basename # $2. # # `./link.sh example ~/.examplerc` creates a symbolic link to example # (wherever it is located) in ~/ named .examplerc. link() { # Get all necessary paths. pwd=`pwd` base=`dirname "$2"` source=`echo "$pwd/$1" | sed "s|$base/||"` target=`basename "$2"` # Go to the directory where the link is going to be created. cd "$base" # Abort if the target file exists and is no symbolic link. Prevents # overwriting real files. if [ -e "$target" -a ! -h "$target" ]; then echo "link(): target '$target' exists already and is no symbolic link!" >&2 exit 1 fi # Make sure the source exists. if [ ! -e "$source" ]; then echo "link(): source '$source' doesn't exist!" >&2 exit 1 fi # Create the new symbolic link; remove the old one if necessary. echo "link(): linking '$source' to '$target'" rm -f "$target" ln -s "$source" "$target" # Go back to the directory where we were before. cd "$pwd" unset pwd base source target } # Write a warning to $1 to make clear it should not be modified. $2 is the # source for the generated file. Also print a message to stdout that the file # $1 was generated from $2 using the command $3 with options $4. warning() { echo "###################################" > $1 echo "# WARNING! DO NOT EDIT THIS FILE! #" >> $1 echo "###################################" >> $1 echo >> $1 echo "# It was generated from $2 on `date`." >> $1 echo >> $1 # Display given options if there were any (Zsh has a problem with $options # as variable name). option= if [ -n "$4" ]; then option=" with options '$4'" fi # Write message to stdout. echo "$3: generating '$1' from '$2'$option" unset option } # Generate a file using several methods. A warning not to edit it is # automatically added to the created file and a message printed to stdout # through warning(). # # The following commands are possible; the file extension for the source file # in brackets. # # - m4 (.m4): pipe $2.m4 through m4 then write it to $2 # - awk (.in): pipe $2.in through awk then write it to $2 # - perl (.in): pipe $2.in through perl then write it to $2 # - cat ($3): copy $2$3 to $2 generate() { # Get command and target file. command="$1" file="$2" # Remove arguments from list. shift shift # Set extension for the used commands. When cat is used $3 is used as # extension. if [ x"$command" = xm4 ]; then extension=.m4 elif [ x"$command" = xawk -o x"$command" = xperl ]; then extension=.in elif [ x"$command" = xcat ]; then extension="$1" # is $3 in reality, $1 because of shifting shift # Print a warning and exit if an unsupported command is used. else echo "generate(): command '$command' not supported!" >&2 exit 1 fi # Add warning to file and write a message to stdout. warning "$file" "$file$extension" $command "$*" # Generate $file from $file$extension using the given command. cat "$file$extension" | $command "$@" >> "$file" unset command file }