##
##  bash.spec -- OpenPKG RPM Package Specification
##  Copyright (c) 2000-2025 OpenPKG Project <http://openpkg.org/>
##
##  Permission to use, copy, modify, and distribute this software for
##  any purpose with or without fee is hereby granted, provided that
##  the above copyright notice and this permission notice appear in all
##  copies.
##
##  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
##  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
##  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
##  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
##  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
##  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
##  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
##  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
##  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
##  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
##  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
##  SUCH DAMAGE.
##

#   package version
%define       V_base_real 5.2
%define       V_base_comp 52
%define       V_plvl_raw  37
%define       V_plvl_pad  037

#   package information
Name:         bash
Summary:      Bourne-Again Shell
URL:          https://tiswww.case.edu/php/chet/bash/bashtop.html
Vendor:       Free Software Foundation
Packager:     OpenPKG Project
Distribution: OpenPKG Community
Class:        CORE
Group:        Shell
License:      GPL
Version:      %{V_base_real}.%{V_plvl_raw}
Release:      20240924

#   package options
%option       with_multibyte yes

#   list of sources
Source0:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}.tar.gz
Source1:      bash.txt
Patch0:       bash.patch
Patch1:       https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-001
Patch2:       https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-002
Patch3:       https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-003
Patch4:       https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-004
Patch5:       https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-005
Patch6:       https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-006
Patch7:       https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-007
Patch8:       https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-008
Patch9:       https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-009
Patch10:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-010
Patch11:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-011
Patch12:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-012
Patch13:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-013
Patch14:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-014
Patch15:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-015
Patch16:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-016
Patch17:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-017
Patch18:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-018
Patch19:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-019
Patch20:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-020
Patch21:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-021
Patch22:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-022
Patch23:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-023
Patch24:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-024
Patch25:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-025
Patch26:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-026
Patch27:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-027
Patch28:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-028
Patch29:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-029
Patch30:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-030
Patch31:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-031
Patch32:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-032
Patch33:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-033
Patch34:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-034
Patch35:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-035
Patch36:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-036
Patch37:      https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/bash%{V_base_comp}-037

#   build information
BuildPreReq:  OpenPKG, openpkg >= 20160101
PreReq:       OpenPKG, openpkg >= 20160101
BuildPreReq:  readline
PreReq:       readline
%if "%{with_multibyte}" == "yes"
BuildPreReq:  libiconv, readline::with_multibyte = yes
PreReq:       libiconv, readline::with_multibyte = yes
%endif

%description
    Bash (Bourne-Again Shell) is an sh-compatible command language
    interpreter that executes commands read from the standard input or
    from a file. Bash also incorporates useful features from the Korn
    and C shells (ksh and csh). Bash is intended to be a conformant
    implementation of the IEEE POSIX Shell and Tools specification (IEEE
    Working Group 1003.2).

%track
    prog bash = {
        version   = %{V_base_real}
        url       = https://ftp.gnu.org/gnu/bash/
        regex     = bash-(\d+\.\d+)\.tar\.gz
    }
    prog bash:patches = {
        version   = %{V_base_comp}-%{V_plvl_pad}
        url       = https://ftp.gnu.org/gnu/bash/bash-%{V_base_real}-patches/
        regex     = bash(\d+-\d+)
    }

%prep
    #   unpack and patch distribution
    %setup -q -n bash-%{V_base_real}
    %patch -p0
    %patch -p0 -P 1
    %patch -p0 -P 2
    %patch -p0 -P 3
    %patch -p0 -P 4
    %patch -p0 -P 5
    %patch -p0 -P 6
    %patch -p0 -P 7
    %patch -p0 -P 8
    %patch -p0 -P 9
    %patch -p0 -P 10
    %patch -p0 -P 11
    %patch -p0 -P 12
    %patch -p0 -P 13
    %patch -p0 -P 14
    %patch -p0 -P 15
    %patch -p0 -P 16
    %patch -p0 -P 17
    %patch -p0 -P 18
    %patch -p0 -P 19
    %patch -p0 -P 20
    %patch -p0 -P 21
    %patch -p0 -P 22
    %patch -p0 -P 23
    %patch -p0 -P 24
    %patch -p0 -P 25
    %patch -p0 -P 26
    %patch -p0 -P 27
    %patch -p0 -P 28
    %patch -p0 -P 29
    %patch -p0 -P 30
    %patch -p0 -P 31
    %patch -p0 -P 32
    %patch -p0 -P 33
    %patch -p0 -P 34
    %patch -p0 -P 35
    %patch -p0 -P 36
    %patch -p0 -P 37

    #   ensure generated data is not re-generated on-the-fly
    sleep 1
    touch y.tab.[ch]
    touch configure config.h.in

    #   adjust paths
    %{l_shtool} subst \
        -e 's;^\(#define.*SYS_PROFILE[^"]*\).*;\1 "%{l_prefix}/etc/bash/profile";' \
        pathnames.h.in
    %{l_shtool} subst \
        -e 's;/etc/profile;%{l_prefix}/etc/bash/profile;' \
        doc/bash.1
    %{l_shtool} subst \
        -e 's;^/\* \(#define.*SYS_BASHRC[^"]*\).*;\1 "%{l_prefix}/etc/bash/bashrc";' \
        -e 's;^/\* \(#define.*SYS_BASH_LOGOUT[^"]*\).*;\1 "%{l_prefix}/etc/bash/bash_logout";' \
        -e 's;/usr/gnu/bin:/usr/local/bin:/bin:/usr/bin:\.;%{l_prefix}/bin:/bin:/usr/bin:%{l_prefix}/sbin:/sbin:/usr/sbin:.;' \
        -e 's;/bin:/usr/bin:/sbin:/usr/sbin:/etc:/usr/etc;%{l_prefix}/bin:/bin:/usr/bin:%{l_prefix}/sbin:/sbin:/usr/sbin;' \
        config-top.h
    %{l_shtool} subst \
        -e 's;^\(#define.*SYS_INPUTRC[^"]*\).*;\1 "%{l_prefix}/etc/bash/inputrc";' \
        lib/readline/rlconf.h

    #   brand with OpenPKG release
    %{l_shtool} subst \
        -e 's;@l_openpkg_release@;%{l_openpkg_release};' \
        version.c

%build
    #   configure package
    (
%if "%{with_multibyte}" == "no"
        #   force disabled wide-character support
        echo "ac_cv_header_wchar_h=no"
        echo "ac_cv_header_wctype_h=no"
        echo "ac_cv_func_mbsrtowcs=no"
%endif
        #   force disabled internationalization support
        echo "ac_cv_header_libintl_h=no"
        echo "ac_cv_func_gettext=no"
        echo "ac_cv_func_textdomain=no"
        echo "ac_cv_func_bindtextdomain=no"
        echo "ac_cv_lib_intl_bindtextdomain=no"
    ) >config.cache
    CC="%{l_cc}" \
    CFLAGS="%{l_cflags -O} -Wno-discarded-qualifiers" \
    GREP="grep" \
    ./configure \
        --cache-file=./config.cache \
        --prefix=%{l_prefix} \
        --mandir=%{l_prefix}/man \
        --infodir=%{l_prefix}/info \
        --enable-readline \
        --enable-debugger \
        --enable-alias \
        --enable-arith-for-command \
        --enable-array-variables \
        --enable-bang-history \
        --enable-brace-expansion \
        --enable-command-timing \
        --enable-cond-command \
        --enable-cond-regexp \
        --enable-coprocesses \
        --enable-direxpand-default \
        --enable-directory-stack \
        --enable-dparen-arithmetic \
        --enable-extended-glob \
        --enable-help-builtin \
        --enable-history \
        --enable-job-control \
        --enable-net-redirections \
        --enable-process-substitution \
        --enable-progcomp \
        --enable-prompt-string-decoding \
        --enable-select \
        --without-gnu-malloc \
        --without-curses \
%if "%{with_multibyte}" == "yes"
        --enable-multibyte \
%else
        --disable-multibyte \
%endif
        --disable-nls

    #   build package
    %{l_make} %{l_mflags}

%install
    #   install package
    %{l_make} %{l_mflags} install DESTDIR=$RPM_BUILD_ROOT

    #   strip down installation
    rm -f $RPM_BUILD_ROOT%{l_prefix}/info/dir
    rm -f $RPM_BUILD_ROOT%{l_prefix}/man/man1/bashbug.1
    rm -f $RPM_BUILD_ROOT%{l_prefix}/bin/bashbug
    strip $RPM_BUILD_ROOT%{l_prefix}/bin/bash || true
    rm -rf $RPM_BUILD_ROOT%{l_prefix}/share/doc
    rm -rf $RPM_BUILD_ROOT%{l_prefix}/lib/bash
    rm -rf $RPM_BUILD_ROOT%{l_prefix}/lib/pkgconfig
    rm -rf $RPM_BUILD_ROOT%{l_prefix}/include

    #   install global configuration files
    %{l_shtool} mkdir -f -p -m 755 \
        $RPM_BUILD_ROOT%{l_prefix}/etc/bash/profile.d
    for name in `grep "^<file" %{SOURCE bash.txt} | sed -e 's;^.*name=";;' -e 's;".*$;;'`; do
        (echo ""; cat %{SOURCE bash.txt}; echo "") |\
            sed -e "1,/^<file name=\"$name\">/d" -e "/<\/file>/,\$d" >$name
        %{l_shtool} install -c -m 644 %{l_value -s -a} \
            $name $RPM_BUILD_ROOT%{l_prefix}/etc/bash/
    done

    #   determine installation files
    %{l_rpmtool} files -v -ofiles -r$RPM_BUILD_ROOT \
        %{l_files_std} \
        '%config %{l_prefix}/etc/bash/*'

%files -f files

%clean

%post
    if [ ".$1" = .1 ]; then
        #   display note about login shell prerequisite
        if [ -f /etc/shells ]; then
            if [ ".`grep $RPM_INSTALL_PREFIX/bin/bash /etc/shells`" = . ]; then
                ( echo "Hint: To use $RPM_INSTALL_PREFIX/bin/bash as the login"
                  echo "shell for users, please add this path to /etc/shells."
                ) | %{l_rpmtool} msg -b -t notice
            fi
        fi
    fi

