xref: /aosp_15_r20/external/libpng/ci/ci_shellify.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 Workerfunction ci_shellify_c {
16*a67afe4dSAndroid Build Coastguard Worker    # Convert C preprocessor text, specifically originating
17*a67afe4dSAndroid Build Coastguard Worker    # from png.h, to shell scripting text.
18*a67afe4dSAndroid Build Coastguard Worker    # Select only the easy-to-parse definitions of PNG_LIBPNG_*.
19*a67afe4dSAndroid Build Coastguard Worker    sed -n -e '/^\# *define * PNG_LIBPNG_[^ ]* * ["0-9A-Za-z_]/ p' |
20*a67afe4dSAndroid Build Coastguard Worker        sed -e 's/^\# *define * PNG\([^ ]*\) * \([^ ]*\)/PNG\1=\2/' \
21*a67afe4dSAndroid Build Coastguard Worker            -e 's/=PNG\([0-9A-Za-z_]*\)/=\${PNG\1}/' \
22*a67afe4dSAndroid Build Coastguard Worker            -e 's/^\([^ ]*=[^ ]*\).*$/export \1;/'
23*a67afe4dSAndroid Build Coastguard Worker}
24*a67afe4dSAndroid Build Coastguard Worker
25*a67afe4dSAndroid Build Coastguard Workerfunction ci_shellify_autoconf {
26*a67afe4dSAndroid Build Coastguard Worker    # Convert autoconf (M4) text, specifically originating
27*a67afe4dSAndroid Build Coastguard Worker    # from configure.ac, to shell scripting text.
28*a67afe4dSAndroid Build Coastguard Worker    # Select only the easy-to-parse definitions of PNGLIB_*.
29*a67afe4dSAndroid Build Coastguard Worker    sed -n -e '/^ *PNGLIB_[^ ]*=[$"0-9A-Za-z_]/ p' |
30*a67afe4dSAndroid Build Coastguard Worker        sed -e 's/^ *PNG\([0-9A-Za-z_]*\)=\([^# ]*\).*$/PNG\1=\2/' \
31*a67afe4dSAndroid Build Coastguard Worker            -e 's/^\([^ ]*=[^ ]*\).*$/export \1;/'
32*a67afe4dSAndroid Build Coastguard Worker}
33*a67afe4dSAndroid Build Coastguard Worker
34*a67afe4dSAndroid Build Coastguard Workerfunction ci_shellify_cmake {
35*a67afe4dSAndroid Build Coastguard Worker    # Convert CMake lists text, specifically originating
36*a67afe4dSAndroid Build Coastguard Worker    # from CMakeLists.txt, to shell scripting text.
37*a67afe4dSAndroid Build Coastguard Worker    # Select only the easy-to-parse definitions of PNGLIB_*.
38*a67afe4dSAndroid Build Coastguard Worker    sed -n -e '/^ *set *(PNGLIB_[^ ]* * [$"0-9A-Za-z_].*)/ p' |
39*a67afe4dSAndroid Build Coastguard Worker        sed -e 's/^ *set *(PNG\([^ ]*\) * \([^() ]*\)).*$/PNG\1=\2/' \
40*a67afe4dSAndroid Build Coastguard Worker            -e 's/^\([^ ]*=[^ ]*\).*$/export \1;/'
41*a67afe4dSAndroid Build Coastguard Worker}
42*a67afe4dSAndroid Build Coastguard Worker
43*a67afe4dSAndroid Build Coastguard Workerfunction ci_shellify {
44*a67afe4dSAndroid Build Coastguard Worker    local arg filename
45*a67afe4dSAndroid Build Coastguard Worker    for arg in "$@"
46*a67afe4dSAndroid Build Coastguard Worker    do
47*a67afe4dSAndroid Build Coastguard Worker        test -f "$arg" || ci_err "no such file: '$arg'"
48*a67afe4dSAndroid Build Coastguard Worker        filename="$(basename -- "$arg")"
49*a67afe4dSAndroid Build Coastguard Worker        case "$filename" in
50*a67afe4dSAndroid Build Coastguard Worker        ( *.[ch] )
51*a67afe4dSAndroid Build Coastguard Worker            [[ $filename == png.h ]] || {
52*a67afe4dSAndroid Build Coastguard Worker                ci_err "unable to shellify: '$filename' (expecting: 'png.h')"
53*a67afe4dSAndroid Build Coastguard Worker            }
54*a67afe4dSAndroid Build Coastguard Worker            ci_shellify_c <"$arg" ;;
55*a67afe4dSAndroid Build Coastguard Worker        ( config* | *.ac )
56*a67afe4dSAndroid Build Coastguard Worker            [[ $filename == configure.ac ]] || {
57*a67afe4dSAndroid Build Coastguard Worker                ci_err "unable to shellify: '$filename' (expecting: 'configure.ac')"
58*a67afe4dSAndroid Build Coastguard Worker            }
59*a67afe4dSAndroid Build Coastguard Worker            ci_shellify_autoconf <"$arg" ;;
60*a67afe4dSAndroid Build Coastguard Worker        ( *CMake* | *cmake* | *.txt )
61*a67afe4dSAndroid Build Coastguard Worker            [[ $filename == [Cc][Mm]ake[Ll]ists.txt ]] || {
62*a67afe4dSAndroid Build Coastguard Worker                ci_err "unable to shellify: '$filename' (expecting: 'CMakeLists.txt')"
63*a67afe4dSAndroid Build Coastguard Worker            }
64*a67afe4dSAndroid Build Coastguard Worker            ci_shellify_cmake <"$arg" ;;
65*a67afe4dSAndroid Build Coastguard Worker        ( * )
66*a67afe4dSAndroid Build Coastguard Worker            ci_err "unable to shellify: '$arg'" ;;
67*a67afe4dSAndroid Build Coastguard Worker        esac
68*a67afe4dSAndroid Build Coastguard Worker    done
69*a67afe4dSAndroid Build Coastguard Worker}
70*a67afe4dSAndroid Build Coastguard Worker
71*a67afe4dSAndroid Build Coastguard Workerfunction usage {
72*a67afe4dSAndroid Build Coastguard Worker    echo "usage: $CI_SCRIPT_NAME [<options>] <files>..."
73*a67afe4dSAndroid Build Coastguard Worker    echo "options: -?|-h|--help"
74*a67afe4dSAndroid Build Coastguard Worker    echo "files: png.h|configure.ac|CMakeLists.txt"
75*a67afe4dSAndroid Build Coastguard Worker    exit "${@:-0}"
76*a67afe4dSAndroid Build Coastguard Worker}
77*a67afe4dSAndroid Build Coastguard Worker
78*a67afe4dSAndroid Build Coastguard Workerfunction main {
79*a67afe4dSAndroid Build Coastguard Worker    local opt
80*a67afe4dSAndroid Build Coastguard Worker    while getopts ":" opt
81*a67afe4dSAndroid Build Coastguard Worker    do
82*a67afe4dSAndroid Build Coastguard Worker        # This ain't a while-loop. It only pretends to be.
83*a67afe4dSAndroid Build Coastguard Worker        [[ $1 == -[?h]* || $1 == --help || $1 == --help=* ]] && usage 0
84*a67afe4dSAndroid Build Coastguard Worker        ci_err "unknown option: '$1'"
85*a67afe4dSAndroid Build Coastguard Worker    done
86*a67afe4dSAndroid Build Coastguard Worker    shift $((OPTIND - 1))
87*a67afe4dSAndroid Build Coastguard Worker    [[ $# -eq 0 ]] && usage 2
88*a67afe4dSAndroid Build Coastguard Worker    # And... go!
89*a67afe4dSAndroid Build Coastguard Worker    ci_shellify "$@"
90*a67afe4dSAndroid Build Coastguard Worker}
91*a67afe4dSAndroid Build Coastguard Worker
92*a67afe4dSAndroid Build Coastguard Workermain "$@"
93