diff --git a/.editorconfig b/.editorconfig index db2102a6c..cf6541b8c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -19,6 +19,13 @@ tab_width = 4 insert_final_newline = true trim_trailing_whitespace = true +[apothecary] +indent_style = space +indent_size = 4 +tab_width = 4 +insert_final_newline = true +trim_trailing_whitespace = true + # Override JSON [*.json] indent_style = space diff --git a/.github/workflows/build-android.yml b/.github/workflows/build-android.yml index 5f3dd0f35..ea42f4a51 100644 --- a/.github/workflows/build-android.yml +++ b/.github/workflows/build-android.yml @@ -13,7 +13,7 @@ env: NO_FORCE: 1 GA_CI_SECRET: ${{ secrets.CI_SECRET }} USE_ARTIFACT: true - DISABLE_WORKFLOW: "false" + DISABLE_WORKFLOW: "true" concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} diff --git a/.github/workflows/build-emscripten.yml b/.github/workflows/build-emscripten.yml index 9c1a09f1a..440ff9c52 100644 --- a/.github/workflows/build-emscripten.yml +++ b/.github/workflows/build-emscripten.yml @@ -17,7 +17,7 @@ env: EMSDK_VERSION: "4.0.2" USE_ARTIFACT: true PTHREADS_ENABLED: 1 - DISABLE_WORKFLOW: "false" + DISABLE_WORKFLOW: "true" jobs: pre-check: diff --git a/.github/workflows/build-ios.yml b/.github/workflows/build-ios.yml index 10ce62ed3..1f575d910 100644 --- a/.github/workflows/build-ios.yml +++ b/.github/workflows/build-ios.yml @@ -17,7 +17,7 @@ env: NO_FORCE: 1 GA_CI_SECRET: ${{ secrets.CI_SECRET }} USE_ARTIFACT: true - DISABLE_WORKFLOW: "false" + DISABLE_WORKFLOW: "true" jobs: pre-check: diff --git a/.github/workflows/build-linux-cross.yml b/.github/workflows/build-linux-cross.yml index f79b04b78..5b9b1e575 100644 --- a/.github/workflows/build-linux-cross.yml +++ b/.github/workflows/build-linux-cross.yml @@ -75,9 +75,6 @@ jobs: - name: Scripts Setup run: sudo ./scripts/${{ env.TARGET }}/${{ env.ARCH }}/setup.sh - - - name: Scripts Install - run: sudo ./scripts/${{ env.TARGET }}/${{ env.ARCH }}/install.sh - name: BuildLinux64 working-directory: ${{env.GITHUB_WORKSPACE}} diff --git a/.github/workflows/build-linux-rpi.yml b/.github/workflows/build-linux-rpi.yml index 443b03232..907fb3a49 100644 --- a/.github/workflows/build-linux-rpi.yml +++ b/.github/workflows/build-linux-rpi.yml @@ -90,16 +90,11 @@ jobs: echo "RELEASE=latest" >> $GITHUB_ENV fi - - name: Update and Upgrade System Packages - run: | - sudo apt update && sudo apt dist-upgrade -y - sudo apt-get install -y build-essential gcc g++ gfortran git texinfo bison libncurses-dev tar wget qemu-user-static rsync xz-utils - - name: Script Install - run: ./scripts/${{ env.TARGET }}/raspios/${{ env.ARCH }}/install.sh + run: sudo ./scripts/${{ env.TARGET }}/raspios/${{ env.ARCH }}/install.sh - name: Setup Cross Compiler and Target Local File System - run: ./scripts/${{ env.TARGET }}/raspios/${{ env.ARCH }}/setup.sh + run: sudo ./scripts/${{ env.TARGET }}/raspios/${{ env.ARCH }}/setup.sh - name: Build run: ./scripts/${{ env.TARGET }}/raspios/${{ env.ARCH }}/build.sh diff --git a/.github/workflows/build-linux64.yml b/.github/workflows/build-linux64.yml index 8d22a9264..2470a2d16 100644 --- a/.github/workflows/build-linux64.yml +++ b/.github/workflows/build-linux64.yml @@ -17,7 +17,7 @@ env: NO_FORCE: 1 GA_CI_SECRET: ${{ secrets.CI_SECRET }} USE_ARTIFACT: true - DISABLE_WORKFLOW: "false" + DISABLE_WORKFLOW: "true" jobs: pre-check: diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 969f6c512..7775c8cd7 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -17,7 +17,7 @@ env: NO_FORCE: 1 GA_CI_SECRET: ${{ secrets.CI_SECRET }} USE_ARTIFACT: true - DISABLE_WORKFLOW: "false" + DISABLE_WORKFLOW: "true" jobs: pre-check: diff --git a/.github/workflows/build-msys2.yml b/.github/workflows/build-msys2.yml index 7668a403e..a6018284e 100644 --- a/.github/workflows/build-msys2.yml +++ b/.github/workflows/build-msys2.yml @@ -17,7 +17,7 @@ env: NO_FORCE: 1 GA_CI_SECRET: ${{ secrets.CI_SECRET }} USE_ARTIFACT: false - DISABLE_WORKFLOW: "false" + DISABLE_WORKFLOW: "true" jobs: pre-check: @@ -44,7 +44,7 @@ jobs: - mingw64 - ucrt64 - clang64 - # - clangarm64 + - clangarm64 name: ${{ matrix.flavor }} runs-on: windows-latest defaults: @@ -71,6 +71,7 @@ jobs: python3:p libpng:p zlib:p + curl:p - name: Determine Release id: vars shell: bash diff --git a/.github/workflows/build-tvos.yml b/.github/workflows/build-tvos.yml index 0da4e2da0..6ab3896ec 100644 --- a/.github/workflows/build-tvos.yml +++ b/.github/workflows/build-tvos.yml @@ -17,7 +17,7 @@ env: NO_FORCE: 1 GA_CI_SECRET: ${{ secrets.CI_SECRET }} USE_ARTIFACT: true - DISABLE_WORKFLOW: "false" + DISABLE_WORKFLOW: "true" jobs: pre-check: diff --git a/apothecary.sh b/apothecary.sh index f31b5b4c2..ac79b46a8 100755 --- a/apothecary.sh +++ b/apothecary.sh @@ -2,7 +2,6 @@ # pipe commands to core apothecary APOTHE_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" APOTHE_DIR="$(realpath "$APOTHE_DIR/apothecary")" -SECURE_SCRIPT="$(realpath "$APOTHE_DIR/scripts/secure.sh")" APOTHE_SCRIPT="$(realpath "$APOTHE_DIR/apothecary")" echo "$(date): [apothecary do my Command: $@]" source "$APOTHE_SCRIPT" $@ diff --git a/apothecary/apothecary b/apothecary/apothecary index ae39c9af0..f940b3b07 100755 --- a/apothecary/apothecary +++ b/apothecary/apothecary @@ -49,13 +49,16 @@ BUILD_DEPENDENCIES=1 HOST_OS= # compile os ("osx", "windows", "linux") # library build type ("osx", "ios", "vs", etc) if [ -z "${TYPE+x}" ]; then - #echo "No TYPE argument provided." - TYPE= + #echo "No TYPE argument provided." + TYPE= fi # full path to this script's dir APOTHECARY_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +APOTHECARY_ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )" + +RUN_DIR="$(pwd)" # full path to the dir of the current formula FORMULA_DIR= @@ -73,19 +76,28 @@ DEPEND_DIR="" # formulas should pass this as -j${PARALLEL_MAKE} to make PARALLEL_MAKE=1 -DOWNLOADER_SCRIPT="$(realpath "$APOTHECARY_DIR/../scripts/downloader.sh")" -SAVE_SCRIPT="$(realpath "$APOTHECARY_DIR/../scripts/save.sh")" -LOAD_SCRIPT="$(realpath "$APOTHECARY_DIR/../scripts/load.sh")" -SAVE_FILE="$(realpath "$APOTHECARY_DIR/../scripts")/status.txt" -SECURE_SCRIPT="$(realpath "$APOTHECARY_DIR/../scripts/secure.sh")" -FORMAT_SCRIPT="$(realpath "$APOTHECARY_DIR/../scripts/format.sh")" +if command -v cygpath &> /dev/null; then + CONVERT_PATH_CMD="cygpath -wa" + IS_WSL=false + DRIVE="/c" +else + CONVERT_PATH_CMD="realpath" + IS_WSL=false + DRIVE="/c" +fi + +DOWNLOADER_SCRIPT="$(realpath "$APOTHECARY_ROOT_DIR/scripts/downloader.sh")" +SAVE_SCRIPT="$(realpath "$APOTHECARY_ROOT_DIR/scripts/save.sh")" +LOAD_SCRIPT="$(realpath "$APOTHECARY_ROOT_DIR/scripts/load.sh")" +SAVE_FILE="$(realpath "$APOTHECARY_ROOT_DIR/scripts")/status.txt" +SECURE_SCRIPT="$(realpath "$APOTHECARY_ROOT_DIR/scripts/secure.sh")" +FORMAT_SCRIPT="$(realpath "$APOTHECARY_ROOT_DIR/scripts/format.sh")" OSTYPE_SCRIPT="$(realpath "$APOTHECARY_DIR/ostype.sh")" APOTHECARY_SCRIPT="$(realpath "$APOTHECARY_DIR/apothecary")" USE_SAVE=1 thisDir=$( dirname "`realpath "$0"`" ) - BUILD_MACHINE_ARCH=`uname -m` ################################################################################ @@ -106,7 +118,7 @@ mkdir -p ${APOTHECARY_DIR}/build FORMULAS_DIR=$(realpath ${APOTHECARY_DIR}/formulas) BUILD_DIR=$(realpath ${APOTHECARY_DIR}/build) OF_ROOT=$(realpath ${APOTHECARY_DIR}/../../..) -REL_LIBS_DIR=${APOTHECARY_DIR}/../out +REL_LIBS_DIR=$(realpath ${APOTHECARY_ROOT_DIR}/out) ADDONS_DIR=$OF_ROOT/addons REL_ADDONS_DIR=$OF_ROOT/addons # echo "OF: $OF_ROOT/" @@ -141,7 +153,7 @@ PKG_CONFIG_PATH=${PKG_CONFIG_PATH:-} # To use, set USE_GIT=1 if [ -z "${USE_GIT+x}" ]; then - export USE_GIT= + export USE_GIT= fi # by default assume visual studio pro @@ -158,26 +170,26 @@ WIN10_INSTALLED_SDK_2022_HEX=0x0A004F5C WIN11_INSTALLED_SDK_2022=10.0.22621.0 if [ -z "${VS_TYPE+x}" ]; then # Professional # Enterprise # Community - VS_TYPE=Community + VS_TYPE=Community fi -if [ -z "${VS_COMPILER+x}" ]; then # MSVC / # Clang LLVM - VS_COMPILER=MSVC +if [ -z "${VS_COMPILER+x}" ]; then # MSVC / # Clang LLVM + VS_COMPILER=MSVC fi if [ -z "${VS_HOST+x}" ]; then - VS_HOST=amd64 + VS_HOST=amd64 fi TARGET_WIN_11=0 if [ -z "${XCFRAMEWORK_ALL+x}" ]; then - export XCFRAMEWORK_ALL=false + export XCFRAMEWORK_ALL=false fi if [ -z "${LOADSAVE_RESULT+x}" ]; then - declare -a LOADSAVE_RESULT=0 + declare -a LOADSAVE_RESULT=0 fi if [ -z "${GCC+x}" ]; then - GCC=gcc14 + GCC=gcc14 fi WIN11_INSTALLED_SDK_2022_HEX=0x0A00586D @@ -210,22 +222,22 @@ commands: options: -t specify libary type when building, detects type from OS by default - valid types: osx, linux, vs, msys2, ios, tvos, android + valid types: osx, linux, vs, msys2, ios, tvos, android -a specify architecture, either 32 or 64 (default is 32 bit) - note: not currently needed, reserved for future use + note: not currently needed, reserved for future use -b set the lib build dir, default: \$APOTHECARY_DIR/build -d set the compiled libs destination dir, - default: OF core libs dir or addons/addonName/libs for addons + default: OF core libs dir or addons/addonName/libs for addons -v verbose mode, print out some extra info while mixing formulas -g prefer git to download if available -s specify the git-tag to select another version of the library - note: availible only with git option + note: availible only with git option -f force download even if build folder already exists @@ -237,6 +249,10 @@ options: -h print this usage guide + -c compiler + + -k no colours + -x xcframework all examples: @@ -298,42 +314,42 @@ trap "trapSignal SIGTERM" SIGTERM # console printing functions (with color) echoError() { - echo -e "$CON_BOLD$CON_RED$1$CON_DEFAULT" + echo -e "$CON_BOLD$CON_RED$1$CON_DEFAULT" } echoWarning() { - echo -e "$CON_BOLD$CON_YELLOW$1$CON_DEFAULT" + echo -e "$CON_BOLD$CON_YELLOW$1$CON_DEFAULT" } echoInfo() { - echo -e "$CON_BOLD$CON_WHITE$1$CON_DEFAULT" + echo -e "$CON_BOLD$CON_WHITE$1$CON_DEFAULT" } echoStart() { - echo -e "$CON_BOLD$CON_LIGHT_GRAY$1$CON_DEFAULT" + echo -e "$CON_BOLD$CON_LIGHT_GRAY$1$CON_DEFAULT" } echoNotice() { - echo -e "$CON_BOLD$CON_YELLOW_GREEN$1$CON_DEFAULT" + echo -e "$CON_BOLD$CON_YELLOW_GREEN$1$CON_DEFAULT" } echoSuccess() { - echo -e "$CON_BOLD$CON_GREEN$1$CON_DEFAULT" + echo -e "$CON_BOLD$CON_GREEN$1$CON_DEFAULT" } echoVerbose() { - if [ $A_VERBOSE == 1 ] ; then - echoInfo "$1" - fi + if [ $A_VERBOSE == 1 ] ; then + echoInfo "$1" + fi } trapSignal() { - echo - echoError " Received signal $1" - exit 1 + echo + echoError " Received signal $1" + exit 1 } # trap any script errors and exit trap "trapError $LINENO" ERR trapError() { - echo - echoError " ^ Received errexit on line $(caller)" >&2 - exit 1 + echo + echoError " ^ Received errexit on line $(caller)" >&2 + exit 1 } ################################################################################ @@ -341,678 +357,727 @@ trapError() { # from http://www.mkssoftware.com/docs/man1/getopts.1.asp while getopts t:a:b:d:s:j:m:c:hgvxfpewy opt ; do - case "$opt" in - t) # set the library build type - export TYPE="$OPTARG";; - #export TARGET=$TYPE - a) # set the architecture - export ARCH=$OPTARG - if [ -z "${ARCH+x}" ]; then - echo "No ARCH argument provided" - fi - ;; - b) # set the build dir - export BUILD_DIR="$OPTARG" ;; - d) # set lib destination dir - export CUSTOM_LIBS_DIR="$OPTARG" ;; - s) # set the git tag to switch version - export SWITCH_VER="$OPTARG" ;; - j) # set the -j parameter for make - export PARALLEL_MAKE="$OPTARG" ;; - g) # set git usage - export USE_GIT=1 ;; - h) # print help and exit - echo "$HELP" ; exit 0 ;; - v) # verbose mode = true - export A_VERBOSE=1 - VERBOSE_MAKEFILE=YES - ;; - e) # use visual enterprise - export VS_TYPE=Enterprise ;; - f) # force download - export FORCE_DOWNLOAD=1 ;; - y) # use pthreads - export PTHREADS_ENABLED=1 ;; - p) # Dont build dependencies - export BUILD_DEPENDENCIES=0 ;; - w) # win11 - export TARGET_WIN_11=1 ;; - c) # host compiler - export VS_COMPILER="$OPTARG" ;; - m) # set the -m parameter for make - export MULTITHREADED_TYPE="$OPTARG" ;; - x) # set the -x xcframeworks build - export XCFRAMEWORK_ALL=true;; - [?]) # print help and exit - echo "$HELP" ; exit 0 ;; - esac + case "$opt" in + t) # set the library build type + export TARGET=$TYPE + export TYPE="$OPTARG";; + + a) # set the architecture + export ARCH=$OPTARG + if [ -z "${ARCH+x}" ]; then + echo "No ARCH argument provided" + fi + ;; + b) # set the build dir + export BUILD_DIR="$OPTARG" ;; + d) # set lib destination dir + export CUSTOM_LIBS_DIR="$OPTARG" ;; + s) # set the git tag to switch version + export SWITCH_VER="$OPTARG" ;; + j) # set the -j parameter for make + export PARALLEL_MAKE="$OPTARG" ;; + g) # set git usage + export USE_GIT=1 ;; + h) # print help and exit + echo "$HELP" ; exit 0 ;; + v) # verbose mode = true + export A_VERBOSE=1 + VERBOSE_MAKEFILE=YES + ;; + e) # use visual enterprise + export VS_TYPE=Enterprise ;; + f) # force download + export FORCE_DOWNLOAD=1 ;; + y) # use pthreads + export PTHREADS_ENABLED=1 ;; + p) # Dont build dependencies + export BUILD_DEPENDENCIES=0 ;; + w) # win11 + export TARGET_WIN_11=1 ;; + c) # host compiler + export VS_COMPILER="$OPTARG" ;; + k) # host compiler + export NO_COLOR=1;; + m) # set the -m parameter for make + export MULTITHREADED_TYPE="$OPTARG" ;; + x) # set the -x xcframeworks build + export XCFRAMEWORK_ALL=true;; + [?]) # print help and exit + echo "$HELP" ; exit 0 ;; + esac done -shift $(expr $OPTIND - 1) +# Ensure OPTIND is set and valid before shifting +if [[ -n "$OPTIND" && "$OPTIND" -gt 1 ]]; then + shift $((OPTIND - 1)) +else + echo "WARNING: No arguments to shift. Skipping..." +fi + if [ -z "${ARCH+x}" ]; then - echo "No ARCH argument provided - setting to 64" - ARCH=64 + echo "No ARCH argument provided - setting to 64" + ARCH=64 fi # verbose mode bool if [ -z "${A_VERBOSE+x}" ]; then - export A_VERBOSE=0 + export A_VERBOSE=0 fi # If formula already exists force download if [ -z "${FORCE_DOWNLOAD+x}" ]; then - export FORCE_DOWNLOAD=0 + export FORCE_DOWNLOAD=0 fi if [ -z "${LIBS_DIR_REAL+x}" ]; then - export LIBS_DIR_REAL= + export LIBS_DIR_REAL= fi if [ -z "${C_STANDARD+x}" ]; then - export C_STANDARD=17 + export C_STANDARD=17 fi if [ -z "${CPP_STANDARD+x}" ]; then - export CPP_STANDARD=23 + export CPP_STANDARD=23 fi if [ -z "${VS_TYPE+x}" ]; then # Professional # Enterprise # Community - export VS_TYPE=Community + export VS_TYPE=Community fi if [ -z "${VS_COMPILER+x}" ]; then # MSVC / # Clang LLVM - export VS_COMPILER=MSVC + export VS_COMPILER=MSVC fi if [ -z "${VS_HOST+x}" ]; then - export VS_HOST=amd64 + export VS_HOST=amd64 fi TARGET_WIN_11=0 if [ -z "${XCFRAMEWORK_ALL+x}" ]; then - export XCFRAMEWORK_ALL=false + export XCFRAMEWORK_ALL=false fi if [ -z "${LOADSAVE_RESULT+x}" ]; then - declare -a LOADSAVE_RESULT=0 + declare -a LOADSAVE_RESULT=0 fi function setup_vs_vars(){ - #2019 and onwards we need to pass the platform as the arg - if [ $VS_VER -gt 15 ] ; then - # we want to make sure that the build command is called with the correct environment variables set up - # we achieve this by piping all commands into a .bat file and then calling this temporary .bat file. - - echo "-- Searching for vs-build" - #cmd.exe //C """$VS_VARS_PATH $PLATFORM""" - - echo "-- Searching for vs-build2" - # vswhere is a utility to find the most recent vs compiler toolchain. it is - # assumed to be installed at a fixed location - if [ $VS_VER == 15 ] ; then - VSWHERE_EXE=`cmd.exe //c "echo %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"` - elif [ $VS_VER == 16 ] ; then - VSWHERE_EXE=`cmd.exe //c "echo %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"` - elif [ $VS_VER -gt 17 ] ; then - VSWHERE_EXE=`cmd.exe //c "echo %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"` - else - VSWHERE_EXE=`cmd.exe //c "echo %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"` - fi - - echo "-- Found vswhere: ${VSWHERE_EXE}" - # vswhere allows us to query the install dir of the ms build tools - VS_INSTALL_PATH=`cmd //c "${VSWHERE_EXE}" -latest -products Microsoft.VisualStudio.Product.${VS_TYPE} -requires Microsoft.VisualStudio.Component.VC.CoreIde -property installationPath` - echo "-- Found vs install path: ${VS_INSTALL_PATH}" - # msbuild is the tool used to build visual studio solutions - MSBUILD_PATH="${VS_INSTALL_PATH}\MSBuild\\${VS_VER}.0\Bin\MSBuild.exe" - echo "-- Found MSBuild path: ${MSBUILD_PATH}" - - if [ $VS_COMPILER == "MSVC" ]; then - VS_VER_DIR=$(ls "$VS_BASE_PATH/VC/Tools/${VS_COMPILER}/" | tail -1) - if [ $ARCH == "arm64" ] || [ $ARCH == "ARM" ] || [ $ARCH == "arm64ec" ]; then - export VS_BIN_PATH="$VS_BASE_PATH/VC/Tools/${VS_COMPILER}/$VS_VER_DIR/bin/$VS_HOSTPLATFORM/$BUILD_PLATFORM" - else - export VS_BIN_PATH="$VS_BASE_PATH/VC/Tools/${VS_COMPILER}/$VS_VER_DIR/bin/$VS_HOSTPLATFORM/$BUILD_PLATFORM" - fi - else - export VS_BIN_PATH="$VS_BASE_PATH/VC/Tools/Llvm/$BUILD_PLATFORM/bin" - fi - echo "VS_BIN_PATH was not set - setting to $VS_BIN_PATH" - - export PATH=$VS_BIN_PATH:$PATH - ( - # with parentheses we open a new sub-shell scope to make sure we're not overwriting any presets for IFS - # set input field separator to colon (:) for current scope - IFS=: - for vs_bin_directory in ${VS_BIN_PATH}; do - # we must make sure each given directory exists - if [ ! -d ${vs_bin_directory} ]; then - echo "Couldn't confirm Visual Studio path exists: '$vs_bin_directory', probably installed on a non standard location?" - exit 1 - else - echo "Confirmed VS_BIN_PATH element exists: '${vs_bin_directory}'" - fi - - done - ) - - fi + #2019 and onwards we need to pass the platform as the arg + if [ $VS_VER -gt 15 ] ; then + # we want to make sure that the build command is called with the correct environment variables set up + # we achieve this by piping all commands into a .bat file and then calling this temporary .bat file. + + echo "-- Searching for vs-build" + #cmd.exe //C """$VS_VARS_PATH $PLATFORM""" + + echo "-- Searching for vs-build2" + # vswhere is a utility to find the most recent vs compiler toolchain. it is + # assumed to be installed at a fixed location + if [ $VS_VER == 15 ] ; then + VSWHERE_EXE=`cmd.exe //c "echo %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"` + elif [ $VS_VER == 16 ] ; then + VSWHERE_EXE=`cmd.exe //c "echo %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"` + elif [ $VS_VER -gt 17 ] ; then + VSWHERE_EXE=`cmd.exe //c "echo %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"` + else + VSWHERE_EXE=`cmd.exe //c "echo %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"` + fi + + echo "-- Found vswhere: ${VSWHERE_EXE}" + # vswhere allows us to query the install dir of the ms build tools + VS_INSTALL_PATH=`cmd //c "${VSWHERE_EXE}" -latest -products Microsoft.VisualStudio.Product.${VS_TYPE} -requires Microsoft.VisualStudio.Component.VC.CoreIde -property installationPath` + echo "-- Found vs install path: ${VS_INSTALL_PATH}" + # msbuild is the tool used to build visual studio solutions + MSBUILD_PATH="${VS_INSTALL_PATH}\MSBuild\\${VS_VER}.0\Bin\MSBuild.exe" + echo "-- Found MSBuild path: ${MSBUILD_PATH}" + + if [ $VS_COMPILER == "MSVC" ]; then + VS_VER_DIR=$(ls "$VS_BASE_PATH/VC/Tools/${VS_COMPILER}/" | tail -1) + if [ $ARCH == "arm64" ] || [ $ARCH == "ARM" ] || [ $ARCH == "arm64ec" ]; then + export VS_BIN_PATH="$VS_BASE_PATH/VC/Tools/${VS_COMPILER}/$VS_VER_DIR/bin/$VS_HOSTPLATFORM/$BUILD_PLATFORM" + else + export VS_BIN_PATH="$VS_BASE_PATH/VC/Tools/${VS_COMPILER}/$VS_VER_DIR/bin/$VS_HOSTPLATFORM/$BUILD_PLATFORM" + fi + else + export VS_BIN_PATH="$VS_BASE_PATH/VC/Tools/Llvm/$BUILD_PLATFORM/bin" + fi + echo "VS_BIN_PATH was not set - setting to $VS_BIN_PATH" + + export PATH=$VS_BIN_PATH:$PATH + ( + # with parentheses we open a new sub-shell scope to make sure we're not overwriting any presets for IFS + # set input field separator to colon (:) for current scope + IFS=: + for vs_bin_directory in ${VS_BIN_PATH}; do + # we must make sure each given directory exists + if [ ! -d ${vs_bin_directory} ]; then + echo "Couldn't confirm Visual Studio path exists: '$vs_bin_directory', probably installed on a non standard location?" + exit 1 + else + echo "Confirmed VS_BIN_PATH element exists: '${vs_bin_directory}'" + fi + + done + ) + + fi + +} +add_to_path() { + local new_path="$1" + if [ -d "$new_path" ] && [[ ":$PATH:" != *":$new_path:"* ]]; then + export PATH="$new_path:$PATH" + # echo "Skipping: $new_path (already in PATH or does not exist)" + fi } + function with_vs_env(){ - #2019 and onwards we need to pass the platform as the arg - if [ $VS_VER -gt 15 ] ; then - # we want to make sure that the build command is called with the correct environment variables set up - # we achieve this by piping all commands into a .bat file and then calling this temporary .bat file. - - echo "" > with_env.bat # cleanup temporary bat file - echo "call \"$VS_VARS_PATH\" $PLATFORM && $@" >> with_env.bat - cmd.exe //C "call with_env.bat" - elif [ $VS_VER == 15 ] ; then - # we want to make sure that the build command is called with the correct environment variables set up - # we achieve this by piping all commands into a .bat file and then calling this temporary .bat file. - - echo "" > with_env.bat # cleanup temporary bat file - echo "call \"$VS_VARS_PATH\" && $@" >> with_env.bat - cmd.exe //C "call with_env.bat" - else - #statements - echo "older" - if [ $ARCH == 32 ] ; then - cmd.exe \/c "call \"%VS${VS_VER}0COMNTOOLS%vsvars32.bat\" && $@" - elif [ $ARCH == 64 ] ; then - cmd.exe \/c "call \"%VS${VS_VER}0COMNTOOLS%..\\..\\${VS_64_BIT_ENV}\" && $@" - fi - fi + #2019 and onwards we need to pass the platform as the arg + if [ $VS_VER -gt 15 ] ; then + # we want to make sure that the build command is called with the correct environment variables set up + # we achieve this by piping all commands into a .bat file and then calling this temporary .bat file. + + echo "" > with_env.bat # cleanup temporary bat file + echo "call \"$VS_VARS_PATH\" $PLATFORM && $@" >> with_env.bat + cmd.exe //C "call with_env.bat" + elif [ $VS_VER == 15 ] ; then + # we want to make sure that the build command is called with the correct environment variables set up + # we achieve this by piping all commands into a .bat file and then calling this temporary .bat file. + + echo "" > with_env.bat # cleanup temporary bat file + echo "call \"$VS_VARS_PATH\" && $@" >> with_env.bat + cmd.exe //C "call with_env.bat" + else + #statements + echo "older" + if [ $ARCH == 32 ] ; then + cmd.exe \/c "call \"%VS${VS_VER}0COMNTOOLS%vsvars32.bat\" && $@" + elif [ $ARCH == 64 ] ; then + cmd.exe \/c "call \"%VS${VS_VER}0COMNTOOLS%..\\..\\${VS_64_BIT_ENV}\" && $@" + fi + fi } # used when building for vs - set to 16 if not set explicitly if [ "$TYPE" = "vs" ]; then - if [ $ARCH == "ARM64" ]; then - export ARCH="arm64" - fi - if [ $ARCH == "ARM64EC" ] || [ $ARCH == "arm64EC" ]; then - export ARCH="arm64ec" - fi - if [ $ARCH == "x86_64" ] || [ $ARCH == "X86_64" ] || [ $ARCH == 64 ] ; then - export ARCH=64 - fi - if [ -z ${VS_VER+x} ]; then - if [ $ARCH == "arm64" ] || [ $ARCH == "arm64ec" ]; then - export VS_VER=17 - else - export VS_VER=17 - fi - echoVerbose "VS_VER was not set - setting to ${VS_VER}" - fi - VS_64_BIT_ENV='VC\vcvarsall' - if [ -z ${PLATFORM+x} ]; then - if [ $ARCH == 32 ]; then - PLATFORM=x86 - elif [ $ARCH == 64 ] || [ $ARCH == "x86_64" ]; then - PLATFORM=x64 - elif [ $ARCH == "arm64" ]; then - PLATFORM=x64 - elif [ $ARCH == "arm64ec" ]; then - PLATFORM=x64 - elif [ $ARCH == "arm" ]; then - PLATFORM=x64 - else - echo "ARCH not set $ARCH" - PLATFORM=x64 - fi - fi - - - if [ -z ${MULTITHREADED_TYPE+x} ]; then - MULTITHREADED_TYPE="MD" - fi - if [ $MULTITHREADED_TYPE == "MD" ]; then - MT_TYPE="/MD" - echoVerbose "MULTITHREADED_TYPE MD" - elif [ $MULTITHREADED_TYPE == "MT" ]; then - MT_TYPE="/MT" - echoVerbose "MULTITHREADED_TYPE MT" - fi - - if [ -z ${CALLING_CONVENTION_TYPE+x} ]; then - CALLING_CONVENTION="Gd" - else - CALLING_CONVENTION="${CALLING_CONVENTION_TYPE}" - fi - - if [ $CALLING_CONVENTION == "Gz" ]; then - CALLING_CONVENTION="/Gz" - echoVerbose "CALLING_CONVENTION ${MT_TYPE} __stdcall" - elif [ $CALLING_CONVENTION == "Gd" ]; then - CALLING_CONVENTION="/Gd" - echoVerbose "CALLING_CONVENTION ${MT_TYPE} __cdecl" - elif [ $CALLING_CONVENTION == "Gr" ]; then - CALLING_CONVENTION="/Gr" - echoVerbose "CALLING_CONVENTION ${MT_TYPE} __fastcall (/Gr)" - elif [ $CALLING_CONVENTION == "Gv" ]; then - CALLING_CONVENTION="/Gv" - echoVerbose "CALLING_CONVENTION ${MT_TYPE} __vectorcall (/Gv)" - fi - - - if [ $VS_COMPILER == "LLVM" ]; then - export VS_C_FLAGS="-Wno-error" # warnings will not be treated as errors - export EXCEPTION_FLAGS="" - export FLAGS_RELEASE="-O3 -DUNICODE -D_UNICODE" - export FLAGS_DEBUG="-O0 -DUNICODE -D_UNICODE" - export EXE_FLAGS="" - else - if [ $ARCH == "arm64ec" ]; then - export VS_C_FLAGS="/Gy /GL- /guard:cf" - else - export VS_C_FLAGS="/GL-" - fi - export FLAGS_RELEASE="${MT_TYPE} ${CALLING_CONVENTION} /O2 /DNDEBUG -DUNICODE -D_UNICODE" - export FLAGS_DEBUG="${MT_TYPE}d ${CALLING_CONVENTION} /Od /DDEBUG -DUNICODE -D_UNICODE" - export EXCEPTION_FLAGS="/EHsc" - export EXE_FLAGS="/NODEFAULTLIB:libvcruntime.lib /DEFAULTLIB:ucrt.lib /DEFAULTLIB:msvcrt.lib" - fi - - VS_BAT="vcvarsall.bat" - if [ -z "${WSL_DISTRO_NAME+x}" ]; then - DRIVE=/c - else - DRIVE=/mnt/c - fi - if [ -z ${VS_HOSTPLATFORM+x} ]; then - if [ ${VS_HOST} == "amd64" ]; then - VS_HOSTPLATFORM=Hostx64 - elif [ ${VS_HOST} == "86" ]; then - VS_HOSTPLATFORM=Hostx86 - else - #else if arm or arm64 which is same as VS_HOST - VS_HOSTPLATFORM=${VS_HOST} - fi - fi - if [ -z ${VS_BASE_PATH+x} ]; then - if [ "${VS_VER}" = "15" ]; then - VS_BASE_PATH="${DRIVE}/Program Files (x86)/Microsoft Visual Studio/2017/$VS_TYPE" - VS_YEAR=2017 - VC_VERSION=140 - VS_BAT="vcvars$ARCH.bat" - elif [ "${VS_VER}" = "16" ]; then - VS_YEAR_PATH=2019 - if [ -d "${DRIVE}/Program Files (x86)/Microsoft Visual Studio/$VS_YEAR_PATH/$VS_TYPE" ]; then - VS_YEAR_PATH=2019 - VC_VERSION=142 - else - VS_YEAR_PATH=2019 - VC_VERSION=142 - fi - VS_BASE_PATH="${DRIVE}/Program Files (x86)/Microsoft Visual Studio/$VS_YEAR_PATH/$VS_TYPE" - VS_YEAR=$VS_YEAR_PATH - elif [ "${VS_VER}" = "17" ]; then - VS_BASE_PATH="${DRIVE}/Program Files/Microsoft Visual Studio/2022/$VS_TYPE" - export VS_BASE_PATH_CLANG="${DRIVE}/Program Files/Microsoft Visual Studio/2022/" - VS_YEAR=2022 - VC_VERSION=143 - VS_BAT="vcvars$ARCH.bat" - fi - fi - if [ $ARCH == 32 ] ; then - export PLATFORM="Win32" - export BUILD_PLATFORM="x86" - export CROSS_TOOL="amd64_x86" - elif [ $ARCH == 64 ] || [ $ARCH == "x86_64" ]; then - export PLATFORM="x64" - export BUILD_PLATFORM="x64" - export CROSS_TOOL="amd64" - elif [ $ARCH == "arm64" ] ; then - export PLATFORM="ARM64" - export BUILD_PLATFORM="arm64" - export CROSS_TOOL="all" - elif [ $ARCH == "arm64ec" ] ; then - export PLATFORM="ARM64EC" - export BUILD_PLATFORM="arm64" - export CROSS_TOOL="all" - elif [ $ARCH == "arm" ]; then - export PLATFORM="ARM" - export BUILD_PLATFORM="arm" - export CROSS_TOOL="all" - else - echoError "Apothecary -a not a valid passed architecture:[${ARCH}]" - exit; - fi - if [ $ARCH == "arm64" ] || [ $ARCH == "arm64ec" ] || [ $ARCH == "ARM" ]; then - VS_VARS_PATH=$(cygpath -wa "$VS_BASE_PATH/VC/Auxiliary/Build/vcvarsall.bat") - else - VS_VARS_PATH=$(cygpath -wa "$VS_BASE_PATH/VC/Auxiliary/Build/$VS_BAT") - fi - echoVerbose "VS_VARS_PATH: $VS_VARS_PATH" - if [ -z ${VS_BIN_PATH+x} ]; then - VS_VER_DIR=$(ls "$VS_BASE_PATH/VC/Tools/${VS_COMPILER}/" | tail -1) - if [ $VS_COMPILER == "MSVC" ]; then - if [ $ARCH == "arm64" ] || [ $ARCH == "arm" ] || [ $ARCH == "arm64ec" ]; then - export VS_BIN_PATH="$VS_BASE_PATH/VC/Tools/${VS_COMPILER}/$VS_VER_DIR/bin/$VS_HOSTPLATFORM/$BUILD_PLATFORM" - else - export VS_BIN_PATH="$VS_BASE_PATH/VC/Tools/${VS_COMPILER}/$VS_VER_DIR/bin/$VS_HOSTPLATFORM/$BUILD_PLATFORM" - fi - else - export VS_BIN_PATH="$VS_BASE_PATH/VC/Tools/Llvm/$BUILD_PLATFORM/bin" - fi - - echoVerbose "VS_BIN_PATH was not set - setting to $VS_BIN_PATH" - export PATH=$VS_BIN_PATH:$PATH - ( - # with parentheses we open a new sub-shell scope to make sure we're not overwriting any presets for IFS - # set input field separator to colon (:) for current scope - IFS=: - for vs_bin_directory in ${VS_BIN_PATH}; do - # we must make sure each given directory exists - if [ ! -d ${vs_bin_directory} ]; then - echo "Couldn't confirm Visual Studio path exists: '$vs_bin_directory', probably installed on a non standard location?" - exit 1 - else - echoVerbose "Confirmed VS_BIN_PATH element exists: '${vs_bin_directory}'" - fi - - done - ) - # Test for existence of directory where cmake should live - # then prepend cmake path to PATH - if [ -d "/c/Program Files/CMake/bin/" ]; then - export PATH="/c/Program Files/CMake/bin/:$PATH" - fi - fi - if [ $VS_VER == "17" ]; then - export VS_YEAR=2022 - export VS_VER=17 - export VS_VER_GEN="$VS_VER $VS_YEAR" - if [ $ARCH == "arm64ec" ] || [ $TARGET_WIN_11 == 1 ]; then - export CMAKE_WIN_SDK="-DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=${WIN11_INSTALLED_SDK_2022} -DCMAKE_SYSTEM_VERSION=${WIN11_INSTALLED_SDK_2022} " - export CMAKE_WIN_SDK_HEX=${WIN11_INSTALLED_SDK_2022_HEX} - else - export CMAKE_WIN_SDK="-DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=${WIN10_INSTALLED_SDK_2022} -DCMAKE_SYSTEM_VERSION=${WIN10_INSTALLED_SDK_2022} " - export CMAKE_WIN_SDK_HEX=${WIN10_INSTALLED_SDK_2022_HEX} - fi - - if [ $VS_COMPILER == "LLVM" ]; then - export CMAKE_WIN_SDK="${CMAKE_WIN_SDK} -DCMAKE_CXX_COMPILER=${VS_BIN_PATH}/clang++ -DCMAKE_C_COMPILER=${VS_BIN_PATH}/clang -T ClangCL -DLLVM_ENABLE_RUNTIMES=libcxx -DLIBCXX_ENABLE_SHARED=NO -DLIBCXX_ENABLE_STATIC=YES" - fi - else - export VS_YEAR=2019 - export VS_VER=16 - export VS_VER_GEN="$VS_VER $VS_YEAR" - if [ $ARCH == "arm64ec" ] || [ $TARGET_WIN_11 == 1 ]; then - export CMAKE_WIN_SDK="-DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=${WIN11_INSTALLED_SDK_2019} -DCMAKE_SYSTEM_VERSION=${WIN11_INSTALLED_SDK_2019} " - export CMAKE_WIN_SDK_HEX=${WIN11_INSTALLED_SDK_2019_HEX} - else - export CMAKE_WIN_SDK_HEX=${WIN10_INSTALLED_SDK_2019_HEX} - export CMAKE_WIN_SDK="-DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=${WIN10_INSTALLED_SDK_2019} -DCMAKE_SYSTEM_VERSION=${WIN10_INSTALLED_SDK_2019} " - - fi - fi - echoVerbose "PLATFORM set to ${PLATFORM} Visual Studio ${VS_VER_GEN} - ${CROSS_TOOL} - ${VS_HOST}" - - #echo "PATH: $PATH" - #PATH="/c/Program Files/CMake/bin:/c/windows;/c/windows/system32:/c/windows/system32/Wbem:$VS_BIN_PATH:/c/Program Files/Git/cmd:/c/Windows/System32/WindowsPowerShell/v1.0:/mingw32/bin:/usr/local/bin:/usr/bin:/bin:/mingw32/bin:/usr/bin:/" - #echo "NEW PATH: $PATH" + if [ $ARCH == "ARM64" ]; then + export ARCH="arm64" + fi + if [ $ARCH == "ARM64EC" ] || [ $ARCH == "arm64EC" ]; then + export ARCH="arm64ec" + fi + if [ $ARCH == "x86_64" ] || [ $ARCH == "X86_64" ] || [ $ARCH == 64 ] ; then + export ARCH=64 + fi + if [ -z ${VS_VER+x} ]; then + if [ $ARCH == "arm64" ] || [ $ARCH == "arm64ec" ]; then + export VS_VER=17 + else + export VS_VER=17 + fi + echoVerbose "VS_VER was not set - setting to ${VS_VER}" + fi + VS_64_BIT_ENV='VC\vcvarsall' + if [ -z ${PLATFORM+x} ]; then + if [ $ARCH == 32 ]; then + PLATFORM=x86 + elif [ $ARCH == 64 ] || [ $ARCH == "x86_64" ]; then + PLATFORM=x64 + elif [ $ARCH == "arm64" ]; then + PLATFORM=x64 + elif [ $ARCH == "arm64ec" ]; then + PLATFORM=x64 + elif [ $ARCH == "arm" ]; then + PLATFORM=x64 + else + echo "ARCH not set $ARCH" + PLATFORM=x64 + fi + fi + + + if [ -z ${MULTITHREADED_TYPE+x} ]; then + MULTITHREADED_TYPE="MD" + fi + if [ $MULTITHREADED_TYPE == "MD" ]; then + MT_TYPE="/MD" + echoVerbose "MULTITHREADED_TYPE MD" + elif [ $MULTITHREADED_TYPE == "MT" ]; then + MT_TYPE="/MT" + echoVerbose "MULTITHREADED_TYPE MT" + fi + + if [ -z ${CALLING_CONVENTION_TYPE+x} ]; then + CALLING_CONVENTION="Gd" + else + CALLING_CONVENTION="${CALLING_CONVENTION_TYPE}" + fi + + if [ $CALLING_CONVENTION == "Gz" ]; then + CALLING_CONVENTION="/Gz" + echoVerbose "CALLING_CONVENTION ${MT_TYPE} __stdcall" + elif [ $CALLING_CONVENTION == "Gd" ]; then + CALLING_CONVENTION="/Gd" + echoVerbose "CALLING_CONVENTION ${MT_TYPE} __cdecl" + elif [ $CALLING_CONVENTION == "Gr" ]; then + CALLING_CONVENTION="/Gr" + echoVerbose "CALLING_CONVENTION ${MT_TYPE} __fastcall (/Gr)" + elif [ $CALLING_CONVENTION == "Gv" ]; then + CALLING_CONVENTION="/Gv" + echoVerbose "CALLING_CONVENTION ${MT_TYPE} __vectorcall (/Gv)" + fi + + + if [ $VS_COMPILER == "LLVM" ]; then + export VS_C_FLAGS="-Wno-error" # warnings will not be treated as errors + export EXCEPTION_FLAGS="" + export FLAGS_RELEASE="/O2 /DNDEBUG -DUNICODE -D_UNICODE -Xclang -fms-compatibility-version=19.30" + export FLAGS_DEBUG="-O0 -DUNICODE -D_UNICODE" + export EXE_FLAGS="" + export CMAKE_COMPILER="clang-cl" + else + if [ $ARCH == "arm64ec" ]; then + export VS_C_FLAGS="/Gy /GL- /guard:cf" + else + export VS_C_FLAGS="/GL-" + fi + export FLAGS_RELEASE="${MT_TYPE} ${CALLING_CONVENTION} /O2 /DNDEBUG -DUNICODE -D_UNICODE" + export FLAGS_DEBUG="${MT_TYPE}d ${CALLING_CONVENTION} /Od /DDEBUG -DUNICODE -D_UNICODE" + export EXCEPTION_FLAGS="/EHsc" + export EXE_FLAGS="/NODEFAULTLIB:libvcruntime.lib /DEFAULTLIB:ucrt.lib /DEFAULTLIB:msvcrt.lib" + export CMAKE_COMPILER="msvc" + fi + + VS_BAT="vcvarsall.bat" + if [ -z ${VS_HOSTPLATFORM+x} ]; then + if [ ${VS_HOST} == "amd64" ]; then + VS_HOSTPLATFORM=Hostx64 + elif [ ${VS_HOST} == "86" ]; then + VS_HOSTPLATFORM=Hostx86 + else + #else if arm or arm64 which is same as VS_HOST + VS_HOSTPLATFORM=${VS_HOST} + fi + fi + if [ -z ${VS_BASE_PATH+x} ]; then + if [ "${VS_VER}" = "15" ]; then + VS_BASE_PATH="${DRIVE}/Program Files (x86)/Microsoft Visual Studio/2017/$VS_TYPE" + VS_YEAR=2017 + VC_VERSION=140 + VS_BAT="vcvars$ARCH.bat" + elif [ "${VS_VER}" = "16" ]; then + VS_YEAR_PATH=2019 + if [ -d "${DRIVE}/Program Files (x86)/Microsoft Visual Studio/$VS_YEAR_PATH/$VS_TYPE" ]; then + VS_YEAR_PATH=2019 + VC_VERSION=142 + else + VS_YEAR_PATH=2019 + VC_VERSION=142 + fi + VS_BASE_PATH="${DRIVE}/Program Files (x86)/Microsoft Visual Studio/$VS_YEAR_PATH/$VS_TYPE" + VS_YEAR=$VS_YEAR_PATH + elif [ "${VS_VER}" = "17" ]; then + VS_BASE_PATH="${DRIVE}/Program Files/Microsoft Visual Studio/2022/$VS_TYPE" + export VS_BASE_PATH_CLANG="${DRIVE}/Program Files/Microsoft Visual Studio/2022/" + VS_YEAR=2022 + VC_VERSION=143 + VS_BAT="vcvars$ARCH.bat" + fi + fi + if [ $ARCH == 32 ] ; then + export PLATFORM="Win32" + export BUILD_PLATFORM="x86" + export CROSS_TOOL="amd64_x86" + elif [ $ARCH == 64 ] || [ $ARCH == "x86_64" ]; then + export PLATFORM="x64" + export BUILD_PLATFORM="x64" + export CROSS_TOOL="amd64" + elif [ $ARCH == "arm64" ] ; then + export PLATFORM="ARM64" + export BUILD_PLATFORM="arm64" + export CROSS_TOOL="all" + elif [ $ARCH == "arm64ec" ] ; then + export PLATFORM="ARM64EC" + export BUILD_PLATFORM="arm64" + export CROSS_TOOL="all" + elif [ $ARCH == "arm" ]; then + export PLATFORM="ARM" + export BUILD_PLATFORM="arm" + export CROSS_TOOL="all" + else + echoError "Apothecary -a not a valid passed architecture:[${ARCH}]" + exit; + fi + if [ $ARCH == "arm64" ] || [ $ARCH == "arm64ec" ] || [ $ARCH == "ARM" ]; then + VS_VARS_PATH=$($CONVERT_PATH_CMD "$VS_BASE_PATH/VC/Auxiliary/Build/vcvarsall.bat") + else + VS_VARS_PATH=$($CONVERT_PATH_CMD "$VS_BASE_PATH/VC/Auxiliary/Build/$VS_BAT") + fi + + + if [ -d "$VS_BASE_PATH/VC/Auxiliary/Build" ]; then + export PATH="$VS_BASE_PATH/VC/Auxiliary/Build:$PATH" + fi + + echoVerbose "VS_VARS_PATH: $VS_VARS_PATH" + if [ -z ${VS_BIN_PATH+x} ]; then + VS_VER_DIR=$(ls "$VS_BASE_PATH/VC/Tools/${VS_COMPILER}/" | tail -1) + if [ $VS_COMPILER == "MSVC" ]; then + if [ $ARCH == "arm64" ] || [ $ARCH == "arm" ] || [ $ARCH == "arm64ec" ]; then + export VS_BIN_PATH="$VS_BASE_PATH/VC/Tools/${VS_COMPILER}/$VS_VER_DIR/bin/$VS_HOSTPLATFORM/$BUILD_PLATFORM" + else + export VS_BIN_PATH="$VS_BASE_PATH/VC/Tools/${VS_COMPILER}/$VS_VER_DIR/bin/$VS_HOSTPLATFORM/$BUILD_PLATFORM" + fi + else + export VS_BIN_PATH="$VS_BASE_PATH/VC/Tools/Llvm/$BUILD_PLATFORM/bin" + fi + + echoVerbose "VS_BIN_PATH was not set - setting to $VS_BIN_PATH" + if [ -d "$VS_BIN_PATH" ]; then + export PATH=$VS_BIN_PATH:$PATH + ( + # with parentheses we open a new sub-shell scope to make sure we're not overwriting any presets for IFS + # set input field separator to colon (:) for current scope + IFS=: + for vs_bin_directory in ${VS_BIN_PATH}; do + # we must make sure each given directory exists + if [ ! -d ${vs_bin_directory} ]; then + echo "Couldn't confirm Visual Studio path exists: '$vs_bin_directory', probably installed on a non standard location?" + exit 1 + else + echoVerbose "Confirmed VS_BIN_PATH element exists: '${vs_bin_directory}'" + fi + + done + ) + fi + # Test for existence of directory where cmake should live + # then prepend cmake path to PATH + if [ -d "${DRIVE}/Program Files/CMake/bin/" ]; then + export PATH="${DRIVE}/Program Files/CMake/bin/:$PATH" + fi + + + fi + if [ $VS_VER == "17" ]; then + export VS_YEAR=2022 + export VS_VER=17 + export VS_VER_GEN="$VS_VER $VS_YEAR" + if [ $ARCH == "arm64ec" ] || [ $TARGET_WIN_11 == 1 ]; then + export CMAKE_WIN_SDK="-DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=${WIN11_INSTALLED_SDK_2022} -DCMAKE_SYSTEM_VERSION=${WIN11_INSTALLED_SDK_2022} " + export CMAKE_WIN_SDK_HEX=${WIN11_INSTALLED_SDK_2022_HEX} + else + export CMAKE_WIN_SDK="-DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=${WIN10_INSTALLED_SDK_2022} -DCMAKE_SYSTEM_VERSION=${WIN10_INSTALLED_SDK_2022} " + export CMAKE_WIN_SDK_HEX=${WIN10_INSTALLED_SDK_2022_HEX} + fi + + if [ $VS_COMPILER == "LLVM" ]; then + export CMAKE_WIN_SDK="${CMAKE_WIN_SDK} -DCMAKE_CXX_COMPILER=${VS_BIN_PATH}/clang++ -DCMAKE_C_COMPILER=${VS_BIN_PATH}/clang -T ClangCL -DLLVM_ENABLE_RUNTIMES=libcxx -DLIBCXX_ENABLE_SHARED=NO -DLIBCXX_ENABLE_STATIC=YES" + fi + else + export VS_YEAR=2019 + export VS_VER=16 + export VS_VER_GEN="$VS_VER $VS_YEAR" + if [ $ARCH == "arm64ec" ] || [ $TARGET_WIN_11 == 1 ]; then + export CMAKE_WIN_SDK="-DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=${WIN11_INSTALLED_SDK_2019} -DCMAKE_SYSTEM_VERSION=${WIN11_INSTALLED_SDK_2019} " + export CMAKE_WIN_SDK_HEX=${WIN11_INSTALLED_SDK_2019_HEX} + else + export CMAKE_WIN_SDK_HEX=${WIN10_INSTALLED_SDK_2019_HEX} + export CMAKE_WIN_SDK="-DCMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION=${WIN10_INSTALLED_SDK_2019} -DCMAKE_SYSTEM_VERSION=${WIN10_INSTALLED_SDK_2019} " + + fi + fi + echoVerbose "PLATFORM set to ${PLATFORM} Visual Studio ${VS_VER_GEN} - ${CROSS_TOOL} - ${VS_HOST}" + + + add_to_path "${DRIVE}/Program Files/CMake/bin" + + # Ensure Windows essential paths are added + add_to_path "${DRIVE}/windows" + add_to_path "${DRIVE}/windows/system32" + add_to_path "${DRIVE}/windows/system32/Wbem" + add_to_path "${DRIVE}/Windows/System32/WindowsPowerShell/v1.0" + + #Ensure Git Bash/Mingw paths are added + add_to_path "${DRIVE}/Program Files/Git/cmd" + if [ -z "${WSL_DISTRO_NAME+x}" ]; then + add_to_path "/mingw32/bin" + add_to_path "/usr/local/bin" + add_to_path "/usr/bin" + add_to_path "/bin" + fi +fi +if [ -n "${NO_COLOR:-}" ] && [ "${NO_COLOR:-}" == "1" ]; then + CON_DEFAULT="" + CON_WHITE="" + CON_LIGHT_GRAY="" + CON_BOLD="" + CON_RED="" + CON_YELLOW="" + CON_YELLOW_GREEN="" + CON_GREEN="" fi + #### Platform Determination for Targets export VERBOSE_MAKEFILE=NO - if [ "$TYPE" = "msys2" ]; then - export FLAG_RELEASE="-O3" - - if [ "${MINGW_PACKAGE_PREFIX+x}" ]; then - export ARCH=$MINGW_PACKAGE_PREFIX - else - if [ -z "$ARCH" ]; then - if [ "$MSYSTEM" == "MINGW64" ] || [ "$MSYSTEM" == "mingw64" ]; then - export ARCH=mingw64 - elif [ "$MSYSTEM" == "CLANGARM64" ] || [ "$MSYSTEM" == "clangarm64" ]; then - export ARCH=clangarm64 - elif [ "$MSYSTEM" == "UCRT64" ]; then - export ARCH=ucrt64 - elif [ "$MSYSTEM" == "CLANG64" ]; then - export ARCH=clang64 - fi - else - case "$ARCH" in - mingw64|clangarm64|ucrt64|clang64) - ;; - *) - if [ "${MSYSTEM:-}" == "MINGW64" ] || [ "${MSYSTEM:-}" == "mingw64" ]; then - export ARCH=mingw64 - elif [ "${MSYSTEM:-}" == "CLANGARM64" ] || [ "${MSYSTEM:-}" == "clangarm64" ]; then - export ARCH=clangarm64 - elif [ "${MSYSTEM:-}" == "UCRT64" ]; then - export ARCH=ucrt64 - elif [ "${MSYSTEM:-}" == "CLANG64" ]; then - export ARCH=clang64 - fi - ;; - esac - fi - fi - GCC_VERSION=14 - export PLATFORM=${ARCH} + export FLAG_RELEASE="-O3" + + if [ "${MINGW_PACKAGE_PREFIX+x}" ]; then + export ARCH=$MINGW_PACKAGE_PREFIX + else + if [ -z "$ARCH" ]; then + if [ "$MSYSTEM" == "MINGW64" ] || [ "$MSYSTEM" == "mingw64" ]; then + export ARCH=mingw64 + elif [ "$MSYSTEM" == "CLANGARM64" ] || [ "$MSYSTEM" == "clangarm64" ]; then + export ARCH=clangarm64 + elif [ "$MSYSTEM" == "UCRT64" ]; then + export ARCH=ucrt64 + elif [ "$MSYSTEM" == "CLANG64" ]; then + export ARCH=clang64 + fi + else + case "$ARCH" in + mingw64|clangarm64|ucrt64|clang64) + ;; + *) + if [ "${MSYSTEM:-}" == "MINGW64" ] || [ "${MSYSTEM:-}" == "mingw64" ]; then + export ARCH=mingw64 + elif [ "${MSYSTEM:-}" == "CLANGARM64" ] || [ "${MSYSTEM:-}" == "clangarm64" ]; then + export ARCH=clangarm64 + elif [ "${MSYSTEM:-}" == "UCRT64" ]; then + export ARCH=ucrt64 + elif [ "${MSYSTEM:-}" == "CLANG64" ]; then + export ARCH=clang64 + fi + ;; + esac + fi + fi + GCC_VERSION=14 + export PLATFORM=${ARCH} fi if [ "$TYPE" = "emscripten" ]; then - export CPP_STANDARD=23 - FLAG_RELEASE="" - export PLATFORM_FLAG="" - if [ $ARCH == 64 ] ; then - export PLATFORM="WASM64" - export PLATFORM_FLAG="-DMEMORY64 -matomics -mbulk-memory" - echo "Emscripten: ARCH:${ARCH}" - else - export PLATFORM="WASM" - echo "Emscripten: ARCH:${ARCH}" - fi - if [ -z "${PTHREADS_ENABLED+x}" ]; then - export PTHREADS_ENABLED=1 - fi - - if [ -z "${EXCEPTIONS_ENABLED+x}" ]; then - export EXCEPTIONS_ENABLED=0 - else - if [ $EXCEPTIONS_ENABLED == 1 ] ; then - PLATFORM_FLAG+="-fwasm-exceptions" - # PLATFORM_FLAG+="-fexceptions" - fi - fi - - export FLAG_RELEASE+="-O3 -pthread -matomics -mbulk-memory -fPIC ${PLATFORM_FLAG} -fvisibility=hidden -Wno-implicit-function-declaration -frtti -DWASM=ON -DNDEBUG" - export LINK_FLAGS="-s WASM=2 -pthread -matomics -mbulk-memory -sMODULARIZE=1 -s ALLOW_MEMORY_GROWTH=1 -s MAIN_MODULE=0 -sLINKABLE=1 -s ASSERTIONS=1 -s EXPORT_ALL=1 --no-entry -s DYNAMIC_EXECUTION=0 -s NO_DYNAMIC_EXECUTION=1 -s EMBIND_AOT=1" - EMSCRIPTEN_SCRIPT="$(realpath "$APOTHECARY_DIR/../scripts/emscripten/setup.sh")" - . "$EMSCRIPTEN_SCRIPT" + export CPP_STANDARD=23 + FLAG_RELEASE="" + export PLATFORM_FLAG="" + if [ $ARCH == 64 ] ; then + export PLATFORM="WASM64" + export PLATFORM_FLAG="-DMEMORY64 -matomics -mbulk-memory" + echo "Emscripten: ARCH:${ARCH}" + else + export PLATFORM="WASM" + echo "Emscripten: ARCH:${ARCH}" + fi + if [ -z "${PTHREADS_ENABLED+x}" ]; then + export PTHREADS_ENABLED=1 + fi + + if [ -z "${EXCEPTIONS_ENABLED+x}" ]; then + export EXCEPTIONS_ENABLED=0 + else + if [ $EXCEPTIONS_ENABLED == 1 ] ; then + PLATFORM_FLAG+="-fwasm-exceptions" + # PLATFORM_FLAG+="-fexceptions" + fi + fi + + export FLAG_RELEASE+="-O3 -pthread -matomics -mbulk-memory -fPIC ${PLATFORM_FLAG} -fvisibility=hidden -Wno-implicit-function-declaration -frtti -DWASM=ON -DNDEBUG" + export LINK_FLAGS="-s WASM=2 -pthread -matomics -mbulk-memory -sMODULARIZE=1 -s ALLOW_MEMORY_GROWTH=1 -s MAIN_MODULE=0 -sLINKABLE=1 -s ASSERTIONS=1 -s EXPORT_ALL=1 --no-entry -s DYNAMIC_EXECUTION=0 -s NO_DYNAMIC_EXECUTION=1 -s EMBIND_AOT=1" + EMSCRIPTEN_SCRIPT="$(realpath "$APOTHECARY_DIR/../scripts/emscripten/setup.sh")" + . "$EMSCRIPTEN_SCRIPT" fi if [[ "$TYPE" =~ ^(osx|ios|tvos|xros|catos|watchos)$ ]]; then - XS="xcode-select -print-path" - XCODE_DEV_ROOT= - - # used when building some libs for osx - OSX_LATEST_SDK="xcrun -sdk macosx --show-sdk-version" - OSX_SDK_VER=15.0 - OSX_MIN_SDK_VER=10.15 - - # used when building for ios, the sdks you have installed are found in: - IOS_SDK_VER=18.1 - IOS_LATEST_SDK=$(xcrun -sdk iphoneos --show-sdk-version >/dev/null || echo "SDKNotInstalled") - IOS_MIN_SDK_VER=15.0 - TVOS_MIN_SDK_VER=17.0 - TVOS_LATEST_SDK=$(xcrun -sdk appletvos --show-sdk-version >/dev/null || echo "SDKNotInstalled") - XROS_MIN_SDK_VER=1.1 - WATCHOS_MIN_SDK_VER=6.0 + XS="xcode-select -print-path" + XCODE_DEV_ROOT= + + # used when building some libs for osx + OSX_LATEST_SDK="xcrun -sdk macosx --show-sdk-version" + OSX_SDK_VER=15.0 + OSX_MIN_SDK_VER=10.15 + + # used when building for ios, the sdks you have installed are found in: + IOS_SDK_VER=18.1 + IOS_LATEST_SDK=$(xcrun -sdk iphoneos --show-sdk-version >/dev/null || echo "SDKNotInstalled") + IOS_MIN_SDK_VER=15.0 + TVOS_MIN_SDK_VER=17.0 + TVOS_LATEST_SDK=$(xcrun -sdk appletvos --show-sdk-version >/dev/null || echo "SDKNotInstalled") + XROS_MIN_SDK_VER=1.1 + WATCHOS_MIN_SDK_VER=6.0 fi if [ "$TYPE" = "ios" ]; then - if [[ "$IOS_LATEST_SDK" == "SDKNotInstalled" ]]; then - echoError "No iOS SDK installed. Please install Xcode and ensure the iOS SDK is available." - exit 1 - else - echoVerbose "iOS SDK version: $IOS_LATEST_SDK" - fi - export FLAG_RELEASE="-Os -fvisibility=hidden" - if [ $ARCH == "armv7" ] ; then - export PLATFORM="OS" - elif [ $ARCH == "x86_64" ] || [ $ARCH == 64 ]; then - export PLATFORM="SIMULATOR64" - elif [ $ARCH == "arm64" ] ; then - export PLATFORM="OS64" - elif [ $ARCH == "SIM_arm64" ]; then - export PLATFORM="SIMULATORARM64" - fi + if [[ "$IOS_LATEST_SDK" == "SDKNotInstalled" ]]; then + echoError "No iOS SDK installed. Please install Xcode and ensure the iOS SDK is available." + exit 1 + else + echoVerbose "iOS SDK version: $IOS_LATEST_SDK" + fi + export FLAG_RELEASE="-Os -fvisibility=hidden" + if [ $ARCH == "armv7" ] ; then + export PLATFORM="OS" + elif [ $ARCH == "x86_64" ] || [ $ARCH == 64 ]; then + export PLATFORM="SIMULATOR64" + elif [ $ARCH == "arm64" ] ; then + export PLATFORM="OS64" + elif [ $ARCH == "SIM_arm64" ]; then + export PLATFORM="SIMULATORARM64" + fi fi if [ "$TYPE" = "tvos" ]; then - if [[ "$TVOS_LATEST_SDK" == "SDKNotInstalled" ]]; then - echoError "No tvOS SDK installed. Please install Xcode and ensure the tvOS SDK is available." - exit 1 - else - echoVerbose "tvOS SDK version: $TVOS_LATEST_SDK" - fi - export FLAG_RELEASE="-Os -fvisibility=hidden" - if [ $ARCH == "x86_64" ] || [ $ARCH == 64 ]; then - export PLATFORM="SIMULATOR_TVOS" - elif [ $ARCH == "arm64" ] ; then - export PLATFORM="TVOS" - elif [ $ARCH == "SIM_arm64" ]; then - export PLATFORM="SIMULATORARM64_TVOS" - fi + if [[ "$TVOS_LATEST_SDK" == "SDKNotInstalled" ]]; then + echoError "No tvOS SDK installed. Please install Xcode and ensure the tvOS SDK is available." + exit 1 + else + echoVerbose "tvOS SDK version: $TVOS_LATEST_SDK" + fi + export FLAG_RELEASE="-Os -fvisibility=hidden" + if [ $ARCH == "x86_64" ] || [ $ARCH == 64 ]; then + export PLATFORM="SIMULATOR_TVOS" + elif [ $ARCH == "arm64" ] ; then + export PLATFORM="TVOS" + elif [ $ARCH == "SIM_arm64" ]; then + export PLATFORM="SIMULATORARM64_TVOS" + fi fi if [ "$TYPE" = "watchos" ]; then - export FLAG_RELEASE="-Os -fvisibility=hidden" - if [ $ARCH == "arm64_32" ] || [ $ARCH == "arm64" ]; then - export PLATFORM="WATCHOS" - elif [ $ARCH == "x86_64" ] ; then - export PLATFORM="SIMULATOR_WATCHOS" - elif [ $ARCH == "SIM_arm64" ]; then - export PLATFORM="SIMULATORARM64_WATCHOS" - else - echoError "watchOS incorrect ARCH:[$ARCH]" - fi + export FLAG_RELEASE="-Os -fvisibility=hidden" + if [ $ARCH == "arm64_32" ] || [ $ARCH == "arm64" ]; then + export PLATFORM="WATCHOS" + elif [ $ARCH == "x86_64" ] ; then + export PLATFORM="SIMULATOR_WATCHOS" + elif [ $ARCH == "SIM_arm64" ]; then + export PLATFORM="SIMULATORARM64_WATCHOS" + else + echoError "watchOS incorrect ARCH:[$ARCH]" + fi fi if [ "$TYPE" = "xros" ]; then - export FLAG_RELEASE="-O3 -fvisibility=hidden" - if [ $ARCH == "arm64" ] ; then - export PLATFORM="VISIONOS" - elif [ $ARCH == "x86_64" ] || [ $ARCH == 64 ]; then - export PLATFORM="SIMULATOR64_VISIONOS" - elif [ $ARCH == "SIM_arm64" ]; then - export PLATFORM="SIMULATOR_VISIONOS" - fi + export FLAG_RELEASE="-O3 -fvisibility=hidden" + if [ $ARCH == "arm64" ] ; then + export PLATFORM="VISIONOS" + elif [ $ARCH == "x86_64" ] || [ $ARCH == 64 ]; then + export PLATFORM="SIMULATOR64_VISIONOS" + elif [ $ARCH == "SIM_arm64" ]; then + export PLATFORM="SIMULATOR_VISIONOS" + fi fi if [ "$TYPE" = "catos" ]; then - export FLAG_RELEASE="-Os -fvisibility=hidden" - if [ $ARCH == "arm64" ]; then - export PLATFORM="MAC_CATALYST_ARM64" - elif [ $ARCH == "x86_64" ] || [ $ARCH == 64 ]; then - export PLATFORM="MAC_CATALYST" - fi + export FLAG_RELEASE="-Os -fvisibility=hidden" + if [ $ARCH == "arm64" ]; then + export PLATFORM="MAC_CATALYST_ARM64" + elif [ $ARCH == "x86_64" ] || [ $ARCH == 64 ]; then + export PLATFORM="MAC_CATALYST" + fi fi if [ "$TYPE" = "osx" ]; then - export FLAG_RELEASE="-O3 -fvisibility=hidden" - if [ $ARCH == "x86_64" ] || [ $ARCH == 64 ] ; then - export PLATFORM="MAC" - elif [ $ARCH == "arm64" ] ; then - export PLATFORM="MAC_ARM64" - else - PLATFORM="MAC" - echoWarning " Missing ARCH. See help: 'apothecary -a'." - fi + export FLAG_RELEASE="-O3 -fvisibility=hidden" + if [ $ARCH == "x86_64" ] || [ $ARCH == 64 ] ; then + export PLATFORM="MAC" + elif [ $ARCH == "arm64" ] ; then + export PLATFORM="MAC_ARM64" + else + PLATFORM="MAC" + echoWarning " Missing ARCH. See help: 'apothecary -a'." + fi fi if [ "$TYPE" = "macos" ]; then - PLATFORM="MAC" + PLATFORM="MAC" fi if [ "$TYPE" == "msys2" ]; then - export FLAG_RELEASE="-O3" - export ABI="x86_64" - export PLATFORM=${ABI} - GCC_VERSION=14 + export FLAG_RELEASE="-O3" + export ABI="x86_64" + export PLATFORM=${ABI} + GCC_VERSION=14 fi if [ "$PARALLEL_MAKE" -eq 1 ]; then - if command -v nproc &> /dev/null; then - export PARALLEL_MAKE=$(nproc) - echoVerbose "Using nproc: PARALLEL_MAKE is set to $PARALLEL_MAKE" - else - export PARALLEL_MAKE=1 - echoVerbose "nproc not found: Defaulting PARALLEL_MAKE to $PARALLEL_MAKE" - fi + if command -v nproc &> /dev/null; then + export PARALLEL_MAKE=$(nproc) + echoVerbose "Using nproc: PARALLEL_MAKE is set to $PARALLEL_MAKE" + else + export PARALLEL_MAKE=1 + echoVerbose "nproc not found: Defaulting PARALLEL_MAKE to $PARALLEL_MAKE" + fi fi # get command if [ $# -gt 0 ] ; then - A_CMD=$1 + A_CMD=$1 else - echoWarning " Missing command. See help: 'apothecary -h'." - exit 1 + echoWarning " Missing command. See help: 'apothecary -h'." + exit 1 fi shift 1 # check for arguments if [ $# -lt 1 ] ; then - echoWarning " Missing lib build target (maybe you wanted \"core\"). See help: 'apothecary -h'." - exit 1 + echoWarning " Missing lib build target (maybe you wanted \"core\"). See help: 'apothecary -h'." + exit 1 fi if [ "$TYPE" == "vs" ]; then - # At this point we assume that $PATH begins with "/usr/local/bin:/usr/bin:/bin:/opt/bin:", which - # means that the bash environment will take precedence over windows build tools - this can lead - # to some name-clashes, esp. with `link` for example, which has the same name, but might either - # be the microsoft linker, or the gcc linker bundled with mingw. In most cases, the microsoft - # build tools will be preferred, and we therefore need to make sure that the ms build tools occur - # earlier in $PATH. - # - # We prepend the ms build tools path via a special environment variable which we receive via - # `appveyor.yml`: `VS_BIN_PATH`, which is set in the `init:` step + # At this point we assume that $PATH begins with "/usr/local/bin:/usr/bin:/bin:/opt/bin:", which + # means that the bash environment will take precedence over windows build tools - this can lead + # to some name-clashes, esp. with `link` for example, which has the same name, but might either + # be the microsoft linker, or the gcc linker bundled with mingw. In most cases, the microsoft + # build tools will be preferred, and we therefore need to make sure that the ms build tools occur + # earlier in $PATH. + # + # We prepend the ms build tools path via a special environment variable which we receive via + # `appveyor.yml`: `VS_BIN_PATH`, which is set in the `init:` step - export PATH="$VS_BIN_PATH:$PATH" + export PATH="$VS_BIN_PATH:$PATH" fi get_directory_path() { - local type="$1" - local base_dir="$2" - local pPlatform="$3" - local pAbi="$4" - local final_path="" - - case "$type" in - vs) - final_path="${base_dir}/lib/${type}/${pPlatform}/" - ;; - osx|ios|tvos|xros|catos|watchos|macos) - final_path="${base_dir}/lib/${type}/${pPlatform}/" - ;; - emscripten) - final_path="${base_dir}/lib/${type}/" - ;; - linux|msys2) - final_path="${base_dir}/lib/${type}/${pPlatform}/" - ;; - android) - final_path="${base_dir}/lib/${type}/${pPlatform}/" - ;; - *) - echo "Unsupported type: $type" >&2 - return 1 # Return with error if type is unsupported - ;; - esac - - echo "$final_path" # This will be the function's return value + local type="$1" + local base_dir="$2" + local pPlatform="$3" + local pAbi="$4" + local final_path="" + + case "$type" in + vs) + final_path="${base_dir}/lib/${type}/${pPlatform}/" + ;; + osx|ios|tvos|xros|catos|watchos|macos) + final_path="${base_dir}/lib/${type}/${pPlatform}/" + ;; + emscripten) + final_path="${base_dir}/lib/${type}/" + ;; + linux|msys2) + final_path="${base_dir}/lib/${type}/${pPlatform}/" + ;; + android) + final_path="${base_dir}/lib/${type}/${pPlatform}/" + ;; + *) + echo "Unsupported type: $type" >&2 + return 1 # Return with error if type is unsupported + ;; + esac + + echo "$final_path" # This will be the function's return value } @@ -1022,101 +1087,101 @@ get_directory_path() { function installAndroidToolchain() { - local WD=$(pwd) - - if [ ! -d $ANDROID_NDK_ROOT/build/tools ]; then - echoError "ANDROID_NDK_ROOT not defined, please configure paths.make in this folder or ../projects/android/paths.make" - exit 1 - fi - - - cd $ANDROID_NDK_ROOT/build/tools - - local HOST=$(${APOTHECARY_DIR}/ostype.sh) - - if [ "${HOST}" == "linux" ]; then - ANDROID_HOST="linux-x86" - elif [ "${HOST}" == "linux64" ]; then - ANDROID_HOST="linux-x86_64" - elif [ "${HOST}" == "osx" ]; then - ANDROID_HOST="Darwin" - elif [ "${HOST}" == "windows" ]; then - ANDROID_HOST="windows-x86_64" - else - echoError "Building for android only supported on linux and osx by now" - exit 1 - fi - - if [ "$ARCH" == "armv7" ]; then - if [ ! -d "$BUILD_DIR/Toolchains/Android/armv7" ]; then - echo $PWD - ./make_standalone_toolchain.py \ - --install-dir=$BUILD_DIR/Toolchains/Android/$ARCH \ - --arch=arm \ - --api $ANDROID_API \ - --stl=libc++ - fi - elif [ "$ARCH" == "arm64" ]; then - if [ ! -d "$BUILD_DIR/Toolchains/Android/arm64" ]; then - ./make_standalone_toolchain.py \ - --install-dir=$BUILD_DIR/Toolchains/Android/$ARCH \ - --arch=arm64 \ - --api $ANDROID_API \ - --stl=libc++ - fi - elif [ "$ARCH" == "x86" ]; then - if [ ! -d "$BUILD_DIR/Toolchains/Android/x86" ]; then - ./make_standalone_toolchain.py \ - --install-dir=$BUILD_DIR/Toolchains/Android/$ARCH \ - --arch=x86 \ - --api $ANDROID_API \ - --stl=libc++ - fi - elif [ "$ARCH" == "x86_64" ]; then - if [ ! -d "$BUILD_DIR/Toolchains/Android/x86_64" ]; then - ./make_standalone_toolchain.py \ - --install-dir=$BUILD_DIR/Toolchains/Android/$ARCH \ - --arch=x86_64 \ - --api $ANDROID_API \ - --stl=libc++ - fi - fi - export PLATFORM=$ARCH - cd $WD + local WD=$(pwd) + + if [ ! -d $ANDROID_NDK_ROOT/build/tools ]; then + echoError "ANDROID_NDK_ROOT not defined, please configure paths.make in this folder or ../projects/android/paths.make" + exit 1 + fi + + + cd $ANDROID_NDK_ROOT/build/tools + + local HOST=$(${APOTHECARY_DIR}/ostype.sh) + + if [ "${HOST}" == "linux" ]; then + ANDROID_HOST="linux-x86" + elif [ "${HOST}" == "linux64" ]; then + ANDROID_HOST="linux-x86_64" + elif [ "${HOST}" == "osx" ]; then + ANDROID_HOST="Darwin" + elif [ "${HOST}" == "windows" ]; then + ANDROID_HOST="windows-x86_64" + else + echoError "Building for android only supported on linux and osx by now" + exit 1 + fi + + if [ "$ARCH" == "armv7" ]; then + if [ ! -d "$BUILD_DIR/Toolchains/Android/armv7" ]; then + echo $PWD + ./make_standalone_toolchain.py \ + --install-dir=$BUILD_DIR/Toolchains/Android/$ARCH \ + --arch=arm \ + --api $ANDROID_API \ + --stl=libc++ + fi + elif [ "$ARCH" == "arm64" ]; then + if [ ! -d "$BUILD_DIR/Toolchains/Android/arm64" ]; then + ./make_standalone_toolchain.py \ + --install-dir=$BUILD_DIR/Toolchains/Android/$ARCH \ + --arch=arm64 \ + --api $ANDROID_API \ + --stl=libc++ + fi + elif [ "$ARCH" == "x86" ]; then + if [ ! -d "$BUILD_DIR/Toolchains/Android/x86" ]; then + ./make_standalone_toolchain.py \ + --install-dir=$BUILD_DIR/Toolchains/Android/$ARCH \ + --arch=x86 \ + --api $ANDROID_API \ + --stl=libc++ + fi + elif [ "$ARCH" == "x86_64" ]; then + if [ ! -d "$BUILD_DIR/Toolchains/Android/x86_64" ]; then + ./make_standalone_toolchain.py \ + --install-dir=$BUILD_DIR/Toolchains/Android/$ARCH \ + --arch=x86_64 \ + --api $ANDROID_API \ + --stl=libc++ + fi + fi + export PLATFORM=$ARCH + cd $WD } # check if a given string matches anything in VALID_TYPES, # bool result is set to second argument function isValidType() { - local i - if [ -z "${VALID_TYPES+x}" ]; then - echo "VALID_TYPES is undefined. Initializing with default values..." - else - for i in "${VALID_TYPES[@]}" ; do - if [ "$i" == "$1" ] ; then - eval $2=1 - return - fi - done - fi - eval $2=0 + local i + if [ -z "${VALID_TYPES+x}" ]; then + echo "VALID_TYPES is undefined. Initializing with default values..." + else + for i in "${VALID_TYPES[@]}" ; do + if [ "$i" == "$1" ] ; then + eval $2=1 + return + fi + done + fi + eval $2=0 } # check if a given string matches anything in FORMULA_TYPES, # bool result is set to second argument function isFormulaType() { - local i - if [ -z "${FORMULA_TYPES+x}" ]; then - echo "FORMULA_TYPES is undefined. Initializing with default values..." - else - for i in "${FORMULA_TYPES[@]}" ; do - if [ "$i" == "$1" ] ; then - eval $2=1 - return - fi - done - fi - eval $2=0 + local i + if [ -z "${FORMULA_TYPES+x}" ]; then + echo "FORMULA_TYPES is undefined. Initializing with default values..." + else + for i in "${FORMULA_TYPES[@]}" ; do + if [ "$i" == "$1" ] ; then + eval $2=1 + return + fi + done + fi + eval $2=0 } # checks if a given formula string is a forumla script or exists in the formulas dir, @@ -1127,73 +1192,73 @@ function isFormulaType() { # # args: formula string, formula script, formula script parent dir, isAddon bool, isDepend bool function checkFormula() { - local script - local parentDir - - # is given formula an existing script? - if [ -e $1 -a "${1##*.}" == "sh" ] ; then - local path=$1 - case $1 in - /*) : ;; # absolute path - *) path=$WD/$1 ;; # relative path - esac - script=$(basename $path) - parentDir=$(dirname $path) - - # existing formula dir with script? - elif [ -e $1 -a -d $1 -a -e $1/$1.sh ] ; then - local path=$1/$1.sh - case $1 in - /*) : ;; # absolute path - *) path=$WD/$1/$1.sh ;; # relative path - esac - script=$(basename $path) - parentDir=$(dirname $path) - - # is the given formula name a script in the formulas dir? - elif [ -e $FORMULAS_DIR/$1.sh ] ; then - script=$1.sh - parentDir=$FORMULAS_DIR - - # is the given formula name a dir in the formulas dir? - elif [ -e $FORMULAS_DIR/$1 -a -d $FORMULAS_DIR/$1 ] ; then - script=$1.sh - parentDir=$FORMULAS_DIR/$1 - - # is the given formula name a script in the depends formulas dir? - elif [ -e $FORMULAS_DIR/$DEPENDS_SUBDIR/$1.sh ] ; then - - echoVerbose " Detected dependency: \"$1\"" - - script=$1.sh - parentDir=$FORMULAS_DIR - - eval $5=1 - - # is the given formula name an addon in the addons dir? - elif [ -e $REL_ADDONS_DIR/$1 ] ; then - - echoVerbose " Detected addon: \"$1\"" - - # are there formulas in the addon formulas dir? - if [ -e $REL_ADDONS_DIR/$1/scripts/formulas ] ; then - script= - parentDir=$REL_ADDONS_DIR/$1/scripts/formulas - else - script= - parentDir="" - fi - eval $4=1 - - else - echoError " No formula for lib \"$1\"" - exit 1 - fi - - #echoVerbose " checkFormula script: $script" - #echoVerbose " checkFormula script parent dir: $parentDir" - eval $2=$script - eval $3=$parentDir + local script + local parentDir + + # is given formula an existing script? + if [ -e $1 -a "${1##*.}" == "sh" ] ; then + local path=$1 + case $1 in + /*) : ;; # absolute path + *) path=$WD/$1 ;; # relative path + esac + script=$(basename $path) + parentDir=$(dirname $path) + + # existing formula dir with script? + elif [ -e $1 -a -d $1 -a -e $1/$1.sh ] ; then + local path=$1/$1.sh + case $1 in + /*) : ;; # absolute path + *) path=$WD/$1/$1.sh ;; # relative path + esac + script=$(basename $path) + parentDir=$(dirname $path) + + # is the given formula name a script in the formulas dir? + elif [ -e $FORMULAS_DIR/$1.sh ] ; then + script=$1.sh + parentDir=$FORMULAS_DIR + + # is the given formula name a dir in the formulas dir? + elif [ -e $FORMULAS_DIR/$1 -a -d $FORMULAS_DIR/$1 ] ; then + script=$1.sh + parentDir=$FORMULAS_DIR/$1 + + # is the given formula name a script in the depends formulas dir? + elif [ -e $FORMULAS_DIR/$DEPENDS_SUBDIR/$1.sh ] ; then + + echoVerbose " Detected dependency: \"$1\"" + + script=$1.sh + parentDir=$FORMULAS_DIR + + eval $5=1 + + # is the given formula name an addon in the addons dir? + elif [ -e $REL_ADDONS_DIR/$1 ] ; then + + echoVerbose " Detected addon: \"$1\"" + + # are there formulas in the addon formulas dir? + if [ -e $REL_ADDONS_DIR/$1/scripts/formulas ] ; then + script= + parentDir=$REL_ADDONS_DIR/$1/scripts/formulas + else + script= + parentDir="" + fi + eval $4=1 + + else + echoError " No formula for lib \"$1\"" + exit 1 + fi + + #echoVerbose " checkFormula script: $script" + #echoVerbose " checkFormula script parent dir: $parentDir" + eval $2=$script + eval $3=$parentDir } # execute a given command on a formula and/or formulas, @@ -1203,1058 +1268,1080 @@ function checkFormula() { # $3 = "core", "addons", list of library/addon names, script file to run, etc function doCommand() { - local shouldSource=$1 - local cmd=$2 - shift 2 - # process given lib targets - while [ $# -gt 0 ] ; do - - # process all formulas in formulas dir, ignore depends subdir - if [ "$1" == "core" ] ; then - local formula - for formula in $( ls -1 $FORMULAS_DIR | grep -v $DEPENDS_SUBDIR) ; do - doCommand $shouldSource $cmd "${formula%.*}" - done - echoInfo " ----- Apothecary Core Build Sucessfully completed for $TYPE -----" - # process all addons in the addons dir - elif [ "$1" == "addons" ] ; then - local addon - for addon in $(ls -1 $REL_ADDONS_DIR) ; do - if [ -d $REL_ADDONS_DIR/$addon ] ; then - doCommand $shouldSource $cmd $addon - fi - done - - # process all formulas in the dependencies dir - elif [ "$1" == "depends" ] ; then - local depend - for depends in $( ls -1 $FORMULAS_DIR/$DEPENDS_SUBDIR) ; do - OUTPUT_DEPEND=$(realpath ${LIBS_DIR}/)/${depends}/${TYPE} - echo "Making Dependencies to ${OUTPUT_DEPEND}" - # if [ -f "$LIBS_DIR/${depends}/$TYPE/$ABI/lib.a" ]; then - # echo "Build Already exists at $LIBS_DIR/${depends}/$TYPE/ skipping" - # fi - doCommand $shouldSource $cmd "${depend%.*}" - done - - else # process given lib, addon, or dependency - - local formula - local isAddon=0 - local isDepend=0 - checkFormula $1 formula FORMULA_DIR isAddon isDepend - - # an addon - if [ $isAddon == 1 ] ; then - local tmpLibsDir=$LIBS_DIR - - # are there formulas in the addon formulas dir? - if [ "$FORMULA_DIR" != "" ] ; then - - # set libs dest dir to addon/libs if it hasn't been manually set - if [ $IS_CUSTOM_LIBS_DIR == 0 ] ; then - LIBS_DIR=$ADDONS_DIR/$1/libs - fi - # process all formulas in scripts/formulas - local addonFormula - for addonFormula in $( ls -1 $FORMULA_DIR) ; do - # is the file in the directory a valid formula extension - if [ -e $FORMULA_DIR -a "${addonFormula##*.}" == "sh" ] ; then - doCommand $shouldSource $cmd $FORMULA_DIR/$addonFormula - else - echoVerbose "Unknown formula extension '$addonFormula' with extension: ${addonFormula##*.}" - fi - done - - # back to default - if [ $IS_CUSTOM_LIBS_DIR == 0 ] ; then - LIBS_DIR=$tmpLibsDir - fi - else - echoInfo " Skipping addon \"$1\": no formulas found" - fi - - else # OF lib or dependency formula - - # load a script & it's function implementations - if [ $shouldSource == 1 ] ; then - if [ $isDepend == 1 ] ; then - source $FORMULA_DIR/$DEPENDS_SUBDIR/$formula - else - source $FORMULA_DIR/$formula - fi - fi - formula=$(basename $1) - local currentLib="${formula%.*}" - - if [ $shouldSource == 1 ] ; then - # does this formula support the current build type? - local bFormulaType=0 # bool - isFormulaType $TYPE bFormulaType - if [ $bFormulaType == 0 ] && [ $TYPE != "macos" ] ; then - echoInfo " Skipping \"$currentLib\": $cmd not needed for type \"$TYPE\"" - else - # do command - $cmd $currentLib - fi - else - # do command - $cmd $currentLib - fi - fi - fi - shift 1 - - # reset to all types & depends - FORMULA_TYPES=("${VALID_TYPES[@]}") # copy array - FORMULA_DEPENDS=() - - done + local shouldSource=$1 + local cmd=$2 + shift 2 + # process given lib targets + while [ $# -gt 0 ] ; do + + # process all formulas in formulas dir, ignore depends subdir + if [ "$1" == "core" ] ; then + source $APOTHECARY_DIR/../scripts/calculate_formulas.sh + if [ -z "$FORMULAS" ] || [ ${#FORMULAS[@]} -eq 0 ]; then + echo "No formulas to build" + exit 0 + fi + for FORMUL in "${FORMULAS[@]}"; do + FORMULA_NAME="${FORMUL%.*}" + doCommand $shouldSource $cmd $FORMULA_NAME + done + echoInfo " ----- Apothecary Core Build Sucessfully completed for $TYPE -----" + # process all addons in the addons dir + elif [ "$1" == "addons" ] ; then + local addon + for addon in $(ls -1 $REL_ADDONS_DIR) ; do + if [ -d $REL_ADDONS_DIR/$addon ] ; then + doCommand $shouldSource $cmd $addon + fi + done + # process all formulas in the dependencies dir + elif [ "$1" == "depends" ] ; then + local depend + for depends in $( ls -1 $FORMULAS_DIR/$DEPENDS_SUBDIR) ; do + OUTPUT_DEPEND=$(realpath ${LIBS_DIR}/)/${depends}/${TYPE} + echo "Making Dependencies to ${OUTPUT_DEPEND}" + # if [ -f "$LIBS_DIR/${depends}/$TYPE/$ABI/lib.a" ]; then + # echo "Build Already exists at $LIBS_DIR/${depends}/$TYPE/ skipping" + # fi + doCommand $shouldSource $cmd "${depend%.*}" + done + + else # process given lib, addon, or dependency + + local formula + local isAddon=0 + local isDepend=0 + checkFormula $1 formula FORMULA_DIR isAddon isDepend + + # an addon + if [ $isAddon == 1 ] ; then + local tmpLibsDir=$LIBS_DIR + + # are there formulas in the addon formulas dir? + if [ "$FORMULA_DIR" != "" ] ; then + + # set libs dest dir to addon/libs if it hasn't been manually set + if [ $IS_CUSTOM_LIBS_DIR == 0 ] ; then + LIBS_DIR=$ADDONS_DIR/$1/libs + fi + # process all formulas in scripts/formulas + local addonFormula + for addonFormula in $( ls -1 $FORMULA_DIR) ; do + # is the file in the directory a valid formula extension + if [ -e $FORMULA_DIR -a "${addonFormula##*.}" == "sh" ] ; then + doCommand $shouldSource $cmd $FORMULA_DIR/$addonFormula + else + echoVerbose "Unknown formula extension '$addonFormula' with extension: ${addonFormula##*.}" + fi + done + + # back to default + if [ $IS_CUSTOM_LIBS_DIR == 0 ] ; then + LIBS_DIR=$tmpLibsDir + fi + else + echoInfo " Skipping addon \"$1\": no formulas found" + fi + + else # OF lib or dependency formula + + # load a script & it's function implementations + if [ $shouldSource == 1 ] ; then + if [ $isDepend == 1 ] ; then + source $FORMULA_DIR/$DEPENDS_SUBDIR/$formula + else + source $FORMULA_DIR/$formula + fi + fi + formula=$(basename $1) + local currentLib="${formula%.*}" + + if [ $shouldSource == 1 ] ; then + # does this formula support the current build type? + local bFormulaType=0 # bool + isFormulaType $TYPE bFormulaType + if [ $bFormulaType == 0 ] && [ $TYPE != "macos" ] ; then + echoInfo " Skipping \"$currentLib\": $cmd not needed for type \"$TYPE\"" + else + # do command + $cmd $currentLib + fi + else + # do command + $cmd $currentLib + fi + fi + fi + shift 1 + + # reset to all types & depends + FORMULA_TYPES=("${VALID_TYPES[@]}") # copy array + FORMULA_DEPENDS=() + + done } # update a given library function updateFormula() { - export LIBS_DIR_REAL=$(realpath $LIBS_DIR) - echo - echoStart " ----- $1 -----" - # if [ $FORCE_DOWNLOAD -eq 1 ] ; then - # cleanFormula $1 - # fi - echoStart " Building \"$1\" ...." - - if [ ! -e $1 ] ; then - if [[ $FORCE_DOWNLOAD -eq 0 ]] && [[ $USE_SAVE == 1 ]]; then - result=$(load $1 | tail -n 1) - echoInfo " $1 - Checking if Precompiled binary :[$result]" - if [ $result -eq 1 ]; then - echoInfo " \"$1\" Precompiled binary validated. Skipping updateFormula" - return 0 - else - echoInfo " Precompiled not found or outdated. Continue updateFormula for \"$1\" " - fi - else - echoInfo " Not using cache : [FORCE_DOWNLOAD=$FORCE_DOWNLOAD] [USE_SAVE=$USE_SAVE == 1] for updateFormula \"$1\" " - fi - else - echoInfo " Not using cache : [! -e $1] for updateFormula \"$1\" " - fi - - downloadFormula $1 - prepareFormula $1 - buildFormula $1 - copyFormula $1 - echo - echoSuccess " Finished \"$1\"" + export LIBS_DIR_REAL=$(realpath $LIBS_DIR) + echo + echoStart " ----- $1 -----" + # if [ $FORCE_DOWNLOAD -eq 1 ] ; then + # cleanFormula $1 + # fi + echoStart " Building \"$1\" ...." + + if [ ! -e $1 ] ; then + if [[ $FORCE_DOWNLOAD -eq 0 ]] && [[ $USE_SAVE == 1 ]]; then + result=$(load $1 | tail -n 1) + echoInfo " $1 - Checking if Precompiled binary :[$result]" + if [ $result -eq 1 ]; then + echoInfo " \"$1\" Precompiled binary validated. Skipping updateFormula" + return 0 + else + echoInfo " Precompiled not found or outdated. Continue updateFormula for \"$1\" " + fi + else + echoInfo " Not using cache : [FORCE_DOWNLOAD=$FORCE_DOWNLOAD] [USE_SAVE=$USE_SAVE == 1] for updateFormula \"$1\" " + fi + else + echoInfo " Not using cache : [! -e $1] for updateFormula \"$1\" " + fi + + downloadFormula $1 + prepareFormula $1 + buildFormula $1 + copyFormula $1 + echo + echoSuccess " Finished \"$1\"" } # download a given library into the build cache, arg is library name function downloadFormula(){ - export LIBS_DIR_REAL=$(realpath $LIBS_DIR) - echo - echoInfo " Downloading \"$1\" " - echoVerbose " Formula dir: $FORMULA_DIR" - echoVerbose " Formula build types: ${FORMULA_TYPES[*]}" - echoVerbose " Build dir: $BUILD_DIR" - echoVerbose " Depends formula dir: $DEPENDS_FORMULA_DIR" - if [ ${#FORMULA_DEPENDS[@]} -gt 0 ] ; then - echoVerbose " Dependencies: ${FORMULA_DEPENDS[*]}" - fi - echo - if [ ! -e $1 ] ; then - if [[ $FORCE_DOWNLOAD -eq 0 ]] && [[ $USE_SAVE == 1 ]]; then - LOAD_RESULT=$(load $1) - FINAL_RESULT=$(echo "$LOAD_RESULT" | tail -n 1) - echoInfo " Checking for Precompiled binary \"$1\" with result:[$FINAL_RESULT] - [$LOAD_RESULT]" - if [ $FINAL_RESULT -eq 1 ]; then - echoInfo " \"$1\" Precompiled binary validated. Skipping download" - return 0 - else - echoInfo " Precompiled not found or outdated. Continue downloadFormula for \"$1\" " - fi - else - echoInfo " Not using cache : [FORCE_DOWNLOAD=$FORCE_DOWNLOAD] [USE_SAVE=$USE_SAVE == 1] for downloadFormula \"$1\" " - fi - else - echoInfo " Not using cache : [! -e $1] for downloadFormula \"$1\" " - fi - mkdir -p $BUILD_DIR - mkdir -p $BUILD_ROOT_DIR - cd $BUILD_DIR - - if [ -e $1 ] ; then - if [ $FORCE_DOWNLOAD -eq 1 ]; then - echoNotice " Removing past download -F $1" - rm -rf ${PWD}/${1}* - else - echoInfo " Already downloaded... " - fi - fi - - if [ ! -e $1 ] ; then - if [ ! -z "$USE_GIT" ] && [[ "${GIT_URL:+x}" ]] ; then - gitclone $1 $GIT_URL ${GIT_TAG:-master} - else - download $1 - fi - - if [ ! -d $BUILD_DIR/$1 ] ; then - echoError " It looks like downloading failed for \"$1\"" - exit 1 - fi - fi - # dependencies - if [ $FORMULA_DEPENDS_MANUAL == 0 ] ; then - apothecaryDependencies download - fi - cd $APOTHECARY_DIR + export LIBS_DIR_REAL=$(realpath $LIBS_DIR) + echo + echoInfo " Downloading \"$1\" " + echoVerbose " Formula dir: $FORMULA_DIR" + echoVerbose " Formula build types: ${FORMULA_TYPES[*]}" + echoVerbose " Build dir: $BUILD_DIR" + echoVerbose " Depends formula dir: $DEPENDS_FORMULA_DIR" + if [ ${#FORMULA_DEPENDS[@]} -gt 0 ] ; then + echoVerbose " Dependencies: ${FORMULA_DEPENDS[*]}" + fi + echo + if [ ! -e $1 ] ; then + if [[ $FORCE_DOWNLOAD -eq 0 ]] && [[ $USE_SAVE == 1 ]]; then + LOAD_RESULT=$(load $1) + FINAL_RESULT=$(echo "$LOAD_RESULT" | tail -n 1) + echoInfo " Checking for Precompiled binary \"$1\" with result:[$FINAL_RESULT] - [$LOAD_RESULT]" + if [ $FINAL_RESULT -eq 1 ]; then + echoInfo " \"$1\" Precompiled binary validated. Skipping download" + return 0 + else + echoInfo " Precompiled not found or outdated. Continue downloadFormula for \"$1\" " + fi + else + echoInfo " Not using cache : [FORCE_DOWNLOAD=$FORCE_DOWNLOAD] [USE_SAVE=$USE_SAVE == 1] for downloadFormula \"$1\" " + fi + else + echoInfo " Not using cache : [! -e $1] for downloadFormula \"$1\" " + fi + mkdir -p $BUILD_DIR + mkdir -p $BUILD_ROOT_DIR + cd $BUILD_DIR + + if [ -e $1 ] ; then + if [ $FORCE_DOWNLOAD -eq 1 ]; then + echoNotice " Removing past download -F $1" + rm -rf ${PWD}/${1}* + else + echoInfo " Already downloaded... " + fi + fi + + if [ ! -e $1 ] ; then + if [ ! -z "$USE_GIT" ] && [[ "${GIT_URL:+x}" ]] ; then + gitclone $1 $GIT_URL ${GIT_TAG:-master} + else + download $1 + fi + + if [ ! -d $BUILD_DIR/$1 ] ; then + echoError " It looks like downloading failed for \"$1\"" + exit 1 + fi + fi + # dependencies + if [ $FORMULA_DEPENDS_MANUAL == 0 ] ; then + apothecaryDependencies download + fi + cd $APOTHECARY_DIR } # prepare a given library, arg is library name function prepareFormula() { - export LIBS_DIR_REAL=$(realpath $LIBS_DIR) - # run prepare command in src dir - echo - echoInfo " Preparing \"$1\"" - echo - if [ ! -e $1 ] ; then - if [[ $FORCE_DOWNLOAD -eq 0 ]] && [[ $USE_SAVE == 1 ]]; then - result=$(load $1 | tail -n 1) - echoInfo " Checking for Precompiled binary \"$1\" with result:[$result]" - if [ $result -eq 1 ]; then - echoInfo " \"$1\" Precompiled binary validated. Skipping prepare" - return 0 - else - echoInfo " Precompiled not found or outdated. Continue prepareFormula for \"$1\" " - fi - else - echoInfo " Not using cache : [FORCE_DOWNLOAD=$FORCE_DOWNLOAD] [USE_SAVE=$USE_SAVE == 1] for prepareFormula \"$1\" " - fi - else - echoInfo " Not using cache : [! -e $1] for prepareFormula \"$1\" " - fi - - if [ ! -e $BUILD_DIR/$1 ] ; then - echoError " Lib src dir missing for \"$1\": $BUILD_DIR/$1" - echoError " Did you download the formula?" - exit 1 - fi - cd $BUILD_DIR/$1 - # dependencies - if [ $FORMULA_DEPENDS_MANUAL == 0 ] ; then - apothecaryDependencies prepare $1 - fi - prepare $1 - cd $APOTHECARY_DIR + export LIBS_DIR_REAL=$(realpath $LIBS_DIR) + # run prepare command in src dir + echo + echoInfo " Preparing \"$1\"" + echo + if [ ! -e $1 ] ; then + if [[ $FORCE_DOWNLOAD -eq 0 ]] && [[ $USE_SAVE == 1 ]]; then + result=$(load $1 | tail -n 1) + echoInfo " Checking for Precompiled binary \"$1\" with result:[$result]" + if [ $result -eq 1 ]; then + echoInfo " \"$1\" Precompiled binary validated. Skipping prepare" + return 0 + else + echoInfo " Precompiled not found or outdated. Continue prepareFormula for \"$1\" " + fi + else + echoInfo " Not using cache : [FORCE_DOWNLOAD=$FORCE_DOWNLOAD] [USE_SAVE=$USE_SAVE == 1] for prepareFormula \"$1\" " + fi + else + echoInfo " Not using cache : [! -e $1] for prepareFormula \"$1\" " + fi + + if [ ! -e $BUILD_DIR/$1 ] ; then + echoError " Lib src dir missing for \"$1\": $BUILD_DIR/$1" + echoError " Did you download the formula?" + exit 1 + fi + cd $BUILD_DIR/$1 + # dependencies + if [ $FORMULA_DEPENDS_MANUAL == 0 ] ; then + apothecaryDependencies prepare $1 + fi + prepare $1 + cd $APOTHECARY_DIR } # build a given library, arg is library name function buildFormula() { - # run build command in src dir - export LIBS_DIR_REAL=$(realpath $LIBS_DIR) - echo - echoInfo " Building \"$1\"" - if [ ! -e $1 ] ; then - if [[ $FORCE_DOWNLOAD -eq 0 ]] && [[ $USE_SAVE == 1 ]]; then - result=$(load $1 | tail -n 1) - echoInfo " Checking for Precompiled binary \"$1\" with result:[$result]" - if [ $result -eq 1 ]; then - echoInfo " \"$1\" Precompiled binary validated. Skipping buildFormula" - return 0 - else - echoInfo " Precompiled not found or outdated. Continue buildFormula for \"$1\" " - fi - else - echoInfo " Not using cache : [FORCE_DOWNLOAD=$FORCE_DOWNLOAD] [USE_SAVE=$USE_SAVE == 1] for buildFormula \"$1\" " - fi - else - echoInfo " Not using cache : [! -e $1] for buildFormula \"$1\" " - fi - echo - if [ ! -e $BUILD_DIR/$1 ] ; then - echoError " Lib src dir missing for \"$1\": $BUILD_DIR/$1" - echoError " Did you download the formula?" - exit 1 - fi - cd $BUILD_DIR/$1 - # dependencies - if [ $FORMULA_DEPENDS_MANUAL == 0 ] ; then - apothecaryDependencies build - apothecaryDependencies copy - echoSuccess " \"$1\" dependencies build success" - echo - echoInfo " Now Building \"$1\"" - fi - echoInfo "--------------------" - build $1 - cd $APOTHECARY_DIR + # run build command in src dir + export LIBS_DIR_REAL=$(realpath $LIBS_DIR) + echo + echoInfo " Building \"$1\"" + if [ ! -e $1 ] ; then + if [[ $FORCE_DOWNLOAD -eq 0 ]] && [[ $USE_SAVE == 1 ]]; then + result=$(load $1 | tail -n 1) + echoInfo " Checking for Precompiled binary \"$1\" with result:[$result]" + if [ $result -eq 1 ]; then + echoInfo " \"$1\" Precompiled binary validated. Skipping buildFormula" + return 0 + else + echoInfo " Precompiled not found or outdated. Continue buildFormula for \"$1\" " + fi + else + echoInfo " Not using cache : [FORCE_DOWNLOAD=$FORCE_DOWNLOAD] [USE_SAVE=$USE_SAVE == 1] for buildFormula \"$1\" " + fi + else + echoInfo " Not using cache : [! -e $1] for buildFormula \"$1\" " + fi + echo + if [ ! -e $BUILD_DIR/$1 ] ; then + echoError " Lib src dir missing for \"$1\": $BUILD_DIR/$1" + echoError " Did you download the formula?" + exit 1 + fi + cd $BUILD_DIR/$1 + # dependencies + if [ "$FORMULA_DEPENDS_MANUAL" == "0" ] ; then + for depend in "${FORMULA_DEPENDS[@]}" ; do + if [[ "$FORCE_DOWNLOAD" -eq 0 ]] && [[ "$USE_SAVE" == 1 ]]; then + result=$(load "$depend" | tail -n 1) + echoInfo " Checking for Precompiled binary \"$depend\" with result: [$result]" + + if [ "$result" -eq 1 ]; then + echoInfo " \"$depend\" Precompiled binary validated. Skipping buildFormula" + continue # Skip to next dependency instead of exiting the entire loop + else + echoInfo " Precompiled not found or outdated. Continue buildFormula for \"$depend\" " + fi + else + echoInfo " Not using cache: [FORCE_DOWNLOAD=$FORCE_DOWNLOAD] [USE_SAVE=$USE_SAVE == 1] for buildFormula \"$depend\"" + fi + + # Build and copy dependency if it's not precompiled + apothecaryDepend build "$depend" + apothecaryDepend copy "$depend" + done + + echoSuccess " \"$1\" dependencies built successfully" + echo + echoInfo " Now Building \"$1\"" + fi + echoInfo "--------------------" + build $1 + cd $APOTHECARY_DIR } # copy a given library, arg is library name function copyFormula() { - # dest arg path relative to src dir - echo - export LIBS_DIR_REAL=$(realpath $LIBS_DIR) - echoInfo " Copying \"$1\"" - echoVerbose " Lib src dir: $BUILD_DIR/$1" - echoInfo " Lib dest dir: $LIBS_DIR_REAL/$1" - echo - - if [ ! -e $1 ] ; then - if [[ $FORCE_DOWNLOAD -eq 0 ]] && [[ $USE_SAVE == 1 ]]; then - result=$(load $1 | tail -n 1) - echoInfo " Checking for Precompiled binary \"$1\" with result:[$result]" - if [ $result -eq 1 ]; then - echoInfo " \"$1\" Precompiled binary validated. Skipping copyFormula" - return 0 - else - echoInfo " Precompiled not found or outdated. Continue copyFormula for \"$1\" " - fi - else - echoInfo " Not using cache : [FORCE_DOWNLOAD=$FORCE_DOWNLOAD] [USE_SAVE=$USE_SAVE == 1] for copyFormula \"$1\" " - fi - else - echoInfo " Not using cache : [! -e $1] for copyFormula \"$1\" " - fi - - if [ ! -e $BUILD_DIR/$1 ] ; then - echoWarning " Lib src dir missing for \"$1\": $BUILD_DIR/$1" - echoError " Did you download the formula?" - exit 1 - fi - - cd $BUILD_DIR/$1 - copy $LIBS_DIR_REAL/$1 - cd $APOTHECARY_DIR + # dest arg path relative to src dir + echo + export LIBS_DIR_REAL=$(realpath $LIBS_DIR) + echoInfo " Copying \"$1\"" + echoVerbose " Lib src dir: $BUILD_DIR/$1" + echoInfo " Lib dest dir: $LIBS_DIR_REAL/$1" + echo + + if [ ! -e $1 ] ; then + if [[ $FORCE_DOWNLOAD -eq 0 ]] && [[ $USE_SAVE == 1 ]]; then + result=$(load $1 | tail -n 1) + echoInfo " Checking for Precompiled binary \"$1\" with result:[$result]" + if [ $result -eq 1 ]; then + echoInfo " \"$1\" Precompiled binary validated. Skipping copyFormula" + return 0 + else + echoInfo " Precompiled not found or outdated. Continue copyFormula for \"$1\" " + fi + else + echoInfo " Not using cache : [FORCE_DOWNLOAD=$FORCE_DOWNLOAD] [USE_SAVE=$USE_SAVE == 1] for copyFormula \"$1\" " + fi + else + echoInfo " Not using cache : [! -e $1] for copyFormula \"$1\" " + fi + + if [ ! -e $BUILD_DIR/$1 ] ; then + echoWarning " Lib src dir missing for \"$1\": $BUILD_DIR/$1" + echoError " Did you download the formula?" + exit 1 + fi + + cd $BUILD_DIR/$1 + copy $LIBS_DIR_REAL/$1 + cd $APOTHECARY_DIR } # clean a given library, arg is library name function cleanFormula() { - export LIBS_DIR_REAL=$(realpath $LIBS_DIR) - # run build command in src dir - echo - echoInfo " Cleaning \"$1\"" - echoVerbose " Lib src dir: $BUILD_DIR/$1" - echo - - if [ ! -e $BUILD_DIR/$1 ] ; then - echoError " Lib src dir missing for \"$1\": $BUILD_DIR/$1" - echoError " Did you download the formula? Clean build folder however" - exit 0 - fi - - cd $BUILD_DIR/$1 - if [ ! -z "$USE_GIT" ] && [ -d $BUILD_DIR/$1/.git ] ; then - git clean -d -f -q -x - git reset -q --hard HEAD - if [[ ${SWITCH_VER:+x} ]]; then - echoVerbose " Switching version (to $SWITCH_VER)" - { - git checkout $SWITCH_VER - } || { - echoInfo " Local version missing. Fetching distant changes..." - git fetch origin - git checkout $SWITCH_VER - } - fi - else - - # dependencies - if [ $FORMULA_DEPENDS_MANUAL == 0 ] ; then - apothecaryDependencies clean - fi - - clean - fi - cd $APOTHECARY_DIR + export LIBS_DIR_REAL=$(realpath $LIBS_DIR) + # run build command in src dir + echo + echoInfo " Cleaning \"$1\"" + echoVerbose " Lib src dir: $BUILD_DIR/$1" + echo + + if [ ! -e $BUILD_DIR/$1 ] ; then + echoError " Lib src dir missing for \"$1\": $BUILD_DIR/$1" + echoError " Did you download the formula? Clean build folder however" + exit 0 + fi + + cd $BUILD_DIR/$1 + if [ ! -z "$USE_GIT" ] && [ -d $BUILD_DIR/$1/.git ] ; then + git clean -d -f -q -x + git reset -q --hard HEAD + if [[ ${SWITCH_VER:+x} ]]; then + echoVerbose " Switching version (to $SWITCH_VER)" + { + git checkout $SWITCH_VER + } || { + echoInfo " Local version missing. Fetching distant changes..." + git fetch origin + git checkout $SWITCH_VER + } + fi + else + + # dependencies + if [ $FORMULA_DEPENDS_MANUAL == 0 ] ; then + apothecaryDependencies clean + fi + + clean + fi + cd $APOTHECARY_DIR } function frameworkFormula() { - echoStart " frameworkFormula [\"$1\"] for:[${TYPE}]" - - export LIBS_DIR_REAL=$(realpath $LIBS_DIR) - XLIBSLOCAL="$APOTHECARY_DIR/../xout" - if [[ ! -e "$XLIBSLOCAL" ]]; then - mkdir -p $XLIBSLOCAL - fi - export XLIBS_DIR_REAL=$(realpath $XLIBSLOCAL) - - if [[ $TYPE == "osx" ]]; then - TYPE_OUT="macos" - else - TYPE_OUT=${TYPE} - fi - - if [ ! -e "$LIBS_DIR/$1" ] ; then - echoVerbose " Nothing to create framework from to merge in lib dest dir: \"$1\"" - elif [ $1 == "pkg-config" ] || [ $1 == "kiss" ]; then - echoVerbose " No need to create framework for: \"$1\"" - else - XDIR="${XLIBS_DIR_REAL}/" - rm -rf $XLIBS_DIR_REAL/$1/lib/$TYPE_OUT/*.xcframework - - echoSuccess " Framework lib dest dir: \"$1\" \"$XLIBS_DIR_REAL/$1/lib/$TYPE_OUT/\" " - xcframework_flags="" - - XDIR="${XLIBS_DIR_REAL}/" - X_LIBS="${XDIR}/${1}/lib/${TYPE_OUT}/" - X_INCLUDE=${XDIR}/${1}/include - X_LICENSE=${XDIR}/${1}/license - - mkdir -p "${X_INCLUDE}" - mkdir -p "${X_LICENSE}" - - mkdir -p "${X_LIBS}" - if [[ $1 == "fmod" ]] || [[ $1 == "fmodex" ]] || [[ $1 == "glm" ]] || [[ $1 == "json" ]] || [[ $1 == "utf8" ]]; then - if [[ $TYPE == "macos" ]]; then - TYPE_OUT="osx" - fi - if ! command -v rsync &> /dev/null; then - if [[ -e "${LIBS_DIR_REAL}/${1}/lib/${TYPE}/" ]]; then - mkdir -p "${X_LIBS}" - cp -av "${LIBS_DIR_REAL}/${1}/lib/${TYPE}/"* ${X_LIBS} - fi - if [[ -e "${LIBS_DIR_REAL}/${1}/include/" ]]; then - cp -av "${LIBS_DIR_REAL}/${1}/include/"* ${X_INCLUDE} - fi - if [[ -e "${LIBS_DIR_REAL}/${1}/license/" ]]; then - cp -av "${LIBS_DIR_REAL}/${1}/license/"* ${X_LICENSE} - fi - else - if [[ -e "${LIBS_DIR_REAL}/${1}/lib/${TYPE}" ]]; then - echo "Copying from ${LIBS_DIR_REAL}/${1}/lib/${TYPE}/ to ${X_LIBS}" - mkdir -p "${X_LIBS}" - rsync -av "${LIBS_DIR_REAL}/${1}/lib/${TYPE}/" ${X_LIBS} - fi - if [[ -e "${LIBS_DIR_REAL}/${1}/include/" ]]; then - rsync -av "${LIBS_DIR_REAL}/${1}/include/" ${X_INCLUDE} - fi - if [[ -e "${LIBS_DIR_REAL}/${1}/license/" ]]; then - rsync -av "${LIBS_DIR_REAL}/${1}/license/" ${X_LICENSE} - fi - fi - exit 0; - fi - - if ((BASH_VERSINFO[0] < 4)); then - echo "The current version of Bash does not support associative arrays." - echo "Please update to Bash 4.0 or newer. Current:${BASH_VERSINFO[0]}" - echo "brew install bash" - exit 1 - fi - - declare -A ARCH_PAIRS=( - ["MAC"]="MAC_ARM64" - ["MAC_CATALYST"]="MAC_CATALYST_ARM64" - ["SIMULATOR64"]="SIMULATORARM64" - ["SIMULATOR_TVOS"]="SIMULATORARM64_TVOS" - ["TVOS"]="TVOS" # Note: If TVOS doesn't have a pair, it's listed for consistency - ["WATCHOS"]="WATCHOS" # Same note as TVOS - ["SIMULATORARM64_WATCHOS"]="SIMULATOR_WATCHOS" - ["OS64"]="OS64" - ["WATCHOS"]="WATCHOS" - ["VISIONOS"]="VISIONOS" # And again, for VISIONOS - ["SIMULATOR64_VISIONOS"]="SIMULATOR_VISIONOS" - ) - # this gets a bit advanced bash so need Bash 4 - brew install bash if issues arrise... hectic problems - PLATFORM_TYPES=("ios" "osx" "tvos" "catos" "xros" "watchos" ) - declare -a merged_dirs=() - VERSION="" - LIB_NAME="" - CURRENT_TYPE=$TYPE - BINARY_NAME="" - XCFRAMEWORK_PATH="${LIBS_DIR_REAL}/${1}/lib/${TYPE_OUT}/$1.xcframework" - declare -a merged_dirs=() - LIB_NAME="" - for CURRENT_TYPE in "${PLATFORM_TYPES[@]}"; do - if [ -d "$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE" ]; then - echo "Processing platform type: $CURRENT_TYPE" - for X_ARCH in "${!ARCH_PAIRS[@]}"; do - PAIR="${ARCH_PAIRS[$X_ARCH]}" - DIR_PATH="$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/$X_ARCH/" - if [ -d "$DIR_PATH" ]; then - echo "Processing ARCH: $X_ARCH" - MERGED_DIR="$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/MERGE_${X_ARCH}_${PAIR}" - declare -a archive_paths=() - while IFS= read -r -d $'\0' file; do - archive_paths+=("$file") - done < <(find "$DIR_PATH" \( -name "*.a" -o -name "*.xarchive" \) -print0) - - for path in "${archive_paths[@]}"; do - echo "Archive path: $path" - done - - PKL_PATH=$(find "$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE" -type f -name "*.pkl" | head -n 1) - if [[ -f "$PKL_PATH" ]]; then - echo "Found PKL file at $PKL_PATH" - VERSION=$(grep 'version =' "$PKL_PATH" | cut -d '"' -f 2 | xargs) - echo "VERSION $VERSION" - LIB_NAME=$(grep 'name =' "$PKL_PATH" | cut -d '"' -f 2 | xargs) - BUILD_TIME=$(grep 'buildTime =' "$PKL_PATH" | cut -d '"' -f 2 | xargs) - if [[ -z "$VERSION" ]]; then - echo "No version info found in PKL file. Using default." - VERSION="default_version" - fi - else - echo "No PKL file found at $1 - $CURRENT_TYPE. Ensure .pkl files are present and correctly named." - fi - - num_archive_paths=${#archive_paths[@]} - for ARCH_FILE in "${archive_paths[@]}"; do - echo "ARCH_FILE: $ARCH_FILE $1 - $CURRENT_TYPE" - PAIR_FILE="${ARCH_FILE/$X_ARCH/$PAIR}" - EXTENSION="${ARCH_FILE##*.}" # Get file extension (.a or .xarchive) - path_found_in_array=false - - if [[ -f "$PAIR_FILE" && "$X_ARCH" != "$PAIR" ]]; then - mkdir -p "$MERGED_DIR" - echo "MERGED_DIR: $X_ARCH - Pair: $PAIR" - PATH_MERGE="$MERGED_DIR" - MERGED_PATH="$MERGED_DIR/$(basename "$ARCH_FILE" .$EXTENSION).$EXTENSION" - - # Handle merging based on file type - if [[ "$EXTENSION" == "a" ]]; then - # Use lipo to merge .a files - xcrun lipo -create "$ARCH_FILE" "$PAIR_FILE" -output "$MERGED_PATH" - echo "Merged $ARCH_FILE and $PAIR_FILE into $MERGED_PATH" - elif [[ "$EXTENSION" == "xarchive" ]]; then - # Use xcodebuild to merge .xarchive files - xcrun xcodebuild -create-xcframework \ - -archive "$ARCH_FILE" \ - -archive "$PAIR_FILE" \ - -output "$MERGED_PATH" - echo "Merged $ARCH_FILE and $PAIR_FILE into $MERGED_PATH (XCFramework)" - fi - - for dir in "${merged_dirs[@]}"; do - if [[ "$dir" == "$PATH_MERGE" ]]; then - path_found_in_array=true - break - fi - done - if [[ $path_found_in_array == false ]]; then - merged_dirs+=("$PATH_MERGE") - echo "path_found_in_array == false adding $PATH_MERGE" - else - echo "path_found_in_array == true" - fi - else - PATH_MERGE="$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/${X_ARCH}/" - MERGED_PATH="$PATH_MERGE/$(basename "$ARCH_FILE" .$EXTENSION).$EXTENSION" - if [[ "$num_archive_paths" -gt 1 ]]; then - for dir in "${merged_dirs[@]}"; do - if [[ "$dir" == "$PATH_MERGE" ]]; then - path_found_in_array=true - break - fi - done - if [[ $path_found_in_array == false ]]; then - merged_dirs+=("$PATH_MERGE") - fi - else - if [[ ! "$xcframework_flags" =~ "$MERGED_PATH" ]]; then - xcframework_flags+=" -library $MERGED_PATH" - xcframework_flags+=" -headers $LIBS_DIR_REAL/$1/include" - fi - fi - fi - done - fi - done - else - echoVerbose "Platform type directory does not exist: $LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE" - fi - done - - - # Final merging pass to combine binaries of the same or merged architectures into a single binary or XCFramework to prevent linking issues - for dir in "${merged_dirs[@]}"; do - echo "Processing directory: $dir" - - # Find all .a and .xarchive files in the directory - files=($(find "$dir" \( -name '*.a' -o -name '*.xarchive' \) -print0 | xargs -0)) - echo "[$dir] - Found archives: ${#files[@]}" - - num_files=${#files[@]} - if [ "$num_files" -gt 1 ]; then - echo "Multiple archives found in $dir. Commencing the merge..." - - # Separate .a and .xarchive files into their own arrays - declare -a a_files=() - declare -a xarchive_files=() - for file in "${files[@]}"; do - if [[ "${file##*.}" == "a" ]]; then - a_files+=("$file") - elif [[ "${file##*.}" == "xarchive" ]]; then - xarchive_files+=("$file") - fi - done - - # Merge all .a files into a single static library - if [ "${#a_files[@]}" -gt 1 ]; then - libtool -static -o "${dir}/${1}.a" "${a_files[@]}" - echo "Merged .a files into ${dir}/${1}.a" - # Clean up individual .a files after merging - for a_file in "${a_files[@]}"; do - rm -f "$a_file" - done - lipo -info "${dir}/${1}.a" - # Add to xcframework flags - if [[ ! "$xcframework_flags" =~ "${dir}/${1}.a" ]]; then - xcframework_flags+=" -library ${dir}/${1}.a" - xcframework_flags+=" -headers $LIBS_DIR_REAL/$1/include" - fi - elif [ "${#a_files[@]}" -eq 1 ]; then - echo "Single .a file detected, using directly: ${a_files[0]}" - xcframework_flags+=" -library ${a_files[0]}" - xcframework_flags+=" -headers $LIBS_DIR_REAL/$1/include" - fi - - # Merge all .xarchive files into a single XCFramework - if [ "${#xarchive_files[@]}" -gt 1 ]; then - xcodebuild -create-xcframework -output "${dir}/${1}.xcframework" \ - $(for xfile in "${xarchive_files[@]}"; do echo "-archive $xfile"; done) - echo "Merged .xarchive files into ${dir}/${1}.xcframework" - # Clean up individual .xarchive files after merging - for xarchive_file in "${xarchive_files[@]}"; do - rm -f "$xarchive_file" - done - # Add to xcframework flags - if [[ ! "$xcframework_flags" =~ "${dir}/${1}.xcframework" ]]; then - xcframework_flags+=" -library ${dir}/${1}.xcframework" - xcframework_flags+=" -headers $LIBS_DIR_REAL/$1/include" - fi - elif [ "${#xarchive_files[@]}" -eq 1 ]; then - echo "Single .xarchive file detected, using directly: ${xarchive_files[0]}" - xcframework_flags+=" -library ${xarchive_files[0]}" - xcframework_flags+=" -headers $LIBS_DIR_REAL/$1/include" - fi - elif [ "$num_files" -eq 1 ]; then - # Directly use the single archive if only one is present - single_file="${files[0]}" - echo "Directly using the single archive ${single_file}" - if [[ "${single_file##*.}" == "a" ]]; then - xcframework_flags+=" -library ${single_file}" - elif [[ "${single_file##*.}" == "xarchive" ]]; then - xcframework_flags+=" -library ${single_file}" - fi - xcframework_flags+=" -headers $LIBS_DIR_REAL/$1/include" - else - echo "No archives found in $dir. Skipping." - fi - done - - - - - echoSuccess " flags: [\"$1\" \"$xcframework_flags\"]" - HERE_DIR=$(cd $(dirname "./"); pwd -P) - - - - - XCFRAMEWORK_PATH="${XLIBS_DIR_REAL}/${1}/lib/${TYPE_OUT}/$1.xcframework" - cd "${XLIBS_DIR_REAL}/${1}/lib/${TYPE_OUT}/" - xcodebuild -create-xcframework $xcframework_flags -output $1.xcframework - echoSuccess " xcframework for $TYPE built successfully." - echo "========================" - - cd $HERE_DIR - - - - - # Loop over each .a file found within the xcframework - find "$XCFRAMEWORK_PATH" -type f -name "*.a" | while read -r lib_a; do - echo "Securing $lib_a..." - lipo -info "$lib_a" - #xcrun codesign --sign - "$lib_a" || true - . "$SECURE_SCRIPT" - secure "$lib_a" "$LIB_NAME" "$VERSION" - done - - echoSuccess " xcframework for [$TYPE] transferring to [$XDIR]" - if ! command -v rsync &> /dev/null; then - cp -av "${XCFRAMEWORK_PATH}/"* ${X_LIBS} - cp -av "${LIBS_DIR_REAL}/${1}/include/"* ${X_INCLUDE} - cp -av "${LIBS_DIR_REAL}/${1}/license/"* ${X_LICENSE} - else - rsync -av "${XCFRAMEWORK_PATH}" ${X_LIBS} - rsync -av "${LIBS_DIR_REAL}/${1}/include/" ${X_INCLUDE} - rsync -av "${LIBS_DIR_REAL}/${1}/license/" ${X_LICENSE} - fi - - echo " -- cleanup merged libraries ..." - for dir in "${merged_dirs[@]}"; do - echo " removing directory: [$dir]" - rm -rfv "${dir}" - done - - # rm -rfv "${XCFRAMEWORK_PATH}" - - - echoSuccess " xcframework for $TYPE built successfully." - # echo "========================" - # echo "=========DANGER ZONE DELETE ALL BINARIES EXCEPT XCFRAMEWORK ===============" - # dirs=$(find . -mindepth 1 -maxdepth 1 -type d) - # for dir in $dirs; do - # if [[ ! "$dir" =~ .*.xcframework$ ]]; then - # echo "Removing directory: $dir" - # rm -rf "$dir" - # fi - # done - echo "========================" - cd $HERE_DIR - fi + echoStart " frameworkFormula [\"$1\"] for:[${TYPE}]" + + export LIBS_DIR_REAL=$(realpath $LIBS_DIR) + XLIBSLOCAL="$APOTHECARY_DIR/../xout" + if [[ ! -e "$XLIBSLOCAL" ]]; then + mkdir -p $XLIBSLOCAL + fi + export XLIBS_DIR_REAL=$(realpath $XLIBSLOCAL) + + if [[ $TYPE == "osx" ]]; then + TYPE_OUT="macos" + else + TYPE_OUT=${TYPE} + fi + + if [ ! -e "$LIBS_DIR/$1" ] ; then + echoVerbose " Nothing to create framework from to merge in lib dest dir: \"$1\"" + elif [ $1 == "pkg-config" ] || [ $1 == "kiss" ]; then + echoVerbose " No need to create framework for: \"$1\"" + else + XDIR="${XLIBS_DIR_REAL}/" + rm -rf $XLIBS_DIR_REAL/$1/lib/$TYPE_OUT/*.xcframework + + echoSuccess " Framework lib dest dir: \"$1\" \"$XLIBS_DIR_REAL/$1/lib/$TYPE_OUT/\" " + xcframework_flags="" + + XDIR="${XLIBS_DIR_REAL}/" + X_LIBS="${XDIR}/${1}/lib/${TYPE_OUT}/" + X_INCLUDE=${XDIR}/${1}/include + X_LICENSE=${XDIR}/${1}/license + + mkdir -p "${X_INCLUDE}" + mkdir -p "${X_LICENSE}" + + mkdir -p "${X_LIBS}" + if [[ $1 == "fmod" ]] || [[ $1 == "fmodex" ]] || [[ $1 == "glm" ]] || [[ $1 == "json" ]] || [[ $1 == "utf8" ]]; then + if [[ $TYPE == "macos" ]]; then + TYPE_OUT="osx" + fi + if ! command -v rsync &> /dev/null; then + if [[ -e "${LIBS_DIR_REAL}/${1}/lib/${TYPE}/" ]]; then + mkdir -p "${X_LIBS}" + cp -av "${LIBS_DIR_REAL}/${1}/lib/${TYPE}/"* ${X_LIBS} + fi + if [[ -e "${LIBS_DIR_REAL}/${1}/include/" ]]; then + cp -av "${LIBS_DIR_REAL}/${1}/include/"* ${X_INCLUDE} + fi + if [[ -e "${LIBS_DIR_REAL}/${1}/license/" ]]; then + cp -av "${LIBS_DIR_REAL}/${1}/license/"* ${X_LICENSE} + fi + else + if [[ -e "${LIBS_DIR_REAL}/${1}/lib/${TYPE}" ]]; then + echo "Copying from ${LIBS_DIR_REAL}/${1}/lib/${TYPE}/ to ${X_LIBS}" + mkdir -p "${X_LIBS}" + rsync -av "${LIBS_DIR_REAL}/${1}/lib/${TYPE}/" ${X_LIBS} + fi + if [[ -e "${LIBS_DIR_REAL}/${1}/include/" ]]; then + rsync -av "${LIBS_DIR_REAL}/${1}/include/" ${X_INCLUDE} + fi + if [[ -e "${LIBS_DIR_REAL}/${1}/license/" ]]; then + rsync -av "${LIBS_DIR_REAL}/${1}/license/" ${X_LICENSE} + fi + fi + exit 0; + fi + + if ((BASH_VERSINFO[0] < 4)); then + echo "The current version of Bash does not support associative arrays." + echo "Please update to Bash 4.0 or newer. Current:${BASH_VERSINFO[0]}" + echo "brew install bash" + exit 1 + fi + + declare -A ARCH_PAIRS=( + ["MAC"]="MAC_ARM64" + ["MAC_CATALYST"]="MAC_CATALYST_ARM64" + ["SIMULATOR64"]="SIMULATORARM64" + ["SIMULATOR_TVOS"]="SIMULATORARM64_TVOS" + ["TVOS"]="TVOS" # Note: If TVOS doesn't have a pair, it's listed for consistency + ["WATCHOS"]="WATCHOS" # Same note as TVOS + ["SIMULATORARM64_WATCHOS"]="SIMULATOR_WATCHOS" + ["OS64"]="OS64" + ["WATCHOS"]="WATCHOS" + ["VISIONOS"]="VISIONOS" # And again, for VISIONOS + ["SIMULATOR64_VISIONOS"]="SIMULATOR_VISIONOS" + ) + # this gets a bit advanced bash so need Bash 4 - brew install bash if issues arrise... hectic problems + PLATFORM_TYPES=("ios" "osx" "tvos" "catos" "xros" "watchos" ) + declare -a merged_dirs=() + VERSION="" + LIB_NAME="" + CURRENT_TYPE=$TYPE + BINARY_NAME="" + XCFRAMEWORK_PATH="${LIBS_DIR_REAL}/${1}/lib/${TYPE_OUT}/$1.xcframework" + declare -a merged_dirs=() + LIB_NAME="" + for CURRENT_TYPE in "${PLATFORM_TYPES[@]}"; do + if [ -d "$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE" ]; then + echo "Processing platform type: $CURRENT_TYPE" + for X_ARCH in "${!ARCH_PAIRS[@]}"; do + PAIR="${ARCH_PAIRS[$X_ARCH]}" + DIR_PATH="$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/$X_ARCH/" + if [ -d "$DIR_PATH" ]; then + echo "Processing ARCH: $X_ARCH" + MERGED_DIR="$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/MERGE_${X_ARCH}_${PAIR}" + declare -a archive_paths=() + while IFS= read -r -d $'\0' file; do + archive_paths+=("$file") + done < <(find "$DIR_PATH" \( -name "*.a" -o -name "*.xarchive" \) -print0) + + for path in "${archive_paths[@]}"; do + echo "Archive path: $path" + done + + PKL_PATH=$(find "$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE" -type f -name "*.pkl" | head -n 1) + if [[ -f "$PKL_PATH" ]]; then + echo "Found PKL file at $PKL_PATH" + VERSION=$(grep 'version =' "$PKL_PATH" | cut -d '"' -f 2 | xargs) + echo "VERSION $VERSION" + LIB_NAME=$(grep 'name =' "$PKL_PATH" | cut -d '"' -f 2 | xargs) + BUILD_TIME=$(grep 'buildTime =' "$PKL_PATH" | cut -d '"' -f 2 | xargs) + if [[ -z "$VERSION" ]]; then + echo "No version info found in PKL file. Using default." + VERSION="default_version" + fi + else + echo "No PKL file found at $1 - $CURRENT_TYPE. Ensure .pkl files are present and correctly named." + fi + + num_archive_paths=${#archive_paths[@]} + for ARCH_FILE in "${archive_paths[@]}"; do + echo "ARCH_FILE: $ARCH_FILE $1 - $CURRENT_TYPE" + PAIR_FILE="${ARCH_FILE/$X_ARCH/$PAIR}" + EXTENSION="${ARCH_FILE##*.}" # Get file extension (.a or .xarchive) + path_found_in_array=false + + if [[ -f "$PAIR_FILE" && "$X_ARCH" != "$PAIR" ]]; then + mkdir -p "$MERGED_DIR" + echo "MERGED_DIR: $X_ARCH - Pair: $PAIR" + PATH_MERGE="$MERGED_DIR" + MERGED_PATH="$MERGED_DIR/$(basename "$ARCH_FILE" .$EXTENSION).$EXTENSION" + + # Handle merging based on file type + if [[ "$EXTENSION" == "a" ]]; then + # Use lipo to merge .a files + xcrun lipo -create "$ARCH_FILE" "$PAIR_FILE" -output "$MERGED_PATH" + echo "Merged $ARCH_FILE and $PAIR_FILE into $MERGED_PATH" + elif [[ "$EXTENSION" == "xarchive" ]]; then + # Use xcodebuild to merge .xarchive files + xcrun xcodebuild -create-xcframework \ + -archive "$ARCH_FILE" \ + -archive "$PAIR_FILE" \ + -output "$MERGED_PATH" + echo "Merged $ARCH_FILE and $PAIR_FILE into $MERGED_PATH (XCFramework)" + fi + + for dir in "${merged_dirs[@]}"; do + if [[ "$dir" == "$PATH_MERGE" ]]; then + path_found_in_array=true + break + fi + done + if [[ $path_found_in_array == false ]]; then + merged_dirs+=("$PATH_MERGE") + echo "path_found_in_array == false adding $PATH_MERGE" + else + echo "path_found_in_array == true" + fi + else + PATH_MERGE="$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/${X_ARCH}/" + MERGED_PATH="$PATH_MERGE/$(basename "$ARCH_FILE" .$EXTENSION).$EXTENSION" + if [[ "$num_archive_paths" -gt 1 ]]; then + for dir in "${merged_dirs[@]}"; do + if [[ "$dir" == "$PATH_MERGE" ]]; then + path_found_in_array=true + break + fi + done + if [[ $path_found_in_array == false ]]; then + merged_dirs+=("$PATH_MERGE") + fi + else + if [[ ! "$xcframework_flags" =~ "$MERGED_PATH" ]]; then + xcframework_flags+=" -library $MERGED_PATH" + xcframework_flags+=" -headers $LIBS_DIR_REAL/$1/include" + fi + fi + fi + done + fi + done + else + echoVerbose "Platform type directory does not exist: $LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE" + fi + done + + + # Final merging pass to combine binaries of the same or merged architectures into a single binary or XCFramework to prevent linking issues + for dir in "${merged_dirs[@]}"; do + echo "Processing directory: $dir" + + # Find all .a and .xarchive files in the directory + files=($(find "$dir" \( -name '*.a' -o -name '*.xarchive' \) -print0 | xargs -0)) + echo "[$dir] - Found archives: ${#files[@]}" + + num_files=${#files[@]} + if [ "$num_files" -gt 1 ]; then + echo "Multiple archives found in $dir. Commencing the merge..." + + # Separate .a and .xarchive files into their own arrays + declare -a a_files=() + declare -a xarchive_files=() + for file in "${files[@]}"; do + if [[ "${file##*.}" == "a" ]]; then + a_files+=("$file") + elif [[ "${file##*.}" == "xarchive" ]]; then + xarchive_files+=("$file") + fi + done + + # Merge all .a files into a single static library + if [ "${#a_files[@]}" -gt 1 ]; then + libtool -static -o "${dir}/${1}.a" "${a_files[@]}" + echo "Merged .a files into ${dir}/${1}.a" + # Clean up individual .a files after merging + for a_file in "${a_files[@]}"; do + rm -f "$a_file" + done + lipo -info "${dir}/${1}.a" + # Add to xcframework flags + if [[ ! "$xcframework_flags" =~ "${dir}/${1}.a" ]]; then + xcframework_flags+=" -library ${dir}/${1}.a" + xcframework_flags+=" -headers $LIBS_DIR_REAL/$1/include" + fi + elif [ "${#a_files[@]}" -eq 1 ]; then + echo "Single .a file detected, using directly: ${a_files[0]}" + xcframework_flags+=" -library ${a_files[0]}" + xcframework_flags+=" -headers $LIBS_DIR_REAL/$1/include" + fi + + # Merge all .xarchive files into a single XCFramework + if [ "${#xarchive_files[@]}" -gt 1 ]; then + xcodebuild -create-xcframework -output "${dir}/${1}.xcframework" \ + $(for xfile in "${xarchive_files[@]}"; do echo "-archive $xfile"; done) + echo "Merged .xarchive files into ${dir}/${1}.xcframework" + # Clean up individual .xarchive files after merging + for xarchive_file in "${xarchive_files[@]}"; do + rm -f "$xarchive_file" + done + # Add to xcframework flags + if [[ ! "$xcframework_flags" =~ "${dir}/${1}.xcframework" ]]; then + xcframework_flags+=" -library ${dir}/${1}.xcframework" + xcframework_flags+=" -headers $LIBS_DIR_REAL/$1/include" + fi + elif [ "${#xarchive_files[@]}" -eq 1 ]; then + echo "Single .xarchive file detected, using directly: ${xarchive_files[0]}" + xcframework_flags+=" -library ${xarchive_files[0]}" + xcframework_flags+=" -headers $LIBS_DIR_REAL/$1/include" + fi + elif [ "$num_files" -eq 1 ]; then + # Directly use the single archive if only one is present + single_file="${files[0]}" + echo "Directly using the single archive ${single_file}" + if [[ "${single_file##*.}" == "a" ]]; then + xcframework_flags+=" -library ${single_file}" + elif [[ "${single_file##*.}" == "xarchive" ]]; then + xcframework_flags+=" -library ${single_file}" + fi + xcframework_flags+=" -headers $LIBS_DIR_REAL/$1/include" + else + echo "No archives found in $dir. Skipping." + fi + done + + + + + echoSuccess " flags: [\"$1\" \"$xcframework_flags\"]" + HERE_DIR=$(cd $(dirname "./"); pwd -P) + + + + + XCFRAMEWORK_PATH="${XLIBS_DIR_REAL}/${1}/lib/${TYPE_OUT}/$1.xcframework" + cd "${XLIBS_DIR_REAL}/${1}/lib/${TYPE_OUT}/" + xcodebuild -create-xcframework $xcframework_flags -output $1.xcframework + echoSuccess " xcframework for $TYPE built successfully." + echo "========================" + + cd $HERE_DIR + + + + + # Loop over each .a file found within the xcframework + find "$XCFRAMEWORK_PATH" -type f -name "*.a" | while read -r lib_a; do + echo "Securing $lib_a..." + lipo -info "$lib_a" + #xcrun codesign --sign - "$lib_a" || true + . "$SECURE_SCRIPT" + secure "$lib_a" "$LIB_NAME" "$VERSION" + done + + echoSuccess " xcframework for [$TYPE] transferring to [$XDIR]" + if ! command -v rsync &> /dev/null; then + cp -av "${XCFRAMEWORK_PATH}/"* ${X_LIBS} + cp -av "${LIBS_DIR_REAL}/${1}/include/"* ${X_INCLUDE} + cp -av "${LIBS_DIR_REAL}/${1}/license/"* ${X_LICENSE} + else + rsync -av "${XCFRAMEWORK_PATH}" ${X_LIBS} + rsync -av "${LIBS_DIR_REAL}/${1}/include/" ${X_INCLUDE} + rsync -av "${LIBS_DIR_REAL}/${1}/license/" ${X_LICENSE} + fi + + echo " -- cleanup merged libraries ..." + for dir in "${merged_dirs[@]}"; do + echo " removing directory: [$dir]" + rm -rfv "${dir}" + done + + # rm -rfv "${XCFRAMEWORK_PATH}" + + + echoSuccess " xcframework for $TYPE built successfully." + # echo "========================" + # echo "=========DANGER ZONE DELETE ALL BINARIES EXCEPT XCFRAMEWORK ===============" + # dirs=$(find . -mindepth 1 -maxdepth 1 -type d) + # for dir in $dirs; do + # if [[ ! "$dir" =~ .*.xcframework$ ]]; then + # echo "Removing directory: $dir" + # rm -rf "$dir" + # fi + # done + echo "========================" + cd $HERE_DIR + fi } function xframeworkFormula() { - export X_TYPE=macos - export LIBS_DIR_REAL=$(realpath $LIBS_DIR) - - echoStart " xframeworkFormula [\"$1\"] for:[${X_TYPE}]" - - XLIBSLOCAL="$APOTHECARY_DIR/../xout" - if [[ ! -e "$XLIBSLOCAL" ]]; then - mkdir -p $XLIBSLOCAL - fi - export XLIBS_DIR_REAL=$(realpath $XLIBSLOCAL) - - export PLATFORM_TYPES=("ios" "osx" "catos" "xros" "tvos" "watchos") - VERSION="" - DEFINES="" - mkdir -p ${LIBS_DIR_REAL}/${1}/lib/${X_TYPE} - - if [ ! -e "$LIBS_DIR/$1" ] ; then - echoVerbose " Nothing to create framework from to merge in lib dest dir: \"$1\"" - elif [[ "$1" =~ ^(kiss|portaudio|pkg-config|videoInput)$ ]]; then - echoVerbose " No need to create framework for: \"$1\"" - else - # rm -rf $LIBS_DIR_REAL/$1/lib/$TYPE/*.xcframework - - echoSuccess " Framework lib dest dir: \"$1\" \"$LIBS_DIR_REAL/$1/lib/$X_TYPE/\" " - xcframework_flags="" - - XDIR="${XLIBS_DIR_REAL}/" - X_LIBS="${XDIR}/${1}/lib/${X_TYPE}/" - X_INCLUDE=${XDIR}/${1}/include - X_LICENSE=${XDIR}/${1}/license - - mkdir -p "${X_INCLUDE}" - mkdir -p "${X_LICENSE}" - - mkdir -p "${X_LIBS}" - if [[ $TYPE == "macos" ]]; then - echoSuccess "Building macOS xcframework" - fi - - if [[ $1 == "fmod" ]] || [[ $1 == "fmodex" ]]; then - X_TYPE=osx - fi - - if [[ $1 == "fmod" ]] || [[ $1 == "fmodex" ]] || [[ $1 == "glm" ]] || [[ $1 == "json" ]] || [[ $1 == "utf8" ]]; then - if ! command -v rsync &> /dev/null; then - if [[ -e "${LIBS_DIR_REAL}/${1}/lib/${X_TYPE}/" ]]; then - mkdir -p "${X_LIBS}" - cp -av "${LIBS_DIR_REAL}/${1}/lib/${X_TYPE}/"* ${X_LIBS} - fi - if [[ -e "${LIBS_DIR_REAL}/${1}/include/" ]]; then - cp -av "${LIBS_DIR_REAL}/${1}/include/"* ${X_INCLUDE} - fi - if [[ -e "${LIBS_DIR_REAL}/${1}/license/" ]]; then - cp -av "${LIBS_DIR_REAL}/${1}/license/"* ${X_LICENSE} - fi - else - if [[ -e "${LIBS_DIR_REAL}/${1}/lib/${X_TYPE}" ]]; then - echo "Copying from ${LIBS_DIR_REAL}/${1}/lib/${X_TYPE}/ to ${X_LIBS}" - mkdir -p "${X_LIBS}" - rsync -av "${LIBS_DIR_REAL}/${1}/lib/${X_TYPE}/" ${X_LIBS} - fi - if [[ -e "${LIBS_DIR_REAL}/${1}/include/" ]]; then - rsync -av "${LIBS_DIR_REAL}/${1}/include/" ${X_INCLUDE} - fi - if [[ -e "${LIBS_DIR_REAL}/${1}/license/" ]]; then - rsync -av "${LIBS_DIR_REAL}/${1}/license/" ${X_LICENSE} - fi - fi - exit 0; - fi - - - XCFRAMEWORK_PATH="${LIBS_DIR_REAL}/${1}/lib/${X_TYPE}/$1.xcframework" - - rm -rfv "${XCFRAMEWORK_PATH}" - - if ((BASH_VERSINFO[0] < 4)); then - echo "The current version of Bash does not support associative arrays." - echo "Please update to Bash 4.0 or newer. Current:${BASH_VERSINFO[0]}" - echo "brew install bash" - exit 1 - fi - - declare -A ARCH_PAIRS=( - ["MAC"]="MAC_ARM64" - ["MAC_CATALYST"]="MAC_CATALYST_ARM64" - ["SIMULATOR64"]="SIMULATORARM64" - ["SIMULATOR_TVOS"]="SIMULATORARM64_TVOS" - ["TVOS"]="TVOS" # Note: If TVOS doesn't have a pair, it's listed for consistency - ["WATCHOS"]="WATCHOS" # Same note as TVOS - ["SIMULATORARM64_WATCHOS"]="SIMULATOR_WATCHOS" - ["OS64"]="OS64" - ["WATCHOS"]="WATCHOS" - ["VISIONOS"]="VISIONOS" # And again, for VISIONOS - ["SIMULATOR64_VISIONOS"]="SIMULATOR_VISIONOS" - ) - # this gets a bit advanced bash so need Bash 4 - brew install bash if issues arrise... hectic problems - declare -a merged_dirs=() - LIB_NAME="" - for CURRENT_TYPE in "${PLATFORM_TYPES[@]}"; do - if [ -d "$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE" ]; then - echo "Processing platform type: $CURRENT_TYPE" - for X_ARCH in "${!ARCH_PAIRS[@]}"; do - PAIR="${ARCH_PAIRS[$X_ARCH]}" - DIR_PATH="$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/$X_ARCH/" - if [ -d "$DIR_PATH" ]; then - echo "Processing ARCH: $X_ARCH" - MERGED_DIR="$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/MERGE_${X_ARCH}_${PAIR}" - declare -a archive_paths=() - while IFS= read -r -d $'\0' file; do - archive_paths+=("$file") - done < <(find "$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/$X_ARCH/" -name "*.a" -print0) - for path in "${archive_paths[@]}"; do - echo "Archive path: $path" - done - PKL_PATH=$(find "$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE" -type f -name "*.pkl" | head -n 1) - if [[ -f "$PKL_PATH" ]]; then - echo "Found PKL file at $PKL_PATH" - VERSION=$(grep 'version =' "$PKL_PATH" | cut -d '"' -f 2 | xargs) # Use xargs to trim whitespace - echo "VERSION $VERSION" - # DEFINES=$(grep 'defines =' "$PKL_PATH" | cut -d '"' -f 2 | xargs) # Use xargs to trim whitespace - # echo "DEFINES $DEFINES" - LIB_NAME=$(grep 'name =' "$PKL_PATH" | cut -d '"' -f 2 | xargs) # Use xargs to trim whitespace - BUILD_TIME=$(grep 'buildTime =' "$PKL_PATH" | cut -d '"' -f 2 | xargs) # Use xargs to trim whitespace - if [[ -z "$VERSION" ]]; then - echo "No version info found in PKL file. Using default." - VERSION="default_version" # Provide a default version or handle error - fi - # if [[ -z "$DEFINES" ]]; then - # echo "No defines info found in PKL file. Continuing without defines." - # # Handle missing defines case or provide default - # fi - else - echo "No PKL file found at $1 - $CURRENT_TYPE. Ensure .pkl files are present and correctly named." - # Handle error or provide defaults for VERSION and DEFINES - fi - num_archive_paths=${#archive_paths[@]} - for ARCH_FILE in "${archive_paths[@]}"; do - echo "ARCH_FILE: $ARCH_FILE $1 - $CURRENT_TYPE" - # Determine paired architecture directory - PAIR_FILE="${ARCH_FILE/$X_ARCH/$PAIR}" - path_found_in_array=false - if [[ -f "$PAIR_FILE" && "$X_ARCH" != "$PAIR" ]]; then - mkdir -p "$MERGED_DIR" - echo "MERGED_DIR: $X_ARCH - Pair: $PAIR" - # Determine the output filename in the merged directory - PATH_MERGE=$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/MERGE_${X_ARCH}_${PAIR}/ - mkdir -p "$PATH_MERGE" - MERGED_PATH="$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/MERGE_${X_ARCH}_${PAIR}/$(basename "$ARCH_FILE" .a).a" - # Use lipo to merge the architectures into a single file - prevents linking errors - xcrun lipo -create "$ARCH_FILE" "$PAIR_FILE" -output "$MERGED_PATH" - echo "Merged $ARCH_FILE and $PAIR_FILE into [$MERGED_PATH]" - #xcrun codesign --sign - $MERGED_PATH || true - for dir in "${merged_dirs[@]}"; do - if [[ "$dir" == "$PATH_MERGE" ]]; then - path_found_in_array=true - echo "dir${dir}==PATH_MERGE${PATH_MERGE} path_found_in_array == true not adding for $PAIR_FILE" - break - fi - done - if [[ $path_found_in_array == false ]]; then - merged_dirs+=("$PATH_MERGE") - echo "path_found_in_array == false adding $PATH_MERGE" - else - echo "path_found_in_array == true - not adding for $PAIR_FILE" - fi - else - PATH_MERGE=$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/${X_ARCH}/ - MERGED_PATH="$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/${X_ARCH}/$(basename "$ARCH_FILE" .a).a" - #xcrun codesign --sign - $MERGED_PATH || true - if [[ "$num_archive_paths" -gt 1 ]]; then - for dir in "${merged_dirs[@]}"; do - if [[ "$dir" == "$PATH_MERGE" ]]; then - path_found_in_array=true - break - fi - done - if [[ $path_found_in_array == false ]]; then - merged_dirs+=("$PATH_MERGE") - fi - else - if [[ ! "$xcframework_flags" =~ "$MERGED_PATH" ]]; then - xcframework_flags+=" -library $MERGED_PATH" - xcframework_flags+=" -headers $LIBS_DIR_REAL/$1/include" - fi - fi - fi - done - fi - done - else - echoVerbose "Platform type directory does not exist: $LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE" - fi - done - - # Final merging pass to combine binaries of same / merged architectures into single binary to prevent linking issues - echo "merged_dirs:" - for dir in "${merged_dirs[@]}"; do - echo "Processing directory: $dir" - - # Find all .a files in the directory - a_files=($(find "$dir" -name '*.a' -print0 | xargs -0)) - echo "[$dir] - Found archives: ${#a_files[@]}" - - num_files=${#a_files[@]} - if [ "$num_files" -gt 1 ]; then - echo "Multiple archives found in $dir. Commencing the merge..." - libtool -static -o "${dir}/${1}.a" "${a_files[@]}" - echo "Merged into ${dir}/${1}.a" - for a_file in "${a_files[@]}"; do - rm -f "$a_file" - done - lipo -info "${dir}/${1}.a" - #xcrun codesign --sign - "${dir}/${1}.a" || true - if [[ ! "$xcframework_flags" =~ "${dir}/${1}.a" ]]; then - xcframework_flags+=" -library ${dir}/${1}.a" - xcframework_flags+=" -headers $LIBS_DIR_REAL/$1/include" - fi - elif [ "$num_files" -gt 0 ]; then - # Directly use the single archive - echo "Directly use the single archive ${a_files[0]}" - xcframework_flags+=" -library ${a_files[0]}" - xcframework_flags+=" -headers $LIBS_DIR_REAL/$1/include" - else - echo "No archives found. Skip for [$dir]" - fi - done - - echoSuccess " flags: \"$1\" \"$xcframework_flags\" " - HERE_DIR=$(cd $(dirname "./"); pwd -P) - cd "${LIBS_DIR_REAL}/${1}/lib/${X_TYPE}/" - xcodebuild -create-xcframework $xcframework_flags -output $1.xcframework - echoSuccess " xcframework for $TYPE built successfully." - echo "========================" - - cd $HERE_DIR - - # Loop over each .a file found within the xcframework - find "$XCFRAMEWORK_PATH" -type f -name "*.a" | while read -r lib_a; do - echo "Securing $lib_a..." - lipo -info "$lib_a" - #xcrun codesign --sign - "$lib_a" || true - . "$SECURE_SCRIPT" - secure "$lib_a" "$LIB_NAME" "$VERSION" - done - - echo " -- deploy to xcframework [$X_LIBS]..." - if ! command -v rsync &> /dev/null; then - cp -av "${XCFRAMEWORK_PATH}/"* ${X_LIBS} - cp -av "${LIBS_DIR_REAL}/${1}/include/"* ${X_INCLUDE} - cp -av "${LIBS_DIR_REAL}/${1}/license/"* ${X_LICENSE} - else - rsync -av "${XCFRAMEWORK_PATH}" ${X_LIBS} - rsync -av "${LIBS_DIR_REAL}/${1}/include/" ${X_INCLUDE} - rsync -av "${LIBS_DIR_REAL}/${1}/license/" ${X_LICENSE} - fi - - echo " -- cleanup merged libraries ..." - for dir in "${merged_dirs[@]}"; do - echo " removing directory: [$dir]" - rm -rfv "${dir}" - done - - rm -rfv "${XCFRAMEWORK_PATH}" - - # codesign --timestamp -s $XCFRAMEWORK_PATH - # for PLATFORM in "${PLATFORM_TYPES[@]}"; do - # PLATFORM_DIR="${LIBS_DIR_REAL}/${1}/lib/$PLATFORM" - # echo "Cleaning up $PLATFORM platform type..." - # if [ -d "$PLATFORM_DIR" ]; then - # dirs_to_clean=$(find "${LIBS_DIR_REAL}/${1}/lib/$PLATFORM/" -mindepth 1 -maxdepth 1 -type d ! -name "*.xcframework") - # for dir in $dirs_to_clean; do - # echo "Removing directory: $dir" - # rm -rf "$dir" - # done - # rm -rf "$PLATFORM_DIR" - # fi - # done - fi + export X_TYPE=macos + export LIBS_DIR_REAL=$(realpath $LIBS_DIR) + + echoStart " xframeworkFormula [\"$1\"] for:[${X_TYPE}]" + + XLIBSLOCAL="$APOTHECARY_DIR/../xout" + if [[ ! -e "$XLIBSLOCAL" ]]; then + mkdir -p $XLIBSLOCAL + fi + export XLIBS_DIR_REAL=$(realpath $XLIBSLOCAL) + + export PLATFORM_TYPES=("ios" "osx" "catos" "xros" "tvos" "watchos") + VERSION="" + DEFINES="" + mkdir -p ${LIBS_DIR_REAL}/${1}/lib/${X_TYPE} + + if [ ! -e "$LIBS_DIR/$1" ] ; then + echoVerbose " Nothing to create framework from to merge in lib dest dir: \"$1\"" + elif [[ "$1" =~ ^(kiss|portaudio|pkg-config|videoInput)$ ]]; then + echoVerbose " No need to create framework for: \"$1\"" + else + # rm -rf $LIBS_DIR_REAL/$1/lib/$TYPE/*.xcframework + + echoSuccess " Framework lib dest dir: \"$1\" \"$LIBS_DIR_REAL/$1/lib/$X_TYPE/\" " + xcframework_flags="" + + XDIR="${XLIBS_DIR_REAL}/" + X_LIBS="${XDIR}/${1}/lib/${X_TYPE}/" + X_INCLUDE=${XDIR}/${1}/include + X_LICENSE=${XDIR}/${1}/license + + mkdir -p "${X_INCLUDE}" + mkdir -p "${X_LICENSE}" + + mkdir -p "${X_LIBS}" + if [[ $TYPE == "macos" ]]; then + echoSuccess "Building macOS xcframework" + fi + + if [[ $1 == "fmod" ]] || [[ $1 == "fmodex" ]]; then + X_TYPE=osx + fi + + if [[ $1 == "fmod" ]] || [[ $1 == "fmodex" ]] || [[ $1 == "glm" ]] || [[ $1 == "json" ]] || [[ $1 == "utf8" ]]; then + if ! command -v rsync &> /dev/null; then + if [[ -e "${LIBS_DIR_REAL}/${1}/lib/${X_TYPE}/" ]]; then + mkdir -p "${X_LIBS}" + cp -av "${LIBS_DIR_REAL}/${1}/lib/${X_TYPE}/"* ${X_LIBS} + fi + if [[ -e "${LIBS_DIR_REAL}/${1}/include/" ]]; then + cp -av "${LIBS_DIR_REAL}/${1}/include/"* ${X_INCLUDE} + fi + if [[ -e "${LIBS_DIR_REAL}/${1}/license/" ]]; then + cp -av "${LIBS_DIR_REAL}/${1}/license/"* ${X_LICENSE} + fi + else + if [[ -e "${LIBS_DIR_REAL}/${1}/lib/${X_TYPE}" ]]; then + echo "Copying from ${LIBS_DIR_REAL}/${1}/lib/${X_TYPE}/ to ${X_LIBS}" + mkdir -p "${X_LIBS}" + rsync -av "${LIBS_DIR_REAL}/${1}/lib/${X_TYPE}/" ${X_LIBS} + fi + if [[ -e "${LIBS_DIR_REAL}/${1}/include/" ]]; then + rsync -av "${LIBS_DIR_REAL}/${1}/include/" ${X_INCLUDE} + fi + if [[ -e "${LIBS_DIR_REAL}/${1}/license/" ]]; then + rsync -av "${LIBS_DIR_REAL}/${1}/license/" ${X_LICENSE} + fi + fi + exit 0; + fi + + + XCFRAMEWORK_PATH="${LIBS_DIR_REAL}/${1}/lib/${X_TYPE}/$1.xcframework" + + rm -rfv "${XCFRAMEWORK_PATH}" + + if ((BASH_VERSINFO[0] < 4)); then + echo "The current version of Bash does not support associative arrays." + echo "Please update to Bash 4.0 or newer. Current:${BASH_VERSINFO[0]}" + echo "brew install bash" + exit 1 + fi + + declare -A ARCH_PAIRS=( + ["MAC"]="MAC_ARM64" + ["MAC_CATALYST"]="MAC_CATALYST_ARM64" + ["SIMULATOR64"]="SIMULATORARM64" + ["SIMULATOR_TVOS"]="SIMULATORARM64_TVOS" + ["TVOS"]="TVOS" # Note: If TVOS doesn't have a pair, it's listed for consistency + ["WATCHOS"]="WATCHOS" # Same note as TVOS + ["SIMULATORARM64_WATCHOS"]="SIMULATOR_WATCHOS" + ["OS64"]="OS64" + ["WATCHOS"]="WATCHOS" + ["VISIONOS"]="VISIONOS" # And again, for VISIONOS + ["SIMULATOR64_VISIONOS"]="SIMULATOR_VISIONOS" + ) + # this gets a bit advanced bash so need Bash 4 - brew install bash if issues arrise... hectic problems + declare -a merged_dirs=() + LIB_NAME="" + for CURRENT_TYPE in "${PLATFORM_TYPES[@]}"; do + if [ -d "$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE" ]; then + echo "Processing platform type: $CURRENT_TYPE" + for X_ARCH in "${!ARCH_PAIRS[@]}"; do + PAIR="${ARCH_PAIRS[$X_ARCH]}" + DIR_PATH="$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/$X_ARCH/" + if [ -d "$DIR_PATH" ]; then + echo "Processing ARCH: $X_ARCH" + MERGED_DIR="$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/MERGE_${X_ARCH}_${PAIR}" + declare -a archive_paths=() + while IFS= read -r -d $'\0' file; do + archive_paths+=("$file") + done < <(find "$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/$X_ARCH/" -name "*.a" -print0) + for path in "${archive_paths[@]}"; do + echo "Archive path: $path" + done + PKL_PATH=$(find "$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE" -type f -name "*.pkl" | head -n 1) + if [[ -f "$PKL_PATH" ]]; then + echo "Found PKL file at $PKL_PATH" + VERSION=$(grep 'version =' "$PKL_PATH" | cut -d '"' -f 2 | xargs) # Use xargs to trim whitespace + echo "VERSION $VERSION" + # DEFINES=$(grep 'defines =' "$PKL_PATH" | cut -d '"' -f 2 | xargs) # Use xargs to trim whitespace + # echo "DEFINES $DEFINES" + LIB_NAME=$(grep 'name =' "$PKL_PATH" | cut -d '"' -f 2 | xargs) # Use xargs to trim whitespace + BUILD_TIME=$(grep 'buildTime =' "$PKL_PATH" | cut -d '"' -f 2 | xargs) # Use xargs to trim whitespace + if [[ -z "$VERSION" ]]; then + echo "No version info found in PKL file. Using default." + VERSION="default_version" # Provide a default version or handle error + fi + # if [[ -z "$DEFINES" ]]; then + # echo "No defines info found in PKL file. Continuing without defines." + # # Handle missing defines case or provide default + # fi + else + echo "No PKL file found at $1 - $CURRENT_TYPE. Ensure .pkl files are present and correctly named." + # Handle error or provide defaults for VERSION and DEFINES + fi + num_archive_paths=${#archive_paths[@]} + for ARCH_FILE in "${archive_paths[@]}"; do + echo "ARCH_FILE: $ARCH_FILE $1 - $CURRENT_TYPE" + # Determine paired architecture directory + PAIR_FILE="${ARCH_FILE/$X_ARCH/$PAIR}" + path_found_in_array=false + if [[ -f "$PAIR_FILE" && "$X_ARCH" != "$PAIR" ]]; then + mkdir -p "$MERGED_DIR" + echo "MERGED_DIR: $X_ARCH - Pair: $PAIR" + # Determine the output filename in the merged directory + PATH_MERGE=$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/MERGE_${X_ARCH}_${PAIR}/ + mkdir -p "$PATH_MERGE" + MERGED_PATH="$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/MERGE_${X_ARCH}_${PAIR}/$(basename "$ARCH_FILE" .a).a" + # Use lipo to merge the architectures into a single file - prevents linking errors + xcrun lipo -create "$ARCH_FILE" "$PAIR_FILE" -output "$MERGED_PATH" + echo "Merged $ARCH_FILE and $PAIR_FILE into [$MERGED_PATH]" + #xcrun codesign --sign - $MERGED_PATH || true + for dir in "${merged_dirs[@]}"; do + if [[ "$dir" == "$PATH_MERGE" ]]; then + path_found_in_array=true + echo "dir${dir}==PATH_MERGE${PATH_MERGE} path_found_in_array == true not adding for $PAIR_FILE" + break + fi + done + if [[ $path_found_in_array == false ]]; then + merged_dirs+=("$PATH_MERGE") + echo "path_found_in_array == false adding $PATH_MERGE" + else + echo "path_found_in_array == true - not adding for $PAIR_FILE" + fi + else + PATH_MERGE=$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/${X_ARCH}/ + MERGED_PATH="$LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE/${X_ARCH}/$(basename "$ARCH_FILE" .a).a" + #xcrun codesign --sign - $MERGED_PATH || true + if [[ "$num_archive_paths" -gt 1 ]]; then + for dir in "${merged_dirs[@]}"; do + if [[ "$dir" == "$PATH_MERGE" ]]; then + path_found_in_array=true + break + fi + done + if [[ $path_found_in_array == false ]]; then + merged_dirs+=("$PATH_MERGE") + fi + else + if [[ ! "$xcframework_flags" =~ "$MERGED_PATH" ]]; then + xcframework_flags+=" -library $MERGED_PATH" + xcframework_flags+=" -headers $LIBS_DIR_REAL/$1/include" + fi + fi + fi + done + fi + done + else + echoVerbose "Platform type directory does not exist: $LIBS_DIR_REAL/$1/lib/$CURRENT_TYPE" + fi + done + + # Final merging pass to combine binaries of same / merged architectures into single binary to prevent linking issues + echo "merged_dirs:" + for dir in "${merged_dirs[@]}"; do + echo "Processing directory: $dir" + + # Find all .a files in the directory + a_files=($(find "$dir" -name '*.a' -print0 | xargs -0)) + echo "[$dir] - Found archives: ${#a_files[@]}" + + num_files=${#a_files[@]} + if [ "$num_files" -gt 1 ]; then + echo "Multiple archives found in $dir. Commencing the merge..." + libtool -static -o "${dir}/${1}.a" "${a_files[@]}" + echo "Merged into ${dir}/${1}.a" + for a_file in "${a_files[@]}"; do + rm -f "$a_file" + done + lipo -info "${dir}/${1}.a" + #xcrun codesign --sign - "${dir}/${1}.a" || true + if [[ ! "$xcframework_flags" =~ "${dir}/${1}.a" ]]; then + xcframework_flags+=" -library ${dir}/${1}.a" + xcframework_flags+=" -headers $LIBS_DIR_REAL/$1/include" + fi + elif [ "$num_files" -gt 0 ]; then + # Directly use the single archive + echo "Directly use the single archive ${a_files[0]}" + xcframework_flags+=" -library ${a_files[0]}" + xcframework_flags+=" -headers $LIBS_DIR_REAL/$1/include" + else + echo "No archives found. Skip for [$dir]" + fi + done + + echoSuccess " flags: \"$1\" \"$xcframework_flags\" " + HERE_DIR=$(cd $(dirname "./"); pwd -P) + cd "${LIBS_DIR_REAL}/${1}/lib/${X_TYPE}/" + xcodebuild -create-xcframework $xcframework_flags -output $1.xcframework + echoSuccess " xcframework for $TYPE built successfully." + echo "========================" + + cd $HERE_DIR + + # Loop over each .a file found within the xcframework + find "$XCFRAMEWORK_PATH" -type f -name "*.a" | while read -r lib_a; do + echo "Securing $lib_a..." + lipo -info "$lib_a" + #xcrun codesign --sign - "$lib_a" || true + . "$SECURE_SCRIPT" + secure "$lib_a" "$LIB_NAME" "$VERSION" + done + + echo " -- deploy to xcframework [$X_LIBS]..." + if ! command -v rsync &> /dev/null; then + cp -av "${XCFRAMEWORK_PATH}/"* ${X_LIBS} + cp -av "${LIBS_DIR_REAL}/${1}/include/"* ${X_INCLUDE} + cp -av "${LIBS_DIR_REAL}/${1}/license/"* ${X_LICENSE} + else + rsync -av "${XCFRAMEWORK_PATH}" ${X_LIBS} + rsync -av "${LIBS_DIR_REAL}/${1}/include/" ${X_INCLUDE} + rsync -av "${LIBS_DIR_REAL}/${1}/license/" ${X_LICENSE} + fi + + echo " -- cleanup merged libraries ..." + for dir in "${merged_dirs[@]}"; do + echo " removing directory: [$dir]" + rm -rfv "${dir}" + done + + rm -rfv "${XCFRAMEWORK_PATH}" + + # codesign --timestamp -s $XCFRAMEWORK_PATH + # for PLATFORM in "${PLATFORM_TYPES[@]}"; do + # PLATFORM_DIR="${LIBS_DIR_REAL}/${1}/lib/$PLATFORM" + # echo "Cleaning up $PLATFORM platform type..." + # if [ -d "$PLATFORM_DIR" ]; then + # dirs_to_clean=$(find "${LIBS_DIR_REAL}/${1}/lib/$PLATFORM/" -mindepth 1 -maxdepth 1 -type d ! -name "*.xcframework") + # for dir in $dirs_to_clean; do + # echo "Removing directory: $dir" + # rm -rf "$dir" + # done + # rm -rf "$PLATFORM_DIR" + # fi + # done + fi } # remove a given library from the cache function remove() { - echoVerbose " Lib src dir: $BUILD_DIR/$1" - cd $BUILD_DIR - if [ ! -e $1* ] ; then - echoVerbose " Nothing to remove from build cache: \"$1\"" - else - rm -rf $1* - echoSuccess " Removed from build cache: \"$1\"" - fi + echoVerbose " Lib src dir: $BUILD_DIR/$1" + cd $BUILD_DIR + if [ ! -e $1* ] ; then + echoVerbose " Nothing to remove from build cache: \"$1\"" + else + rm -rf $1* + echoSuccess " Removed from build cache: \"$1\"" + fi - # dependencies - apothecaryDependencies remove + # dependencies + apothecaryDependencies remove - cd $APOTHECARY_DIR + cd $APOTHECARY_DIR } # remove a given library from the lib dir function remove-lib() { - echoVerbose " Libs dest dir: $LIBS_DIR" - cd $LIBS_DIR - if [ ! -e $1 ] ; then - echoVerbose " Nothing to remove from lib dest dir: \"$1\"" - else - rm -rf $1 - echoSuccess " Removed from lib dest dir: \"$1\"" - fi + echoVerbose " Libs dest dir: $LIBS_DIR" + cd $LIBS_DIR + if [ ! -e $1 ] ; then + echoVerbose " Nothing to remove from lib dest dir: \"$1\"" + else + rm -rf $1 + echoSuccess " Removed from lib dest dir: \"$1\"" + fi - # dependencies - apothecaryDependencies remove-lib + # dependencies + apothecaryDependencies remove-lib - cd $APOTHECARY_DIR + cd $APOTHECARY_DIR } # remove a given library from the cache and lib dir function remove-all() { - remove $1 - remove-lib $1 + remove $1 + remove-lib $1 } # git-clone a given library function gitclone() { - { - echoVerbose " Try using Git to download" - git clone $2 $1 - cd $1 - if [[ ${SWITCH_VER:+x} ]]; then - echoVerbose " Select a custom version ($SWITCH_VER)" - git checkout $SWITCH_VER - else - git checkout $3 - fi - cd .. - } || { - echoError " Git cloning fails, try default download" - } + { + echoVerbose " Try using Git to download" + git clone $2 $1 + cd $1 + if [[ ${SWITCH_VER:+x} ]]; then + echoVerbose " Select a custom version ($SWITCH_VER)" + git checkout $SWITCH_VER + else + git checkout $3 + fi + cd .. + } || { + echoError " Git cloning fails, try default download" + } } @@ -2264,102 +2351,102 @@ function gitclone() { # http://msdn.microsoft.com/library/vstudio/b20w810z.aspx function vs-build() { - if [ $VS_VER -gt 14 ] ; then - - echo "-- Searching for vs-build" - # vswhere is a utility to find the most recent vs compiler toolchain. it is - # assumed to be installed at a fixed location - if [ $VS_VER == 15 ] ; then - VSWHERE_EXE=`cmd.exe //c "echo %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"` - elif [ $VS_VER == 16 ] ; then - VSWHERE_EXE=`cmd.exe //c "echo %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"` - elif [ $VS_VER -gt 17 ] ; then - VSWHERE_EXE=`cmd.exe //c "echo %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"` - else - VSWHERE_EXE=`cmd.exe //c "echo %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"` - fi - - echo "-- Found vswhere: ${VSWHERE_EXE}" - # vswhere allows us to query the install dir of the ms build tools - VS_INSTALL_PATH=`cmd //c "${VSWHERE_EXE}" -latest -products Microsoft.VisualStudio.Product.${VS_TYPE} -requires Microsoft.VisualStudio.Component.VC.CoreIde -property installationPath` - echo "-- Found vs install path: ${VS_INSTALL_PATH}" - # msbuild is the tool used to build visual studio solutions - MSBUILD_PATH="${VS_INSTALL_PATH}\MSBuild\\${VS_VER}.0\Bin\MSBuild.exe" - echo "-- Found MSBuild path: ${MSBUILD_PATH}" - - # define fallback build selection if vs-build was not called with enough parameters. - - if [ $ARCH == 32 ] ; then - DEFAULT_BUILD="Release|Win32" - elif [ $ARCH == 64 ] ; then - DEFAULT_BUILD="Release|x64" - elif [ $ARCH == "arm" ] ; then - DEFAULT_BUILD="Release|ARM" - elif [ $ARCH == "arm64" ] ; then - DEFAULT_BUILD="Release|ARM64" - elif [ $ARCH == "arm64ec" ] ; then - DEFAULT_BUILD="Release|ARM64EC" - fi - - # Cut part before '|' character of third parameter (which defaults to "Default|x64") and store it as BUILD_CONFIGURATION - BUILD_CONFIGURATION="$( cut -d '|' -f 1 <<< "${3:-$DEFAULT_BUILD}" )" - BUILD_CONFIGURATION=$BUILD_CONFIGURATION - # Cut part after '|' character of third parameter (which defaults to "Default|x64") and store it as VS_BUILD_PLATFORM - VS_BUILD_PLATFORM="$( cut -d '|' -f 2- <<< "${3:-$DEFAULT_BUILD}" )" - VS_BUILD_PLATFORM=$VS_BUILD_PLATFORM - - echo "-- Build platform: $VS_BUILD_PLATFORM" - echo "-- Build configuration: $BUILD_CONFIGURATION" - - BUILD_EXEC="\"MSBuild.exe\" \"$1\" /t:${2:-Build} /p:Platform=\"$VS_BUILD_PLATFORM\" /p:Configuration=\"$BUILD_CONFIGURATION\"" - echo "-- Build parameters: $BUILD_EXEC" - - # we need to add some extra outer quotes, since cmd.exe will only remove the outermost quotes and we might - # have some quotes inside the command. - with_vs_env "$BUILD_EXEC" - - else - #statements - BUILD_EXEC="$VS_BUILD_TOOL $1 /${2:-Build} \"${3:-Release}\"" - with_vs_env "$BUILD_EXEC" - fi + if [ $VS_VER -gt 14 ] ; then + + echo "-- Searching for vs-build" + # vswhere is a utility to find the most recent vs compiler toolchain. it is + # assumed to be installed at a fixed location + if [ $VS_VER == 15 ] ; then + VSWHERE_EXE=`cmd.exe //c "echo %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"` + elif [ $VS_VER == 16 ] ; then + VSWHERE_EXE=`cmd.exe //c "echo %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"` + elif [ $VS_VER -gt 17 ] ; then + VSWHERE_EXE=`cmd.exe //c "echo %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"` + else + VSWHERE_EXE=`cmd.exe //c "echo %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"` + fi + + echo "-- Found vswhere: ${VSWHERE_EXE}" + # vswhere allows us to query the install dir of the ms build tools + VS_INSTALL_PATH=`cmd //c "${VSWHERE_EXE}" -latest -products Microsoft.VisualStudio.Product.${VS_TYPE} -requires Microsoft.VisualStudio.Component.VC.CoreIde -property installationPath` + echo "-- Found vs install path: ${VS_INSTALL_PATH}" + # msbuild is the tool used to build visual studio solutions + MSBUILD_PATH="${VS_INSTALL_PATH}\MSBuild\\${VS_VER}.0\Bin\MSBuild.exe" + echo "-- Found MSBuild path: ${MSBUILD_PATH}" + + # define fallback build selection if vs-build was not called with enough parameters. + + if [ $ARCH == 32 ] ; then + DEFAULT_BUILD="Release|Win32" + elif [ $ARCH == 64 ] ; then + DEFAULT_BUILD="Release|x64" + elif [ $ARCH == "arm" ] ; then + DEFAULT_BUILD="Release|ARM" + elif [ $ARCH == "arm64" ] ; then + DEFAULT_BUILD="Release|ARM64" + elif [ $ARCH == "arm64ec" ] ; then + DEFAULT_BUILD="Release|ARM64EC" + fi + + # Cut part before '|' character of third parameter (which defaults to "Default|x64") and store it as BUILD_CONFIGURATION + BUILD_CONFIGURATION="$( cut -d '|' -f 1 <<< "${3:-$DEFAULT_BUILD}" )" + BUILD_CONFIGURATION=$BUILD_CONFIGURATION + # Cut part after '|' character of third parameter (which defaults to "Default|x64") and store it as VS_BUILD_PLATFORM + VS_BUILD_PLATFORM="$( cut -d '|' -f 2- <<< "${3:-$DEFAULT_BUILD}" )" + VS_BUILD_PLATFORM=$VS_BUILD_PLATFORM + + echo "-- Build platform: $VS_BUILD_PLATFORM" + echo "-- Build configuration: $BUILD_CONFIGURATION" + + BUILD_EXEC="\"MSBuild.exe\" \"$1\" /t:${2:-Build} /p:Platform=\"$VS_BUILD_PLATFORM\" /p:Configuration=\"$BUILD_CONFIGURATION\"" + echo "-- Build parameters: $BUILD_EXEC" + + # we need to add some extra outer quotes, since cmd.exe will only remove the outermost quotes and we might + # have some quotes inside the command. + with_vs_env "$BUILD_EXEC" + + else + #statements + BUILD_EXEC="$VS_BUILD_TOOL $1 /${2:-Build} \"${3:-Release}\"" + with_vs_env "$BUILD_EXEC" + fi } # visual studio upgrader # http://msdn.microsoft.com/en-us/library/vstudio/w15a82ay(v=vs.110).aspx function vs-upgrade() { - echo "-- vs-upgrade()" - - if [ $VS_VER -gt 14 ] ; then - echo "-- Searching for devenv" - # vswhere is a utility to find the most recent vs compiler toolchain. it is - # assumed to be installed at a fixed location - VSWHERE_EXE=`cmd.exe //c "echo %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"` - echo "-- Found vswhere: ${VSWHERE_EXE}" - # vswhere allows us to query the install dir of the ms build tools - VS_IDE_INSTALL_PATH=`cmd //c "${VSWHERE_EXE}" -latest -products Microsoft.VisualStudio.Product.${VS_TYPE} -requires Microsoft.VisualStudio.Component.VC.CoreIde -property installationPath` - echo "-- Found vs ide install path: ${VS_IDE_INSTALL_PATH}" - # msbuild is the tool used to build visual studio solutions - DEVENV_PATH="${VS_IDE_INSTALL_PATH}\Common7\IDE\devenv.exe" - echo "-- Found devenv path: ${DEVENV_PATH}" - - UPGRADE_EXEC="\"${DEVENV_PATH}\" $1 /Upgrade" - echo "-- Upgrade parameters: $UPGRADE_EXEC" - - # we need to add some extra outer quotes, since cmd.exe will only remove the outermost quotes and we might - # have some quotes inside the command. - with_vs_env "$UPGRADE_EXEC" - else - with_vs_env "$VS_BUILD_TOOL $1 /Upgrade" - fi + echo "-- vs-upgrade()" + + if [ $VS_VER -gt 14 ] ; then + echo "-- Searching for devenv" + # vswhere is a utility to find the most recent vs compiler toolchain. it is + # assumed to be installed at a fixed location + VSWHERE_EXE=`cmd.exe //c "echo %ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"` + echo "-- Found vswhere: ${VSWHERE_EXE}" + # vswhere allows us to query the install dir of the ms build tools + VS_IDE_INSTALL_PATH=`cmd //c "${VSWHERE_EXE}" -latest -products Microsoft.VisualStudio.Product.${VS_TYPE} -requires Microsoft.VisualStudio.Component.VC.CoreIde -property installationPath` + echo "-- Found vs ide install path: ${VS_IDE_INSTALL_PATH}" + # msbuild is the tool used to build visual studio solutions + DEVENV_PATH="${VS_IDE_INSTALL_PATH}\Common7\IDE\devenv.exe" + echo "-- Found devenv path: ${DEVENV_PATH}" + + UPGRADE_EXEC="\"${DEVENV_PATH}\" $1 /Upgrade" + echo "-- Upgrade parameters: $UPGRADE_EXEC" + + # we need to add some extra outer quotes, since cmd.exe will only remove the outermost quotes and we might + # have some quotes inside the command. + with_vs_env "$UPGRADE_EXEC" + else + with_vs_env "$VS_BUILD_TOOL $1 /Upgrade" + fi } # visual studio clean # http://msdn.microsoft.com/en-us/library/vstudio/w15a82ay(v=vs.110).aspx function vs-clean() { - with_vs_env $VS_BUILD_TOOL $1 /Clean Release - with_vs_env $VS_BUILD_TOOL $1 /Clean Debug + with_vs_env $VS_BUILD_TOOL $1 /Clean Release + with_vs_env $VS_BUILD_TOOL $1 /Clean Debug } ################################################################################ @@ -2371,140 +2458,140 @@ function vs-clean() { # overrriden when sourcing a formula script function download() { - echoWarning " Download function not implemented" + echoWarning " Download function not implemented" } function prepare() { - echoVerbose " Prepare function not implemented" + echoVerbose " Prepare function not implemented" } function build() { - echoWarning " Build function not implemented" + echoWarning " Build function not implemented" } function copy() { - echoWarning " Copy function not implemented" + echoWarning " Copy function not implemented" } function clean() { - echoWarning " Clean function not implemented" + echoWarning " Clean function not implemented" } function framework() { - echoWarning " Framework function not implemented" + echoWarning " Framework function not implemented" } function load() { - echoWarning " load function not implemented" - echo "0" + echoWarning " load function not implemented" + echo "0" } # do a command on a given dependency in a separate apothecary run # $1 = command # $2 = dependency name function apothecaryDepend() { - # Don't do anything if BUILD_DEPENDENCIES is false - if [ $BUILD_DEPENDENCIES == 0 ] ; then - echoInfo " ... skipping depend BUILD_DEPENDENCIES == 0 $depend" - return - fi - - if [ -z "$1" ] || [ -z "$2" ]; then - echoWarning "Error: Missing arguments. Usage: apothecaryDepend " - return 1 - fi - - local ROOT=$PWD - local depend="${2%.*}" # removes extension - - # Detect if dependency is a main OF lib or a dependency - if [ -f $FORMULAS_DIR/$depend.sh -o -d $FORMULAS_DIR/$depend ] || [ -f $DEPENDS_FORMULA_DIR/$depend.sh -o -d $DEPENDS_FORMULA_DIR/$depend ] ; then - : - else - echoError " Cannot $1, no formula for dependency \"$depend\"" - exit 1 - fi - echoStart " $depend $1 dependency" - export LIBS_DIR_REAL=$(realpath $LIBS_DIR) - # exit 1 - # echo "${APOTHECARY_SCRIPT} -t$TYPE -a$ARCH -j$PARALLEL_MAKE load $2" - # result=$(${APOTHECARY_SCRIPT} -t$TYPE -a$ARCH -j$PARALLEL_MAKE load $2| tail -n 1) - # LOAD_RESULT=$? - # # Check the return value - # if [ $LOADSAVE_RESULT -eq 0 ]; then - # echoError "apothecaryDepend $2 not updated will need to build. $LOADSAVE_RESULT." - # else - # echoSuccess "apothecaryDepend $2 - skipping ! $LOADSAVE_RESULT." - # return 0 - # fi - #set -e - # Capture the returned path into a variable - DIRECTORY_PATH=$(get_directory_path "$TYPE" "$1" "$PLATFORM" "$ARCH") - #echo "Presumed directory path: $DIRECTORY_PATH" - # Use git if the USE_GIT variable is set - if [ $FORCE_DOWNLOAD -eq 1 ]; then - $APOTHECARY_SCRIPT -f -t $TYPE -d$LIBS_DIR_REAL -a $ARCH -j$PARALLEL_MAKE ${USE_GIT:+-g} $1 $depend - else - $APOTHECARY_SCRIPT -t $TYPE -d$LIBS_DIR_REAL -a $ARCH -j$PARALLEL_MAKE ${USE_GIT:+-g} $1 $depend - fi - # Return to the original directory - cd $ROOT + # Don't do anything if BUILD_DEPENDENCIES is false + if [ $BUILD_DEPENDENCIES == 0 ] ; then + echoInfo " ... skipping depend BUILD_DEPENDENCIES == 0 $depend" + return + fi + + if [ -z "$1" ] || [ -z "$2" ]; then + echoWarning "Error: Missing arguments. Usage: apothecaryDepend " + return 1 + fi + + local ROOT=$PWD + local depend="${2%.*}" # removes extension + + # Detect if dependency is a main OF lib or a dependency + if [ -f $FORMULAS_DIR/$depend.sh -o -d $FORMULAS_DIR/$depend ] || [ -f $DEPENDS_FORMULA_DIR/$depend.sh -o -d $DEPENDS_FORMULA_DIR/$depend ] ; then + : + else + echoError " Cannot $1, no formula for dependency \"$depend\"" + exit 1 + fi + echoStart " $depend $1 dependency" + export LIBS_DIR_REAL=$(realpath $LIBS_DIR) + # exit 1 + # echo "${APOTHECARY_SCRIPT} -t$TYPE -a$ARCH -j$PARALLEL_MAKE load $2" + # result=$(${APOTHECARY_SCRIPT} -t$TYPE -a$ARCH -j$PARALLEL_MAKE load $2| tail -n 1) + # LOAD_RESULT=$? + # # Check the return value + # if [ $LOADSAVE_RESULT -eq 0 ]; then + # echoError "apothecaryDepend $2 not updated will need to build. $LOADSAVE_RESULT." + # else + # echoSuccess "apothecaryDepend $2 - skipping ! $LOADSAVE_RESULT." + # return 0 + # fi + #set -e + # Capture the returned path into a variable + #DIRECTORY_PATH=$(get_directory_path "$TYPE" "$1" "$PLATFORM" "$ARCH") + #echo "Presumed directory path: $DIRECTORY_PATH" + # Use git if the USE_GIT variable is set + if [ $FORCE_DOWNLOAD -eq 1 ]; then + $APOTHECARY_SCRIPT -f -t $TYPE -d$LIBS_DIR_REAL -a $ARCH -j$PARALLEL_MAKE ${USE_GIT:+-g} $1 $depend + else + $APOTHECARY_SCRIPT -t $TYPE -d$LIBS_DIR_REAL -a $ARCH -j$PARALLEL_MAKE ${USE_GIT:+-g} $1 $depend + fi + # Return to the original directory + cd $ROOT } # do a command on all formula dependencies in separate apothecary runs # $1 = command function apothecaryDependencies() { - if [ ${#FORMULA_DEPENDS[@]} -gt 0 ] ; then - for depend in "${FORMULA_DEPENDS[@]}" ; do - - #store where we are - CUR_DIR=$(pwd) - - #change back to APOTHECARY_DIR to run new script - cd $APOTHECARY_DIR - apothecaryDepend $1 $depend - #restore dir to where we are - cd $CUR_DIR - done - - #also have to cd back to the APOTHECARY_DIR for the next commands to work - #cd $APOTHECARY_DIR - fi + if [ ${#FORMULA_DEPENDS[@]} -gt 0 ] ; then + for depend in "${FORMULA_DEPENDS[@]}" ; do + + #store where we are + CUR_DIR=$(pwd) + + #change back to APOTHECARY_DIR to run new script + cd $APOTHECARY_DIR + apothecaryDepend $1 $depend + #restore dir to where we are + cd $CUR_DIR + done + + #also have to cd back to the APOTHECARY_DIR for the next commands to work + #cd $APOTHECARY_DIR + fi } function dump_output() { - if [ -z "$BUILD_OUTPUT" ]; then - echo "BUILD_OUTPUT not set." - else - echo Tailing the last 500 lines of output: - tail -500 "$BUILD_OUTPUT" - fi + if [ -z "$BUILD_OUTPUT" ]; then + echo "BUILD_OUTPUT not set." + else + echo Tailing the last 500 lines of output: + tail -500 "$BUILD_OUTPUT" + fi } function error_handler() { - echo ERROR: An error was encountered with the build. - dump_output - # nicely terminate the ping output loop - if [ -z "$PING_LOOP_PID" ]; then - echo "Loop PID not set." - else - kill $PING_LOOP_PID || true - fi - - if [ $# -gt 0 ]; then - JOB="$0" # job name - else - JOB="" - fi - if [ $# -gt 1 ]; then - LASTLINE="$1" # line of error occurrence - else - LASTLINE="" - fi - if [ $# -gt 2 ]; then - LASTERR="$2" # error code - else - LASTERR="1" - fi - echo "ERROR in ${JOB} : line ${LASTLINE} with exit code ${LASTERR}" - - exit "${LASTERR}" + echo ERROR: An error was encountered with the build. + dump_output + # nicely terminate the ping output loop + if [ -z "$PING_LOOP_PID" ]; then + echo "Loop PID not set." + else + kill $PING_LOOP_PID || true + fi + + if [ $# -gt 0 ]; then + JOB="$0" # job name + else + JOB="" + fi + if [ $# -gt 1 ]; then + LASTLINE="$1" # line of error occurrence + else + LASTLINE="" + fi + if [ $# -gt 2 ]; then + LASTERR="$2" # error code + else + LASTERR="1" + fi + echo "ERROR in ${JOB} : line ${LASTLINE} with exit code ${LASTERR}" + + exit "${LASTERR}" } ################################################################################ @@ -2521,29 +2608,29 @@ cd $(dirname $0) # set OS & build types HOST_OS=$(${APOTHECARY_DIR}/ostype.sh) if [ "$TYPE" == "" ] ; then - case "$HOST_OS" in - windows) - TYPE="vs" ;; - *) - TYPE=$HOST_OS ;; - esac + case "$HOST_OS" in + windows) + TYPE="vs" ;; + *) + TYPE=$HOST_OS ;; + esac fi FORMULA_TYPES=("${VALID_TYPES[@]}") # copy array echoVerbose "Valid build types: ${VALID_TYPES[*]}" # set xcode dev root on osx if [ "$HOST_OS" == "osx" ] ; then - XCODE_DEV_ROOT=$($XS) # Sets to path from Xcode Path - OSX_SDK_VER=$OSX_LATEST_SDK - IOS_SDK_VER=$IOS_LATEST_SDK + XCODE_DEV_ROOT=$($XS) # Sets to path from Xcode Path + OSX_SDK_VER=$OSX_LATEST_SDK + IOS_SDK_VER=$IOS_LATEST_SDK fi # check if we have a valid build type typeIsValid=0 # bool isValidType $TYPE typeIsValid if [ $typeIsValid == 0 ] ; then - echoError " Invalid build type: \"$TYPE\"" - exit 1 + echoError " Invalid build type: \"$TYPE\"" + exit 1 fi echoWarning "Build type: [$TYPE]" echoVerbose "Architecture: $ARCH" @@ -2551,24 +2638,24 @@ echoVerbose "Build dir: $BUILD_DIR" mkdir -p $REL_LIBS_DIR if [ -z "${CUSTOM_LIBS_DIR+x}" ] ; then - export LIBS_DIR=$REL_LIBS_DIR - export REAL_LIBS_DIR=$REL_LIBS_DIR - export IS_CUSTOM_LIBS_DIR=0 - echoVerbose "CUSTOM_LIBS_DIR is empty: $LIBS_DIR REL_LIBS_DIR:$REL_LIBS_DIR" + export LIBS_DIR=$REL_LIBS_DIR + export REAL_LIBS_DIR=$REL_LIBS_DIR + export IS_CUSTOM_LIBS_DIR=0 + echoVerbose "CUSTOM_LIBS_DIR is empty: $LIBS_DIR REL_LIBS_DIR:$REL_LIBS_DIR" else - case $CUSTOM_LIBS_DIR in - /*) export LIBS_DIR=$CUSTOM_LIBS_DIR ;; - *) export LIBS_DIR=$WD/$CUSTOM_LIBS_DIR ;; - esac - export REAL_LIBS_DIR=$REL_LIBS_DIR - export REAL_LIBS_DIR=$REL_LIBS_DIR - export IS_CUSTOM_LIBS_DIR=1 - echoVerbose "CUSTOM_LIBS_DIR is set: $LIBS_DIR custom:$CUSTOM_LIBS_DIR" + case $CUSTOM_LIBS_DIR in + /*) export LIBS_DIR=$CUSTOM_LIBS_DIR ;; + *) export LIBS_DIR=$WD/$CUSTOM_LIBS_DIR ;; + esac + export REAL_LIBS_DIR=$REL_LIBS_DIR + export REAL_LIBS_DIR=$REL_LIBS_DIR + export IS_CUSTOM_LIBS_DIR=1 + echoVerbose "CUSTOM_LIBS_DIR is set: $LIBS_DIR custom:$CUSTOM_LIBS_DIR" fi echoVerbose "Libs dest dir: $LIBS_DIR custom:$IS_CUSTOM_LIBS_DIR" if [ ! -e $LIBS_DIR ] ; then - mkdir -p $LIBS_DIR - echoInfo "Created libs dest dir: $LIBS_DIR" + mkdir -p $LIBS_DIR + echoInfo "Created libs dest dir: $LIBS_DIR" fi # dependency & build root dirs @@ -2577,133 +2664,133 @@ BUILD_ROOT_DIR=$BUILD_DIR/$BUILDROOT_SUBDIR if [[ "$TYPE" == "android" ]] ; then - export NDK_VERSION_MAJOR="${NDK_VERSION_MAJOR:-"27"}" - export NDK_VERSION="${NDK_VERSION:-"27.2.12479018"}" - export ANDROID_API="${ANDROID_API:-"34"}" - export ANDROID_PLATFORM="${ANDROID_PLATFORM:-"android-${ANDROID_API}"}" - export ANDROID_NDK_ROOT="${ANDROID_NDK_ROOT:-"/usr/local/lib/android/sdk/ndk/${NDK_VERSION}"}" - export NDK_ROOT="${ANDROID_NDK_ROOT}" - export FLAG_RELEASE="" - - if [ -z "${NDK_ROOT+x}" ]; then - NDK_ROOT=NDK_ROOT=/Users/one/Library/Android/sdk/ndk/25.2.9519653 - echoError " NDK_ROOT not defined! This is ussually /Users/{username}/Library/Android/sdk/ndk on macOS" - exit 1 - fi - if [ "$ARCH" == "armv7" ]; then - ABI=armeabi-v7a - elif [ "$ARCH" == "x86" ]; then - ABI=x86 - elif [ "$ARCH" == "x86_64" ]; then - ABI=x86_64 - elif [ "$ARCH" == "arm64" ]; then - ABI=arm64-v8a - else - ABI="" - echoError "Targeting android, ARCH not set! Please use -a arm64" - fi - PLATFORM=$ABI + export NDK_VERSION_MAJOR="${NDK_VERSION_MAJOR:-"27"}" + export NDK_VERSION="${NDK_VERSION:-"27.2.12479018"}" + export ANDROID_API="${ANDROID_API:-"34"}" + export ANDROID_PLATFORM="${ANDROID_PLATFORM:-"android-${ANDROID_API}"}" + export ANDROID_NDK_ROOT="${ANDROID_NDK_ROOT:-"/usr/local/lib/android/sdk/ndk/${NDK_VERSION}"}" + export NDK_ROOT="${ANDROID_NDK_ROOT}" + export FLAG_RELEASE="" + + if [ -z "${NDK_ROOT+x}" ]; then + NDK_ROOT=NDK_ROOT=/Users/one/Library/Android/sdk/ndk/25.2.9519653 + echoError " NDK_ROOT not defined! This is ussually /Users/{username}/Library/Android/sdk/ndk on macOS" + exit 1 + fi + if [ "$ARCH" == "armv7" ]; then + ABI=armeabi-v7a + elif [ "$ARCH" == "x86" ]; then + ABI=x86 + elif [ "$ARCH" == "x86_64" ]; then + ABI=x86_64 + elif [ "$ARCH" == "arm64" ]; then + ABI=arm64-v8a + else + ABI="" + echoError "Targeting android, ARCH not set! Please use -a arm64" + fi + PLATFORM=$ABI else - ABI="" + ABI="" fi if [[ "$TYPE" =~ ^(osx|ios|tvos|xros|catos|watchos)$ ]]; then - if [ $ARCH == "ARM64" ]; then - ARCH="arm64" - fi - if [ $ARCH == "x86_64" ] || [ $ARCH == "X86_64" ]; then - ARCH="x86_64" - fi - if [[ "$TYPE" =~ ^(ios|catos)$ ]]; then - export MIN_SDK_VER=${IOS_MIN_SDK_VER} - elif [[ "$TYPE" =~ ^(osx)$ ]]; then - export MIN_SDK_VER=${OSX_MIN_SDK_VER} - elif [[ "$TYPE" =~ ^(tvos)$ ]]; then - export MIN_SDK_VER=${TVOS_MIN_SDK_VER} - elif [[ "$TYPE" =~ ^(xros)$ ]]; then - export MIN_SDK_VER=${XROS_MIN_SDK_VER} - elif [[ "$TYPE" =~ ^(watchos)$ ]]; then - export MIN_SDK_VER=${WATCHOS_MIN_SDK_VER} - else - export MIN_SDK_VER=${IOS_MIN_SDK_VER} - echoWarning "MIN_SDK not set for $TYPE" - fi + if [ $ARCH == "ARM64" ]; then + ARCH="arm64" + fi + if [ $ARCH == "x86_64" ] || [ $ARCH == "X86_64" ]; then + ARCH="x86_64" + fi + if [[ "$TYPE" =~ ^(ios|catos)$ ]]; then + export MIN_SDK_VER=${IOS_MIN_SDK_VER} + elif [[ "$TYPE" =~ ^(osx)$ ]]; then + export MIN_SDK_VER=${OSX_MIN_SDK_VER} + elif [[ "$TYPE" =~ ^(tvos)$ ]]; then + export MIN_SDK_VER=${TVOS_MIN_SDK_VER} + elif [[ "$TYPE" =~ ^(xros)$ ]]; then + export MIN_SDK_VER=${XROS_MIN_SDK_VER} + elif [[ "$TYPE" =~ ^(watchos)$ ]]; then + export MIN_SDK_VER=${WATCHOS_MIN_SDK_VER} + else + export MIN_SDK_VER=${IOS_MIN_SDK_VER} + echoWarning "MIN_SDK not set for $TYPE" + fi fi CROSSCOMPILING=0 if [ "$TYPE" == "linux" ]; then - export FLAG_RELEASE="-O3" - if [[ "$ARCH" =~ ^("armv7l"|"aarch64"|"armv6l")$ ]]; then - export PLATFORM="$ARCH" - export ABI="${ARCH}" - elif [[ "$ARCH" =~ ^("64"|"x86_64")$ ]]; then - export PLATFORM="64" - export ABI="x86_64" - elif [[ "$ARCH" =~ ^("32"|"x86")$ ]]; then - export PLATFORM="86" - export ABI="x86" - elif [[ "$ARCH" =~ ^(arm64)$ ]]; then - export PLATFORM="arm64" - export ABI="aarch64" - export GCC=gcc13 - elif [[ "$ARCH" =~ ^("jetson")$ ]]; then - export PLATFORM="jetson" - export ABI="aarch64" - else - echoWarning "Unsupported architecture for Linux: $ARCH" - exit 1 - fi - - if [[ $GCC =~ [a-zA-Z]+([0-9]+) ]]; then - export GCC_VERSION=${BASH_REMATCH[1]} - echo "Extracted GCC_VERSION: $GCC_VERSION" - else - echoWarning "Error: Unable to extract GCC version from variable '$GCC'" - export GCC_VERSION=14 - fi - - if [[ "$GCC_VERSION" =~ ^(10|11|12)$ ]]; then - export C_STANDARD=17 - export CPP_STANDARD=20 - elif [[ "$GCC_VERSION" =~ ^(13|14)$ ]]; then - export C_STANDARD=17 - export CPP_STANDARD=23 - else - export C_STANDARD=17 - export CPP_STANDARD=17 - fi - - if [[ "$ABI" =~ ^(armv7l|aarch64|armv6l)$ ]]; then - CROSSCOMPILING=1 - fi - - if [[ ${CROSSCOMPILING} == 1 ]]; then - if [[ -z ${TOOLCHAIN_ROOT+z} ]]; then - echoWarning "Trying to cross compile but TOOLCHAIN_ROOT not set" - echoWarning "Trying to continue in case PATH is set to correct toolchain" - echoWarning "If compiling fails try setting TOOLCHAIN_ROOT to root of cross compiler toolchain" - if [[ -z ${TOOLCHAIN_PREFIX+z} ]]; then - export TOOLCHAIN_PREFIX="aarch64-linux-gnu" - fi - fi - if [[ -z ${SYSROOT+z} ]]; then - echoError "Trying to cross compile but SYSROOT environment variable is not set" - echoError "Should be set to root of target OS image" - export SYSROOT="" - fi - else - if [[ -z ${TOOLCHAIN_ROOT+z} ]]; then - export TOOLCHAIN_ROOT="" - fi - if [[ -z ${TOOLCHAIN_PREFIX+z} ]]; then - export TOOLCHAIN_PREFIX="" - fi - if [[ -z ${SYSROOT+z} ]]; then - export SYSROOT="" - fi - fi + export FLAG_RELEASE="-O3" + if [[ "$ARCH" =~ ^("armv7l"|"aarch64"|"armv6l")$ ]]; then + export PLATFORM="$ARCH" + export ABI="${ARCH}" + elif [[ "$ARCH" =~ ^("64"|"x86_64")$ ]]; then + export PLATFORM="64" + export ABI="x86_64" + elif [[ "$ARCH" =~ ^("32"|"x86")$ ]]; then + export PLATFORM="86" + export ABI="x86" + elif [[ "$ARCH" =~ ^(arm64)$ ]]; then + export PLATFORM="arm64" + export ABI="aarch64" + export GCC=gcc13 + elif [[ "$ARCH" =~ ^("jetson")$ ]]; then + export PLATFORM="jetson" + export ABI="aarch64" + else + echoWarning "Unsupported architecture for Linux: $ARCH" + exit 1 + fi + + if [[ $GCC =~ [a-zA-Z]+([0-9]+) ]]; then + export GCC_VERSION=${BASH_REMATCH[1]} + echo "Extracted GCC_VERSION: $GCC_VERSION" + else + echoWarning "Error: Unable to extract GCC version from variable '$GCC'" + export GCC_VERSION=14 + fi + + if [[ "$GCC_VERSION" =~ ^(10|11|12)$ ]]; then + export C_STANDARD=17 + export CPP_STANDARD=20 + elif [[ "$GCC_VERSION" =~ ^(13|14)$ ]]; then + export C_STANDARD=17 + export CPP_STANDARD=23 + else + export C_STANDARD=17 + export CPP_STANDARD=17 + fi + + if [[ "$ABI" =~ ^(armv7l|aarch64|armv6l)$ ]]; then + CROSSCOMPILING=1 + fi + + if [[ ${CROSSCOMPILING} == 1 ]]; then + if [[ -z ${TOOLCHAIN_ROOT+z} ]]; then + echoWarning "Trying to cross compile but TOOLCHAIN_ROOT not set" + echoWarning "Trying to continue in case PATH is set to correct toolchain" + echoWarning "If compiling fails try setting TOOLCHAIN_ROOT to root of cross compiler toolchain" + if [[ -z ${TOOLCHAIN_PREFIX+z} ]]; then + export TOOLCHAIN_PREFIX="aarch64-linux-gnu" + fi + fi + if [[ -z ${SYSROOT+z} ]]; then + echoError "Trying to cross compile but SYSROOT environment variable is not set" + echoError "Should be set to root of target OS image" + export SYSROOT="" + fi + else + if [[ -z ${TOOLCHAIN_ROOT+z} ]]; then + export TOOLCHAIN_ROOT="" + fi + if [[ -z ${TOOLCHAIN_PREFIX+z} ]]; then + export TOOLCHAIN_PREFIX="" + fi + if [[ -z ${SYSROOT+z} ]]; then + export SYSROOT="" + fi + fi fi @@ -2712,49 +2799,49 @@ fi echoVerbose "Running: $A_CMD $*" case "$A_CMD" in - update) - doCommand 1 updateFormula $@ ;; - - download) - doCommand 1 downloadFormula $@ ;; - - prepare) - doCommand 1 prepareFormula $@ ;; - - build) - doCommand 1 buildFormula $@ ;; - - copy) - doCommand 1 copyFormula $@ ;; - - clean) - doCommand 1 cleanFormula $@ ;; - - framework) - if [ "$XCFRAMEWORK_ALL" == "true" ]; then - doCommand 1 xframeworkFormula $@ - else - doCommand 1 frameworkFormula $@ - fi ;; - remove) - if [ ! -e $BUILD_DIR ] ; then - echoInfo " Nothing to remove" - exit 0 - fi - doCommand 1 remove $@ ;; - - remove-lib) - if [ ! -e $LIBS_DIR ] ; then - echoInfo " Nothing to remove" - exit 0 - fi - doCommand 1 remove-lib $@ ;; - - remove-all) - doCommand 1 remove-all $@ ;; - - *) - echoError " Unknown command \"$A_CMD\"" - exit 1 ;; + update) + doCommand 1 updateFormula $@ ;; + + download) + doCommand 1 downloadFormula $@ ;; + + prepare) + doCommand 1 prepareFormula $@ ;; + + build) + doCommand 1 buildFormula $@ ;; + + copy) + doCommand 1 copyFormula $@ ;; + + clean) + doCommand 1 cleanFormula $@ ;; + + framework) + if [ "$XCFRAMEWORK_ALL" == "true" ]; then + doCommand 1 xframeworkFormula $@ + else + doCommand 1 frameworkFormula $@ + fi ;; + remove) + if [ ! -e $BUILD_DIR ] ; then + echoInfo " Nothing to remove" + exit 0 + fi + doCommand 1 remove $@ ;; + + remove-lib) + if [ ! -e $LIBS_DIR ] ; then + echoInfo " Nothing to remove" + exit 0 + fi + doCommand 1 remove-lib $@ ;; + + remove-all) + doCommand 1 remove-all $@ ;; + + *) + echoError " Unknown command \"$A_CMD\"" + exit 1 ;; esac exit 0 diff --git a/apothecary/configure/linuxaarch64_configure.sh b/apothecary/configure/linuxaarch64_configure.sh index 992acdd3d..105b26cb2 100755 --- a/apothecary/configure/linuxaarch64_configure.sh +++ b/apothecary/configure/linuxaarch64_configure.sh @@ -6,7 +6,7 @@ APOTHECARY_LEVEL="$(cd "$SCRIPT_DIR/../.." && pwd)" cd $APOTHECARY_LEVEL CROSS_COMPILER="raspbian" -CROSS_SYSROOT="rpi_rootfs" +CROSS_SYSROOT="rpi-arm64-rootfs" CROSS_ARCH="aarch64" CROSSCOMPILE=${CROSSCOMPILE:-1} SYSROOT_PATH="/usr/${CROSS_ARCH}-linux-gnu" @@ -25,8 +25,8 @@ if [ "${CROSSCOMPILE}" -eq 0 ]; then export ROOTFS="/" export TOOLCHAIN_ROOT="/usr" else - export ROOTFS="${APOTHECARY_LEVEL}/${CROSS_SYSROOT}" - export TOOLCHAIN_ROOT="${APOTHECARY_LEVEL}/${CROSS_COMPILER}" + export ROOTFS="/rpi-arm64-rootfs/" + export TOOLCHAIN_ROOT="/usr/aarch64-linux-gnu/" fi export SYSROOT=${ROOTFS} diff --git a/apothecary/configure/linuxarm64_configure.sh b/apothecary/configure/linuxarm64_configure.sh index 76895d73d..05591737d 100755 --- a/apothecary/configure/linuxarm64_configure.sh +++ b/apothecary/configure/linuxarm64_configure.sh @@ -27,16 +27,18 @@ else fi if [[ "$CROSSCOMPILE" -eq 1 ]]; then - export ROOTFS="${SYSROOT_PATH}" + export ROOTFS="/arm64-rootfs" export TOOLCHAIN_ROOT="${SYSROOT_PATH}" echo "Using sysroot at ${SYSROOT_PATH}" else export ROOTFS="/" - export TOOLCHAIN_ROOT="/usr" + export TOOLCHAIN_ROOT="" echo "Using native rootfs at ${ROOTFS}" fi export SYSROOT=${ROOTFS} + + # if [ "${GCC_VERSION}" -eq 0 ]; then # export GCC_VERSION="14.2.0" # fi @@ -96,6 +98,8 @@ echo "Toolchain ROOT: $TOOLCHAIN_ROOT" echo "CROSS_ARCH: $CROSS_ARCH" echo "HOST_ARCH: $HOST_ARCH" echo "HOST_PLATFORM: $HOST_PLATFORM" +echo "GCC Arch:" +file /usr/bin/${CROSS_ARCH}-linux-gnu-gcc # echo "LDFLAGS : $LDFLAGS" # echo "CFLAGS : $CFLAGS" # echo "Path: [$PATH]" diff --git a/apothecary/formulas/FreeImage/FreeImage.sh b/apothecary/formulas/FreeImage/FreeImage.sh index 786651529..5cf2a3cb3 100755 --- a/apothecary/formulas/FreeImage/FreeImage.sh +++ b/apothecary/formulas/FreeImage/FreeImage.sh @@ -101,6 +101,8 @@ function build() { -DZLIB_INCLUDE_DIRS=${ZLIB_INCLUDE_DIR} \ -DBUILD_ZLIB=OFF \ -DBUILD_TESTS=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DDEPLOYMENT_TARGET=${MIN_SDK_VER} \ -DCMAKE_INCLUDE_OUTPUT_DIRECTORY=include \ -DCMAKE_INSTALL_INCLUDEDIR=include \ @@ -155,6 +157,8 @@ function build() { -DZLIB_ROOT=${ZLIB_ROOT} \ -DZLIB_LIBRARY=${ZLIB_LIBRARY} \ -DZLIB_INCLUDE_DIRS=${ZLIB_INCLUDE_DIR} \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DBUILD_ZLIB=OFF \ -DBUILD_TESTS=OFF \ -DGCC_VERSION=${GCC_VERSION} \ @@ -193,7 +197,7 @@ function build() { -DANDROID_NDK_ROOT=$ANDROID_NDK_ROOT \ -DURIPARSER_ENABLE_INSTALL=ON \ -DBUILD_SHARED_LIBS=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 -fvisibility-inlines-hidden -std=c++${CPP_STANDARD} -frtti ${FLAG_RELEASE}" \ -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 -fvisibility-inlines-hidden -std=c${C_STANDARD} -Wno-implicit-function-declaration -frtti ${FLAG_RELEASE}" \ @@ -273,6 +277,8 @@ function build() { -DCMAKE_C_FLAGS_RELEASE="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_RELEASE}" \ -DCMAKE_INSTALL_LIBDIR="build_${TYPE}_${ARCH}" \ -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -D CMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ -DCMAKE_INSTALL_PREFIX=. \ ${CMAKE_WIN_SDK} \ @@ -289,6 +295,8 @@ function build() { -DCMAKE_C_FLAGS_DEBUG="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_DEBUG}" \ -DCMAKE_INSTALL_LIBDIR="build_${TYPE}_${ARCH}" \ -DCMAKE_BUILD_TYPE=Debug \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -D CMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ -DCMAKE_INSTALL_PREFIX=. \ ${CMAKE_WIN_SDK} \ @@ -323,6 +331,8 @@ function build() { -DBUILD_LIBRAWLITE=OFF \ -DBUILD_OPENEXR=OFF \ -DENABLE_VISIBILITY=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DBUILD_WEBP=OFF \ -DBUILD_JXR=OFF \ -DBUILD_TESTS=OFF \ @@ -355,6 +365,8 @@ function build() { -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1" \ -DCMAKE_CXX_EXTENSIONS=OFF \ -DBUILD_SHARED_LIBS=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DENABLE_VISIBILITY=OFF \ -DBUILD_LIBRAWLITE=OFF \ -DBUILD_OPENEXR=OFF \ diff --git a/apothecary/formulas/_depends/brotli.sh b/apothecary/formulas/_depends/brotli.sh index 068c76449..854441f64 100755 --- a/apothecary/formulas/_depends/brotli.sh +++ b/apothecary/formulas/_depends/brotli.sh @@ -20,14 +20,17 @@ GIT_TAG=v$VER # download the source code and unpack it into LIB_NAME function download() { . "$DOWNLOADER_SCRIPT" - #downloader ${GIT_URL}/archive/refs/tags/v$VER.tar.gz - #tar -xf v$VER.tar.gz - #mv brotli-$VER brotli - #rm v$VER.tar.gz - downloader ${GIT_URL}/archive/refs/heads/master.tar.gz - tar -xf master.tar.gz - mv brotli-master brotli - rm master.tar.gz + if [ "$TYPE" == "vs" ]; then + downloader ${GIT_URL}/archive/refs/tags/v${VER}.zip + unzip -q v${VER}.zip + mv brotli-${VER} brotli + rm -f v${VER}.zip + else + downloader ${GIT_URL}/archive/refs/tags/v${VER}.tar.gz + tar -xf v${VER}.tar.gz + mv brotli-${VER} brotli + rm -f v${VER}.tar.gz + fi } # prepare the build environment, executed inside the lib src dir @@ -39,7 +42,6 @@ function prepare() { function build() { LIBS_ROOT=$(realpath $LIBS_DIR) if [ "$TYPE" == "vs" ]; then - find ./ -name "*.o" -type f -delete echo "building $TYPE | $ARCH | $VS_VER | vs: $VS_VER_GEN" echo "--------------------" GENERATOR_NAME="Visual Studio ${VS_VER_GEN}" @@ -50,7 +52,6 @@ function build() { # echo "ARM64EC platform detected, exiting build function." # return # fi - DEFINES=" -DCMAKE_C_STANDARD=${C_STANDARD} \ -DCMAKE_CXX_STANDARD=${CPP_STANDARD} \ @@ -109,7 +110,8 @@ function build() { -DBROTLI_BUILD_TOOLS=OFF \ -DBROTLI_BUNDLED_MODE=OFF \ -DENABLE_ARC=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DENABLE_VISIBILITY=OFF cmake --build . --config Release -j${PARALLEL_MAKE} --target install @@ -151,7 +153,8 @@ function build() { -DBROTLI_DISABLE_TESTS=ON \ -DBROTLI_BUILD_TOOLS=OFF \ -DBROTLI_BUNDLED_MODE=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DENABLE_VISIBILITY=OFF cmake --build . --config Release -j${PARALLEL_MAKE} --target install @@ -184,20 +187,19 @@ function build() { -DANDROID_NDK_ROOT=$ANDROID_NDK_ROOT \ -DURIPARSER_ENABLE_INSTALL=ON \ -DBUILD_SHARED_LIBS=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 -fvisibility-inlines-hidden -std=c++${CPP_STANDARD} -frtti ${FLAG_RELEASE}" \ -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 -fvisibility-inlines-hidden -std=c${C_STANDARD} -Wno-implicit-function-declaration -frtti ${FLAG_RELEASE}" \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ -DCMAKE_CXX_EXTENSIONS=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ -DGCC_VERSION=${GCC_VERSION} \ -DCMAKE_SYSTEM_NAME=$TYPE \ -DBROTLI_DISABLE_TESTS=ON \ -DBROTLI_BUILD_TOOLS=OFF \ -DBROTLI_BUNDLED_MODE=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DENABLE_VISIBILITY=OFF cmake --build . --config Release -j${PARALLEL_MAKE} --target install diff --git a/apothecary/formulas/_depends/pixman.sh b/apothecary/formulas/_depends/pixman.sh index c542ec501..0e58c20b0 100755 --- a/apothecary/formulas/_depends/pixman.sh +++ b/apothecary/formulas/_depends/pixman.sh @@ -74,6 +74,8 @@ function build() { -DENABLE_BITCODE=OFF \ -DENABLE_ARC=OFF \ -DDEPLOYMENT_TARGET=${MIN_SDK_VER} \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ -DBUILD_STATIC=ON \ @@ -101,6 +103,8 @@ function build() { -DCMAKE_INCLUDE_OUTPUT_DIRECTORY=include \ -DCMAKE_INSTALL_INCLUDEDIR=include \ -DCMAKE_INSTALL_PREFIX=Release \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE=lib \ -DCMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE=lib \ -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE=bin \ diff --git a/apothecary/formulas/assimp.sh b/apothecary/formulas/assimp.sh index 9a17c2db1..8b2140cde 100755 --- a/apothecary/formulas/assimp.sh +++ b/apothecary/formulas/assimp.sh @@ -88,7 +88,8 @@ function build() { -DPLATFORM=$PLATFORM \ -DENABLE_BITCODE=OFF \ -DENABLE_ARC=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_PREFIX_PATH="${LIBS_ROOT}" \ -DZLIB_ROOT=${ZLIB_ROOT} \ @@ -138,6 +139,8 @@ function build() { -DCMAKE_CXX_FLAGS_RELEASE="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_RELEASE} ${EXCEPTION_FLAGS}" \ -DCMAKE_C_FLAGS_RELEASE="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_RELEASE} ${EXCEPTION_FLAGS}" \ -DCMAKE_PREFIX_PATH="${LIBS_ROOT}" \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DASSIMP_BUILD_ZLIB=OFF \ -DZLIB_ROOT=${ZLIB_ROOT} \ -DZLIB_INCLUDE_DIR=${ZLIB_INCLUDE_DIR} \ @@ -156,6 +159,8 @@ function build() { -DCMAKE_CXX_FLAGS_DEBUG="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_DEBUG} ${EXCEPTION_FLAGS}" \ -DCMAKE_C_FLAGS_DEBUG="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_DEBUG} ${EXCEPTION_FLAGS}" \ -DCMAKE_PREFIX_PATH="${LIBS_ROOT}" \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DASSIMP_BUILD_ZLIB=OFF \ -DZLIB_ROOT=${ZLIB_ROOT} \ -DZLIB_INCLUDE_DIR=${ZLIB_INCLUDE_DIR} \ @@ -211,14 +216,14 @@ function build() { -DANDROID_NDK_ROOT=$ANDROID_NDK_ROOT \ -DCMAKE_PREFIX_PATH="${LIBS_ROOT}" \ -DBUILD_SHARED_LIBS=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 -fvisibility-inlines-hidden -std=c++${CPP_STANDARD} -frtti ${FLAG_RELEASE}" \ -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 -fvisibility-inlines-hidden -std=c${C_STANDARD} -Wno-implicit-function-declaration -frtti ${FLAG_RELEASE}" \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ -DCMAKE_CXX_EXTENSIONS=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DZLIB_ROOT=${ZLIB_ROOT} \ -DZLIB_ROOT=${ZLIB_ROOT} \ -DZLIB_LIBRARY=${ZLIB_LIBRARY} \ @@ -257,6 +262,7 @@ function build() { -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INCLUDE_OUTPUT_DIRECTORY=include \ -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_INSTALL_INCLUDEDIR=include \ -DCMAKE_C_STANDARD=${C_STANDARD} \ -DCMAKE_CXX_STANDARD=${CPP_STANDARD} \ diff --git a/apothecary/formulas/cairo/cairo.sh b/apothecary/formulas/cairo/cairo.sh index 46469b2ff..295d42ee4 100755 --- a/apothecary/formulas/cairo/cairo.sh +++ b/apothecary/formulas/cairo/cairo.sh @@ -206,6 +206,8 @@ function build() { -D CMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ -D CAIRO_WIN32_STATIC_BUILD=ON \ -DNO_FONTCONFIG=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_CXX_FLAGS_RELEASE="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_RELEASE} ${EXCEPTION_FLAGS}" \ -DCMAKE_C_FLAGS_RELEASE="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_RELEASE} ${EXCEPTION_FLAGS}" \ -DCMAKE_PREFIX_PATH="${LIBS_ROOT}" \ @@ -286,7 +288,8 @@ function build() { -DBUILD_STATIC_LIBS=ON \ -DENABLE_VISIBILITY=OFF \ -DDEPLOYMENT_TARGET=${MIN_SDK_VER} \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DNO_FONTCONFIG=OFF \ -DCMAKE_PREFIX_PATH="${LIBS_ROOT}" \ -D CMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} diff --git a/apothecary/formulas/curl/curl.sh b/apothecary/formulas/curl/curl.sh index 0f061d5d6..d5aabd976 100755 --- a/apothecary/formulas/curl/curl.sh +++ b/apothecary/formulas/curl/curl.sh @@ -154,6 +154,8 @@ function build() { -DZLIB_INCLUDE_DIRS=${ZLIB_INCLUDE_DIR} \ -DZLIB_LIBRARY=${ZLIB_LIBRARY} \ -DZLIB_LIBRARIES=${ZLIB_LIBRARY} \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCURL_BROTLI=ON \ -DBROTLIDEC_LIBRARY=${LIBBROTLI_DEC_LIB} \ -DBROTLICOMMON_LIBRARY=${LIBBROTLI_COMMON_LIB} \ @@ -322,7 +324,8 @@ function build() { -DENABLE_BITCODE=OFF \ -DCMAKE_USE_SYSTEM_CURL=OFF \ -DENABLE_ARC=ON \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCURL_DISABLE_LDAP=ON \ -DENABLE_VISIBILITY=OFF \ ${SSL_DEFS} \ diff --git a/apothecary/formulas/fmt/fmt.sh b/apothecary/formulas/fmt/fmt.sh index e8742038c..9f833a07d 100755 --- a/apothecary/formulas/fmt/fmt.sh +++ b/apothecary/formulas/fmt/fmt.sh @@ -81,7 +81,8 @@ function build() { -DENABLE_ARC=OFF \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 cmake --build . --config Release -j${PARALLEL_MAKE} --target install cd .. elif [ "$TYPE" == "vs" ]; then @@ -104,6 +105,8 @@ function build() { ${CMAKE_WIN_SDK} \ -UCMAKE_CXX_FLAGS \ -UCMAKE_C_FLAGS \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_CXX_FLAGS_RELEASE="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_RELEASE} ${EXCEPTION_FLAGS}" \ -DCMAKE_C_FLAGS_RELEASE="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_RELEASE} ${EXCEPTION_FLAGS}" \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ @@ -131,7 +134,7 @@ function build() { -DANDROID_TOOLCHAIN=clang \ -DANDROID_NDK_ROOT=$ANDROID_NDK_ROOT \ -DBUILD_SHARED_LIBS=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 -fvisibility-inlines-hidden -std=c++${CPP_STANDARD} -frtti ${FLAG_RELEASE}" \ -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 -fvisibility-inlines-hidden -std=c${C_STANDARD} -Wno-implicit-function-declaration -frtti ${FLAG_RELEASE}" \ @@ -154,6 +157,8 @@ function build() { -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 -std=c${C_STANDARD} -Wno-implicit-function-declaration -frtti ${FLAG_RELEASE}" \ -DCMAKE_CXX_EXTENSIONS=OFF \ -DBUILD_SHARED_LIBS=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_PREFIX_PATH="${LIBS_ROOT}" \ -DCMAKE_INSTALL_PREFIX=Release \ -DCMAKE_INCLUDE_OUTPUT_DIRECTORY=include \ @@ -179,6 +184,8 @@ function build() { -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 -std=c${C_STANDARD} -Wno-implicit-function-declaration -frtti ${FLAG_RELEASE}" \ -DCMAKE_CXX_EXTENSIONS=OFF \ -DBUILD_SHARED_LIBS=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_PREFIX_PATH="${LIBS_ROOT}" \ -DCMAKE_INSTALL_PREFIX=Release \ -DCMAKE_INCLUDE_OUTPUT_DIRECTORY=include \ @@ -198,13 +205,13 @@ function build() { -DCMAKE_CXX_FLAGS="-std=c++${CPP_STANDARD} ${FLAG_RELEASE}" \ -DCMAKE_C_FLAGS="-std=c${C_STANDARD} ${FLAG_RELEASE}" \ -DCMAKE_CXX_EXTENSIONS=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DBUILD_SHARED_LIBS=OFF \ -DCMAKE_INSTALL_PREFIX=Release \ -DCMAKE_INCLUDE_OUTPUT_DIRECTORY=include \ -DCMAKE_INSTALL_INCLUDEDIR=include - # -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE=. \ - # -DCMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE=. \ - # -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE=. + cmake --build . --target install --config Release -j${PARALLEL_MAKE} cd .. fi diff --git a/apothecary/formulas/freetype/freetype.sh b/apothecary/formulas/freetype/freetype.sh index 1455354c7..f0b33a00d 100755 --- a/apothecary/formulas/freetype/freetype.sh +++ b/apothecary/formulas/freetype/freetype.sh @@ -119,7 +119,8 @@ function build() { -DENABLE_ARC=ON \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 cmake --build . --config Release -j${PARALLEL_MAKE} --target install cd .. @@ -201,6 +202,8 @@ function build() { -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_RELEASE} ${EXCEPTION_FLAGS}" \ -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_RELEASE} ${EXCEPTION_FLAGS} " \ -DCMAKE_PREFIX_PATH="${LIBS_ROOT}" \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DZLIB_ROOT=${ZLIB_ROOT} \ -DZLIB_INCLUDE_DIR=${ZLIB_INCLUDE_DIR} \ -DZLIB_INCLUDE_DIRS=${ZLIB_INCLUDE_DIR} \ @@ -230,6 +233,8 @@ function build() { -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_DEBUG} ${EXCEPTION_FLAGS}" \ -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_DEBUG} ${EXCEPTION_FLAGS}" \ -DCMAKE_PREFIX_PATH="${LIBS_ROOT}" \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DZLIB_ROOT=${ZLIB_ROOT} \ -DZLIB_INCLUDE_DIR=${ZLIB_INCLUDE_DIR} \ -DZLIB_INCLUDE_DIRS=${ZLIB_INCLUDE_DIR} \ @@ -277,6 +282,8 @@ function build() { -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 -std=c${C_STANDARD} -Wno-implicit-function-declaration -frtti ${FLAG_RELEASE}" \ -DCMAKE_CXX_EXTENSIONS=OFF \ -DBUILD_SHARED_LIBS=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_INSTALL_PREFIX=Release \ -DCMAKE_INCLUDE_OUTPUT_DIRECTORY=include \ -DCMAKE_INSTALL_INCLUDEDIR=include \ @@ -314,8 +321,8 @@ function build() { -DCMAKE_SYSTEM_PROCESSOR=$ABI \ -DGCC_VERSION=${GCC_VERSION} \ -DCMAKE_TOOLCHAIN_FILE=$APOTHECARY_DIR/toolchains/${TYPE}${PLATFORM}.toolchain.cmake \ - -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 -std=c++${CPP_STANDARD} -frtti ${FLAG_RELEASE}" \ - -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 -std=c${C_STANDARD} -Wno-implicit-function-declaration ${FLAG_RELEASE}" \ + -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 -std=c++${CPP_STANDARD} -frtti ${FLAG_RELEASE} -I${ZLIB_INCLUDE_DIR} -I${LIBPNG_INCLUDE_DIR}" \ + -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 -std=c${C_STANDARD} -Wno-implicit-function-declaration ${FLAG_RELEASE} -I${ZLIB_INCLUDE_DIR} -I${LIBPNG_INCLUDE_DIR}" \ -DCMAKE_INCLUDE_PATH="${LIBPNG_INCLUDE_DIR}:${ZLIB_INCLUDE_DIR}" \ -DCMAKE_LIBRARY_PATH="${LIBPNG_LIBRARY}:${ZLIB_LIBRARY}" \ -DCMAKE_CXX_EXTENSIONS=OFF \ @@ -327,6 +334,8 @@ function build() { -DZLIB_INCLUDE_DIR=${ZLIB_INCLUDE_DIR} \ -DZLIB_INCLUDE_DIRS=${ZLIB_INCLUDE_DIR} \ -DZLIB_LIBRARY=${ZLIB_LIBRARY} \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_INSTALL_PREFIX=Release \ -DCMAKE_INCLUDE_OUTPUT_DIRECTORY=include \ -DCMAKE_INSTALL_INCLUDEDIR=include @@ -381,7 +390,7 @@ function build() { -DANDROID_NDK_ROOT=$ANDROID_NDK_ROOT \ -DURIPARSER_ENABLE_INSTALL=ON \ -DBUILD_SHARED_LIBS=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 -fvisibility-inlines-hidden -std=c++${CPP_STANDARD} -frtti ${FLAG_RELEASE}" \ -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 -fvisibility-inlines-hidden -std=c${C_STANDARD} -Wno-implicit-function-declaration -frtti ${FLAG_RELEASE}" \ diff --git a/apothecary/formulas/glew/glew.sh b/apothecary/formulas/glew/glew.sh index f43a1e554..d5ca4d0dd 100755 --- a/apothecary/formulas/glew/glew.sh +++ b/apothecary/formulas/glew/glew.sh @@ -74,7 +74,7 @@ function build() { -DPLATFORM=$PLATFORM \ -DENABLE_BITCODE=OFF \ -DENABLE_ARC=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_INSTALL_LIBDIR="lib" \ -DCMAKE_INSTALL_PREFIX=Release \ @@ -144,7 +144,7 @@ function build() { -DCMAKE_SYSTEM_PROCESSOR=$ABI \ -DCMAKE_INSTALL_PREFIX=Release \ -DCMAKE_INCLUDE_OUTPUT_DIRECTORY=include \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_INSTALL_INCLUDEDIR=include cmake --build . --target install --config Release -j${PARALLEL_MAKE} diff --git a/apothecary/formulas/glfw.sh b/apothecary/formulas/glfw.sh index b834d12ba..3e1417a02 100755 --- a/apothecary/formulas/glfw.sh +++ b/apothecary/formulas/glfw.sh @@ -77,7 +77,8 @@ function build() { -DCMAKE_CXX_EXTENSIONS=OFF \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_LIBDIR="lib" \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ ${CMAKE_WIN_SDK} \ -A "${PLATFORM}" \ -G "${GENERATOR_NAME}" @@ -104,7 +105,8 @@ function build() { -DCMAKE_C_FLAGS="-fPIC ${FLAG_RELEASE}" \ -DENABLE_ARC=OFF \ -DENABLE_VISIBILITY=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ -DBUILD_SHARED_LIBS=OFF \ -DCMAKE_BUILD_TYPE=Release \ @@ -140,7 +142,8 @@ function build() { -DGCC_VERSION=${GCC_VERSION} \ -DCMAKE_C_FLAGS="-fPIC ${FLAG_RELEASE}" \ -DENABLE_VISIBILITY=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ -DBUILD_SHARED_LIBS=OFF \ -DCMAKE_BUILD_TYPE=Release \ @@ -169,11 +172,13 @@ function build() { -DGLFW_BUILD_EXAMPLES=OFF \ -DBUILD_SHARED_LIBS=OFF \ -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_C_STANDARD=${C_STANDARD} \ -DCMAKE_CXX_STANDARD=${CPP_STANDARD} \ -DCMAKE_CXX_STANDARD_REQUIRED=ON \ -DCMAKE_CXX_EXTENSIONS=OFF \ - $DEFINES + ${DEFINES} make clean make -j${PARALLEL_MAKE} diff --git a/apothecary/formulas/kiss/kiss.sh b/apothecary/formulas/kiss/kiss.sh index d870e0283..df754b1ab 100755 --- a/apothecary/formulas/kiss/kiss.sh +++ b/apothecary/formulas/kiss/kiss.sh @@ -105,7 +105,8 @@ function build() { -DZLIB_INCLUDE_DIRS=${ZLIB_INCLUDE_DIR} \ -DCMAKE_PREFIX_PATH="${LIBS_ROOT}" \ -DCMAKE_INCLUDE_OUTPUT_DIRECTORY=include \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_INSTALL_INCLUDEDIR=include \ -DCMAKE_VERBOSE_MAKEFILE=true @@ -139,7 +140,8 @@ function build() { -DCMAKE_INSTALL_PREFIX=Release \ -DCMAKE_PREFIX_PATH="${LIBS_ROOT}" \ -DCMAKE_INCLUDE_OUTPUT_DIRECTORY=include \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_INSTALL_INCLUDEDIR=include \ -DCMAKE_VERBOSE_MAKEFILE=true diff --git a/apothecary/formulas/libpng/libpng.sh b/apothecary/formulas/libpng/libpng.sh index bb54c0c74..c28e514b5 100755 --- a/apothecary/formulas/libpng/libpng.sh +++ b/apothecary/formulas/libpng/libpng.sh @@ -9,7 +9,7 @@ FORMULA_DEPENDS=("zlib") # define the version MAJOR_VER=16 VER=1.6.43 -BUILD_ID=1 +BUILD_ID=2 DEFINES="" # tools for git use @@ -97,11 +97,12 @@ function build() { -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 ${FLAG_RELEASE}" \ -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 ${FLAG_RELEASE}" \ -DPNG_HARDWARE_OPTIMIZATIONS=ON \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DENABLE_BITCODE=OFF \ -DENABLE_ARC=OFF \ -DENABLE_VISIBILITY=OFF \ - -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE + -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} cmake --build . --config Release -j${PARALLEL_MAKE} --target install cd .. elif [[ "$TYPE" =~ ^(linux)$ ]]; then @@ -134,7 +135,8 @@ function build() { -DPNG_HARDWARE_OPTIMIZATIONS=ON \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 cmake --build . --config Release -j${PARALLEL_MAKE} --target install cd .. elif [ "$TYPE" == "vs" ]; then @@ -150,21 +152,32 @@ function build() { ZLIB_INCLUDE_DIR="$LIBS_ROOT/zlib/include" ZLIB_LIBRARY="$LIBS_ROOT/zlib/lib/$TYPE/$PLATFORM/zlib.lib" - if [ "$PLATFORM" == "ARM64EC" ]; then - HARDWARE_OPTIMIZATIONS="OFF" + HARDWARE_OPTIMIZATIONS=on + # if [ "$PLATFORM" == "ARM64EC" ]; then + # HARDWARE_OPTIMIZATIONS="OFF" + # else + # HARDWARE_OPTIMIZATIONS="ON" + # fi + + if [[ ${ARCH} == "arm64ec" || "${ARCH}" == "arm64" ]]; then + EXTRA_DEFS="-DPNG_ARM_NEON=on" else - HARDWARE_OPTIMIZATIONS="ON" + EXTRA_DEFS="-DPNG_ARM_NEON=off -DPNG_INTEL_SS=on" fi + env CXXFLAGS="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_RELEASE} ${CALLING_CONVENTION}" env CFLAGS="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_RELEASE} ${CALLING_CONVENTION}" cmake .. ${DEFINES} \ + ${EXTRA_DEFS} \ -B . \ -DZLIB_ROOT=${ZLIB_ROOT} \ -DZLIB_LIBRARY=${ZLIB_LIBRARY} \ -DZLIB_INCLUDE_DIR=${ZLIB_INCLUDE_DIR} \ -DZLIB_INCLUDE_DIRS=${ZLIB_INCLUDE_DIR} \ -DPNG_HARDWARE_OPTIMIZATIONS=${HARDWARE_OPTIMIZATIONS} \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_INSTALL_PREFIX=Release \ -DCMAKE_BUILD_TYPE=Release \ -A "${PLATFORM}" \ @@ -204,14 +217,14 @@ function build() { -DANDROID_TOOLCHAIN=clang \ -DANDROID_NDK_ROOT=$ANDROID_NDK_ROOT \ -DBUILD_SHARED_LIBS=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 -fvisibility-inlines-hidden -std=c++${CPP_STANDARD} -frtti ${FLAG_RELEASE}" \ -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 -fvisibility-inlines-hidden -std=c${C_STANDARD} -Wno-implicit-function-declaration -frtti ${FLAG_RELEASE}" \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ -DCMAKE_CXX_EXTENSIONS=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DZLIB_ROOT=${ZLIB_ROOT} \ -DPNG_HARDWARE_OPTIMIZATIONS=OFF \ -DZLIB_LIBRARY=${ZLIB_LIBRARY} \ @@ -243,6 +256,7 @@ function build() { -DCMAKE_C_FLAGS="-std=c${C_STANDARD} ${FLAG_RELEASE}" \ -DCMAKE_CXX_EXTENSIONS=OFF \ -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DZLIB_ROOT=${ZLIB_ROOT} \ -DZLIB_LIBRARY=${ZLIB_LIBRARY} \ -DZLIB_INCLUDE_DIR=${ZLIB_INCLUDE_DIR} \ @@ -268,6 +282,7 @@ function build() { -DCMAKE_C_FLAGS="-std=c${C_STANDARD} ${FLAG_RELEASE}" \ -DCMAKE_CXX_EXTENSIONS=OFF \ -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DZLIB_ROOT=${ZLIB_ROOT} \ -DZLIB_LIBRARY=${ZLIB_LIBRARY} \ -DZLIB_INCLUDE_DIR=${ZLIB_INCLUDE_DIR} \ diff --git a/apothecary/formulas/libssh2.sh b/apothecary/formulas/libssh2.sh index 0fd01eb63..5d15f714a 100755 --- a/apothecary/formulas/libssh2.sh +++ b/apothecary/formulas/libssh2.sh @@ -41,6 +41,8 @@ function build() { cmake .. \ -DCMAKE_C_FLAGS="${DEFINES}" \ -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_INSTALL_PREFIX=Release cmake --build . --config Release -j${PARALLEL_MAKE} --target install diff --git a/apothecary/formulas/libusb/libusb.sh b/apothecary/formulas/libusb/libusb.sh index 71713f2da..b6fa1f450 100755 --- a/apothecary/formulas/libusb/libusb.sh +++ b/apothecary/formulas/libusb/libusb.sh @@ -77,6 +77,8 @@ function build() { -DLIBUSB_BUILD_EXAMPLES=OFF \ -DLIBUSB_INSTALL_TARGETS=ON \ -DLIBUSB_BUILD_SHARED_LIBS=ON \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ ${CMAKE_WIN_SDK} \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ -A "${PLATFORM}" \ @@ -116,7 +118,8 @@ function build() { -DLIBUSB_BUILD_EXAMPLES=OFF \ -DLIBUSB_INSTALL_TARGETS=ON \ -DLIBUSB_BUILD_SHARED_LIBS=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_BUILD_TYPE=Release \ -DDEPLOYMENT_TARGET=${MIN_SDK_VER} \ -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1" \ diff --git a/apothecary/formulas/libxml2/libxml2.sh b/apothecary/formulas/libxml2/libxml2.sh index 1fc047b7e..d3354ffda 100755 --- a/apothecary/formulas/libxml2/libxml2.sh +++ b/apothecary/formulas/libxml2/libxml2.sh @@ -129,6 +129,8 @@ function build() { -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_INSTALL_PREFIX=Debug \ -DCMAKE_INSTALL_LIBDIR="lib" \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ ${CMAKE_WIN_SDK} \ -DCMAKE_PREFIX_PATH="${ZLIB_ROOT}" \ -DZLIB_ROOT=${ZLIB_ROOT} \ @@ -148,6 +150,8 @@ function build() { -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=Release \ -DCMAKE_INSTALL_LIBDIR="lib" \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ ${CMAKE_WIN_SDK} \ -DCMAKE_PREFIX_PATH="${ZLIB_ROOT}" \ -DZLIB_ROOT=${ZLIB_ROOT} \ @@ -190,7 +194,7 @@ function build() { -DANDROID_PLATFORM=${ANDROID_PLATFORM} \ -DCMAKE_INSTALL_PREFIX=Release \ -DCMAKE_INCLUDE_OUTPUT_DIRECTORY=include \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_PREFIX_PATH="${ZLIB_ROOT}" \ -DZLIB_ROOT=${ZLIB_ROOT} \ @@ -223,7 +227,8 @@ function build() { -DENABLE_BITCODE=OFF \ -DENABLE_ARC=OFF \ -DENABLE_VISIBILITY=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_BUILD_TYPE=Release \ -DDEPLOYMENT_TARGET=${MIN_SDK_VER} \ -DCMAKE_C_STANDARD=${C_STANDARD} \ @@ -268,6 +273,8 @@ function build() { -DLIBXML2_WITH_ZLIB=OFF \ -DCMAKE_CXX_EXTENSIONS=OFF \ -DBUILD_SHARED_LIBS=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_CXX_STANDARD_REQUIRED=ON \ -DCMAKE_CXX_EXTENSIONS=OFF \ -DZLIB_ROOT=${ZLIB_ROOT} \ @@ -303,6 +310,8 @@ function build() { -DZLIB_INCLUDE_DIR=${ZLIB_INCLUDE_DIR} \ -DZLIB_LIBRARY=${ZLIB_LIBRARY} \ -DCMAKE_CXX_STANDARD_REQUIRED=ON \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=Release \ -DCMAKE_INSTALL_LIBDIR="lib" \ @@ -350,6 +359,8 @@ function build() { -DCMAKE_INSTALL_INCLUDEDIR=include \ -DCMAKE_SYSTEM_NAME=$TYPE \ -DCMAKE_SYSTEM_PROCESSOR=$ABI \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DLIBXML2_WITH_LZMA=OFF \ -DBUILD_SHARED_LIBS=OFF \ -DLIBXML2_WITH_THREAD_ALLOC=OFF diff --git a/apothecary/formulas/metalangle/metalangle.sh b/apothecary/formulas/metalangle/metalangle.sh index 52a75cf57..0131520e2 100755 --- a/apothecary/formulas/metalangle/metalangle.sh +++ b/apothecary/formulas/metalangle/metalangle.sh @@ -98,7 +98,8 @@ function build() { -DENABLE_ARC=ON \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 cmake --build . --config Release -j${PARALLEL_MAKE} --target install fi diff --git a/apothecary/formulas/opencv/opencv.sh b/apothecary/formulas/opencv/opencv.sh index eecf90db2..5aea75037 100755 --- a/apothecary/formulas/opencv/opencv.sh +++ b/apothecary/formulas/opencv/opencv.sh @@ -10,8 +10,8 @@ FORMULA_TYPES=("osx" "ios" "catos" "xros" "tvos" "vs" "android" "emscripten") FORMULA_DEPENDS=("zlib" "libpng") # define the version -VER=4.10.0 -BUILD_ID=3 +VER=4.11.0 +BUILD_ID=4 DEFINES="" FRAMEWORKS="" @@ -26,15 +26,27 @@ VER_CONTRIB=$VER function download() { . "$DOWNLOADER_SCRIPT" - downloader $GIT_URL/archive/refs/tags/$VER.tar.gz - tar -xzf $VER.tar.gz - mv opencv-$VER opencv - rm $VER.tar.gz - - downloader $GIT_CONTRIB_URL/archive/refs/tags/$VER.tar.gz - tar -xzf $VER.tar.gz - mv opencv_contrib-$VER opencv/opencv_contrib - rm $VER.tar.gz + if [ "$TYPE" == "vs" ]; then + downloader $GIT_URL/archive/refs/tags/$VER.zip + unzip $VER.zip + mv opencv-$VER opencv + rm $VER.zip + + downloader $GIT_CONTRIB_URL/archive/refs/tags/$VER.zip + unzip $VER.zip + mv opencv_contrib-$VER opencv/opencv_contrib + rm $VER.zip + else + downloader $GIT_URL/archive/refs/tags/$VER.tar.gz + tar -xzf $VER.tar.gz + mv opencv-$VER opencv + rm $VER.tar.gz + + downloader $GIT_CONTRIB_URL/archive/refs/tags/$VER.tar.gz + tar -xzf $VER.tar.gz + mv opencv_contrib-$VER opencv/opencv_contrib + rm $VER.tar.gz + fi } # prepare the build environment, executed inside the lib src dir @@ -185,6 +197,7 @@ function build() { -DDEPLOYMENT_TARGET=${MIN_SDK_VER} \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DENABLE_FAST_MATH=OFF \ -DCMAKE_EXE_LINKER_FLAGS="${FRAMEWORKS}" \ -DCMAKE_CXX_FLAGS="-fvisibility-inlines-hidden -stdlib=libc++ -fPIC -DUSE_PTHREADS=1 ${FLAG_RELEASE}" \ @@ -314,9 +327,9 @@ function build() { -DCV_DISABLE_OPTIMIZATION=OFF" if [[ ${ARCH} == "arm64ec" || "${ARCH}" == "arm64" ]]; then - EXTRA_DEFS="-DCV_ENABLE_INTRINSICS=OFF -DBUILD_opencv_rgbd=OFF" + EXTRA_DEFS="-DCV_ENABLE_INTRINSICS=OFF -DBUILD_opencv_rgbd=OFF -DPNG_ARM_NEON=on" else - EXTRA_DEFS="-DCV_ENABLE_INTRINSICS=ON" + EXTRA_DEFS="-DCV_ENABLE_INTRINSICS=ON -DPNG_ARM_NEON=off -DPNG_INTEL_SS=on" fi cmake .. ${DEFINES} \ @@ -330,6 +343,8 @@ function build() { -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_DEBUG} ${EXCEPTION_FLAGS}" \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ -D BUILD_SHARED_LIBS=ON \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_SYSTEM_PROCESSOR="${PLATFORM}" \ ${EXTRA_DEFS} \ ${CMAKE_WIN_SDK} \ @@ -364,6 +379,8 @@ function build() { -DPNG_PNG_INCLUDE_DIR=${LIBPNG_INCLUDE_DIR} \ -DPNG_LIBRARY=${LIBPNG_LIBRARY} \ -DBUILD_WITH_STATIC_CRT=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ ${CMAKE_WIN_SDK} cmake --build . --target install --config Release -j${PARALLEL_MAKE} cd .. @@ -485,6 +502,8 @@ function build() { -DENABLE_NEON=ON \ -DENABLE_VFPV3=ON \ ${EXTRA_DEFS} \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DBUILD_TESTS=OFF \ -DANDROID_NDK=${NDK_ROOT} \ -DCMAKE_BUILD_TYPE=Release \ @@ -636,6 +655,7 @@ function build() { -DWASM=ON \ -DBUILD_TESTS=OFF \ -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCV_ENABLE_INTRINSICS=OFF \ -DBUILD_WASM_INTRIN_TESTS=OFF \ -DBUILD_PERF_TESTS=OFF \ diff --git a/apothecary/formulas/openssl/openssl.sh b/apothecary/formulas/openssl/openssl.sh index f2f0b13f7..5f57b253b 100755 --- a/apothecary/formulas/openssl/openssl.sh +++ b/apothecary/formulas/openssl/openssl.sh @@ -154,7 +154,7 @@ function build() { -DENABLE_BITCODE=OFF \ -DCMAKE_MACOSX_BUNDLE=OFF \ -DENABLE_ARC=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DENABLE_VISIBILITY=OFF cmake --build . --config Release -j${PARALLEL_MAKE} --target install cd .. diff --git a/apothecary/formulas/poco/poco.sh b/apothecary/formulas/poco/poco.sh index e68456f8f..4b115be93 100755 --- a/apothecary/formulas/poco/poco.sh +++ b/apothecary/formulas/poco/poco.sh @@ -150,7 +150,8 @@ function build() { -DENABLE_ARC=OFF \ -DENABLE_VISIBILITY=OFF \ -DDEPLOYMENT_TARGET=${MIN_SDK_VER} \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1" \ -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1" \ @@ -221,6 +222,8 @@ function build() { -DZLIB_INCLUDE_DIR=${ZLIB_INCLUDE_DIR} \ -DZLIB_LIBRARY=${ZLIB_LIBRARY} \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ ${CMAKE_WIN_SDK} \ -DOPENSSL_USE_STATIC_LIBS=YES \ -DOPENSSL_ROOT_DIR="$OF_LIBS_OPENSSL_ABS_PATH" \ @@ -271,7 +274,8 @@ function build() { -DCMAKE_TOOLCHAIN_FILE=$APOTHECARY_DIR/toolchains/ios.toolchain.cmake \ -DPLATFORM=$PLATFORM \ -DENABLE_VISIBILITY=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 ${FLAG_RELEASE} " \ -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 ${FLAG_RELEASE} " \ diff --git a/apothecary/formulas/pugixml.sh b/apothecary/formulas/pugixml.sh index 5257ca6b3..b43d4da23 100755 --- a/apothecary/formulas/pugixml.sh +++ b/apothecary/formulas/pugixml.sh @@ -93,6 +93,8 @@ function build() { -DSTATIC_CRT=OFF \ -DBUILD_TESTS=OFF \ -DCMAKE_INSTALL_PREFIX=Release \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ ${CMAKE_WIN_SDK} \ -DCMAKE_BUILD_TYPE=Release \ -A "${PLATFORM}" \ @@ -107,6 +109,8 @@ function build() { -DCMAKE_C_FLAGS_DEBUG="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_DEBUG} ${EXCEPTION_FLAGS}" \ -DSTATIC_CRT=OFF \ -DBUILD_TESTS=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ ${CMAKE_WIN_SDK} \ -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_INSTALL_PREFIX=Debug \ @@ -136,7 +140,8 @@ function build() { -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 -fvisibility-inlines-hidden -std=c${C_STANDARD} -Wno-implicit-function-declaration -frtti ${FLAG_RELEASE}" \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=Release \ -DCMAKE_INCLUDE_OUTPUT_DIRECTORY=include \ @@ -155,7 +160,8 @@ function build() { -DENABLE_ARC=OFF \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DBUILD_SHARED_LIBS=OFF \ -DCMAKE_BUILD_TYPE=Release \ -DDEPLOYMENT_TARGET=${MIN_SDK_VER} \ diff --git a/apothecary/formulas/rtAudio/rtAudio.sh b/apothecary/formulas/rtAudio/rtAudio.sh index 5c1f70aba..f952a4e81 100755 --- a/apothecary/formulas/rtAudio/rtAudio.sh +++ b/apothecary/formulas/rtAudio/rtAudio.sh @@ -69,7 +69,8 @@ function build() { -DENABLE_BITCODE=OFF \ -DENABLE_ARC=OFF \ -DENABLE_VISIBILITY=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DBUILD_SHARED_LIBS=OFF \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_CXX_FLAGS="-fPIC -DUSE_PTHREADS=1" \ @@ -110,6 +111,8 @@ function build() { -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_LIBDIR="lib" \ -DCMAKE_INSTALL_PREFIX=Release \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DRTAUDIO_BUILD_SHARED_LIBS=OFF \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ ${CMAKE_WIN_SDK} \ @@ -123,6 +126,8 @@ function build() { -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${EXCEPTION_FLAGS}" \ -DCMAKE_CXX_FLAGS_DEBUG="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_DEBUG} ${EXCEPTION_FLAGS}" \ -DCMAKE_BUILD_TYPE=Debug \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_INSTALL_LIBDIR="lib" \ -DCMAKE_INSTALL_PREFIX=Debug \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ @@ -167,7 +172,8 @@ function build() { -DBUILD_SHARED_LIBS=OFF \ -DCMAKE_INSTALL_PREFIX=Release \ -DCMAKE_INCLUDE_OUTPUT_DIRECTORY=include \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_INSTALL_INCLUDEDIR=include cmake --build . --target install --config Release -j${PARALLEL_MAKE} diff --git a/apothecary/formulas/shaderc.sh b/apothecary/formulas/shaderc.sh index e80e2602b..8cd84630c 100755 --- a/apothecary/formulas/shaderc.sh +++ b/apothecary/formulas/shaderc.sh @@ -82,7 +82,9 @@ function build() { -DCMAKE_CXX_STANDARD_REQUIRED=ON \ -DCMAKE_CXX_EXTENSIONS=OFF \ -DBUILD_SHARED_LIBS=ON \ - -Dgtest_disable_pthreads=ON -DSHADERC_SKIP_TESTS=ON -DSHADERC_ENABLE_SHARED_CRT=ON" + -Dgtest_disable_pthreads=ON \ + -DSHADERC_SKIP_TESTS=ON \ + -DSHADERC_ENABLE_SHARED_CRT=ON" cmake .. ${DEFS} \ -A "${PLATFORM}" \ @@ -91,6 +93,8 @@ function build() { -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=Release \ -DCMAKE_INSTALL_LIBDIR="lib" \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_RELEASE}" \ -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_RELEASE} " \ -DCMAKE_CXX_FLAGS_RELEASE="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_RELEASE} ${EXCEPTION_FLAGS}" \ @@ -109,9 +113,23 @@ function build() { mkdir -p build cd build - cmake .. -Dgtest_disable_pthreads=ON -DSHADERC_SKIP_TESTS=ON -DSHADERC_ENABLE_SHARED_CRT=ON - #cmake --build . --config Debug -j${PARALLEL_MAKE} -- -j$PARALLEL_MAKE - cmake --build . --config Release -j${PARALLEL_MAKE} -- -j$PARALLEL_MAKE + DEFS=" + -DCMAKE_C_STANDARD=${C_STANDARD} \ + -DCMAKE_CXX_STANDARD=${CPP_STANDARD} \ + -DCMAKE_CXX_STANDARD_REQUIRED=ON \ + -DCMAKE_CXX_EXTENSIONS=OFF \ + -DBUILD_SHARED_LIBS=ON \ + -Dgtest_disable_pthreads=ON \ + -DSHADERC_SKIP_TESTS=ON" + + cmake ..${DEFS} \ + -A "${PLATFORM}" \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ + -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 ${FLAG_RELEASE}" \ + -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 ${FLAG_RELEASE} " \ + -DCMAKE_PREFIX_PATH="${LIBS_ROOT}" + cmake --build . --config Release -j${PARALLEL_MAKE} fi } diff --git a/apothecary/formulas/svgtiny/svgtiny.sh b/apothecary/formulas/svgtiny/svgtiny.sh index 8d1e84969..61ad3bdf0 100755 --- a/apothecary/formulas/svgtiny/svgtiny.sh +++ b/apothecary/formulas/svgtiny/svgtiny.sh @@ -116,6 +116,8 @@ function build() { -DCMAKE_SYSTEM_NAME=$TYPE \ -DCMAKE_SYSTEM_PROCESSOR=$ABI \ -DLIBXML2_ROOT=$LIBXML2_ROOT \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DLIBXML2_INCLUDE_DIR=$LIBXML2_INCLUDE_DIR \ -DLIBXML2_LIBRARY=$LIBXML2_LIBRARY cmake --build . --config Release -j${PARALLEL_MAKE} @@ -157,13 +159,15 @@ function build() { -DSKIP_EXAMPLE=1 \ -DGCC_VERSION=${GCC_VERSION} \ -DCMAKE_TOOLCHAIN_FILE=$APOTHECARY_DIR/toolchains/${TYPE}${PLATFORM}.toolchain.cmake \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_SYSTEM_NAME=$TYPE \ -DCMAKE_SYSTEM_PROCESSOR=$ABI \ -DLIBXML2_ROOT=${LIBXML2_ROOT} \ -DLIBXML2_INCLUDE_DIR=${LIBXML2_INCLUDE_DIR} \ -DLIBXML2_LIBRARY=${LIBXML2_LIBRARY} \ -DCMAKE_PREFIX_PATH="${LIBS_ROOT}" \ - -D CMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ + -DCMAKE_VERBOSE_MAKEFILE=ON \ -DBUILD_SHARED_LIBS=OFF cmake --build . --config Release -j${PARALLEL_MAKE} cd .. @@ -206,6 +210,8 @@ function build() { -DLIBXML2_LIBRARY=$LIBXML2_LIBRARY \ -DCMAKE_PREFIX_PATH="${ZLIB_ROOT} ${LIBXML2_ROOT}" \ -D CMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=. \ -A "${PLATFORM}" \ @@ -227,6 +233,8 @@ function build() { -DLIBXML2_LIBRARY=$LIBXML2_LIBRARY \ -DCMAKE_PREFIX_PATH="${ZLIB_ROOT} ${LIBXML2_ROOT}" \ -D CMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_INSTALL_PREFIX=. \ -A "${PLATFORM}" \ @@ -268,7 +276,7 @@ function build() { -DANDROID_NDK_ROOT=$ANDROID_NDK_ROOT \ -DDO_XML_INSTALL=ON \ -DBUILD_SHARED_LIBS=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_PREFIX_PATH="${LIBS_ROOT}" \ -DLIBXML2_ROOT=$LIBXML2_ROOT \ @@ -328,7 +336,8 @@ function build() { -DPLATFORM=$PLATFORM \ -DENABLE_BITCODE=OFF \ -DENABLE_ARC=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DENABLE_VISIBILITY=OFF cmake --build . --config Release -j${PARALLEL_MAKE} @@ -365,6 +374,8 @@ function build() { -DCMAKE_INSTALL_INCLUDEDIR=include \ -DCMAKE_PREFIX_PATH="${LIBS_ROOT}" \ -DLIBXML2_ROOT=$LIBXML2_ROOT \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DUSE_XML2=ON \ -DLIBXML2_INCLUDE_DIR=$LIBXML2_INCLUDE_DIR \ -DLIBXML2_LIBRARY=$LIBXML2_LIBRARY diff --git a/apothecary/formulas/tess2/tess2.sh b/apothecary/formulas/tess2/tess2.sh index befd936e6..3dd46ee33 100755 --- a/apothecary/formulas/tess2/tess2.sh +++ b/apothecary/formulas/tess2/tess2.sh @@ -73,7 +73,7 @@ function build() { -DENABLE_ARC=OFF \ -DENABLE_VISIBILITY=OFF \ -DDEPLOYMENT_TARGET=${MIN_SDK_VER} \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DCMAKE_CXX_FLAGS_RELEASE="-DUSE_PTHREADS=1 ${FLAG_RELEASE} " \ -DCMAKE_C_FLAGS_RELEASE="-DUSE_PTHREADS=1 ${FLAG_RELEASE} " \ -DBUILD_SHARED_LIBS=OFF \ @@ -130,7 +130,7 @@ function build() { -DANDROID_TOOLCHAIN=clang \ -DANDROID_NDK_ROOT=$ANDROID_NDK_ROOT \ -DBUILD_SHARED_LIBS=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 -fvisibility-inlines-hidden -std=c++${CPP_STANDARD} -frtti ${FLAG_RELEASE}" \ -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 -fvisibility-inlines-hidden -std=c${C_STANDARD} -Wno-implicit-function-declaration -frtti ${FLAG_RELEASE}" \ @@ -178,11 +178,11 @@ function build() { cmake .. ${DEFINES} \ -DCMAKE_INSTALL_PREFIX=Release \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 -fvisibility-inlines-hidden -std=c++${CPP_STANDARD} -frtti ${FLAG_RELEASE}" \ -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 -fvisibility-inlines-hidden -std=c${C_STANDARD} -Wno-implicit-function-declaration -frtti ${FLAG_RELEASE}" \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DCMAKE_INSTALL_INCLUDEDIR=include \ -DCMAKE_INSTALL_LIBDIR="lib" \ -DCMAKE_VERBOSE_MAKEFILE=TRUE @@ -218,7 +218,7 @@ function build() { -DCMAKE_SYSTEM_PROCESSOR=$ABI \ -DGCC_VERSION=${GCC_VERSION} \ -DCMAKE_TOOLCHAIN_FILE=$APOTHECARY_DIR/toolchains/${TYPE}${PLATFORM}.toolchain.cmake \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_INSTALL_INCLUDEDIR=include \ -DCMAKE_VERBOSE_MAKEFILE=TRUE diff --git a/apothecary/formulas/uriparser/uriparser.sh b/apothecary/formulas/uriparser/uriparser.sh index ed140904a..c581433a8 100755 --- a/apothecary/formulas/uriparser/uriparser.sh +++ b/apothecary/formulas/uriparser/uriparser.sh @@ -43,6 +43,8 @@ function build() { -DURIPARSER_BUILD_TOOLS=OFF \ -DURIPARSER_BUILD_WCHAR_T=ON \ -DURIPARSER_SHARED_LIBS=OFF \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DDBUILD_SHARED_LIBS=OFF \ -DURIPARSER_BUILD_CHAR=ON \ -DURIPARSER_ENABLE_INSTALL=OFF \ @@ -92,7 +94,7 @@ function build() { -DANDROID_NDK_ROOT=$ANDROID_NDK_ROOT \ -DURIPARSER_ENABLE_INSTALL=ON \ -DBUILD_SHARED_LIBS=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 -fvisibility-inlines-hidden -std=c++${CPP_STANDARD} -frtti ${FLAG_RELEASE}" \ -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 -fvisibility-inlines-hidden -std=c${C_STANDARD} -Wno-implicit-function-declaration -frtti ${FLAG_RELEASE}" \ @@ -124,7 +126,7 @@ function build() { -DENABLE_BITCODE=OFF \ -DENABLE_ARC=OFF \ -DHAVE_REALLOCARRAY=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DENABLE_VISIBILITY=OFF \ -DBUILD_SHARED_LIBS=OFF \ -DCMAKE_INCLUDE_OUTPUT_DIRECTORY=include \ diff --git a/apothecary/formulas/videoInput.sh b/apothecary/formulas/videoInput.sh index 26cd1be4a..8f1c1d12a 100755 --- a/apothecary/formulas/videoInput.sh +++ b/apothecary/formulas/videoInput.sh @@ -66,6 +66,8 @@ function build() { -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_RELEASE}" \ -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_RELEASE} " \ -DCMAKE_INSTALL_PREFIX=Release \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} cmake --build . --config Release -j${PARALLEL_MAKE} @@ -80,6 +82,8 @@ function build() { -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_DEBUG}" \ -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_DEBUG} " \ -DCMAKE_INSTALL_PREFIX=Debug \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} cmake --build . --config Debug -j${PARALLEL_MAKE} @@ -107,6 +111,8 @@ function build() { -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 -Iinclude ${FLAG_RELEASE}" \ -DCMAKE_VERBOSE_MAKEFILE=${VERBOSE_MAKEFILE} \ -DCMAKE_SYSTEM_NAME=MSYS \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_SYSTEM_PROCESSOR=${ARCH} cmake --build . --config Release -j${PARALLEL_MAKE} diff --git a/apothecary/formulas/zlib/zlib.sh b/apothecary/formulas/zlib/zlib.sh index 2f6253ad3..665d3238a 100755 --- a/apothecary/formulas/zlib/zlib.sh +++ b/apothecary/formulas/zlib/zlib.sh @@ -62,6 +62,8 @@ function build() { -DCMAKE_INSTALL_PREFIX=Release \ -DCMAKE_INCLUDE_OUTPUT_DIRECTORY=include \ -DCMAKE_INSTALL_INCLUDEDIR=include \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -UCMAKE_CXX_FLAGS \ -DCMAKE_CXX_FLAGS="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_RELEASE} ${EXCEPTION_FLAGS}" \ -DCMAKE_C_FLAGS="-DUSE_PTHREADS=1 ${VS_C_FLAGS} ${FLAGS_RELEASE} ${EXCEPTION_FLAGS}" \ @@ -93,7 +95,8 @@ function build() { -DPLATFORM=$PLATFORM \ -DENABLE_BITCODE=OFF \ -DENABLE_ARC=OFF \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DENABLE_VISIBILITY=OFF cmake --build . --config Release -j${PARALLEL_MAKE} --target install @@ -128,7 +131,8 @@ function build() { -DCMAKE_INCLUDE_OUTPUT_DIRECTORY=include \ -DCMAKE_INSTALL_INCLUDEDIR=include \ -DCMAKE_VERBOSE_MAKEFILE=ON \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 cmake --build . --config Release -j${PARALLEL_MAKE} --target install cd .. elif [ "$TYPE" == "emscripten" ]; then @@ -144,6 +148,7 @@ function build() { -DZLIB_BUILD_EXAMPLES=OFF \ -DSKIP_EXAMPLE=ON \ -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DCMAKE_C_STANDARD=${C_STANDARD} \ -DCMAKE_CXX_STANDARD=${CPP_STANDARD} \ -DCMAKE_CXX_STANDARD_REQUIRED=ON \ @@ -187,7 +192,8 @@ function build() { -DCMAKE_SYSTEM_PROCESSOR=$ARCH \ -DCMAKE_INSTALL_PREFIX=Release \ -DCMAKE_INCLUDE_OUTPUT_DIRECTORY=include \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ + -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_INSTALL_INCLUDEDIR=include cmake --build . --target install --config Release -j${PARALLEL_MAKE} @@ -220,7 +226,7 @@ function build() { -DSKIP_EXAMPLE=ON \ -DCMAKE_INSTALL_PREFIX=Release \ -DCMAKE_INCLUDE_OUTPUT_DIRECTORY=include \ - -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DCMAKE_MINIMUM_REQUIRED_VERSION=3.22 \ -DENABLE_VISIBILITY=OFF \ -DCMAKE_INSTALL_INCLUDEDIR=include diff --git a/apothecary/toolchains/linuxaarch64.toolchain.cmake b/apothecary/toolchains/linuxaarch64.toolchain.cmake index db0b00bc7..ba13f987d 100644 --- a/apothecary/toolchains/linuxaarch64.toolchain.cmake +++ b/apothecary/toolchains/linuxaarch64.toolchain.cmake @@ -44,6 +44,36 @@ if(NOT DEFINED SYSROOT) endif() endif() + +if(NOT DEFINED SYSROOT) + if(DEFINED ENV{SYSROOT}) + set(SYSROOT $ENV{SYSROOT}) + else() + if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") + set(SYSROOT "/") # Use native root + message(STATUS "Host is AArch64. Using native SYSROOT=${SYSROOT}") + else() + set(SYSROOT "/rpi-arm64-rootfs") # Use cross-compilation root + message(WARNING "SYSROOT not specified. Defaulting to SYSROOT=${SYSROOT} for cross-compilation") + endif() + endif() +endif() + +# Set TOOLCHAIN_ROOT +if(NOT DEFINED TOOLCHAIN_ROOT) + if(DEFINED ENV{TOOLCHAIN_ROOT}) + set(TOOLCHAIN_ROOT $ENV{TOOLCHAIN_ROOT}) + else() + if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") + set(TOOLCHAIN_ROOT "/usr") # Native AArch64 toolchain + message(STATUS "Host is AArch64. Using native TOOLCHAIN_ROOT=${TOOLCHAIN_ROOT}") + else() + set(TOOLCHAIN_ROOT "/usr/aarch64-linux-gnu/") # Cross-compilation toolchain + message(WARNING "TOOLCHAIN_ROOT not specified. Defaulting to TOOLCHAIN_ROOT=${TOOLCHAIN_ROOT} for cross-compilation") + endif() + endif() +endif() + set(tools ${TOOLCHAIN_ROOT}) # warning change toolchain path here. set(rootfs_dir ${SYSROOT}/rootfs) # warning change compiled rootfs path here. diff --git a/apothecary/toolchains/linuxarm64.toolchain.cmake b/apothecary/toolchains/linuxarm64.toolchain.cmake index 0af3d485b..704e6534e 100644 --- a/apothecary/toolchains/linuxarm64.toolchain.cmake +++ b/apothecary/toolchains/linuxarm64.toolchain.cmake @@ -30,8 +30,13 @@ if(NOT DEFINED SYSROOT) if(DEFINED ENV{SYSROOT}) set(SYSROOT $ENV{SYSROOT}) else() - set(SYSROOT "/usr/aarch64-linux-gnu") - message(WARNING "SYSROOT not specified. Defaulting to SYSROOT=${SYSROOT}") + if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") + set(SYSROOT "/") # Use native root + message(STATUS "Host is AArch64. Using native SYSROOT=${SYSROOT}") + else() + set(SYSROOT "/arm64-rootfs") # Use cross-compilation root + message(WARNING "SYSROOT not specified. Defaulting to SYSROOT=${SYSROOT} for cross-compilation") + endif() endif() endif() @@ -40,8 +45,13 @@ if(NOT DEFINED TOOLCHAIN_ROOT) if(DEFINED ENV{TOOLCHAIN_ROOT}) set(TOOLCHAIN_ROOT $ENV{TOOLCHAIN_ROOT}) else() - set(TOOLCHAIN_ROOT "/usr") - message(WARNING "TOOLCHAIN_ROOT not specified. Defaulting to TOOLCHAIN_ROOT=${TOOLCHAIN_ROOT}") + if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") + set(TOOLCHAIN_ROOT "/usr") # Native AArch64 toolchain + message(STATUS "Host is AArch64. Using native TOOLCHAIN_ROOT=${TOOLCHAIN_ROOT}") + else() + set(TOOLCHAIN_ROOT "/usr/aarch64-linux-gnu/") # Cross-compilation toolchain + message(WARNING "TOOLCHAIN_ROOT not specified. Defaulting to TOOLCHAIN_ROOT=${TOOLCHAIN_ROOT} for cross-compilation") + endif() endif() endif() @@ -50,7 +60,11 @@ if(NOT DEFINED GCC_PATH) if(DEFINED ENV{GCC_PATH}) set(GCC_PATH $ENV{GCC_PATH}) # Use GCC_PATH from env else() - set(GCC_PATH "/usr/bin") + if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") + set(GCC_PATH "/usr/bin") # Native AArch64 GCC + else() + set(GCC_PATH "/usr/bin/aarch64-linux-gnu") # Cross-compilation GCC + endif() message(WARNING "GCC_PATH not specified. Defaulting to GCC_PATH=${GCC_PATH}") endif() endif() @@ -126,6 +140,20 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CFLAGS} -fPIC -O3 -Wall -Wextra -std=c set(CMAKE_EXE_LINKER_FLAGS "-fPIE -pie ${EXTRA_LINKS}") set(CMAKE_SHARED_LINKER_FLAGS "-shared -fPIC ${EXTRA_LINKS}") +set(OPENGL_FOUND TRUE) +set(OPENGL_gl_LIBRARY "/usr/lib/aarch64-linux-gnu/libGL.so") +set(OPENGL_opengl_LIBRARY "/usr/lib/aarch64-linux-gnu/libGL.so") +set(OPENGL_glx_LIBRARY "/usr/lib/aarch64-linux-gnu/libGLX.so") +set(GLES_LIBRARY "/usr/lib/aarch64-linux-gnu/libGLESv2.so") +set(EGL_LIBRARY "/usr/lib/aarch64-linux-gnu/libEGL.so") + +set(X11_INCLUDE_DIR "/usr/aarch64-linux-gnu/include") +set(X11_X11_LIB "/usr/aarch64-linux-gnu/lib/libX11.so") +set(X11_Xext_LIB "/usr/aarch64-linux-gnu/lib/libXext.so") +set(X11_Xrandr_LIB "/usr/aarch64-linux-gnu/lib/libXrandr.so") +set(X11_Xinerama_LIB "/usr/aarch64-linux-gnu/lib/libXinerama.so") +set(X11_Xcursor_LIB "/usr/aarch64-linux-gnu/lib/libXcursor.so") + message(STATUS "Using GCC Version: ${GCC_VERSION}") message(STATUS "C Compiler: ${CMAKE_C_COMPILER}") diff --git a/apothecary/toolchains/windows.llvm.toolchain.cmake b/apothecary/toolchains/windows.llvm.toolchain.cmake new file mode 100644 index 000000000..3cf89070f --- /dev/null +++ b/apothecary/toolchains/windows.llvm.toolchain.cmake @@ -0,0 +1,73 @@ + +# Target System +set(CMAKE_SYSTEM_NAME Windows) # We are targeting Windows +#set(CMAKE_SYSTEM_PROCESSOR x86_64) # 64-bit system +set(CMAKE_VERBOSE_MAKEFILE ON) + +# Detect Clang Version from Environment +if(NOT DEFINED CLANG_VERSION) + if(DEFINED ENV{CLANG_VERSION}) + set(CLANG_VERSION $ENV{CLANG_VERSION}) + else() + set(CLANG_VERSION 18) # Default to Clang 18 + message(WARNING "CLANG_VERSION not specified. Defaulting to CLANG_VERSION=${CLANG_VERSION}") + endif() +endif() + +# Clang Path +if(NOT DEFINED CLANG_PATH) + if(DEFINED ENV{CLANG_PATH}) + set(CLANG_PATH $ENV{CLANG_PATH}) + else() + # Default Clang Path for MSVC Toolchain + set(CLANG_PATH "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Tools/Llvm/x64/bin") + endif() +endif() + +# Define C and C++ Standards +if(NOT DEFINED C_STANDARD) + set(C_STANDARD 17 CACHE STRING "" FORCE) # Default to C17 +endif() +if(NOT DEFINED CPP_STANDARD) + set(CPP_STANDARD 17 CACHE STRING "" FORCE) # Default to C++17 +endif() + +set(CMAKE_C_STANDARD ${C_STANDARD} CACHE STRING "" FORCE) +set(CMAKE_C_STANDARD_REQUIRED ON) +set(CMAKE_CXX_STANDARD ${CPP_STANDARD} CACHE STRING "" FORCE) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# Compiler and Linker Paths +set(CMAKE_C_COMPILER "${CLANG_PATH}/clang-cl.exe") +set(CMAKE_CXX_COMPILER "${CLANG_PATH}/clang-cl.exe") +set(CMAKE_RC_COMPILER "rc") + +# Ensure correct system paths for MSVC headers/libs +set(VS_INCLUDE_PATH "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Tools/MSVC/14.36.32532/include") +set(VS_LIB_PATH "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Tools/MSVC/14.36.32532/lib/x64") + +set(WINDOWS_SDK_PATH "C:/Program Files (x86)/Windows Kits/10") +set(WINDOWS_SDK_INCLUDE "${WINDOWS_SDK_PATH}/Include/10.0.22621.0") +set(WINDOWS_SDK_LIB "${WINDOWS_SDK_PATH}/Lib/10.0.22621.0") + +include_directories(${VS_INCLUDE_PATH} ${WINDOWS_SDK_INCLUDE}/um ${WINDOWS_SDK_INCLUDE}/ucrt) +link_directories(${VS_LIB_PATH} ${WINDOWS_SDK_LIB}/um/x64 ${WINDOWS_SDK_LIB}/ucrt/x64) + +# Clang Compiler and Linker Flags +set(CMAKE_C_FLAGS "/O2 /EHsc /DUNICODE /D_UNICODE /Wno-error") +set(CMAKE_CXX_FLAGS "/O2 /EHsc /DUNICODE /D_UNICODE /Wno-error -std:c++${CPP_STANDARD}") +set(CMAKE_EXE_LINKER_FLAGS "/LTCG /OPT:REF /OPT:ICF") +set(CMAKE_SHARED_LINKER_FLAGS "/DLL") + +# Validate Clang Installation +message(STATUS "Using Clang Version: ${CLANG_VERSION}") +message(STATUS "C Compiler: ${CMAKE_C_COMPILER}") +message(STATUS "C++ Compiler: ${CMAKE_CXX_COMPILER}") + +# Check Compiler Existence +if(NOT EXISTS ${CMAKE_C_COMPILER}) + message(WARNING "C Compiler not found: ${CMAKE_C_COMPILER}") +endif() +if(NOT EXISTS ${CMAKE_CXX_COMPILER}) + message(WARNING "C++ Compiler not found: ${CMAKE_CXX_COMPILER}") +endif() diff --git a/scripts/calculate_formulas.sh b/scripts/calculate_formulas.sh index 3c6c7d0c1..7c4fedb83 100755 --- a/scripts/calculate_formulas.sh +++ b/scripts/calculate_formulas.sh @@ -55,6 +55,7 @@ if [[ "$TARGET" =~ ^(linux)$ ]]; then "libpng" "glew" "glfw" + "freetype" "libxml2" "svgtiny" "tess2" @@ -233,46 +234,9 @@ array_contains() { return $in } -# If commit contains [build_only:formula1 formula2] only those formulas will be built -# this will only work on a pull request, not when commiting to master -if [[ ! -z "${APPVEYOR+x}" && "${APPVEYOR_REPO_NAME}" != "openframeworks/apothecary" ]]; then - echo ${APPVEYOR_REPO_NAME} -fi -if [[ ! -z "${TRAVIS_BRANCH+x}" && "$TRAVIS_BRANCH" != "master" && "$TRAVIS_PULL_REQUEST" != "false" ]] || [[ ! -z "${APPVEYOR+x}" && "${APPVEYOR_REPO_NAME}" != "openframeworks/apothecary" ]]; then - echo "DETECTED PULL REQUEST OR NOT MASTER BRANCH, CHECKING FILTERS" - COMMIT_MESSAGE="$(git log --no-decorate -n1 --no-merges)" - echo "COMMIT_MESSAGE $COMMIT_MESSAGE" - FORMULAS_FROM_COMMIT=($(echo $COMMIT_MESSAGE | sed -n "s/.*\[build_only:\([^]]*\)\]/\1/p" | sed "s/\[.*\]//g")) - PLATFORMS_FROM_COMMIT=($(echo $COMMIT_MESSAGE | sed -n "s/.*\[platforms_only:\([^]]*\)\]/\1/p" | sed "s/\[.*\]//g")) -fi - -echo "FORMULAS_FROM_COMMIT: $FORMULAS_FROM_COMMIT" -if [ ! -z "$FORMULAS_FROM_COMMIT" ]; then - FILTERED_FORMULAS=() - for formula in $FORMULAS_FROM_COMMIT; do - if [[ " ${FORMULAS[*]} " == *" $formula "* ]]; then - FILTERED_FORMULAS+=($formula) - fi - # array_contains $FORMULAS $formula && FILTERED_FORMULAS+=($formula) - done - echo "FILTERED_FORMULAS: $FILTERED_FORMULAS" - FORMULAS=(${FILTERED_FORMULAS}) -fi - echo "FORMULAS: ${FORMULAS[@]}" - if [ -z ${FORMULAS} ]; then echo "No formulas to build, failing" exit 1 fi -echo "PLATFORMS_FROM_COMMIT: $PLATFORMS_FROM_COMMIT" -if [ ! -z "$PLATFORMS_FROM_COMMIT" ]; then - if [[ " ${PLATFORMS_FROM_COMMIT[*]} " == *" $TARGET "* ]]; then - echo "Platform $TARGET allowed in commit message" - exit 0 - else - echo "Platform $TARGET NOT allowed in commit message" - exit 1 - fi -fi diff --git a/scripts/downloader.sh b/scripts/downloader.sh index 780ed0738..283cdc481 100755 --- a/scripts/downloader.sh +++ b/scripts/downloader.sh @@ -86,12 +86,12 @@ check_remote_vs_local() { REMOTE_CALL="" headers=$(curl -L -I --retry ${RETRY_MAX} --max-redirs ${MAX_REDIRECTS} ${EXTRA_ARGS} --retry-connrefused --silent --head $REMOTE_URL) RemoteSize=$(echo "$headers" | grep -i "content-length" | cut -d ' ' -f2 | tr -d '\r' | tail -n 1) - modified=$(echo "$headers" | grep -i "last-modified" | sed -E 's/[lL]ast-[mM]odified: //g' | tail -n 1) + modified=$(echo "$headers" | grep -i "last-modified" | sed -E 's/[lL]ast-[mM]odified: //g' | tail -n 1 || echo "Unknown") LocalSizeMB=$(convert_bytes_to_mb $LocalSize) RemoteSizeMB=$(convert_bytes_to_mb $RemoteSize) echo " [downloader] Remote size:[${RemoteSizeMB}] | Local size:[${LocalSizeMB}]" - if [ -z "$modified" ]; then + if [ -z "$modified" ] || [[ "$modified" == "Unknown" ]]; then echo " [downloader] failed to retrieve last-modified header from remote ["$REMOTE_URL"] ... Proceeding with download" CHECK_RESULT=0 rm -f $LOCAL_FILE diff --git a/scripts/linux/arm64/build.sh b/scripts/linux/arm64/build.sh index 4234c28e6..8979fe83b 100755 --- a/scripts/linux/arm64/build.sh +++ b/scripts/linux/arm64/build.sh @@ -6,7 +6,7 @@ trap "trapError" ERR SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd $SCRIPT_DIR -APOTHECARY_LEVEL="$(cd "$SCRIPT_DIR/../.." && pwd)" +APOTHECARY_LEVEL="$(cd "$SCRIPT_DIR/../../.." && pwd)" cd $APOTHECARY_LEVEL trapError() { diff --git a/scripts/linux/arm64/install.sh b/scripts/linux/arm64/install.sh deleted file mode 100755 index 635cfa92a..000000000 --- a/scripts/linux/arm64/install.sh +++ /dev/null @@ -1,146 +0,0 @@ -#!/usr/bin/env bash -set -e - -# trap any script errors and exit -trap "trapError" ERR - -trapError() { - echo - echo " ^ Received error ^" - exit 1 -} - -isRunning() { - if [ “$(uname)” == “Linux” ]; then - if [ -d /proc/$1 ]; then - return 0 - else - return 1 - fi - else - number=$(ps aux | sed -E "s/[^ ]* +([^ ]*).*/\1/g" | grep ^$1$ | wc -l) - - if [ $number -gt 0 ]; then - return 0 - else - return 1 - fi - fi -} - -echoDots() { - while isRunning $1; do - for i in $(seq 1 10); do - echo -ne . - if ! isRunning $1; then - printf "\r" - return - fi - sleep 2 - done - printf "\r " - printf "\r" - done -} - -echo "GCC Version: [$GCC]" - -if [[ "$GCC" =~ ^gcc(8|9|10|11|12|13)$ ]]; then - GCC_VERSION=${BASH_REMATCH[1]} - sudo apt update - sudo apt install software-properties-common - sudo add-apt-repository ppa:ubuntu-toolchain-r/test - sudo apt update - sudo apt install -y --allow-unauthenticated gcc-${GCC_VERSION} g++-${GCC_VERSION} - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${GCC_VERSION} ${GCC_VERSION} \ - --slave /usr/bin/g++ g++ /usr/bin/g++-${GCC_VERSION} - sudo apt-get install -y gperf coreutils libxrandr-dev libxinerama-dev libx11-dev libxcursor-dev libxi-dev libc6-dev - sudo update-alternatives --config gcc - gcc --version - g++ -v -elif [ "$GCC" == "gcc14" ]; then - # https://gcc.gnu.org/gcc-14/changes.html - sudo apt update - sudo apt install -y software-properties-common - # Add the Ubuntu Toolchain PPA for newer GCC versions - sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test - sudo apt update - sudo apt install -y --allow-unauthenticated gcc-14 g++-14 - # Configure alternatives to set GCC 14 as default - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-14 14 \ - --slave /usr/bin/g++ g++ /usr/bin/g++-14 - sudo update-alternatives --config gcc # GCC 14 as the default - gcc --version - g++ -v -elif [ "$GCC" == "gcc15" ]; then - # https://gcc.gnu.org/gcc-15/changes.html - - sudo apt update - sudo apt install -y build-essential flex bison libgmp-dev libmpc-dev libmpfr-dev texinfo wget - sudo apt-get install -y gperf coreutils libxrandr-dev libxinerama-dev libx11-dev libxcursor-dev libxi-dev libc6-dev - - wget https://ftp.gnu.org/gnu/gcc/gcc-15.0.0/gcc-15.0.0.tar.gz - tar -xvzf gcc-15.0.0.tar.gz - cd gcc-15.0.0 - - mkdir build - cd build - - ../configure --prefix=/usr/local/gcc-15 --enable-languages=c,c++ --disable-multilib - - make -j - sudo make install - - echo "export PATH=/usr/local/gcc-15/bin:\$PATH" >>~/.bashrc - source ~/.bashrc - # sudo apt update - # sudo apt install -y software-properties-common - # # Add the Ubuntu Toolchain PPA for newer GCC versions - # sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test - # sudo apt update - # sudo apt install -y gcc-15 g++-15 # Install experimental GCC and G++ version 15 - # # Configure alternatives to set GCC 15 as default - # sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-15 15 \ - # --slave /usr/bin/g++ g++ /usr/bin/g++-15 - # sudo update-alternatives --config gcc # GCC 15 as the default - # gcc --version - # g++ -v - -else - echo "GCC version not specified on OPT env var, set one of gcc14, gcc6 or gcc13" -fi - -echo "--- Installing extra depends --- " - -sudo apt-get -y install libasound-dev libjack-dev libpulse-dev oss4-dev #rtaudio -# sudo apt-get update && sudo apt-get install -y autoconf libtool automake dos2unix -# sudo apt-get update && sudo apt-get install -y cmake build-essential -# sudo apt-get update && sudo apt-get install -y libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev cmake build-essential libc6-dev -# sudo apt-get install -y aptitude build-essential gawk gcc g++ gfortran git texinfo bison libncurses-dev cmake unzip pkg-config flex openssl pigz autoconf automake tar figlet xz-utils libtool dos2unix -# sudo apt-get install -y libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev libxrandr-dev libxinerama-dev libx11-dev libxext-dev libxcursor-dev libxi-dev ccache -# sudo apt-get install -y gperf - -# dpkg -L gcc-aarch64-linux-gnu - -sudo apt-get install -y ccache -# sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu - -dpkg -L gcc-aarch64-linux-gnu - -echo "--- Output usr/lib/* --- " -if [ -d "/usr/lib/x86_64-linux-gnu" ]; then - find /usr/lib/x86_64-linux-gnu -name "libGL*" -fi -if [ -d "/usr/lib/x86_64-linux-gnu" ]; then - find /usr/lib/x86_64-linux-gnu -name "libGL*" -fi - -# Download the installer script -# CMAKE_VERSION=3.30.0 -# wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-x86_64.sh -# chmod +x cmake-${CMAKE_VERSION}-linux-x86_64.sh -# sudo ./cmake-${CMAKE_VERSION}-linux-x86_64.sh --skip-license --prefix=/usr/local -# export PATH="/usr/local/bin:$PATH" - -# Verify the installation -cmake --version diff --git a/scripts/linux/arm64/setup.sh b/scripts/linux/arm64/setup.sh index dbbfb0c1a..5375d3fd0 100755 --- a/scripts/linux/arm64/setup.sh +++ b/scripts/linux/arm64/setup.sh @@ -1,11 +1,18 @@ #!/usr/bin/env bash set -e +LINUX_RELEASE=24.04.1 + echo "=== Linux ARM64 cross setup ===" lsb_release -a sudo apt update -y sudo apt install -y \ + debootstrap \ + qemu-user-static \ + binfmt-support \ + python3-minimal \ + python3-numpy \ git \ cmake \ gawk \ @@ -16,12 +23,12 @@ sudo apt install -y \ autoconf \ flex \ xz-utils \ - crossbuild-essential-armhf \ - crossbuild-essential-arm64 - -sudo apt install -y \ + gcc-aarch64-linux-gnu \ + g++-aarch64-linux-gnu \ + binutils-aarch64-linux-gnu \ python3-minimal \ - python3-numpy + python3-numpy \ + mesa-utils mesa-common-dev libgl1-mesa-dev libegl1-mesa-dev # if [[ "$(uname -m)" == "x86_64" ]]; then # wget https://ftp.gnu.org/gnu/gawk/gawk-5.3.1.tar.xz @@ -40,10 +47,7 @@ if [[ $EUID -ne 0 ]]; then exit 1 fi -# Ubuntu version detection -UBUNTU_VERSION=$(lsb_release -cs) # e.g., "lunar" for Ubuntu 23.04 - -# Check for valid Ubuntu version +UBUNTU_VERSION=$(lsb_release -cs) if [[ -z "$UBUNTU_VERSION" ]]; then echo "Error: Could not detect Ubuntu version. Ensure lsb-release is installed." exit 1 @@ -51,7 +55,22 @@ fi if [[ "$(uname -m)" == "aarch64" ]]; then echo "Native aarch64 detected. No need to generate ARM64 /apt/sources. edits" else -# Define output file path + +echo "downloading aarch64 linux base" +IMAGE="ubuntu-base-$LINUX_RELEASE-base-arm64" +wget https://cdimage.ubuntu.com/ubuntu-base/releases/noble/release/${IMAGE}.tar.gz +mkdir arm64-rootfs +sudo tar -xpf ${IMAGE}.tar.gz -C arm64-rootfs +echo "===setup qemu===" +if [ ! -f "/arm64-rootfs/usr/bin/qemu-aarch64-static" ]; then + echo "Copying qemu-aarch64-static into rootfs..." + sudo cp /usr/bin/qemu-aarch64-static arm64-rootfs/usr/bin/ +fi +sudo mount --bind /dev arm64-rootfs/dev +sudo mount --bind /proc arm64-rootfs/proc +sudo mount --bind /sys arm64-rootfs/sys +sudo chroot arm64-rootfs /bin/bash + OUTPUT_FILE="/etc/apt/sources.list.d/arm64.sources" echo "making sources file arm64" @@ -68,7 +87,6 @@ EOF # Output the result echo "Generated ARM64 .sources file at $OUTPUT_FILE" - SOURCE_FILE="/etc/apt/sources.list.d/ubuntu.sources" awk ' /^Types: deb/ { @@ -86,7 +104,10 @@ mv "${SOURCE_FILE}.tmp" "$SOURCE_FILE" echo "'Architectures: amd64' added where missing after 'Types: deb' in $SOURCE_FILE." fi -sudo dpkg --add-architecture arm64 + +if ! dpkg --print-foreign-architectures | grep -q "arm64"; then + sudo dpkg --add-architecture arm64 +fi dpkg --print-architecture dpkg --print-foreign-architectures # Update package lists @@ -95,54 +116,67 @@ sudo apt-get update echo "Done! ARM64 and ARMHF architectures are ready." +ARCH_SUFFIX=":arm64" +if [[ "$(uname -m)" == "aarch64" ]]; then + ARCH_SUFFIX="" +fi +if [ -d "arm64-rootfs/" ]; then + echo "Setting up Linux aarch64 toolchain inside rootfs..." + sudo mkdir -p /usr/aarch64-linux-gnu + sudo mkdir -p /arm64-rootfs/usr/aarch64-linux-gnu + # Link the toolchain inside rootfs (Linux aarch64) + sudo ln -s /arm64-rootfs/usr/bin/aarch64-linux-gnu-* /usr/aarch64-linux-gnu/ + sudo ln -s /arm64-rootfs/usr/lib /usr/aarch64-linux-gnu/lib + sudo ln -s /arm64-rootfs/usr/include /usr/aarch64-linux-gnu/include + + echo "Toolchain linked for Linux aarch64 at /usr/aarch64-linux-gnu/" +else + echo "Error: /arm64-rootfs/ does not exist. Ensure rootfs is extracted." + exit 1 +fi echo "Installing ARM64 packages..." -apt-get install -y --no-install-recommends \ - aptitude:arm64 \ - gcc-aarch64-linux-gnu \ - g++-aarch64-linux-gnu \ - gfortran:arm64 \ - texinfo:arm64 \ - bison:arm64 \ - libncurses-dev:arm64 \ - unzip:arm64 \ - pkg-config:arm64 \ - flex:arm64 \ - openssl:arm64 \ - pigz:arm64 \ - autoconf:arm64 \ - automake:arm64 \ - figlet:arm64 \ - gperf:arm64 \ - libgl1-mesa-dev:arm64 \ - libglu1-mesa-dev:arm64 \ - freeglut3-dev:arm64 \ - libxrandr-dev:arm64 \ - libxinerama-dev:arm64 \ - libx11-dev:arm64 \ - libxext-dev:arm64 \ - libxcursor-dev:arm64 \ - libxi-dev:arm64 \ - ccache:arm64 \ - binutils-aarch64-linux-gnu:arm64 \ - libgles2-mesa-dev:arm64 - -# apt-get install -y gawk:arm64 --no-remove -# if [[ "$(uname -m)" == "x86_64" ]]; then -# # issues with apt packages install manually -# wget http://ftp.us.debian.org/debian/pool/main/g/gawk/gawk_5.2.1-2+b2_arm64.deb -# sudo dpkg -i --force-architecture --force-depends gawk_5.2.1-2+b2_arm64.deb -# fi - - -# sudo apt-get install -y aptitude gawk gcc g++ gfortran texinfo bison libncurses-dev unzip pkg-config flex openssl pigz autoconf automake tar figlet xz-utils -# sudo aptitude install -y gperf -# sudo apt-get update && sudo apt-get install -y libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev libxrandr-dev libxinerama-dev libx11-dev libxext-dev libxcursor-dev libxi-dev -# sudo apt-get install -y ccache -# sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu - -# dpkg -L gcc-aarch64-linux-gnu -# sudo apt install libgl1-mesa-dev libgles2-mesa-dev +sudo apt-get install -y --no-install-recommends \ + aptitude$ARCH_SUFFIX \ + gfortran$ARCH_SUFFIX \ + texinfo$ARCH_SUFFIX \ + bison$ARCH_SUFFIX \ + libncurses-dev$ARCH_SUFFIX \ + unzip$ARCH_SUFFIX \ + pkg-config$ARCH_SUFFIX \ + flex$ARCH_SUFFIX \ + openssl$ARCH_SUFFIX \ + pigz$ARCH_SUFFIX \ + autoconf$ARCH_SUFFIX \ + automake$ARCH_SUFFIX \ + figlet$ARCH_SUFFIX \ + gperf$ARCH_SUFFIX \ + libgl1-mesa-dev$ARCH_SUFFIX \ + libglu1-mesa-dev$ARCH_SUFFIX \ + freeglut3-dev$ARCH_SUFFIX \ + libxrandr-dev$ARCH_SUFFIX \ + libxinerama-dev$ARCH_SUFFIX \ + libx11-dev$ARCH_SUFFIX \ + libxext-dev$ARCH_SUFFIX \ + libxcursor-dev$ARCH_SUFFIX \ + libxi-dev$ARCH_SUFFIX \ + ccache$ARCH_SUFFIX \ + libgles2-mesa-dev$ARCH_SUFFIX \ + libgl1-mesa-dev$ARCH_SUFFIX \ + libegl1-mesa-dev$ARCH_SUFFIX +sudo apt install -y \ + binfmt-support \ + python3-minimal \ + python3-numpy \ + git \ + cmake \ + pkgconf \ + build-essential \ + ninja-build \ + xz-utils \ + gcc-aarch64-linux-gnu \ + g++-aarch64-linux-gnu + if [ -d "/usr/lib/x86_64-linux-gnu" ]; then find /usr/lib/x86_64-linux-gnu -name "libGL*" @@ -153,9 +187,9 @@ if [ -d "/usr/lib/x86_64-linux-gnu" ]; then echo "No libGL* files found in /usr/lib/x86_64-linux-gnu" exit 1 fi - echo -e "\n\033[1;32m==== Running ldd on libGL* files ====\033[0m" + echo -e "=== Running ldd on libGL* files ====" for file in $lib_files; do - echo -e "\n\033[1;34mFile: $file\033[0m" + echo -e "File: $file" ldd "$file" || echo "Error: Could not run ldd on $file" done fi @@ -165,6 +199,8 @@ else echo "Directory /usr/lib/aarch64-linux-gnu does not exist." fi +dpkg -l | grep g++-aarch64-linux-gnu + PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \ PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu \ PKG_CONFIG_SYSROOT_DIR=/ \ diff --git a/scripts/linux/raspios/aarch64/install.sh b/scripts/linux/raspios/aarch64/install.sh index 820e437b6..73b8283ca 100755 --- a/scripts/linux/raspios/aarch64/install.sh +++ b/scripts/linux/raspios/aarch64/install.sh @@ -1,16 +1,5 @@ #!/bin/bash -# set -e - -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -cd $SCRIPT_DIR -ROOT=$( - cd $(dirname "$0") - pwd -P -)/../../../../../ -APOTHECARY_PATH=$ROOT/apothecary - set -e - echo "=== Linux ARM64 cross setup ===" lsb_release -a @@ -18,17 +7,23 @@ sudo apt update -y sudo apt install -y \ git \ cmake \ + gawk \ pkgconf \ build-essential \ ninja-build \ - gawk \ automake \ autoconf \ flex \ + xz-utils \ crossbuild-essential-armhf \ crossbuild-essential-arm64 \ gcc-aarch64-linux-gnu \ - g++-aarch64-linux-gnu + g++-aarch64-linux-gnu \ + binutils-aarch64-linux-gnu \ + debootstrap \ + qemu-user-static \ + binfmt-support + sudo apt install -y \ python3-minimal \ @@ -51,6 +46,14 @@ fi if [[ "$(uname -m)" == "aarch64" ]]; then echo "Native aarch64 detected. No need to generate ARM64 /apt/sources. edits" else + +sudo mount --bind /dev rpi-arm64-rootfs/dev +sudo mount --bind /proc rpi-arm64-rootfs/proc +sudo mount --bind /sys rpi-arm64-rootfs/sys + +sudo chroot rpi-arm64-rootfs /bin/bash + + # Define output file path OUTPUT_FILE="/etc/apt/sources.list.d/raspberrypi-arm64.sources" echo "Creating sources file for Raspberry Pi (ARM64) at $OUTPUT_FILE" @@ -90,8 +93,10 @@ mv "${SOURCE_FILE}.tmp" "$SOURCE_FILE" echo "'Architectures: amd64' added where missing after 'Types: deb' in $SOURCE_FILE." fi -sudo dpkg --add-architecture arm64 -sudo dpkg --add-architecture amd64 + +if ! dpkg --print-foreign-architectures | grep -q "arm64"; then + sudo dpkg --add-architecture arm64 +fi dpkg --print-architecture dpkg --print-foreign-architectures @@ -101,35 +106,48 @@ sudo apt-get update echo "Done! ARM64 and ARMHF architectures are ready." echo "Installing ARM64 packages..." -apt-get install -y --no-install-recommends \ - aptitude:arm64 \ - gcc-aarch64-linux-gnu \ - g++-aarch64-linux-gnu \ - gfortran:arm64 \ - texinfo:arm64 \ - bison:arm64 \ - libncurses-dev:arm64 \ - unzip:arm64 \ - pkg-config:arm64 \ - flex:arm64 \ - openssl:arm64 \ - pigz:arm64 \ - autoconf:arm64 \ - automake:arm64 \ - figlet:arm64 \ - gperf:arm64 \ - libgl1-mesa-dev:arm64 \ - libglu1-mesa-dev:arm64 \ - freeglut3-dev:arm64 \ - libxrandr-dev:arm64 \ - libxinerama-dev:arm64 \ - libx11-dev:arm64 \ - libxext-dev:arm64 \ - libxcursor-dev:arm64 \ - libxi-dev:arm64 \ - ccache:arm64 \ - binutils-aarch64-linux-gnu:arm64 \ - libgles2-mesa-dev:arm64 +ARCH_SUFFIX=":arm64" +if [[ "$(uname -m)" == "aarch64" ]]; then + ARCH_SUFFIX="" +fi + +if [ -d "/raspbian/" ]; then + sudo mkdir -p /usr/aarch64-linux-gnu + sudo ln -s /raspbian/toolchain/bin/aarch64-linux-gnu-* /usr/aarch64-linux-gnu/ + sudo ln -s /raspbian/toolchain/lib /usr/aarch64-linux-gnu/lib + sudo ln -s /raspbian/toolchain/include /usr/aarch64-linux-gnu/include +else + echo "Error: /raspbian/ folder not found. Please check your installation." + exit 1 +fi + +echo "Installing ARM64 packages..." +sudo apt-get install -y --no-install-recommends \ + aptitude$ARCH_SUFFIX \ + gfortran$ARCH_SUFFIX \ + texinfo$ARCH_SUFFIX \ + bison$ARCH_SUFFIX \ + libncurses-dev$ARCH_SUFFIX \ + unzip$ARCH_SUFFIX \ + pkg-config$ARCH_SUFFIX \ + flex$ARCH_SUFFIX \ + openssl$ARCH_SUFFIX \ + pigz$ARCH_SUFFIX \ + autoconf$ARCH_SUFFIX \ + automake$ARCH_SUFFIX \ + figlet$ARCH_SUFFIX \ + gperf$ARCH_SUFFIX \ + libgl1-mesa-dev$ARCH_SUFFIX \ + libglu1-mesa-dev$ARCH_SUFFIX \ + freeglut3-dev$ARCH_SUFFIX \ + libxrandr-dev$ARCH_SUFFIX \ + libxinerama-dev$ARCH_SUFFIX \ + libx11-dev$ARCH_SUFFIX \ + libxext-dev$ARCH_SUFFIX \ + libxcursor-dev$ARCH_SUFFIX \ + libxi-dev$ARCH_SUFFIX \ + ccache$ARCH_SUFFIX \ + libgles2-mesa-dev$ARCH_SUFFIX if [ -d "/usr/lib/x86_64-linux-gnu" ]; then diff --git a/scripts/linux/raspios/aarch64/setup.sh b/scripts/linux/raspios/aarch64/setup.sh index 821b3d424..02a7ce076 100755 --- a/scripts/linux/raspios/aarch64/setup.sh +++ b/scripts/linux/raspios/aarch64/setup.sh @@ -11,11 +11,6 @@ trapError() { exit 1 } -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -cd $SCRIPT_DIR -APOTHECARY_LEVEL="$(cd "$SCRIPT_DIR/../../.." && pwd)" -cd $APOTHECARY_LEVEL - if grep -q "Raspbian" /etc/os-release 2>/dev/null && [[ "$(uname -m)" == "aarch64" ]]; then NATIVE="true" echo "Detected Raspberry Pi OS (Raspbian) on arm64. Setting NATIVE=true" @@ -53,14 +48,9 @@ fi if [ "$NATIVE" == "0" ]; then - - git clone https://github.com/danoli3/rpi_rootfs.git - cd $CROSS_SYSROOT - - sudo chmod +x ./build_rootfs_arm64.sh - - ./build_rootfs_arm64.sh download - ./build_rootfs_arm64.sh create + wget https://downloads.raspberrypi.com/raspios_lite_arm64/root.tar.xz + mkdir -p rpi-arm64-rootfs + sudo tar -xJpf raspios_lite_arm64/root.tar.xz -C rpi-arm64-rootfs fi echo "===setup complete===" diff --git a/scripts/linux/raspios/setup.sh b/scripts/linux/raspios/setup.sh new file mode 100644 index 000000000..167f8dd6a --- /dev/null +++ b/scripts/linux/raspios/setup.sh @@ -0,0 +1,148 @@ +#!/bin/bash +set -e +set -o pipefail + +trap "echo ' ^ Received error ^' && exit 1" ERR + +RPI_TARGET="${RPI_TARGET:-auto}" +GCC_VERSION="${GCC_VERSION:-gcc14}" +INSTALL_DIR="$HOME/opt" + +ARCH=$(uname -m) +if grep -q "Raspbian" /etc/os-release 2>/dev/null; then + NATIVE="true" + echo "Detected Raspberry Pi OS (Raspbian). Determining native RPI_TARGET..." + + RPI_MODEL=$(cat /proc/device-tree/model 2>/dev/null || echo "Unknown") + + # Check for Raspberry Pi Pico (RP2040) by scanning USB devices + if lsusb | grep -q "Raspberry Pi RP2"; then + echo "Detected Raspberry Pi Pico (RP2040)" + RPI_TARGET="arm-pico-eabi" + elif lsusb | grep -q "RP2350"; then + echo "Detected Raspberry Pi Pico 2 (RP2350)" + RPI_TARGET="arm-pico2-eabi" + else + case "$ARCH" in + aarch64) + # 64-bit OS + if echo "$RPI_MODEL" | grep -q "Raspberry Pi 4\|Raspberry Pi 5"; then + RPI_TARGET="aarch64-rpi3-linux-gnu" + elif echo "$RPI_MODEL" | grep -q "Raspberry Pi 3"; then + RPI_TARGET="aarch64-rpi3-linux-gnu" + else + RPI_TARGET="aarch64-rpi3-linux-gnu" # Default for unknown 64-bit systems + fi + ;; + + armv7l) + # 32-bit ARMv7 (Pi 2 v1.2, Pi 3 in 32-bit mode) + RPI_TARGET="armv8-rpi3-linux-gnueabihf" + ;; + + armv6l) + # 32-bit ARMv6 (Pi Zero, Pi 1) + RPI_TARGET="armv6-rpi-linux-gnueabihf" + ;; + + *) + echo "Unknown architecture: $ARCH. Defaulting to armv6-rpi-linux-gnueabihf." + RPI_TARGET="armv6-rpi-linux-gnueabihf" + ;; + esac + fi + echo "Auto-detected RPI_TARGET: $RPI_TARGET" +else + NATIVE="false" +fi + +case "$RPI_TARGET" in + aarch64-rpi3-linux-gnu) + if [[ "$ARCH" == "x86_64" ]] || [[ "$NATIVE" == "true" ]]; then + TOOLCHAIN_URL="https://github.com/tttapa/docker-arm-cross-toolchain/releases/latest/download/x-tools-aarch64-rpi3-linux-gnu-${GCC_VERSION}.tar.xz" + elif [[ "$ARCH" == "aarch64" ]]; then + TOOLCHAIN_URL="https://github.com/tttapa/docker-arm-cross-toolchain/releases/latest/download/x-tools-aarch64-rpi3-linux-gnu-aarch64-rpi3-linux-gnu-${GCC_VERSION}.tar.xz" + else + echo "Unsupported architecture: $ARCH" + exit 1 + fi + TOOLCHAIN_NAME="x-tools-aarch64-rpi3-linux-gnu" + ;; + + armv8-rpi3-linux-gnueabihf) + if [[ "$ARCH" == "x86_64" ]] || [[ "$NATIVE" == "true" ]]; then + TOOLCHAIN_URL="https://github.com/tttapa/docker-arm-cross-toolchain/releases/latest/download/x-tools-armv8-rpi3-linux-gnueabihf-${GCC_VERSION}.tar.xz" + elif [[ "$ARCH" == "aarch64" ]]; then + TOOLCHAIN_URL="https://github.com/tttapa/docker-arm-cross-toolchain/releases/latest/download/x-tools-aarch64-rpi3-linux-gnu-armv8-rpi3-linux-gnueabihf-${GCC_VERSION}.tar.xz" + else + echo "Unsupported architecture: $ARCH" + exit 1 + fi + TOOLCHAIN_NAME="x-tools-armv8-rpi3-linux-gnueabihf" + ;; + + armv6-rpi-linux-gnueabihf) + if [[ "$ARCH" == "x86_64" ]] || [[ "$NATIVE" == "true" ]]; then + TOOLCHAIN_URL="https://github.com/tttapa/docker-arm-cross-toolchain/releases/latest/download/x-tools-armv6-rpi-linux-gnueabihf-${GCC_VERSION}.tar.xz" + elif [[ "$ARCH" == "aarch64" ]]; then + TOOLCHAIN_URL="https://github.com/tttapa/docker-arm-cross-toolchain/releases/latest/download/x-tools-aarch64-rpi3-linux-gnu-armv6-rpi-linux-gnueabihf-${GCC_VERSION}.tar.xz" + else + echo "Unsupported architecture: $ARCH" + exit 1 + fi + TOOLCHAIN_NAME="x-tools-armv6-rpi-linux-gnueabihf" + ;; + + arm-pico-eabi) + if [[ "$ARCH" == "x86_64" ]] || [[ "$NATIVE" == "true" ]]; then + TOOLCHAIN_URL="https://github.com/tttapa/docker-arm-cross-toolchain/releases/latest/download/x-tools-arm-pico-eabi-${GCC_VERSION}.tar.xz" + elif [[ "$ARCH" == "aarch64" ]]; then + TOOLCHAIN_URL="https://github.com/tttapa/docker-arm-cross-toolchain/releases/latest/download/x-tools-aarch64-rpi3-linux-gnu-arm-pico-eabi-${GCC_VERSION}.tar.xz" + else + echo "Unsupported architecture: $ARCH" + exit 1 + fi + TOOLCHAIN_NAME="x-tools-arm-pico-eabi" + ;; + + arm-pico2-eabi) + if [[ "$ARCH" == "x86_64" ]] || [[ "$NATIVE" == "true" ]]; then + TOOLCHAIN_URL="https://github.com/tttapa/docker-arm-cross-toolchain/releases/latest/download/x-tools-arm-pico2-eabi-${GCC_VERSION}.tar.xz" + elif [[ "$ARCH" == "aarch64" ]]; then + TOOLCHAIN_URL="https://github.com/tttapa/docker-arm-cross-toolchain/releases/latest/download/x-tools-aarch64-rpi3-linux-gnu-arm-pico2-eabi-${GCC_VERSION}.tar.xz" + else + echo "Unsupported architecture: $ARCH" + exit 1 + fi + TOOLCHAIN_NAME="x-tools-arm-pico2-eabi" + ;; + + *) + echo "Unknown RPI_TARGET: $RPI_TARGET" + exit 1 + ;; +esac + +# Download and extract toolchain +echo "Downloading toolchain: $TOOLCHAIN_NAME" +mkdir -p "$INSTALL_DIR" +wget -q "$TOOLCHAIN_URL" -O "$INSTALL_DIR/${TOOLCHAIN_NAME}.tar.xz" + +echo "Extracting toolchain..." +tar -xf "$INSTALL_DIR/${TOOLCHAIN_NAME}.tar.xz" -C "$INSTALL_DIR" +rm "$INSTALL_DIR/${TOOLCHAIN_NAME}.tar.xz" + +# Set up environment variables +TOOLCHAIN_PATH="$INSTALL_DIR/$TOOLCHAIN_NAME/bin" +echo "Setting up environment variables..." +export PATH="$TOOLCHAIN_PATH:$PATH" + +# Add to ~/.profile for persistence +echo "export PATH=\"$TOOLCHAIN_PATH:\$PATH\"" >> ~/.profile +source ~/.profile + +# Verify installation +echo "Verifying toolchain setup..." +${RPI_TARGET}-gcc --version || echo "Error: ${RPI_TARGET}-gcc not found in PATH" + +echo "=== Setup complete ===" diff --git a/scripts/load.sh b/scripts/load.sh index 3d21d5ce3..eca20ecc1 100755 --- a/scripts/load.sh +++ b/scripts/load.sh @@ -3,7 +3,7 @@ # usage # ."$SCRIPT_DIR/save.sh" # load "ios" "freeimage" "arm64" "true" "v9.1.0" "v9.1.0" -set +e +# set +e function loadsave() { if [ -z "$2" ]; then diff --git a/scripts/package-individual.sh b/scripts/package-individual.sh index faf7c6e7a..3541ff8b1 100755 --- a/scripts/package-individual.sh +++ b/scripts/package-individual.sh @@ -76,31 +76,91 @@ cd $OUTPUT_FOLDER echo "Compressing individual libraries from [$OUTPUT_FOLDER]..." -for LIB in $FORMULAS; do - if [ -d "$LIB" ]; then - if [[ "$TARGET" == "msys2" || "$TARGET" == "vs" ]]; then - # ZIP format for Windows (msys2 / vs) - TARBALL="oF_${LIB}_${TARGET}_${ARCH}.zip" +for LIB_PATH in "$OUTPUT_FOLDER"/*/; do + LIB=$(basename "$LIB_PATH") + + if [[ -d "$LIB_PATH" ]]; then + # Set up base package name + TARBALL="$OUTPUT_FOLDER/oF_${LIB}_${TARGET}_${ARCH}" + + # Linux (add GCC postfix if available) + if [[ "$TARGET" == "linux" ]]; then + if [[ -n "$GCC" ]]; then + TARBALL="${TARBALL}_${GCC}" + fi + TARBALL="${TARBALL}.tar.bz2" echo "Packaging $LIB -> $TARBALL" - if [[ "$TARGET" == "msys2" ]]; then - "C:\Program Files\7-Zip\7z.exe" a "$TARBALL" "$LIB" - else - "C:\Program Files\7-Zip\7z.exe" a "$TARBALL" "$LIB" + tar cjvf "$TARBALL" -C "$OUTPUT_FOLDER" "$LIB" + + # Windows MSYS2 (add MSYSTEM postfix if available) + elif [[ "$TARGET" == "msys2" ]]; then + if [[ -n "$MSYSTEM" ]]; then + TARBALL="${TARBALL}_${MSYSTEM}" fi + TARBALL="${TARBALL}.zip" + echo "Packaging $LIB -> $TARBALL" + + pushd "$OUTPUT_FOLDER" > /dev/null + "/c/Program Files/7-Zip/7z.exe" a "$TARBALL" "$LIB" + popd > /dev/null + + # Windows Visual Studio (add VS version if available) + elif [[ "$TARGET" == "vs" ]]; then + if [[ -n "$VS_VER" ]]; then + TARBALL="${TARBALL}_VS${VS_VER}" + fi + TARBALL="${TARBALL}.zip" + echo "Packaging $LIB -> $TARBALL" + + pushd "$OUTPUT_FOLDER" > /dev/null + "/c/Program Files/7-Zip/7z.exe" a "$TARBALL" "$LIB" + popd > /dev/null + + # Emscripten + elif [[ "$TARGET" == "emscripten" ]]; then + TARBALL="${TARBALL}.tar.bz2" + echo "Packaging $LIB -> $TARBALL" + tar cjvf "$TARBALL" -C "$OUTPUT_FOLDER" "$LIB" + + # Android + elif [[ "$TARGET" == "android" ]]; then + TARBALL="${TARBALL}.tar.bz2" + echo "Packaging $LIB -> $TARBALL" + tar cjvf "$TARBALL" -C "$OUTPUT_FOLDER" "$LIB" + + # macOS (add bundle postfix if available) + elif [[ "$TARGET" == "macos" ]]; then + if [[ -n "$BUNDLE" ]]; then + TARBALL="${TARBALL}_${BUNDLE}" + fi + TARBALL="${TARBALL}.tar.bz2" + echo "Packaging $LIB -> $TARBALL" + tar cjvf "$TARBALL" -C "$OUTPUT_FOLDER" "$LIB" + + # Apple Platforms (iOS, tvOS, etc.) + elif [[ "$TARGET" =~ ^(osx|ios|tvos|xros|catos|watchos)$ ]]; then + if [[ -n "$BUNDLE" ]]; then + TARBALL="${TARBALL}_${BUNDLE}" + fi + TARBALL="${TARBALL}.tar.bz2" + echo "Packaging $LIB -> $TARBALL" + tar cjvf "$TARBALL" -C "$OUTPUT_FOLDER" "$LIB" + + # Default fallback else - # TAR format for Linux/macOS/Emscripten - TARBALL="oF_${LIB}_${TARGET}_${ARCH}.tar.bz2" + TARBALL="${TARBALL}.tar.bz2" echo "Packaging $LIB -> $TARBALL" - tar cjvf "$TARBALL" "$LIB" + tar cjvf "$TARBALL" -C "$OUTPUT_FOLDER" "$LIB" fi - if [ $? -eq 0 ]; then - echo "Successfully created package: $TARBALL" + # Check if packaging was successful + if [[ $? -eq 0 ]]; then + echo "✅ Successfully created package: $TARBALL" else - echo "Error: Failed to package $LIB" + echo "❌ Error: Failed to package $LIB" fi else - echo "Warning: Skipping $LIB as it does not exist in $OUTPUT_FOLDER" + echo "⚠️ Warning: Skipping $LIB_PATH as it is not a directory" fi done diff --git a/scripts/vs/install.sh b/scripts/vs/install.sh index 8cc508248..a266c5898 100755 --- a/scripts/vs/install.sh +++ b/scripts/vs/install.sh @@ -1,48 +1,26 @@ #!/usr/bin/env bash set -e -# trap any script errors and exit -trap "trapError" ERR - -trapError() { - echo - echo " ^ Received error ^" - exit 1 -} - -isRunning() { - if [ “$(uname)” == “Linux” ]; then - if [ -d /proc/$1 ]; then - return 0 +if ! command -v winget &>/dev/null; then + REQUIRED_WINGET=("Microsoft.WindowsTerminal" "Ninja-build.Ninja" "jqlang.jq") + for pkg in "${REQUIRED_WINGET[@]}"; do + if winget list --id "$pkg" &>/dev/null; then + INST=true + #echo "$pkg is already installed." else - return 1 + winget install -e --id "$pkg" fi - else - number=$(ps aux | sed -E "s/[^ ]* +([^ ]*).*/\1/g" | grep ^$1$ | wc -l) + done +fi - if [ $number -gt 0 ]; then - return 0 - else - return 1 - fi - fi +# BASH / WASL setup: +is_installed() { + dpkg -s "$1" &>/dev/null } - -echoDots() { - while isRunning $1; do - for i in $(seq 1 10); do - echo -ne . - if ! isRunning $1; then - printf "\r" - return - fi - sleep 2 - done - printf "\r " - printf "\r" +if grep -qi microsoft /proc/version && command -v wsl.exe &> /dev/null; then + REQUIRED_PKGS=("shasum" "unzip" "autoconf" "libtool" "automake" "dos2unix" "ccache" "cmake" "build-essential") + sudo apt update + for pkg in "${REQUIRED_PKGS[@]}"; do + is_installed "$pkg" || sudo apt install -y "$pkg" done -} - -winget install -e --id Microsoft.WindowsTerminal -winget install Ninja-build.Ninja -winget install jqlang.jq +fi \ No newline at end of file