Imported Upstream version 1.6.39
[platform/upstream/libpng.git] / ci / ci_cmake.sh
1 #!/usr/bin/env bash
2 set -e
3
4 # ci_cmake.sh
5 # Continuously integrate libpng using CMake.
6 #
7 # Copyright (c) 2019-2022 Cosmin Truta.
8 #
9 # This software is released under the libpng license.
10 # For conditions of distribution and use, see the disclaimer
11 # and license in png.h.
12
13 CI_SCRIPTNAME="$(basename "$0")"
14 CI_SCRIPTDIR="$(cd "$(dirname "$0")" && pwd)"
15 CI_SRCDIR="$(dirname "$CI_SCRIPTDIR")"
16 CI_BUILDDIR="$CI_SRCDIR/out/cmake.build"
17 CI_INSTALLDIR="$CI_SRCDIR/out/cmake.install"
18
19 function ci_info {
20     printf >&2 "%s: %s\\n" "$CI_SCRIPTNAME" "$*"
21 }
22
23 function ci_err {
24     printf >&2 "%s: error: %s\\n" "$CI_SCRIPTNAME" "$*"
25     exit 2
26 }
27
28 function ci_spawn {
29     printf >&2 "%s: executing:" "$CI_SCRIPTNAME"
30     printf >&2 " %q" "$@"
31     printf >&2 "\\n"
32     "$@"
33 }
34
35 function ci_init_cmake {
36     CI_SYSTEM_NAME="$(uname -s)"
37     CI_MACHINE_NAME="$(uname -m)"
38     CI_CMAKE="${CI_CMAKE:-cmake}"
39     CI_CTEST="${CI_CTEST:-ctest}"
40     CI_CMAKE_BUILD_TYPE="${CI_CMAKE_BUILD_TYPE:-Release}"
41     [[ -x $(command -v ninja) ]] && CI_CMAKE_GENERATOR="${CI_CMAKE_GENERATOR:-Ninja}"
42     if [[ $CI_CMAKE_GENERATOR == "Visual Studio"* ]]
43     then
44         # Initialize the CI_...DIR_NATIVE variables, for the benefit of
45         # the native Windows build tools. The regular CI_...DIR variables
46         # can only be used inside Bash-on-Windows.
47         mkdir -p "$CI_BUILDDIR"
48         mkdir -p "$CI_INSTALLDIR"
49         if [[ -x $CYGPATH ]]
50         then
51             CI_SRCDIR_NATIVE="$("$CYGPATH" -w "$CI_SRCDIR")"
52             CI_BUILDDIR_NATIVE="$("$CYGPATH" -w "$CI_BUILDDIR")"
53             CI_INSTALLDIR_NATIVE="$("$CYGPATH" -w "$CI_INSTALLDIR")"
54         else
55             CI_SRCDIR_NATIVE="$(cd "$CI_SRCDIR" ; pwd -W || pwd -P)"
56             CI_BUILDDIR_NATIVE="$(cd "$CI_BUILDDIR" ; pwd -W || pwd -P)"
57             CI_INSTALLDIR_NATIVE="$(cd "$CI_INSTALLDIR" ; pwd -W || pwd -P)"
58         fi
59         # Clean up incidental mixtures of Windows and Bash-on-Windows
60         # environment variables, to avoid confusing MSBuild.
61         [[ $TEMP && ( $Temp || $temp ) ]] && unset TEMP
62         [[ $TMP && ( $Tmp || $tmp ) ]] && unset TMP
63         # Ensure that CI_CMAKE_GENERATOR_PLATFORM is initialized for this generator.
64         [[ $CI_CMAKE_GENERATOR_PLATFORM ]] || ci_err "missing: \$CI_CMAKE_GENERATOR_PLATFORM"
65     fi
66 }
67
68 function ci_trace_cmake {
69     ci_info "## START OF CONFIGURATION ##"
70     ci_info "system name: $CI_SYSTEM_NAME"
71     ci_info "machine hardware name: $CI_MACHINE_NAME"
72     ci_info "source directory: $CI_SRCDIR"
73     [[ $CI_SRCDIR_NATIVE ]] &&
74         ci_info "source directory (native): $CI_SRCDIR_NATIVE"
75     ci_info "build directory: $CI_BUILDDIR"
76     [[ $CI_BUILDDIR_NATIVE ]] &&
77         ci_info "build directory (native): $CI_BUILDDIR_NATIVE"
78     ci_info "install directory: $CI_INSTALLDIR"
79     [[ $CI_INSTALLDIR_NATIVE ]] &&
80         ci_info "install directory (native): $CI_INSTALLDIR_NATIVE"
81     ci_info "environment option: \$CI_CMAKE: '$CI_CMAKE'"
82     ci_info "environment option: \$CI_CMAKE_GENERATOR: '$CI_CMAKE_GENERATOR'"
83     ci_info "environment option: \$CI_CMAKE_GENERATOR_PLATFORM: '$CI_CMAKE_GENERATOR_PLATFORM'"
84     ci_info "environment option: \$CI_CMAKE_BUILD_TYPE: '$CI_CMAKE_BUILD_TYPE'"
85     ci_info "environment option: \$CI_CMAKE_BUILD_FLAGS: '$CI_CMAKE_BUILD_FLAGS'"
86     ci_info "environment option: \$CI_CMAKE_VARS: '$CI_CMAKE_VARS'"
87     ci_info "environment option: \$CI_CTEST: '$CI_CTEST'"
88     ci_info "environment option: \$CI_CTEST_FLAGS: '$CI_CTEST_FLAGS'"
89     ci_info "environment option: \$CI_CC: '$CI_CC'"
90     ci_info "environment option: \$CI_CC_FLAGS: '$CI_CC_FLAGS'"
91     ci_info "environment option: \$CI_AR: '$CI_AR'"
92     ci_info "environment option: \$CI_RANLIB: '$CI_RANLIB'"
93     ci_info "environment option: \$CI_SANITIZERS: '$CI_SANITIZERS'"
94     ci_info "environment option: \$CI_NO_TEST: '$CI_NO_TEST'"
95     ci_info "environment option: \$CI_NO_INSTALL: '$CI_NO_INSTALL'"
96     ci_info "environment option: \$CI_NO_CLEAN: '$CI_NO_CLEAN'"
97     ci_info "executable: \$CI_CMAKE: $(command -V "$CI_CMAKE")"
98     ci_info "executable: \$CI_CTEST: $(command -V "$CI_CTEST")"
99     [[ $CI_CMAKE_GENERATOR == *"Ninja"* ]] &&
100         ci_info "executable: $(command -V ninja)"
101     [[ $CI_CC ]] &&
102         ci_info "executable: \$CI_CC: $(command -V "$CI_CC")"
103     [[ $CI_AR ]] &&
104         ci_info "executable: \$CI_AR: $(command -V "$CI_AR")"
105     [[ $CI_RANLIB ]] &&
106         ci_info "executable: \$CI_RANLIB: $(command -V "$CI_RANLIB")"
107     ci_info "## END OF CONFIGURATION ##"
108 }
109
110 function ci_build_cmake {
111     ci_info "## START OF BUILD ##"
112     ci_spawn "$(command -v "$CI_CMAKE")" --version
113     ci_spawn "$(command -v "$CI_CTEST")" --version
114     # Initialize ALL_CC_FLAGS as a string.
115     local ALL_CC_FLAGS="$CI_CC_FLAGS"
116     [[ $CI_SANITIZERS ]] && ALL_CC_FLAGS="-fsanitize=$CI_SANITIZERS $ALL_CC_FLAGS"
117     # Initialize ALL_CMAKE_VARS, ALL_CMAKE_BUILD_FLAGS and ALL_CTEST_FLAGS as arrays.
118     local -a ALL_CMAKE_VARS=()
119     [[ $CI_CC ]] && ALL_CMAKE_VARS+=(-DCMAKE_C_COMPILER="$CI_CC")
120     [[ $ALL_CC_FLAGS ]] && ALL_CMAKE_VARS+=(-DCMAKE_C_FLAGS="$ALL_CC_FLAGS")
121     [[ $CI_AR ]] && ALL_CMAKE_VARS+=(-DCMAKE_AR="$CI_AR")
122     [[ $CI_RANLIB ]] && ALL_CMAKE_VARS+=(-DCMAKE_RANLIB="$CI_RANLIB")
123     ALL_CMAKE_VARS+=(-DCMAKE_BUILD_TYPE="$CI_CMAKE_BUILD_TYPE")
124     ALL_CMAKE_VARS+=(-DCMAKE_VERBOSE_MAKEFILE=ON)
125     [[ $CI_NO_TEST ]] && ALL_CMAKE_VARS+=(-DPNG_TESTS=OFF)
126     ALL_CMAKE_VARS+=($CI_CMAKE_VARS)
127     local -a ALL_CMAKE_BUILD_FLAGS=($CI_CMAKE_BUILD_FLAGS)
128     local -a ALL_CTEST_FLAGS=($CI_CTEST_FLAGS)
129     # Initialize SRCDIR_NATIVE and INSTALLDIR_NATIVE.
130     local SRCDIR_NATIVE="${CI_SRCDIR_NATIVE:-"$CI_SRCDIR"}"
131     local INSTALLDIR_NATIVE="${CI_INSTALLDIR_NATIVE:-"$CI_INSTALLDIR"}"
132     # Export the CMake environment variables.
133     [[ $CI_CMAKE_GENERATOR ]] &&
134         ci_spawn export CMAKE_GENERATOR="$CI_CMAKE_GENERATOR"
135     [[ $CI_CMAKE_GENERATOR_PLATFORM ]] &&
136         ci_spawn export CMAKE_GENERATOR_PLATFORM="$CI_CMAKE_GENERATOR_PLATFORM"
137     # Build and install.
138     ci_spawn rm -fr "$CI_BUILDDIR" "$CI_INSTALLDIR"
139     ci_spawn mkdir -p "$CI_BUILDDIR"
140     ci_spawn cd "$CI_BUILDDIR"
141     ci_spawn "$CI_CMAKE" "${ALL_CMAKE_VARS[@]}" \
142                          -DCMAKE_INSTALL_PREFIX="$INSTALLDIR_NATIVE" \
143                          "$SRCDIR_NATIVE"
144     ci_spawn "$CI_CMAKE" --build . \
145                          --config "$CI_CMAKE_BUILD_TYPE" \
146                          "${ALL_CMAKE_BUILD_FLAGS[@]}"
147     [[ $CI_NO_TEST ]] ||
148         ci_spawn "$CI_CTEST" --build-config "$CI_CMAKE_BUILD_TYPE" \
149                              "${ALL_CTEST_FLAGS[@]}"
150     [[ $CI_NO_INSTALL ]] ||
151         ci_spawn "$CI_CMAKE" --build . \
152                              --config "$CI_CMAKE_BUILD_TYPE" \
153                              --target install \
154                              "${ALL_CMAKE_BUILD_FLAGS[@]}"
155     [[ $CI_NO_CLEAN ]] ||
156         ci_spawn "$CI_CMAKE" --build . \
157                              --config "$CI_CMAKE_BUILD_TYPE" \
158                              --target clean \
159                              "${ALL_CMAKE_BUILD_FLAGS[@]}"
160     ci_info "## END OF BUILD ##"
161 }
162
163 ci_init_cmake
164 ci_trace_cmake
165 [[ $# -eq 0 ]] || {
166     ci_info "note: this program accepts environment options only"
167     ci_err "unexpected command arguments: '$*'"
168 }
169 ci_build_cmake