#! /usr/bin/env bash # This script is meant to be kept small and simple # If you think about adding features, it's probably a bad idea set -e # exit if a command fails set -o pipefail # Will return the exit status of make if it fails project_source_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)" build_dir="${project_source_dir}/build${SUBDIR:+/${SUBDIR}}" install_dir="${project_source_dir}/install${SUBDIR:+/${SUBDIR}}" install_target='install/strip' build_type='Release' case "$(uname -s)" in # Stripping is known to make non-PIE Linux netradiant binary unusable. # Maybe that's related to the way we patch rpath? # # Building NetRadiant as non-PIE is required because of # a mistake in the mimetype-library that prevents users # to run the application from file managers on Linux. # # See: https://gitlab.freedesktop.org/xdg/shared-mime-info/-/issues/11 # # After installation it's possible to strip manually all binaries except # the netradiant one. 'Linux') install_target='install' ;; # Stripping is known to make FreeBSD binaries unusable. # Maybe that's related to the way we patch rpath? 'FreeBSD') install_target='install' ;; esac _job_count=4 _nproc () { if command -v 'nproc' >/dev/null then nproc else case "$(uname -s)" in 'Linux') egrep "^processor" /proc/cpuinfo | wc -l ;; 'FreeBSD') sysctl -n hw.ncpu ;; 'Darwin') sysctl -n hw.logicalcpu \ || sysctl -n hw.ncpu ;; 'MSYS_NT-'*|'CYGWIN_NT-'*|'MINGW'*'_NT-'*) if command -v 'wmic' >/dev/null then wmic cpu get NumberOfLogicalProcessors/Format:List \ | grep -m1 '=' | cut -f2 -d'=' else echo "${NUMBER_OF_PROCESSORS:-${_job_count}}" fi ;; *) echo "${_job_count}" ;; esac fi } job_count="$(_nproc)" 2>/dev/null job_count="${job_count:-${_job_count}}" declare -a cmake_user_opts while [ ! -z "${1}" ] do case "${1}" in '-j'*) job_count="${1:2}" shift ;; '--debug') install_target='install' build_type='Debug' shift ;; *) cmake_user_opts[${#cmake_user_opts[@]}]="${1}" shift ;; esac done declare -a fetch_submodules_cmd for submodule_file in 'libs/crunch/inc/crn_decomp.h' \ 'tools/unvanquished/daemonmap/tools/quake3/q3map2/main.c' do if ! [ -f "${project_source_dir}/${submodule_file}" ] then fetch_submodules_cmd=(git -C "${project_source_dir}" submodule update --init --recursive) fi done case "$(uname -s)" in 'Darwin') cmake_user_opts[${#cmake_user_opts[@]}]='-DBUILTIN_GTKGLEXT=ON -DBUILTIN_GTKTHEME_MOJAVE=ON' ;; esac task_enter_build_dir () { sync mkdir -pv "${build_dir}" cd "${build_dir}" } task_fetch_submodules () { sync "${fetch_submodules_cmd[@]}" } task_configure () { sync cmake \ -G'Unix Makefiles' \ -D'CMAKE_INSTALL_PREFIX'="${install_dir}" \ -D'CMAKE_BUILD_TYPE'="${build_type}" \ "${cmake_user_opts[@]}" \ "${project_source_dir}" } task_build_builtins () { sync make -j"${job_count}" builtins } task_discover_builtins () { sync cmake "${project_source_dir}" } task_build () { sync make -j"${job_count}" } task_install () { sync make "${install_target}" } set -x task_enter_build_dir task_fetch_submodules task_configure task_build_builtins task_discover_builtins task_build task_install