#!/usr/bin/env bash # Export to make android build and clean work export ANDROID_NDK_ROOT="$HOME/.android-sdk/ndk/23.2.8568313" # Folders _build_folder="gdextension" _bin_folder="build" # Error variables _error_build_folder="${_build_folder} doesn't exist" _error_bin_folder="${_bin_folder} doesn't exist" _error_no_option="\nYou have to indicate a valid option" # Platform variables _platform_linux="linux" _platform_windows="windows" _platform_android="android" _default_platform="$_platform_linux" # Clean variables and exit function clean_exit() { if [ -v 2 ]; then echo -e "$2" unset 2 fi unset _default_platform unset _platform_android unset _platform_windows unset _platform_linux unset _error_no_option unset _error_build_folder unset _error_bin_folder unset _build_folder unset _bin_folder unset ANDROID_NDK_ROOT exit "$1" } # Clean compilations function clean() { cd "$_build_folder" || clean_exit 1 "$_error_build_folder" scons "platform=${1}" --clean cd .. for object in build/*."$1".*.*.*; do rm --force "$object" done unset object unset 1 } # Build by passing the platform as a variable function build() { cd "$_build_folder" || clean_exit 1 "$_error_build_folder" echo -e "\nCompiling for $1...\n" scons "platform=$1" target=template_release scons "platform=$1" target=template_debug cd .. if [ "$1" != "$_platform_android" ]; then cd "$_bin_folder" || clean_exit 1 "$_error_bin_folder" strip ./*."$1".template_release.*.* cd .. fi unset 1 } # Analize build process to create compile_commands.json function build_db() { cd "$_build_folder" || clean_exit 1 "$_error_build_folder" echo -e "\nCompiling c++ db...\n" if [ ! -f "../${_bin_folder}/compile_commands.json" ]; then clean "$_default_platform" bear --output "../${_bin_folder}/compile_commands.json" -- scons platform="$_default_platform" else bear --append --output "../${_bin_folder}/compile_commands.json" -- scons platform="$_default_platform" fi cd .. } # Display the help function Help() { echo -e "Compiles gdextension using scons\n" echo -e "Syntax: build [-b|d|c|a|l|w|A|h]" echo -e "Options:" echo -e "\t-b for build default" echo -e "\t-d for generating a compile_commands.json" echo -e "\t-c for cleaning" echo -e "\t-a for building for Android" echo -e "\t-l for building for Linux" echo -e "\t-w for building for Windows" echo -e "\t-A for building all" echo -e "\t-h for displaying this help" } while getopts "bdchawlA" flag; do case "$flag" in A) # Builds for all platforms build "$_platform_linux" build "$_platform_windows" build "$_platform_android" clean_exit 0 ;; a) # Build for android build "$_platform_android" clean_exit 0 ;; w) # Build for windows build "$_platform_windows" clean_exit 0 ;; l) # Build for linux build "$_platform_linux" clean_exit 0 ;; d) # Generate compile_commands.json build_db clean_exit 0 ;; b) # Default build build clean_exit 0 ;; c) # Clean compilations clean "$_platform_linux" clean "$_platform_windows" clean "$_platform_android" clean_exit 0 ;; h) # Invoque help Help clean_exit 0 ;; \?) # Erroneus call Help clean_exit 1 "$_error_no_option" ;; esac done # In case there is no option pass Help clean_exit 1 "$_error_no_option"