#! /bin/bash
#------------------------------------------------------------------------------
#$Author: saulius $
#$Date: 2019-11-25 09:58:53 +0000 (Mon, 25 Nov 2019) $
#$Revision: 6442 $
#$URL: file:///home/saulius/svn-repositories/paskaitos/VU/software/assignment-evaluation/trunk/scripts/do-check--makefile-targets $
#------------------------------------------------------------------------------
#*
# Check that Makefile properly declares and implements all requested targets.
#**

set -ue
## set -x

DIRECTORY="$1"

SINGLE_TARGET_PENALTY=5
TOTAL_PENALTY=0

ID='$Id: do-check--makefile-targets 6442 2019-11-25 09:58:53Z saulius $'

cd "${DIRECTORY}"

MAKEFILES=$(find . \
             -name .svn -prune -o \
             -name .git -prune -o \
             \( \
                 -type f -o \
                 -type l \
             \) \
             -a \
             \( \
                 -name makefile -o \
                 -name Makefile -o \
                 -name GNUmakefile \
             \) \
             -print
          )

COUNT=$(echo "$MAKEFILES" | wc -l)

## echo $0: COUNT=$COUNT >&2

if [ "$MAKEFILES" != "" -a $COUNT -eq 1 ]
then
    # There exists only a single Makefile in the project directory,
    # let's check its targets:
    
    cd "$(dirname "$MAKEFILES")"
    MAKEFILE=$(basename "$MAKEFILES")

    ## pwd >&2

    UNIMPLEMENTED_TARGETS=""

    for TARGET in all test clean distclean
    do
        if ! grep -P "^(.+\s+)?$TARGET(\s+.+)?\s*:" $MAKEFILE > /dev/null 2>&1
        then
            UNIMPLEMENTED_TARGETS=\
"${UNIMPLEMENTED_TARGETS:+${UNIMPLEMENTED_TARGETS} }$TARGET"
            TOTAL_PENALTY=$(expr $TOTAL_PENALTY + \
                                 $SINGLE_TARGET_PENALTY)
        fi
    done

    if [ "$UNIMPLEMENTED_TARGETS" != "" ]
    then
cat <<EOF
-- [AUTO;INTERFACE;$(echo $ID | sed 's/\$//g')]

   Jūsų projekto Makefile'as ($MAKEFILES) neįgyvendina šių tikslų:
   $UNIMPLEMENTED_TARGETS.

   Už kiekvieną neįgyvendintą tikslą atimami $SINGLE_TARGET_PENALTY \
balai (-$TOTAL_PENALTY balų/-ai);

EOF
    fi


    if [ $(find -maxdepth 1 -name $MAKEFILE -perm /111 | wc -l) -ne 0 ]
    then
cat <<EOF
-- [AUTO;PERMISSIONS;$(echo $ID | sed 's/\$//g')]
   Failas "$MAKEFILE" neturi būti vykdomas (-5 balai)

EOF
    fi

    # Check if the required targets are declared as .PHONY:

    UNDECLARED_PHONY=""
    TOTAL_PENALTY=0

    for TARGET in all test clean distclean
    do
        if ! grep -P "^.PHONY\s*:\s*(.+\s+)?$TARGET(\s|$)" $MAKEFILE > /dev/null 2>&1
        then
            UNDECLARED_PHONY=\
"${UNDECLARED_PHONY:+${UNDECLARED_PHONY} }$TARGET"
            TOTAL_PENALTY=$(expr $TOTAL_PENALTY + \
                                 $SINGLE_TARGET_PENALTY)
        fi
    done

    if [ "$UNDECLARED_PHONY" != "" ]
    then
cat <<EOF
-- [AUTO;INTERFACE;$(echo $ID | sed 's/\$//g')]

   Jūsų projekto Makefile'as ($MAKEFILES) nepaskelbė šių tikslų kaip .PHONY:
   $UNDECLARED_PHONY.

   Už kiekvieną nepaskelbtą .PHONY tikslą atimami $SINGLE_TARGET_PENALTY \
balai (-$TOTAL_PENALTY balų/-ai);

EOF
    fi
fi
