interfaces: Add Script to generate vendor hal make files

Author: Vinay Verma <vvinay@codeaurora.org>
Date:   Mon Feb 19 07:45:32 2018 +0530

    Add Script to generate vendor hal make files

    Script will generate blueprint files for vendor hals present
    under proprieatry and opensource projects.It will recursively
    search for all hal files and generate accordingly

    Change-Id: Id08c68d0d059a9bbbf0260350e2c3d5bd702d517

Author: Vinay Verma <vvinay@codeaurora.org>
Date:   Wed Mar 14 17:18:23 2018 +0530

    - Do not generate fingerprint bp files - Check for bp files and exit if found.

    Change-Id: Iae998facddd73d4ac24b4366dcd0f3bea119e6b7

Author: Vinay Verma <vvinay@codeaurora.org>
Date:   Tue Apr 17 10:40:33 2018 +0530

    Generate blueprint files for HAL's

    - Add condition to check if .bp exists
    - Generate .bp only if not present in build tree for a HAL.
    - Remove fingerprint hard-coding and checks for not generating
      bp files. It will be taken care by above point.

    Change-Id: I21501c768e732167f44887730e0a1dc38ada4140

Author: David Ng <dave@codeaurora.org>
Date:   Fri May 4 18:53:24 2018 -0700

    Re-run hidl-gen on updated vendor HALs

    Update vendor_hal makefile generation script to always re-run
    for previously compile-time generated Android.bp's - but update
    only if there are differences.

    hidl-gen is skipped in HAL directories where there's an existing
    Android.bp but are not previously compile-time generated.

    Compile-time generated Android.bp's are denoted by an
    .hidl-autogen alongside the Android.bp.

    Change-Id: I79f70d48a72c456649d975b450a4d69bb47e9e93

Author: David Ng <dave@codeaurora.org>
Date:   Fri May 11 19:09:13 2018 -0700

    Sanitize host tools used in vendor HAL hidl-gen wrapper

    Sanitize all host tools used by the vendor HAL hidl-gen wrapper.
    This is an attempt to standardize the host tool behaviors that
    may be impacted by variations in build-time environments.

    Change-Id: I2f6eb5af05a7f2a3f5ea82ee1780a94f305b2b18

Author: Vinay Verma <vvinay@codeaurora.org>
Date:   Sun Jun 24 19:53:06 2018 +0530

    Handle case when .bp generation is failed

    - Return exit command to calling function if .bp generation is
      failed.
    - Do not proceed with other HAL's if error is found.
    - Move creation of .hidl-gen file at earlier stage because failure
      in bp genration results in empty .bp file and script can run in
      wrong case of pre-existing .bp files in next run.

    Change-Id: I0f45326913fa1a4e3b6e289cf56a43b4382a9f7e

Author: Vinay Verma <vvinay@codeaurora.org>
Date:   Tue Jul 17 17:49:01 2018 +0530

    Create .hidl-autogen marker

    If Android.bp is already present then it is moved to .hidl-autogen
    and then back to Android.bp after checking diff. In this case we
    are left with no marker and in next iteration Android.bp is
    treated as committed file and hence not updated.

    Creating .hidl-autogen explicitly.

    Change-Id: I9c02dbba9a86cbdc4551d43a75b47d7d17c1b9d3

Author: Dileep Marchya <dmarchya@codeaurora.org>
Date:   Wed Jun 26 20:42:17 2019 +0530

    hidl-gen: Match exact string in hidl-gen before skipping.

    - Grep leads to a substring match and causes package
      names to get skipped incorrectly. Use -w option to
      find the exact match.

    CRs-Fixed: 2479486
    Change-Id: Ic1fbe72304177d396eab142eaf832b841b61da24

