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