File indexing completed on 2024-05-12 04:28:29

0001 #!/usr/bin/env bash
0002 #
0003 #  SPDX-License-Identifier: GPL-3.0-or-later
0004 #
0005 
0006 # osxbuild.sh automates building and installing of krita and krita dependencies
0007 # for OSX, the script only needs you to set BUILDROOT environment to work
0008 # properly.
0009 #
0010 
0011 # Run with no args for a short help about each command.
0012 
0013 # builddeps: Attempts to build krita dependencies in the necessary order,
0014 #     intermediate steps for creating symlinks and fixing rpath of some
0015 #     packages midway is also managed. Order goes from top to bottom, to add
0016 #     new steps just place them in the proper place.
0017 
0018 # build: Runs cmake build and make step for krita sources. It always run cmake step, so
0019 #     it might take a bit longer than a pure <make> on the source tree. The script tries
0020 #     to set the make flag -jN to a proper N.
0021 
0022 # install: Runs install step for krita sources.
0023 
0024 # fixboost: Search for all libraries using boost and sets a proper @rpath for boost as by
0025 #     default it fails to set a proper @rpath
0026 
0027 # buildinstall: Runs build, install and fixboost steps.#
0028 
0029 
0030 # jenkins is a x86_64 process running in rosetta mode
0031 # we need to force launch in native arch for subprojects to
0032 # correctly detect universal builds.
0033 if [[ $(sysctl -n sysctl.proc_translated) -eq 1 ]]; then
0034     echo "Main process running in rosetta mode!"
0035     echo "Relaunching as native process"
0036 
0037     REL_CMD=(${0} ${@})
0038     printf -v REL_CMD_STRING '%s ' "${REL_CMD[@]}"
0039     env /usr/bin/arch -arm64e -arm64 -x86_64 ${SHELL} -c "${REL_CMD_STRING}"
0040     exit
0041 fi
0042 
0043 if test -z $BUILDROOT; then
0044     echo "ERROR: BUILDROOT env not set, exiting!"
0045     echo "\t Must point to the root of the buildfiles as stated in 3rdparty Readme"
0046     exit 1
0047 fi
0048 
0049 BUILDROOT="${BUILDROOT%/}"
0050 echo "BUILDROOT set to ${BUILDROOT}"
0051 
0052 # global options
0053 set -o pipefail
0054 
0055 # Check cmake in path.
0056 if test -z $(which cmake); then
0057     echo "WARNING: no cmake in PATH... adding default /Applications location"
0058     export PATH=/Applications/CMake.app/Contents/bin:${PATH}
0059     if test -z $(which cmake); then
0060         echo "ERROR: cmake not found, exiting!"
0061         exit 1
0062     fi
0063 fi
0064 echo "$(cmake --version | head -n 1)"
0065 
0066 # Set some global variables.
0067 OSXBUILD_TYPE="RelWithDebInfo"
0068 OSXBUILD_TESTING="OFF"
0069 OSXBUILD_HIDE_SAFEASSERTS="ON"
0070 
0071 # -- Parse input args
0072 for arg in "${@}"; do
0073     if [[ "${arg}" = --dirty ]]; then
0074         OSXBUILD_CLEAN="keep dirty"
0075     elif [[ "${arg}" = --debug ]]; then
0076         OSXBUILD_TYPE="Debug"
0077     elif [[ "${arg}" = --tests ]]; then
0078         OSXBUILD_TESTING="ON"
0079     elif [[ "${arg}" = --install_tarball ]]; then
0080         OSXBUILD_TARBALLINSTALL="TRUE"
0081     elif [[ "${arg}" = --universal ]]; then
0082         OSXBUILD_UNIVERSAL="TRUE"
0083     elif [[ "${arg}" = --showasserts ]]; then
0084         OSXBUILD_HIDE_SAFEASSERTS="OFF"
0085     else
0086         parsed_args="${parsed_args} ${arg}"
0087     fi
0088 done
0089 
0090 if [[ -z "${KIS_SRC_DIR}" ]]; then
0091     export KIS_SRC_DIR=${BUILDROOT}/krita
0092 fi
0093 if [[ -z "${KIS_BUILD_DIR}" ]]; then
0094     export KIS_BUILD_DIR=${BUILDROOT}/kisbuild
0095 fi
0096 export KIS_TBUILD_DIR=${BUILDROOT}/depbuild
0097 export KIS_TDEPINSTALL_DIR=${BUILDROOT}/depinstall
0098 export KIS_DOWN_DIR=${BUILDROOT}/down
0099 export KIS_PLUGIN_BUILD_DIR=${BUILDROOT}/plugins_build
0100 export KIS_INSTALL_DIR=${BUILDROOT}/i
0101 
0102 # flags for OSX environment
0103 # Qt only supports from 10.12 up, and https://doc.qt.io/qt-5/macos.html#target-platforms warns against setting it lower
0104 export MACOSX_DEPLOYMENT_TARGET=10.13
0105 export QMAKE_MACOSX_DEPLOYMENT_TARGET=10.13
0106 
0107 
0108 export PATH=${KIS_INSTALL_DIR}/bin:$PATH
0109 export PKG_CONFIG_PATH=${KIS_INSTALL_DIR}/share/pkgconfig:${KIS_INSTALL_DIR}/lib/pkgconfig
0110 export CMAKE_PREFIX_PATH=${KIS_INSTALL_DIR}
0111 export FRAMEWORK_PATH=${KIS_INSTALL_DIR}/lib
0112 
0113 export LIBRARY_PATH=${KIS_INSTALL_DIR}/lib:/usr/lib:${LIBRARY_PATH}
0114 export C_INCLUDE_PATH=${KIS_INSTALL_DIR}/include
0115 export CPLUS_INCLUDE_PATH=${KIS_INSTALL_DIR}/include
0116 
0117 
0118 # export PYTHONHOME=${KIS_INSTALL_DIR}
0119 # export PYTHONPATH=${PYTHONPATH}:${KIS_INSTALL_DIR}/lib/Python.framework/Versions/Current/lib/python3.9/site-packages
0120 
0121 # This will make the debug output prettier
0122 export KDE_COLOR_DEBUG=1
0123 export QTEST_COLORED=1
0124 
0125 export OUTPUT_LOG="${BUILDROOT}/osxbuild.log"
0126 printf "" > "${OUTPUT_LOG}"
0127 
0128 # configure max core for make compile
0129 ((MAKE_THREADS=1))
0130 if [[ "${OSTYPE}" == "darwin"* ]]; then
0131     ((MAKE_THREADS = $(sysctl -n hw.logicalcpu) - 1))
0132     export MAKEFLAGS="-j${MAKE_THREADS}"
0133 fi
0134 
0135 OSXBUILD_X86_64_BUILD=$(sysctl -n hw.optional.x86_64)
0136 OSXBUILD_GENERATOR="Unix Makefiles"
0137 
0138 if [[ $(arch) = "arm64" ]]; then
0139     OSX_ARCHITECTURES="arm64"
0140 else
0141     OSX_ARCHITECTURES="x86_64"
0142 fi
0143 
0144 if [[ ${OSXBUILD_UNIVERSAL} ]]; then
0145     OSX_ARCHITECTURES="x86_64\;arm64"
0146 fi
0147 
0148 # Prints stderr and stdout to log files
0149 # >(tee) works but breaks sigint
0150 log_cmd () {
0151     "$@" 2>&1 | tee -a ${OUTPUT_LOG}
0152     osxbuild_error="${?}"
0153 }
0154 
0155 # Log messages to logfile
0156 log () {
0157     printf "%s\n" "${@}"  | tee -a ${OUTPUT_LOG}
0158 }
0159 
0160 # if previous command gives error
0161 # print msg
0162 # if a 2nd arg is given it stops execution
0163 print_if_error() {
0164     if [ "${osxbuild_error}" -ne 0 ]; then
0165         printf "\e[31m%s %s\e[0m\n" "Error:" "Printing last lines of log output"
0166         tail ${OUTPUT_LOG}
0167         printf "\e[31m%s %s\e[0m\n" "Error:" "${1}"
0168         if [ -n "${2}" ]; then
0169             exit 1
0170         fi
0171     fi
0172 }
0173 
0174 # print status messages
0175 print_msg() {
0176     printf "\e[32m%s\e[0m\n" "${1}"
0177     printf "%s\n" "${1}" >> ${OUTPUT_LOG}
0178 }
0179 
0180 check_dir_path () {
0181     printf "%s" "Checking if ${1} exists and is dir... "
0182     if test -d ${1}; then
0183         echo "OK"
0184 
0185     elif test -e ${1}; then
0186         echo "\n\tERROR: file ${1} exists but is not a directory!" >&2
0187         return 1
0188     else
0189         echo "Creating ${1}"
0190         mkdir ${1}
0191     fi
0192     return 0
0193 }
0194 
0195 # this is needed now as ninja is compiled as 3rdparty
0196 # in universal build it is available at the start of
0197 # the arm step but missing after the x86_64 dir moves
0198 reset_cmake_generator() {
0199     OSXBUILD_GENERATOR="Unix Makefiles"
0200     if [[ -e $(which ninja) ]]; then
0201         OSXBUILD_GENERATOR="Ninja"
0202     fi
0203 }
0204 
0205 waiting_fixed() {
0206     local message="${1}"
0207     local waitTime=${2}
0208 
0209     for i in $(seq ${waitTime}); do
0210         sleep 1
0211         printf -v dots '%*s' ${i}
0212         printf -v spaces '%*s' $((${waitTime} - $i))
0213         printf "\r%s [%s%s]" "${message}" "${dots// /.}" "${spaces}"
0214     done
0215     printf "\n"
0216 }
0217 
0218 dir_clean() {
0219     if [[ -d "${1}" ]]; then
0220         log "Default cleaning build dirs, use --dirty to keep them..."
0221         waiting_fixed "Erase of ${1} in 5 sec" 5
0222         rm -rf "${1}"
0223     fi
0224 }
0225 
0226 # builds dependencies for the first time
0227 cmake_3rdparty () {
0228     cd ${KIS_TBUILD_DIR}
0229 
0230     local build_pkgs=("${@}") # convert to array
0231     local error="false"
0232 
0233     if [[ ${2} = "1" ]]; then
0234         local nofix="true"
0235         local build_pkgs=(${build_pkgs[@]:0:1})
0236     fi
0237 
0238     for package in ${build_pkgs[@]} ; do
0239         if [[ ${package:0:3} != "ext" ]]; then
0240             continue
0241         fi
0242         print_msg "Building ${package}"
0243         log_cmd cmake --build . --config RelWithDebInfo -j${MAKE_THREADS} --target ${package}
0244 
0245         print_if_error "Failed build ${package}"
0246         if [[ ! ${osxbuild_error} -ne 0 ]]; then
0247             print_msg "Build Success! ${package}"
0248         else
0249             log "${pkg} build fail, attempting known fixes..."
0250             error="true"
0251         fi
0252         # fixes does not depend on failure
0253         if [[ ! ${nofix} ]]; then
0254             build_3rdparty_fixes ${package} ${error}
0255         elif [[ "${error}" = "true" ]]; then
0256             log "ERROR: ${pkg} failed a second time, please check pkg logs"
0257             log "stopping..."
0258         fi
0259     done
0260 }
0261 
0262 cmake_3rdparty_plugins () {
0263     cd ${KIS_PLUGIN_BUILD_DIR}
0264 
0265     local build_pkgs=("${@}") # convert to array
0266     local error="false"
0267 
0268     if [[ ${2} = "1" ]]; then
0269         local build_pkgs=(${build_pkgs[@]:0:1})
0270     fi
0271 
0272     for package in ${build_pkgs[@]} ; do
0273         if [[ ${package:0:3} != "ext" ]]; then
0274             continue
0275         fi
0276         print_msg "Building ${package}"
0277         log_cmd cmake --build . --config RelWithDebInfo -j${MAKE_THREADS} --target ${package}
0278 
0279         print_if_error "Failed build ${package}"
0280         if [[ ! ${osxbuild_error} -ne 0 ]]; then
0281             print_msg "Build Success! ${package}"
0282         else
0283             log "${pkg} build fail, stopping..."
0284             exit 1
0285         fi
0286     done
0287 }
0288 
0289 build_3rdparty_fixes(){
0290     local pkg=${1}
0291     local error=${2}
0292 
0293     if [[ "${error}" = "true" ]]; then
0294         log "Error building package ${pkg}, stopping..."
0295         exit 1
0296     fi
0297 }
0298 
0299 build_3rdparty () {
0300     print_msg "building in ${KIS_TBUILD_DIR}"
0301 
0302     log "$(check_dir_path ${KIS_TBUILD_DIR})"
0303     log "$(check_dir_path ${KIS_DOWN_DIR})"
0304     log "$(check_dir_path ${KIS_INSTALL_DIR})"
0305 
0306     # reset_cmake_generator
0307 
0308     cd ${KIS_TBUILD_DIR}
0309     
0310     declare -a CMAKE_CMD
0311     CMAKE_CMD=(cmake "${KIS_SRC_DIR}/3rdparty/"
0312         -G "\"${OSXBUILD_GENERATOR}\""
0313         -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13
0314         -DCMAKE_INSTALL_PREFIX="${KIS_INSTALL_DIR}"
0315         -DCMAKE_PREFIX_PATH:PATH="${KIS_INSTALL_DIR}"
0316         -DEXTERNALS_DOWNLOAD_DIR="${KIS_DOWN_DIR}"
0317         -DINSTALL_ROOT="${KIS_INSTALL_DIR}"
0318         -DCMAKE_OSX_ARCHITECTURES="${OSX_ARCHITECTURES}"
0319         -DMACOS_UNIVERSAL="${OSXBUILD_UNIVERSAL}"
0320         )
0321 
0322     printf -v CMAKE_CMD_STRING '%s ' "${CMAKE_CMD[@]}"
0323     # hack:: Jenkins runs in x86_64 env, force run cmake in arm64 env.
0324     if [[ ${OSXBUILD_UNIVERSAL} ]]; then
0325         log_cmd env /usr/bin/arch -arm64 /bin/zsh -c "${CMAKE_CMD_STRING}"
0326     else
0327         log_cmd /bin/zsh -c "${CMAKE_CMD_STRING}"
0328     fi
0329 
0330     print_msg "finished 3rdparty build setup"
0331 
0332     if [[ -n ${1} ]]; then
0333         cmake_3rdparty "${@}"
0334         # log "Syncing install backup..."
0335         # rsync -a --delete "${KIS_INSTALL_DIR}" "${KIS_INSTALL_DIR}.onlydeps"
0336         exit
0337     fi
0338 
0339     # build 3rdparty tools
0340     # The order must be changed with caution
0341     cmake_3rdparty \
0342         ext_pkgconfig \
0343         ext_openssl \
0344         ext_python \
0345         ext_zlib \
0346         ext_gettext \
0347         ext_iconv \
0348         ext_qt \
0349         ext_boost \
0350         ext_eigen3 \
0351         ext_exiv2 \
0352         ext_fftw3 \
0353         ext_jpeg \
0354         ext_lcms2 \
0355         ext_ocio \
0356         ext_openexr
0357 
0358     cmake_3rdparty \
0359         ext_lzma \
0360         ext_png \
0361         ext_tiff \
0362         ext_openjpeg \
0363         ext_gsl \
0364         ext_giflib
0365 
0366     cmake_3rdparty ext_jpegxl
0367     cmake_3rdparty ext_webp
0368     cmake_3rdparty ext_libheif
0369     cmake_3rdparty ext_sdl2
0370     cmake_3rdparty ext_ffmpeg
0371 
0372     cmake_3rdparty ext_sip
0373     cmake_3rdparty ext_pyqt
0374 
0375     cmake_3rdparty ext_extra_cmake_modules
0376     cmake_3rdparty ext_libraw
0377     # this brings all kdeframeworks deps
0378     cmake_3rdparty ext_kwindowsystem   
0379     cmake_3rdparty ext_quazip
0380 
0381     cmake_3rdparty ext_seexpr
0382     cmake_3rdparty ext_mypaint
0383     cmake_3rdparty ext_xsimd
0384     cmake_3rdparty ext_mlt
0385 
0386     cmake_3rdparty \
0387         ext_freetype \
0388         ext_fontconfig \
0389         ext_fribidi \
0390         ext_unibreak \
0391         ext_poppler
0392 
0393     cmake_3rdparty ext_lager
0394 
0395     ## All builds done, creating a new install onlydeps install dir
0396     dir_clean "${KIS_INSTALL_DIR}.onlydeps"
0397     log "Copying ${KIS_INSTALL_DIR} to ${KIS_INSTALL_DIR}.onlydeps"
0398     cp -aP "${KIS_INSTALL_DIR}" "${KIS_INSTALL_DIR}.onlydeps"
0399     print_msg "Build Finished!"
0400 }
0401 
0402 
0403 #not tested
0404 set_krita_dirs() {
0405     if [[ -n ${1} ]]; then
0406         KIS_BUILD_DIR=${BUILDROOT}/b_${1}
0407         KIS_INSTALL_DIR=${BUILDROOT}/i_${1}
0408         KIS_SRC_DIR=${BUILDROOT}/src_${1}
0409     fi
0410 }
0411 # build_krita
0412 # run cmake krita
0413 build_krita () {
0414     if [[ -z ${OSXBUILD_CLEAN} ]]; then
0415         log "Deleting ${KIS_BUILD_DIR}"
0416         dir_clean "${KIS_BUILD_DIR}"
0417     else
0418         if [[ -e "${KIS_INSTALL_DIR}.onlydeps" && -d "${KIS_INSTALL_DIR}.onlydeps" ]]; then
0419             print_msg "Found ${KIS_INSTALL_DIR}.onlydeps"
0420             log "==== manually copy onlydeps to ${KIS_INSTALL_DIR} if you need a fresh build"
0421         fi
0422     fi
0423 
0424     export DYLD_FRAMEWORK_PATH=${FRAMEWORK_PATH}
0425     echo ${KIS_BUILD_DIR}
0426     echo ${KIS_INSTALL_DIR}
0427     log_cmd check_dir_path ${KIS_BUILD_DIR}
0428     cd ${KIS_BUILD_DIR}
0429 
0430     if [ -z "${KRITA_BRANDING}" ]; then
0431         # determine the channel for branding
0432         if [ "${JOB_NAME}" == "Krita_Nightly_MacOS_Build" ]; then
0433             KRITA_BRANDING="Next"
0434         elif [ "${JOB_NAME}" == "Krita_Stable_MacOS_Build" ]; then
0435             KRITA_BRANDING="Plus"
0436         else
0437             KRITA_BRANDING=""
0438         fi
0439     fi
0440 
0441     reset_cmake_generator
0442 
0443     declare -a CMAKE_CMD
0444     CMAKE_CMD=(cmake "${KIS_SRC_DIR}"
0445         -G "\"${OSXBUILD_GENERATOR}\""
0446         -DFOUNDATION_BUILD=ON
0447         -DBRANDING="${KRITA_BRANDING}"
0448         -DBoost_INCLUDE_DIR="${KIS_INSTALL_DIR}/include"
0449         -DCMAKE_INSTALL_PREFIX="${KIS_INSTALL_DIR}"
0450         -DCMAKE_PREFIX_PATH="${KIS_INSTALL_DIR}"
0451         -DDEFINE_NO_DEPRECATED=1
0452         -DBUILD_TESTING="${OSXBUILD_TESTING}"
0453         -DHIDE_SAFE_ASSERTS"=${OSXBUILD_HIDE_SAFEASSERTS}"
0454         -DKRITA_ENABLE_PCH=off
0455         -DKDE_INSTALL_BUNDLEDIR="${KIS_INSTALL_DIR}/bin"
0456         -DPYQT_SIP_DIR_OVERRIDE="${KIS_INSTALL_DIR}/share/sip/"
0457         -DCMAKE_BUILD_TYPE="${OSXBUILD_TYPE}"
0458         -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13
0459         -DPYTHON_INCLUDE_DIR="${KIS_INSTALL_DIR}/lib/Python.framework/Headers"
0460         -DCMAKE_OSX_ARCHITECTURES="${OSX_ARCHITECTURES}"
0461         -DMACOS_UNIVERSAL="${OSXBUILD_UNIVERSAL}"
0462         )
0463 
0464     if [[ ${OSXBUILD_TYPE} = "Debug" ]]; then
0465         CMAKE_CMD+=(-DKRITA_DEVS=ON)
0466     fi
0467 
0468     printf -v CMAKE_CMD_STRING '%s ' "${CMAKE_CMD[@]}"
0469     # hack:: Jenkins runs in x86_64 env, force run cmake in arm64 env.
0470     if [[ ${OSXBUILD_UNIVERSAL} ]]; then
0471         log_cmd env /usr/bin/arch -arm64 /bin/zsh -c "${CMAKE_CMD_STRING}"
0472     else
0473         log_cmd /bin/zsh -c "${CMAKE_CMD_STRING}"
0474     fi
0475 
0476     print_if_error "Configuration error! ${filename}" "exit"
0477 
0478     # compiling phase
0479     log_cmd cmake --build . -- -j ${MAKE_THREADS}
0480     print_if_error "Krita compilation failed! ${filename}" "exit"
0481 
0482     # compile integrations
0483     if test "${OSTYPE}" == "darwin*"; then
0484         cd "${KIS_BUILD_DIR}/krita/integration/kritaquicklook"
0485         cmake --build . -- -j ${MAKE_THREADS}
0486     fi
0487 }
0488 
0489 build_krita_tarball () {
0490     filename="$(basename ${1})"
0491     KIS_CUSTOM_BUILD="${BUILDROOT}/releases/${filename%.tar.gz}"
0492     print_msg "Tarball BUILDROOT is ${KIS_CUSTOM_BUILD}"
0493 
0494     filename_dir=$(dirname "${1}")
0495     cd "${filename_dir}"
0496     file_abspath="$(pwd)/${1##*/}"
0497 
0498     mkdir "${KIS_CUSTOM_BUILD}" 2> /dev/null
0499     cd "${KIS_CUSTOM_BUILD}"
0500 
0501     mkdir "src" "build" 2> /dev/null
0502     log_cmd tar -xzf "${file_abspath}" --strip-components=1 --directory "src"
0503 
0504     print_if_error "Failed untar of ${filename}" "exit"
0505 
0506     KIS_BUILD_DIR="${KIS_CUSTOM_BUILD}/build"
0507     KIS_SRC_DIR="${KIS_CUSTOM_BUILD}/src"
0508 
0509     build_krita
0510 
0511     print_msg "Build done!"
0512 }
0513 
0514 install_krita () {
0515     # custom install provided
0516     if [[ -n "${1}" ]]; then
0517         KIS_BUILD_DIR="${1}"
0518     fi
0519 
0520     print_msg "Install krita from ${KIS_BUILD_DIR}"
0521     log_cmd check_dir_path ${KIS_BUILD_DIR}
0522 
0523     cd "${KIS_BUILD_DIR}"
0524     osxbuild_error="${?}"
0525     print_if_error "could not cd to ${KIS_BUILD_DIR}" "exit"
0526 
0527     cmake --install .
0528 
0529     # compile integrations
0530     if test ${OSTYPE} == "darwin*"; then
0531         cd ${KIS_BUILD_DIR}/krita/integration
0532         cmake --install .
0533     fi
0534 }
0535 
0536 build_plugins () {
0537     if [[ -z ${OSXBUILD_CLEAN} ]]; then
0538         dir_clean "${KIS_PLUGIN_BUILD_DIR}"
0539     fi
0540 
0541     print_msg "building in ${KIS_PLUGIN_BUILD_DIR}"
0542 
0543     log "$(check_dir_path ${KIS_PLUGIN_BUILD_DIR})"
0544     log "$(check_dir_path ${KIS_DOWN_DIR})"
0545     log "$(check_dir_path ${KIS_INSTALL_DIR})"
0546 
0547     cd ${KIS_PLUGIN_BUILD_DIR}
0548 
0549     declare -a CMAKE_CMD
0550     CMAKE_CMD=(cmake "${KIS_SRC_DIR}/3rdparty_plugins/"
0551         -G "\"${OSXBUILD_GENERATOR}\""
0552         -DCMAKE_OSX_DEPLOYMENT_TARGET=10.13
0553         -DCMAKE_INSTALL_PREFIX="${KIS_INSTALL_DIR}"
0554         -DCMAKE_PREFIX_PATH:PATH="${KIS_INSTALL_DIR}"
0555         -DEXTERNALS_DOWNLOAD_DIR="${KIS_DOWN_DIR}"
0556         -DINSTALL_ROOT="${KIS_INSTALL_DIR}"
0557         -DCMAKE_OSX_ARCHITECTURES="${OSX_ARCHITECTURES}"
0558         -DMACOS_UNIVERSAL="${OSXBUILD_UNIVERSAL}"
0559         )
0560 
0561     # hack:: Jenkins runs in x86_64 env, force run cmake in arm64 env.
0562     printf -v CMAKE_CMD_STRING '%s ' "${CMAKE_CMD[@]}"
0563     if [[ ${OSXBUILD_UNIVERSAL} ]]; then
0564         log_cmd env /usr/bin/arch -arm64 /bin/zsh -c "${CMAKE_CMD_STRING}"
0565     else
0566         log_cmd /bin/zsh -c "${CMAKE_CMD_STRING}"
0567     fi
0568 
0569     print_msg "finished plugins build setup"
0570 
0571     cmake_3rdparty_plugins \
0572         ext_gmic \
0573 
0574     print_msg "Build Finished!"
0575 }
0576 
0577 get_directory_fromargs() {
0578     local OSXBUILD_DIR=""
0579     for arg in "${@}"; do
0580         if [[ -d "${arg}" ]]; then
0581             OSXBUILD_DIR="${arg}"
0582             continue
0583         fi
0584     done
0585     echo "${OSXBUILD_DIR}"
0586 }
0587 
0588 # # # # # # # # # # # # # # # # # # #
0589 
0590 ####     Script main routine    #####
0591 
0592 # # # # # # # # # # # # # # # # # # #
0593 print_usage () {
0594     printf "USAGE: osxbuild.sh <buildstep> [pkg|file]\n"
0595     printf "BUILDSTEPS:\t\t"
0596     printf "\n builddeps \t\t Run cmake step for 3rd party dependencies, optionally takes a [pkg] arg"
0597     printf "\n fixboost \t\t Fixes broken boost \@rpath on OSX"
0598     printf "\n build \t\t\t Builds krita"
0599     printf "\n buildtarball \t\t Builds krita from provided [file] tarball"
0600     printf "\n clean \t\t\t Removes build and install directories to start fresh"
0601     printf "\n install \t\t Installs krita. Optionally accepts a [build dir] as argument
0602     \t\t\t this will install krita from given directory"
0603     printf "\n buildinstall \t\t Build and Installs krita, running fixboost after installing"
0604     printf "\n"
0605     printf "OPTIONS:\t\t"
0606     printf "\n \t --dirty \t [build/install] (old default) Keep old build directories before build to start fresh"
0607     printf "\n \t --debug \t [build] Build in Debug mode"
0608     printf "\n \t --tests \t [build] Build tests"
0609     printf "\n \t --showasserts \t [build] Do not hide asserts"
0610     printf "\n \t --universal \t [build] (arm only) Build universal binary files."
0611     printf "\n"
0612     printf "\n \t --install_tarball \n \t\t\t [buildtarball] Install just built tarball file."
0613     printf "\n"
0614 }
0615 
0616 script_run() {
0617     if [[ ${#} -eq 0 ]]; then
0618         echo "ERROR: No option given!"
0619         print_usage
0620         exit 1
0621     fi
0622 
0623     if [[ ${1} = "builddeps" ]]; then
0624         if [[ -z ${OSXBUILD_CLEAN} ]]; then
0625             dir_clean "${KIS_INSTALL_DIR}"
0626             dir_clean "${KIS_TBUILD_DIR}"
0627         fi
0628         build_3rdparty "${@:2}"
0629 
0630     elif [[ ${1} = "rebuilddep" ]]; then
0631         # experimental
0632         echo "Searching stamp directories"
0633         for pkg in "${@:2}"; do
0634             find "${KIS_TBUILD_DIR}" -name "${pkg}-stamp" -type d -depth 4 -print0 \
0635                 -exec echo "deleting {}" \; -exec rm -rf {} \;
0636         done
0637         cmake_3rdparty "${@:2}"
0638 
0639     elif [[ ${1} = "build" ]]; then
0640         OSXBUILD_DIR=$(get_directory_fromargs "${@:2}")
0641 
0642         build_krita "${OSXBUILD_DIR}"
0643         exit
0644 
0645     elif [[ ${1} = "buildplugins" ]]; then
0646         build_plugins "${@:2}"
0647 
0648         exit
0649 
0650     elif [[ ${1} = "buildtarball" ]]; then
0651         # uncomment line to optionally change
0652         # install directory providing a third argument
0653         # This is not on by default as build success requires all
0654         # deps installed in the given dir beforehand.
0655         # KIS_INSTALL_DIR=${3}
0656 
0657         if [[ -f "${2}" && "${2:(-7)}" == ".tar.gz" ]]; then
0658             TARBALL_FILE="${2}"
0659             build_krita_tarball "${TARBALL_FILE}"
0660 
0661             if [[ -n "${OSXBUILD_TARBALLINSTALL}" ]]; then
0662                 install_krita "${KIS_BUILD_DIR}"
0663             else
0664                 print_msg "to install run
0665 osxbuild.sh install ${KIS_BUILD_DIR}"
0666             fi
0667             exit
0668         else
0669             log "File not a tarball tar.gz file"
0670         fi
0671         
0672 
0673     elif [[ ${1} = "clean" ]]; then
0674         # remove all build and install directories to start
0675         # a fresh install. this no different than using rm directly
0676         dir_clean "${KIS_TBUILD_DIR}"
0677         dir_clean "${KIS_BUILD_DIR}"
0678         dir_clean "${KIS_INSTALL_DIR}"
0679         exit
0680 
0681     elif [[ ${1} = "install" ]]; then
0682         OSXBUILD_DIR=$(get_directory_fromargs "${@:2}")
0683 
0684         install_krita "${OSXBUILD_DIR}"
0685         build_plugins "${OSXBUILD_DIR}"
0686 
0687     elif [[ ${1} = "buildinstall" ]]; then
0688         OSXBUILD_DIR=$(get_directory_fromargs "${@:2}")
0689 
0690         build_krita "${OSXBUILD_DIR}"
0691         install_krita "${OSXBUILD_DIR}"
0692 
0693         build_plugins "${OSXBUILD_DIR}"
0694 
0695     elif [[ ${1} = "test" ]]; then
0696         ${KIS_INSTALL_DIR}/bin/krita.app/Contents/MacOS/krita
0697 
0698     else
0699         echo "Option ${1} not supported"
0700         print_usage
0701         exit 1
0702     fi
0703 }
0704 
0705 script_run ${parsed_args}