File: create_packages.sh

package info (click to toggle)
checkit-tiff 1.6.0-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,232 kB
  • sloc: ansic: 8,441; perl: 1,265; sh: 224; cpp: 62; makefile: 6
file content (348 lines) | stat: -rwxr-xr-x 15,134 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
#!/usr/bin/env bash

#++
#++ create_packages.sh - builds Repository packages for checkit_tiff using an intermediary Docker container
#++ 
#++ USAGE:
#++
#++   create_packages.sh ARGS
#++ 
#++ ARGS:
#++
#++   -h | --help
#++     show this help message
#++
#++   -k | --keep
#++     keep existing container. This is the Default.
#++
#++   -r | --replace
#++     replace existing container by a fresh build. The opposite of --keep.
#++
#++   -s | --static-link
#++     build checkit_tiff binaries with static link. Default is static linking if this flag isn't used.
#++
#++   -w|--warn|--warnings
#++     show cmake warnings during the build process. By default, warnings are OFF.
#++
#++   -l|--dynamic-link)
#++     build checkit_tiff binaries with dynamic link. Default is static linking if this flag isn't used.
#++
#++   -c | --current <VERSION>
#++     pass release version for checkit_tiff_current. This is usually a Git Tag.
#++
#++   -u | --upcoming <VERSION>
#++     pass release version for checkit_tiff_upcoming. This is usually a Git Tag.
#++
#++   --enable-icc-lino
#++     allow embedded ICC profiles that have their CMM type set to "Lino". This is the default.
#++
#++   --enable-icc-outdated
#++     allow embedded ICC profiles with outdated version 2.4. This is the default.
#++
#++   --enable-icc-strict
#++     enable a strict check of ICC versions. Normally, correct major version is sufficient, but this will check for the minor version as well to warn about outdated ICC profile versions.
#++
#++   --enable-icc-proflib
#++     able the usage of a detected ICC prof lib. This is the default.
#++
#++   --disable-icc-lino
#++     disallow embedded ICC profiles that have their CMM type set to "Lino"
#++
#++   --disable-icc-outdated
#++     disallow embedded ICC profiles with outdated version 2.4
#++
#++   --disable-icc-strict
#++     enable a strict check of ICC versions. Normally, correct major version is sufficient, but this will check for the minor version as well to warn about outdated ICC profile versions. This is the default.
#++
#++   --disable-icc-proflib
#++     disable the usage of a detected ICC prof lib by setting the CMAKE flag "WITHOUT_ICC_PROFLIB".
#++
#++
#++ GENERAL:
#++
#++   Defaults are set in the code. Parameters cat set in the config file and on the CLI.
#++   The precedence is:
#++     - Defaults are overwritten by both config file options and CLI parameters.
#++     - Config file options are only overwritten by CLI parameters.
#++   If you use both an "enable" and a "disable" parameter on the CLI, then the "disable" will win. This behaviour is designed to avoid any undefined behaviour due to contradictions.
#++




### START SET CONFIG DEFAULTS
replace_container="false"
container_name="cit_build"
config_file="./create_packages.cfg"
cit_repo='https://git.fsfe.org/art1pirat/checkit_tiff.git'
declare -A cit_versions
cit_versions[current]="v"
cit_versions[upcoming]="v"
# Use empty strings to disable options
cmake_flag_icc_lino="-DALLOW_CMMTYPE_LINO"	# allow preferred CMM type "LINO"
cmake_flag_icc_outdated="-DALLOW_ICC1_2001_04"	# allow outdated ICC.1:2001-04 version (2.4.0)
cmake_flag_icc_strict=""			# enable strict ICC version check, Default: disabled
cmake_flag_icc_proflib=""			# enable ICC checks using ICC Proflib if installed, Default: enabled (empty string)
cmake_flag_static="-DSTATIC=1"			# compile a statically linked binary, Default: static link
cmake_static_compile="-s"			# compile a statically linked binary, Default: static link
### END SET CONFIG DEFAULTS

# override default configs with custom values from config file
# shellcheck source=/dev/null
source "${config_file}"

# Cmake flags to configure the build process.
cmake_flags="-ansi -O3 -flto -fstack-check -fstack-protector-strong"
cmake_flag_warnings=""
script_fullpath="$( dirname "$( realpath "${0}")" )/"

# Call getopt to validate the provided input. 
cli_args=$( getopt \
            --longoptions help,keep,replace,static-link,warn,warnings,dynamic-link,enable-icc-lino,enable-icc-outdated,enable-icc-strict,enable-icc-proflib,disable-icc-lino,disable-icc-outdated,disable-icc-strict,disable-icc-proflib,current:,upcoming: \
            --options hkrswlc:u: \
	    -- "$@" \
          )
