From 0382a0e812f5d8655a346ac6a9fd42d1326bf764 Mon Sep 17 00:00:00 2001
From: dpuzyrkov <dpuzyrkov@gmail.com>
Date: Thu, 25 Aug 2022 18:42:16 +0300
Subject: [PATCH] [*] new buildscripts added.

---
 build.sh           | 79 +++++++++++++++++++++++++++++++++++-----------
 pack.sh            | 74 ++++++++++++++++++++++++++++++++++++++-----
 packaging/linux.sh | 40 +++++++++++++++++++++++
 targets/linux.sh   | 18 +++++++++++
 targets/osx.sh     | 61 +++++++++++++++++++++++++++++++++++
 targets/windows.sh | 31 ++++++++++++++++++
 validate.sh        | 39 +++++++++++++++++++++++
 7 files changed, 315 insertions(+), 27 deletions(-)
 create mode 100755 packaging/linux.sh
 create mode 100644 targets/linux.sh
 create mode 100644 targets/osx.sh
 create mode 100644 targets/windows.sh
 create mode 100644 validate.sh

diff --git a/build.sh b/build.sh
index bfbf4a6..2aba1f9 100755
--- a/build.sh
+++ b/build.sh
@@ -8,31 +8,72 @@ else
 	HERE=`dirname ${CMD}`
 fi
 
-#build architecture 
-#- amd64-darvin
-#- amd64-linux
-#- armhf-linux
-#- armv7-linux
+export SOURCES=${HERE}/../
 
-# freebsb? openbsd? netbsd? openwrt
-# ios (ipad/iphone) aarch64-ios-darwin
+#validate input params
+. ${HERE}/validate.sh
 
-BUILD_ARCH="${1:-amd64-linux}"
-BUILD_TYPE="${2:-release}"
-BUILD_DIR=${PWD}/build_${BUILD_ARCH}_${BUILD_TYPE}
+Help()
+{
+   echo "cellframe-node build"
+   echo "Usage: build.sh [--target ${TARGETS}] [${BUILD_TYPES}]  [OPTIONS]"
+   echo "options:   -DWHATEVER=ANYTHING will be passed to cmake as defines"
+   echo
+}
 
-echo "Build [${BUILD_TYPE}] binaries for [$BUILD_ARCH] architecture in [${BUILD_DIR}] on $(nproc) threads."
+POSITIONAL_ARGS=()
 
-#make build directory and cd in 
-mkdir -p ${BUILD_DIR}
-cd ${BUILD_DIR}
+while [[ $# -gt 0 ]]; do
+  case $1 in
+    -h|--help)
+      Help
+      shift # past argument
+      shift # past value
+      ;;
+    -t|--target)
+      TARGET="$2"
+      shift # past argument
+      shift # past value
+      ;;
+    *)
+      POSITIONAL_ARGS+=("$1") # save positional arg
+      shift # past argument
+      ;;
+  esac
+done
 
-#define DEBUG for build if neccessary
+set -- "${POSITIONAL_ARGS[@]}" # restore positional parameters
+
+BUILD_TYPE="${1:-release}"
+BUILD_OPTIONS="${@:2}"
+
+BUILD_TARGET="${TARGET:-linux}"
+
+BUILD_DIR=${PWD}/build_${BUILD_TARGET}_${BUILD_TYPE}
+
+VALIDATE_TARGET $TARGET
+VALIDATE_BUILD_TYPE $BUILD_TYPE
+
+#append qmake debug\release qmake options for this
 if [ "${BUILD_TYPE}" = "debug" ]; then