Change-Id: Ic574fbee9ce858ee102235e248a9bf494112848b
diff --git a/interfaces/vendor_hal_makefile_generator.sh b/interfaces/vendor_hal_makefile_generator.sh
new file mode 100755
index 0000000..7321b0a
--- /dev/null
+++ b/interfaces/vendor_hal_makefile_generator.sh
@@ -0,0 +1,161 @@
+#!/bin/bash
+# Copyright (c) 2018, The Linux Foundation. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+#       copyright notice, this list of conditions and the following
+#       disclaimer in the documentation and/or other materials provided
+#       with the distribution.
+#     * Neither the name of The Linux Foundation nor the names of its
+#       contributors may be used to endorse or promote products derived
+#       from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE US
+
+# This file is used to generate blueprint/makefiles for the vendor hals
+
+# Sanitize host tools
+LS=`which ls`
+LS=${LS:-ls}
+MV=`which mv`
+MV=${MV:-mv}
+CAT=`which cat`
+CAT=${CAT:-cat}
+CUT=`which cut`
+CUT=${CUT:-cut}
+REV=`which rev`
+REV=${REV:-rev}
+SED=`which sed`
+SED=${SED:-sed}
+DIFF=`which diff`
+DIFF=${DIFF:-diff}
+ECHO=`which echo`
+ECHO=${ECHO:-echo}
+FIND=`which find`
+FIND=${FIND:-find}
+GREP=`which grep`
+GREP=${GREP:-grep}
+SORT=`which sort`
+SORT=${SORT:-sort}
+TOUCH=`which touch`
+TOUCH=${TOUCH:-touch}
+
+function generate_make_files() {
+    local dir_path="$ANDROID_BUILD_TOP/$1"
+    pushd $dir_path > /dev/null
+
+    # Due to same package name in different folders we need to detect
+    # opensource case so that it can be handled.
+    local flag_opensource=false
+    if ${ECHO} "$dir_path" | ${GREP} "opensource" > /dev/null;then
+        flag_opensource=true
+    fi
+
+    # Search for all HAL files in given dir.
+    local halFilePaths=`${ECHO} $(${FIND} -iname "*.hal" | ${SORT})`
+
+    #Store package name in below array to create a unique set so that we trigger
+    #hidl-gen only once  for a given package.
+    package_collection=()
+
+    #Iterate over identified .hal Paths
+    local prev_path=""
+    for file in $halFilePaths; do
+        local hal_path=`${ECHO} "$file" | ${REV} | ${CUT} -d"/" -f2- | ${REV}`
+        if [ -e "$hal_path/Android.bp" ] && [ ! -e "$hal_path/.hidl-autogen" ]; then
+            if [ ! "$hal_path" = "$prev_path" ]; then
+                ${ECHO} "Skipping hidl-gen on $1/$hal_path as Android.bp is not compile-time generated"
+                prev_path="$hal_path"
+            fi
+            continue;
+        fi
+        prev_path="$hal_path"
+
+        # Find out package name from HAL file
+        local hal_package=`${ECHO} $(${CAT} $file | ${GREP} -E -m 1 "^package ") | ${CUT} -d' ' -f2`
+
+        # Get rid of extra delimter
+        hal_package=${hal_package%?}
+
+        #Check if we already executed hidl-gen for a given package
+        if ${ECHO} "${package_collection[@]}" | ${GREP} -w $hal_package > /dev/null; then
+            continue;
+        else
+            package_collection+=($hal_package)
+            local delimeter=`${ECHO} "$file" | ${CUT} -d'/' -f2`
+            local root=`${ECHO} "$hal_package" | ${SED} "s/$delimeter/#/g" | ${CUT} -d'#' -f1`
+            #Identify Package Root
+            root=${root%?}
+            #Create root arguments for hidl-command
+            local root_arguments="-r $root:$1 -r  $2"
+        fi
+
+        local hal_path2=$1;
+        #Handling for opensource HAL to solve package name conflict
+        if [ "$flag_opensource" = true ]; then
+            root="$root.$delimeter"
+            hal_path2="$hal_path2/$delimeter"
+        fi
+
+        local root_arguments="-r $root:$hal_path2 -r  $2"
+
+        update_check=0
+        if [ -e "$hal_path/Android.bp" ]; then
+            ${MV} $hal_path/Android.bp $hal_path/.hidl-autogen
+            update_check=1
+        fi
+        ${TOUCH} $hal_path/.hidl-autogen
+
+        ${ECHO} -n "Running hidl-gen on $hal_package: "
+        hidl-gen -Landroidbp $root_arguments $hal_package;
+        rc=$?; if [[ $rc != 0 ]]; then return $rc; fi
+
+        if [ "$update_check" -eq 1 ]; then
+            ${DIFF} -q $hal_path/Android.bp $hal_path/.hidl-autogen > /dev/null
+            if [ $? -eq 0 ]; then
+                ${ECHO} "no changes"
+                ${MV} $hal_path/.hidl-autogen $hal_path/Android.bp
+            else
+                ${ECHO} "updated"
+            fi
+        else
+            ${ECHO} "created"
+        fi
+        ${TOUCH} $hal_path/.hidl-autogen
+    done
+    popd > /dev/null
+}
+
+function start_script_for_interfaces {
+    #Find interfaces in workspace
+    local interfaces=$(${LS} -d ${ANDROID_BUILD_TOP}/vendor/mediatek/*/interfaces)
+
+    ${ECHO} "HIDL interfaces:  Scanning for changes..."
+    for interface in $interfaces; do
+        #generate interfaces
+        local relative_interface=${interface#${ANDROID_BUILD_TOP}/}
+        generate_make_files $relative_interface "android.hidl:system/libhidl/transport"
+        if [ $? -ne 0 ] ; then
+           ${ECHO} "HIDL interfaces: Update Failed"
+           return 1;
+        fi
+    done
+    ${ECHO} "HIDL interfaces:  Update complete."
+}
+
+#Start script for interfaces
+start_script_for_interfaces
+