]> git.xonotic.org Git - xonotic/netradiant.git/blob - easy-builder
Merge branch 'NateEag-master-patch-12920' into 'master'
[xonotic/netradiant.git] / easy-builder
1 #! /usr/bin/env bash
2
3 # This script is meant to be kept small and simple
4 # If you think about adding features, it's probably a bad idea
5
6 set -e # exit if a command fails
7 set -o pipefail # Will return the exit status of make if it fails
8
9 project_source_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
10
11 build_dir="${project_source_dir}/build${SUBDIR:+/${SUBDIR}}"
12 install_dir="${project_source_dir}/install${SUBDIR:+/${SUBDIR}}"
13
14 install_target='install/strip'
15 build_type='Release'
16
17 case "$(uname -s)" in
18         # Stripping is known to make non-PIE Linux netradiant binary unusable.
19         # Maybe that's related to the way we patch rpath?
20         #
21         # Building NetRadiant as non-PIE is required because of
22         # a mistake in the mimetype-library that prevents users
23         # to run the application from file managers on Linux.
24         #
25         # See: https://gitlab.freedesktop.org/xdg/shared-mime-info/-/issues/11
26         #
27         # After installation it's possible to strip manually all binaries except
28         # the netradiant one.
29         'Linux')
30                 install_target='install'
31                 ;;
32         # Stripping is known to make FreeBSD binaries unusable.
33         # Maybe that's related to the way we patch rpath?
34         'FreeBSD')
35                 install_target='install'
36                 ;;
37 esac
38
39 _job_count=4
40
41 _nproc () {
42         if command -v 'nproc' >/dev/null
43         then
44                 nproc
45         else
46                 case "$(uname -s)" in
47                         'Linux')
48                                 egrep "^processor" /proc/cpuinfo | wc -l
49                                 ;;
50                         'FreeBSD')
51                                 sysctl -n hw.ncpu
52                                 ;;
53                         'Darwin')
54                                 sysctl -n hw.logicalcpu \
55                                 || sysctl -n hw.ncpu
56                                 ;;
57                         'MSYS_NT-'*|'CYGWIN_NT-'*|'MINGW'*'_NT-'*)
58                                 if command -v 'wmic' >/dev/null
59                                 then
60                                         wmic cpu get NumberOfLogicalProcessors/Format:List \
61                                                 | grep -m1 '=' | cut -f2 -d'='
62                                 else
63                                         echo "${NUMBER_OF_PROCESSORS:-${_job_count}}"
64                                 fi
65                                 ;;
66                         *)
67                                 echo "${_job_count}"
68                                 ;;
69                 esac
70         fi
71 }
72
73 job_count="$(_nproc)" 2>/dev/null
74 job_count="${job_count:-${_job_count}}"
75
76 declare -a cmake_user_opts
77 while [ ! -z "${1}" ]
78 do
79         case "${1}" in
80         '-j'*)
81                 job_count="${1:2}"
82                 shift
83                 ;;
84         '--debug')
85                 install_target='install'
86                 build_type='Debug'
87                 shift
88                 ;;
89         *)
90         cmake_user_opts[${#cmake_user_opts[@]}]="${1}"
91         shift
92                 ;;
93         esac
94 done
95
96 declare -a fetch_submodules_cmd
97 for submodule_file in 'libs/crunch/inc/crn_decomp.h'
98 do
99         if ! [ -f "${project_source_dir}/${submodule_file}" ]
100         then
101                 fetch_submodules_cmd=(git -C "${project_source_dir}" submodule update --init --recursive)
102         fi
103 done
104
105 case "$(uname -s)" in
106         'Darwin')
107                 cmake_user_opts[${#cmake_user_opts[@]}]='-DBUILTIN_GTKGLEXT=ON -DBUILTIN_GTKTHEME_MOJAVE=ON'
108                 ;;
109 esac
110
111 task_enter_build_dir () {
112         sync
113         mkdir -pv "${build_dir}"
114         cd "${build_dir}"
115 }
116
117 task_fetch_submodules () {
118         sync
119         "${fetch_submodules_cmd[@]}"
120 }
121
122 task_configure () {
123         sync
124         cmake \
125                 -G'Unix Makefiles' \
126                 -D'CMAKE_INSTALL_PREFIX'="${install_dir}" \
127                 -D'CMAKE_BUILD_TYPE'="${build_type}" \
128                 "${cmake_user_opts[@]}" \
129                 "${project_source_dir}"
130 }
131
132 task_build_builtins () {
133         sync
134         make -j"${job_count}" builtins
135 }
136
137 task_discover_builtins () {
138         sync
139         cmake "${project_source_dir}"
140 }
141
142 task_build () {
143         sync
144         make -j"${job_count}"
145 }
146
147 task_install () {
148         sync
149         make "${install_target}"
150 }
151
152 set -x
153
154 task_enter_build_dir
155
156 task_fetch_submodules
157
158 task_configure
159
160 task_build_builtins
161
162 task_discover_builtins
163
164 task_build
165
166 task_install