-    cmake ../ -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TARGET_ARCH=$BUILD_ARCH
+    BUILD_OPTIONS[${#BUILD_OPTIONS[@]}]="-DCMAKE_BUILD_TYPE=Debug"
 else
-    cmake ../ -DCMAKE_TARGET_ARCH=$BUILD_ARCH
+    BUILD_OPTIONS[${#BUILD_OPTIONS[@]}]="-DCMAKE_BUILD_TYPE=Release"
 fi
 
-#call make to do the build process
-make -j"$(nproc)"
+. ${HERE}/targets/${BUILD_TARGET}.sh
+
+#all base logic from here
+mkdir -p ${BUILD_DIR}/build
+mkdir -p ${BUILD_DIR}/dist
+
+echo "Build [${BUILD_TYPE}] binaries for [$BUILD_TARGET] in [${BUILD_DIR}] on $(nproc) threads"
+echo "with options: [${BUILD_OPTIONS[@]}]"
+
+cd ${BUILD_DIR}/build
+
+#debug out
+echo "$CMAKE ${BUILD_OPTIONS[@]}"
+
+"${CMAKE[@]}" ../../ ${BUILD_OPTIONS[@]}
+"${MAKE[@]}" 
diff --git a/pack.sh b/pack.sh
index 1e24690..1f2a337 100755
--- a/pack.sh
+++ b/pack.sh
@@ -8,15 +8,73 @@ else
 	HERE=`dirname ${CMD}`
 fi
 
+export SOURCES=${HERE}/../
 
-BUILD_ARCH="${1:-x86_64-linux-gnu}"
-BUILD_TYPE="${2:-release}"
-PACKAGE_TYPE="${3:-deb}"
-BUILD_DIR=${PWD}/build_${BUILD_ARCH}_${BUILD_TYPE}
+containsElement () {
+  local e match="$1"
+  shift
+  for e; do [[ "$e" == "$match" ]] && return 0; done
+  return 1
+}
+
+Help()
+{
+   echo "cellframe-node pack"
+   echo "Usage: pack.sh [--target linux | windows | android] [release | debug]"
+   echo "--sign PATH should provide a path to file with env variables ANDROID_KEYSTORE_PATH, ANDROID_KEYSTORE_ALIAS, ANDROID_KEYSTORE_PASS for apk signing"
+}
+
+POSITIONAL_ARGS=()
+
+while [[ $# -gt 0 ]]; do
+  case $1 in
+    -h|--help)
+      Help
+      shift # past argument
+      shift # past value
+      ;;
+    -t|--target)
+      TARGET="$2"
+      shift # past argument
+      shift # past value
+      ;;
+    *)
+      POSITIONAL_ARGS+=("$1") # save positional arg
+      shift # past argument
+      ;;
+  esac
+done
+
+set -- "${POSITIONAL_ARGS[@]}" # restore positional parameters
+
+#all base logic from here
+
+
+BUILD_TYPE="${1:-release}"
+BUILD_OPTIONS="${@:2}"
+
+BUILD_TARGET="${TARGET:-linux}"
+
+
+#validate input params
+. ${HERE}/validate.sh
+VALIDATE_TARGET $TARGET
+VALIDATE_BUILD_TYPE $BUILD_TYPE
+
+DIST_DIR=${PWD}/build_${BUILD_TARGET}_${BUILD_TYPE}/dist
+BUILD_DIR=${PWD}/build_${BUILD_TARGET}_${BUILD_TYPE}/build
+OUT_DIR=${PWD}/build_${BUILD_TARGET}_${BUILD_TYPE}/
+
+#we care only about dist dir, i think
+[ ! -d ${DIST_DIR} ] && { echo "No build found: $BRAND $BUILD_TARGET" && exit 255; }
+
+
+
+echo "Pack [${BUILD_TYPE}] binaries for [$BUILD_TARGET] from [${DIST_DIR}] to [${OUT_DIR}]"
+
+. ${HERE}/packaging/${BUILD_TARGET}.sh
+
+PACK ${DIST_DIR} ${BUILD_DIR} ${OUT_DIR}
 
-echo "Pack [${BUILD_TYPE}] binaries for [$BUILD_ARCH] architecture from [${BUILD_DIR}] in {$PACKAGE_TYPE} package."
 
-cd ${BUILD_DIR}
 
-#do cpack, it should care all other things and generate a deb file
-cpack .
diff --git a/packaging/linux.sh b/packaging/linux.sh
new file mode 100755
index 0000000..e64aaf2
--- /dev/null
+++ b/packaging/linux.sh
@@ -0,0 +1,40 @@
+#!/bin/bash -e
+
+set -e
+
+if [ ${0:0:1} = "/" ]; then
+	HERE=`dirname $0`
+else
+	CMD=`pwd`/$0
+	HERE=`dirname ${CMD}`
+fi
+
+
+FILL_VERSION()
+{
+    source "${HERE}/../version.mk"
+
+    VERSION_UPDATE="s|VERSION_MAJOR|${VERSION_MAJOR}|g"
+    BUILD_UPDATE="s|VERSION_MINOR|${VERSION_MINOR}|g"
+    MAJOR_UPDATE="s|VERSION_PATCH|${VERSION_PATCH}|g"
+
+    for TEMPLATE in "$@"; do
+        sed \
+            -e "${VERSION_UPDATE}" \
+            -e "${BUILD_UPDATE}" \
+            -e "${MAJOR_UPDATE}" \
+            -i "${TEMPLATE}"
+    done
+}
+
+PACK() 
+{
+    
+    DIST_DIR=$1
+    BUILD_DIR=$2
+    OUT_DIR=$3
+
+    cd $BUILD_DIR
+    cpack ./
+    cp *.deb ${OUT_DIR}
+}
\ No newline at end of file
diff --git a/targets/linux.sh b/targets/linux.sh
new file mode 100644
index 0000000..13bc4ad
--- /dev/null
+++ b/targets/linux.sh
@@ -0,0 +1,18 @@
+#!/bin/bash -e
+
+set -e
+
+if [ ${0:0:1} = "/" ]; then
+	HERE=`dirname $0`
+else
+	CMD=`pwd`/$0
+	HERE=`dirname ${CMD}`
+fi
+
+
+CMAKE=(cmake)
+MAKE=(make)
+
+echo "Linux target"
+echo "CMAKE=${CMAKE[@]}"
+echo "MAKE=${MAKE[@]}"
\ No newline at end of file
diff --git a/targets/osx.sh b/targets/osx.sh
new file mode 100644
index 0000000..cd68374
--- /dev/null
+++ b/targets/osx.sh
@@ -0,0 +1,61 @@
+#!/bin/bash -e
+#OSX BUILD 
+#HAVE TO PROVIDE OSXCROSS_QT_ROOT variable
+#HAVE TO PROVIDE OSXCROSS_QT_VERSION variable
+
+set -e
+
+if [ ${0:0:1} = "/" ]; then
+	HERE=`dirname $0`
+else
+	CMD=`pwd`/$0
+	HERE=`dirname ${CMD}`
+fi
+
+
+if [ -z "$OSXCROSS_QT_ROOT" ]
+then
+      echo "Please, export OSXCROSS_QT_ROOT variable, pointing to Qt-builds locations for osxcross environment"
+      exit 255
+fi
+
+
+if [ -z "$OSXCROSS_QT_VERSION" ]
+then
+      echo "Please, export OSXCROSS_QT_VERSION variable, scpecifying Qt-version in OSXCROSS_QT_ROOT directory."
+      exit 255
+fi
+
+echo "Using QT ${OSXCROSS_QT_VERSION} from ${OSXCROSS_QT_ROOT}/${OSXCROSS_QT_VERSION}"
+
+[ ! -d ${OSXCROSS_QT_ROOT}/${OSXCROSS_QT_VERSION} ] && { echo "No QT ${OSXCROSS_QT_VERSION} found in ${OSXCROSS_QT_ROOT}" && exit 255; }
+
+#define QMAKE & MAKE commands for build.sh script
+export OSXCROSS_VERSION=1.4
+export OSXCROSS_OSX_VERSION_MIN=10.9
+export OSXCROSS_TARGET=darwin20.4
+export OSXCROSS_BASE_DIR=/osxcross/build/..
+export OSXCROSS_SDK=/opt/osxcross/bin/../SDK/MacOSX11.3.sdk
+export OSXCROSS_SDK_DIR=/opt/osxcross/bin/../SDK/MacOSX11.3.sdk/..
+export OSXCROSS_SDK_VERSION=11.3
+export OSXCROSS_TARBALL_DIR=/osxcross/build/../tarballs
+export OSXCROSS_PATCH_DIR=/osxcross/build/../patches
+export OSXCROSS_TARGET_DIR=/opt/osxcross/bin/..
+export OSXCROSS_DIR_SDK_TOOLS=/opt/osxcross/bin/../SDK/MacOSX11.3.sdk/../tools
+export OSXCROSS_BUILD_DIR=/osxcross/build
+export OSXCROSS_CCTOOLS_PATH=/opt/osxcross/bin
+export OSXCROSS_LIBLTO_PATH=/usr/lib/llvm-11/lib
+export OSXCROSS_LINKER_VERSION=609
+export PATH=/opt/osxcross//bin:/opt/osxcross//bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/osxcross/bin
+
+export CC=${OSXCROSS_ROOT}/bin/x86_64-apple-darwin20.4-clang
+export CXX=${OSXCROSS_ROOT}bin/x86_64-apple-darwin20.4-clang++
+
+CMAKE=(cmake)
+
+#everything else can be done by default make
+MAKE=(make)
+
+echo "OSXcross target"
+echo "QMAKE=${CMAKE[@]}"
+echo "MAKE=${MAKE[@]}"
\ No newline at end of file
diff --git a/targets/windows.sh b/targets/windows.sh
new file mode 100644
index 0000000..73746dd
--- /dev/null
+++ b/targets/windows.sh
@@ -0,0 +1,31 @@
+
+#!/bin/bash -e
+#WINDWOS BUILD IS SUPPORTED BY MXE
+#HAVE TO PROVIDE MXE ROOT DIRECTORY
+set -e
+
+
+if [ ${0:0:1} = "/" ]; then
+	HERE=`dirname $0`
+else
+	CMD=`pwd`/$0
+	HERE=`dirname ${CMD}`
+fi
+
+
+if [ -z "$MXE_ROOT" ]
+then
+      echo "Please, export MXE_ROOT variable, pointing to MXE environment root (we will use qt, make shure it was built)"
+      echo "To build mxe, go to https://github.com/mxe/mxe, clone it, and do \"make qt5\" within it. Install dependencies if it says so." 
+      exit 255
+fi
+
+#qmake command
+CMAKE=(${MXE_ROOT}/usr/bin/x86_64-w64-mingw32.static-cmake)
+export PATH=${MXE_ROOT}/usr/bin:$PATH
+#everything else can be done by default make
+MAKE=(make)
+
+echo "Windows target"
+echo "CMAKE=${CMAKE[@]}"
+echo "MAKE=${MAKE[@]}"
\ No newline at end of file
diff --git a/validate.sh b/validate.sh
new file mode 100644
index 0000000..327473f
--- /dev/null
+++ b/validate.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+set -e
+
+if [ ${0:0:1} = "/" ]; then
+	HERE=`dirname $0`
+else
+	CMD=`pwd`/$0
+	HERE=`dirname ${CMD}`
+fi
+
+containsElement () {
+  local e match="$1"
+  shift
+  for e; do [[ "$e" == "$match" ]] && return 0; done
+  return 1
+}
+
+
+TARGETS=(linux windows android osx)
+BUILD_TYPES=(release debug)
+
+VALIDATE_TARGET()
+{
+    containsElement "$BUILD_TARGET" "${TARGETS[@]}"  || {
+        echo "Such target not implemented [$BUILD_TARGET]"
+        echo "Available targets are [${TARGETS[@]}]"
+        exit 255
+    }
+}
+
+VALIDATE_BUILD_TYPE()
+{
+    containsElement "$BUILD_TYPE" "${BUILD_TYPES[@]}"  || {
+        echo "Unknown build typed [$BUILD_TYPE]"
+        echo "Available types are [${BUILD_TYPES[@]}]"
+        exit 255
+    }
+}
+
-- 
GitLab