# Assign any remaining arguments to the positional parameters. If there are no remaining arguments, the positional parameters are unset.
eval set -- "$cli_args"

# evaluate CLI args
while true; do
	case "$1" in
		-h|--help)
			sed -rn 's/^#\+\+ ?//;T;p' "$0"
			exit 0
			;;
		-k|--keep)
			replace_container="false"
			;;
		-r|--replace)
			replace_container="true"
			;;
		-s|--static-link)
			cmake_flag_static="-DSTATIC=1"
			cmake_static_compile="-s"
			replace_container="true"
			;;
		-w|--warn|--warnings)
			cmake_flag_warnings="-W -Wall -Wextra -pedantic -Wno-unused-function -Wformat -Werror=format-security"
			;;
		-l|--dynamic-link)
			cmake_flag_static=""
			cmake_static_compile=""
			replace_container="true"
			;;
		--enable-icc-lino)
			cmake_flag_icc_lino="-DALLOW_CMMTYPE_LINO"
			replace_container="true"
			;;
		--enable-icc-outdated)
			cmake_flag_icc_outdated="-DALLOW_ICC1_2001_04"
			replace_container="true"
			;;
		--enable-icc-strict)
			cmake_flag_icc_strict="-DWITH_STRONG_ICC"
			replace_container="true"
			;;
		--enable-icc-proflib)
			cmake_flag_icc_proflib=""
			replace_container="true"
			;;
		--disable-icc-lino)
			cmake_flag_icc_lino=""
			replace_container="true"
			;;
		--disable-icc-outdated)
			cmake_flag_icc_outdated=""
			replace_container="true"
			;;
		--disable-icc-strict)
			cmake_flag_icc_strict=""
			replace_container="true"
			;;
		--disable-icc-proflib)
			cmake_flag_icc_proflib="-DWITHOUT_ICC_PROFLIB"
			replace_container="true"
			;;
		-c|--current)
			shift
			cit_versions[current]="$1"
			;;
		-u|upcoming)
			shift
			cit_versions[upcoming]="$1"
			;;
		--)
			shift
			break
			;;
		*)
			echo "ERROR: not a valid CLI parameter: '${1}'. Please use '$(basename "${0}") --help' to view the complete list of supported parameters. Exiting."
			exit 1
			;;
	esac
	shift
done

# check if necessary parameters have been set
[[ -z ${cit_versions[current]} ]] && echo "ERROR: Version for checkit_tiff_current not set. Set it in the config file or use the '--current M.M.S' CLI parameter." && exit 1
[[ -z ${cit_versions[upcoming]} ]] && echo "ERROR: Version for checkit_tiff_upcoming not set. Set it in the config file or use the '--upcoming M.M.S' CLI parameter." && exit 1
[[ -z ${cmake_flag_static} || -z ${cmake_static_compile} ]] && echo "WARNING: Compiling a dynamically linked binary will result in packages that don't have IccProfLib2 encoded in their respective dependencies. Make sure to install the latest version of IccProfLib2 in the search path of your system in order to use these packages without any issues."

# check prerequisites
prerequisites="docker id grep"
for req in ${prerequisites}; do
	command -v "${req}" >/dev/null 2>&1 || { echo >&2 "ERROR: ${req} not installed. Aborting."; exit 1; }
done

# check group membership to run docker commands
if [[ ( ${EUID} -ne 0 ) && ( ! $( id -nG "${USER}" | grep "docker" ) ) ]]; then
	echo "ERROR You need to be root user or member of the 'docker' group. Exiting" && exit 1
fi

if [[ ( $( docker container ls --all --no-trunc --filter name="${container_name}" --format '{{.Names}}' ) ) ]]; then
	if [[ "${replace_container}" == "false" ]]; then
		# run container if it doesn't need to be replaced and can be run as-is
		docker restart "${container_name}"
		echo "INFO: The build has been triggered to run in the background. Your build artifacts (packages, binaries, configs) should soon appear in the 'artifacts/' subdirectory. Please have a little patience."
	else	#[[ "${replace_container}" == "true" ) ]]
		# stop & remove existing container
		docker container rm --force --volumes "${container_name}"
		# remove Docker image
		docker image rm --force "${container_name}"
	fi
fi

if [[ ! $( docker container ls --all --no-trunc --filter name="${container_name}" --format '{{.Names}}' ) ]]; then
	# write entrypoint-script
	cat <<-EOEF > build_cit.sh
		#!/usr/bin/env bash

		# uncomment if you need debug output
		#set -x

		declare -A cit_versions
		cit_versions[current]="${cit_versions[current]}"
		cit_versions[upcoming]="${cit_versions[upcoming]}"
		build_dir="/opt/builddir/"
		artifact_dir="/opt/artifacts/"

		# update packages
		apt-get -y update; apt-get -y upgrade
		
		# cleanup old builddir
		rm -rf "\${build_dir:?}/"; mkdir "\${build_dir}/" || exit 1

		# create shared directory for build artifacts
		[[ ! -d "\${artifact_dir}/" ]] && mkdir "\${artifact_dir}/"

		# compile and install IccProfLib2
		cd "\${build_dir}/" || exit 1
		git clone "https://github.com/InternationalColorConsortium/DemoIccMAX.git"
		cd "\${build_dir}/DemoIccMAX/" || exit 1
		mkdir build && cd build || exit 1
		cmake -DCMAKE_INSTALL_PREFIX=/usr/local/ ../Build/Cmake
		make		# DO NOT USE "-j" FLAG WITH ICCPROFLIB2, IT HANGS DURING THE make RUN!
		make install	# DO NOT USE "-j" FLAG WITH ICCPROFLIB2, IT HANGS DURING THE make RUN!

		# update git repos
		for release in current upcoming; do
			mkdir -p "\${build_dir}/\${release}/" && cd "\${build_dir}/\${release}/" || exit 1
			chmod 0777 "\${build_dir}/"

			# get checkit_tiff
			git clone --branch \${cit_versions[\$release]} ${cit_repo}
			cd "\${build_dir}/\${release}/checkit_tiff/" || exit 1

			# patch CMake config to contain strings for current/upcoming releases in binary and package names
			sed -i s'#project (checkit_tiff)#project (checkit_tiff_'"\${release}"')#' \
				"\${build_dir}/\$release/checkit_tiff/src/CMakeLists.txt"
			sed -i s'#set (CPACK_PACKAGE_NAME "checkit-tiff")#set (CPACK_PACKAGE_NAME "checkit-tiff-'"\${release}"'")#' \
				"\${build_dir}/\$release/checkit_tiff/src/CMakeLists.txt"

			sed -i s'#add_executable(checkit_tiff checkit_tiff.c \${checkit_tiff_SOURCES})#add_executable(checkit_tiff_'"\${release}"' checkit_tiff.c \${checkit_tiff_SOURCES})#' \
				"\${build_dir}/\$release/checkit_tiff/src/CMakeLists.txt"
			sed -i s'#target_link_libraries(checkit_tiff #target_link_libraries(checkit_tiff_'"\${release}"' #' \
				"\${build_dir}/\$release/checkit_tiff/src/CMakeLists.txt"

			sed -i s'#add_executable(checkit_check_config checkit_check_config.c \${checkit_tiff_SOURCES})#add_executable(checkit_check_config_'"\${release}"' checkit_check_config.c \${checkit_tiff_SOURCES})#' \
				"\${build_dir}/\$release/checkit_tiff/src/CMakeLists.txt"
			sed -i s'#target_link_libraries(checkit_check_config #target_link_libraries(checkit_check_config_'"\${release}"' #' \
				"\${build_dir}/\$release/checkit_tiff/src/CMakeLists.txt"

			sed -i s'#add_executable(checkit_tiff_risk checkit_tiff_risk.c \${checkit_tiff_risk_SOURCES})#add_executable(checkit_tiff_risk_'"\${release}"' checkit_tiff_risk.c \${checkit_tiff_risk_SOURCES})#' \
				"\${build_dir}/\$release/checkit_tiff/src/CMakeLists.txt"
			sed -i s'#target_link_libraries(checkit_tiff_risk #target_link_libraries(checkit_tiff_risk_'"\${release}"' #' \
				"\${build_dir}/\$release/checkit_tiff/src/CMakeLists.txt"

			sed -i s'#install( TARGETS checkit_tiff#install( TARGETS checkit_tiff_'"\${release}"'#' \
				"\${build_dir}/\$release/checkit_tiff/src/CMakeLists.txt"
			sed -i s'#DESTINATION share/checkit_tiff/#DESTINATION share/checkit_tiff_'"\${release}"'/#' \
				"\${build_dir}/\$release/checkit_tiff/src/CMakeLists.txt"

			# prepare cross-compiled pcre2
			#wget https://github.com/PhilipHazel/pcre2/releases/download/pcre2-10.40/pcre2-10.40.tar.gz || exit 1
			#tar -xzvf pcre2-10.4ß.tar.gz
			#cd pcre2-10.4ß/ || exit 1
			#./configure --host=x86_64-w64-mingw32 --disable-shared --enable-static
			#make -j
			#cd "\${build_dir}/\${release}/checkit_tiff/" || exit 1

			# build it for Linux!
			rm -rf "./build" && mkdir "build" && cd "build" || exit 1
			PATH="\${PATH}:/usr/lib/x86_64-linux-gnu/:/usr/bin/:/usr/include/"; export PATH;
			cmake ../src/ ${cmake_flag_static} -DCMAKE_C_FLAGS="${cmake_flag_icc_outdated} ${cmake_flag_icc_strict} ${cmake_flag_icc_lino} ${cmake_flag_icc_proflib} ${cmake_static_compile} ${cmake_flags} ${cmake_flag_warnings}"
			make -j
			ln -s \$(pwd)/checkit_check_config_\${release} \$(pwd)/checkit_check_config
			ln -s \$(pwd)/checkit_tiff_\${release} \$(pwd)/checkit_tiff
			if ! make -j test; then
        echo "ERROR: Tests didn't run successfully, aborting build." && exit 1
      fi
			make -j package
			cd .. || exit 1

			# build it for Windows! INOPERATIONAL!
			#rm -rf "./build_win" && mkdir "build_win" && cd "build_win" || exit 1
			#cmake ../src/ -DCMAKE_TOOLCHAIN_FILE=../src/toolchain-mingw64.cmake -DPCRE2_POSIX_LIBRARY=\${build_dir}/\${release}/checkit_tiff/pcre2-10.40/.libs/libpcre2-posix.a -DPCRE2_LIBRARY=\${build_dir}/\${release}/checkit_tiff/pcre2-10.4ß/.libs/libpcre2-8.a -DPCRE2_INCLUDE_DIR=\${build_dir}/\${release}/checkit_tiff/pcre2-10.4ß/src/
			#make -j
			#make -j test
			#cd .. || exit 1

			### copy relevant artifacts out of the build directories and into the shared directory before cleaning up
			# Linux
			mv \${build_dir}/\$release/checkit_tiff/build/checkit-tiff-\$release-* \${artifact_dir}/
			mv \${build_dir}/\$release/checkit_tiff/build/checkit_tiff_\$release \${artifact_dir}/
			mv \${build_dir}/\$release/checkit_tiff/build/checkit_check_config_\$release \${artifact_dir}/
			mv \${build_dir}/\$release/checkit_tiff/build/checkit_tiff_risk_\$release \${artifact_dir}/
			# Windows INOPERATIONAL
			#mv \${build_dir}/\$release/checkit_tiff/build_win/checkit-tiff-\$release-* \${artifact_dir}/
			#mv \${build_dir}/\$release/checkit_tiff/build_win/checkit_tiff_\$release \${artifact_dir}/
			#mv \${build_dir}/\$release/checkit_tiff/build_win/checkit_check_config_\$release \${artifact_dir}/
			#mv \${build_dir}/\$release/checkit_tiff/build_win/checkit_tiff_risk_\$release \${artifact_dir}/
			# Configs
			mv \${build_dir}/\$release/checkit_tiff/example_configs/cit_tiff6_baseline_SLUB.cfg \${artifact_dir}/cit_tiff6_baseline_SLUB_\$release.cfg
			mv \${build_dir}/\$release/checkit_tiff/example_configs/cit_tiff6_geotiff_SLUB.cfg \${artifact_dir}/cit_tiff6_geotiff_SLUB_\$release.cfg
			chown -R \${EXTUID} \${build_dir}
			chown -R \${EXTUID} \${artifact_dir}
		done
EOEF
	chmod +x build_cit.sh
	
	# write Dockerfile
	cat <<-EODF > Dockerfile
		FROM --platform=linux/amd64 debian:stable-slim
		LABEL maintainer="Jörg Sachse <joerg.sachse@slub-dresden.de>"
		RUN apt-get -y update && \
		  apt-get -y install git cmake make gcc gpp build-essential \
		    libfile-slurp-perl libdata-printer-perl pkg-config \
        libpcre2-dev file rpm wget libxml2-dev libtiff-dev \
        gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64       && \
		    apt-get autoclean
		WORKDIR /opt/
		ENTRYPOINT ["/build_cit.sh"]
EODF

	# build Docker image
	docker build --pull --tag "${container_name}:latest" ./
	rm Dockerfile
	docker run --hostname "${container_name}" --name "${container_name}" --volume "${script_fullpath}:/opt/" --volume "${script_fullpath}/build_cit.sh:/build_cit.sh" --cpus 3 --env EXTUID=${UID} "${container_name}:latest"
fi