#! /bin/bash # # Running examples: # # $ ./for-group group_name configure # $ ./for-group group_name make [-jN] # # This is a wrapper for the configure and Make steps designed for a group # of users (sharing the same group name) using this pipeline on the same # build directory. # # When the configuration (normally done with `./configure') and build # (normally done with `.local/bin/make') steps are done with this script, # all the files that are created within the pipeline have these properties: # # 1) Group owner will be the group specified in the command-line. # 2) The permission flags give write access to the group members. # # Original author: # Mohammad Akhlaghi # Contributing author(s): # Your name # Copyright (C) 2019, Mohammad Akhlaghi. # # 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 # See if any argument are given at all. if [ "x$1" = x ]; then echo "$0: At least two arguments are necessary:" echo echo " To configure: $ ./for-group group_name configure" echo " To build: $ ./for-group group_name make" exit 1 fi # Make sure the given group is usable. testfile=".reproducible-pipeline-group-test" if sg "$1" "echo test > $testfile"; then rm $testfile if [ "x$2" = xconfigure ]; then script="./configure" elif [ "x$2" = xmake ]; then script=".local/bin/make $3 $4" else echo "$0: a third argument is necessary." echo "It specifies the action: either 'configure' or 'make'" exit 1 fi else rm $testfile echo echo "$0: '$1' is not a usable group name!"; echo "TIP: you can use the 'groups' command to see your groups." exit 1 fi # Define the group, and set the permission so the user and group both have # read and write permissions. Then run the respective script. # # We are also exporting a special variable so `./configure' and Make can # prepare for sanity checks and avoid re-doing the whole analysis with a # typo (not using this script properly after configuration). export reproducible_paper_group_name="$1" sg "$1" "umask u+r,u+w,g+r,g+w,o-r,o-w,o-x && $script" # Group writing permissions for dependencies directory # # The common build process sets the writing permissions of the installed # programs/libraries to `755'. So group members can't write over a # file. This creates problems when another group member wants to update the # software for example. We thus need to manually add the group writing flag # to all installed software files. if [ "x$2" = xconfigure ]; then echo "Enabling group writing permission on all installed software..." chmod -R g+w .local/; fi