build: ./configure basic cross-compilation support

$ sudo dpkg --add-architecture arm64
[update APT sources.list]
$ sudo apt install qemu crossbuild-essential-arm64 libssl-dev:arm64 libuuid1:arm64 libnl-3-dev:arm64 libnl-route-3-dev:arm64
$ ./configure -w -a aarch64
$ ninja
$ uname -m
x86_64
$ bin/vpp unix interactive
    _______    _        _   _____  ___
 __/ __/ _ \  (_)__    | | / / _ \/ _ \
 _/ _// // / / / _ \   | |/ / ___/ ___/
 /_/ /____(_)_/\___/   |___/_/  /_/

vpp# show cpu
Model name:               armv8
Microarch model (family): unknown (implementer 0x55 part 0x32c PASS 89.1519459600)
Flags:                    fp asimd aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve
Base frequency:           .06 GHz
vpp#

Type: make
Change-Id: Ib8bf2c7e38f109db42225db2e3182ceb8871baaf
Signed-off-by: Damjan Marion <damarion@cisco.com>
diff --git a/configure b/configure
index 978b71e..d1a356e 100755
--- a/configure
+++ b/configure
@@ -8,8 +8,11 @@
 build_dir=.
 install_dir=/usr/local
 build_type=release
-prefix_path=/opt/vpp/external/$(uname -m)/
 src_dir="$(dirname "$(readlink -f "$0")")"
+host_arch=$(uname -m)
+arch=${host_arch}
+wipe=no
+args=()
 
 help()
 {
@@ -20,6 +23,7 @@
 
 OPTIONS:
   --help, -h              This help
+  --arch, -a              Cross-compile for specified target architecture (aarch64, riscv64, i386, ...)
   --build-dir, -b         Build directory
   --install-dir, -i       Install directory
   --build-type, -t        Build type (release, debug, ...)
@@ -42,6 +46,15 @@
         exit 1
       fi
       ;;
+    -a|--arch)
+      if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
+	arch=$2
+        shift 2
+      else
+        echo "Error: Argument for $1 is missing" >&2
+        exit 1
+      fi
+      ;;
     -i|--install-dir)
       if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
         install_dir=$2
@@ -61,8 +74,8 @@
       fi
       ;;
     -w|--wipe)
-      git clean -fdx --exclude=startup.\*
-      exit 1
+      wipe=yes
+      shift 1
       ;;
     -*|--*=) # unsupported flags
       echo "Error: Unsupported flag $1" >&2
@@ -75,16 +88,29 @@
   esac
 done
 
-cmake \
-  -G Ninja \
-  -S ${src_dir}/src \
-  -B ${build_dir} \
-  -DCMAKE_PREFIX_PATH=${prefix_path} \
-  -DCMAKE_INSTALL_PREFIX=${install_dir} \
-  -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON \
-  -DCMAKE_BUILD_TYPE:STRING=${build_type}
+if [ "${arch}" != "${host_arch}" ] ; then
+  args+=("-DCMAKE_SYSTEM_NAME=Linux")
+  args+=("-DCMAKE_SYSTEM_PROCESSOR=${arch}")
+  args+=("-DCMAKE_C_COMPILER=clang")
+  args+=("-DCMAKE_C_COMPILER_TARGET=${arch}-linux-gnu")
+  args+=("-DCMAKE_ASM_COMPILER_TARGET=${arch}-linux-gnu")
+  args+=("-DCMAKE_FIND_ROOT_PATH=/usr/${arch}-linux-gnu")
+  args+=("-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER")
+  args+=("-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=BOTH")
+  args+=("-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=BOTH")
+  args+=("-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=ONLY")
+fi
 
-  cat << __EOF__
+args+=("-DCMAKE_PREFIX_PATH=/opt/vpp/external/${arch}")
+args+=("-DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON")
+args+=("-DCMAKE_INSTALL_PREFIX=${install_dir}")
+args+=("-DCMAKE_BUILD_TYPE:STRING=${build_type}")
+
+[ "${wipe}" == "yes" ] && git clean -fdx --exclude=startup.\*
+
+cmake ${args[@]} -G Ninja -S ${src_dir}/src -B ${build_dir}
+
+cat << __EOF__
 
   Useful build commands: