xref: /aosp_15_r20/external/libpng/ci/ci_verify_makefiles.sh (revision a67afe4df73cf47866eedc69947994b8ff839aba)
1*a67afe4dSAndroid Build Coastguard Worker#!/usr/bin/env bash
2*a67afe4dSAndroid Build Coastguard Workerset -o errexit -o pipefail -o posix
3*a67afe4dSAndroid Build Coastguard Worker
4*a67afe4dSAndroid Build Coastguard Worker# Copyright (c) 2019-2024 Cosmin Truta.
5*a67afe4dSAndroid Build Coastguard Worker#
6*a67afe4dSAndroid Build Coastguard Worker# Use, modification and distribution are subject to the MIT License.
7*a67afe4dSAndroid Build Coastguard Worker# Please see the accompanying file LICENSE_MIT.txt
8*a67afe4dSAndroid Build Coastguard Worker#
9*a67afe4dSAndroid Build Coastguard Worker# SPDX-License-Identifier: MIT
10*a67afe4dSAndroid Build Coastguard Worker
11*a67afe4dSAndroid Build Coastguard Worker# shellcheck source=ci/lib/ci.lib.sh
12*a67afe4dSAndroid Build Coastguard Workersource "$(dirname "$0")/lib/ci.lib.sh"
13*a67afe4dSAndroid Build Coastguard Workercd "$CI_TOPLEVEL_DIR"
14*a67afe4dSAndroid Build Coastguard Worker
15*a67afe4dSAndroid Build Coastguard WorkerCI_SRC_DIR="$CI_TOPLEVEL_DIR"
16*a67afe4dSAndroid Build Coastguard Worker
17*a67afe4dSAndroid Build Coastguard Workerfunction ci_init_build {
18*a67afe4dSAndroid Build Coastguard Worker    # Ensure that the mandatory variables are initialized.
19*a67afe4dSAndroid Build Coastguard Worker    CI_MAKE="${CI_MAKE:-make}"
20*a67afe4dSAndroid Build Coastguard Worker    case "$CI_CC" in
21*a67afe4dSAndroid Build Coastguard Worker    ( *clang* )
22*a67afe4dSAndroid Build Coastguard Worker        CI_MAKEFILES="${CI_MAKEFILES:-"scripts/makefile.clang"}" ;;
23*a67afe4dSAndroid Build Coastguard Worker    ( *gcc* )
24*a67afe4dSAndroid Build Coastguard Worker        CI_MAKEFILES="${CI_MAKEFILES:-"scripts/makefile.gcc"}" ;;
25*a67afe4dSAndroid Build Coastguard Worker    ( * )
26*a67afe4dSAndroid Build Coastguard Worker        CI_MAKEFILES="${CI_MAKEFILES:-"scripts/makefile.std"}" ;;
27*a67afe4dSAndroid Build Coastguard Worker    esac
28*a67afe4dSAndroid Build Coastguard Worker}
29*a67afe4dSAndroid Build Coastguard Worker
30*a67afe4dSAndroid Build Coastguard Workerfunction ci_trace_build {
31*a67afe4dSAndroid Build Coastguard Worker    ci_info "## START OF CONFIGURATION ##"
32*a67afe4dSAndroid Build Coastguard Worker    ci_info "build arch: $CI_BUILD_ARCH"
33*a67afe4dSAndroid Build Coastguard Worker    ci_info "build system: $CI_BUILD_SYSTEM"
34*a67afe4dSAndroid Build Coastguard Worker    [[ "$CI_TARGET_SYSTEM.$CI_TARGET_ARCH" != "$CI_BUILD_SYSTEM.$CI_BUILD_ARCH" ]] && {
35*a67afe4dSAndroid Build Coastguard Worker        ci_info "target arch: $CI_TARGET_ARCH"
36*a67afe4dSAndroid Build Coastguard Worker        ci_info "target system: $CI_TARGET_SYSTEM"
37*a67afe4dSAndroid Build Coastguard Worker    }
38*a67afe4dSAndroid Build Coastguard Worker    ci_info "source directory: $CI_SRC_DIR"
39*a67afe4dSAndroid Build Coastguard Worker    ci_info "environment option: \$CI_MAKEFILES: '$CI_MAKEFILES'"
40*a67afe4dSAndroid Build Coastguard Worker    ci_info "environment option: \$CI_MAKE: '$CI_MAKE'"
41*a67afe4dSAndroid Build Coastguard Worker    ci_info "environment option: \$CI_MAKE_FLAGS: '$CI_MAKE_FLAGS'"
42*a67afe4dSAndroid Build Coastguard Worker    ci_info "environment option: \$CI_MAKE_VARS: '$CI_MAKE_VARS'"
43*a67afe4dSAndroid Build Coastguard Worker    ci_info "environment option: \$CI_CC: '$CI_CC'"
44*a67afe4dSAndroid Build Coastguard Worker    ci_info "environment option: \$CI_CC_FLAGS: '$CI_CC_FLAGS'"
45*a67afe4dSAndroid Build Coastguard Worker    ci_info "environment option: \$CI_CPP: '$CI_CPP'"
46*a67afe4dSAndroid Build Coastguard Worker    ci_info "environment option: \$CI_CPP_FLAGS: '$CI_CPP_FLAGS'"
47*a67afe4dSAndroid Build Coastguard Worker    ci_info "environment option: \$CI_AR: '$CI_AR'"
48*a67afe4dSAndroid Build Coastguard Worker    ci_info "environment option: \$CI_RANLIB: '$CI_RANLIB'"
49*a67afe4dSAndroid Build Coastguard Worker    ci_info "environment option: \$CI_LD: '$CI_LD'"
50*a67afe4dSAndroid Build Coastguard Worker    ci_info "environment option: \$CI_LD_FLAGS: '$CI_LD_FLAGS'"
51*a67afe4dSAndroid Build Coastguard Worker    ci_info "environment option: \$CI_LIBS: '$CI_LIBS'"
52*a67afe4dSAndroid Build Coastguard Worker    ci_info "environment option: \$CI_SANITIZERS: '$CI_SANITIZERS'"
53*a67afe4dSAndroid Build Coastguard Worker    ci_info "environment option: \$CI_FORCE: '$CI_FORCE'"
54*a67afe4dSAndroid Build Coastguard Worker    ci_info "environment option: \$CI_NO_TEST: '$CI_NO_TEST'"
55*a67afe4dSAndroid Build Coastguard Worker    ci_info "environment option: \$CI_NO_CLEAN: '$CI_NO_CLEAN'"
56*a67afe4dSAndroid Build Coastguard Worker    ci_info "executable: \$CI_MAKE: $(command -V "$CI_MAKE")"
57*a67afe4dSAndroid Build Coastguard Worker    [[ $CI_CC ]] && {
58*a67afe4dSAndroid Build Coastguard Worker        ci_info "executable: \$CI_CC: $(command -V "$CI_CC")"
59*a67afe4dSAndroid Build Coastguard Worker    }
60*a67afe4dSAndroid Build Coastguard Worker    [[ $CI_CPP ]] && {
61*a67afe4dSAndroid Build Coastguard Worker        ci_info "executable: \$CI_CPP: $(command -V "$CI_CPP")"
62*a67afe4dSAndroid Build Coastguard Worker    }
63*a67afe4dSAndroid Build Coastguard Worker    [[ $CI_AR ]] && {
64*a67afe4dSAndroid Build Coastguard Worker        ci_info "executable: \$CI_AR: $(command -V "$CI_AR")"
65*a67afe4dSAndroid Build Coastguard Worker    }
66*a67afe4dSAndroid Build Coastguard Worker    [[ $CI_RANLIB ]] && {
67*a67afe4dSAndroid Build Coastguard Worker        ci_info "executable: \$CI_RANLIB: $(command -V "$CI_RANLIB")"
68*a67afe4dSAndroid Build Coastguard Worker    }
69*a67afe4dSAndroid Build Coastguard Worker    [[ $CI_LD ]] && {
70*a67afe4dSAndroid Build Coastguard Worker        ci_info "executable: \$CI_LD: $(command -V "$CI_LD")"
71*a67afe4dSAndroid Build Coastguard Worker    }
72*a67afe4dSAndroid Build Coastguard Worker    ci_info "## END OF CONFIGURATION ##"
73*a67afe4dSAndroid Build Coastguard Worker}
74*a67afe4dSAndroid Build Coastguard Worker
75*a67afe4dSAndroid Build Coastguard Workerfunction ci_cleanup_old_build {
76*a67afe4dSAndroid Build Coastguard Worker    # Any old makefile-based build will most likely leave a mess
77*a67afe4dSAndroid Build Coastguard Worker    # of object files behind if interrupted, e.g., via Ctrl+C.
78*a67afe4dSAndroid Build Coastguard Worker    # There may be other files behind, depending on what makefile
79*a67afe4dSAndroid Build Coastguard Worker    # had been used. We cannot easily enumerate all of those.
80*a67afe4dSAndroid Build Coastguard Worker    # Fortunately, for a clean makefiles-based build, it should be
81*a67afe4dSAndroid Build Coastguard Worker    # sufficient to remove the old object files only.
82*a67afe4dSAndroid Build Coastguard Worker    ci_info "## START OF PRE-BUILD CLEANUP ##"
83*a67afe4dSAndroid Build Coastguard Worker    local find_args=(-maxdepth 1 \( -iname "*.o" -o -iname "*.obj" \))
84*a67afe4dSAndroid Build Coastguard Worker    [[ ! $(find "$CI_SRC_DIR" "${find_args[@]}" | head -n1) ]] || {
85*a67afe4dSAndroid Build Coastguard Worker        ci_warn "unexpected build found in '$CI_SRC_DIR'"
86*a67afe4dSAndroid Build Coastguard Worker        if ci_expr $((CI_FORCE))
87*a67afe4dSAndroid Build Coastguard Worker        then
88*a67afe4dSAndroid Build Coastguard Worker            # Delete the old build.
89*a67afe4dSAndroid Build Coastguard Worker            local my_file
90*a67afe4dSAndroid Build Coastguard Worker            find "$CI_SRC_DIR" "${find_args[@]}" |
91*a67afe4dSAndroid Build Coastguard Worker                while IFS="" read -r my_file
92*a67afe4dSAndroid Build Coastguard Worker                do
93*a67afe4dSAndroid Build Coastguard Worker                    ci_spawn rm -fr "$my_file"
94*a67afe4dSAndroid Build Coastguard Worker                done
95*a67afe4dSAndroid Build Coastguard Worker            ci_info "## END OF PRE-BUILD CLEANUP ##"
96*a67afe4dSAndroid Build Coastguard Worker        else
97*a67afe4dSAndroid Build Coastguard Worker            # Alert the user, but do not delete their existing files,
98*a67afe4dSAndroid Build Coastguard Worker            # and do not mess up their existing build.
99*a67afe4dSAndroid Build Coastguard Worker            ci_info "hint: consider using the option \$CI_FORCE=1"
100*a67afe4dSAndroid Build Coastguard Worker            ci_err "unable to continue"
101*a67afe4dSAndroid Build Coastguard Worker        fi
102*a67afe4dSAndroid Build Coastguard Worker    }
103*a67afe4dSAndroid Build Coastguard Worker}
104*a67afe4dSAndroid Build Coastguard Worker
105*a67afe4dSAndroid Build Coastguard Workerfunction ci_build {
106*a67afe4dSAndroid Build Coastguard Worker    ci_info "## START OF BUILD ##"
107*a67afe4dSAndroid Build Coastguard Worker    # Initialize and populate the local arrays.
108*a67afe4dSAndroid Build Coastguard Worker    local all_make_flags=()
109*a67afe4dSAndroid Build Coastguard Worker    local all_make_vars=()
110*a67afe4dSAndroid Build Coastguard Worker    [[ $CI_MAKE_FLAGS ]] && {
111*a67afe4dSAndroid Build Coastguard Worker        all_make_flags+=($CI_MAKE_FLAGS)
112*a67afe4dSAndroid Build Coastguard Worker    }
113*a67afe4dSAndroid Build Coastguard Worker    [[ $CI_CC ]] && {
114*a67afe4dSAndroid Build Coastguard Worker        all_make_vars+=("CC=$CI_CC")
115*a67afe4dSAndroid Build Coastguard Worker    }
116*a67afe4dSAndroid Build Coastguard Worker    [[ $CI_CC_FLAGS || $CI_SANITIZERS ]] && {
117*a67afe4dSAndroid Build Coastguard Worker        [[ $CI_SANITIZERS ]] && CI_CC_FLAGS="${CI_CC_FLAGS:-"-O2"} -fsanitize=$CI_SANITIZERS"
118*a67afe4dSAndroid Build Coastguard Worker        all_make_vars+=("CFLAGS=$CI_CC_FLAGS")
119*a67afe4dSAndroid Build Coastguard Worker    }
120*a67afe4dSAndroid Build Coastguard Worker    [[ $CI_CPP ]] && {
121*a67afe4dSAndroid Build Coastguard Worker        all_make_vars+=("CPP=$CI_CPP")
122*a67afe4dSAndroid Build Coastguard Worker    }
123*a67afe4dSAndroid Build Coastguard Worker    [[ $CI_CPP_FLAGS ]] && {
124*a67afe4dSAndroid Build Coastguard Worker        all_make_vars+=("CPPFLAGS=$CI_CPP_FLAGS")
125*a67afe4dSAndroid Build Coastguard Worker    }
126*a67afe4dSAndroid Build Coastguard Worker    [[ $CI_AR ]] && {
127*a67afe4dSAndroid Build Coastguard Worker        all_make_vars+=("AR=$CI_AR")
128*a67afe4dSAndroid Build Coastguard Worker    }
129*a67afe4dSAndroid Build Coastguard Worker    [[ $CI_RANLIB ]] && {
130*a67afe4dSAndroid Build Coastguard Worker        all_make_vars+=("RANLIB=$CI_RANLIB")
131*a67afe4dSAndroid Build Coastguard Worker    }
132*a67afe4dSAndroid Build Coastguard Worker    [[ $CI_LD ]] && {
133*a67afe4dSAndroid Build Coastguard Worker        all_make_vars+=("LD=$CI_LD")
134*a67afe4dSAndroid Build Coastguard Worker    }
135*a67afe4dSAndroid Build Coastguard Worker    [[ $CI_LD_FLAGS || $CI_SANITIZERS ]] && {
136*a67afe4dSAndroid Build Coastguard Worker        [[ $CI_SANITIZERS ]] && CI_LD_FLAGS+="${CI_LD_FLAGS:+" "}-fsanitize=$CI_SANITIZERS"
137*a67afe4dSAndroid Build Coastguard Worker        all_make_vars+=("LDFLAGS=$CI_LD_FLAGS")
138*a67afe4dSAndroid Build Coastguard Worker    }
139*a67afe4dSAndroid Build Coastguard Worker    [[ $CI_LIBS ]] && {
140*a67afe4dSAndroid Build Coastguard Worker        all_make_vars+=("LIBS=$CI_LIBS")
141*a67afe4dSAndroid Build Coastguard Worker    }
142*a67afe4dSAndroid Build Coastguard Worker    all_make_vars+=($CI_MAKE_VARS)
143*a67afe4dSAndroid Build Coastguard Worker    # And... build!
144*a67afe4dSAndroid Build Coastguard Worker    local my_makefile
145*a67afe4dSAndroid Build Coastguard Worker    for my_makefile in $CI_MAKEFILES
146*a67afe4dSAndroid Build Coastguard Worker    do
147*a67afe4dSAndroid Build Coastguard Worker        ci_info "using makefile: $my_makefile"
148*a67afe4dSAndroid Build Coastguard Worker        # Spawn "make".
149*a67afe4dSAndroid Build Coastguard Worker        ci_spawn "$CI_MAKE" -f "$my_makefile" \
150*a67afe4dSAndroid Build Coastguard Worker                            "${all_make_flags[@]}" \
151*a67afe4dSAndroid Build Coastguard Worker                            "${all_make_vars[@]}"
152*a67afe4dSAndroid Build Coastguard Worker        ci_expr $((CI_NO_TEST)) || {
153*a67afe4dSAndroid Build Coastguard Worker            # Spawn "make test" if testing is not disabled.
154*a67afe4dSAndroid Build Coastguard Worker            ci_spawn "$CI_MAKE" -f "$my_makefile" \
155*a67afe4dSAndroid Build Coastguard Worker                                "${all_make_flags[@]}" \
156*a67afe4dSAndroid Build Coastguard Worker                                "${all_make_vars[@]}" \
157*a67afe4dSAndroid Build Coastguard Worker                                test
158*a67afe4dSAndroid Build Coastguard Worker        }
159*a67afe4dSAndroid Build Coastguard Worker        ci_expr $((CI_NO_CLEAN)) || {
160*a67afe4dSAndroid Build Coastguard Worker            # Spawn "make clean" if cleaning is not disabled.
161*a67afe4dSAndroid Build Coastguard Worker            ci_spawn "$CI_MAKE" -f "$my_makefile" \
162*a67afe4dSAndroid Build Coastguard Worker                                "${all_make_flags[@]}" \
163*a67afe4dSAndroid Build Coastguard Worker                                "${all_make_vars[@]}" \
164*a67afe4dSAndroid Build Coastguard Worker                                clean
165*a67afe4dSAndroid Build Coastguard Worker        }
166*a67afe4dSAndroid Build Coastguard Worker    done
167*a67afe4dSAndroid Build Coastguard Worker    ci_info "## END OF BUILD ##"
168*a67afe4dSAndroid Build Coastguard Worker}
169*a67afe4dSAndroid Build Coastguard Worker
170*a67afe4dSAndroid Build Coastguard Workerfunction usage {
171*a67afe4dSAndroid Build Coastguard Worker    echo "usage: $CI_SCRIPT_NAME [<options>]"
172*a67afe4dSAndroid Build Coastguard Worker    echo "options: -?|-h|--help"
173*a67afe4dSAndroid Build Coastguard Worker    exit "${@:-0}"
174*a67afe4dSAndroid Build Coastguard Worker}
175*a67afe4dSAndroid Build Coastguard Worker
176*a67afe4dSAndroid Build Coastguard Workerfunction main {
177*a67afe4dSAndroid Build Coastguard Worker    local opt
178*a67afe4dSAndroid Build Coastguard Worker    while getopts ":" opt
179*a67afe4dSAndroid Build Coastguard Worker    do
180*a67afe4dSAndroid Build Coastguard Worker        # This ain't a while-loop. It only pretends to be.
181*a67afe4dSAndroid Build Coastguard Worker        [[ $1 == -[?h]* || $1 == --help || $1 == --help=* ]] && usage 0
182*a67afe4dSAndroid Build Coastguard Worker        ci_err "unknown option: '$1'"
183*a67afe4dSAndroid Build Coastguard Worker    done
184*a67afe4dSAndroid Build Coastguard Worker    shift $((OPTIND - 1))
185*a67afe4dSAndroid Build Coastguard Worker    # And... go!
186*a67afe4dSAndroid Build Coastguard Worker    ci_init_build
187*a67afe4dSAndroid Build Coastguard Worker    ci_trace_build
188*a67afe4dSAndroid Build Coastguard Worker    [[ $# -eq 0 ]] || {
189*a67afe4dSAndroid Build Coastguard Worker        echo >&2 "error: unexpected argument: '$1'"
190*a67afe4dSAndroid Build Coastguard Worker        echo >&2 "note: this program accepts environment options only"
191*a67afe4dSAndroid Build Coastguard Worker        usage 2
192*a67afe4dSAndroid Build Coastguard Worker    }
193*a67afe4dSAndroid Build Coastguard Worker    ci_cleanup_old_build
194*a67afe4dSAndroid Build Coastguard Worker    ci_build
195*a67afe4dSAndroid Build Coastguard Worker}
196*a67afe4dSAndroid Build Coastguard Worker
197*a67afe4dSAndroid Build Coastguard Workermain "$@"
198