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}