Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/sh
- # Projet Make 25/11/2015
- # LAMRI Manal et VIRAG David
- #initialisation pour les options
- f=0
- k=0
- n=0
- while getopts "f:kn" option #while pour tester l'utilisation des options fkn
- do
- case $option in
- f) #si -f est utilise
- if [ -f $OPTARG ] #teste si le nouveau fichier existe ou pas
- then fichier="$OPTARG" #s'il existe, $fichier va stocker son nom
- f=1 #f=1 pour savoir que -f a ete utilise
- else echo "Fichier: $OPTARG pas trouve" #si le nouveau fichier n'existe pas on sort du programme
- exit 1
- fi
- ;;
- k)
- k=1
- ;;
- n)
- n=1
- ;;
- \?)
- echo "option invalide"
- exit 1
- ;;
- esac
- done
- if [ $# -eq 0 ] #teste le nombre d'arguments
- then
- echo "Usage: $0 cible manquante">&2
- exit 1
- fi
- if [ $f -eq 0 ] #on cherche si le makefile commence par une majuscule ou minuscule
- then
- find "makefile"
- if [ $? -eq 0 ]
- then fichier="makefile"
- else
- find "Makefile"
- if [ $? -eq 0 ]
- then fichier="Makefile"
- fi
- fi
- fi
- #on va supprimer les lignes vides et les commentaires pour stocker dans make_tmp puis dans $fichier
- cat "$fichier" | sed '/^$/d' | sed '/^#/d' > make_tmp
- fichier="make_tmp"
- #cat $fichier
- #$1 devient la cible
- while [ $# -gt 1 ]
- do
- shift
- done
- cible=$1
- #echo "cible=$cible"
- #recuperation de la ligne de la cible
- l_cible=`cat $fichier | sed -n "/^$cible:.*/p"`
- #echo "l_cible=$l_cible"
- #recuperation des prerequis
- prerequis=`echo $l_cible | cut -d ":" -f2 | sed 's/^.$//'`
- #echo "prerequis=$prerequis"
- #recuperation du numero de ligne de la cible
- no_l_cible=`cat $fichier | grep -n "$l_cible" | cut -d ":" -f1 `
- #echo "no_l_cible=$no_l_cible"
- #recuperation de la taille du fichier final (nombre de lignes)
- nblignes=`cat $fichier | wc -l`
- #echo "nblignes=$nblignes"
- echo "arg1=$1"
- #pour chaque prerequis
- for pq in $prerequis
- do
- echo "prerequis=$pq"
- test=`cat $fichier | sed -n "/^$pq:.*/p"`
- # echo "test=$test"
- if [ -f $pq ] #si le prerequis existe deja
- then
- recente=`find -newer "$cible" -name "$pq"` #on regarde si le prerequis est plus recent que la cible
- if [ -n "$recente" ]
- then #si le
- if [ -n "$test" ]
- then
- sh $0 $pq
- else sh $0 $pq
- fi
- fi
- else #si $pq n'existe pas encore on execute la cible
- if [ -n "$test" ] || [ $k -eq 1 ]
- then if [ $n -eq 1 ]
- then sh $0
- else if [ $k -eq 1 ]
- then sh $0 #recursion
- else sh $0
- fi
- fi
- else echo "Impossible d'executer"
- exit 1
- fi
- fi
- done
- for i in `seq $(($no_l_cible + 1)) $nblignes`
- #on boucle a partir de la cible donnee
- do
- test2=`cat $fichier | sed -n "$i p" | sed 's/^.//' `
- #echo "test2=$test2"
- if [ -n "$test2" ]
- then
- exec=`cat $fichier | sed -n "$i p" | sed 's/://' ` #on cherche le commandes a executer
- #echo "exec=$exec"
- if [ $n -eq 0 ] && [ $(echo "$exec" | grep ":" | wc -l) -eq 0 ]
- then
- if [ $k -eq 1 ]
- then sh -c "$exec" # si l'option k est utilise on continue meme si une commande retourne une erreur
- else sh -c "$exec" || exit 1 #ici on tient compte des erreurs et s'arrete si'l y a une erreur
- fi
- fi
- if [ $n -eq 1 ] #pour lister les commandes
- then
- echo "Commande a executer: $exec"
- fi
- else
- break #quand on tombe sur une autre cible on break
- fi
- done
- exit 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement