-%bcond_without static
-%bcond_without tests
+#
+# TODO: https://bugs.launchpad.net/mksh/+bug/1179287
+#
+# Conditional build:
+%bcond_without static # static version of mksh
+%bcond_without tests # rtchecks and test.sh checks
+#
#
Summary: MirBSD Korn Shell
Summary(pl.UTF-8): Powłoka Korna z MirBSD
Name: mksh
-Version: 40c
-Release: 1
+Version: 46
+Release: 0.1
License: BSD
Group: Applications/Shells
-Source0: http://www.mirbsd.org/MirOS/dist/mir/mksh/%{name}-R%{version}.cpio.gz
-# Source0-md5: 43a79f721091833bdab3d00fbfe54a14
+Source0: http://www.mirbsd.org/MirOS/dist/mir/mksh/%{name}-R%{version}.tgz
+# Source0-md5: 77c108d8143a6e7670954d77517d216d
Source1: %{name}-mkshrc
Patch0: %{name}-mkshrc_support.patch
Patch1: %{name}-circumflex.patch
Patch2: %{name}-no_stop_alias.patch
-Patch3: %{name}-distro.patch
-Patch4: %{name}-cmdline-length.patch
+Patch3: %{name}-cmdline-length.patch
URL: https://www.mirbsd.org/mksh.htm
%if %{with tests}
BuildRequires: ed
%patch1 -p1
%patch2 -p1
%patch3 -p1
-%patch4 -p1
+# sed rules instead of patch (needed update for every release)
+sed -i -e 's|\(#define.*MKSH_VERSION.*\)"|\1 @DISTRO@"|g' sh.h
+sed -i -e 's|\(@(#)MIRBSD KSH.*\)|\1 @DISTRO@|g' check.t
+
+# fill distro
sed -i -e 's#@DISTRO@#PLD/Linux 3.0#g' check.t sh.h
+# sanity checks
+grep PLD/Linux check.t || exit 1
+grep PLD/Linux sh.h || exit 1
+
+# we'll need this later due to -DMKSH_GCC55009
+cat >rtchecks <<'EOF'
+typeset -i sari=0
+typeset -Ui uari=0
+typeset -i x=0
+print -r -- $((x++)):$sari=$uari.
+let --sari --uari
+print -r -- $((x++)):$sari=$uari.
+sari=2147483647 uari=2147483647
+print -r -- $((x++)):$sari=$uari.
+let ++sari ++uari
+print -r -- $((x++)):$sari=$uari.
+let --sari --uari
+let 'sari *= 2' 'uari *= 2'
+let ++sari ++uari
+print -r -- $((x++)):$sari=$uari.
+let ++sari ++uari
+print -r -- $((x++)):$sari=$uari.
+sari=-2147483648 uari=-2147483648
+print -r -- $((x++)):$sari=$uari.
+let --sari --uari
+print -r -- $((x++)):$sari=$uari.
+EOF
+
+cat >rtchecks.expected <<'EOF'
+0:0=0.
+1:-1=4294967295.
+2:2147483647=2147483647.
+3:-2147483648=2147483648.
+4:-1=4294967295.
+5:0=0.
+6:-2147483648=2147483648.
+7:2147483647=2147483647.
+EOF
%build
install -d out
CC="%{__cc}" \
-CFLAGS="%{rpmcppflags} %{rpmcflags}" \
+CFLAGS="%{rpmcflags} -DMKSH_GCC55009" \
LDFLAGS="%{rpmldflags}" \
+CPPFLAGS="%{rpmcppflags}" \
sh ./Build.sh -Q -r -j -c lto
# skip some tests if not on terminal
skip_tests="-C regress:no-ctty"
fi
-%{?with_tests:./test.sh -v $skip_tests}
+%if %{with tests}
+./mksh rtchecks >rtchecks.got 2>&1
+if ! cmp --quiet rtchecks.got rtchecks.expected ; then
+ echo "rtchecks failed"
+ diff -Naurp %{SOURCE3} rtchecks.got
+ exit 1
+fi
+./test.sh -v $skip_tests
+%endif
mv mksh out/mksh.dynamic
%if %{with static}
CC="%{__cc}" \
-CFLAGS="%{rpmcppflags} %{rpmcflags}" \
+CFLAGS="%{rpmcflags} -DMKSH_GCC55009" \
LDFLAGS="%{rpmldflags} -static" \
+CPPFLAGS="%{rpmcppflags}" \
sh ./Build.sh -Q -r -j -c lto
-%{?with_tests:./test.sh -v $skip_tests}
+%if %{with tests}
+./test.sh -v $skip_tests
+./mksh rtchecks >rtchecks.got 2>&1
+if ! cmp --quiet rtchecks.got rtchecks.expected ; then
+ echo "rtchecks failed"
+ diff -Naurp %{SOURCE3} rtchecks.got
+ exit 1
+fi
+%endif
mv mksh out/mksh.static
%endif
%post -p %add_etc_shells -p /bin/sh /bin/ksh /bin/mksh
%preun -p %remove_etc_shells -p /bin/sh /bin/ksh /bin/mksh
-%posttrans -p %add_etc_shells -p /bin/sh /bin/ksh
-
+%posttrans -p %add_etc_shells -p /bin/sh /bin/ksh /bin/mksh
-%post static -p %add_etc_shells -p /bin/mksh.static
-%preun static -p %remove_etc_shells -p /bin/mksh.static
+%post static -p %add_etc_shells -p /bin/mksh.static
+%preun static -p %remove_etc_shells -p /bin/mksh.static
%files
%defattr(644,root,root,755)