summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README8
-rw-r--r--arm-riscos-gnueabi/.gitignore2
-rw-r--r--arm-riscos-gnueabi/Makefile201
-rwxr-xr-xarm-riscos-gnueabi/fetchsrc16
-rw-r--r--arm-riscos-gnueabi/recipes/files/gccsdk/Makefile447
-rw-r--r--arm-riscos-gnueabi/recipes/files/gccsdk/config.sub.p11
-rw-r--r--arm-riscos-gnueabi/recipes/files/gccsdk/gccsdk-params8
-rw-r--r--arm-riscos-gnueabi/recipes/patches/gccsdk/01-relax-abi-matching.p100
-rw-r--r--arm-riscos-gnueabi/recipes/patches/gccsdk/elf2aif-eabi-support.p394
-rw-r--r--arm-riscos-gnueabi/recipes/patches/gccsdk/gcc-add-mhalfword-access.p153
-rw-r--r--arm-riscos-gnueabi/recipes/patches/gccsdk/gcc-default-no-halfword-access.p13
-rw-r--r--arm-riscos-gnueabi/recipes/patches/gccsdk/gcc-libgcc-no-linux-atomics.p56
-rw-r--r--arm-riscos-gnueabi/recipes/patches/gccsdk/ld-armv4.p13
-rw-r--r--arm-riscos-gnueabi/recipes/patches/gccsdk/libtool.m4.p.p119
-rw-r--r--arm-riscos-gnueabi/recipes/patches/gccsdk/posix-extended-locale.p1920
-rw-r--r--arm-riscos-gnueabi/recipes/patches/gccsdk/roinstall-objdump-name.p13
-rw-r--r--arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-armv4.p80
-rw-r--r--arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-initial-sp.p31
-rw-r--r--arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-no-armv7-memcpy.p34
-rw-r--r--arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-stdtime.p17
-rw-r--r--arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-sync-and-fetch-atomics.p22
-rw-r--r--arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-unwind.p468
-rw-r--r--arm-riscos-gnueabi/recipes/patches/infozip/globals.p13
-rw-r--r--arm-riscos-gnueabi/recipes/patches/infozip/zip.p58
-rw-r--r--arm-riscos-gnueabi/recipes/patches/infozip/zipup.p162
-rw-r--r--arm-riscos-gnueabi/recipes/patches/oslib/buildsystem-elfeabi.p144
-rw-r--r--arm-riscos-gnueabi/recipes/patches/oslib/defmod-elfeabi.p84
-rw-r--r--arm-riscos-gnueabi/recipes/patches/oslib/vapi.p10
-rw-r--r--arm-unknown-riscos/Makefile6
-rwxr-xr-xarm-unknown-riscos/fetchsrc2
-rw-r--r--arm-unknown-riscos/recipes/patches/gcc4/binutils-download.p4
-rw-r--r--arm-unknown-riscos/recipes/patches/gcc4/cloog-ppl-download.p2
-rw-r--r--arm-unknown-riscos/recipes/patches/gcc4/gmp-download.p4
-rw-r--r--arm-unknown-riscos/recipes/patches/gcc4/no-scm.p11
-rw-r--r--arm-unknown-riscos/recipes/patches/gcc4/posix-extended-locale.p1920
-rw-r--r--arm-unknown-riscos/recipes/patches/gcc4/ppl-download.p4
-rw-r--r--arm-unknown-riscos/recipes/patches/gcc4/ppl-version.p175
-rw-r--r--arm-unknown-riscos/recipes/patches/gcc4/unixlib-ldrex-strex.p304
-rw-r--r--i686-w64-mingw32/Makefile36
-rw-r--r--m5475-atari-mint/Makefile39
-rwxr-xr-xm5475-atari-mint/fetchsrc2
-rw-r--r--m5475-atari-mint/recipes/patches/gemlib/CONFIGVARS.p39
-rw-r--r--m5475-atari-mint/recipes/patches/mintlib/configvars.p35
-rw-r--r--m5475-atari-mint/recipes/patches/mintlib/posix_regex.p11
-rw-r--r--m68k-atari-mint/Makefile39
-rwxr-xr-xm68k-atari-mint/fetchsrc2
-rw-r--r--m68k-atari-mint/recipes/patches/gemlib/CONFIGVARS.p19
-rw-r--r--m68k-atari-mint/recipes/patches/mintlib/configvars.p20
-rw-r--r--m68k-atari-mint/recipes/patches/mintlib/posix_regex.p11
-rw-r--r--m68k-unknown-amigaos/Makefile34
-rw-r--r--m68k-unknown-amigaos/recipes/files/ndk/sys-include/inline/macros.h1749
-rw-r--r--m68k-unknown-amigaos/recipes/patches/bison/fseterr.c.p11
-rw-r--r--ppc-amigaos/Makefile63
-rw-r--r--sdk/Makefile277
-rwxr-xr-xsdk/fetchsrc13
-rwxr-xr-xsdk/recipes/files/freetype/m5475-atari-mint/builds/unix/config.sub1805
-rw-r--r--sdk/recipes/files/openssl/m68k-unknown-amigaos/crypto/rand/rand_amiga.c189
-rw-r--r--sdk/recipes/files/openssl/m68k-unknown-amigaos/providers/implementations/rands/seeding/rand_amiga.c282
-rw-r--r--sdk/recipes/files/openssl/ppc-amigaos/crypto/rand/rand_amiga.c182
-rw-r--r--sdk/recipes/files/openssl/ppc-amigaos/providers/implementations/rands/seeding/rand_amiga.c275
-rw-r--r--sdk/recipes/patches/libcares/m5475-atari-mint/config.sub.p11
-rw-r--r--sdk/recipes/patches/libcares/m68k-atari-mint/configure.p11
-rw-r--r--sdk/recipes/patches/libcares/m68k-unknown-amigaos/ipv6-support.p71
-rw-r--r--sdk/recipes/patches/libcares/ppc-amigaos/configure.p11
-rw-r--r--sdk/recipes/patches/libcares/ppc-amigaos/ipv6-support.p70
-rw-r--r--sdk/recipes/patches/libcurl/m5475-atari-mint/config.sub.p11
-rw-r--r--sdk/recipes/patches/libcurl/m68k-unknown-amigaos/lib.amigaos.c.p11
-rw-r--r--sdk/recipes/patches/libcurl/m68k-unknown-amigaos/lib.amigaos.h.p11
-rw-r--r--sdk/recipes/patches/libcurl/m68k-unknown-amigaos/lib.curl_setup.h.p16
-rw-r--r--sdk/recipes/patches/libcurl/m68k-unknown-amigaos/src.tool_getpass.c.p13
-rw-r--r--sdk/recipes/patches/libcurl/m68k-unknown-amigaos/src.tool_operate.c.p26
-rw-r--r--sdk/recipes/patches/libcurl/ppc-amigaos/lib.amigaos.c.p23
-rw-r--r--sdk/recipes/patches/libcurl/ppc-amigaos/lib.amigaos.h.p11
-rw-r--r--sdk/recipes/patches/libcurl/ppc-amigaos/lib.curl_setup.h.p23
-rw-r--r--sdk/recipes/patches/libcurl/ppc-amigaos/lib.hostip4.c.p60
-rw-r--r--sdk/recipes/patches/libcurl/ppc-amigaos/src.tool_operate.c.p26
-rw-r--r--sdk/recipes/patches/libexpat/m5475-atari-mint/conftools.config.sub.p11
-rw-r--r--sdk/recipes/patches/libexpat/m68k-unknown-amigaos/xmlwf.xmltchar.h.p9
-rw-r--r--sdk/recipes/patches/libiconv/libcharset.lib.localcharset.c.p2
-rw-r--r--sdk/recipes/patches/libiconv/m5475-atari-mint/build-aux.config.sub.p11
-rw-r--r--sdk/recipes/patches/libiconv/m5475-atari-mint/libcharset.build-aux.config.sub.p11
-rw-r--r--sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.getprogname.c.p10
-rw-r--r--sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.signal.in.h.p2
-rw-r--r--sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.sigprocmask.c.p2
-rw-r--r--sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.time.in.h.p11
-rw-r--r--sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.unistd.in.h.p16
-rw-r--r--sdk/recipes/patches/libiconv/ppc-amigaos/srclib.getprogname.c.p10
-rw-r--r--sdk/recipes/patches/libiconv/ppc-amigaos/srclib.signal.in.h.p2
-rw-r--r--sdk/recipes/patches/libiconv/ppc-amigaos/srclib.sigprocmask.c.p2
-rw-r--r--sdk/recipes/patches/libpng/m5475-atari-mint/config.sub.p11
-rw-r--r--sdk/recipes/patches/libwebp/configure.ac.p11
-rw-r--r--sdk/recipes/patches/libwebp/configure.p11
-rw-r--r--sdk/recipes/patches/openssl/Configurations-50-amigaos.conf.p11
-rw-r--r--sdk/recipes/patches/openssl/Configurations-50-atari.conf.p45
-rw-r--r--sdk/recipes/patches/openssl/Configurations-50-riscos.conf.p16
-rw-r--r--sdk/recipes/patches/openssl/Configurations-50-windows.conf.p11
-rw-r--r--sdk/recipes/patches/openssl/Configure.p11
-rw-r--r--sdk/recipes/patches/openssl/apps.s_socket.c.p18
-rw-r--r--sdk/recipes/patches/openssl/apps.speed.c.p36
-rw-r--r--sdk/recipes/patches/openssl/aps.opt.c.p14
-rw-r--r--sdk/recipes/patches/openssl/crypto.arm_arch.h.p11
-rw-r--r--sdk/recipes/patches/openssl/crypto.bio.bio_local.h.p (renamed from sdk/recipes/patches/openssl/bio_lcl.h.p)4
-rw-r--r--sdk/recipes/patches/openssl/crypto.rand.rand_unix.c.p19
-rw-r--r--sdk/recipes/patches/openssl/e_os.h.p13
-rw-r--r--sdk/recipes/patches/openssl/m5475-atari-mint/apps.lib.s_socket.c.p12
-rw-r--r--sdk/recipes/patches/openssl/m5475-atari-mint/include.internal.sockets.h.p19
-rw-r--r--sdk/recipes/patches/openssl/m5475-atari-mint/include.openssl.e_os2.h.p14
-rw-r--r--sdk/recipes/patches/openssl/m68k-atari-mint/apps.lib.s_socket.c.p12
-rw-r--r--sdk/recipes/patches/openssl/m68k-atari-mint/crypto.bn.Makefile.p12
-rw-r--r--sdk/recipes/patches/openssl/m68k-atari-mint/include.internal.sockets.h.p19
-rw-r--r--sdk/recipes/patches/openssl/m68k-atari-mint/include.openssl.e_os2.h.p14
-rw-r--r--sdk/recipes/patches/openssl/m68k-unknown-amigaos/apps.apps.c.p6
-rw-r--r--sdk/recipes/patches/openssl/m68k-unknown-amigaos/apps.include.http_server.h.p11
-rw-r--r--sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.bio.b_sock2.c.p26
-rw-r--r--sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.bn.bn_div.c.p2
-rw-r--r--sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.include.internal.md32_common.h.p36
-rw-r--r--sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.rand.build.info.p9
-rw-r--r--sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.ui.ui_openssl.c.p32
-rw-r--r--sdk/recipes/patches/openssl/m68k-unknown-amigaos/include.openssl.e_os2.h.p11
-rw-r--r--sdk/recipes/patches/openssl/m68k-unknown-amigaos/providers.implementations.rands.seeding.build.info.p12
-rw-r--r--sdk/recipes/patches/openssl/mem_sec.c.p15
-rw-r--r--sdk/recipes/patches/openssl/newlib-no-strtoiumax.p22
-rw-r--r--sdk/recipes/patches/openssl/ppc-amigaos/apps.include.http_server.h.p11
-rw-r--r--sdk/recipes/patches/openssl/ppc-amigaos/atomics-are-broken.p22
-rw-r--r--sdk/recipes/patches/openssl/ppc-amigaos/crypto.bio_b_addr.c.p6
-rw-r--r--sdk/recipes/patches/openssl/ppc-amigaos/crypto.ppccap.c.p13
-rw-r--r--sdk/recipes/patches/openssl/ppc-amigaos/crypto.rand.build.info.p9
-rw-r--r--sdk/recipes/patches/openssl/ppc-amigaos/include.openssl.e_os2.h.p11
-rw-r--r--sdk/recipes/patches/openssl/ppc-amigaos/providers.implementations.rands.seeding.build.info.p12
-rw-r--r--sdk/recipes/patches/openssl/ppc-amigaos/test.rsa_complex.c.p18
-rw-r--r--sdk/recipes/patches/openssl/test.drbgtest.c.p20
-rw-r--r--sdk/recipes/patches/windom/src.globals.h.p19
-rw-r--r--sdk/recipes/patches/zlib/arm-riscos-gnueabi/configure.p42
-rw-r--r--x86_64-w64-mingw32/Makefile19
134 files changed, 11845 insertions, 1549 deletions
diff --git a/README b/README
index 237dbb3..2a2d4b0 100644
--- a/README
+++ b/README
@@ -5,7 +5,13 @@ Pre-requisites for Debian systems
$ apt-get install build-essential autoconf automake autogen flex bison
$ apt-get install libtool texinfo help2man subversion cvs git
- $ apt-get install lhasa unzip autoconf2.64
+ $ apt-get install lhasa unzip autoconf2.64 automake1.11
+
+ If you've not got automake 1.15 by default, you'll need:
+
+ $ apt-get install automake-1.15
+
+ Depending on your platform you may also need libfl-dev
On multiarch-aware systems:
diff --git a/arm-riscos-gnueabi/.gitignore b/arm-riscos-gnueabi/.gitignore
new file mode 100644
index 0000000..e6483c4
--- /dev/null
+++ b/arm-riscos-gnueabi/.gitignore
@@ -0,0 +1,2 @@
+builddir
+sources
diff --git a/arm-riscos-gnueabi/Makefile b/arm-riscos-gnueabi/Makefile
new file mode 100644
index 0000000..11b93c6
--- /dev/null
+++ b/arm-riscos-gnueabi/Makefile
@@ -0,0 +1,201 @@
+# Use a tested trunk version of GCCSDK
+UPSTREAM_GCCSDK_VERSION := 7698
+UPSTREAM_GCCSDK_TARBALL := gccsdk$(UPSTREAM_GCCSDK_VERSION).tar.gz
+UPSTREAM_GCCSDK_URI := svn://svn.riscos.info/gccsdk/trunk/autobuilder/develop/gcc@$(UPSTREAM_GCCSDK_VERSION)
+UPSTREAM_GCCSDK_SGP_URI := svn://svn.riscos.info/gccsdk/trunk/gcc4/setup-gccsdk-params@$(UPSTREAM_GCCSDK_VERSION)
+UPSTREAM_GCCSDK_ROINSTALL_URI := svn://svn.riscos.info/gccsdk/trunk/gcc4/porting-scripts/ro-install@$(UPSTREAM_GCCSDK_VERSION)
+UPSTREAM_GCCSDK_AMP_URI := svn://svn.riscos.info/gccsdk/trunk/gcc4/recipe/patches/automake-for-binutils@$(UPSTREAM_GCCSDK_VERSION)
+UPSTREAM_GCCSDK_UNIXLIB_URI := svn://svn.riscos.info/gccsdk/trunk/gcc4/recipe/files/gcc/libunixlib@$(UPSTREAM_GCCSDK_VERSION)
+UPSTREAM_GCCSDK_LD_URI := svn://svn.riscos.info/gccsdk/trunk/gcc4/riscos/soloader/dynamic/ld.so-1.9.9@$(UPSTREAM_GCCSDK_VERSION)
+UPSTREAM_GCCSDK_ASASM_URI := svn://svn.riscos.info/gccsdk/trunk/tools/asasm@$(UPSTREAM_GCCSDK_VERSION)
+UPSTREAM_GCCSDK_ELF2AIF_URI := svn://svn.riscos.info/gccsdk/trunk/gcc4/riscos/elf2aif@$(UPSTREAM_GCCSDK_VERSION)
+UPSTREAM_GCCSDK_LN_URI := svn://svn.riscos.info/gccsdk/trunk/gcc4/riscos/ln@$(UPSTREAM_GCCSDK_VERSION)
+UPSTREAM_GCCSDK_MKRESFS_URI := svn://svn.riscos.info/gccsdk/trunk/gcc4/riscos/mkresfs@$(UPSTREAM_GCCSDK_VERSION)
+
+# OSLib 7.00
+UPSTREAM_OSLIB_VERSION := 700
+UPSTREAM_OSLIB_TARBALL := oslib$(UPSTREAM_OSLIB_VERSION).tar.gz
+UPSTREAM_OSLIB_URI := https://svn.code.sf.net/p/ro-oslib/code/tags/oslib-$(UPSTREAM_OSLIB_VERSION)/!OSLib
+
+# Known tested version of trunk for CCRes
+UPSTREAM_CCRES_VERSION := 96
+UPSTREAM_CCRES_TARBALL := ccres$(UPSTREAM_CCRES_VERSION).tar.gz
+UPSTREAM_CCRES_URI := svn://svn.riscos.info/ccres/trunk@$(UPSTREAM_CCRES_VERSION)
+
+# Makerun
+UPSTREAM_MAKERUN_VERSION := fe55b6bf
+UPSTREAM_MAKERUN_TARBALL := makerun$(UPSTREAM_MAKERUN_VERSION).tar.gz
+UPSTREAM_MAKERUN_URI := git://git.netsurf-browser.org/makerun.git
+
+# Squeeze
+UPSTREAM_SQUEEZE_VERSION := d54d441
+UPSTREAM_SQUEEZE_TARBALL := squeeze$(UPSTREAM_SQUEEZE_VERSION).tar.gz
+UPSTREAM_SQUEEZE_URI := git://git.netsurf-browser.org/squeeze.git
+
+# Infozip
+UPSTREAM_INFOZIP_VERSION := 30
+UPSTREAM_INFOZIP_TARBALL := zip$(UPSTREAM_INFOZIP_VERSION).tar.gz
+UPSTREAM_INFOZIP_URI := https://downloads.sourceforge.net/project/infozip/Zip%203.x%20%28latest%29/3.0/$(UPSTREAM_INFOZIP_TARBALL)
+
+Q ?= @
+TOP := $(CURDIR)
+RECIPES := $(TOP)/recipes
+SOURCESDIR := $(TOP)/sources
+BUILDDIR := $(TOP)/builddir
+BUILDSTEPS := $(BUILDDIR)/build-steps
+
+TARGET_NAME := arm-riscos-gnueabi
+
+PREFIX ?= /opt/netsurf/$(TARGET_NAME)
+
+# tools
+FETCHSRC:=$(CURDIR)/fetchsrc
+
+.PHONY: all clean distclean
+all: $(BUILDSTEPS)/toolchain.d
+
+clean:
+ rm -fr $(BUILDDIR)
+
+distclean: clean
+ rm -fr $(SOURCESDIR)
+
+###
+# Rules to build the full toolchain
+###
+
+$(BUILDSTEPS)/toolchain.d: $(BUILDSTEPS)/ccres.d $(BUILDSTEPS)/makerun.d $(BUILDSTEPS)/squeeze.d $(BUILDSTEPS)/infozip.d
+ touch $@
+
+###
+# Rules to build and install Infozip
+###
+
+$(BUILDSTEPS)/infozip.d: $(BUILDSTEPS)/gcc.d $(SOURCESDIR)/$(UPSTREAM_INFOZIP_TARBALL)
+ tar -C $(BUILDDIR) -xaf $(SOURCESDIR)/$(UPSTREAM_INFOZIP_TARBALL)
+ for p in `ls $(RECIPES)/patches/infozip/*.p` ; do patch -d $(BUILDDIR)/zip$(UPSTREAM_INFOZIP_VERSION) -p0 <$$p ; done
+ cd $(BUILDDIR)/zip$(UPSTREAM_INFOZIP_VERSION) && make -f unix/Makefile generic LOCAL_ZIP=-DFORRISCOS
+ cp $(BUILDDIR)/zip$(UPSTREAM_INFOZIP_VERSION)/zip $(PREFIX)/cross/bin/zip
+ @# Yuck. Build host tooling should not be installed into the target environment
+ mkdir -p $(PREFIX)/env/bin
+ ln -fs $(PREFIX)/cross/bin/zip $(PREFIX)/env/bin/zip
+ touch $@
+
+###
+# Rules to build and install Makerun
+###
+
+$(BUILDSTEPS)/makerun.d: $(BUILDSTEPS)/gcc.d $(SOURCESDIR)/$(UPSTREAM_MAKERUN_TARBALL)
+ tar -C $(BUILDDIR) -xaf $(SOURCESDIR)/$(UPSTREAM_MAKERUN_TARBALL)
+ cd $(BUILDDIR)/makerun && GCCSDK_INSTALL_CROSSBIN=$(PREFIX)/cross/bin make install
+ touch $@
+
+###
+# Rules to build and install Squeeze
+###
+
+$(BUILDSTEPS)/squeeze.d: $(BUILDSTEPS)/gcc.d $(SOURCESDIR)/$(UPSTREAM_SQUEEZE_TARBALL)
+ tar -C $(BUILDDIR) -xaf $(SOURCESDIR)/$(UPSTREAM_SQUEEZE_TARBALL)
+ cd $(BUILDDIR)/squeeze && GCCSDK_INSTALL_CROSSBIN=$(PREFIX)/cross/bin make install
+ touch $@
+
+###
+# Rules to build and install CCRes
+###
+
+$(BUILDSTEPS)/ccres.d: $(BUILDSTEPS)/oslib.d $(SOURCESDIR)/$(UPSTREAM_CCRES_TARBALL)
+ tar -C $(BUILDDIR) -xaf $(SOURCESDIR)/$(UPSTREAM_CCRES_TARBALL)
+ cd $(BUILDDIR)/ccres && GCCSDK_INSTALL_ENV=$(PREFIX)/env GCCSDK_INSTALL_CROSSBIN=$(PREFIX)/cross/bin make
+ cd $(BUILDDIR)/ccres && GCCSDK_INSTALL_ENV=$(PREFIX)/env GCCSDK_INSTALL_CROSSBIN=$(PREFIX)/cross/bin make install
+ touch $@
+
+###
+# Rules to build and install OSLib
+###
+
+$(BUILDSTEPS)/oslib.d: $(BUILDSTEPS)/gcc.d $(SOURCESDIR)/$(UPSTREAM_OSLIB_TARBALL)
+ tar -C $(BUILDDIR) -xaf $(SOURCESDIR)/$(UPSTREAM_OSLIB_TARBALL)
+ for p in `ls $(RECIPES)/patches/oslib/*.p` ; do patch -d $(BUILDDIR)/oslib -p0 <$$p ; done
+ cd $(BUILDDIR)/oslib && GCCSDK_INSTALL_ENV=$(PREFIX)/env GCCSDK_INSTALL_CROSSBIN=$(PREFIX)/cross/bin make install-elfeabi
+ touch $@
+
+###
+# Rules to build and install GCCSDK
+###
+
+$(BUILDSTEPS)/gcc.d: $(BUILDSTEPS)/gccsdk-srcdir.d
+ cd $(BUILDDIR)/gccsdk && make
+ @# Install ro-install
+ mkdir -p $(PREFIX)/env
+ sed -e s:GCCSDK_ENV:$(PREFIX)/env:g < $(BUILDDIR)/gccsdk/ro-install > $(PREFIX)/env/ro-install
+ chmod 755 $(PREFIX)/env/ro-install
+ @# Install empty libraries needed to fool configure scripts
+ for l in c pthread gcc_s ; do $(PREFIX)/cross/bin/$(TARGET_NAME)-ar mv $(PREFIX)/cross/$(TARGET_NAME)/lib/lib$$l.a ; done
+ @# Newer GCCSDK adds these trampoline binaries that for us
+ @# serve no purpose and get in the way.
+ $(RM) $(PREFIX)/cross/bin/$(TARGET_NAME)-gcc-ar $(PREFIX)/cross/bin/$(TARGET_NAME)-gcc-nm $(PREFIX)/cross/bin/$(TARGET_NAME)-gcc-ranlib
+ touch $@
+
+$(BUILDSTEPS)/gccsdk-srcdir.d: $(BUILDSTEPS)/buildsteps.d $(SOURCESDIR)/$(UPSTREAM_GCCSDK_TARBALL)
+ tar -C $(BUILDDIR) -xaf $(SOURCESDIR)/$(UPSTREAM_GCCSDK_TARBALL)
+ cp -p $(RECIPES)/files/gccsdk/gccsdk-params $(BUILDDIR)/gccsdk/gccsdk-params
+ sed -i 's#{PREFIX}#$(PREFIX)#' $(BUILDDIR)/gccsdk/gccsdk-params
+ sed -i \
+ -e "s#GCCSDK_SUPPORTED_GCC_RELEASE=[0-9.]\+#GCCSDK_SUPPORTED_GCC_RELEASE=$$(grep '^GCC_VERSION=[0-9.]\+' $(BUILDDIR)/gccsdk/gcc/setvars | sed -e 's/^GCC_VERSION=//')#" \
+ -e "s#GCCSDK_SUPPORTED_BINUTILS_RELEASE=[0-9.]\+#GCCSDK_SUPPORTED_BINUTILS_RELEASE=$$(grep '^BINUTILS_VERSION=[0-9.]\+' $(BUILDDIR)/gccsdk/gcc/setvars | sed -e 's/^BINUTILS_VERSION=//')#" \
+ $(BUILDDIR)/gccsdk/setup-gccsdk-params
+ cp -p $(RECIPES)/files/gccsdk/Makefile $(BUILDDIR)/gccsdk/Makefile
+ $(Q)for p in $$(ls $(RECIPES)/files/gccsdk/*.p 2>/dev/null) ; do echo " COPY: $$p -> $(BUILDDIR)/gccsdk/gcc/" ; cp -p $$p $(BUILDDIR)/gccsdk/gcc/ ; done
+ $(Q)for p in $$(ls $(RECIPES)/files/gccsdk/*.pp 2>/dev/null) ; do echo " COPY: $$p -> $(BUILDDIR)/gccsdk/gcc/" ; cp -p $$p $(BUILDDIR)/gccsdk/gcc/ ; done
+ $(Q)for p in $$(ls $(RECIPES)/patches/gccsdk/*.p 2>/dev/null) ; do echo "PATCH: $$p" ; patch -d $(BUILDDIR)/gccsdk -p0 <$$p ; done
+ touch $@
+
+###
+# Rules to fetch upstream sources
+###
+
+$(SOURCESDIR)/$(UPSTREAM_GCCSDK_TARBALL):
+ svn export $(UPSTREAM_GCCSDK_URI) $(SOURCESDIR)/gccsdk/gcc
+ svn export $(UPSTREAM_GCCSDK_SGP_URI) $(SOURCESDIR)/gccsdk/
+ svn export $(UPSTREAM_GCCSDK_ROINSTALL_URI) $(SOURCESDIR)/gccsdk/
+ svn export $(UPSTREAM_GCCSDK_AMP_URI) $(SOURCESDIR)/gccsdk/automake
+ svn export $(UPSTREAM_GCCSDK_UNIXLIB_URI) $(SOURCESDIR)/gccsdk/libunixlib
+ svn export $(UPSTREAM_GCCSDK_LD_URI) $(SOURCESDIR)/gccsdk/ld
+ svn export $(UPSTREAM_GCCSDK_ASASM_URI) $(SOURCESDIR)/gccsdk/asasm
+ svn export $(UPSTREAM_GCCSDK_ELF2AIF_URI) $(SOURCESDIR)/gccsdk/elf2aif
+ svn export $(UPSTREAM_GCCSDK_LN_URI) $(SOURCESDIR)/gccsdk/ln
+ svn export $(UPSTREAM_GCCSDK_MKRESFS_URI) $(SOURCESDIR)/gccsdk/mkresfs
+ tar -C $(SOURCESDIR) -caf $@ gccsdk
+
+$(SOURCESDIR)/$(UPSTREAM_OSLIB_TARBALL):
+ svn co $(UPSTREAM_OSLIB_URI) $(SOURCESDIR)/oslib
+ tar -C $(SOURCESDIR) -caf $@ oslib
+
+$(SOURCESDIR)/$(UPSTREAM_CCRES_TARBALL):
+ svn co $(UPSTREAM_CCRES_URI) $(SOURCESDIR)/ccres
+ tar -C $(SOURCESDIR) -caf $@ ccres
+
+$(SOURCESDIR)/$(UPSTREAM_MAKERUN_TARBALL):
+ $(RM) -rf $(SOURCESDIR)/makerun
+ git clone $(UPSTREAM_MAKERUN_URI) $(SOURCESDIR)/makerun
+ tar -C $(SOURCESDIR) -caf $@ makerun
+
+$(SOURCESDIR)/$(UPSTREAM_SQUEEZE_TARBALL):
+ $(RM) -rf $(SOURCESDIR)/squeeze
+ git clone $(UPSTREAM_SQUEEZE_URI) $(SOURCESDIR)/squeeze
+ tar -C $(SOURCESDIR) -caf $@ squeeze
+
+$(SOURCESDIR)/$(UPSTREAM_INFOZIP_TARBALL):
+ $(FETCHSRC) arm-unknown-riscos $(subst $(SOURCESDIR)/,,$@) $(UPSTREAM_INFOZIP_URI) $@
+
+###
+# Rule to create buildsteps dir
+###
+
+$(BUILDSTEPS)/buildsteps.d: $(SOURCESDIR)
+ mkdir -p $(BUILDSTEPS)
+ touch $@
+
+$(SOURCESDIR):
+ mkdir -p $@
+
diff --git a/arm-riscos-gnueabi/fetchsrc b/arm-riscos-gnueabi/fetchsrc
new file mode 100755
index 0000000..92ae5bf
--- /dev/null
+++ b/arm-riscos-gnueabi/fetchsrc
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+# script to fetch toolchain source tar using ci.netsurf-browser.org as a cache
+
+# Usage fetchsrc <target> <source> <upstream> <output>
+
+NSSRV="https://ci.netsurf-browser.org/toolchain/"
+
+wget -q -O ${4} ${NSSRV}/${1}/${2}
+if [ $? -ne 0 ];then
+ wget -q -O ${4} ${3}
+ if [ $? -ne 0 ];then
+ rm ${4}
+ exit 1
+ fi
+fi
diff --git a/arm-riscos-gnueabi/recipes/files/gccsdk/Makefile b/arm-riscos-gnueabi/recipes/files/gccsdk/Makefile
new file mode 100644
index 0000000..01b4cbd
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/files/gccsdk/Makefile
@@ -0,0 +1,447 @@
+# To build GCCSDK cross-compiler.
+# Written by John Tytgat / BASS
+# Copyright (c) 2009-2021 GCCSDK Developers
+#
+# Build requirements:
+# - apt-get install flex bison libgmp3-dev libmpfr-dev texinfo build-essential
+# - binutils 2.30 and gcc 10.2 needs automake 1.11.1 and autoconf 2.64 and
+# a recent libtool version.
+# Note the required automake/autoconf/libtool sources will be fetched
+# & built automatically.
+# - gcc 10.2 needs at least GMP 6.1.0, ISL 0.18, MPFR 3.1.4 and MPC 1.0.3 (MPFR needs GMP, MPC needs GMP & MPFR)
+# For MPFR/GMP/ISL/MPC version numbers, a good set can be found mentioned at gcc/contrib/download_prerequisites.
+
+# TARGET can have following values: arm-riscos-gnueabi
+TARGET=arm-riscos-gnueabi
+GCC_LANGUAGES="c,c++"
+# Enable shared library support in the cross compiler ?
+CROSS_ENABLE_SHARED=yes
+
+# Release ID for GCCSDK RISC OS release (eg 4.7.4 release 6)
+GCCSDK_GCC_RISCOS_RELEASE=1
+
+# Versions of binutils/autotools needed to build our tools
+AUTOCONF_FOR_BINUTILS_VERSION=2.64
+AUTOMAKE_FOR_BINUTILS_VERSION=1.11.1
+LIBTOOL_FOR_BINUTILS_VERSION=2.4.2
+BINUTILS_VERSION=$(GCCSDK_SUPPORTED_BINUTILS_RELEASE)
+AUTOCONF_FOR_GCC_VERSION=2.69
+AUTOMAKE_FOR_GCC_VERSION=1.15.1
+LIBTOOL_FOR_GCC_VERSION=2.4.2
+
+# Versions of upstream components we need
+# XXX: fetch these ourselves, rather than using download_prerequisites
+GCC_VERSION=$(GCCSDK_SUPPORTED_GCC_RELEASE)
+GMP_VERSION=6.1.0
+ISL_VERSION=0.18
+MPFR_VERSION=3.1.4
+MPC_VERSION=1.1.0
+
+# Whether to enable link-time optimisation
+GCC_USE_LTO=no
+
+# If $(AUTOCONF_AUTOMAKE_LIBTOOL_FOR_BINUTILS_VERSIONS) equals
+# $(AUTOCONF_AUTOMAKE_LIBTOOL_FOR_GCC_VERSIONS) we can reuse the installed
+# buildtools for binutils for building gcc.
+AUTOCONF_AUTOMAKE_LIBTOOL_FOR_BINUTILS_VERSIONS := $(AUTOCONF_FOR_BINUTILS_VERSION)-$(AUTOMAKE_FOR_BINUTILS_VERSION)-$(LIBTOOL_FOR_BINUTILS_VERSION)
+AUTOCONF_AUTOMAKE_LIBTOOL_FOR_GCC_VERSIONS := $(AUTOCONF_FOR_GCC_VERSION)-$(AUTOMAKE_FOR_GCC_VERSION)-$(LIBTOOL_FOR_GCC_VERSION)
+
+# Notes:
+# 1) Configure options are explained at http://gcc.gnu.org/install/configure.html
+# but note that this explanation is for the latest gcc version released and
+# not necessary the gcc version we're building here.
+# Specifying --disable-multilib will significantly reduce build times but then
+# you only end up with UnixLib/softfloat support.
+# Note: --enable-multilib is the default. Don't specify it unless you want to get hit
+# by PR43328/PR45174.
+GCC_CONFIG_ARGS := \
+ --enable-threads=posix \
+ --enable-sjlj-exceptions=no \
+ --enable-c99 \
+ --enable-cmath \
+ --disable-c-mbchar \
+ --disable-wchar_t \
+ --disable-libstdcxx-pch \
+ --disable-tls \
+ --enable-__cxa_atexit \
+ --disable-libssp \
+ --disable-libgomp \
+ --disable-libitm \
+ --with-abi=aapcs-linux \
+ --with-arch=armv4 \
+ --with-float=soft
+BINUTILS_CONFIG_ARGS :=
+GCC_CONFIG_ARGS += --with-pkgversion='GCCSDK GCC $(GCC_VERSION) Release $(GCCSDK_GCC_RISCOS_RELEASE)' \
+ --with-bugurl=http://gccsdk.riscos.info/
+BINUTILS_CONFIG_ARGS += --with-pkgversion='GCCSDK GCC $(GCC_VERSION) Release $(GCCSDK_GCC_RISCOS_RELEASE)' \
+ --with-bugurl=http://gccsdk.riscos.info/
+BINUTILS_CONFIG_ARGS += --disable-werror --with-gcc --enable-interwork --disable-nls #--enable-maintainer-mode
+# --disable-werror is added because --enable-maintainer-mode turns all warnings into errors and
+# the gcc build is not 100% warning free.
+# However, this does not help for libstdc++ builds when newlib is used, cfr http://gcc.gnu.org/PR47058.
+GCC_CONFIG_ARGS += --enable-maintainer-mode --disable-werror
+GCC_CONFIG_ARGS += --enable-interwork --disable-nls --disable-libquadmath
+
+# When debugging/testing/validating the compiler add "--enable-checking=all",
+# otherwise add "--enable-checking=release" or even "--enable-checking=no"
+GCC_CONFIG_ARGS += --enable-checking=release
+# Configure args shared between different targets:
+# For debugging:
+# FIXME: add to GCC_BUILD_FLAGS for optimized ARM libraries: CFLAGS_FOR_TARGET="-O3 -march=armv5" CXXFLAGS_FOR_TARGET="-O3 -march=armv5"
+# Or perhaps better, at GCC configure time something like --with-arch=armv6 --with-tune=cortex-a8 --with-float=softfp --with-fpu=vfp ?
+##GCC_BUILD_FLAGS := CFLAGS="-O0 -g" LIBCXXFLAGS="-O0 -g"
+##BINUTILS_BUILD_FLAGS = CFLAGS="-O0 -g"
+
+ROOT := $(CURDIR)
+PREFIX_CROSS := $(GCCSDK_CROSS_PREFIX)
+PREFIX_RONATIVE := $(GCCSDK_RISCOS_PREFIX)/\!GCC
+BUILDDIR := $(GCCSDK_BUILDDIR)
+BUILDSTEPSDIR := buildstepsdir
+# PREFIX_BUILDTOOL_BINUTILS will contain the built autoconf/automake/libtool versions used during building binutils.
+PREFIX_BUILDTOOL_BINUTILS := $(BUILDDIR)/installed-buildtools-for-binutils
+# PREFIX_BUILDTOOL_GCC will contain the built autoconf/automake/libtool versions used during building gcc.
+# When the autoconf/automake/libtool versions needed to build gcc are the same as the autoconf/automake/libtool versions
+# needed to build binutils, PREFIX_BUILDTOOL_GCC will be a symlink to PREFIX_BUILDTOOL_BINUTILS
+# (compare $(AUTOCONF_AUTOMAKE_LIBTOOL_FOR_BINUTILS_VERSIONS) with $(AUTOCONF_AUTOMAKE_LIBTOOL_FOR_GCC_VERSIONS)).
+PREFIX_BUILDTOOL_GCC := $(BUILDDIR)/installed-buildtools-for-gcc
+PREFIX_CROSSGCC_LIBS := $(BUILDDIR)/installed-libs-for-cross-gcc
+SRCDIR := $(GCCSDK_SRCDIR)
+SRCORIGDIR := $(GCCSDK_SRCDIR).orig
+
+ifeq ($(CROSS_ENABLE_SHARED),yes)
+CROSS_GCC_CONFIG_ARGS += target_configargs=--enable-shared=libunixlib,libgcc,libstdc++,libbacktrace
+else
+CROSS_GCC_CONFIG_ARGS += target_configargs=--disable-shared
+endif
+ifeq ($(GCC_USE_LTO),yes)
+CROSS_GCC_CONFIG_ARGS += --enable-lto
+else
+CROSS_GCC_CONFIG_ARGS += --disable-lto
+endif
+
+# Configure arguments Binutils & GCC:
+CROSS_CONFIG_ARGS := --target=$(TARGET) --prefix=$(PREFIX_CROSS)
+
+# To respawn Makefile with setup-gccsdk-param environment loaded.
+GCCSDK_INTERNAL_GETENV=getenv
+ifeq ($(MAKECMDGOALS),)
+MAKECMDGOALS=all
+endif
+
+.NOTPARALLEL:
+.PHONY: all all-done cross clean clean-done clean-cross clean-cross-done distclean distclean-done getenv
+VPATH = $(BUILDSTEPSDIR)
+
+# Default target is to build the cross-compiler (including the RISC OS tools):
+all: $(GCCSDK_INTERNAL_GETENV)
+all-done: cross-done
+
+# Builds the cross compiler:
+cross: $(GCCSDK_INTERNAL_GETENV)
+cross-done: cross-gcc-built cross-riscostools-built
+ touch $(BUILDSTEPSDIR)/$@
+
+clean: $(GCCSDK_INTERNAL_GETENV)
+clean-done:
+ -rm -rf $(BUILDDIR) $(BUILDSTEPSDIR) $(SRCDIR) $(GCCSDK_CROSS_PREFIX)
+
+# Return to a state for doing a full fresh cross build (using the current binutils/gcc sources).
+clean-cross: $(GCCSDK_INTERNAL_GETENV)
+clean-cross-done:
+ -rm -rf $(BUILDSTEPSDIR)/cross-* $(BUILDDIR)/cross* $(GCCSDK_CROSS_PREFIX)
+
+distclean: $(GCCSDK_INTERNAL_GETENV)
+distclean-done: clean-done
+ -rm -rf release-area $(SRCORIGDIR)
+
+# Respawn Makefile again after having loaded all our GCCSDK environment variables.
+ifeq ($(GCCSDK_INTERNAL_GETENV),getenv)
+getenv:
+ test -d $(BUILDSTEPSDIR) || mkdir $(BUILDSTEPSDIR)
+ @bash -c ". ./setup-gccsdk-params && $(MAKE) $(patsubst %,%-done,$(MAKECMDGOALS)) GCCSDK_INTERNAL_GETENV="
+endif
+
+# -- Configure & building:
+
+# Configure & build autoconf-for-binutils tool:
+buildtool-autoconf-for-binutils-built: src-autoconf-for-binutils-copied
+ -rm -rf $(BUILDDIR)/buildtool-autoconf-for-binutils
+ mkdir -p $(BUILDDIR)/buildtool-autoconf-for-binutils
+ cd $(BUILDDIR)/buildtool-autoconf-for-binutils && $(SRCDIR)/autoconf-for-binutils/configure --prefix=$(PREFIX_BUILDTOOL_BINUTILS) && $(MAKE) && $(MAKE) install
+ touch $(BUILDSTEPSDIR)/$@
+
+ifneq ($(AUTOCONF_AUTOMAKE_LIBTOOL_FOR_BINUTILS_VERSIONS),$(AUTOCONF_AUTOMAKE_LIBTOOL_FOR_GCC_VERSIONS))
+# Configure & build autoconf-for-gcc tool:
+buildtool-autoconf-for-gcc-built: src-autoconf-for-gcc-copied
+ -rm -rf $(BUILDDIR)/buildtool-autoconf-for-gcc
+ mkdir -p $(BUILDDIR)/buildtool-autoconf-for-gcc
+ cd $(BUILDDIR)/buildtool-autoconf-for-gcc && $(SRCDIR)/autoconf-for-gcc/configure --prefix=$(PREFIX_BUILDTOOL_GCC) && $(MAKE) && $(MAKE) install
+else
+# autoconf-for-gcc, automake-for-gcc and libtool-for-gcc are the same as autoconf-for-binutils, automake-for-binutils and libtool-for-binutils so we can use PREFIX_BUILDTOOL_GCC as PREFIX_BUILDTOOL_BINUTILS
+buildtool-autoconf-for-gcc-built: buildtool-autoconf-for-binutils-built
+ ln -f -s $(PREFIX_BUILDTOOL_BINUTILS) $(PREFIX_BUILDTOOL_GCC)
+endif
+ touch $(BUILDSTEPSDIR)/$@
+
+# Configure & build automake-for-binutils tool:
+buildtool-automake-for-binutils-built: src-automake-for-binutils-copied buildtool-autoconf-for-binutils-built
+ -rm -rf $(BUILDDIR)/buildtool-automake-for-binutils
+ mkdir -p $(BUILDDIR)/buildtool-automake-for-binutils
+ cd $(BUILDDIR)/buildtool-automake-for-binutils && PATH="$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" && $(SRCDIR)/automake-for-binutils/configure --prefix=$(PREFIX_BUILDTOOL_BINUTILS) && $(MAKE) && $(MAKE) install
+ touch $(BUILDSTEPSDIR)/$@
+
+ifneq ($(AUTOCONF_AUTOMAKE_LIBTOOL_FOR_BINUTILS_VERSIONS),$(AUTOCONF_AUTOMAKE_LIBTOOL_FOR_GCC_VERSIONS))
+# Configure & build automake-for-gcc tool:
+buildtool-automake-for-gcc-built: src-automake-for-gcc-copied buildtool-autoconf-for-gcc-built
+ -rm -rf $(BUILDDIR)/buildtool-automake-for-gcc
+ mkdir -p $(BUILDDIR)/buildtool-automake-for-gcc
+ cd $(BUILDDIR)/buildtool-automake-for-gcc && PATH="$(PREFIX_BUILDTOOL_GCC)/bin:$(PATH)" && $(SRCDIR)/automake-for-gcc/configure --prefix=$(PREFIX_BUILDTOOL_GCC) && $(MAKE) && $(MAKE) install
+else
+# autoconf-for-gcc, automake-for-gcc and libtool-for-gcc are the same as autoconf-for-binutils, automake-for-binutils and libtool-for-binutils so we can use PREFIX_BUILDTOOL_GCC as PREFIX_BUILDTOOL_BINUTILS
+buildtool-automake-for-gcc-built: buildtool-automake-for-binutils-built
+endif
+ touch $(BUILDSTEPSDIR)/$@
+
+# Configure & build libtool-for-binutils tool:
+buildtool-libtool-for-binutils-built: src-libtool-for-binutils-copied buildtool-autoconf-for-binutils-built buildtool-automake-for-binutils-built
+ -rm -rf $(BUILDDIR)/buildtool-libtool-for-binutils
+ mkdir -p $(BUILDDIR)/buildtool-libtool-for-binutils
+ cd $(BUILDDIR)/buildtool-libtool-for-binutils && PATH="$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" && $(SRCDIR)/libtool-for-binutils/configure --prefix=$(PREFIX_BUILDTOOL_BINUTILS) && $(MAKE) && $(MAKE) install
+ touch $(BUILDSTEPSDIR)/$@
+
+ifneq ($(AUTOCONF_AUTOMAKE_LIBTOOL_FOR_BINUTILS_VERSIONS),$(AUTOCONF_AUTOMAKE_LIBTOOL_FOR_GCC_VERSIONS))
+# Configure & build libtool-for-gcc tool:
+buildtool-libtool-for-gcc-built: src-libtool-for-gcc-copied buildtool-autoconf-for-gcc-built buildtool-automake-for-gcc-built
+ -rm -rf $(BUILDDIR)/buildtool-libtool-for-gcc
+ mkdir -p $(BUILDDIR)/buildtool-libtool-for-gcc
+ cd $(BUILDDIR)/buildtool-libtool-for-gcc && PATH="$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" && $(SRCDIR)/libtool-for-gcc/configure --prefix=$(PREFIX_BUILDTOOL_GCC) && $(MAKE) && $(MAKE) install
+else
+# autoconf-for-gcc, automake-for-gcc and libtool-for-gcc are the same as autoconf-for-binutils, automake-for-binutils and libtool-for-binutils so we can use PREFIX_BUILDTOOL_GCC as PREFIX_BUILDTOOL_BINUTILS
+buildtool-libtool-for-gcc-built: buildtool-libtool-for-binutils-built
+endif
+ touch $(BUILDSTEPSDIR)/$@
+
+# Configure binutils cross:
+cross-binutils-configured: src-binutils-copied
+ -rm -rf $(BUILDDIR)/cross-binutils
+ mkdir -p $(BUILDDIR)/cross-binutils
+ cd $(BUILDDIR)/cross-binutils && PATH="$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" && $(SRCDIR)/binutils/configure $(CROSS_CONFIG_ARGS) $(BINUTILS_CONFIG_ARGS)
+ touch $(BUILDSTEPSDIR)/$@
+
+# Build binutils cross:
+cross-binutils-built: cross-binutils-configured
+ cd $(BUILDDIR)/cross-binutils && PATH="$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" && $(SRCDIR)/binutils/configure $(CROSS_CONFIG_ARGS) $(BINUTILS_CONFIG_ARGS) && $(MAKE) $(BINUTILS_BUILD_FLAGS) && $(MAKE) install
+ touch $(BUILDSTEPSDIR)/$@
+
+# Configure gcc cross:
+cross-gcc-configured: src-gcc-copied cross-binutils-built
+ -rm -rf $(BUILDDIR)/cross-gcc
+ mkdir -p $(BUILDDIR)/cross-gcc
+ mkdir -p $(PREFIX_CROSS)/$(TARGET)/lib
+ for l in c pthread gcc_s; do $(PREFIX_CROSS)/bin/$(TARGET)-ar mv $(PREFIX_CROSS)/$(TARGET)/lib/lib$${l}.a; done
+ cd $(BUILDDIR)/cross-gcc && PATH="$(PREFIX_BUILDTOOL_GCC)/bin:$(PREFIX_CROSS)/bin:$(PATH)" && $(SRCDIR)/gcc/configure $(CROSS_CONFIG_ARGS) $(CROSS_GCC_CONFIG_ARGS) $(GCC_CONFIG_ARGS) --enable-languages=$(GCC_LANGUAGES)
+ touch $(BUILDSTEPSDIR)/$@
+
+# Build gcc cross:
+cross-gcc-built: cross-gcc-configured
+ cd $(BUILDDIR)/cross-gcc && PATH="$(PREFIX_BUILDTOOL_GCC)/bin:$(PREFIX_CROSS)/bin:$(PATH)" && $(MAKE) $(GCC_BUILD_FLAGS) && $(MAKE) install
+ touch $(BUILDSTEPSDIR)/$@
+
+# Build the RISC OS related tools (elf2aif, asasm, etc) cross:
+cross-riscostools-built: cross-gcc-built
+ @# LD
+ -rm -rf $(BUILDDIR)/cross-ld
+ mkdir -p $(BUILDDIR)/cross-ld
+ cd $(ROOT)/ld && PATH="$(PREFIX_CROSS)/bin:$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" autoreconf -f --install
+ cd $(BUILDDIR)/cross-ld && PATH="$(PREFIX_CROSS)/bin:$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" CC=$(GCCSDK_INSTALL_CROSSBIN)/$(TARGET)-gcc $(ROOT)/ld/configure --prefix=$(PREFIX_CROSS)/$(TARGET) --host=$(TARGET) --target=$(TARGET)
+ cd $(BUILDDIR)/cross-ld && PATH="$(PREFIX_CROSS)/bin:$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" make install
+ @# asasm
+ -rm -rf $(BUILDDIR)/cross-asasm
+ mkdir -p $(BUILDDIR)/cross-asasm
+ cd $(ROOT)/asasm && PATH="$(PREFIX_CROSS)/bin:$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" ACLOCAL='aclocal -I $(ROOT)/asasm/m4' autoreconf -f --install
+ cd $(BUILDDIR)/cross-asasm && PATH="$(PREFIX_CROSS)/bin:$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" $(ROOT)/asasm/configure --prefix=$(PREFIX_CROSS) --target=$(TARGET) --disable-building-tools
+ cd $(BUILDDIR)/cross-asasm && PATH="$(PREFIX_CROSS)/bin:$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" make install-minimum
+ @# elf2aif
+ -rm -rf $(BUILDDIR)/cross-elf2aif
+ mkdir -p $(BUILDDIR)/cross-elf2aif
+ cd $(ROOT)/elf2aif && PATH="$(PREFIX_CROSS)/bin:$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" autoreconf -f --install
+ cd $(BUILDDIR)/cross-elf2aif && PATH="$(PREFIX_CROSS)/bin:$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" $(ROOT)/elf2aif/configure --prefix=$(PREFIX_CROSS) --target=$(TARGET)
+ cd $(BUILDDIR)/cross-elf2aif && PATH="$(PREFIX_CROSS)/bin:$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" make install
+ @# ln
+ -rm -rf $(BUILDDIR)/cross-ln
+ mkdir -p $(BUILDDIR)/cross-ln
+ cd $(ROOT)/ln && PATH="$(PREFIX_CROSS)/bin:$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" autoreconf -f --install
+ cd $(BUILDDIR)/cross-ln && PATH="$(PREFIX_CROSS)/bin:$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" $(ROOT)/ln/configure --prefix=$(PREFIX_CROSS) --target=$(TARGET)
+ cd $(BUILDDIR)/cross-ln && PATH="$(PREFIX_CROSS)/bin:$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" make install
+ @# mkresfs
+ -rm -rf $(BUILDDIR)/cross-mkresfs
+ mkdir -p $(BUILDDIR)/cross-mkresfs
+ cd $(ROOT)/mkresfs && PATH="$(PREFIX_CROSS)/bin:$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" autoreconf -f --install
+ cd $(BUILDDIR)/cross-mkresfs && PATH="$(PREFIX_CROSS)/bin:$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" $(ROOT)/mkresfs/configure --prefix=$(PREFIX_CROSS) --target=$(TARGET)
+ cd $(BUILDDIR)/cross-mkresfs && PATH="$(PREFIX_CROSS)/bin:$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" make install
+ touch $(BUILDSTEPSDIR)/$@
+
+# -- Source unpacking.
+
+# Unpack & copy autoconf-for-binutils source:
+src-autoconf-for-binutils-copied: $(SRCORIGDIR)/autoconf-$(AUTOCONF_FOR_BINUTILS_VERSION).tar.xz
+ -rm -rf $(SRCORIGDIR)/autoconf-$(AUTOCONF_FOR_BINUTILS_VERSION) $(SRCDIR)/autoconf-for-binutils
+ cd $(SRCORIGDIR) && tar xf $<
+ -mkdir -p $(SRCDIR)/autoconf-for-binutils
+ cp -T -p -r $(SRCORIGDIR)/autoconf-$(AUTOCONF_FOR_BINUTILS_VERSION) $(SRCDIR)/autoconf-for-binutils
+ touch $(BUILDSTEPSDIR)/$@
+
+ifneq ($(AUTOCONF_AUTOMAKE_LIBTOOL_FOR_BINUTILS_VERSIONS),$(AUTOCONF_AUTOMAKE_LIBTOOL_FOR_GCC_VERSIONS))
+# Unpack & copy autoconf-for-gcc source:
+src-autoconf-for-gcc-copied: $(SRCORIGDIR)/autoconf-$(AUTOCONF_FOR_GCC_VERSION).tar.xz
+ -rm -rf $(SRCORIGDIR)/autoconf-$(AUTOCONF_FOR_GCC_VERSION) $(SRCDIR)/autoconf-for-gcc
+ cd $(SRCORIGDIR) && tar xf $<
+ -mkdir -p $(SRCDIR)/autoconf-for-gcc
+ cp -T -p -r $(SRCORIGDIR)/autoconf-$(AUTOCONF_FOR_GCC_VERSION) $(SRCDIR)/autoconf-for-gcc
+ touch $(BUILDSTEPSDIR)/$@
+endif
+
+# Unpack & copy automake-for-binutils source:
+src-automake-for-binutils-copied: $(SRCORIGDIR)/automake-$(AUTOMAKE_FOR_BINUTILS_VERSION).tar.bz2
+ -rm -rf $(SRCORIGDIR)/automake-$(AUTOMAKE_FOR_BINUTILS_VERSION) $(SRCDIR)/automake-for-binutils
+ cd $(SRCORIGDIR) && tar xf $<
+ -mkdir -p $(SRCDIR)/automake-for-binutils
+ cp -T -p -r $(SRCORIGDIR)/automake-$(AUTOMAKE_FOR_BINUTILS_VERSION) $(SRCDIR)/automake-for-binutils
+ for p in $$(ls $(ROOT)/automake/*.p); do patch -d $(SRCDIR)/automake-for-binutils -p0 -l < $$p; done
+ touch $(BUILDSTEPSDIR)/$@
+
+ifneq ($(AUTOCONF_AUTOMAKE_LIBTOOL_FOR_BINUTILS_VERSIONS),$(AUTOCONF_AUTOMAKE_LIBTOOL_FOR_GCC_VERSIONS))
+# Unpack & copy automake-for-gcc source:
+src-automake-for-gcc-copied: $(SRCORIGDIR)/automake-$(AUTOMAKE_FOR_GCC_VERSION).tar.xz
+ -rm -rf $(SRCORIGDIR)/automake-$(AUTOMAKE_FOR_GCC_VERSION) $(SRCDIR)/automake-for-gcc
+ cd $(SRCORIGDIR) && tar xf $<
+ -mkdir -p $(SRCDIR)/automake-for-gcc
+ cp -T -p -r $(SRCORIGDIR)/automake-$(AUTOMAKE_FOR_GCC_VERSION) $(SRCDIR)/automake-for-gcc
+ touch $(BUILDSTEPSDIR)/$@
+endif
+
+# Unpack & copy libtool-for-binutils source:
+src-libtool-for-binutils-copied: $(SRCORIGDIR)/libtool-$(LIBTOOL_FOR_BINUTILS_VERSION).tar.gz
+ -rm -rf $(SRCORIGDIR)/libtool-$(LIBTOOL_FOR_BINUTILS_VERSION) $(SRCDIR)/libtool-for-binutils
+ cd $(SRCORIGDIR) && tar xf $<
+ -mkdir -p $(SRCDIR)/libtool-for-binutils
+ cp -T -p -r $(SRCORIGDIR)/libtool-$(LIBTOOL_FOR_BINUTILS_VERSION) $(SRCDIR)/libtool-for-binutils
+ touch $(BUILDSTEPSDIR)/$@
+
+ifneq ($(AUTOCONF_AUTOMAKE_LIBTOOL_FOR_BINUTILS_VERSIONS),$(AUTOCONF_AUTOMAKE_LIBTOOL_FOR_GCC_VERSIONS))
+# Unpack & copy libtool-for-gcc source:
+src-libtool-for-gcc-copied: $(SRCORIGDIR)/libtool-$(LIBTOOL_FOR_GCC_VERSION).tar.gz
+ -rm -rf $(SRCORIGDIR)/libtool-$(LIBTOOL_FOR_GCC_VERSION) $(SRCDIR)/libtool-for-gcc
+ cd $(SRCORIGDIR) && tar xf $<
+ -mkdir -p $(SRCDIR)/libtool-for-gcc
+ cp -T -p -r $(SRCORIGDIR)/libtool-$(LIBTOOL_FOR_GCC_VERSION) $(SRCDIR)/libtool-for-gcc
+ touch $(BUILDSTEPSDIR)/$@
+endif
+
+# Unpack & copy (and optionally patch) binutils source:
+# As we're patching and (re)configuring, we need built & installed versions of
+# autoconf, automake and libtool.
+src-binutils-copied: $(SRCORIGDIR)/binutils-$(BINUTILS_VERSION).tar.bz2 buildtool-autoconf-for-binutils-built buildtool-automake-for-binutils-built buildtool-libtool-for-binutils-built
+ -rm -rf $(SRCORIGDIR)/binutils-$(BINUTILS_VERSION) $(SRCDIR)/binutils
+ cd $(SRCORIGDIR) && tar xf $<
+ -mkdir -p $(SRCDIR)/binutils
+ cp -T -p -r $(SRCORIGDIR)/binutils-$(BINUTILS_VERSION) $(SRCDIR)/binutils
+ cp $(ROOT)/gcc/ld.emulparams.armelf_riscos_eabi.sh $(SRCDIR)/binutils/ld/emulparams/armelf_riscos_eabi.sh
+ cp $(ROOT)/gcc/gas.config.te-riscos.h $(SRCDIR)/binutils/gas/config/te-riscos.h
+ for p in $$(ls $(ROOT)/gcc/*.pp); do patch -d $(SRCDIR)/binutils -p0 -l < $$p ; done
+ cd $(SRCDIR)/binutils/ld && PATH="$(PREFIX_BUILDTOOL_BINUTILS)/bin:$(PATH)" autoreconf
+ touch $(BUILDSTEPSDIR)/$@
+
+# Unpack & copy or checkout the gcc source:
+# As we're patching and (re)configuring, we need built & installed versions of
+# autoconf, automake and libtool.
+src-gcc-copied: buildtool-autoconf-for-gcc-built buildtool-automake-for-gcc-built buildtool-libtool-for-gcc-built
+src-gcc-copied: $(SRCORIGDIR)/gcc-$(GCC_VERSION).tar.xz
+ -rm -rf $(SRCORIGDIR)/gcc-$(GCC_VERSION) $(SRCDIR)/gcc
+ cd $(SRCORIGDIR) && tar xf $<
+ -mkdir -p $(SRCDIR)/gcc
+ cp -T -p -r $(SRCORIGDIR)/gcc-$(GCC_VERSION) $(SRCDIR)/gcc
+ mkdir -p $(SRCDIR)/gcc/libstdc++-v3/config/os/riscos
+ cp -T -p $(ROOT)/gcc//gcc.config.arm.riscos-elf.h $(SRCDIR)/gcc/gcc/config/arm/riscos-elf.h
+ cp -T -p $(ROOT)/gcc/gcc.config.arm.riscos-gnueabihf.h $(SRCDIR)/gcc/gcc/config/arm/riscos-gnueabihf.h
+ cp -T -p $(ROOT)/gcc/gcc.config.arm.riscos-gcc.c $(SRCDIR)/gcc/gcc/config/arm/riscos-gcc.c
+ cp -T -p $(ROOT)/gcc/gcc.config.arm.riscos.c $(SRCDIR)/gcc/gcc/config/arm/riscos.c
+ cp -T -p $(ROOT)/gcc/gcc.config.arm.riscos.md $(SRCDIR)/gcc/gcc/config/arm/riscos.md
+ cp -T -p $(ROOT)/gcc/gcc.config.arm.riscos.opt $(SRCDIR)/gcc/gcc/config/arm/riscos.opt
+ cp -T -p $(ROOT)/gcc/gcc.config.arm.t-arm-riscos-elf $(SRCDIR)/gcc/gcc/config/arm/t-arm-riscos-elf
+ cp -T -p $(ROOT)/gcc/gcc.config.arm.t-riscos-gnueabihf $(SRCDIR)/gcc/gcc/config/arm/t-riscos-gnueabihf
+ cp -T -p $(ROOT)/gcc/gcc.config.arm.xm-riscos.h $(SRCDIR)/gcc/gcc/config/arm/xm-riscos.h
+ cp -T -p $(ROOT)/gcc/libgcc.config.arm.t-arm-riscos-elf $(SRCDIR)/gcc/libgcc/config/arm/t-arm-riscos-elf
+ cp -T -p $(ROOT)/gcc/libgcc.config.arm.t-riscos-gnueabihf $(SRCDIR)/gcc/libgcc/config/arm/t-riscos-gnueabihf
+ cp -T -p $(ROOT)/gcc/libstdc++-v3.config.os.riscos.ctype_base.h $(SRCDIR)/gcc/libstdc++-v3/config/os/riscos/ctype_base.h
+ cp -T -p $(ROOT)/gcc/libstdc++-v3.config.os.riscos.ctype_configure_char.cc $(SRCDIR)/gcc/libstdc++-v3/config/os/riscos/ctype_configure_char.cc
+ cp -T -p $(ROOT)/gcc/libstdc++-v3.config.os.riscos.ctype_inline.h $(SRCDIR)/gcc/libstdc++-v3/config/os/riscos/ctype_inline.h
+ cp -T -p $(ROOT)/gcc/libstdc++-v3.config.os.riscos.error_constants.h $(SRCDIR)/gcc/libstdc++-v3/config/os/riscos/error_constants.h
+ cp -T -p $(ROOT)/gcc/libstdc++-v3.config.os.riscos.os_defines.h $(SRCDIR)/gcc/libstdc++-v3/config/os/riscos/os_defines.h
+ for p in $$(ls $(ROOT)/gcc/*.p); do patch -d $(SRCDIR)/gcc -p0 -l < $$p ; done
+ cp -T -p -r $(ROOT)/libunixlib $(SRCDIR)/gcc/libunixlib
+ cd $(SRCDIR)/gcc && $(SRCDIR)/gcc/contrib/download_prerequisites
+ cd $(SRCDIR)/gcc && PATH="$(PREFIX_BUILDTOOL_GCC)/bin:$(PATH)" autogen Makefile.def
+ cd $(SRCDIR)/gcc && PATH="$(PREFIX_BUILDTOOL_GCC)/bin:$(PATH)" autoconf
+ cd $(SRCDIR)/gcc/libcpp && PATH="$(PREFIX_BUILDTOOL_GCC)/bin:$(PATH)" ACLOCAL="aclocal -I .. -I ../config" autoreconf -v
+ cd $(SRCDIR)/gcc/libiberty && PATH="$(PREFIX_BUILDTOOL_GCC)/bin:$(PATH)" ACLOCAL="aclocal -I .. -I ../config" autoreconf -v
+ cd $(SRCDIR)/gcc/libstdc++-v3 && PATH="$(PREFIX_BUILDTOOL_GCC)/bin:$(PATH)" ACLOCAL="aclocal -I .. -I ../config" autoreconf -v
+ cd $(SRCDIR)/gcc && PATH="$(PREFIX_BUILDTOOL_GCC)/bin:$(PATH)" $(SRCDIR)/gcc/libunixlib/gen-auto.pl
+ cd $(SRCDIR)/gcc/libunixlib && PATH="$(PREFIX_BUILDTOOL_GCC)/bin:$(PATH)" ACLOCAL="aclocal -I .. -I ../config" autoreconf -v
+ touch $(BUILDSTEPSDIR)/$@
+
+# -- Source downloading.
+
+# Download autoconf source to be used to build binutils:
+$(SRCORIGDIR)/autoconf-$(AUTOCONF_FOR_BINUTILS_VERSION).tar.xz:
+ -mkdir -p $(SRCORIGDIR)
+ cd $(SRCORIGDIR) && wget -c https://ftpmirror.gnu.org/autoconf/autoconf-$(AUTOCONF_FOR_BINUTILS_VERSION).tar.xz
+ touch $@
+
+# Download automake source to be used to build binutils/autoconf-for-binutils:
+$(SRCORIGDIR)/automake-$(AUTOMAKE_FOR_BINUTILS_VERSION).tar.bz2:
+ -mkdir -p $(SRCORIGDIR)
+ cd $(SRCORIGDIR) && wget -c https://ftpmirror.gnu.org/automake/automake-$(AUTOMAKE_FOR_BINUTILS_VERSION).tar.bz2
+ touch $@
+
+# Download libtool source to be used to build binutils/autoconf-for-binutils:
+$(SRCORIGDIR)/libtool-$(LIBTOOL_FOR_BINUTILS_VERSION).tar.gz:
+ -mkdir -p $(SRCORIGDIR)
+ cd $(SRCORIGDIR) && wget -c https://ftpmirror.gnu.org/libtool/libtool-$(LIBTOOL_FOR_BINUTILS_VERSION).tar.gz
+ touch $@
+
+ifneq ($(AUTOCONF_FOR_BINUTILS_VERSION),$(AUTOCONF_FOR_GCC_VERSION))
+# Download autoconf source to be used to build gcc:
+$(SRCORIGDIR)/autoconf-$(AUTOCONF_FOR_GCC_VERSION).tar.xz:
+ -mkdir -p $(SRCORIGDIR)
+ cd $(SRCORIGDIR) && wget -c https://ftpmirror.gnu.org/autoconf/autoconf-$(AUTOCONF_FOR_GCC_VERSION).tar.xz
+ touch $@
+endif
+
+ifneq ($(AUTOMAKE_FOR_BINUTILS_VERSION),$(AUTOMAKE_FOR_GCC_VERSION))
+# Download automake source to be used to build gcc:
+$(SRCORIGDIR)/automake-$(AUTOMAKE_FOR_GCC_VERSION).tar.xz:
+ -mkdir -p $(SRCORIGDIR)
+ cd $(SRCORIGDIR) && wget -c https://ftpmirror.gnu.org/automake/automake-$(AUTOMAKE_FOR_GCC_VERSION).tar.xz
+ touch $@
+endif
+
+ifneq ($(LIBTOOL_FOR_BINUTILS_VERSION),$(LIBTOOL_FOR_GCC_VERSION))
+# Download libtool source to be used to build gcc:
+$(SRCORIGDIR)/libtool-$(LIBTOOL_FOR_GCC_VERSION).tar.gz:
+ -mkdir -p $(SRCORIGDIR)
+ cd $(SRCORIGDIR) && wget -c https://ftpmirror.gnu.org/libtool/libtool-$(LIBTOOL_FOR_GCC_VERSION).tar.gz
+ touch $@
+endif
+
+# Download binutils source:
+$(SRCORIGDIR)/binutils-$(BINUTILS_VERSION).tar.bz2:
+ -mkdir -p $(SRCORIGDIR)
+ cd $(SRCORIGDIR) && wget -c https://ftpmirror.gnu.org/binutils/binutils-$(BINUTILS_VERSION).tar.bz2
+ touch $@
+
+# Download gcc source:
+$(SRCORIGDIR)/gcc-$(GCC_VERSION).tar.xz:
+ -mkdir -p $(SRCORIGDIR)
+ cd $(SRCORIGDIR) && wget -c https://ftpmirror.gnu.org/gcc/gcc-$(GCC_VERSION)/gcc-$(GCC_VERSION).tar.xz
+ touch $@
diff --git a/arm-riscos-gnueabi/recipes/files/gccsdk/config.sub.p b/arm-riscos-gnueabi/recipes/files/gccsdk/config.sub.p
new file mode 100644
index 0000000..181b56f
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/files/gccsdk/config.sub.p
@@ -0,0 +1,11 @@
+--- config.sub.orig 2022-06-01 07:47:44.364644855 +0100
++++ config.sub 2022-06-01 07:48:02.892796689 +0100
+@@ -135,7 +135,7 @@
+ | linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \
+ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
+ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
+- | storm-chaos* | os2-emx* | rtmk-nova*)
++ | storm-chaos* | os2-emx* | rtmk-nova* | riscos-gnu*)
+ basic_machine=$field1
+ os=$maybe_os
+ ;;
diff --git a/arm-riscos-gnueabi/recipes/files/gccsdk/gccsdk-params b/arm-riscos-gnueabi/recipes/files/gccsdk/gccsdk-params
new file mode 100644
index 0000000..4f48c3c
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/files/gccsdk/gccsdk-params
@@ -0,0 +1,8 @@
+# -- Following section is user configurable:
+# This is where the cross compiler will be installed. It needs to end in 'bin'.
+export GCCSDK_INSTALL_CROSSBIN={PREFIX}/cross/bin
+# This is where the porting tools and any libraries you build will be installed.
+export GCCSDK_INSTALL_ENV={PREFIX}/env
+
+# -- Do not change following section:
+
diff --git a/arm-riscos-gnueabi/recipes/patches/gccsdk/01-relax-abi-matching.p b/arm-riscos-gnueabi/recipes/patches/gccsdk/01-relax-abi-matching.p
new file mode 100644
index 0000000..b1dd8cd
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/gccsdk/01-relax-abi-matching.p
@@ -0,0 +1,100 @@
+Index: gcc/bfd.config.bfd.pp
+===================================================================
+--- gcc/bfd.config.bfd.pp (revision 7698)
++++ gcc/bfd.config.bfd.pp (working copy)
+@@ -4,7 +4,7 @@
+ targ_defvec=arm_elf32_le_vec
+ targ_selvecs=arm_elf32_be_vec
+ ;;
+-+ arm-riscos-gnueabihf)
+++ arm-riscos-gnueabi*)
+ + targ_defvec=arm_elf32_le_vec
+ + targ_selvecs=arm_elf32_be_vec
+ + targ_cflags=-D__RISCOS_TARGET__
+Index: gcc/configure.ac.p
+===================================================================
+--- gcc/configure.ac.p (revision 7698)
++++ gcc/configure.ac.p (working copy)
+@@ -13,7 +13,7 @@
+ esac
+
+ +case "${target}" in
+-+ arm*-*-riscos | *riscos-gnueabihf)
+++ arm*-*-riscos | *riscos-gnueabi*)
+ + ;;
+ + *)
+ + noconfigdirs="$noconfigdirs target-libunixlib"
+Index: gcc/gas.configure.tgt.pp
+===================================================================
+--- gcc/gas.configure.tgt.pp (revision 7698)
++++ gcc/gas.configure.tgt.pp (working copy)
+@@ -4,7 +4,7 @@
+ arm-*-coff) fmt=coff ;;
+ arm-*-phoenix*) fmt=elf ;;
+ arm-*-elf) fmt=elf ;;
+-+ arm-riscos-gnueabihf) fmt=elf em=riscos ;;
+++ arm-riscos-gnueabi*) fmt=elf em=riscos ;;
+ arm-*-eabi* | arm-*-rtems*) fmt=elf em=armeabi ;;
+ arm-*-symbianelf*) fmt=elf em=symbian ;;
+ arm-*-kaos*) fmt=elf ;;
+Index: gcc/gcc.config.gcc.p
+===================================================================
+--- gcc/gcc.config.gcc.p (revision 7698)
++++ gcc/gcc.config.gcc.p (working copy)
+@@ -13,7 +13,7 @@
+ esac
+ tm_file="${tm_file} arm/aout.h arm/arm.h"
+ ;;
+-+arm*-riscos-gnueabihf)
+++arm*-riscos-gnueabi*)
+ + gas=yes
+ + gnu_ld=yes
+ + tm_file="dbxelf.h elfos.h glibc-stdint.h arm/elf.h arm/aout.h arm/arm.h arm/riscos-gnueabihf.h"
+Index: gcc/ld.configure.tgt.pp
+===================================================================
+--- gcc/ld.configure.tgt.pp (revision 7698)
++++ gcc/ld.configure.tgt.pp (working copy)
+@@ -4,7 +4,7 @@
+ arm-*-phoenix*) targ_emul=armelf ;;
+ armeb-*-elf | armeb-*-eabi*)
+ targ_emul=armelfb ;;
+-+arm-riscos-gnueabihf) targ_emul=armelf_riscos_eabi ;;
+++arm-riscos-gnueabi*) targ_emul=armelf_riscos_eabi ;;
+ arm-*-elf | arm*-*-eabi* | arm-*-rtems*)
+ targ_emul=armelf ;;
+ arm*-*-symbianelf*) targ_emul=armsymbian;;
+Index: gcc/libgcc.config.host.p
+===================================================================
+--- gcc/libgcc.config.host.p (revision 7698)
++++ gcc/libgcc.config.host.p (working copy)
+@@ -4,7 +4,7 @@
+ tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip t-slibgcc t-slibgcc-fuchsia"
+ extra_parts="crtbegin.o crtend.o"
+ ;;
+-+arm*-riscos-gnueabihf)
+++arm*-riscos-gnueabi*)
+ + tmake_file="$tmake_file t-crtstuff-pic t-libgcc-pic t-eh-dw2-dip t-slibgcc t-slibgcc-gld t-slibgcc-elf-ver t-linux"
+ + extra_parts="crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtendS.o crti.o crtn.o"
+ + if test x$enable_vtable_verify = xyes; then
+@@ -18,7 +18,7 @@
+ ;;
+ esac
+ ;;
+-+arm*-riscos-gnueabihf)
+++arm*-riscos-gnueabi*)
+ + tmake_file="${tmake_file} arm/t-arm t-fixedpoint-gnu-prefix t-crtfm"
+ + tmake_file="${tmake_file} arm/t-elf arm/t-bpabi arm/t-linux-eabi t-slibgcc-libgcc t-slibgcc-nolc-override"
+ + tm_file="$tm_file arm/bpabi-lib.h"
+Index: gcc/libstdc++-v3.configure.host.p
+===================================================================
+--- gcc/libstdc++-v3.configure.host.p (revision 7698)
++++ gcc/libstdc++-v3.configure.host.p (working copy)
+@@ -4,7 +4,7 @@
+ linux-musl*)
+ os_include_dir="os/generic"
+ ;;
+-+ gnueabihf)
+++ gnueabi*)
+ + os_include_dir="os/riscos"
+ + ;;
+ gnu* | linux* | kfreebsd*-gnu | uclinux*)
diff --git a/arm-riscos-gnueabi/recipes/patches/gccsdk/elf2aif-eabi-support.p b/arm-riscos-gnueabi/recipes/patches/gccsdk/elf2aif-eabi-support.p
new file mode 100644
index 0000000..afac755
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/gccsdk/elf2aif-eabi-support.p
@@ -0,0 +1,394 @@
+Index: elf2aif/src/elf2aif.c
+===================================================================
+--- elf2aif/src/elf2aif.c (revision 7698)
++++ elf2aif/src/elf2aif.c (working copy)
+@@ -54,7 +54,7 @@
+ typedef struct
+ {
+ uint8_t decompress[4]; /* BL to decompression code for compressed images */
+- uint8_t selfreloc[4]; /* BL to self-relocation code */
++ uint8_t selfreloc[4]; /* BL to self-relocation code (*) */
+ uint8_t zeroinit[4]; /* BL to zero init code */
+ uint8_t entrypoint[4]; /* BL to image entry point (*) */
+ uint8_t exitinst[4]; /* Exit instruction */
+@@ -72,47 +72,50 @@
+ } aifheader_t;
+
+ static int opt_verbose = 0;
++static int opt_eabi = 0;
+
+ static Elf32_External_Ehdr elf_ehdr;
+ static phdr_list_t *elf_phdrlistP;
+ static const char *elf_filename;
++static uint32_t got_addr = 0;
+
+-static const unsigned int aifcode[] = {
+- 0xE1A00000, /* NOP (BL decompress) */
+- 0xE1A00000, /* NOP (BL self-relocate) */
+- 0xEB00000C, /* BL zero-init */
+- 0xEB000000, /* BL entrypoint (*) */
+- 0xEF000011, /* SWI OS_Exit */
+- 0x00000000, /* Image R/O size (*) */
+- 0x00000000, /* Image R/W size (*) */
+- 0x00000000, /* Image debug size */
+- 0x00000000, /* Image zero-init size (*) */
+- 0x00000000, /* Image debug type */
+- 0x00000000, /* Image base (*) */
+- 0x00000000, /* Workspace size */
+- 0x00000020, /* 32-bit addressing */
+- 0x00000000, /* Data base */
+- 0x00000000, /* Reserved */
+- 0x00000000, /* Reserved */
+- 0xE1A00000, /* MOV R0, R0 */
+- 0xE04EC00F, /* SUB R12, R14, PC */
+- 0xE08FC00C, /* ADD R12, PC, R12 */
+- 0xE99C0017, /* LDMIB R12, {R0-R2, R4} */
+- 0xE24CC010, /* SUB R12, R12, #0x10 */
+- 0xE08CC000, /* ADD R12, R12, R0 */
+- 0xE08CC001, /* ADD R12, R12, R1 */
+- 0xE3A00000, /* MOV R0, #0 */
+- 0xE3A01000, /* MOV R1, #0 */
+- 0xE3A02000, /* MOV R2, #0 */
+- 0xE3A03000, /* MOV R3, #0 */
+- 0xE3540000, /* CMP R4, #0 */
++static const uint32_t aifcode[] = {
++ 0xE1A00000, /* NOP (BL decompress) */
++ 0xE1A00000, /* NOP (BL self-relocate) (*) */
++ 0xEB00000C, /* BL zero-init */
++ 0xEB000000, /* BL entrypoint (*) */
++ 0xEF000011, /* SWI OS_Exit */
++ 0x00000000, /* Image R/O size (*) */
++ 0x00000000, /* Image R/W size (*) */
++ 0x00000000, /* Image debug size */
++ 0x00000000, /* Image zero-init size (*) */
++ 0x00000000, /* Image debug type */
++ 0x00000000, /* Image base (*) */
++ 0x00000000, /* Workspace size */
++ 0x00000020, /* 32-bit addressing */
++ 0x00000000, /* Data base */
++ 0x00000000, /* Reserved */
++ 0x00000000, /* Reserved */
++ 0xE1A00000, /* MOV R0, R0 */
++ 0xE04EC00F, /* SUB R12, R14, PC */
++ 0xE08FC00C, /* ADD R12, PC, R12 */
++ 0xE99C0017, /* LDMIB R12, {R0-R2, R4} */
++ 0xE24CC010, /* SUB R12, R12, #16 */
++ 0xE08CC000, /* ADD R12, R12, R0 */
++ 0xE08CC001, /* ADD R12, R12, R1 */
++ 0xE3A00000, /* MOV R0, #0 */
++ 0xE3A01000, /* MOV R1, #0 */
++ 0xE3A02000, /* MOV R2, #0 */
++ 0xE3A03000, /* MOV R3, #0 */
++ 0xE3540000, /* CMP R4, #0 */
+ /* zeroloop: */
+- 0xD1A0F00E, /* MOVLE PC, R14 */
+- 0xE8AC000F, /* STMIA R12!, {R0-R3} */
+- 0xE2544010, /* SUBS R4, R4, #16 */
+- 0xEAFFFFFB /* B zeroloop */
++ 0xD1A0F00E, /* MOVLE PC, R14 */
++ 0xE8AC000F, /* STMIA R12!, {R0-R3} */
++ 0xE2544010, /* SUBS R4, R4, #16 */
++ 0xEAFFFFFB /* B zeroloop */
+ };
+
++
+ /* Read a little-endian 'short' value. */
+ static uint16_t
+ RdShort (const uint8_t sh[2])
+@@ -143,6 +146,7 @@
+ fprintf (stderr, "Usage: elf2aif [options] <ELF file> [<AIF file>]\n"
+ "Convert static ARM ELF binary to AIF (Acorn Image Format) binary.\n"
+ "Options:\n"
++ " -e, --eabi source binary uses EABI\n"
+ " -v, --verbose prints informational messages during processing\n"
+ " --help display this help and exit\n"
+ " --version output version information and exit\n");
+@@ -201,7 +205,8 @@
+ return EXIT_FAILURE;
+ }
+
+- if (elf_ehdr.e_ident[EI_OSABI] != ELFOSABI_ARM)
++ if ((!opt_eabi && elf_ehdr.e_ident[EI_OSABI] != ELFOSABI_ARM) ||
++ (opt_eabi && elf_ehdr.e_ident[EI_OSABI] != ELFOSABI_NONE))
+ {
+ fprintf (stderr, "ELF file '%s' is not for ARM\n", elf_filename);
+ return EXIT_FAILURE;
+@@ -344,6 +349,97 @@
+ }
+
+ static int
++e2a_readshdr (FILE * elfhandle)
++{
++ Elf32_External_Shdr shstentry;
++ uint32_t shoffset, shentrysize, shentrycount, shstrndx;
++ uint32_t shstoffset, shstsize;
++ char *shst;
++
++ if ((shoffset = RdLong (elf_ehdr.e_shoff)) == 0
++ || (shentrycount = RdShort (elf_ehdr.e_shnum)) == 0)
++ {
++ fprintf (stderr, "ELF file '%s' does not have section headers\n",
++ elf_filename);
++ return EXIT_FAILURE;
++ }
++
++ if ((shentrysize = RdShort (elf_ehdr.e_shentsize)) < sizeof (Elf32_External_Shdr))
++ {
++ fprintf (stderr, "Size section header entry is too small\n");
++ return EXIT_FAILURE;
++ }
++
++ if ((shstrndx = RdShort (elf_ehdr.e_shstrndx)) >= shentrycount) {
++ fprintf (stderr, "String table index out of bounds\n");
++ return EXIT_FAILURE;
++ }
++
++ if (fseek (elfhandle, shoffset + (shstrndx * shentrysize), SEEK_SET) != 0
++ || fread (&shstentry, sizeof (Elf32_External_Shdr), 1, elfhandle) != 1)
++ {
++ fprintf (stderr, "Failed to read section header string table header\n");
++ return EXIT_FAILURE;
++ }
++
++ if ((shstoffset = RdLong (shstentry.sh_offset)) == 0)
++ {
++ fprintf (stderr, "Section header string table data missing\n");
++ return EXIT_FAILURE;
++ }
++
++ if ((shstsize = RdLong (shstentry.sh_size)) == 0)
++ {
++ fprintf (stderr, "Invalid section header string table size\n");
++ return EXIT_FAILURE;
++ }
++
++ if ((shst = malloc (shstsize)) == NULL)
++ {
++ fprintf (stderr, "Out of memory\n");
++ return EXIT_FAILURE;
++ }
++
++ if (fseek (elfhandle, shstoffset, SEEK_SET) != 0
++ || fread (shst, 1, shstsize, elfhandle) != shstsize)
++ {
++ fprintf (stderr, "Failed to read section header string table\n");
++ return EXIT_FAILURE;
++ }
++
++ while (shentrycount)
++ {
++ Elf32_External_Shdr shentry;
++ uint32_t shnameoff;
++
++ if (fseek (elfhandle, shoffset, SEEK_SET) != 0
++ || fread (&shentry, sizeof (Elf32_External_Shdr), 1, elfhandle) != 1)
++ {
++ fprintf (stderr, "Failed to read section header entry\n");
++ return EXIT_FAILURE;
++ }
++
++ if ((shnameoff = RdLong (shentry.sh_name)) >= shstsize)
++ {
++ fprintf (stderr, "Section name out of bounds\n");
++ return EXIT_FAILURE;
++ }
++
++ if (strcmp ((shst + shnameoff), ".got") == 0)
++ {
++ got_addr = RdLong (shentry.sh_addr);
++ }
++
++ shoffset += shentrysize;
++ --shentrycount;
++ }
++
++ free (shst);
++
++ return EXIT_SUCCESS;
++}
++
++static int
+ e2a_copy (FILE * elfhandle, FILE * aifhandle)
+ {
+ const phdr_list_t *phdrP;
+@@ -488,21 +584,156 @@
+ }
+
+ memcpy (&aifhdr, aifcode, sizeof (aifcode));
+- WrLong (aifhdr.entrypoint,
+- RdLong (aifhdr.entrypoint) +
+- ((exec_addr - load_addr -
+- (offsetof (aifheader_t, entrypoint) + 8)) >> 2));
++ if (opt_eabi)
++ {
++ /* BL to relocation code */
++ WrLong (aifhdr.selfreloc,
++ /* Default is a NOP, so reading it is useless */
++ 0xEB000000 +
++ ((aifend - (offsetof (aifheader_t, selfreloc) + 8)) >> 2));
++
++ /* BL to EABI startcode */
++ WrLong (aifhdr.entrypoint,
++ RdLong (aifhdr.entrypoint) +
++ ((sizeof(aifcode) - (offsetof (aifheader_t, entrypoint) + 8)) >> 2));
++ }
++ else
++ {
++ /* BL to program entrypoint */
++ WrLong (aifhdr.entrypoint,
++ RdLong (aifhdr.entrypoint) +
++ ((exec_addr - load_addr -
++ (offsetof (aifheader_t, entrypoint) + 8)) >> 2));
++ }
+ WrLong (aifhdr.rosize, rosize);
+ WrLong (aifhdr.rwsize, rwsize);
+ WrLong (aifhdr.zisize, zisize);
+ WrLong (aifhdr.imagebase, load_addr);
+- if (fwrite (&aifhdr, sizeof (aifhdr), 1, aifhandle) != 1
+- || fseek (aifhandle, aifend, SEEK_SET) != 0)
++ if (fwrite (&aifhdr, sizeof (aifhdr), 1, aifhandle) != 1)
+ {
+ fprintf (stderr, "Failed to write aif header\n");
+ return EXIT_FAILURE;
+ }
+
++ /* In the EABI case we need to inject the code to install
++ * the ARMEABISupport abort handler */
++ if (opt_eabi)
++ {
++ assert (128 == sizeof (aifcode));
++ uint32_t entrycode[] = {
++ /* Space for GOTT_BASE injection (see below) */
++ 0xE1A00000, /* MOV R0, R0 */
++ 0xE1A00000, /* MOV R0, R0 */
++ /* Install the abort handler */
++ 0xE3A00002, /* MOV R0, #2 */
++ 0xEF059D01, /* SWI ARMEABISupport_AbortOp */
++ /* Proceed to the real program start */
++ 0xEA000000, /* B <program_start> (*) */
++ /* Offset of the GOT relative to the load address (or 0 if none) */
++ 0x00000000, /* DCD <got_offset> (*) */
++ };
++
++ const uint32_t reloccode[] = {
++ /* RelocCode: */
++ 0xE1A00000, /* MOV R0, R0 */
++ /* Dynamically compute the program load address */
++ 0xE04EC00F, /* SUB R12, LR, PC */
++ 0xE08FC00C, /* ADD R12, PC, R12 */
++ 0xE24CC00C, /* SUB R12, R12, #12 */
++ /* Prevent reentry by replacing the branch to the relocation code. */
++ 0xE51F0018, /* LDR R0, =RelocCode */
++ 0xE58C0004, /* STR R0, [R12, #4] */
++ /* Relocate the GOT offset (above) to its absolute address */
++ 0xE59C0094, /* LDR R0, [R12, #&94] */
++ 0xE3300000, /* TEQ R0, #0 */
++ 0x1080000C, /* ADDNE R0, R0, R12 */
++ 0x158C0094, /* STRNE R0, [R12, #&94] */
++ /* Fill in GOTT_BASE at load + 0x38, unless running under DDT */
++ 0xE59C0038, /* LDR R0, [R12, #&38] */
++ 0xE3300000, /* TEQ R0, #0 */
++ 0x1A000002, /* BNE ddt_hack */
++ 0xE28C0094, /* ADD R0, R12, #&94 */
++ 0xE58C0038, /* STR R0, [R12, #&38] */
++ 0xE1A0F00E, /* MOV PC, LR */
++ /* Hack for DDT (which uses the reserved field at &8038 to
++ * temporarily store the address of the zero-initialisation code
++ * during program start, which is reinstated after DDT's
++ * replacement is called). In this case, modify the entrycode
++ * (above) to inject it for us.
++ *
++ * This does prevent the RO area being marked non-writeable if
++ * the modified entrycode gets executed, however (in the non-DDT
++ * case, the entrycode does not write to the AIF header, so
++ * there is no reason the RO area can't be non-writeable then).
++ * By definition the RO area must be writeable for relocations to
++ * work, so it is perfectly safe to assume that it is when this
++ * code runs.
++ */
++ /* ddt_hack: */
++ 0xE59F001C, /* LDR R0, =ddt_hack_data */
++ 0xE59F101C, /* LDR R1, =ddt_hack_data+4 */
++ 0xE58C0080, /* STR R0, [R12, #&80] */
++ 0xE58C1084, /* STR R1, [R12, #&84] */
++ /* Invalidate instruction cache */
++ 0xE3A00001, /* MOV R0, #1 */
++ 0xE28C1080, /* ADD R1, R12, #&80 */
++ 0xE28C2088, /* ADD R2, R12, #&88 */
++ 0xEF02006E, /* SWI XOSSynchroniseCodeAreas */
++ 0xE1A0F00E, /* MOV PC, LR */
++ /* Instructions to inject into entrycode. Uses PC-relative
++ * addressing, so must be kept in sync with changes to entrycode
++ * or the location of entrycode within memory. */
++ /* ddt_hack_data: */
++ /* Compute address of GOT field after entrycode */
++ 0xE28F000C, /* ADR R0, got_address */
++ /* Store computed address in GOTT_BASE (load + 0x38) */
++ 0xE50F0054, /* STR R0, [pc, #-&54] */
++ /* Relocation sentinel: just in case anything expects one */
++ 0xFFFFFFFF, /* DCD -1 */
++ };
++
++ /* Ensure there is sufficient space for the EABI entry code */
++ if (opt_eabi && exec_addr - load_addr < sizeof (aifcode) + sizeof (entrycode))
++ {
++ fprintf (stderr, "First program segment is not what we hoped to be "
++ "(not enough place before _start symbol for EABI entrycode)\n");
++ return EXIT_FAILURE;
++ }
++
++ if (opt_verbose)
++ printf ("Writing EABI entry code at offset 0x%x\n", sizeof (aifcode));
++
++ entrycode[4] |= (exec_addr - load_addr - (sizeof (aifcode) + 4*4 + 8)) >> 2;
++ if (got_addr)
++ {
++ if (opt_verbose)
++ printf ("Found GOT at 0x%x\n", got_addr);
++ entrycode[5] = (got_addr - load_addr);
++ }
++ if (fseek (aifhandle, sizeof (aifcode), SEEK_SET) != 0
++ || fwrite (&entrycode, sizeof (entrycode), 1, aifhandle) != 1)
++ {
++ fprintf (stderr, "Failed to write EABI entrycode\n");
++ return EXIT_FAILURE;
++ }
++
++ if (opt_verbose)
++ printf ("Writing relocation code at offset 0x%x\n", aifend);
++
++ if (fseek (aifhandle, aifend, SEEK_SET) != 0
++ || fwrite (&reloccode, sizeof (reloccode), 1, aifhandle) != 1)
++ {
++ fprintf (stderr, "Failed to write relocation code\n");
++ return EXIT_FAILURE;
++ }
++ }
++
++ if (fseek (aifhandle, aifend, SEEK_SET) != 0)
++ {
++ fprintf (stderr, "Failed to seek to end of file\n");
++ return EXIT_FAILURE;
++ }
++
+ return EXIT_SUCCESS;
+ }
+
+@@ -557,6 +788,7 @@
+ elf_filename = elffilename;
+
+ if (e2a_readehdr (elfhandle) == EXIT_SUCCESS
++ && e2a_readshdr (elfhandle) == EXIT_SUCCESS
+ && e2a_readphdr (elfhandle) == EXIT_SUCCESS
+ && e2a_copy (elfhandle, aifhandle) == EXIT_SUCCESS)
+ status = EXIT_SUCCESS;
+@@ -683,6 +915,9 @@
+ fprintf (stderr, "Warning: extra options/arguments ignored\n");
+ return EXIT_SUCCESS;
+ }
++ else if (!strcmp (&argv[i][1], "-eabi")
++ || !strcmp (&argv[i][1], "e"))
++ opt_eabi = 1;
+ else if (!strcmp (&argv[i][1], "-verbose")
+ || !strcmp (&argv[i][1], "v"))
+ ++opt_verbose;
diff --git a/arm-riscos-gnueabi/recipes/patches/gccsdk/gcc-add-mhalfword-access.p b/arm-riscos-gnueabi/recipes/patches/gccsdk/gcc-add-mhalfword-access.p
new file mode 100644
index 0000000..43061b9
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/gccsdk/gcc-add-mhalfword-access.p
@@ -0,0 +1,153 @@
+Index: gcc/gcc.config.arm.arm.h.p
+===================================================================
+--- gcc/gcc.config.arm.arm.h.p (nonexistent)
++++ gcc/gcc.config.arm.arm.h.p (working copy)
+@@ -0,0 +1,33 @@
++--- gcc/config/arm/arm.h.orig 2020-07-23 07:35:17.344384552 +0100
+++++ gcc/config/arm/arm.h 2022-05-28 22:48:25.064918314 +0100
++@@ -1338,7 +1338,9 @@
++ : (TARGET_IWMMXT && (CLASS) == IWMMXT_REGS) \
++ ? coproc_secondary_reload_class (MODE, X, TRUE) \
++ : TARGET_32BIT \
++- ? (((MODE) == HImode && ! arm_arch4 && true_regnum (X) == -1) \
+++ ? (((MODE) == HImode && \
+++ (!arm_arch4 || !halfword_access) && \
+++ true_regnum (X) == -1) \
++ ? GENERAL_REGS : NO_REGS) \
++ : THUMB_SECONDARY_OUTPUT_RELOAD_CLASS (CLASS, MODE, X))
++
++@@ -1353,7 +1355,7 @@
++ (((CLASS) == IWMMXT_REGS || (CLASS) == IWMMXT_GR_REGS) \
++ && CONSTANT_P (X)) \
++ ? GENERAL_REGS : \
++- (((MODE) == HImode && ! arm_arch4 \
+++ (((MODE) == HImode && (!arm_arch4 || !halfword_access) \
++ && (MEM_P (X) \
++ || ((REG_P (X) || GET_CODE (X) == SUBREG) \
++ && true_regnum (X) == -1))) \
++@@ -2016,7 +2018,9 @@
++ done, UNKNOWN if none. */
++ #define LOAD_EXTEND_OP(MODE) \
++ (TARGET_THUMB ? ZERO_EXTEND : \
++- ((arm_arch4 || (MODE) == QImode) ? ZERO_EXTEND \
+++ (((arm_arch4 && (halfword_access || (MODE) != HImode)) || \
+++ (MODE) == QImode) \
+++ ? ZERO_EXTEND \
++ : ((BYTES_BIG_ENDIAN && (MODE) == HImode) ? SIGN_EXTEND : UNKNOWN)))
++
++ /* Nonzero if access to memory by bytes is slow and undesirable. */
+Index: gcc/gcc.config.arm.arm.md.p
+===================================================================
+--- gcc/gcc.config.arm.arm.md.p (revision 7698)
++++ gcc/gcc.config.arm.arm.md.p (working copy)
+@@ -8,6 +8,42 @@
+ (IP_REGNUM 12) ; Scratch register
+ (SP_REGNUM 13) ; Stack pointer
+ (LR_REGNUM 14) ; Return address register
++@@ -5546,7 +5547,7 @@
++ (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand")))]
++ "TARGET_EITHER"
++ {
++- if (TARGET_ARM && !arm_arch4 && MEM_P (operands[1]))
+++ if (TARGET_ARM && (!arm_arch4 || !halfword_access) && MEM_P (operands[1]))
++ {
++ emit_insn (gen_movhi_bytes (operands[0], operands[1]));
++ DONE;
++@@ -5574,7 +5575,7 @@
++ (define_insn "*arm_zero_extendhisi2"
++ [(set (match_operand:SI 0 "s_register_operand" "=r,r")
++ (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,m")))]
++- "TARGET_ARM && arm_arch4 && !arm_arch6"
+++ "TARGET_ARM && arm_arch4 && halfword_access && !arm_arch6"
++ "@
++ #
++ ldrh%?\\t%0, %1"
++@@ -5735,7 +5736,7 @@
++ emit_insn (gen_thumb1_extendhisi2 (operands[0], operands[1]));
++ DONE;
++ }
++- if (MEM_P (operands[1]) && TARGET_ARM && !arm_arch4)
+++ if (MEM_P (operands[1]) && TARGET_ARM && (!arm_arch4 || !halfword_access))
++ {
++ emit_insn (gen_extendhisi2_mem (operands[0], operands[1]));
++ DONE;
++@@ -5813,7 +5814,7 @@
++ (define_insn "*arm_extendhisi2"
++ [(set (match_operand:SI 0 "s_register_operand" "=r,r")
++ (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,Uh")))]
++- "TARGET_ARM && arm_arch4 && !arm_arch6"
+++ "TARGET_ARM && arm_arch4 && halfword_access && !arm_arch6"
++ "@
++ #
++ ldrsh%?\\t%0, %1"
+ @@ -6693,7 +6694,7 @@
+ (mem:SI (plus:SI (match_operand:SI 1 "register_operand" "r")
+ (unspec:SI [(match_operand:SI 2 "" "X")]
+@@ -17,3 +53,49 @@
+ "ldr%?\\t%0, [%1,%2]"
+ [(set_attr "type" "load_4")]
+ )
++@@ -6845,7 +6846,7 @@
++ (define_expand "storehi_single_op"
++ [(set (match_operand:HI 0 "memory_operand")
++ (match_operand:HI 1 "general_operand"))]
++- "TARGET_32BIT && arm_arch4"
+++ "TARGET_32BIT && arm_arch4 && halfword_access"
++ "
++ if (!s_register_operand (operands[1], HImode))
++ operands[1] = copy_to_mode_reg (HImode, operands[1]);
++@@ -6865,7 +6865,7 @@
++ {
++ if (MEM_P (operands[0]))
++ {
++- if (arm_arch4)
+++ if (arm_arch4 && halfword_access)
++ {
++ emit_insn (gen_storehi_single_op (operands[0], operands[1]));
++ DONE;
++@@ -6905,15 +6905,15 @@
++ emit_insn (gen_movsi (reg, GEN_INT (val)));
++ operands[1] = gen_lowpart (HImode, reg);
++ }
++- else if (arm_arch4 && optimize && can_create_pseudo_p ()
++- && MEM_P (operands[1]))
+++ else if (arm_arch4 && halfword_access && optimize
+++ && can_create_pseudo_p () && MEM_P (operands[1]))
++ {
++ rtx reg = gen_reg_rtx (SImode);
++
++ emit_insn (gen_zero_extendhisi2 (reg, operands[1]));
++ operands[1] = gen_lowpart (HImode, reg);
++ }
++- else if (!arm_arch4)
+++ else if (!arm_arch4 || !halfword_access)
++ {
++ if (MEM_P (operands[1]))
++ {
++@@ -7099,7 +7100,7 @@
++ [(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,r,m,r")
++ (match_operand:HI 1 "general_operand" "rIk,K,n,r,mi"))]
++ "TARGET_ARM
++- && arm_arch4 && !TARGET_HARD_FLOAT
+++ && arm_arch4 && halfword_access && !TARGET_HARD_FLOAT
++ && (register_operand (operands[0], HImode)
++ || register_operand (operands[1], HImode))"
++ "@
+Index: gcc/gcc.config.arm.arm.opt.p
+===================================================================
+--- gcc/gcc.config.arm.arm.opt.p (nonexistent)
++++ gcc/gcc.config.arm.arm.opt.p (working copy)
+@@ -0,0 +1,13 @@
++--- gcc/config/arm/arm.opt.orig 2020-07-23 07:35:17.344384552 +0100
+++++ gcc/config/arm/arm.opt 2022-05-28 22:39:28.543576700 +0100
++@@ -271,6 +271,10 @@
++ Avoid overlapping destination and address registers on LDRD instructions
++ that may trigger Cortex-M3 errata.
++
+++mhalfword-access
+++Target Report Var(halfword_access) Init(1)
+++Enable halfword memory accesses.
+++
++ munaligned-access
++ Target Report Var(unaligned_access) Init(2) Save
++ Enable unaligned word and halfword accesses to packed data.
diff --git a/arm-riscos-gnueabi/recipes/patches/gccsdk/gcc-default-no-halfword-access.p b/arm-riscos-gnueabi/recipes/patches/gccsdk/gcc-default-no-halfword-access.p
new file mode 100644
index 0000000..400341f
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/gccsdk/gcc-default-no-halfword-access.p
@@ -0,0 +1,13 @@
+Index: gcc/gcc.config.arm.arm.opt.p
+===================================================================
+--- gcc/gcc.config.arm.arm.opt.p (nonexistent)
++++ gcc/gcc.config.arm.arm.opt.p (working copy)
+@@ -5,7 +5,7 @@
+ that may trigger Cortex-M3 errata.
+
+ +mhalfword-access
+-+Target Report Var(halfword_access) Init(1)
+++Target Report Var(halfword_access) Init(0)
+ +Enable halfword memory accesses.
+ +
+ munaligned-access
diff --git a/arm-riscos-gnueabi/recipes/patches/gccsdk/gcc-libgcc-no-linux-atomics.p b/arm-riscos-gnueabi/recipes/patches/gccsdk/gcc-libgcc-no-linux-atomics.p
new file mode 100644
index 0000000..5f93dbe
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/gccsdk/gcc-libgcc-no-linux-atomics.p
@@ -0,0 +1,56 @@
+Index: gcc/libgcc.config.arm.t-riscos-gnueabihf
+===================================================================
+--- gcc/libgcc.config.arm.t-riscos-gnueabihf (revision 7698)
++++ gcc/libgcc.config.arm.t-riscos-gnueabihf (working copy)
+@@ -1,36 +1,2 @@
+-# Copyright (C) 2011-2012 Free Software Foundation, Inc.
+-# Contributed by John Tytgat (John.Tytgat@aaug.net).
+-#
+-# This file is part of GCC.
+-#
+-# GCC is free software; you can redistribute it and/or modify
+-# it under the terms of the GNU General Public License as published by
+-# the Free Software Foundation; either version 3, or (at your option)
+-# any later version.
+-#
+-# GCC is distributed in the hope that it will be useful,
+-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-# GNU General Public License for more details.
+-#
+-# You should have received a copy of the GNU General Public License
+-# along with GCC; see the file COPYING3. If not see
+-# <http://www.gnu.org/licenses/>.
+-
+-# vvv Part of config/arm/t-bpabi
+-LIB2ADD_ST += $(srcdir)/config/arm/fp16.c
+-
+-LIB2ADDEH = $(srcdir)/config/arm/unwind-arm.c \
+- $(srcdir)/config/arm/libunwind.S \
+- $(srcdir)/config/arm/pr-support.c $(srcdir)/unwind-c.c
+-# ^^^
+-
+-ifeq (,$(findstring mlibscl,$(CFLAGS))$(findstring mmodule,$(CFLAGS)))
+-# For shared libgcc building:
+-EXTRA_PARTS += crtbeginS.o crtendS.o
+-gcc_s_compile += -fPIC
+-SHLIB_LDFLAGS=-fPIC
+-include $(srcdir)/config/t-slibgcc
+-include $(srcdir)/config/t-slibgcc-nolc-override
+-endif
+-
++# Use a version of div0 which raises SIGFPE, and a special __clear_cache.
++LIB1ASMFUNCS := $(filter-out _dvmd_tls,$(LIB1ASMFUNCS)) _dvmd_lnx _clear_cache
+Index: gcc/libgcc.config.host.p
+===================================================================
+--- gcc/libgcc.config.host.p (revision 7698)
++++ gcc/libgcc.config.host.p (working copy)
+@@ -20,7 +20,7 @@
+ ;;
+ +arm*-riscos-gnueabi*)
+ + tmake_file="${tmake_file} arm/t-arm t-fixedpoint-gnu-prefix t-crtfm"
+-+ tmake_file="${tmake_file} arm/t-elf arm/t-bpabi arm/t-linux-eabi t-slibgcc-libgcc t-slibgcc-nolc-override"
+++ tmake_file="${tmake_file} arm/t-elf arm/t-bpabi arm/t-riscos-gnueabihf t-slibgcc-libgcc t-slibgcc-nolc-override"
+ + tm_file="$tm_file arm/bpabi-lib.h"
+ + unwind_header=config/arm/unwind-arm.h
+ + tmake_file="$tmake_file t-softfp-sfdf t-softfp-excl arm/t-softfp t-softfp"
diff --git a/arm-riscos-gnueabi/recipes/patches/gccsdk/ld-armv4.p b/arm-riscos-gnueabi/recipes/patches/gccsdk/ld-armv4.p
new file mode 100644
index 0000000..ae85eb0
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/gccsdk/ld-armv4.p
@@ -0,0 +1,13 @@
+Index: ld/d-link/Makefile.am
+===================================================================
+--- ld/d-link/Makefile.am (revision 7698)
++++ ld/d-link/Makefile.am (working copy)
+@@ -68,7 +68,7 @@
+
+ ld_riscos_eabihf_so_CPPFLAGS = -I$(top_srcdir)/d-link -I$(top_srcdir)/d-link/riscos \
+ -DNO_UNDERSCORE -DVERBOSE_DLINKER -D__TARGET_SOLOADER__
+-ld_riscos_eabihf_so_CFLAGS = -fPIC -O4 -Wall -std=gnu99 -march=armv7-a+fp+neon
++ld_riscos_eabihf_so_CFLAGS = -fPIC -O4 -Wall -std=gnu99 -march=armv4
+ ld_riscos_eabihf_so_LDFLAGS = --shared -Wl,--no-undefined -nostdlib -nostartfiles -Wl,-e -Wl,_dl_start \
+ -Wl,-soname -Wl,ld-riscos/so/2
+
diff --git a/arm-riscos-gnueabi/recipes/patches/gccsdk/libtool.m4.p.p b/arm-riscos-gnueabi/recipes/patches/gccsdk/libtool.m4.p.p
new file mode 100644
index 0000000..8061b92
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/gccsdk/libtool.m4.p.p
@@ -0,0 +1,119 @@
+Index: gcc/libtool.m4.p
+===================================================================
+--- gcc/libtool.m4.p (revision 7698)
++++ gcc/libtool.m4.p (working copy)
+@@ -5,7 +5,7 @@
+ ])
+ ;;
+ +
+-+ *riscos | *linux-gnueabihf)
+++ *riscos*)
+ + lt_cv_dlopen="dlopen"
+ + lt_cv_dlopen_libs="-ldl"
+ + lt_cv_dlopen_self=yes
+@@ -17,7 +17,7 @@
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+-+*riscos | linux-gnueabihf)
+++*riscos*)
+ + version_type=linux
+ + library_names_spec='${libname}$versuffix.so ${libname}.so$major $libname.so'
+ + soname_spec='${libname}.so$major'
+@@ -32,7 +32,7 @@
+ # it will coredump.
+ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+ ;;
+-+ *linux-gnueabihf)
+++ riscos-gnu*)
+ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+@@ -48,7 +48,7 @@
+ esac
+ else
+ case $host_os in
+-+ linux-gnueabihf)
+++ riscos-gnu*)
+ + # RISC OS
+ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+@@ -61,7 +61,7 @@
+ ;;
+ vxworks*)
+ ;;
+-+ *linux-gnueabihf)
+++ riscos-gnu*)
+ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+@@ -78,13 +78,13 @@
+ fi
+ ;;
+
+-+ *linux-gnueabihf)
+++ riscos-gnu*)
+ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ + ;;
+ +
+-+ *riscos | linux-gnueabihf)
+++ *riscos*)
+ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+@@ -97,7 +97,7 @@
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+-+ linux-gnueabihf)
+++ riscos-gnu*)
+ + # RISC OS
+ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+@@ -110,7 +110,7 @@
+ _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+-+ *linux-gnueabihf)
+++ riscos-gnu*)
+ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+@@ -129,7 +129,7 @@
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+-+ linux-gnueabihf)
+++ riscos-gnu*)
+ + # RISC OS
+ + _LT_TAGVAR(ld_shlibs, $1)=yes
+ + ;;
+@@ -140,7 +140,7 @@
+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+-+ *riscos | *linux-gnueabihf)
+++ *riscos*)
+ + _LT_TAGVAR(ld_shlibs, $1)=yes
+ + ;;
+ +
+@@ -151,7 +151,7 @@
+ AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+ _LT_TAGVAR(ld_shlibs, $1)=yes
+ case $host_os in
+-+ linux-gnueabihf)
+++ riscos-gnu*)
+ + # RISC OS
+ + _LT_TAGVAR(ld_shlibs, $1)=yes
+ + ;;
+@@ -162,7 +162,7 @@
+ _LT_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+-+ *riscos | *linux-gnueabihf)
+++ *riscos*)
+ + _LT_TAGVAR(ld_shlibs, $1)=yes
+ + ;;
+ +
diff --git a/arm-riscos-gnueabi/recipes/patches/gccsdk/posix-extended-locale.p b/arm-riscos-gnueabi/recipes/patches/gccsdk/posix-extended-locale.p
new file mode 100644
index 0000000..e422786
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/gccsdk/posix-extended-locale.p
@@ -0,0 +1,1920 @@
+Index: libunixlib/Makefile.am
+===================================================================
+--- libunixlib/Makefile.am (revision 7698)
++++ libunixlib/Makefile.am (working copy)
+@@ -583,11 +583,11 @@
+ else
+ locale_src = \
+ locale/localeconv.c \
++ locale/newlocale.c \
+ locale/nl_langinfo.c \
+ locale/setlocale.c \
+ locale/strcoll.c \
+- locale/strxfrm.c \
+- locale/territory.c
++ locale/strxfrm.c
+ endif
+ locale_src += \
+ locale/iconv.c
+@@ -1312,6 +1312,7 @@
+ bits/in.h \
+ bits/libc-lock.h \
+ bits/locale.h \
++ bits/locale_t.h \
+ bits/mathcalls.h \
+ bits/mathdef.h \
+ bits/mathinline.h \
+Index: libunixlib/ctype/ctypetable.c
+===================================================================
+--- libunixlib/ctype/ctypetable.c (revision 7698)
++++ libunixlib/ctype/ctypetable.c (working copy)
+@@ -10,36 +10,35 @@
+ #include <internal/os.h>
+ #include <internal/unix.h>
+
+-/* Note the offset 1 and depth 257 instead of 0 and 256: ISO C says we must
+- support EOF. */
+-static unsigned char ctype[257];
+-const unsigned char * const __ctype = &ctype[1];
++/* Global containing current locale settings. */
++struct _locale __locale_global;
++/* Offset 1 as the first entry is reserved for EOF. */
++const unsigned char * const __ctype = &__locale_global.ctype[1];
++const short * const __ctype_upper = &__locale_global.ctype_upper[1];
++const short * const __ctype_lower = &__locale_global.ctype_lower[1];
+
+-static short ctype_upper[257];
+-const short * const __ctype_upper = &ctype_upper[1];
+-
+-static short ctype_lower[257];
+-const short * const __ctype_lower = &ctype_lower[1];
+-
+ void
+-__build_ctype_tables (int territory)
++__build_ctype_tables (locale_t locobj, int territory)
+ {
+ PTHREAD_UNSAFE
+
+ if (territory == -2)
+ {
+- /* Initialise the array. This is only done by __unixinit(). */
++ /* Initialise the array. This is only done by __unixinit()/newlocale(). */
+ territory = -1;
+- for (int x = 0; x <= LC_ALL; x++)
+- __locale_territory[x] = -1;
++ for (int x = 0; x < LC_ALL; x++)
++ locobj->locale_territory[x] = -1;
++ __localeconv_lconv_init(&locobj->lc);
++ locobj->lc_needs_refresh = 1;
+ }
+
+ /* Initialise ctype_upper/ctype_lower tables. */
+ for (int x = 0; x < 257; x++)
+ {
+- /* In the C/POSIX locate, tolower(top bit set char)
++ /* In the C/POSIX locale, tolower(top bit set char)
+ should return the character unchanged. */
+- ctype_lower[x] = ctype_upper[x] = x - 1;
++ locobj->ctype_lower[x] = locobj->ctype_upper[x] = x - 1;
++ locobj->ctype[x] = 0;
+ }
+
+ int regs[10];
+@@ -61,7 +60,7 @@
+ for (int offset = 1; bits; bits = bits >> 1, offset += 1)
+ {
+ if (bits & 1)
+- ctype[pos + offset] |= 1 << code;
++ locobj->ctype[pos + offset] |= 1 << code;
+ }
+ pos += 32;
+ }
+@@ -80,7 +79,7 @@
+ int y = (territory == -1) ? 128 : 256;
+ for (int x = 1; x <= y; x++)
+ {
+- ctype_lower[x] = (short)*p++;
+- ctype_upper[x] = (short)*q++;
++ locobj->ctype_lower[x] = (short)*p++;
++ locobj->ctype_upper[x] = (short)*q++;
+ }
+ }
+Index: libunixlib/ctype/isalnum.c
+===================================================================
+--- libunixlib/ctype/isalnum.c (revision 7698)
++++ libunixlib/ctype/isalnum.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (isalnum) (int c)
+@@ -10,3 +11,8 @@
+ return isalnum (c);
+ }
+
++int
++isalnum_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & (___ctype_alpha | ___ctype_digit));
++}
+Index: libunixlib/ctype/isalpha.c
+===================================================================
+--- libunixlib/ctype/isalpha.c (revision 7698)
++++ libunixlib/ctype/isalpha.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (isalpha) (int c)
+@@ -10,3 +11,8 @@
+ return isalpha (c);
+ }
+
++int
++isalpha_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & ___ctype_alpha);
++}
+Index: libunixlib/ctype/isascii.c
+===================================================================
+--- libunixlib/ctype/isascii.c (revision 7698)
++++ libunixlib/ctype/isascii.c (working copy)
+@@ -10,3 +10,9 @@
+ return isascii (c);
+ }
+
++int
++isascii_l (int c, locale_t locobj)
++{
++ (void) locobj;
++ return isascii (c);
++}
+Index: libunixlib/ctype/isblank.c
+===================================================================
+--- libunixlib/ctype/isblank.c (revision 7698)
++++ libunixlib/ctype/isblank.c (working copy)
+@@ -9,3 +9,10 @@
+ {
+ return isblank (c);
+ }
++
++int
++isblank_l (int c, locale_t locobj)
++{
++ (void) locobj;
++ return isblank (c);
++}
+Index: libunixlib/ctype/iscntrl.c
+===================================================================
+--- libunixlib/ctype/iscntrl.c (revision 7698)
++++ libunixlib/ctype/iscntrl.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (iscntrl) (int c)
+@@ -10,3 +11,8 @@
+ return iscntrl (c);
+ }
+
++int
++iscntrl_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & ___ctype_ctrl);
++}
+Index: libunixlib/ctype/isdigit.c
+===================================================================
+--- libunixlib/ctype/isdigit.c (revision 7698)
++++ libunixlib/ctype/isdigit.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (isdigit) (int c)
+@@ -10,3 +11,8 @@
+ return isdigit (c);
+ }
+
++int
++isdigit_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & ___ctype_digit);
++}
+Index: libunixlib/ctype/isgraph.c
+===================================================================
+--- libunixlib/ctype/isgraph.c (revision 7698)
++++ libunixlib/ctype/isgraph.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (isgraph) (int c)
+@@ -10,3 +11,8 @@
+ return isgraph (c);
+ }
+
++int
++isgraph_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & ~(___ctype_white | ___ctype_ctrl));
++}
+Index: libunixlib/ctype/islower.c
+===================================================================
+--- libunixlib/ctype/islower.c (revision 7698)
++++ libunixlib/ctype/islower.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (islower) (int c)
+@@ -10,3 +11,8 @@
+ return islower (c);
+ }
+
++int
++islower_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & ___ctype_lower);
++}
+Index: libunixlib/ctype/isprint.c
+===================================================================
+--- libunixlib/ctype/isprint.c (revision 7698)
++++ libunixlib/ctype/isprint.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (isprint) (int c)
+@@ -10,3 +11,10 @@
+ return isprint (c);
+ }
+
++int
++isprint_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] &
++ (___ctype_upper | ___ctype_lower | ___ctype_digit | ___ctype_punc |
++ ___ctype_white)) && !((&locobj->ctype[1])[c] & ___ctype_ctrl);
++}
+Index: libunixlib/ctype/ispunct.c
+===================================================================
+--- libunixlib/ctype/ispunct.c (revision 7698)
++++ libunixlib/ctype/ispunct.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (ispunct) (int c)
+@@ -10,3 +11,8 @@
+ return ispunct (c);
+ }
+
++int
++ispunct_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & ___ctype_punc);
++}
+Index: libunixlib/ctype/isspace.c
+===================================================================
+--- libunixlib/ctype/isspace.c (revision 7698)
++++ libunixlib/ctype/isspace.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (isspace) (int c)
+@@ -10,3 +11,8 @@
+ return isspace (c);
+ }
+
++int
++isspace_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & ___ctype_white);
++}
+Index: libunixlib/ctype/isupper.c
+===================================================================
+--- libunixlib/ctype/isupper.c (revision 7698)
++++ libunixlib/ctype/isupper.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (isupper) (int c)
+@@ -10,3 +11,8 @@
+ return isupper (c);
+ }
+
++int
++isupper_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & ___ctype_upper);
++}
+Index: libunixlib/ctype/isxdigit.c
+===================================================================
+--- libunixlib/ctype/isxdigit.c (revision 7698)
++++ libunixlib/ctype/isxdigit.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (isxdigit) (int c)
+@@ -10,3 +11,8 @@
+ return isxdigit (c);
+ }
+
++int
++isxdigit_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & ___ctype_xdigit);
++}
+Index: libunixlib/ctype/toascii.c
+===================================================================
+--- libunixlib/ctype/toascii.c (revision 7698)
++++ libunixlib/ctype/toascii.c (working copy)
+@@ -10,3 +10,9 @@
+ return toascii (c);
+ }
+
++int
++toascii_l (int c, locale_t locobj)
++{
++ (void) locobj;
++ return toascii (c);
++}
+Index: libunixlib/ctype/tolower.c
+===================================================================
+--- libunixlib/ctype/tolower.c (revision 7698)
++++ libunixlib/ctype/tolower.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (tolower) (int c)
+@@ -10,3 +11,8 @@
+ return tolower (c);
+ }
+
++int
++tolower_l (int c, locale_t locobj)
++{
++ return (&locobj->ctype_lower[1])[c];
++}
+Index: libunixlib/ctype/toupper.c
+===================================================================
+--- libunixlib/ctype/toupper.c (revision 7698)
++++ libunixlib/ctype/toupper.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (toupper) (int c)
+@@ -10,3 +11,8 @@
+ return toupper (c);
+ }
+
++int
++toupper_l (int c, locale_t locobj)
++{
++ return (&locobj->ctype_upper[1])[c];
++}
+Index: libunixlib/incl-local/locale.h
+===================================================================
+--- libunixlib/incl-local/locale.h (revision 7698)
++++ libunixlib/incl-local/locale.h (working copy)
+@@ -13,15 +13,36 @@
+
+ #ifndef __TARGET_SCL__
+
+-/* Territory number for each locale. C locale is -1. */
+-extern int __locale_territory[LC_ALL + 1];
++struct _locale {
++ /* Map from locale category to territory number. C locale is -1. */
++ int locale_territory[LC_ALL];
+
+-/* Set to 1 is setlocale has been called since the last call to
+- localeconv. localeconv uses this flag to cache the lconv structure. */
+-extern int __setlocale_called;
++ /* Character type LUTs: EOF + one entry per character
++ *
++ * EOF is defined as -1, so character entries start at offset 1.
++ */
++ short ctype_upper[257];
++ short ctype_lower[257];
++ unsigned char ctype[257];
+
+-extern void __build_ctype_tables (int __territory) __THROW;
++ /* Set to 1 if the locale information has changed since the last time
++ * the lconv structure was updated. */
++ int lc_needs_refresh;
++ /* Numeric formatting information for locale */
++ struct lconv lc;
++};
+
++extern struct _locale __locale_global;
++
++extern void __build_ctype_tables (locale_t locobj, int __territory) __THROW;
++
++extern char *__setlocale_l (locale_t locobj, int __category,
++ const char *__locale) __THROW;
++
++void __localeconv_lconv_init (struct lconv *lc);
++void __localeconv_lconv_fini (struct lconv *lc);
++void __localeconv_l (locale_t locobj);
++
+ #endif
+
+ __END_DECLS
+Index: libunixlib/include/bits/locale_t.h
+===================================================================
+--- libunixlib/include/bits/locale_t.h (nonexistent)
++++ libunixlib/include/bits/locale_t.h (working copy)
+@@ -0,0 +1,10 @@
++/*
++ * Copyright (c) 2022 UnixLib Developers
++ */
++
++#ifndef _BITS_LOCALE_T_H_
++#define _BITS_LOCALE_T_H_
++
++typedef struct _locale *locale_t;
++
++#endif
+Index: libunixlib/include/ctype.h
+===================================================================
+--- libunixlib/include/ctype.h (revision 7698)
++++ libunixlib/include/ctype.h (working copy)
+@@ -51,6 +51,48 @@
+ extern int isblank (int __c) __THROW;
+
+ #ifndef __TARGET_SCL__
++# ifdef __USE_XOPEN2K8
++# include <bits/locale_t.h>
++
++/* c is alphabetic or numeric. */
++extern int isalnum_l (int __c, locale_t locobj) __THROW;
++
++/* c is alphabetic. */
++extern int isalpha_l (int __c, locale_t locobj) __THROW;
++
++/* c is a control character. */
++extern int iscntrl_l (int __c, locale_t locobj) __THROW;
++
++/* c is a decimal digit. */
++extern int isdigit_l (int __c, locale_t locobj) __THROW;
++
++/* c is any printable character other than a space. */
++extern int isgraph_l (int __c, locale_t locobj) __THROW;
++
++/* c is a lower-case letter. */
++extern int islower_l (int __c, locale_t locobj) __THROW;
++
++/* c is an upper-case letter. */
++extern int isupper_l (int __c, locale_t locobj) __THROW;
++
++/* c is a printable character. */
++extern int isprint_l (int __c, locale_t locobj) __THROW;
++
++/* c is a printable character other than a space or a
++ alphanumeric character. */
++extern int ispunct_l (int __c, locale_t locobj) __THROW;
++
++/* c is a white space character e.g. space, newline, tab, linefeed,
++ return, vertical tab. */
++extern int isspace_l (int __c, locale_t locobj) __THROW;
++
++/* c is a hex digit. */
++extern int isxdigit_l (int __c, locale_t locobj) __THROW;
++
++/* c is tab or space. */
++extern int isblank_l (int __c, locale_t locobj) __THROW;
++# endif
++
+ /* Characteristics. */
+ extern const unsigned char * const __ctype;
+ /* Lower case table. */
+@@ -108,6 +150,10 @@
+ extern int toupper (int __c) __THROW;
+ #ifndef __TARGET_SCL__
+ # define toupper(c) ((int) __ctype_upper[(int) (c)])
++
++# ifdef __USE_XOPEN2K8
++extern int toupper_l (int __c, locale_t locobj) __THROW;
++# endif
+ #endif
+
+ /* Convert c to lower case. */
+@@ -114,6 +160,10 @@
+ extern int tolower (int __c) __THROW;
+ #ifndef __TARGET_SCL__
+ # define tolower(c) ((int) __ctype_lower[(int) (c)])
++
++# ifdef __USE_XOPEN2K8
++extern int tolower_l (int __c, locale_t locobj) __THROW;
++# endif
+ #endif
+
+ #ifndef __TARGET_SCL__
+@@ -135,6 +185,11 @@
+ /* Is c an ASCII character. */
+ extern int isascii (int __c) __THROW;
+ # define isascii(c) ((unsigned)(c) <= 0x7f)
++
++# ifdef __USE_XOPEN2K8
++extern int toascii_l (int __c, locale_t locobj) __THROW;
++extern int isascii_l (int __c, locale_t locobj) __THROW;
++# endif
+ # endif
+ #endif
+
+Index: libunixlib/include/langinfo.h
+===================================================================
+--- libunixlib/include/langinfo.h (revision 7698)
++++ libunixlib/include/langinfo.h (working copy)
+@@ -580,18 +580,12 @@
+ extern char *nl_langinfo (nl_item __item) __THROW;
+
+
+-#if 0
+-#ifdef __USE_GNU
+-/* This interface is for the extended locale model. See <locale.h> for
+- more information. */
++#ifdef __USE_XOPEN2K8
++# include <bits/locale_t.h>
+
+-/* Get locale datatype definition. */
+-# include <xlocale.h>
+-
+ /* Just like nl_langinfo but get the information from the locale object L. */
+-extern char *nl_langinfo_l (nl_item __item, __locale_t l);
++extern char *nl_langinfo_l (nl_item __item, locale_t __l);
+ #endif
+-#endif
+
+ __END_DECLS
+
+Index: libunixlib/include/locale.h
+===================================================================
+--- libunixlib/include/locale.h (revision 7698)
++++ libunixlib/include/locale.h (working copy)
+@@ -33,16 +33,16 @@
+ /* Entire locale. */
+ # define LC_ALL 6
+
+-#define LC_COLLATE_MASK (1L << 1)
+-#define LC_CTYPE_MASK (1L << 2)
+-#define LC_MESSAGES_MASK (1L << 3)
+-#define LC_MONETARY_MASK (1L << 4)
+-#define LC_NUMERIC_MASK (1L << 5)
+-#define LC_TIME_MASK (1L << 6)
+-#define LC_ALL_MASK (LC_COLLATE_MASK | LC_CTYPE_MASK | LC_MESSAGES_MASK | LC_MONETARY_MASK | LC_NUMERIC_MASK | LC_TIME_MASK)
++# ifdef __USE_XOPEN2K8
++# define LC_COLLATE_MASK (1L << 0)
++# define LC_CTYPE_MASK (1L << 1)
++# define LC_MESSAGES_MASK (1L << 2)
++# define LC_MONETARY_MASK (1L << 3)
++# define LC_NUMERIC_MASK (1L << 4)
++# define LC_TIME_MASK (1L << 5)
++# define LC_ALL_MASK (LC_COLLATE_MASK | LC_CTYPE_MASK | LC_MESSAGES_MASK | LC_MONETARY_MASK | LC_NUMERIC_MASK | LC_TIME_MASK)
++# endif
+
+-typedef struct _locale *locale_t;
+-
+ #else
+ /* String collation (functions 'strcoll' and 'strxfrm'). */
+ # define LC_COLLATE 1
+@@ -121,6 +121,9 @@
+ extern struct lconv *localeconv (void) __THROW;
+
+ #ifndef __TARGET_SCL__
++# ifdef __USE_XOPEN2K8
++# include <bits/locale_t.h>
++
+ extern locale_t uselocale(locale_t newloc);
+
+ extern void freelocale(locale_t locobj);
+@@ -127,7 +130,11 @@
+
+ extern locale_t newlocale(int category_mask, const char *locale,
+ locale_t base);
+-# define LC_GLOBAL_LOCALE ((locale_t) -1L)
++
++extern locale_t duplocale(locale_t locobj);
++
++# define LC_GLOBAL_LOCALE ((locale_t) -1L)
++# endif
+ #endif
+
+ __END_NAMESPACE_STD
+Index: libunixlib/include/string.h
+===================================================================
+--- libunixlib/include/string.h (revision 7698)
++++ libunixlib/include/string.h (working copy)
+@@ -93,6 +93,16 @@
+ const char *__restrict __src, size_t __n)
+ __THROW __nonnull ((2));
+
++#ifdef __USE_XOPEN2K8
++#include <bits/locale_t.h>
++
++extern int strcoll_l (const char *__s1, const char *__s2, locale_t __l)
++ __THROW __attribute_pure__ __nonnull ((1, 2, 3));
++
++extern size_t strxfrm_l (char *__dest, const char *__src, size_t __n,
++ locale_t __l) __THROW __nonnull ((2, 4));
++#endif
++
+ /* Find the first occurrence of c in s. */
+ extern char *strchr (const char *__s, int __c)
+ __THROW __attribute_pure__ __nonnull ((1)) __wur;
+@@ -281,6 +291,17 @@
+ /* Compare no more than N chars of S1 and S2, ignoring case. */
+ extern int strncasecmp (const char *__s1, const char *__s2, size_t __n)
+ __THROW __attribute_pure__ __nonnull ((1, 2)) __wur;
++
++# ifdef __USE_XOPEN2K8
++# include <bits/locale_t.h>
++
++extern int strcasecmp_l (const char *__s1, const char *__s2, locale_t __loc)
++ __THROW __attribute_pure__ __nonnull ((1, 2, 3));
++
++extern int strncasecmp_l (const char *__s1, const char *__s2,
++ size_t __n, locale_t __loc)
++ __THROW __attribute_pure__ __nonnull ((1, 2, 4));
++# endif
+ #endif /* Use BSD. */
+
+ #if defined __USE_XOPEN2K || defined __USE_MISC
+@@ -289,6 +310,11 @@
+ __THROW __nonnull ((2));
+ #endif
+
++#ifdef __USE_XOPEN2K8
++/* Translate error number to string according to the locale L. */
++extern char *strerror_l (int __errnum, locale_t __l) __THROW;
++#endif
++
+ #ifndef __TARGET_SCL__
+ # ifndef basename
+ /* Return the file name within directory of FILENAME. We don't
+Index: libunixlib/include/strings.h
+===================================================================
+--- libunixlib/include/strings.h (revision 7698)
++++ libunixlib/include/strings.h (working copy)
+@@ -37,7 +37,17 @@
+ /* Compare n chars of S1 and S2, ignoring case. */
+ extern int strncasecmp (const char *__s1, const char *__s2, size_t __n);
+
++# ifdef __USE_XOPEN2K8
++# include <bits/locale_t.h>
+
++extern int strcasecmp_l (const char *__s1, const char *__s2, locale_t __loc)
++ __THROW __attribute_pure__ __nonnull ((1, 2, 3));
++
++extern int strncasecmp_l (const char *__s1, const char *__s2,
++ size_t __n, locale_t __loc)
++ __THROW __attribute_pure__ __nonnull ((1, 2, 4));
++# endif
++
+ /* Return the position of the first bit set in I, or 0 if none are set.
+ The least-significant bit is position 1, the most-significant 32. */
+ extern int ffs (int __i);
+Index: libunixlib/include/wchar.h
+===================================================================
+--- libunixlib/include/wchar.h (revision 7698)
++++ libunixlib/include/wchar.h (working copy)
+@@ -1,7 +1,7 @@
+ /*
+ * File taken from glibc 2.11.
+ * Following changes were made:
+- * - Disabled non-standard reentrant locale prototypes.
++ * - None
+ */
+
+ /* Copyright (C) 1995-2008, 2009 Free Software Foundation, Inc.
+@@ -172,7 +172,6 @@
+ __END_NAMESPACE_STD
+ #endif
+
+-#if 0
+ #ifdef __USE_XOPEN2K8
+ /* Compare S1 and S2, ignoring case. */
+ extern int wcscasecmp (__const wchar_t *__s1, __const wchar_t *__s2) __THROW;
+@@ -183,15 +182,14 @@
+
+ /* Similar to the two functions above but take the information from
+ the provided locale and not the global locale. */
+-# include <xlocale.h>
++# include <bits/locale_t.h>
+
+ extern int wcscasecmp_l (__const wchar_t *__s1, __const wchar_t *__s2,
+- __locale_t __loc) __THROW;
++ locale_t __loc) __THROW;
+
+ extern int wcsncasecmp_l (__const wchar_t *__s1, __const wchar_t *__s2,
+- size_t __n, __locale_t __loc) __THROW;
++ size_t __n, locale_t __loc) __THROW;
+ #endif
+-#endif
+
+ __BEGIN_NAMESPACE_STD
+ /* Compare S1 and S2, both interpreted as appropriate to the
+@@ -205,7 +203,6 @@
+ __END_NAMESPACE_STD
+
+ #ifdef __USE_XOPEN2K8
+-#if 0
+ /* Similar to the two functions above but take the information from
+ the provided locale and not the global locale. */
+
+@@ -212,14 +209,13 @@
+ /* Compare S1 and S2, both interpreted as appropriate to the
+ LC_COLLATE category of the given locale. */
+ extern int wcscoll_l (__const wchar_t *__s1, __const wchar_t *__s2,
+- __locale_t __loc) __THROW;
++ locale_t __loc) __THROW;
+
+ /* Transform S2 into array pointed to by S1 such that if wcscmp is
+ applied to two transformed strings the result is the as applying
+ `wcscoll' to the original strings. */
+ extern size_t wcsxfrm_l (wchar_t *__s1, __const wchar_t *__s2,
+- size_t __n, __locale_t __loc) __THROW;
+-#endif
++ size_t __n, locale_t __loc) __THROW;
+
+ #ifndef __TARGET_SCL__
+ /* Duplicate S, returning an identical malloc'd string. */
+Index: libunixlib/include/wctype.h
+===================================================================
+--- libunixlib/include/wctype.h (revision 7698)
++++ libunixlib/include/wctype.h (working copy)
+@@ -3,7 +3,6 @@
+ * Following changes were made:
+ * - Replaced "#include <bits/types.h>" into "#include <unixlib/types.h>"
+ * - Add wint_t typedef when it hasn't been defined in stddef.h.
+- * - Disabled non-standard reentrant locale prototypes.
+ */
+
+ /* Copyright (C) 1996-2002,2005,2007,2008,2009 Free Software Foundation, Inc.
+@@ -191,7 +190,6 @@
+ /* Determine whether the wide-character WC has the property described by
+ DESC. */
+ extern int iswctype (wint_t __wc, wctype_t __desc) __THROW;
+-#define iswctype_l(c, d, l) iswctype(c, d)
+
+ __END_NAMESPACE_C99
+
+@@ -241,73 +239,71 @@
+ extern wint_t towctrans (wint_t __wc, wctrans_t __desc) __THROW;
+ __END_NAMESPACE_C99
+
+-#if 0
+ # ifdef __USE_XOPEN2K8
+-/* Declare the interface to extended locale model. */
+-# include <xlocale.h>
++# include <bits/locale_t.h>
+
+ /* Test for any wide character for which `iswalpha' or `iswdigit' is
+ true. */
+-extern int iswalnum_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswalnum_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any wide character for which `iswupper' or 'iswlower' is
+ true, or any wide character that is one of a locale-specific set of
+ wide-characters for which none of `iswcntrl', `iswdigit',
+ `iswpunct', or `iswspace' is true. */
+-extern int iswalpha_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswalpha_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any control wide character. */
+-extern int iswcntrl_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswcntrl_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any wide character that corresponds to a decimal-digit
+ character. */
+-extern int iswdigit_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswdigit_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any wide character for which `iswprint' is true and
+ `iswspace' is false. */
+-extern int iswgraph_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswgraph_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any wide character that corresponds to a lowercase letter
+ or is one of a locale-specific set of wide characters for which
+ none of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true. */
+-extern int iswlower_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswlower_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any printing wide character. */
+-extern int iswprint_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswprint_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any printing wide character that is one of a
+ locale-specific et of wide characters for which neither `iswspace'
+ nor `iswalnum' is true. */
+-extern int iswpunct_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswpunct_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any wide character that corresponds to a locale-specific
+ set of wide characters for which none of `iswalnum', `iswgraph', or
+ `iswpunct' is true. */
+-extern int iswspace_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswspace_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any wide character that corresponds to an uppercase letter
+ or is one of a locale-specific set of wide character for which none
+ of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true. */
+-extern int iswupper_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswupper_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any wide character that corresponds to a hexadecimal-digit
+ character equivalent to that performed be the functions described
+ in the previous subclause. */
+-extern int iswxdigit_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswxdigit_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any wide character that corresponds to a standard blank
+ wide character or a locale-specific set of wide characters for
+ which `iswalnum' is false. */
+-extern int iswblank_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswblank_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Construct value that describes a class of wide characters identified
+ by the string argument PROPERTY. */
+-extern wctype_t wctype_l (__const char *__property, __locale_t __locale)
++extern wctype_t wctype_l (__const char *__property, locale_t __locale)
+ __THROW;
+
+ /* Determine whether the wide-character WC has the property described by
+ DESC. */
+-extern int iswctype_l (wint_t __wc, wctype_t __desc, __locale_t __locale)
++extern int iswctype_l (wint_t __wc, wctype_t __desc, locale_t __locale)
+ __THROW;
+
+
+@@ -316,22 +312,21 @@
+ */
+
+ /* Converts an uppercase letter to the corresponding lowercase letter. */
+-extern wint_t towlower_l (wint_t __wc, __locale_t __locale) __THROW;
++extern wint_t towlower_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Converts an lowercase letter to the corresponding uppercase letter. */
+-extern wint_t towupper_l (wint_t __wc, __locale_t __locale) __THROW;
++extern wint_t towupper_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Construct value that describes a mapping between wide characters
+ identified by the string argument PROPERTY. */
+-extern wctrans_t wctrans_l (__const char *__property, __locale_t __locale)
++extern wctrans_t wctrans_l (__const char *__property, locale_t __locale)
+ __THROW;
+
+ /* Map the wide character WC using the mapping described by DESC. */
+ extern wint_t towctrans_l (wint_t __wc, wctrans_t __desc,
+- __locale_t __locale) __THROW;
++ locale_t __locale) __THROW;
+
+ # endif /* Use POSIX 2008. */
+-#endif
+
+ __END_DECLS
+
+Index: libunixlib/locale/localeconv.c
+===================================================================
+--- libunixlib/locale/localeconv.c (revision 7698)
++++ libunixlib/locale/localeconv.c (working copy)
+@@ -14,8 +14,6 @@
+
+ /* #define DEBUG */
+
+-int __setlocale_called = 1;
+-
+ static int
+ read_symbol (int reason_code, int territory)
+ {
+@@ -71,26 +69,44 @@
+ *grouping = new_grouping;
+ }
+
+-static struct lconv lc = { NULL, NULL, NULL, NULL, NULL,
+- NULL, NULL, NULL, NULL, NULL,
+- CHAR_MAX, CHAR_MAX, CHAR_MAX, CHAR_MAX,
+- CHAR_MAX, CHAR_MAX, CHAR_MAX, CHAR_MAX };
++void
++__localeconv_lconv_init (struct lconv *lc)
++{
++ memset(lc, 0, sizeof(*lc));
++ lc->int_frac_digits = lc->frac_digits = lc->p_cs_precedes =
++ lc->p_sep_by_space = lc->n_cs_precedes = lc->n_sep_by_space =
++ lc->p_sign_posn = lc->n_sign_posn = CHAR_MAX;
++}
+
+-/* Defined by POSIX as not threadsafe */
+-struct lconv *
+-localeconv (void)
++void
++__localeconv_lconv_fini (struct lconv *lc)
+ {
++ free(lc->decimal_point);
++ free(lc->thousands_sep);
++ free(lc->grouping);
++ free(lc->int_curr_symbol);
++ free(lc->currency_symbol);
++ free(lc->mon_decimal_point);
++ free(lc->mon_thousands_sep);
++ free(lc->mon_grouping);
++ free(lc->positive_sign);
++ free(lc->negative_sign);
++}
++
++void
++__localeconv_l (locale_t locobj)
++{
+ int numeric, monetary;
+
+ /* If setlocale has not been called since the last call to
+ localeconv, then the lconv structure will be the same. */
+- if (!__setlocale_called)
+- return &lc;
++ if (!locobj->lc_needs_refresh)
++ return;
+
+- __setlocale_called = 0;
++ locobj->lc_needs_refresh = 0;
+
+- numeric = __locale_territory[LC_NUMERIC];
+- monetary = __locale_territory[LC_MONETARY];
++ numeric = locobj->locale_territory[LC_NUMERIC];
++ monetary = locobj->locale_territory[LC_MONETARY];
+
+ /* See the PRMs regarding SWI Territory_ReadSymbols for the
+ meanings of the following numbers. */
+@@ -97,71 +113,80 @@
+ if (numeric == -1)
+ {
+ /* We're using the 'C' locale. */
+- free (lc.decimal_point);
+- lc.decimal_point = strdup (".");
+- free (lc.thousands_sep);
+- lc.thousands_sep = strdup ("");
+- free (lc.grouping);
+- lc.grouping = strdup ("");
++ free (locobj->lc.decimal_point);
++ locobj->lc.decimal_point = strdup (".");
++ free (locobj->lc.thousands_sep);
++ locobj->lc.thousands_sep = strdup ("");
++ free (locobj->lc.grouping);
++ locobj->lc.grouping = strdup ("");
+ }
+ else
+ {
+- free (lc.decimal_point);
+- lc.decimal_point = strdup ((char *) read_symbol (0, numeric));
+- free (lc.thousands_sep);
+- lc.thousands_sep = strdup ((char *) read_symbol (1, numeric));
+- read_byte_list (2, &lc.grouping, numeric);
++ free (locobj->lc.decimal_point);
++ locobj->lc.decimal_point = strdup ((char *) read_symbol (0, numeric));
++ free (locobj->lc.thousands_sep);
++ locobj->lc.thousands_sep = strdup ((char *) read_symbol (1, numeric));
++ read_byte_list (2, &locobj->lc.grouping, numeric);
+ }
+ if (monetary == -1)
+ {
+ /* We using the 'C' locale. Empty strings and CHAR_MAX means
+ that these fields are unspecified. */
+- free (lc.mon_decimal_point);
+- lc.mon_decimal_point = strdup ("");
+- free (lc.mon_thousands_sep);
+- lc.mon_thousands_sep = strdup ("");
+- free (lc.mon_grouping);
+- lc.mon_grouping = strdup ("");
+- lc.int_frac_digits = CHAR_MAX;
+- lc.frac_digits = CHAR_MAX;
+- free (lc.currency_symbol);
+- lc.currency_symbol = strdup ("");
+- free (lc.int_curr_symbol);
+- lc.int_curr_symbol = strdup ("");
+- lc.p_cs_precedes = CHAR_MAX;
+- lc.n_cs_precedes = CHAR_MAX;
+- lc.p_sep_by_space = CHAR_MAX;
+- lc.n_sep_by_space = CHAR_MAX;
+- free (lc.positive_sign);
+- lc.positive_sign = strdup ("");
+- free (lc.negative_sign);
+- lc.negative_sign = strdup ("");
+- lc.p_sign_posn = CHAR_MAX;
+- lc.n_sign_posn = CHAR_MAX;
++ free (locobj->lc.mon_decimal_point);
++ locobj->lc.mon_decimal_point = strdup ("");
++ free (locobj->lc.mon_thousands_sep);
++ locobj->lc.mon_thousands_sep = strdup ("");
++ free (locobj->lc.mon_grouping);
++ locobj->lc.mon_grouping = strdup ("");
++ locobj->lc.int_frac_digits = CHAR_MAX;
++ locobj->lc.frac_digits = CHAR_MAX;
++ free (locobj->lc.currency_symbol);
++ locobj->lc.currency_symbol = strdup ("");
++ free (locobj->lc.int_curr_symbol);
++ locobj->lc.int_curr_symbol = strdup ("");
++ locobj->lc.p_cs_precedes = CHAR_MAX;
++ locobj->lc.n_cs_precedes = CHAR_MAX;
++ locobj->lc.p_sep_by_space = CHAR_MAX;
++ locobj->lc.n_sep_by_space = CHAR_MAX;
++ free (locobj->lc.positive_sign);
++ locobj->lc.positive_sign = strdup ("");
++ free (locobj->lc.negative_sign);
++ locobj->lc.negative_sign = strdup ("");
++ locobj->lc.p_sign_posn = CHAR_MAX;
++ locobj->lc.n_sign_posn = CHAR_MAX;
+ }
+ else
+ {
+- free (lc.int_curr_symbol);
+- lc.int_curr_symbol = strdup ((char *)read_symbol (3, monetary));
+- free (lc.currency_symbol);
+- lc.currency_symbol = strdup ((char *)read_symbol (4, monetary));
+- free (lc.mon_decimal_point);
+- lc.mon_decimal_point = strdup ((char *)read_symbol (5, monetary));
+- free (lc.mon_thousands_sep);
+- lc.mon_thousands_sep = strdup ((char *)read_symbol (6, monetary));
+- read_byte_list (7, &lc.mon_grouping, monetary);
+- free (lc.positive_sign);
+- lc.positive_sign = strdup ((char *)read_symbol (8, monetary));
+- free (lc.negative_sign);
+- lc.negative_sign = strdup ((char *)read_symbol (9, monetary));
+- lc.int_frac_digits = (char)read_symbol (10, monetary);
+- lc.frac_digits = (char)read_symbol (11, monetary);
+- lc.p_cs_precedes = (char)read_symbol (12, monetary);
+- lc.p_sep_by_space = (char)read_symbol (13, monetary);
+- lc.n_cs_precedes = (char)read_symbol (14, monetary);
+- lc.n_sep_by_space = (char)read_symbol (15, monetary);
+- lc.p_sign_posn = (char)read_symbol (16, monetary);
+- lc.n_sign_posn = (char)read_symbol (17, monetary);
++ free (locobj->lc.int_curr_symbol);
++ locobj->lc.int_curr_symbol = strdup ((char *)read_symbol (3, monetary));
++ free (locobj->lc.currency_symbol);
++ locobj->lc.currency_symbol = strdup ((char *)read_symbol (4, monetary));
++ free (locobj->lc.mon_decimal_point);
++ locobj->lc.mon_decimal_point = strdup ((char *)read_symbol (5, monetary));
++ free (locobj->lc.mon_thousands_sep);
++ locobj->lc.mon_thousands_sep = strdup ((char *)read_symbol (6, monetary));
++ read_byte_list (7, &locobj->lc.mon_grouping, monetary);
++ free (locobj->lc.positive_sign);
++ locobj->lc.positive_sign = strdup ((char *)read_symbol (8, monetary));
++ free (locobj->lc.negative_sign);
++ locobj->lc.negative_sign = strdup ((char *)read_symbol (9, monetary));
++ locobj->lc.int_frac_digits = (char)read_symbol (10, monetary);
++ locobj->lc.frac_digits = (char)read_symbol (11, monetary);
++ locobj->lc.p_cs_precedes = (char)read_symbol (12, monetary);
++ locobj->lc.p_sep_by_space = (char)read_symbol (13, monetary);
++ locobj->lc.n_cs_precedes = (char)read_symbol (14, monetary);
++ locobj->lc.n_sep_by_space = (char)read_symbol (15, monetary);
++ locobj->lc.p_sign_posn = (char)read_symbol (16, monetary);
++ locobj->lc.n_sign_posn = (char)read_symbol (17, monetary);
+ }
+- return &lc;
++ return;
+ }
++
++/* Defined by POSIX as not threadsafe */
++struct lconv *
++localeconv (void)
++{
++ __localeconv_l (&__locale_global);
++
++ return &__locale_global.lc;
++}
+Index: libunixlib/locale/newlocale.c
+===================================================================
+--- libunixlib/locale/newlocale.c (revision 7698)
++++ libunixlib/locale/newlocale.c (working copy)
+@@ -1,17 +1,17 @@
+ /* Copyright (c) 2019 UnixLib Developers
+ */
+
++#include <ctype.h>
++#include <errno.h>
++#include <locale.h>
+ #include <stdlib.h>
+-#include <locale.h>
+ #include <stdio.h>
+-#include <errno.h>
++#include <string.h>
+
+-struct _locale {
+- struct lconv lc;
+-};
++#include <internal/unix.h>
+
+ /* This is supposed to be per-thread. */
+-static locale_t current_locale;
++static locale_t current_locale = LC_GLOBAL_LOCALE;
+
+ locale_t uselocale(locale_t newloc)
+ {
+@@ -27,20 +27,94 @@
+
+ void freelocale(locale_t locobj)
+ {
+- if (locobj)
++ if (locobj) {
++ __localeconv_lconv_fini(&locobj->lc);
+ free(locobj);
++ }
+ }
+
+ locale_t newlocale(int category_mask, const char *locale,
+ locale_t base)
+ {
+- locale_t loc = (locale_t)malloc(sizeof(*loc));
+- if (!loc) {
++ struct _locale tmp;
++
++ PTHREAD_UNSAFE
++
++ if ((category_mask & ~LC_ALL_MASK) || locale == NULL) {
++ __set_errno (EINVAL);
++ return 0;
++ }
++
++ /* The locale provided will be verified by __setlocale_l() */
++
++ /* Prepare the temporary locale we will modify */
++ if (base != 0 && base != LC_GLOBAL_LOCALE) {
++ memcpy(&tmp, base, sizeof(tmp));
++ } else {
++ if (base == LC_GLOBAL_LOCALE) {
++ /* Undefined: be helpful to client */
++ memcpy(&tmp, &__locale_global, sizeof(tmp));
++ } else {
++ /* Initialise to C locale */
++ __build_ctype_tables(&tmp, -2);
++ }
++ }
++
++ /* Now, apply the requested locale to each of the categories in the mask */
++ if (category_mask == LC_ALL_MASK) {
++ /* Special-case LC_ALL to handle the encoded locale string */
++ if (__setlocale_l(&tmp, LC_ALL, locale) == NULL) {
++ return 0;
++ }
++ } else {
++ int category = 0, mask = category_mask;
++ while (mask != 0) {
++ if (mask & 1) {
++ if (__setlocale_l(&tmp, category, locale) == NULL) {
++ return 0;
++ }
++ }
++ category++;
++ mask >>= 1;
++ }
++ }
++
++ /* Allocate the result, if necessary */
++ if (base == 0 || base == LC_GLOBAL_LOCALE) {
++ base = (locale_t)malloc(sizeof(*base));
++ if (!base) {
++ __set_errno (ENOMEM);
++ return 0;
++ }
++ }
++ /* Fill it in */
++ memcpy(base, &tmp, sizeof(tmp));
++
++ /* Mark the lconv data stale */
++ base->lc_needs_refresh = 1;
++
++ return base;
++}
++
++locale_t duplocale(locale_t locobj)
++{
++ locale_t loc;
++
++ loc = (locale_t) malloc(sizeof(*loc));
++ if (loc == NULL) {
+ __set_errno (ENOMEM);
+ return 0;
+ }
+
+- loc->lc = *localeconv();
++ if (locobj == LC_GLOBAL_LOCALE) {
++ memcpy(loc, &__locale_global, sizeof(*loc));
++ } else {
++ memcpy(loc, locobj, sizeof(*loc));
++ }
+
++ /* Invalidate lconv in the copy */
++ __localeconv_lconv_init(&loc->lc);
++ loc->lc_needs_refresh = 1;
++
+ return loc;
+ }
+Index: libunixlib/locale/nl_langinfo.c
+===================================================================
+--- libunixlib/locale/nl_langinfo.c (revision 7698)
++++ libunixlib/locale/nl_langinfo.c (working copy)
+@@ -24,3 +24,10 @@
+
+ return (char *)value;
+ }
++
++char *
++nl_langinfo_l (nl_item item, locale_t l)
++{
++ (void) l;
++ return nl_langinfo(item);
++}
+Index: libunixlib/locale/setlocale.c
+===================================================================
+--- libunixlib/locale/setlocale.c (revision 7698)
++++ libunixlib/locale/setlocale.c (working copy)
+@@ -195,7 +195,7 @@
+ }
+
+ static void
+-do_lc_all (char *buffer, int size)
++do_lc_all (locale_t locobj, char *buffer, int size)
+ {
+ char temp[64];
+ int category, same = 1;
+@@ -204,13 +204,13 @@
+ setlocale to set all locales. If all locales are
+ the same, then we can produce a very short string. */
+ for (category = 1; category < LC_ALL; ++category)
+- if (__locale_territory[0] != __locale_territory[category])
++ if (locobj->locale_territory[0] != locobj->locale_territory[category])
+ same = 0;
+
+ if (same)
+ {
+ /* All locales are set to the same territory. */
+- territory_name (__locale_territory[0], buffer, size);
++ territory_name (locobj->locale_territory[0], buffer, size);
+ }
+ else
+ {
+@@ -218,7 +218,7 @@
+ LC_CATEGORY=country;LC_CATEGORY=country; ... */
+ for (category = 0; category < LC_ALL; ++category)
+ {
+- territory_name (__locale_territory[category], temp, sizeof (temp));
++ territory_name (locobj->locale_territory[category], temp, sizeof (temp));
+ buffer = stpcpy (buffer, locale_names[category]);
+ *buffer++ = '=';
+ buffer = stpcpy (buffer, temp);
+@@ -230,15 +230,13 @@
+ }
+
+ char *
+-setlocale (int category, const char *locale)
++__setlocale_l (locale_t locobj, int category, const char *locale)
+ {
+ int new_territory, changed;
+ static char old_locale[256];
+
+- PTHREAD_UNSAFE
+-
+ /* This tells localeconv to re-read data for the lconv structure. */
+- __setlocale_called = 1;
++ locobj->lc_needs_refresh = 1;
+
+ if (locale == NULL)
+ {
+@@ -247,11 +245,11 @@
+ {
+ /* The locale string is specially encoded for LC_ALL so we
+ could restore all locales at any time. */
+- do_lc_all (old_locale, sizeof (old_locale));
++ do_lc_all (locobj, old_locale, sizeof (old_locale));
+ return old_locale;
+ }
+
+- territory_name (__locale_territory[category], old_locale, sizeof (old_locale));
++ territory_name (locobj->locale_territory[category], old_locale, sizeof (old_locale));
+ return old_locale;
+ }
+
+@@ -270,7 +268,7 @@
+ /* Encode the locale string, as we will be returning this
+ later. Remember, setlocale returns the locale settings
+ that are about to be changed. */
+- do_lc_all (old_locale, sizeof (old_locale));
++ do_lc_all (locobj, old_locale, sizeof (old_locale));
+
+ /* Check for an encoded (composite) name. Simply looking for
+ a semi-colon will verify this. */
+@@ -332,11 +330,11 @@
+
+ /* We now know all locales exist, so set them. */
+ for (category = 0; category < LC_ALL; ++category)
+- __locale_territory[category] = territory_number (newnames[category]);
++ locobj->locale_territory[category] = territory_number (newnames[category]);
+
+ /* Re-build the character type tables according to the new
+ locale settings. */
+- __build_ctype_tables (__locale_territory[LC_CTYPE]);
++ __build_ctype_tables (locobj, locobj->locale_territory[LC_CTYPE]);
+ return old_locale;
+ }
+ }
+@@ -359,9 +357,9 @@
+ /* Change the locale for all categories. old_locale was created
+ when we previously checked for a composite string. */
+ for (category = 0; category < LC_ALL; ++category)
+- if (__locale_territory[category] != new_territory)
++ if (locobj->locale_territory[category] != new_territory)
+ {
+- __locale_territory[category] = new_territory;
++ locobj->locale_territory[category] = new_territory;
+ changed = 1;
+ }
+ }
+@@ -368,12 +366,12 @@
+ else
+ {
+ /* Change the locale for just one category. */
+- territory_name (__locale_territory[category],
++ territory_name (locobj->locale_territory[category],
+ old_locale, sizeof (old_locale));
+
+- if (__locale_territory[category] != new_territory)
++ if (locobj->locale_territory[category] != new_territory)
+ {
+- __locale_territory[category] = new_territory;
++ locobj->locale_territory[category] = new_territory;
+ changed = 1;
+ }
+ }
+@@ -384,7 +382,16 @@
+ is changing. The GNU Java compiler is known to repeatedly call
+ setlocale. */
+ if (changed && (category == LC_ALL || category == LC_CTYPE))
+- __build_ctype_tables (new_territory);
++ __build_ctype_tables (locobj, new_territory);
+
+ return old_locale;
+ }
++
++char *
++setlocale (int category, const char *locale)
++{
++
++ PTHREAD_UNSAFE
++
++ return __setlocale_l(&__locale_global, category, locale);
++}
+Index: libunixlib/locale/strcoll.c
+===================================================================
+--- libunixlib/locale/strcoll.c (revision 7698)
++++ libunixlib/locale/strcoll.c (working copy)
+@@ -11,9 +11,15 @@
+ int
+ strcoll (const char *s1, const char *s2)
+ {
++ return strcoll_l (s1, s2, &__locale_global);
++}
++
++int
++strcoll_l (const char *s1, const char *s2, locale_t l)
++{
+ int regs[10];
+
+- regs[0] = __locale_territory[LC_COLLATE];
++ regs[0] = l->locale_territory[LC_COLLATE];
+ regs[1] = (int)s1;
+ regs[2] = (int)s2;
+ regs[3] = 0;
+@@ -21,3 +27,4 @@
+ __os_swi (Territory_Collate, regs);
+ return regs[0];
+ }
++
+Index: libunixlib/locale/strxfrm.c
+===================================================================
+--- libunixlib/locale/strxfrm.c (revision 7698)
++++ libunixlib/locale/strxfrm.c (working copy)
+@@ -11,9 +11,15 @@
+ size_t
+ strxfrm (char *to, const char *from, size_t size)
+ {
++ return strxfrm_l (to, from, size, &__locale_global);
++}
++
++size_t
++strxfrm_l (char *to, const char *from, size_t size, locale_t l)
++{
+ int regs[10];
+
+- regs[0] = __locale_territory[LC_COLLATE];
++ regs[0] = l->locale_territory[LC_COLLATE];
+ regs[1] = (int)to;
+ regs[2] = (int)from;
+ regs[3] = size;
+Index: libunixlib/locale/territory.c
+===================================================================
+--- libunixlib/locale/territory.c (revision 7698)
++++ libunixlib/locale/territory.c (nonexistent)
+@@ -1,10 +0,0 @@
+-/* __locale_territory
+- * Copyright (c) 2000-2006 UnixLib Developers
+- */
+-
+-#include <locale.h>
+-
+-/* Global used for all calls to the Territory module. These variable
+- contain the territory number as set by setlocale. A value of
+- -1 means use the C locale. */
+-int __locale_territory[LC_ALL + 1];
+Index: libunixlib/string/stricmp.c
+===================================================================
+--- libunixlib/string/stricmp.c (revision 7698)
++++ libunixlib/string/stricmp.c (working copy)
+@@ -4,6 +4,7 @@
+ #include <string.h>
+ #include <strings.h>
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ stricmp (const char *s1, const char *s2)
+@@ -26,3 +27,24 @@
+ return result;
+ }
+ strong_alias (stricmp, strcasecmp)
++
++int
++strcasecmp_l (const char *s1, const char *s2, locale_t locobj)
++{
++ const unsigned char *p1 = (const unsigned char *) s1;
++ const unsigned char *p2 = (const unsigned char *) s2;
++ int result = 0;
++
++ if (p1 == p2)
++ return result;
++
++ while (! result)
++ {
++ result = tolower_l (*p1, locobj) - tolower_l (*p2, locobj);
++ if (*p1++ == '\0')
++ break;
++ p2 ++;
++ }
++
++ return result;
++}
+Index: libunixlib/string/strnicmp.c
+===================================================================
+--- libunixlib/string/strnicmp.c (revision 7698)
++++ libunixlib/string/strnicmp.c (working copy)
+@@ -5,6 +5,7 @@
+ #include <string.h>
+ #include <strings.h>
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ strnicmp (const char *s1, const char *s2, size_t n)
+@@ -26,3 +27,22 @@
+ }
+ strong_alias (strnicmp, strncasecmp)
+
++int
++strncasecmp_l (const char *s1, const char *s2, size_t n, locale_t locobj)
++{
++ int i, j;
++
++ if (!n)
++ return 0;
++
++ do
++ {
++ i = *s1++, j = *s2++;
++ i = tolower_l (i, locobj);
++ j = tolower_l (j, locobj);
++ }
++ while (i && i == j && --n);
++
++ return i - j;
++}
++
+Index: libunixlib/sys/errlist.c
+===================================================================
+--- libunixlib/sys/errlist.c (revision 7698)
++++ libunixlib/sys/errlist.c (working copy)
+@@ -211,3 +211,10 @@
+
+ return 0;
+ }
++
++char *
++strerror_l (int errnum, locale_t l)
++{
++ (void) l;
++ return strerror (errnum);
++}
+Index: libunixlib/time/broken.c
+===================================================================
+--- libunixlib/time/broken.c (revision 7698)
++++ libunixlib/time/broken.c (working copy)
+@@ -49,7 +49,7 @@
+ #ifdef __TARGET_SCL__
+ -1,
+ #else
+- __locale_territory[LC_TIME],
++ __locale_global.locale_territory[LC_TIME],
+ #endif
+ riscos_time, ordinals);
+ }
+Index: libunixlib/time/gmtime_r.c
+===================================================================
+--- libunixlib/time/gmtime_r.c (revision 7698)
++++ libunixlib/time/gmtime_r.c (working copy)
+@@ -46,7 +46,7 @@
+ #ifdef __TARGET_SCL__
+ -1,
+ #else
+- __locale_territory[LC_TIME],
++ __locale_global.locale_territory[LC_TIME],
+ #endif
+ riscos_time, ordinals)) != NULL)
+ {
+Index: libunixlib/time/localtime_r.c
+===================================================================
+--- libunixlib/time/localtime_r.c (revision 7698)
++++ libunixlib/time/localtime_r.c (working copy)
+@@ -28,7 +28,7 @@
+ #ifdef __TARGET_SCL__
+ -1,
+ #else
+- __locale_territory[LC_TIME],
++ __locale_global.locale_territory[LC_TIME],
+ #endif
+ riscos_time, ordinals)) != NULL)
+ {
+Index: libunixlib/time/mktime.c
+===================================================================
+--- libunixlib/time/mktime.c (revision 7698)
++++ libunixlib/time/mktime.c (working copy)
+@@ -23,7 +23,7 @@
+ #ifdef __TARGET_SCL__
+ -1,
+ #else
+- __locale_territory[LC_TIME],
++ __locale_global.locale_territory[LC_TIME],
+ #endif
+ riscos_time,
+ ordinals)) != NULL)
+Index: libunixlib/time/stdtime.c
+===================================================================
+--- libunixlib/time/stdtime.c (revision 7698)
++++ libunixlib/time/stdtime.c (working copy)
+@@ -48,7 +48,7 @@
+ #ifdef __TARGET_SCL__
+ -1,
+ #else
+- __locale_territory[LC_TIME],
++ __locale_global.locale_territory[LC_TIME],
+ #endif
+ riscos_time,
+ result,
+Index: libunixlib/time/strftime.c
+===================================================================
+--- libunixlib/time/strftime.c (revision 7698)
++++ libunixlib/time/strftime.c (working copy)
+@@ -353,7 +353,7 @@
+ int regs[10];
+ char buffer[64];
+
+- regs[0] = __locale_territory[LC_TIME];
++ regs[0] = __locale_global.locale_territory[LC_TIME];
+ regs[1] = (int)timep;
+ regs[2] = (int)buffer;
+ regs[3] = sizeof (buffer) - 1;
+@@ -368,7 +368,7 @@
+ int regs[10];
+ char buffer[64];
+
+- regs[0] = __locale_territory[LC_TIME];
++ regs[0] = __locale_global.locale_territory[LC_TIME];
+ regs[1] = (int)timep;
+ regs[2] = (int)buffer;
+ regs[3] = sizeof (buffer) - 1;
+Index: libunixlib/time/tzset.c
+===================================================================
+--- libunixlib/time/tzset.c (revision 7698)
++++ libunixlib/time/tzset.c (working copy)
+@@ -36,7 +36,7 @@
+ /* Get timezone information for current territory. */
+ _kernel_swi_regs regs;
+ #ifndef __TARGET_SCL__
+- regs.r[0] = __locale_territory[LC_TIME];
++ regs.r[0] = __locale_global.locale_territory[LC_TIME];
+ #else
+ regs.r[0] = -1; /* Current territory. */
+ #endif
+Index: libunixlib/unix/unix.c
+===================================================================
+--- libunixlib/unix/unix.c (revision 7698)
++++ libunixlib/unix/unix.c (working copy)
+@@ -191,7 +191,7 @@
+ __pthread_prog_init ();
+ __unixlib_signal_initialise (__u);
+ /* Initialise ctype tables to the C locale. */
+- __build_ctype_tables (-2);
++ __build_ctype_tables (&__locale_global, -2);
+ /* Define and initialise the Unix I/O. */
+ initialise_unix_io ();
+ __stdioinit ();
+Index: libunixlib/vscript
+===================================================================
+--- libunixlib/vscript (revision 7698)
++++ libunixlib/vscript (working copy)
+@@ -58,6 +58,9 @@
+ __init_des_r;
+ __init_des;
+ __invalidate;
++ __locale_global;
++ __localeconv_lconv_init;
++ __localeconv_lconv_fini;
+ malloc_trim;
+ malloc_trim_unlocked;
+ malloc_unlocked;
+@@ -80,6 +83,7 @@
+ __res_vinit;
+ __runtime_features;
+ __setup_signalhandler_stack;
++ __setlocale_l;
+ __sdirinit;
+ __sfixinit;
+ __sfixfind;
+Index: libunixlib/wchar/wctype.c
+===================================================================
+--- libunixlib/wchar/wctype.c (revision 7698)
++++ libunixlib/wchar/wctype.c (working copy)
+@@ -4,6 +4,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+ #include <wctype.h>
+
+ int
+@@ -71,3 +72,69 @@
+ {
+ return isxdigit (wc);
+ }
++
++int
++iswalnum_l (wint_t wc, locale_t locale)
++{
++ return isalnum_l (wc, locale);
++}
++
++int
++iswalpha_l (wint_t wc, locale_t locale)
++{
++ return isalpha_l (wc, locale);
++}
++
++int
++iswcntrl_l (wint_t wc, locale_t locale)
++{
++ return iscntrl_l (wc, locale);
++}
++
++int
++iswdigit_l (wint_t wc, locale_t locale)
++{
++ return isdigit_l (wc, locale);
++}
++
++int
++iswgraph_l (wint_t wc, locale_t locale)
++{
++ return isgraph_l (wc, locale);
++}
++
++int
++iswprint_l (wint_t wc, locale_t locale)
++{
++ return isprint_l (wc, locale);
++}
++
++int
++iswpunct_l (wint_t wc, locale_t locale)
++{
++ return ispunct_l (wc, locale);
++}
++
++int
++iswspace_l (wint_t wc, locale_t locale)
++{
++ return isspace_l (wc, locale);
++}
++
++int
++iswxdigit_l (wint_t wc, locale_t locale)
++{
++ return isxdigit_l (wc, locale);
++}
++
++wint_t
++towlower_l (wint_t wc, locale_t locale)
++{
++ return tolower_l (wc, locale);
++}
++
++wint_t
++towupper_l (wint_t wc, locale_t locale)
++{
++ return toupper_l (wc, locale);
++}
+Index: libunixlib/wchar/wmissing.c
+===================================================================
+--- libunixlib/wchar/wmissing.c (revision 7698)
++++ libunixlib/wchar/wmissing.c (working copy)
+@@ -1,7 +1,7 @@
++#include <locale.h>
++#include <stdio.h>
+ #include <stdlib.h>
+ #include <wctype.h>
+-#include <wctype.h>
+-#include <stdio.h>
+
+ int iswupper (wint_t __wc)
+ {
+@@ -9,13 +9,26 @@
+ abort();
+ }
+
+-unsigned long int wcstoul (__const wchar_t *__restrict __nptr,
+- wchar_t **__restrict __endptr, int __base)
++int
++iswupper_l (wint_t wc, locale_t locale)
+ {
+ printf("%s: Not implemented\n", __func__);
+ abort();
+ }
+
++int iswlower (wint_t __wc)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
++int
++iswlower_l (wint_t wc, locale_t locale)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
+ int wcscoll (__const wchar_t *__s1, __const wchar_t *__s2)
+ {
+ printf("%s: Not implemented\n", __func__);
+@@ -22,12 +35,47 @@
+ abort();
+ }
+
+-int iswlower (wint_t __wc)
++int wcscoll_l (__const wchar_t *__s1, __const wchar_t *__s2,
++ locale_t loc)
+ {
+ printf("%s: Not implemented\n", __func__);
+ abort();
+ }
+
++int wcscasecmp (__const wchar_t *__s1, __const wchar_t *__s2)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
++int wcsncasecmp (__const wchar_t *__s1, __const wchar_t *__s2,
++ size_t __n)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
++int wcscasecmp_l (__const wchar_t *__s1, __const wchar_t *__s2,
++ locale_t __loc)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
++int wcsncasecmp_l (__const wchar_t *__s1, __const wchar_t *__s2,
++ size_t __n, locale_t __loc)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
++unsigned long int wcstoul (__const wchar_t *__restrict __nptr,
++ wchar_t **__restrict __endptr, int __base)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
+ long long int wcstoll (__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr, int __base)
+ {
+@@ -63,6 +111,13 @@
+ abort();
+ }
+
++size_t wcsxfrm_l (wchar_t *__s1, __const wchar_t *__s2,
++ size_t __n, locale_t __loc)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
+ float wcstof (__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr)
+ {
+@@ -83,6 +138,13 @@
+ abort();
+ }
+
++int
++iswblank_l (wint_t __wc, locale_t __locale)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
+ int iswctype (wint_t __wc, wctype_t __desc)
+ {
+ printf("%s: Not implemented\n", __func__);
+@@ -89,6 +151,12 @@
+ abort();
+ }
+
++int iswctype_l (wint_t __wc, wctype_t __desc, locale_t __locale)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
+ unsigned long long int wcstoull (__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr,
+ int __base)
+@@ -116,6 +184,12 @@
+ abort();
+ }
+
++wctype_t wctype_l (__const char *__property, locale_t __locale)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
+ wint_t ungetwc(wint_t wc, FILE *stream)
+ {
+ printf("%s: Not implemented\n", __func__);
diff --git a/arm-riscos-gnueabi/recipes/patches/gccsdk/roinstall-objdump-name.p b/arm-riscos-gnueabi/recipes/patches/gccsdk/roinstall-objdump-name.p
new file mode 100644
index 0000000..73a9abe
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/gccsdk/roinstall-objdump-name.p
@@ -0,0 +1,13 @@
+Index: ro-install
+===================================================================
+--- ro-install (revision 7698)
++++ ro-install (working copy)
+@@ -72,7 +72,7 @@
+
+ # Check that static libraries really do contain static objects
+ if grep -q "\.a\$" <<< $param || grep -q "\.a-static" <<< $param ; then
+- if GCCSDK_BIN/arm-unknown-riscos-objdump -p $param | grep -q "position independent"; then
++ if GCCSDK_BIN/arm-riscos-gnueabi-objdump -p $param | grep -q "position independent"; then
+ echo "RISC OS Cross installer: static archive $param contains position independent code" 1>&2
+ exit 1
+ fi
diff --git a/arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-armv4.p b/arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-armv4.p
new file mode 100644
index 0000000..1343d13
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-armv4.p
@@ -0,0 +1,80 @@
+Index: libunixlib/gcccompat/atomics.c
+===================================================================
+--- libunixlib/gcccompat/atomics.c (revision 7698)
++++ libunixlib/gcccompat/atomics.c (working copy)
+@@ -378,7 +378,7 @@
+ ATOMIC_OP_FETCH(or,(*ptr) |= val,unsigned)
+ ATOMIC_OP_FETCH(nand,(*ptr) = ~((*ptr) & val),unsigned)
+
+-#ifdef __ARM_EABI__
++#if defined(__ARM_EABI__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6)
+
+ static int __cmpxchg (int oldval, int newval, volatile int *ptr)
+ {
+Index: libunixlib/pthread/_ints.s
+===================================================================
+--- libunixlib/pthread/_ints.s (revision 7698)
++++ libunixlib/pthread/_ints.s (working copy)
+@@ -14,6 +14,15 @@
+ .protected __pthread_enable_ints
+ .global __pthread_protect_unsafe
+
++#if defined(__ARM_ARCH) && (__ARM_ARCH__ < 6)
++ /* Modern gas objects to our runtime-conditional use of LDREX/STREX
++ * in here. If we're building for pre-armv6 architectures, tell gas
++ * that to allow armv6 instructions, but mark the resulting object
++ * as armv4 compatible. */
++ .arch armv6
++ .object_arch armv4
++#endif
++
+ @ Disable context switches by incrementing the semaphore
+ @ May be called from USR or SVC mode
+ NAME __pthread_disable_ints
+@@ -23,7 +32,7 @@
+ LDR a1, .L0 @ =__ul_global
+ PICEQ "LDR a1, [a2, a1]"
+ LDR ip, [a1, #GBL_PTH_CALLEVERY_RMA]
+-#ifdef __ARM_EABI__
++#if defined(__ARM_EABI__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6)
+ ADD a1, ip, #PTHREAD_CALLEVERY_RMA_WORKSEMAPHORE
+ #else
+ LDR a4, [a1, #GBL_CPU_FLAGS]
+@@ -93,7 +102,7 @@
+ LDR a4, .L2 @ =__ul_global
+ PICEQ "LDR a4, [a1, a4]"
+ LDR ip, [a4, #GBL_PTH_CALLEVERY_RMA]
+-#ifdef __ARM_EABI__
++#if defined(__ARM_EABI__) && defined(__ARM_ARCH) && (__ARM_ARCH >= 6)
+ ADD a1, ip, #PTHREAD_CALLEVERY_RMA_WORKSEMAPHORE
+ #else
+ LDR a2, [a4, #GBL_CPU_FLAGS]
+Index: libunixlib/sys/_syslib.s
+===================================================================
+--- libunixlib/sys/_syslib.s (revision 7698)
++++ libunixlib/sys/_syslib.s (working copy)
+@@ -49,6 +49,15 @@
+ .weak __dynamic_da_max_size
+ .weak __stack_size
+
++#if defined(__ARM_ARCH) && (__ARM_ARCH__ < 6)
++ /* Modern gas objects to our runtime-conditional use of LDREX/STREX
++ * in here. If we're building for pre-armv6 architectures, tell gas
++ * that to allow armv6 instructions, but mark the resulting object
++ * as armv4 compatible. */
++ .arch armv6
++ .object_arch armv4
++#endif
++
+ @ RMEnsure the minimum version of the SharedUnixLibrary we need.
+ @ Now check System modules first as UnixLib package is deprecated.
+ #if !defined(__SOFTFP__) && defined(__VFP_FP__)
+@@ -1414,7 +1423,7 @@
+ @ we go for a straight OS_Exit scenario. Anything better we
+ @ can do ?
+ ADD a3, a4, #GBL_PANIC_MODE
+-#ifndef __ARM_EABI__
++#if !defined(__ARM_EABI__) || !defined(__ARM_ARCH) || (__ARM_ARCH < 6)
+ LDR a2, [a4, #GBL_CPU_FLAGS]
+ TST a2, #__CPUCAP_HAVE_SWP
+ BEQ 0f
diff --git a/arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-initial-sp.p b/arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-initial-sp.p
new file mode 100644
index 0000000..f3309c2
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-initial-sp.p
@@ -0,0 +1,31 @@
+Index: libunixlib/sys/_syslib.s
+===================================================================
+--- libunixlib/sys/_syslib.s (revision 7698)
++++ libunixlib/sys/_syslib.s (working copy)
+@@ -396,8 +396,9 @@
+ SWI XOS_ReadVarVal @ Read value of progname$HeapMax
+ BVS t08
+ TEQ v1, #1 @ Should be a number variable
+- LDREQ v2, [sp], #4
++ LDREQ v2, [sp]
+ MOVEQ v2, v2, LSL#20 @ Convert MB into bytes
++ ADD sp, sp, #4
+
+ @ v2 = size of DA area
+ t08:
+@@ -512,7 +513,15 @@
+ MOVCC a1, #ERR_NO_FPE
+ BCC __exit_with_error_num
+ #endif
++#else
++#ifdef __ARM_EABI__
++ @ EABI with software FP. Burn the top of the stack to appease
++ @ ARMEABISupport (which does not consider the stack top address
++ @ as part of the stack).
++ SUB sp, sp, #4
++ BIC sp, sp, #7 @ AAPCS wants 8 byte alignment
+ #endif
++#endif
+
+ @ We need to create this now so that we have its address to give to
+ @ the callback handler, but we can initialise it later.
diff --git a/arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-no-armv7-memcpy.p b/arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-no-armv7-memcpy.p
new file mode 100644
index 0000000..c89d6ab
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-no-armv7-memcpy.p
@@ -0,0 +1,34 @@
+Index: libunixlib/Makefile.am
+===================================================================
+--- libunixlib/Makefile.am (revision 7698)
++++ libunixlib/Makefile.am (working copy)
+@@ -1002,18 +1002,11 @@
+ string/strtok.c \
+ string/swab.c \
+ string/_strcpy.s
+-if ARM_EABI
+ string_src += \
+- string/_memcpymove-v7l.s \
+- string/_memset-v7l.s \
+- string/_strlen-v7l.s
+-else
+-string_src += \
+ string/_memcpy.s \
+ string/_memset.s \
+ string/_strlen.s
+ endif
+-endif
+ string_src += \
+ string/memccpy.c \
+ string/memchr.c \
+@@ -1029,10 +1022,8 @@
+ string/strtok_r.c \
+ string/_ffs.s \
+ string/_ffsll.s
+-if !ARM_EABI
+ string_src += \
+ string/mempcpy.c
+-endif
+
+ if UNIXLIB_BUILDING_SCL
+ sys_src =
diff --git a/arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-stdtime.p b/arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-stdtime.p
new file mode 100644
index 0000000..3ad890a
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-stdtime.p
@@ -0,0 +1,17 @@
+Index: libunixlib/time/stdtime.c
+===================================================================
+--- libunixlib/time/stdtime.c (revision 7698)
++++ libunixlib/time/stdtime.c (working copy)
+@@ -23,9 +23,11 @@
+ register const char *str __asm ("r4") = __str;
+ register const _kernel_oserror *err __asm ("r0");
+ register char *term __asm ("r1");
++ register size_t left __asm ("r2");
++ register const char *ostr __asm ("r3");
+ __asm__ volatile ("SWI\t%[SWI_Territory_ConvertDateAndTime]\n\t"
+ "MOVVC\tr0, #0\n\t"
+- : "=r" (err), "=r" (term)
++ : "=r" (err), "=r" (term), "=r" (left), "=r" (ostr)
+ : "r" (territory), "r" (ro_time), "r" (buf), "r" (size), "r" (str),
+ [SWI_Territory_ConvertDateAndTime] "i" (Territory_ConvertDateAndTime | (1<<17))
+ : "r14", "cc", "memory");
diff --git a/arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-sync-and-fetch-atomics.p b/arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-sync-and-fetch-atomics.p
new file mode 100644
index 0000000..f9764ba
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-sync-and-fetch-atomics.p
@@ -0,0 +1,22 @@
+Index: libunixlib/gcccompat/atomics.c
+===================================================================
+--- libunixlib/gcccompat/atomics.c (revision 7698)
++++ libunixlib/gcccompat/atomics.c (working copy)
+@@ -146,8 +146,6 @@
+ ATOMIC_COMPARE_AND_EXCHANGE(4,uint32_t)
+ ATOMIC_COMPARE_AND_EXCHANGE(8,uint64_t)
+
+-#ifndef __ARM_EABI__
+-
+ /* These built-in functions perform the operation suggested by the name,
+ * and return the value that had previously been in *ptr. That is,
+ *
+@@ -200,8 +198,6 @@
+ SYNC_FETCH_AND_OP(xor,^,8,long long)
+ SYNC_FETCH_AND_OP(and,&,8,long long)
+
+-#endif
+-
+ /* These built-in functions perform the operation suggested by the name,
+ * and return the new value. That is,
+ *
diff --git a/arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-unwind.p b/arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-unwind.p
new file mode 100644
index 0000000..9ff54c9
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-unwind.p
@@ -0,0 +1,468 @@
+Index: libunixlib/Makefile.am
+===================================================================
+--- libunixlib/Makefile.am (revision 7698)
++++ libunixlib/Makefile.am (working copy)
+@@ -33,7 +33,7 @@
+ # arguments can not be tested for NULL in UnixLib itself.
+ if ARM_EABI
+ AM_CFLAGS = -D__GNU_LIBRARY__ -DNO_LONG_DOUBLE -D_GNU_SOURCE=1 \
+- -D__UNIXLIB_NO_NONNULL -std=c99 $(LIBM_FLAGS)
++ -D__UNIXLIB_NO_NONNULL -std=c99 -mpoke-function-name -funwind-tables $(LIBM_FLAGS)
+ UNIXLIB_CHUNKED_STACK=0
+ else
+ AM_CFLAGS = -D__GNU_LIBRARY__ -DNO_LONG_DOUBLE -D_GNU_SOURCE=1 \
+Index: libunixlib/signal/_signal.s
+===================================================================
+--- libunixlib/signal/_signal.s (revision 7698)
++++ libunixlib/signal/_signal.s (working copy)
+@@ -352,8 +352,8 @@
+ CHGMODE a1, USR_Mode @ Back to USR mode now we have a stack
+
+ #ifdef __ARM_EABI__
+- STMFD sp!, {v1, v3}
+- ADD fp, sp, #4
++ ANDS v2, sp, #7 @ Align stack
++ SUBEQ sp, sp, #4
+ #else
+ ADR v4, __h_error + 4*3 @ Point at handler name for backtrace
+ STMFD sp!, {v1, v2, v3, v4} @ Setup an APCS-32 stack frame so we
+@@ -758,10 +758,9 @@
+ SWINE XOS_Byte @ This calls our escape handler
+
+ #ifdef __ARM_EABI__
+- LDR a3, [sp, #14*4 + 4] @ saved USR lr
+- LDR a1, [sp, #11*4 + 4] @ saved USR fp
+- STMFD sp!, {a1, a3} @ create signal frame
+- MOV fp, sp @ FIXME: check this with compiler output for similar function
++ MOV a1, sp @ a1 -> register save block
++ ANDS v2, sp, #7
++ SUBNE sp, sp, #4 @ align stack to 8 bytes
+ #else
+ @ Create an APCS-32 compilant signal stack frame
+ ADR a4, __h_cback + 4*3 @ point at handler name for backtrace
+@@ -796,11 +795,12 @@
+ STR a1, [a3, #GBL_EXECUTING_SIGNALHANDLER]
+
+ #ifdef __ARM_EABI__
+- ADD a1, sp, #8 @ Skip signal frame (fp, lr)
++ TEQ v2, #0
++ ADDNE a1, sp, #4 @ Undo stack alignment
+ #else
+ ADD a1, sp, #16 @ Skip signal frame (fp, sp, lr, name ptr)
+ #endif
+- ADD sp, sp, #16+17*4
++ ADD sp, sp, #17*4
+ SWI XOS_EnterOS @ We need to be in SVC mode so reenbling IRQs
+ @ is atomic with returning to USR mode,
+ @ otherwise USR sp could be overwitten by
+Index: libunixlib/signal/post.c
+===================================================================
+--- libunixlib/signal/post.c (revision 7698)
++++ libunixlib/signal/post.c (working copy)
+@@ -255,19 +255,230 @@
+ fprintf (stderr, "\nTermination signal received: %s\n", sys_siglist[signo]);
+ }
+
++static void
++__write_abort_block (const unsigned int *blk, int is32bit)
++{
++ const unsigned int pcmask = is32bit ? 0xfffffffcu : 0x03fffffcu;
++
++ fprintf (stderr, "\n Register dump at %08x:\n", (unsigned int) blk);
++
++ if (!__valid_address (blk, blk + 17))
++ fputs ("\n [bad register dump address]\n", stderr);
++ else
++ {
++ const char rnames[] = "a1a2a3a4v1v2v3v4v5v6slfpipsplrpc";
++ for (int reg = 0; reg < 16; reg++)
++ {
++ if ((reg & 0x3) == 0)
++ fputs ("\n ", stderr);
++
++ fprintf (stderr, " %c%c: %8x",
++ rnames[2*reg + 0], rnames[2*reg + 1], blk[reg + 1]);
++ }
++
++ if (is32bit)
++ fprintf (stderr, "\n cpsr: %8x\n", blk[0]);
++ else
++ {
++ const char * const pmode[4] = { "USR", "FIQ", "IRQ", "SVC" };
++ fprintf (stderr, "\n Mode %s, flags set: %c%c%c%c%c%c\n",
++ pmode[blk[15 + 1] & 3],
++ (blk[15 + 1] & (1<<31)) ? 'N' : 'n',
++ (blk[15 + 1] & (1<<30)) ? 'Z' : 'z',
++ (blk[15 + 1] & (1<<29)) ? 'C' : 'c',
++ (blk[15 + 1] & (1<<28)) ? 'V' : 'v',
++ (blk[15 + 1] & (1<<27)) ? 'I' : 'i',
++ (blk[15 + 1] & (1<<26)) ? 'F' : 'f');
++ }
++
++ unsigned int *pc = (unsigned int *) (blk[15 + 1] & pcmask);
++
++ /* Try LR if PC invalid (e.g. with a prefetch abort). */
++ if (pc < (unsigned int *)0x8000 || !__valid_address (pc - 5, pc + 4))
++ pc = (unsigned int *) (blk[14 + 1] & pcmask);
++
++ if (pc >= (unsigned int *)0x8000 && __valid_address (pc - 5, pc + 4))
++ {
++ for (unsigned int *diss = pc - 5; diss < pc + 4; diss++)
++ {
++ const char *ins;
++ int length;
++ _swix (Debugger_Disassemble, _INR(0,1) | _OUTR(1,2),
++ *diss, diss, &ins, &length);
++
++ const unsigned char c[4] =
++ {
++ (*diss >> 0) & 0xFF,
++ (*diss >> 8) & 0xFF,
++ (*diss >> 16) & 0xFF,
++ (*diss >> 24)
++ };
++ fprintf (stderr, "\n %08x : %c%c%c%c : %08x : ",
++ (unsigned int) diss,
++ (c[0] >= ' ' && c[0] != 127) ? c[0] : '.',
++ (c[1] >= ' ' && c[1] != 127) ? c[1] : '.',
++ (c[2] >= ' ' && c[2] != 127) ? c[2] : '.',
++ (c[3] >= ' ' && c[3] != 127) ? c[3] : '.',
++ *diss);
++ fwrite (ins, length, 1, stderr);
++ }
++ }
++ else
++ fputs ("\n [Disassembly not available]", stderr);
++ }
++
++ fputs ("\n\n", stderr);
++}
++
+ /* Clang and GCC do not have compatible frame pointers. */
+ #ifdef __clang__
+ #define FP_OFFSET (0)
+ #define LR_OFFSET (1)
+-#elif defined (__ARM_EABI__)
+-#define FP_OFFSET (-1)
+-#define LR_OFFSET (0)
+ #else
+ #define LR_OFFSET (-1)
+ #define FP_OFFSET (-3)
+ #endif
+
++#ifdef __ARM_EABI__
++/**
++ * AAPCS does not require the compiler to construct a backtrace structure
++ * in the stack (unlike APCS, which does). This results in FP rarely pointing
++ * at any form of valid stack frame (and, to complicate matters, at the time
++ * of writing, some frames end up with APCS-format frame records, anyway)
++ * which makes it nigh-on impossible to reliably unwind the stack without
++ * additional information). FP is thus often treated as an additional
++ * callee-saved register (i.e. v8) in AAPCS-conformant code.
++ *
++ * Additionally, where frame records are generated, AAPCS has them contain
++ * two entries: previous-FP and LR on entry. There is therefore (unlike APCS)
++ * no way of finding the function entry point from the frame record at all,
++ * even if it did exist.
++ *
++ * So, we cannot trust that FP ever points at a valid stack frame record and
++ * we cannot find function entry points to extract poked function names from.
++ * We can, however, make stack unwinding work if we have some means of
++ * identifying the function in which an arbitrary instruction lies.
++ *
++ * -funwind-tables will result in clang/GCC generating such a data structure,
++ * (an array between __exidx_start and __exidx_end) which will be consulted
++ * by _Unwind_Backtrace() when unwinding the stack.
++ */
++
++#include <unwind.h>
++
++typedef struct {
++ const unsigned int *regs;
++ const unsigned int *last_fn;
++} ul_unwind_ctx;
++
++static void __attribute__((naked))
++__do_unwind (_Unwind_Trace_Fn fn, const void *pw)
++{
++ __asm volatile(
++ "stmfd sp!, {fp, lr};"
++ "add fp, sp, #4;"
++ /* Registers at this point in time will be the initial state.
++ * The trace function must unwind the stack frame we just created
++ * because the personality function will be told there is nothing
++ * to do as we are declared naked.
++ */
++ "bl _Unwind_Backtrace;"
++ "ldmfd sp!, {fp, pc};"
++ );
++}
++
++static _Unwind_Reason_Code
++__write_backtrace_cb (_Unwind_Context *ctx, void *pw)
++{
++ ul_unwind_ctx *uctx = pw;
++ _Unwind_Control_Block *ucbp = NULL;
++ const unsigned int *fn;
++
++ ucbp = (_Unwind_Control_Block *) _Unwind_GetGR(ctx, UNWIND_POINTER_REG);
++ fn = (const unsigned int *) ucbp->pr_cache.fnstart;
++
++ uctx->last_fn = fn;
++
++ if (fn == (const unsigned int *) __do_unwind)
++ {
++ /* First call */
++ if (uctx->regs == NULL)
++ {
++ /* Running thread: unwind on behalf of __do_unwind */
++ _Unwind_VRS_Pop (ctx, _UVRSC_CORE, (1<<11)|(1<<14), _UVRSD_UINT32);
++ }
++ else
++ {
++ /* Thread backtrace: replace entire VRS */
++ int idx;
++ for (idx = 16; idx > 0; idx--)
++ _Unwind_SetGR (ctx, idx - 1, uctx->regs[idx - 1]);
++ }
++
++ return _URC_NO_REASON;
++ }
++
++ fprintf (stderr, " (%8x) fn: %8x pc: %8x sp: %8x ",
++ _Unwind_GetGR (ctx, 11), (unsigned int)fn, _Unwind_GetIP (ctx),
++ _Unwind_GetGR (ctx, 13));
++
++#if PIC
++ /* FIXME: extend this with source location when available. */
++ const char *lib = NULL;
++ unsigned offset;
++ _swix(SOM_Location,
++ _IN(0) | _OUTR(0,1), _Unwind_GetIP (ctx), &lib, &offset);
++ if (lib)
++ fprintf(stderr, " : %8X : %s\n", offset, lib);
++ else
++#endif
++ {
++ int cplusplus_name;
++ const char *name = extract_name (fn, &cplusplus_name);
++ fprintf (stderr, (cplusplus_name) ? " %s\n" : " %s()\n", name);
++ }
++
++ return _URC_NO_REASON;
++}
++
+ static void
++__write_backtrace_thread (const unsigned int *regs)
++{
++ ul_unwind_ctx ctx;
++
++ /* First pass: dump trace for stack as provided */
++ ctx.regs = regs;
++ ctx.last_fn = NULL;
++ __do_unwind (__write_backtrace_cb, &ctx);
++
++ /* If we got here via an environment handler, there may be a saved abort
++ * block to look at. We only want to look if the first pass terminated with
++ * __unixlib_raise_signal (being the entry point to all this unwind logic
++ * from the environment handlers) -- if the first pass terminated somewhere
++ * else, then it is likely that we have been invoked directly via raise(),
++ * and so the presence or otherwise of an abort block is irrelevant.
++ *
++ * If an abort block is available, it will be pointed at by the
++ * (misnamed for EABI) __ul_callbackfp; if not __ul_callbackfp will be NULL.
++ * Additionally, we only want to consider the abort block if we're dumping
++ * the running thread, so check for regs being NULL to identify that.
++ */
++ if (__ul_callbackfp != NULL && regs == NULL
++ && ctx.last_fn == (unsigned int *) __unixlib_raise_signal)
++ {
++ /* Abort block: cpsr, r0-r15. */
++ __write_abort_block (__ul_callbackfp, /* is32bit= */ 1);
++
++ /* Dump remaining trace from block (skipping over saved CPSR) */
++ ctx.regs = __ul_callbackfp + 1;
++ ctx.last_fn = NULL;
++ __do_unwind (__write_backtrace_cb, &ctx);
++ }
++
++ fputc ('\n', stderr);
++}
++#else
++static void
+ __write_backtrace_thread (const unsigned int *fp)
+ {
+ /* Running as USR26 or USR32 ? */
+@@ -306,22 +517,6 @@
+ break;
+ }
+
+-#ifdef __ARM_EABI__
+- const unsigned int * const lr = (unsigned int *)fp[LR_OFFSET];
+- fprintf (stderr, " (%8x) lr: %8x",
+- (unsigned int)fp, (unsigned int)lr);
+-#if PIC
+- /* FIXME: extend this with source location when available. */
+- const char *lib = NULL;
+- unsigned offset;
+- _swix(SOM_Location,
+- _IN(0) | _OUTR(0,1), lr, &lib, &offset);
+- if (lib)
+- fprintf(stderr, " : %8X : %s\n", offset, lib);
+- else
+-#endif
+- fputc('\n', stderr);
+-#else
+ /* Retrieve PC counter.
+ PC counter has been saved using STMxx ..., { ..., PC } so it can be
+ 8 or 12 bytes away from the STMxx instruction depending on the ARM
+@@ -347,96 +542,24 @@
+ int cplusplus_name;
+ const char *name = extract_name (pc, &cplusplus_name);
+ fprintf (stderr, (cplusplus_name) ? " %s\n" : " %s()\n", name);
+-#endif
++
+ oldfp = fp;
+ fp = (const unsigned int *)fp[FP_OFFSET];
+-#ifndef __ARM_EABI__
+ if (__ul_callbackfp != NULL && fp == __ul_callbackfp)
+ {
+ /* At &oldfp[1] = cpsr, a1-a4, v1-v6, sl, fp, ip, sp, lr, pc */
+- fprintf (stderr, "\n Register dump at %08x:\n",
+- (unsigned int) &oldfp[1]);
+-
+- if (!__valid_address (oldfp + 1, oldfp + 18))
+- fputs ("\n [bad register dump address]\n", stderr);
+- else
+- {
+- const char rnames[] = "a1a2a3a4v1v2v3v4v5v6slfpipsplrpc";
+- for (int reg = 0; reg < 16; reg++)
+- {
+- if ((reg & 0x3) == 0)
+- fputs ("\n ", stderr);
+-
+- fprintf (stderr, " %c%c: %8x",
+- rnames[2*reg + 0], rnames[2*reg + 1], oldfp[reg + 2]);
+- }
+-
+- if (is32bit)
+- fprintf (stderr, "\n cpsr: %8x\n", oldfp[1]);
+- else
+- {
+- const char * const pmode[4] = { "USR", "FIQ", "IRQ", "SVC" };
+- fprintf (stderr, "\n Mode %s, flags set: %c%c%c%c%c%c\n",
+- pmode[oldfp[15 + 2] & 3],
+- (oldfp[15 + 2] & (1<<31)) ? 'N' : 'n',
+- (oldfp[15 + 2] & (1<<30)) ? 'Z' : 'z',
+- (oldfp[15 + 2] & (1<<29)) ? 'C' : 'c',
+- (oldfp[15 + 2] & (1<<28)) ? 'V' : 'v',
+- (oldfp[15 + 2] & (1<<27)) ? 'I' : 'i',
+- (oldfp[15 + 2] & (1<<26)) ? 'F' : 'f');
+- }
+-
+- pc = (unsigned int *) (oldfp[17] & pcmask);
+-
+- /* Try LR if PC invalid (e.g. with a prefetch abort). */
+- if (pc < (unsigned int *)0x8000 || !__valid_address (pc - 5, pc + 4))
+- pc = (unsigned int *) (oldfp[16] & pcmask);
+-
+- if (pc >= (unsigned int *)0x8000 && __valid_address (pc - 5, pc + 4))
+- {
+- for (unsigned int *diss = pc - 5; diss < pc + 4; diss++)
+- {
+- const char *ins;
+- int length;
+- _swix (Debugger_Disassemble, _INR(0,1) | _OUTR(1,2),
+- *diss, diss, &ins, &length);
+-
+- const unsigned char c[4] =
+- {
+- (*diss >> 0) & 0xFF,
+- (*diss >> 8) & 0xFF,
+- (*diss >> 16) & 0xFF,
+- (*diss >> 24)
+- };
+- fprintf (stderr, "\n %08x : %c%c%c%c : %08x : ",
+- (unsigned int) diss,
+- (c[0] >= ' ' && c[0] != 127) ? c[0] : '.',
+- (c[1] >= ' ' && c[1] != 127) ? c[1] : '.',
+- (c[2] >= ' ' && c[2] != 127) ? c[2] : '.',
+- (c[3] >= ' ' && c[3] != 127) ? c[3] : '.',
+- *diss);
+- fwrite (ins, length, 1, stderr);
+- }
+- }
+- else
+- fputs ("\n [Disassembly not available]", stderr);
+- }
+-
+- fputs ("\n\n", stderr);
++ __write_abort_block (&oldfp[1], is32bit);
+ }
+-#endif
+ }
+
+ fputc ('\n', stderr);
+ }
++#endif
+
+-
+ void
+ __write_backtrace (int signo)
+ {
+-#ifdef __ARM_EABI__
+- register const unsigned int *fp = __builtin_frame_address(0);
+-#else
++#ifndef __ARM_EABI__
+ register const unsigned int *fp __asm ("fp");
+ #endif
+
+@@ -485,7 +608,11 @@
+ /* Dump first the details of the current thread. */
+ fprintf (stderr, "Stack backtrace:\n\nRunning thread %p (%s)\n",
+ __pthread_running_thread, __pthread_running_thread->name);
++#ifdef __ARM_EABI__
++ __write_backtrace_thread (NULL);
++#else
+ __write_backtrace_thread (fp);
++#endif
+
+ /* And then the other suspended threads if any. */
+ for (pthread_t th = __pthread_thread_list; th != NULL; th = th->next)
+@@ -494,7 +621,10 @@
+ continue;
+
+ fprintf (stderr, "\nThread %p (%s)\n", th, th->name);
+-#ifdef __clang__
++#ifdef __ARM_EABI__
++ __write_backtrace_thread (&th->saved_context->r[0]);
++#else
++# ifdef __clang__
+ const unsigned int fakestackframe[] =
+ {
+ (unsigned int)th->saved_context->r[11],
+@@ -501,22 +631,16 @@
+ (unsigned int)th->saved_context->r[14]
+ };
+ __write_backtrace_thread (&fakestackframe[0]);
+-#elif defined (__ARM_EABI__)
++# else
+ const unsigned int fakestackframe[] =
+ {
+ (unsigned int)th->saved_context->r[11],
+- (unsigned int)th->saved_context->r[14]
+- };
+- __write_backtrace_thread (&fakestackframe[1]);
+-#else
+- const unsigned int fakestackframe[] =
+- {
+- (unsigned int)th->saved_context->r[11],
+ (unsigned int)th->saved_context->r[13],
+ (unsigned int)th->saved_context->r[14],
+ (unsigned int)th->saved_context->r[15]
+ };
+ __write_backtrace_thread (&fakestackframe[3]);
++# endif
+ #endif
+ }
+ }
diff --git a/arm-riscos-gnueabi/recipes/patches/infozip/globals.p b/arm-riscos-gnueabi/recipes/patches/infozip/globals.p
new file mode 100644
index 0000000..c10adfa
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/infozip/globals.p
@@ -0,0 +1,13 @@
+--- globals.c.orig 2005-03-20 12:32:02.000000000 -0800
++++ globals.c 2008-01-12 22:45:07.000000000 -0800
+@@ -30,6 +30,10 @@
+ int pathput = 1; /* 1=store path with name */
+ #ifdef RISCOS
+ int scanimage = 1; /* 1=scan through image files */
++#else
++#ifdef FORRISCOS
++int decomma = 0;
++#endif
+ #endif
+ int method = BEST; /* one of BEST, DEFLATE (only), or STORE (only) */
+ int dosify = 0; /* 1=make new entries look like MSDOS */
diff --git a/arm-riscos-gnueabi/recipes/patches/infozip/zip.p b/arm-riscos-gnueabi/recipes/patches/infozip/zip.p
new file mode 100644
index 0000000..aee2b24
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/infozip/zip.p
@@ -0,0 +1,58 @@
+--- zip.c.orig 2009-05-07 11:54:09.000000000 +0100
++++ zip.c 2009-05-07 11:53:08.000000000 +0100
+@@ -668,6 +668,9 @@
+ ," -h2 show more help -I don't scan thru Image files"
+ #else
+ ," -h2 show more help"
++#ifdef FORRISCOS
++," -, strip ,xxx from filename and convert to RISCOS filetype encoding"
++#endif
+ #endif
+ #endif /* ?MACOS */
+ #ifdef VMS
+@@ -1144,6 +1147,9 @@
+ #if CRYPT && defined(PASSWD_FROM_STDIN)
+ "PASSWD_FROM_STDIN",
+ #endif /* CRYPT & PASSWD_FROM_STDIN */
++#ifdef FORRISCOS
++ "FORRISCOS",
++#endif
+ NULL
+ };
+
+@@ -2109,6 +2115,9 @@
+ #ifdef RISCOS
+ {"/", "exts-to-swap", o_REQUIRED_VALUE, o_NOT_NEGATABLE, '/', "override Zip$Exts"},
+ #endif
++#ifdef FORRISCOS
++ {",", "strip-type", o_NO_VALUE, o_NOT_NEGATABLE, ',', "strip ,xxx extension"},
++#endif
+ /* the end of the list */
+ {NULL, NULL, o_NO_VALUE, o_NOT_NEGATABLE, 0, NULL} /* end has option_ID = 0 */
+ };
+@@ -2847,6 +2856,12 @@
+ case 'I': /* Don't scan through Image files */
+ scanimage = 0;
+ break;
++#else
++#ifdef FORRISCOS
++ case ',': /* Convert ,xxx to RISC OS extended filetype info */
++ decomma = 1;
++ break;
++#endif
+ #endif
+ #ifdef MACOS
+ case o_jj: /* store absolute path including volname */
+--- zip.h.org 2008-01-12 22:56:51.000000000 -0800
++++ zip.h 2008-01-12 23:00:05.000000000 -0800
+@@ -323,6 +323,10 @@
+
+ #ifdef RISCOS
+ extern int scanimage; /* Scan through image files */
++#else
++#ifdef FORRISCOS
++extern int decomma; /* Convert ,xxx filename to RISC OS filetype info */
++#endif
+ #endif
+
+ #define BEST -1 /* Use best method (deflation or store) */
diff --git a/arm-riscos-gnueabi/recipes/patches/infozip/zipup.p b/arm-riscos-gnueabi/recipes/patches/infozip/zipup.p
new file mode 100644
index 0000000..f4d43d0
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/infozip/zipup.p
@@ -0,0 +1,162 @@
+--- zipup.c.orig 2008-01-12 22:29:14.000000000 -0800
++++ zipup.c 2008-01-12 22:36:00.000000000 -0800
+@@ -139,6 +139,9 @@
+ #else
+ local int filetypes OF((char *, char *));
+ #endif
++#ifdef FORRISCOS
++ local int set_extra_field_forriscos OF((struct zlist far *z, iztimes *z_utim));
++#endif
+ local unsigned file_read OF((char *buf, unsigned size));
+ #ifdef USE_ZLIB
+ local int zl_deflate_init OF((int pack_level));
+@@ -379,7 +382,133 @@
+ }
+ #endif /* ?RISCOS */
+
++#ifdef FORRISCOS
++
++int set_extra_field_forriscos(z, z_utim)
++ struct zlist far *z;
++ iztimes *z_utim;
++{
++#ifdef USE_EF_UT_TIME
++ char *eb_ptr;
++#endif /* USE_EF_UT_TIME */
++ char *cptr;
++ char *extra_block;
++ unsigned int addr;
++ unsigned int ftype = 0xfff; /* Untyped files default to 'text' */
++ unsigned timlo; /* 3 lower bytes of acorn file-time plus carry byte */
++ unsigned timhi; /* 2 high bytes of acorn file-time */
++
++#define EB_SPARK_LEN 20
++#define EB_SPARK_SIZE (EB_HEADSIZE+EB_SPARK_LEN)
++#ifdef USE_EF_UT_TIME
++# ifdef IZ_CHECK_TZ
++# define EB_UTTIME_SIZE (zp_tz_is_valid ? EB_HEADSIZE+EB_UT_LEN(1) : 0)
++# else
++# define EB_UTTIME_SIZE (EB_HEADSIZE+EB_UT_LEN(1))
++# endif
++#else
++# define EB_UTTIME_SIZE 0
++#endif
++#define EF_SPARK_TOTALSIZE (EB_SPARK_SIZE + EB_UTTIME_SIZE)
++
++ cptr=strrchr(z->iname, (int) ',');
++ if (cptr)
++ if ((cptr - z->iname) != (int)(strlen(z->iname)-4))
++ cptr = NULL; /* There was a comma, but it wasn't a ,xxx at the end! */
++
++ if (cptr)
++ {
++ *cptr='\0'; /* Chop the filename at the comma */
++
++ ftype = strtol(cptr+1, NULL, 16); /* read the ,xxx as hex filetype */
++ }
++ else
++ {
++ /* When there is no given filetype, but there is a full stop in the name,
++ then it is better to let the unzip utility in RISC OS do a MimeMap lookup
++ instead, and therefore do nothing here */
++ if (strchr(z->iname, '.'))
++ return ZE_OK;
++ }
++
++ z->extra=(char *)malloc(EF_SPARK_TOTALSIZE);
++ if (z->extra==NULL) {
++ fprintf(stderr," set_extra_field_forriscos: not enough memory\n");
++ return ZE_MEM;
++ }
++ z->cextra = z->extra;
++ z->cext = z->ext = EF_SPARK_TOTALSIZE;
++
++ timlo = ((unsigned)z_utim->mtime & 0x00ffffffU) * 100 + 0x00996a00U;
++ timhi = ((unsigned)z_utim->mtime >> 24);
++ timhi = timhi * 100 + 0x0000336eU + (timlo >> 24);
++
++ extra_block=z->extra;
++ /* ID */
++ extra_block[0]='A';
++ extra_block[1]='C';
++
++ /* size */
++ extra_block[2]=(char)(EB_SPARK_LEN);
++ extra_block[3]=(char)(EB_SPARK_LEN)>>8;
++
++ /* ID_2 */
++ extra_block[4]='A';
++ extra_block[5]='R';
++ extra_block[6]='C';
++ extra_block[7]='0';
++
++ /* Load address */
++ addr=0xfff00000 | (ftype << 8); /* This file is typed, and has filetype 'ftype' */
++ addr|= ((timhi >> 8) & 0xffU);
++ extra_block[8]=(char)(addr);
++ extra_block[9]=(char)(addr>>8);
++ extra_block[10]=(char)(addr>>16);
++ extra_block[11]=(char)(addr>>24);
++
++ /* Exec address */
++ addr=(timlo & 0x00ffffffU) | ((timhi & 0x000000ffU) << 24);
++ extra_block[12]=(char)(addr);
++ extra_block[13]=(char)(addr>>8);
++ extra_block[14]=(char)(addr>>16);
++ extra_block[15]=(char)(addr>>24);
++
++ /* Attributes */
++ extra_block[16]=0x13; /* Private read/write, no public access, unlocked */
++ extra_block[17]=0;
++ extra_block[18]=0;
++ extra_block[19]=0;
++
++ /* Zero */
++ extra_block[20]=0;
++ extra_block[21]=0;
++ extra_block[22]=0;
++ extra_block[23]=0;
++
++#ifdef USE_EF_UT_TIME
++# ifdef IZ_CHECK_TZ
++ if (zp_tz_is_valid) {
++# endif
++ eb_ptr = z->extra + EB_SPARK_SIZE;
++
++ eb_ptr[0] = 'U';
++ eb_ptr[1] = 'T';
++ eb_ptr[2] = EB_UT_LEN(1); /* length of data part of e.f. */
++ eb_ptr[3] = 0;
++ eb_ptr[4] = EB_UT_FL_MTIME;
++ eb_ptr[5] = (char)(z_utim->mtime);
++ eb_ptr[6] = (char)(z_utim->mtime >> 8);
++ eb_ptr[7] = (char)(z_utim->mtime >> 16);
++ eb_ptr[8] = (char)(z_utim->mtime >> 24);
++# ifdef IZ_CHECK_TZ
++ }
++# endif
++#endif /* USE_EF_UT_TIME */
++
++ return ZE_OK;
++}
+
++#endif /* FORRISCOS */
+
+ /* Note: a zip "entry" includes a local header (which includes the file
+ name), an encryption header if encrypting, the compressed data
+@@ -552,6 +681,15 @@
+ #if !(defined(VMS) && defined(VMS_PK_EXTRA))
+ if (extra_fields) {
+ /* create extra field and change z->att and z->atx if desired */
++#ifdef FORRISCOS
++ if (decomma)
++ {
++ /* If we're making a zip for RISC OS, we don't bother with any other */
++ /* OS-Specific info (although we could - but there's no point!) */
++ set_extra_field_forriscos(z, &f_utim);
++ }
++ else
++#endif
+ set_extra_field(z, &f_utim);
+ # ifdef QLZIP
+ if(qlflag)
diff --git a/arm-riscos-gnueabi/recipes/patches/oslib/buildsystem-elfeabi.p b/arm-riscos-gnueabi/recipes/patches/oslib/buildsystem-elfeabi.p
new file mode 100644
index 0000000..83bd862
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/oslib/buildsystem-elfeabi.p
@@ -0,0 +1,144 @@
+Index: Source/Makefile
+===================================================================
+--- Source/Makefile (revision 477)
++++ Source/Makefile (working copy)
+@@ -3,8 +3,8 @@
+ # already be built upfront.
+ # Written by OSLib Development Team.
+
+-# Build type: CROSSGCC_AOF, CROSSGCC_ELF (default), [NORCROFT_AOF: not
+-# supported yet]
++# Build type: CROSSGCC_AOF, CROSSGCC_ELF (default), CROSSGCC_ELFEABI,
++# [NORCROFT_AOF: not supported yet]
+ export BUILDTYPE ?= CROSSGCC_ELF
+ # Possible values: "SOFTFPU" (e.g. for UnixLib usage), "HARDFPU" (e.g. for
+ # SharedCLibrary usage) and "MODULE" (latter also meaning HARDFPU but the
+@@ -12,9 +12,10 @@
+ export ELFOBJECTTYPE ?= SOFTFPU
+
+ ifeq ($(BUILDTYPE),CROSSGCC_ELF)
++else ifeq ($(BUILDTYPE),CROSSGCC_ELFEABI)
+ else ifeq ($(BUILDTYPE),CROSSGCC_AOF)
+ else
+-$(error Unknown BUILDTYPE value, possible values are CROSSGCC_AOF and CROSSGCC_ELF)
++$(error Unknown BUILDTYPE value, possible values are CROSSGCC_AOF, CROSSGCC_ELF, and CROSSGCC_ELFEABI)
+ endif
+ include Makefile.setup.$(BUILDTYPE)
+
+Index: Source/Makefile.inc
+===================================================================
+--- Source/Makefile.inc (revision 477)
++++ Source/Makefile.inc (working copy)
+@@ -65,6 +65,9 @@
+ ifeq ($(BUILDTYPE),CROSSGCC_ELF)
+ .ELFHdr.Hdr:
+ if [ -s "$<" ]; then $(CP) $< $@; fi
++else ifeq ($(BUILDTYPE),CROSSGCC_ELFEABI)
++.ELFHdr.Hdr:
++ if [ -s "$<" ]; then $(CP) $< $@; fi
+ else
+ .AOFHdr.Hdr:
+ if [ -s "$<" ]; then $(CP) $< $@; fi
+@@ -98,6 +101,9 @@
+ ifeq ($(BUILDTYPE),CROSSGCC_ELF)
+ .gas.o:
+ $(AS) -o $@ $<
++else ifeq ($(BUILDTYPE),CROSSGCC_ELFEABI)
++.gas.o:
++ $(AS) -o $@ $<
+ else
+ .asm.o:
+ $(AS) -o $@ $<
+Index: Source/Makefile.setup.CROSSGCC_ELFEABI
+===================================================================
+--- Source/Makefile.setup.CROSSGCC_ELFEABI (nonexistent)
++++ Source/Makefile.setup.CROSSGCC_ELFEABI (working copy)
+@@ -0,0 +1,62 @@
++# Settings for ELF building
++
++ifndef GCCSDK_INSTALL_CROSSBIN
++$(error Environment variable GCCSDK_INSTALL_CROSSBIN is not defined)
++endif
++ifndef GCCSDK_INSTALL_ENV
++$(error Environment variable GCCSDK_INSTALL_ENV is not defined)
++endif
++
++ifeq ($(ELFOBJECTTYPE),SOFTFPU)
++CCFLAGS = -mfloat-abi=soft
++DEFMODFLAGS = -float-abi soft
++else ifeq ($(ELFOBJECTTYPE),HARDFPU)
++CCFLAGS = -mlibscl
++DEFMODFLAGS = -float-abi hard
++else ifeq ($(ELFOBJECTTYPE),MODULE)
++CCFLAGS = -mmodule
++DEFMODFLAGS = -float-abi hard
++else
++$(error Unknown ELFOBJECTTYPE value, possible values are SOFTFPU, HARDFPU and MODULE)
++endif
++
++export SOURCEDIR := $(abspath .)
++export BINDIR := $(SOURCEDIR)/../Bin
++export BUILDDIR := $(SOURCEDIR)/../Build
++export RELEASEDIR := $(SOURCEDIR)/../Release
++export RELEASEBINDIR := $(SOURCEDIR)/../Release/$(BUILDTYPE)/$(ELFOBJECTTYPE)
++export EXAMPLESDIR := $(SOURCEDIR)/../examples
++export DOCSDIR := $(SOURCEDIR)/../docs
++
++export TOPHEADERDIR := $(BUILDDIR)/Header
++export HEADERDIR := $(TOPHEADERDIR)/oslib
++export CSTRONGDIR := $(BUILDDIR)/CStrong
++export VAPIDIR := $(BUILDDIR)/\!Vala/vapi
++export VAPIHDIR := $(BUILDDIR)/vapih
++export OBJDIR := $(BUILDDIR)/Objs
++export OBJEXCEPTDIR := $(BUILDDIR)/Objs/Exceptions
++export OSLIBSUPPORTDIR := $(BUILDDIR)/OSLibSupport
++
++export BYTEWIDE := $(SOURCEDIR)/ByteWide
++export DEFMOD := $(BINDIR)/defmod -asmtype gccelfeabi $(DEFMODFLAGS)
++export REDUCEAOF := @echo Not needed for ELF build: reduceaof
++export BINDHELP := $(BINDIR)/bindhelp
++
++export PATH := $(GCCSDK_INSTALL_CROSSBIN):$(PATH)
++
++export CC := arm-riscos-gnueabi-gcc $(CCFLAGS)
++export CXX := arm-riscos-gnueabi-g++ $(CCFLAGS)
++export AS := arm-riscos-gnueabi-gcc -c -xassembler-with-cpp $(CCFLAGS) -I.. -I$(SOURCEDIR)/Types
++export LIBFILE := arm-riscos-gnueabi-ar rs
++export MKDIR := mkdir -p
++export RM := rm -rf
++export CP := cp -r
++export INSTALL := $(GCCSDK_INSTALL_ENV)/ro-install
++
++export ASMEXT := .gas
++export EXEEXT := ,e1f
++export LIBSUFFIX := a
++
++export OSLIBLIB := $(BUILDDIR)/libOSLib32.$(LIBSUFFIX)
++export OSLIBSUPPORTLIB := $(OSLIBSUPPORTDIR)/libOSLibSupport32.$(LIBSUFFIX)
++export OSLIBCSTRONG := $(BUILDDIR)/OSLib,3d6
+Index: Makefile
+===================================================================
+--- Makefile (revision 477)
++++ Makefile (working copy)
+@@ -29,6 +29,10 @@
+ install-elf: oslib-elf
+ $(MAKE) -C Source install BUILDTYPE=CROSSGCC_ELF
+
++# Installs the ELF headers & library in GCCSDK environment.
++install-elfeabi: oslib-elfeabi
++ $(MAKE) -C Source install BUILDTYPE=CROSSGCC_ELFEABI
++
+ # Installs the AOF headers & library in GCCSDK environment.
+ install-aof: oslib-aof
+ $(MAKE) -C Source install BUILDTYPE=CROSSGCC_AOF
+@@ -49,6 +53,10 @@
+ $(MAKE) -C Source oslib BUILDTYPE=CROSSGCC_ELF
+ $(MAKE) -C Source oslibsupport BUILDTYPE=CROSSGCC_ELF
+
++oslib-elfeabi: tools
++ $(MAKE) -C Source oslib BUILDTYPE=CROSSGCC_ELFEABI
++ $(MAKE) -C Source oslibsupport BUILDTYPE=CROSSGCC_ELFEABI
++
+ vapis: tools
+ $(MAKE) -C Source vapis BUILDTYPE=CROSSGCC_ELF
+
diff --git a/arm-riscos-gnueabi/recipes/patches/oslib/defmod-elfeabi.p b/arm-riscos-gnueabi/recipes/patches/oslib/defmod-elfeabi.p
new file mode 100644
index 0000000..eadeb6d
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/oslib/defmod-elfeabi.p
@@ -0,0 +1,84 @@
+Index: Tools/DefMod2/assembler.c
+===================================================================
+--- Tools/DefMod2/assembler.c (revision 477)
++++ Tools/DefMod2/assembler.c (working copy)
+@@ -1242,6 +1242,21 @@
+ goto finish;
+ break;
+ }
++ case AsmType_eGCCELFEABI:
++ {
++ const char *floatABI = (FloatABI == FloatABI_eSoft) ? "soft" : "hard";
++ if (!apcs32)
++ {
++ fprintf(stderr, "EABI does not support APCS-26.");
++ goto finish;
++ }
++ if ((rc = sprintf (cmd,
++ "arm-riscos-gnueabi-gcc -c -xassembler -mfloat-abi=%s -o %s %s",
++ floatABI,
++ name2, name1)) < 0)
++ goto finish;
++ break;
++ }
+ default:
+ fprintf (stderr, "Unknown assembler type\n");
+ goto finish;
+Index: Tools/DefMod2/assembler.h
+===================================================================
+--- Tools/DefMod2/assembler.h (revision 477)
++++ Tools/DefMod2/assembler.h (working copy)
+@@ -22,8 +22,9 @@
+ AsmType_eGCCAOF, /* Assembler used in GCCSDK 3.4 (AOF) release, called
+ 'as' (predecessor of AsAsm). */
+ AsmType_eARMASM, /* ARM's assembler. */
+- AsmType_eGCCELF /* Assembler used in GCCSDK 4 (ELF) release, called
++ AsmType_eGCCELF, /* Assembler used in GCCSDK 4 (ELF) release, called
+ 'gas' (GNU binutils assembler). */
++ AsmType_eGCCELFEABI /* Assembler used in EABI-capable GCCSDK */
+ } AsmType_e;
+
+ typedef enum
+@@ -37,7 +38,7 @@
+ extern AsmType_e AsmType;
+ extern FloatABI_e FloatABI;
+
+-#define GASSyntax (AsmType == AsmType_eGCCELF)
++#define GASSyntax (AsmType == AsmType_eGCCELF || AsmType == AsmType_eGCCELFEABI)
+
+ /*if |separate|, output is to the directory |output|; otherwise, to the file |file|.*/
+ extern os_error *assembler_output (FILE *file, const char *title, const char *author, lookup_t types, lookup_t swis, osbool separate, osbool apcs32, char *output);
+Index: Tools/DefMod2/defmod.y
+===================================================================
+--- Tools/DefMod2/defmod.y (revision 477)
++++ Tools/DefMod2/defmod.y (working copy)
+@@ -1179,7 +1179,7 @@
+ "[-o <output-dir> | > <output-file>] "
+ "[-byte_wide <byte-wide-file>] "
+ "[-26bit | -32bit] "
+- "[-asmtype [objasm | asasmaof | asasmelf | gccaof | armasm | gccelf]] "
++ "[-asmtype [objasm | asasmaof | asasmelf | gccaof | armasm | gccelf | gccelfeabi]] "
+ "[-float-abi [soft | hard]] "
+ "< <module-interface-file>\r"
+ "Purpose: generate output from a module interface file\r"
+@@ -1203,6 +1203,7 @@
+ "\tgccaof\t\t" "...use GCC AOF toolkit (GCCSDK 3.4 only)\r"
+ "\tarmasm\t\t" "...use ARM ASM\r"
+ "\tgccelf\t\t" "...use GCC ELF toolkit (GCCSDK 4 only)\r"
++ "\tgccelfeabi\t\t" "...use GCC EABI ELF toolkit (GCCSDK 8+ only)\r"
+ "-float-abi\t\t" "marks object files which float-abi is in use\r"
+ "\tsoft\t\t" "...soft-float, no FP instructions used\r"
+ "\thard\t\t" "...hard-float, FP instructions can be used\r"
+@@ -1345,9 +1346,11 @@
+ AsmType = AsmType_eARMASM;
+ else if (strcmp (argv[i], "gccelf") == 0)
+ AsmType = AsmType_eGCCELF;
++ else if (strcmp (argv[i], "gccelfeabi") == 0)
++ AsmType = AsmType_eGCCELFEABI;
+ else
+ {
+- fprintf (stderr, "Unknown option value %s for -asmtype (only \"objasm\", \"asasmaof\", \"asasmelf\", \"armarm\", \"gccaof\" and \"gccelf\" are known)\n", argv[i]);
++ fprintf (stderr, "Unknown option value %s for -asmtype (only \"objasm\", \"asasmaof\", \"asasmelf\", \"armarm\", \"gccaof\", \"gccelf\" and \"gccelfeabi\" are known)\n", argv[i]);
+ Parse_Error = TRUE;
+ goto finish;
+ }
diff --git a/arm-riscos-gnueabi/recipes/patches/oslib/vapi.p b/arm-riscos-gnueabi/recipes/patches/oslib/vapi.p
new file mode 100644
index 0000000..a3daf40
--- /dev/null
+++ b/arm-riscos-gnueabi/recipes/patches/oslib/vapi.p
@@ -0,0 +1,10 @@
+--- Tools/DefMod2/vapi.c.orig 2017-09-19 11:57:15.559547484 +0100
++++ Tools/DefMod2/vapi.c 2017-09-19 11:57:31.067750029 +0100
+@@ -23,6 +23,7 @@
+ #include <stdio.h>
+ #include <string.h>
+ #include <ctype.h>
++#include <stdbool.h>
+
+ #include "oslib/os.h"
+
diff --git a/arm-unknown-riscos/Makefile b/arm-unknown-riscos/Makefile
index 64516de..60b08a7 100644
--- a/arm-unknown-riscos/Makefile
+++ b/arm-unknown-riscos/Makefile
@@ -1,5 +1,5 @@
# Use a tested trunk version of GCCSDK
-UPSTREAM_GCCSDK_VERSION := release_4_7_4_v2
+UPSTREAM_GCCSDK_VERSION := release_4_7_4_v6
UPSTREAM_GCCSDK_TARBALL := gcc4$(UPSTREAM_GCCSDK_VERSION).tar.gz
UPSTREAM_GCCSDK_URI := svn://svn.riscos.info/gccsdk/tags/$(UPSTREAM_GCCSDK_VERSION)
@@ -14,7 +14,7 @@ UPSTREAM_CCRES_TARBALL := ccres$(UPSTREAM_CCRES_VERSION).tar.gz
UPSTREAM_CCRES_URI := svn://svn.riscos.info/ccres/trunk@$(UPSTREAM_CCRES_VERSION)
# Makerun
-UPSTREAM_MAKERUN_VERSION := abdbd16
+UPSTREAM_MAKERUN_VERSION := fe55b6bf
UPSTREAM_MAKERUN_TARBALL := makerun$(UPSTREAM_MAKERUN_VERSION).tar.gz
UPSTREAM_MAKERUN_URI := git://git.netsurf-browser.org/makerun.git
@@ -26,7 +26,7 @@ UPSTREAM_SQUEEZE_URI := git://git.netsurf-browser.org/squeeze.git
# Infozip
UPSTREAM_INFOZIP_VERSION := 30
UPSTREAM_INFOZIP_TARBALL := zip$(UPSTREAM_INFOZIP_VERSION).tar.gz
-UPSTREAM_INFOZIP_URI := http://downloads.sourceforge.net/project/infozip/Zip%203.x%20%28latest%29/3.0/$(UPSTREAM_INFOZIP_TARBALL)
+UPSTREAM_INFOZIP_URI := https://downloads.sourceforge.net/project/infozip/Zip%203.x%20%28latest%29/3.0/$(UPSTREAM_INFOZIP_TARBALL)
TOP := $(CURDIR)
RECIPES := $(TOP)/recipes
diff --git a/arm-unknown-riscos/fetchsrc b/arm-unknown-riscos/fetchsrc
index e71d85f..92ae5bf 100755
--- a/arm-unknown-riscos/fetchsrc
+++ b/arm-unknown-riscos/fetchsrc
@@ -4,7 +4,7 @@
# Usage fetchsrc <target> <source> <upstream> <output>
-NSSRV="http://ci.netsurf-browser.org/toolchain/"
+NSSRV="https://ci.netsurf-browser.org/toolchain/"
wget -q -O ${4} ${NSSRV}/${1}/${2}
if [ $? -ne 0 ];then
diff --git a/arm-unknown-riscos/recipes/patches/gcc4/binutils-download.p b/arm-unknown-riscos/recipes/patches/gcc4/binutils-download.p
index 54720f5..3f2f110 100644
--- a/arm-unknown-riscos/recipes/patches/gcc4/binutils-download.p
+++ b/arm-unknown-riscos/recipes/patches/gcc4/binutils-download.p
@@ -4,9 +4,9 @@
# Download binutils source:
$(SRCORIGDIR)/binutils-$(BINUTILS_VERSION).tar.bz2:
-mkdir -p $(SRCORIGDIR)
-- cd $(SRCORIGDIR) && wget -c http://ftpmirror.gnu.org/binutils/binutils-$(BINUTILS_VERSION).tar.bz2
+- cd $(SRCORIGDIR) && wget -c https://ftpmirror.gnu.org/binutils/binutils-$(BINUTILS_VERSION).tar.bz2
- touch $@
-+ wget -O $@ -c http://ci.netsurf-browser.org/toolchain/arm-unknown-riscos/binutils-$(BINUTILS_VERSION).tar.bz2
++ wget -O $@ -c https://ci.netsurf-browser.org/toolchain/arm-unknown-riscos/binutils-$(BINUTILS_VERSION).tar.bz2
ifeq "$(GCC_USE_SCM)" "yes"
# Checkout gcc source:
diff --git a/arm-unknown-riscos/recipes/patches/gcc4/cloog-ppl-download.p b/arm-unknown-riscos/recipes/patches/gcc4/cloog-ppl-download.p
index 194ef7f..6f91911 100644
--- a/arm-unknown-riscos/recipes/patches/gcc4/cloog-ppl-download.p
+++ b/arm-unknown-riscos/recipes/patches/gcc4/cloog-ppl-download.p
@@ -6,7 +6,7 @@
-mkdir -p $(SRCORIGDIR)
- cd $(SRCORIGDIR) && wget -c ftp://gcc.gnu.org/pub/gcc/infrastructure/cloog-ppl-$(CLOOG_VERSION).tar.gz
- touch $@
-+ wget -O $@ -c http://ci.netsurf-browser.org/toolchain/arm-unknown-riscos/cloog-ppl-$(CLOOG_VERSION).tar.gz
++ wget -O $@ -c https://ci.netsurf-browser.org/toolchain/arm-unknown-riscos/cloog-ppl-$(CLOOG_VERSION).tar.gz
# Download newlib source:
$(SRCORIGDIR)/newlib-$(NEWLIB_VERSION).tar.gz:
diff --git a/arm-unknown-riscos/recipes/patches/gcc4/gmp-download.p b/arm-unknown-riscos/recipes/patches/gcc4/gmp-download.p
index 0bfd4ec..4f99d57 100644
--- a/arm-unknown-riscos/recipes/patches/gcc4/gmp-download.p
+++ b/arm-unknown-riscos/recipes/patches/gcc4/gmp-download.p
@@ -4,8 +4,8 @@
# Download mpc source:
$(SRCORIGDIR)/mpc-$(MPC_VERSION).tar.gz:
-mkdir -p $(SRCORIGDIR)
-- cd $(SRCORIGDIR) && wget -c http://www.multiprecision.org/mpc/download/mpc-$(MPC_VERSION).tar.gz
-+ cd $(SRCORIGDIR) && wget -c http://ci.netsurf-browser.org/toolchain/arm-unknown-riscos/mpc-$(MPC_VERSION).tar.gz
+- cd $(SRCORIGDIR) && wget -c https://ftpmirror.gnu.org/mpc/mpc-$(MPC_VERSION).tar.gz
++ cd $(SRCORIGDIR) && wget -c https://ci.netsurf-browser.org/toolchain/arm-unknown-riscos/mpc-$(MPC_VERSION).tar.gz
touch $@
# Download mpfr source:
diff --git a/arm-unknown-riscos/recipes/patches/gcc4/no-scm.p b/arm-unknown-riscos/recipes/patches/gcc4/no-scm.p
new file mode 100644
index 0000000..5e12120
--- /dev/null
+++ b/arm-unknown-riscos/recipes/patches/gcc4/no-scm.p
@@ -0,0 +1,11 @@
+--- gcc4/Makefile (old)
++++ gcc4/Makefile (new)
+@@ -36,7 +36,7 @@
+ AUTOMAKE_FOR_GCC_VERSION=1.11.1
+ LIBTOOL_FOR_GCC_VERSION=2.4.2
+ GCC_VERSION=$(GCCSDK_SUPPORTED_GCC_RELEASE)
+-GCC_USE_SCM=yes
++GCC_USE_SCM=no
+ GCC_SCM_PATH=branches/gcc-4_7-branch
+ NEWLIB_VERSION=1.19.0
+ NEWLIB_USE_SCM=no
diff --git a/arm-unknown-riscos/recipes/patches/gcc4/posix-extended-locale.p b/arm-unknown-riscos/recipes/patches/gcc4/posix-extended-locale.p
new file mode 100644
index 0000000..f5726b8
--- /dev/null
+++ b/arm-unknown-riscos/recipes/patches/gcc4/posix-extended-locale.p
@@ -0,0 +1,1920 @@
+Index: gcc4/recipe/files/gcc/libunixlib/Makefile.am
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/Makefile.am (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/Makefile.am (working copy)
+@@ -583,11 +583,11 @@
+ else
+ locale_src = \
+ locale/localeconv.c \
++ locale/newlocale.c \
+ locale/nl_langinfo.c \
+ locale/setlocale.c \
+ locale/strcoll.c \
+- locale/strxfrm.c \
+- locale/territory.c
++ locale/strxfrm.c
+ endif
+ locale_src += \
+ locale/iconv.c
+@@ -1312,6 +1312,7 @@
+ bits/in.h \
+ bits/libc-lock.h \
+ bits/locale.h \
++ bits/locale_t.h \
+ bits/mathcalls.h \
+ bits/mathdef.h \
+ bits/mathinline.h \
+Index: gcc4/recipe/files/gcc/libunixlib/ctype/ctypetable.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/ctype/ctypetable.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/ctype/ctypetable.c (working copy)
+@@ -10,36 +10,35 @@
+ #include <internal/os.h>
+ #include <internal/unix.h>
+
+-/* Note the offset 1 and depth 257 instead of 0 and 256: ISO C says we must
+- support EOF. */
+-static unsigned char ctype[257];
+-const unsigned char * const __ctype = &ctype[1];
++/* Global containing current locale settings. */
++struct _locale __locale_global;
++/* Offset 1 as the first entry is reserved for EOF. */
++const unsigned char * const __ctype = &__locale_global.ctype[1];
++const short * const __ctype_upper = &__locale_global.ctype_upper[1];
++const short * const __ctype_lower = &__locale_global.ctype_lower[1];
+
+-static short ctype_upper[257];
+-const short * const __ctype_upper = &ctype_upper[1];
+-
+-static short ctype_lower[257];
+-const short * const __ctype_lower = &ctype_lower[1];
+-
+ void
+-__build_ctype_tables (int territory)
++__build_ctype_tables (locale_t locobj, int territory)
+ {
+ PTHREAD_UNSAFE
+
+ if (territory == -2)
+ {
+- /* Initialise the array. This is only done by __unixinit(). */
++ /* Initialise the array. This is only done by __unixinit()/newlocale(). */
+ territory = -1;
+- for (int x = 0; x <= LC_ALL; x++)
+- __locale_territory[x] = -1;
++ for (int x = 0; x < LC_ALL; x++)
++ locobj->locale_territory[x] = -1;
++ __localeconv_lconv_init(&locobj->lc);
++ locobj->lc_needs_refresh = 1;
+ }
+
+ /* Initialise ctype_upper/ctype_lower tables. */
+ for (int x = 0; x < 257; x++)
+ {
+- /* In the C/POSIX locate, tolower(top bit set char)
++ /* In the C/POSIX locale, tolower(top bit set char)
+ should return the character unchanged. */
+- ctype_lower[x] = ctype_upper[x] = x - 1;
++ locobj->ctype_lower[x] = locobj->ctype_upper[x] = x - 1;
++ locobj->ctype[x] = 0;
+ }
+
+ int regs[10];
+@@ -61,7 +60,7 @@
+ for (int offset = 1; bits; bits = bits >> 1, offset += 1)
+ {
+ if (bits & 1)
+- ctype[pos + offset] |= 1 << code;
++ locobj->ctype[pos + offset] |= 1 << code;
+ }
+ pos += 32;
+ }
+@@ -80,7 +79,7 @@
+ int y = (territory == -1) ? 128 : 256;
+ for (int x = 1; x <= y; x++)
+ {
+- ctype_lower[x] = (short)*p++;
+- ctype_upper[x] = (short)*q++;
++ locobj->ctype_lower[x] = (short)*p++;
++ locobj->ctype_upper[x] = (short)*q++;
+ }
+ }
+Index: gcc4/recipe/files/gcc/libunixlib/ctype/isalnum.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/ctype/isalnum.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/ctype/isalnum.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (isalnum) (int c)
+@@ -10,3 +11,8 @@
+ return isalnum (c);
+ }
+
++int
++isalnum_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & (___ctype_alpha | ___ctype_digit));
++}
+Index: gcc4/recipe/files/gcc/libunixlib/ctype/isalpha.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/ctype/isalpha.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/ctype/isalpha.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (isalpha) (int c)
+@@ -10,3 +11,8 @@
+ return isalpha (c);
+ }
+
++int
++isalpha_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & ___ctype_alpha);
++}
+Index: gcc4/recipe/files/gcc/libunixlib/ctype/isascii.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/ctype/isascii.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/ctype/isascii.c (working copy)
+@@ -10,3 +10,9 @@
+ return isascii (c);
+ }
+
++int
++isascii_l (int c, locale_t locobj)
++{
++ (void) locobj;
++ return isascii (c);
++}
+Index: gcc4/recipe/files/gcc/libunixlib/ctype/isblank.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/ctype/isblank.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/ctype/isblank.c (working copy)
+@@ -9,3 +9,10 @@
+ {
+ return isblank (c);
+ }
++
++int
++isblank_l (int c, locale_t locobj)
++{
++ (void) locobj;
++ return isblank (c);
++}
+Index: gcc4/recipe/files/gcc/libunixlib/ctype/iscntrl.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/ctype/iscntrl.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/ctype/iscntrl.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (iscntrl) (int c)
+@@ -10,3 +11,8 @@
+ return iscntrl (c);
+ }
+
++int
++iscntrl_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & ___ctype_ctrl);
++}
+Index: gcc4/recipe/files/gcc/libunixlib/ctype/isdigit.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/ctype/isdigit.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/ctype/isdigit.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (isdigit) (int c)
+@@ -10,3 +11,8 @@
+ return isdigit (c);
+ }
+
++int
++isdigit_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & ___ctype_digit);
++}
+Index: gcc4/recipe/files/gcc/libunixlib/ctype/isgraph.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/ctype/isgraph.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/ctype/isgraph.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (isgraph) (int c)
+@@ -10,3 +11,8 @@
+ return isgraph (c);
+ }
+
++int
++isgraph_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & ~(___ctype_white | ___ctype_ctrl));
++}
+Index: gcc4/recipe/files/gcc/libunixlib/ctype/islower.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/ctype/islower.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/ctype/islower.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (islower) (int c)
+@@ -10,3 +11,8 @@
+ return islower (c);
+ }
+
++int
++islower_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & ___ctype_lower);
++}
+Index: gcc4/recipe/files/gcc/libunixlib/ctype/isprint.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/ctype/isprint.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/ctype/isprint.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (isprint) (int c)
+@@ -10,3 +11,10 @@
+ return isprint (c);
+ }
+
++int
++isprint_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] &
++ (___ctype_upper | ___ctype_lower | ___ctype_digit | ___ctype_punc |
++ ___ctype_white)) && !((&locobj->ctype[1])[c] & ___ctype_ctrl);
++}
+Index: gcc4/recipe/files/gcc/libunixlib/ctype/ispunct.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/ctype/ispunct.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/ctype/ispunct.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (ispunct) (int c)
+@@ -10,3 +11,8 @@
+ return ispunct (c);
+ }
+
++int
++ispunct_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & ___ctype_punc);
++}
+Index: gcc4/recipe/files/gcc/libunixlib/ctype/isspace.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/ctype/isspace.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/ctype/isspace.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (isspace) (int c)
+@@ -10,3 +11,8 @@
+ return isspace (c);
+ }
+
++int
++isspace_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & ___ctype_white);
++}
+Index: gcc4/recipe/files/gcc/libunixlib/ctype/isupper.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/ctype/isupper.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/ctype/isupper.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (isupper) (int c)
+@@ -10,3 +11,8 @@
+ return isupper (c);
+ }
+
++int
++isupper_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & ___ctype_upper);
++}
+Index: gcc4/recipe/files/gcc/libunixlib/ctype/isxdigit.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/ctype/isxdigit.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/ctype/isxdigit.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (isxdigit) (int c)
+@@ -10,3 +11,8 @@
+ return isxdigit (c);
+ }
+
++int
++isxdigit_l (int c, locale_t locobj)
++{
++ return ((&locobj->ctype[1])[c] & ___ctype_xdigit);
++}
+Index: gcc4/recipe/files/gcc/libunixlib/ctype/toascii.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/ctype/toascii.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/ctype/toascii.c (working copy)
+@@ -10,3 +10,9 @@
+ return toascii (c);
+ }
+
++int
++toascii_l (int c, locale_t locobj)
++{
++ (void) locobj;
++ return toascii (c);
++}
+Index: gcc4/recipe/files/gcc/libunixlib/ctype/tolower.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/ctype/tolower.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/ctype/tolower.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (tolower) (int c)
+@@ -10,3 +11,8 @@
+ return tolower (c);
+ }
+
++int
++tolower_l (int c, locale_t locobj)
++{
++ return (&locobj->ctype_lower[1])[c];
++}
+Index: gcc4/recipe/files/gcc/libunixlib/ctype/toupper.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/ctype/toupper.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/ctype/toupper.c (working copy)
+@@ -3,6 +3,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ (toupper) (int c)
+@@ -10,3 +11,8 @@
+ return toupper (c);
+ }
+
++int
++toupper_l (int c, locale_t locobj)
++{
++ return (&locobj->ctype_upper[1])[c];
++}
+Index: gcc4/recipe/files/gcc/libunixlib/incl-local/locale.h
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/incl-local/locale.h (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/incl-local/locale.h (working copy)
+@@ -13,15 +13,36 @@
+
+ #ifndef __TARGET_SCL__
+
+-/* Territory number for each locale. C locale is -1. */
+-extern int __locale_territory[LC_ALL + 1];
++struct _locale {
++ /* Map from locale category to territory number. C locale is -1. */
++ int locale_territory[LC_ALL];
+
+-/* Set to 1 is setlocale has been called since the last call to
+- localeconv. localeconv uses this flag to cache the lconv structure. */
+-extern int __setlocale_called;
++ /* Character type LUTs: EOF + one entry per character
++ *
++ * EOF is defined as -1, so character entries start at offset 1.
++ */
++ short ctype_upper[257];
++ short ctype_lower[257];
++ unsigned char ctype[257];
+
+-extern void __build_ctype_tables (int __territory) __THROW;
++ /* Set to 1 if the locale information has changed since the last time
++ * the lconv structure was updated. */
++ int lc_needs_refresh;
++ /* Numeric formatting information for locale */
++ struct lconv lc;
++};
+
++extern struct _locale __locale_global;
++
++extern void __build_ctype_tables (locale_t locobj, int __territory) __THROW;
++
++extern char *__setlocale_l (locale_t locobj, int __category,
++ const char *__locale) __THROW;
++
++void __localeconv_lconv_init (struct lconv *lc);
++void __localeconv_lconv_fini (struct lconv *lc);
++void __localeconv_l (locale_t locobj);
++
+ #endif
+
+ __END_DECLS
+Index: gcc4/recipe/files/gcc/libunixlib/include/bits/locale_t.h
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/include/bits/locale_t.h (nonexistent)
++++ gcc4/recipe/files/gcc/libunixlib/include/bits/locale_t.h (working copy)
+@@ -0,0 +1,10 @@
++/*
++ * Copyright (c) 2022 UnixLib Developers
++ */
++
++#ifndef _BITS_LOCALE_T_H_
++#define _BITS_LOCALE_T_H_
++
++typedef struct _locale *locale_t;
++
++#endif
+Index: gcc4/recipe/files/gcc/libunixlib/include/ctype.h
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/include/ctype.h (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/include/ctype.h (working copy)
+@@ -51,6 +51,48 @@
+ extern int isblank (int __c) __THROW;
+
+ #ifndef __TARGET_SCL__
++# ifdef __USE_XOPEN2K8
++# include <bits/locale_t.h>
++
++/* c is alphabetic or numeric. */
++extern int isalnum_l (int __c, locale_t locobj) __THROW;
++
++/* c is alphabetic. */
++extern int isalpha_l (int __c, locale_t locobj) __THROW;
++
++/* c is a control character. */
++extern int iscntrl_l (int __c, locale_t locobj) __THROW;
++
++/* c is a decimal digit. */
++extern int isdigit_l (int __c, locale_t locobj) __THROW;
++
++/* c is any printable character other than a space. */
++extern int isgraph_l (int __c, locale_t locobj) __THROW;
++
++/* c is a lower-case letter. */
++extern int islower_l (int __c, locale_t locobj) __THROW;
++
++/* c is an upper-case letter. */
++extern int isupper_l (int __c, locale_t locobj) __THROW;
++
++/* c is a printable character. */
++extern int isprint_l (int __c, locale_t locobj) __THROW;
++
++/* c is a printable character other than a space or a
++ alphanumeric character. */
++extern int ispunct_l (int __c, locale_t locobj) __THROW;
++
++/* c is a white space character e.g. space, newline, tab, linefeed,
++ return, vertical tab. */
++extern int isspace_l (int __c, locale_t locobj) __THROW;
++
++/* c is a hex digit. */
++extern int isxdigit_l (int __c, locale_t locobj) __THROW;
++
++/* c is tab or space. */
++extern int isblank_l (int __c, locale_t locobj) __THROW;
++# endif
++
+ /* Characteristics. */
+ extern const unsigned char * const __ctype;
+ /* Lower case table. */
+@@ -108,6 +150,10 @@
+ extern int toupper (int __c) __THROW;
+ #ifndef __TARGET_SCL__
+ # define toupper(c) ((int) __ctype_upper[(int) (c)])
++
++# ifdef __USE_XOPEN2K8
++extern int toupper_l (int __c, locale_t locobj) __THROW;
++# endif
+ #endif
+
+ /* Convert c to lower case. */
+@@ -114,6 +160,10 @@
+ extern int tolower (int __c) __THROW;
+ #ifndef __TARGET_SCL__
+ # define tolower(c) ((int) __ctype_lower[(int) (c)])
++
++# ifdef __USE_XOPEN2K8
++extern int tolower_l (int __c, locale_t locobj) __THROW;
++# endif
+ #endif
+
+ #ifndef __TARGET_SCL__
+@@ -135,6 +185,11 @@
+ /* Is c an ASCII character. */
+ extern int isascii (int __c) __THROW;
+ # define isascii(c) ((unsigned)(c) <= 0x7f)
++
++# ifdef __USE_XOPEN2K8
++extern int toascii_l (int __c, locale_t locobj) __THROW;
++extern int isascii_l (int __c, locale_t locobj) __THROW;
++# endif
+ # endif
+ #endif
+
+Index: gcc4/recipe/files/gcc/libunixlib/include/langinfo.h
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/include/langinfo.h (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/include/langinfo.h (working copy)
+@@ -580,18 +580,12 @@
+ extern char *nl_langinfo (nl_item __item) __THROW;
+
+
+-#if 0
+-#ifdef __USE_GNU
+-/* This interface is for the extended locale model. See <locale.h> for
+- more information. */
++#ifdef __USE_XOPEN2K8
++# include <bits/locale_t.h>
+
+-/* Get locale datatype definition. */
+-# include <xlocale.h>
+-
+ /* Just like nl_langinfo but get the information from the locale object L. */
+-extern char *nl_langinfo_l (nl_item __item, __locale_t l);
++extern char *nl_langinfo_l (nl_item __item, locale_t __l);
+ #endif
+-#endif
+
+ __END_DECLS
+
+Index: gcc4/recipe/files/gcc/libunixlib/include/locale.h
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/include/locale.h (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/include/locale.h (working copy)
+@@ -33,16 +33,16 @@
+ /* Entire locale. */
+ # define LC_ALL 6
+
+-#define LC_COLLATE_MASK (1L << 1)
+-#define LC_CTYPE_MASK (1L << 2)
+-#define LC_MESSAGES_MASK (1L << 3)
+-#define LC_MONETARY_MASK (1L << 4)
+-#define LC_NUMERIC_MASK (1L << 5)
+-#define LC_TIME_MASK (1L << 6)
+-#define LC_ALL_MASK (LC_COLLATE_MASK | LC_CTYPE_MASK | LC_MESSAGES_MASK | LC_MONETARY_MASK | LC_NUMERIC_MASK | LC_TIME_MASK)
++# ifdef __USE_XOPEN2K8
++# define LC_COLLATE_MASK (1L << 0)
++# define LC_CTYPE_MASK (1L << 1)
++# define LC_MESSAGES_MASK (1L << 2)
++# define LC_MONETARY_MASK (1L << 3)
++# define LC_NUMERIC_MASK (1L << 4)
++# define LC_TIME_MASK (1L << 5)
++# define LC_ALL_MASK (LC_COLLATE_MASK | LC_CTYPE_MASK | LC_MESSAGES_MASK | LC_MONETARY_MASK | LC_NUMERIC_MASK | LC_TIME_MASK)
++# endif
+
+-typedef struct _locale *locale_t;
+-
+ #else
+ /* String collation (functions 'strcoll' and 'strxfrm'). */
+ # define LC_COLLATE 1
+@@ -121,6 +121,9 @@
+ extern struct lconv *localeconv (void) __THROW;
+
+ #ifndef __TARGET_SCL__
++# ifdef __USE_XOPEN2K8
++# include <bits/locale_t.h>
++
+ extern locale_t uselocale(locale_t newloc);
+
+ extern void freelocale(locale_t locobj);
+@@ -127,7 +130,11 @@
+
+ extern locale_t newlocale(int category_mask, const char *locale,
+ locale_t base);
+-# define LC_GLOBAL_LOCALE ((locale_t) -1L)
++
++extern locale_t duplocale(locale_t locobj);
++
++# define LC_GLOBAL_LOCALE ((locale_t) -1L)
++# endif
+ #endif
+
+ __END_NAMESPACE_STD
+Index: gcc4/recipe/files/gcc/libunixlib/include/string.h
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/include/string.h (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/include/string.h (working copy)
+@@ -93,6 +93,16 @@
+ const char *__restrict __src, size_t __n)
+ __THROW __nonnull ((2));
+
++#ifdef __USE_XOPEN2K8
++#include <bits/locale_t.h>
++
++extern int strcoll_l (const char *__s1, const char *__s2, locale_t __l)
++ __THROW __attribute_pure__ __nonnull ((1, 2, 3));
++
++extern size_t strxfrm_l (char *__dest, const char *__src, size_t __n,
++ locale_t __l) __THROW __nonnull ((2, 4));
++#endif
++
+ /* Find the first occurrence of c in s. */
+ extern char *strchr (const char *__s, int __c)
+ __THROW __attribute_pure__ __nonnull ((1)) __wur;
+@@ -281,6 +291,17 @@
+ /* Compare no more than N chars of S1 and S2, ignoring case. */
+ extern int strncasecmp (const char *__s1, const char *__s2, size_t __n)
+ __THROW __attribute_pure__ __nonnull ((1, 2)) __wur;
++
++# ifdef __USE_XOPEN2K8
++# include <bits/locale_t.h>
++
++extern int strcasecmp_l (const char *__s1, const char *__s2, locale_t __loc)
++ __THROW __attribute_pure__ __nonnull ((1, 2, 3));
++
++extern int strncasecmp_l (const char *__s1, const char *__s2,
++ size_t __n, locale_t __loc)
++ __THROW __attribute_pure__ __nonnull ((1, 2, 4));
++# endif
+ #endif /* Use BSD. */
+
+ #if defined __USE_XOPEN2K || defined __USE_MISC
+@@ -289,6 +310,11 @@
+ __THROW __nonnull ((2));
+ #endif
+
++#ifdef __USE_XOPEN2K8
++/* Translate error number to string according to the locale L. */
++extern char *strerror_l (int __errnum, locale_t __l) __THROW;
++#endif
++
+ #ifndef __TARGET_SCL__
+ # ifndef basename
+ /* Return the file name within directory of FILENAME. We don't
+Index: gcc4/recipe/files/gcc/libunixlib/include/strings.h
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/include/strings.h (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/include/strings.h (working copy)
+@@ -37,7 +37,17 @@
+ /* Compare n chars of S1 and S2, ignoring case. */
+ extern int strncasecmp (const char *__s1, const char *__s2, size_t __n);
+
++# ifdef __USE_XOPEN2K8
++# include <bits/locale_t.h>
+
++extern int strcasecmp_l (const char *__s1, const char *__s2, locale_t __loc)
++ __THROW __attribute_pure__ __nonnull ((1, 2, 3));
++
++extern int strncasecmp_l (const char *__s1, const char *__s2,
++ size_t __n, locale_t __loc)
++ __THROW __attribute_pure__ __nonnull ((1, 2, 4));
++# endif
++
+ /* Return the position of the first bit set in I, or 0 if none are set.
+ The least-significant bit is position 1, the most-significant 32. */
+ extern int ffs (int __i);
+Index: gcc4/recipe/files/gcc/libunixlib/include/wchar.h
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/include/wchar.h (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/include/wchar.h (working copy)
+@@ -1,7 +1,7 @@
+ /*
+ * File taken from glibc 2.11.
+ * Following changes were made:
+- * - Disabled non-standard reentrant locale prototypes.
++ * - None
+ */
+
+ /* Copyright (C) 1995-2008, 2009 Free Software Foundation, Inc.
+@@ -172,7 +172,6 @@
+ __END_NAMESPACE_STD
+ #endif
+
+-#if 0
+ #ifdef __USE_XOPEN2K8
+ /* Compare S1 and S2, ignoring case. */
+ extern int wcscasecmp (__const wchar_t *__s1, __const wchar_t *__s2) __THROW;
+@@ -183,15 +182,14 @@
+
+ /* Similar to the two functions above but take the information from
+ the provided locale and not the global locale. */
+-# include <xlocale.h>
++# include <bits/locale_t.h>
+
+ extern int wcscasecmp_l (__const wchar_t *__s1, __const wchar_t *__s2,
+- __locale_t __loc) __THROW;
++ locale_t __loc) __THROW;
+
+ extern int wcsncasecmp_l (__const wchar_t *__s1, __const wchar_t *__s2,
+- size_t __n, __locale_t __loc) __THROW;
++ size_t __n, locale_t __loc) __THROW;
+ #endif
+-#endif
+
+ __BEGIN_NAMESPACE_STD
+ /* Compare S1 and S2, both interpreted as appropriate to the
+@@ -205,7 +203,6 @@
+ __END_NAMESPACE_STD
+
+ #ifdef __USE_XOPEN2K8
+-#if 0
+ /* Similar to the two functions above but take the information from
+ the provided locale and not the global locale. */
+
+@@ -212,14 +209,13 @@
+ /* Compare S1 and S2, both interpreted as appropriate to the
+ LC_COLLATE category of the given locale. */
+ extern int wcscoll_l (__const wchar_t *__s1, __const wchar_t *__s2,
+- __locale_t __loc) __THROW;
++ locale_t __loc) __THROW;
+
+ /* Transform S2 into array pointed to by S1 such that if wcscmp is
+ applied to two transformed strings the result is the as applying
+ `wcscoll' to the original strings. */
+ extern size_t wcsxfrm_l (wchar_t *__s1, __const wchar_t *__s2,
+- size_t __n, __locale_t __loc) __THROW;
+-#endif
++ size_t __n, locale_t __loc) __THROW;
+
+ #ifndef __TARGET_SCL__
+ /* Duplicate S, returning an identical malloc'd string. */
+Index: gcc4/recipe/files/gcc/libunixlib/include/wctype.h
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/include/wctype.h (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/include/wctype.h (working copy)
+@@ -3,7 +3,6 @@
+ * Following changes were made:
+ * - Replaced "#include <bits/types.h>" into "#include <unixlib/types.h>"
+ * - Add wint_t typedef when it hasn't been defined in stddef.h.
+- * - Disabled non-standard reentrant locale prototypes.
+ */
+
+ /* Copyright (C) 1996-2002,2005,2007,2008,2009 Free Software Foundation, Inc.
+@@ -191,7 +190,6 @@
+ /* Determine whether the wide-character WC has the property described by
+ DESC. */
+ extern int iswctype (wint_t __wc, wctype_t __desc) __THROW;
+-#define iswctype_l(c, d, l) iswctype(c, d)
+
+ __END_NAMESPACE_C99
+
+@@ -241,73 +239,71 @@
+ extern wint_t towctrans (wint_t __wc, wctrans_t __desc) __THROW;
+ __END_NAMESPACE_C99
+
+-#if 0
+ # ifdef __USE_XOPEN2K8
+-/* Declare the interface to extended locale model. */
+-# include <xlocale.h>
++# include <bits/locale_t.h>
+
+ /* Test for any wide character for which `iswalpha' or `iswdigit' is
+ true. */
+-extern int iswalnum_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswalnum_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any wide character for which `iswupper' or 'iswlower' is
+ true, or any wide character that is one of a locale-specific set of
+ wide-characters for which none of `iswcntrl', `iswdigit',
+ `iswpunct', or `iswspace' is true. */
+-extern int iswalpha_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswalpha_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any control wide character. */
+-extern int iswcntrl_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswcntrl_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any wide character that corresponds to a decimal-digit
+ character. */
+-extern int iswdigit_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswdigit_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any wide character for which `iswprint' is true and
+ `iswspace' is false. */
+-extern int iswgraph_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswgraph_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any wide character that corresponds to a lowercase letter
+ or is one of a locale-specific set of wide characters for which
+ none of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true. */
+-extern int iswlower_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswlower_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any printing wide character. */
+-extern int iswprint_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswprint_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any printing wide character that is one of a
+ locale-specific et of wide characters for which neither `iswspace'
+ nor `iswalnum' is true. */
+-extern int iswpunct_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswpunct_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any wide character that corresponds to a locale-specific
+ set of wide characters for which none of `iswalnum', `iswgraph', or
+ `iswpunct' is true. */
+-extern int iswspace_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswspace_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any wide character that corresponds to an uppercase letter
+ or is one of a locale-specific set of wide character for which none
+ of `iswcntrl', `iswdigit', `iswpunct', or `iswspace' is true. */
+-extern int iswupper_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswupper_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any wide character that corresponds to a hexadecimal-digit
+ character equivalent to that performed be the functions described
+ in the previous subclause. */
+-extern int iswxdigit_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswxdigit_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Test for any wide character that corresponds to a standard blank
+ wide character or a locale-specific set of wide characters for
+ which `iswalnum' is false. */
+-extern int iswblank_l (wint_t __wc, __locale_t __locale) __THROW;
++extern int iswblank_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Construct value that describes a class of wide characters identified
+ by the string argument PROPERTY. */
+-extern wctype_t wctype_l (__const char *__property, __locale_t __locale)
++extern wctype_t wctype_l (__const char *__property, locale_t __locale)
+ __THROW;
+
+ /* Determine whether the wide-character WC has the property described by
+ DESC. */
+-extern int iswctype_l (wint_t __wc, wctype_t __desc, __locale_t __locale)
++extern int iswctype_l (wint_t __wc, wctype_t __desc, locale_t __locale)
+ __THROW;
+
+
+@@ -316,22 +312,21 @@
+ */
+
+ /* Converts an uppercase letter to the corresponding lowercase letter. */
+-extern wint_t towlower_l (wint_t __wc, __locale_t __locale) __THROW;
++extern wint_t towlower_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Converts an lowercase letter to the corresponding uppercase letter. */
+-extern wint_t towupper_l (wint_t __wc, __locale_t __locale) __THROW;
++extern wint_t towupper_l (wint_t __wc, locale_t __locale) __THROW;
+
+ /* Construct value that describes a mapping between wide characters
+ identified by the string argument PROPERTY. */
+-extern wctrans_t wctrans_l (__const char *__property, __locale_t __locale)
++extern wctrans_t wctrans_l (__const char *__property, locale_t __locale)
+ __THROW;
+
+ /* Map the wide character WC using the mapping described by DESC. */
+ extern wint_t towctrans_l (wint_t __wc, wctrans_t __desc,
+- __locale_t __locale) __THROW;
++ locale_t __locale) __THROW;
+
+ # endif /* Use POSIX 2008. */
+-#endif
+
+ __END_DECLS
+
+Index: gcc4/recipe/files/gcc/libunixlib/locale/localeconv.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/locale/localeconv.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/locale/localeconv.c (working copy)
+@@ -14,8 +14,6 @@
+
+ /* #define DEBUG */
+
+-int __setlocale_called = 1;
+-
+ static int
+ read_symbol (int reason_code, int territory)
+ {
+@@ -71,26 +69,44 @@
+ *grouping = new_grouping;
+ }
+
+-static struct lconv lc = { NULL, NULL, NULL, NULL, NULL,
+- NULL, NULL, NULL, NULL, NULL,
+- CHAR_MAX, CHAR_MAX, CHAR_MAX, CHAR_MAX,
+- CHAR_MAX, CHAR_MAX, CHAR_MAX, CHAR_MAX };
++void
++__localeconv_lconv_init (struct lconv *lc)
++{
++ memset(lc, 0, sizeof(*lc));
++ lc->int_frac_digits = lc->frac_digits = lc->p_cs_precedes =
++ lc->p_sep_by_space = lc->n_cs_precedes = lc->n_sep_by_space =
++ lc->p_sign_posn = lc->n_sign_posn = CHAR_MAX;
++}
+
+-/* Defined by POSIX as not threadsafe */
+-struct lconv *
+-localeconv (void)
++void
++__localeconv_lconv_fini (struct lconv *lc)
+ {
++ free(lc->decimal_point);
++ free(lc->thousands_sep);
++ free(lc->grouping);
++ free(lc->int_curr_symbol);
++ free(lc->currency_symbol);
++ free(lc->mon_decimal_point);
++ free(lc->mon_thousands_sep);
++ free(lc->mon_grouping);
++ free(lc->positive_sign);
++ free(lc->negative_sign);
++}
++
++void
++__localeconv_l (locale_t locobj)
++{
+ int numeric, monetary;
+
+ /* If setlocale has not been called since the last call to
+ localeconv, then the lconv structure will be the same. */
+- if (!__setlocale_called)
+- return &lc;
++ if (!locobj->lc_needs_refresh)
++ return;
+
+- __setlocale_called = 0;
++ locobj->lc_needs_refresh = 0;
+
+- numeric = __locale_territory[LC_NUMERIC];
+- monetary = __locale_territory[LC_MONETARY];
++ numeric = locobj->locale_territory[LC_NUMERIC];
++ monetary = locobj->locale_territory[LC_MONETARY];
+
+ /* See the PRMs regarding SWI Territory_ReadSymbols for the
+ meanings of the following numbers. */
+@@ -97,71 +113,80 @@
+ if (numeric == -1)
+ {
+ /* We're using the 'C' locale. */
+- free (lc.decimal_point);
+- lc.decimal_point = strdup (".");
+- free (lc.thousands_sep);
+- lc.thousands_sep = strdup ("");
+- free (lc.grouping);
+- lc.grouping = strdup ("");
++ free (locobj->lc.decimal_point);
++ locobj->lc.decimal_point = strdup (".");
++ free (locobj->lc.thousands_sep);
++ locobj->lc.thousands_sep = strdup ("");
++ free (locobj->lc.grouping);
++ locobj->lc.grouping = strdup ("");
+ }
+ else
+ {
+- free (lc.decimal_point);
+- lc.decimal_point = strdup ((char *) read_symbol (0, numeric));
+- free (lc.thousands_sep);
+- lc.thousands_sep = strdup ((char *) read_symbol (1, numeric));
+- read_byte_list (2, &lc.grouping, numeric);
++ free (locobj->lc.decimal_point);
++ locobj->lc.decimal_point = strdup ((char *) read_symbol (0, numeric));
++ free (locobj->lc.thousands_sep);
++ locobj->lc.thousands_sep = strdup ((char *) read_symbol (1, numeric));
++ read_byte_list (2, &locobj->lc.grouping, numeric);
+ }
+ if (monetary == -1)
+ {
+ /* We using the 'C' locale. Empty strings and CHAR_MAX means
+ that these fields are unspecified. */
+- free (lc.mon_decimal_point);
+- lc.mon_decimal_point = strdup ("");
+- free (lc.mon_thousands_sep);
+- lc.mon_thousands_sep = strdup ("");
+- free (lc.mon_grouping);
+- lc.mon_grouping = strdup ("");
+- lc.int_frac_digits = CHAR_MAX;
+- lc.frac_digits = CHAR_MAX;
+- free (lc.currency_symbol);
+- lc.currency_symbol = strdup ("");
+- free (lc.int_curr_symbol);
+- lc.int_curr_symbol = strdup ("");
+- lc.p_cs_precedes = CHAR_MAX;
+- lc.n_cs_precedes = CHAR_MAX;
+- lc.p_sep_by_space = CHAR_MAX;
+- lc.n_sep_by_space = CHAR_MAX;
+- free (lc.positive_sign);
+- lc.positive_sign = strdup ("");
+- free (lc.negative_sign);
+- lc.negative_sign = strdup ("");
+- lc.p_sign_posn = CHAR_MAX;
+- lc.n_sign_posn = CHAR_MAX;
++ free (locobj->lc.mon_decimal_point);
++ locobj->lc.mon_decimal_point = strdup ("");
++ free (locobj->lc.mon_thousands_sep);
++ locobj->lc.mon_thousands_sep = strdup ("");
++ free (locobj->lc.mon_grouping);
++ locobj->lc.mon_grouping = strdup ("");
++ locobj->lc.int_frac_digits = CHAR_MAX;
++ locobj->lc.frac_digits = CHAR_MAX;
++ free (locobj->lc.currency_symbol);
++ locobj->lc.currency_symbol = strdup ("");
++ free (locobj->lc.int_curr_symbol);
++ locobj->lc.int_curr_symbol = strdup ("");
++ locobj->lc.p_cs_precedes = CHAR_MAX;
++ locobj->lc.n_cs_precedes = CHAR_MAX;
++ locobj->lc.p_sep_by_space = CHAR_MAX;
++ locobj->lc.n_sep_by_space = CHAR_MAX;
++ free (locobj->lc.positive_sign);
++ locobj->lc.positive_sign = strdup ("");
++ free (locobj->lc.negative_sign);
++ locobj->lc.negative_sign = strdup ("");
++ locobj->lc.p_sign_posn = CHAR_MAX;
++ locobj->lc.n_sign_posn = CHAR_MAX;
+ }
+ else
+ {
+- free (lc.int_curr_symbol);
+- lc.int_curr_symbol = strdup ((char *)read_symbol (3, monetary));
+- free (lc.currency_symbol);
+- lc.currency_symbol = strdup ((char *)read_symbol (4, monetary));
+- free (lc.mon_decimal_point);
+- lc.mon_decimal_point = strdup ((char *)read_symbol (5, monetary));
+- free (lc.mon_thousands_sep);
+- lc.mon_thousands_sep = strdup ((char *)read_symbol (6, monetary));
+- read_byte_list (7, &lc.mon_grouping, monetary);
+- free (lc.positive_sign);
+- lc.positive_sign = strdup ((char *)read_symbol (8, monetary));
+- free (lc.negative_sign);
+- lc.negative_sign = strdup ((char *)read_symbol (9, monetary));
+- lc.int_frac_digits = (char)read_symbol (10, monetary);
+- lc.frac_digits = (char)read_symbol (11, monetary);
+- lc.p_cs_precedes = (char)read_symbol (12, monetary);
+- lc.p_sep_by_space = (char)read_symbol (13, monetary);
+- lc.n_cs_precedes = (char)read_symbol (14, monetary);
+- lc.n_sep_by_space = (char)read_symbol (15, monetary);
+- lc.p_sign_posn = (char)read_symbol (16, monetary);
+- lc.n_sign_posn = (char)read_symbol (17, monetary);
++ free (locobj->lc.int_curr_symbol);
++ locobj->lc.int_curr_symbol = strdup ((char *)read_symbol (3, monetary));
++ free (locobj->lc.currency_symbol);
++ locobj->lc.currency_symbol = strdup ((char *)read_symbol (4, monetary));
++ free (locobj->lc.mon_decimal_point);
++ locobj->lc.mon_decimal_point = strdup ((char *)read_symbol (5, monetary));
++ free (locobj->lc.mon_thousands_sep);
++ locobj->lc.mon_thousands_sep = strdup ((char *)read_symbol (6, monetary));
++ read_byte_list (7, &locobj->lc.mon_grouping, monetary);
++ free (locobj->lc.positive_sign);
++ locobj->lc.positive_sign = strdup ((char *)read_symbol (8, monetary));
++ free (locobj->lc.negative_sign);
++ locobj->lc.negative_sign = strdup ((char *)read_symbol (9, monetary));
++ locobj->lc.int_frac_digits = (char)read_symbol (10, monetary);
++ locobj->lc.frac_digits = (char)read_symbol (11, monetary);
++ locobj->lc.p_cs_precedes = (char)read_symbol (12, monetary);
++ locobj->lc.p_sep_by_space = (char)read_symbol (13, monetary);
++ locobj->lc.n_cs_precedes = (char)read_symbol (14, monetary);
++ locobj->lc.n_sep_by_space = (char)read_symbol (15, monetary);
++ locobj->lc.p_sign_posn = (char)read_symbol (16, monetary);
++ locobj->lc.n_sign_posn = (char)read_symbol (17, monetary);
+ }
+- return &lc;
++ return;
+ }
++
++/* Defined by POSIX as not threadsafe */
++struct lconv *
++localeconv (void)
++{
++ __localeconv_l (&__locale_global);
++
++ return &__locale_global.lc;
++}
+Index: gcc4/recipe/files/gcc/libunixlib/locale/newlocale.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/locale/newlocale.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/locale/newlocale.c (working copy)
+@@ -1,17 +1,17 @@
+ /* Copyright (c) 2019 UnixLib Developers
+ */
+
++#include <ctype.h>
++#include <errno.h>
++#include <locale.h>
+ #include <stdlib.h>
+-#include <locale.h>
+ #include <stdio.h>
+-#include <errno.h>
++#include <string.h>
+
+-struct _locale {
+- struct lconv lc;
+-};
++#include <internal/unix.h>
+
+ /* This is supposed to be per-thread. */
+-static locale_t current_locale;
++static locale_t current_locale = LC_GLOBAL_LOCALE;
+
+ locale_t uselocale(locale_t newloc)
+ {
+@@ -27,20 +27,94 @@
+
+ void freelocale(locale_t locobj)
+ {
+- if (locobj)
++ if (locobj) {
++ __localeconv_lconv_fini(&locobj->lc);
+ free(locobj);
++ }
+ }
+
+ locale_t newlocale(int category_mask, const char *locale,
+ locale_t base)
+ {
+- locale_t loc = (locale_t)malloc(sizeof(*loc));
+- if (!loc) {
++ struct _locale tmp;
++
++ PTHREAD_UNSAFE
++
++ if ((category_mask & ~LC_ALL_MASK) || locale == NULL) {
++ __set_errno (EINVAL);
++ return 0;
++ }
++
++ /* The locale provided will be verified by __setlocale_l() */
++
++ /* Prepare the temporary locale we will modify */
++ if (base != 0 && base != LC_GLOBAL_LOCALE) {
++ memcpy(&tmp, base, sizeof(tmp));
++ } else {
++ if (base == LC_GLOBAL_LOCALE) {
++ /* Undefined: be helpful to client */
++ memcpy(&tmp, &__locale_global, sizeof(tmp));
++ } else {
++ /* Initialise to C locale */
++ __build_ctype_tables(&tmp, -2);
++ }
++ }
++
++ /* Now, apply the requested locale to each of the categories in the mask */
++ if (category_mask == LC_ALL_MASK) {
++ /* Special-case LC_ALL to handle the encoded locale string */
++ if (__setlocale_l(&tmp, LC_ALL, locale) == NULL) {
++ return 0;
++ }
++ } else {
++ int category = 0, mask = category_mask;
++ while (mask != 0) {
++ if (mask & 1) {
++ if (__setlocale_l(&tmp, category, locale) == NULL) {
++ return 0;
++ }
++ }
++ category++;
++ mask >>= 1;
++ }
++ }
++
++ /* Allocate the result, if necessary */
++ if (base == 0 || base == LC_GLOBAL_LOCALE) {
++ base = (locale_t)malloc(sizeof(*base));
++ if (!base) {
++ __set_errno (ENOMEM);
++ return 0;
++ }
++ }
++ /* Fill it in */
++ memcpy(base, &tmp, sizeof(tmp));
++
++ /* Mark the lconv data stale */
++ base->lc_needs_refresh = 1;
++
++ return base;
++}
++
++locale_t duplocale(locale_t locobj)
++{
++ locale_t loc;
++
++ loc = (locale_t) malloc(sizeof(*loc));
++ if (loc == NULL) {
+ __set_errno (ENOMEM);
+ return 0;
+ }
+
+- loc->lc = *localeconv();
++ if (locobj == LC_GLOBAL_LOCALE) {
++ memcpy(loc, &__locale_global, sizeof(*loc));
++ } else {
++ memcpy(loc, locobj, sizeof(*loc));
++ }
+
++ /* Invalidate lconv in the copy */
++ __localeconv_lconv_init(&loc->lc);
++ loc->lc_needs_refresh = 1;
++
+ return loc;
+ }
+Index: gcc4/recipe/files/gcc/libunixlib/locale/nl_langinfo.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/locale/nl_langinfo.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/locale/nl_langinfo.c (working copy)
+@@ -24,3 +24,10 @@
+
+ return (char *)value;
+ }
++
++char *
++nl_langinfo_l (nl_item item, locale_t l)
++{
++ (void) l;
++ return nl_langinfo(item);
++}
+Index: gcc4/recipe/files/gcc/libunixlib/locale/setlocale.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/locale/setlocale.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/locale/setlocale.c (working copy)
+@@ -195,7 +195,7 @@
+ }
+
+ static void
+-do_lc_all (char *buffer, int size)
++do_lc_all (locale_t locobj, char *buffer, int size)
+ {
+ char temp[64];
+ int category, same = 1;
+@@ -204,13 +204,13 @@
+ setlocale to set all locales. If all locales are
+ the same, then we can produce a very short string. */
+ for (category = 1; category < LC_ALL; ++category)
+- if (__locale_territory[0] != __locale_territory[category])
++ if (locobj->locale_territory[0] != locobj->locale_territory[category])
+ same = 0;
+
+ if (same)
+ {
+ /* All locales are set to the same territory. */
+- territory_name (__locale_territory[0], buffer, size);
++ territory_name (locobj->locale_territory[0], buffer, size);
+ }
+ else
+ {
+@@ -218,7 +218,7 @@
+ LC_CATEGORY=country;LC_CATEGORY=country; ... */
+ for (category = 0; category < LC_ALL; ++category)
+ {
+- territory_name (__locale_territory[category], temp, sizeof (temp));
++ territory_name (locobj->locale_territory[category], temp, sizeof (temp));
+ buffer = stpcpy (buffer, locale_names[category]);
+ *buffer++ = '=';
+ buffer = stpcpy (buffer, temp);
+@@ -230,15 +230,13 @@
+ }
+
+ char *
+-setlocale (int category, const char *locale)
++__setlocale_l (locale_t locobj, int category, const char *locale)
+ {
+ int new_territory, changed;
+ static char old_locale[256];
+
+- PTHREAD_UNSAFE
+-
+ /* This tells localeconv to re-read data for the lconv structure. */
+- __setlocale_called = 1;
++ locobj->lc_needs_refresh = 1;
+
+ if (locale == NULL)
+ {
+@@ -247,11 +245,11 @@
+ {
+ /* The locale string is specially encoded for LC_ALL so we
+ could restore all locales at any time. */
+- do_lc_all (old_locale, sizeof (old_locale));
++ do_lc_all (locobj, old_locale, sizeof (old_locale));
+ return old_locale;
+ }
+
+- territory_name (__locale_territory[category], old_locale, sizeof (old_locale));
++ territory_name (locobj->locale_territory[category], old_locale, sizeof (old_locale));
+ return old_locale;
+ }
+
+@@ -270,7 +268,7 @@
+ /* Encode the locale string, as we will be returning this
+ later. Remember, setlocale returns the locale settings
+ that are about to be changed. */
+- do_lc_all (old_locale, sizeof (old_locale));
++ do_lc_all (locobj, old_locale, sizeof (old_locale));
+
+ /* Check for an encoded (composite) name. Simply looking for
+ a semi-colon will verify this. */
+@@ -332,11 +330,11 @@
+
+ /* We now know all locales exist, so set them. */
+ for (category = 0; category < LC_ALL; ++category)
+- __locale_territory[category] = territory_number (newnames[category]);
++ locobj->locale_territory[category] = territory_number (newnames[category]);
+
+ /* Re-build the character type tables according to the new
+ locale settings. */
+- __build_ctype_tables (__locale_territory[LC_CTYPE]);
++ __build_ctype_tables (locobj, locobj->locale_territory[LC_CTYPE]);
+ return old_locale;
+ }
+ }
+@@ -359,9 +357,9 @@
+ /* Change the locale for all categories. old_locale was created
+ when we previously checked for a composite string. */
+ for (category = 0; category < LC_ALL; ++category)
+- if (__locale_territory[category] != new_territory)
++ if (locobj->locale_territory[category] != new_territory)
+ {
+- __locale_territory[category] = new_territory;
++ locobj->locale_territory[category] = new_territory;
+ changed = 1;
+ }
+ }
+@@ -368,12 +366,12 @@
+ else
+ {
+ /* Change the locale for just one category. */
+- territory_name (__locale_territory[category],
++ territory_name (locobj->locale_territory[category],
+ old_locale, sizeof (old_locale));
+
+- if (__locale_territory[category] != new_territory)
++ if (locobj->locale_territory[category] != new_territory)
+ {
+- __locale_territory[category] = new_territory;
++ locobj->locale_territory[category] = new_territory;
+ changed = 1;
+ }
+ }
+@@ -384,7 +382,16 @@
+ is changing. The GNU Java compiler is known to repeatedly call
+ setlocale. */
+ if (changed && (category == LC_ALL || category == LC_CTYPE))
+- __build_ctype_tables (new_territory);
++ __build_ctype_tables (locobj, new_territory);
+
+ return old_locale;
+ }
++
++char *
++setlocale (int category, const char *locale)
++{
++
++ PTHREAD_UNSAFE
++
++ return __setlocale_l(&__locale_global, category, locale);
++}
+Index: gcc4/recipe/files/gcc/libunixlib/locale/strcoll.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/locale/strcoll.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/locale/strcoll.c (working copy)
+@@ -11,9 +11,15 @@
+ int
+ strcoll (const char *s1, const char *s2)
+ {
++ return strcoll_l (s1, s2, &__locale_global);
++}
++
++int
++strcoll_l (const char *s1, const char *s2, locale_t l)
++{
+ int regs[10];
+
+- regs[0] = __locale_territory[LC_COLLATE];
++ regs[0] = l->locale_territory[LC_COLLATE];
+ regs[1] = (int)s1;
+ regs[2] = (int)s2;
+ regs[3] = 0;
+@@ -21,3 +27,4 @@
+ __os_swi (Territory_Collate, regs);
+ return regs[0];
+ }
++
+Index: gcc4/recipe/files/gcc/libunixlib/locale/strxfrm.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/locale/strxfrm.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/locale/strxfrm.c (working copy)
+@@ -11,9 +11,15 @@
+ size_t
+ strxfrm (char *to, const char *from, size_t size)
+ {
++ return strxfrm_l (to, from, size, &__locale_global);
++}
++
++size_t
++strxfrm_l (char *to, const char *from, size_t size, locale_t l)
++{
+ int regs[10];
+
+- regs[0] = __locale_territory[LC_COLLATE];
++ regs[0] = l->locale_territory[LC_COLLATE];
+ regs[1] = (int)to;
+ regs[2] = (int)from;
+ regs[3] = size;
+Index: gcc4/recipe/files/gcc/libunixlib/locale/territory.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/locale/territory.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/locale/territory.c (nonexistent)
+@@ -1,10 +0,0 @@
+-/* __locale_territory
+- * Copyright (c) 2000-2006 UnixLib Developers
+- */
+-
+-#include <locale.h>
+-
+-/* Global used for all calls to the Territory module. These variable
+- contain the territory number as set by setlocale. A value of
+- -1 means use the C locale. */
+-int __locale_territory[LC_ALL + 1];
+Index: gcc4/recipe/files/gcc/libunixlib/string/stricmp.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/string/stricmp.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/string/stricmp.c (working copy)
+@@ -4,6 +4,7 @@
+ #include <string.h>
+ #include <strings.h>
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ stricmp (const char *s1, const char *s2)
+@@ -26,3 +27,24 @@
+ return result;
+ }
+ strong_alias (stricmp, strcasecmp)
++
++int
++strcasecmp_l (const char *s1, const char *s2, locale_t locobj)
++{
++ const unsigned char *p1 = (const unsigned char *) s1;
++ const unsigned char *p2 = (const unsigned char *) s2;
++ int result = 0;
++
++ if (p1 == p2)
++ return result;
++
++ while (! result)
++ {
++ result = tolower_l (*p1, locobj) - tolower_l (*p2, locobj);
++ if (*p1++ == '\0')
++ break;
++ p2 ++;
++ }
++
++ return result;
++}
+Index: gcc4/recipe/files/gcc/libunixlib/string/strnicmp.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/string/strnicmp.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/string/strnicmp.c (working copy)
+@@ -5,6 +5,7 @@
+ #include <string.h>
+ #include <strings.h>
+ #include <ctype.h>
++#include <locale.h>
+
+ int
+ strnicmp (const char *s1, const char *s2, size_t n)
+@@ -26,3 +27,22 @@
+ }
+ strong_alias (strnicmp, strncasecmp)
+
++int
++strncasecmp_l (const char *s1, const char *s2, size_t n, locale_t locobj)
++{
++ int i, j;
++
++ if (!n)
++ return 0;
++
++ do
++ {
++ i = *s1++, j = *s2++;
++ i = tolower_l (i, locobj);
++ j = tolower_l (j, locobj);
++ }
++ while (i && i == j && --n);
++
++ return i - j;
++}
++
+Index: gcc4/recipe/files/gcc/libunixlib/sys/errlist.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/sys/errlist.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/sys/errlist.c (working copy)
+@@ -211,3 +211,10 @@
+
+ return 0;
+ }
++
++char *
++strerror_l (int errnum, locale_t l)
++{
++ (void) l;
++ return strerror (errnum);
++}
+Index: gcc4/recipe/files/gcc/libunixlib/time/broken.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/time/broken.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/time/broken.c (working copy)
+@@ -49,7 +49,7 @@
+ #ifdef __TARGET_SCL__
+ -1,
+ #else
+- __locale_territory[LC_TIME],
++ __locale_global.locale_territory[LC_TIME],
+ #endif
+ riscos_time, ordinals);
+ }
+Index: gcc4/recipe/files/gcc/libunixlib/time/gmtime_r.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/time/gmtime_r.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/time/gmtime_r.c (working copy)
+@@ -46,7 +46,7 @@
+ #ifdef __TARGET_SCL__
+ -1,
+ #else
+- __locale_territory[LC_TIME],
++ __locale_global.locale_territory[LC_TIME],
+ #endif
+ riscos_time, ordinals)) != NULL)
+ {
+Index: gcc4/recipe/files/gcc/libunixlib/time/localtime_r.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/time/localtime_r.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/time/localtime_r.c (working copy)
+@@ -28,7 +28,7 @@
+ #ifdef __TARGET_SCL__
+ -1,
+ #else
+- __locale_territory[LC_TIME],
++ __locale_global.locale_territory[LC_TIME],
+ #endif
+ riscos_time, ordinals)) != NULL)
+ {
+Index: gcc4/recipe/files/gcc/libunixlib/time/mktime.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/time/mktime.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/time/mktime.c (working copy)
+@@ -23,7 +23,7 @@
+ #ifdef __TARGET_SCL__
+ -1,
+ #else
+- __locale_territory[LC_TIME],
++ __locale_global.locale_territory[LC_TIME],
+ #endif
+ riscos_time,
+ ordinals)) != NULL)
+Index: gcc4/recipe/files/gcc/libunixlib/time/stdtime.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/time/stdtime.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/time/stdtime.c (working copy)
+@@ -48,7 +48,7 @@
+ #ifdef __TARGET_SCL__
+ -1,
+ #else
+- __locale_territory[LC_TIME],
++ __locale_global.locale_territory[LC_TIME],
+ #endif
+ riscos_time,
+ result,
+Index: gcc4/recipe/files/gcc/libunixlib/time/strftime.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/time/strftime.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/time/strftime.c (working copy)
+@@ -353,7 +353,7 @@
+ int regs[10];
+ char buffer[64];
+
+- regs[0] = __locale_territory[LC_TIME];
++ regs[0] = __locale_global.locale_territory[LC_TIME];
+ regs[1] = (int)timep;
+ regs[2] = (int)buffer;
+ regs[3] = sizeof (buffer) - 1;
+@@ -368,7 +368,7 @@
+ int regs[10];
+ char buffer[64];
+
+- regs[0] = __locale_territory[LC_TIME];
++ regs[0] = __locale_global.locale_territory[LC_TIME];
+ regs[1] = (int)timep;
+ regs[2] = (int)buffer;
+ regs[3] = sizeof (buffer) - 1;
+Index: gcc4/recipe/files/gcc/libunixlib/time/tzset.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/time/tzset.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/time/tzset.c (working copy)
+@@ -36,7 +36,7 @@
+ /* Get timezone information for current territory. */
+ _kernel_swi_regs regs;
+ #ifndef __TARGET_SCL__
+- regs.r[0] = __locale_territory[LC_TIME];
++ regs.r[0] = __locale_global.locale_territory[LC_TIME];
+ #else
+ regs.r[0] = -1; /* Current territory. */
+ #endif
+Index: gcc4/recipe/files/gcc/libunixlib/unix/unix.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/unix/unix.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/unix/unix.c (working copy)
+@@ -191,7 +191,7 @@
+ __pthread_prog_init ();
+ __unixlib_signal_initialise (__u);
+ /* Initialise ctype tables to the C locale. */
+- __build_ctype_tables (-2);
++ __build_ctype_tables (&__locale_global, -2);
+ /* Define and initialise the Unix I/O. */
+ initialise_unix_io ();
+ __stdioinit ();
+Index: gcc4/recipe/files/gcc/libunixlib/vscript
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/vscript (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/vscript (working copy)
+@@ -58,6 +58,9 @@
+ __init_des_r;
+ __init_des;
+ __invalidate;
++ __locale_global;
++ __localeconv_lconv_init;
++ __localeconv_lconv_fini;
+ malloc_trim;
+ malloc_trim_unlocked;
+ malloc_unlocked;
+@@ -80,6 +83,7 @@
+ __res_vinit;
+ __runtime_features;
+ __setup_signalhandler_stack;
++ __setlocale_l;
+ __sdirinit;
+ __sfixinit;
+ __sfixfind;
+Index: gcc4/recipe/files/gcc/libunixlib/wchar/wctype.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/wchar/wctype.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/wchar/wctype.c (working copy)
+@@ -4,6 +4,7 @@
+ */
+
+ #include <ctype.h>
++#include <locale.h>
+ #include <wctype.h>
+
+ int
+@@ -71,3 +72,69 @@
+ {
+ return isxdigit (wc);
+ }
++
++int
++iswalnum_l (wint_t wc, locale_t locale)
++{
++ return isalnum_l (wc, locale);
++}
++
++int
++iswalpha_l (wint_t wc, locale_t locale)
++{
++ return isalpha_l (wc, locale);
++}
++
++int
++iswcntrl_l (wint_t wc, locale_t locale)
++{
++ return iscntrl_l (wc, locale);
++}
++
++int
++iswdigit_l (wint_t wc, locale_t locale)
++{
++ return isdigit_l (wc, locale);
++}
++
++int
++iswgraph_l (wint_t wc, locale_t locale)
++{
++ return isgraph_l (wc, locale);
++}
++
++int
++iswprint_l (wint_t wc, locale_t locale)
++{
++ return isprint_l (wc, locale);
++}
++
++int
++iswpunct_l (wint_t wc, locale_t locale)
++{
++ return ispunct_l (wc, locale);
++}
++
++int
++iswspace_l (wint_t wc, locale_t locale)
++{
++ return isspace_l (wc, locale);
++}
++
++int
++iswxdigit_l (wint_t wc, locale_t locale)
++{
++ return isxdigit_l (wc, locale);
++}
++
++wint_t
++towlower_l (wint_t wc, locale_t locale)
++{
++ return tolower_l (wc, locale);
++}
++
++wint_t
++towupper_l (wint_t wc, locale_t locale)
++{
++ return toupper_l (wc, locale);
++}
+Index: gcc4/recipe/files/gcc/libunixlib/wchar/wmissing.c
+===================================================================
+--- gcc4/recipe/files/gcc/libunixlib/wchar/wmissing.c (revision 7698)
++++ gcc4/recipe/files/gcc/libunixlib/wchar/wmissing.c (working copy)
+@@ -1,7 +1,7 @@
++#include <locale.h>
++#include <stdio.h>
+ #include <stdlib.h>
+ #include <wctype.h>
+-#include <wctype.h>
+-#include <stdio.h>
+
+ int iswupper (wint_t __wc)
+ {
+@@ -9,13 +9,26 @@
+ abort();
+ }
+
+-unsigned long int wcstoul (__const wchar_t *__restrict __nptr,
+- wchar_t **__restrict __endptr, int __base)
++int
++iswupper_l (wint_t wc, locale_t locale)
+ {
+ printf("%s: Not implemented\n", __func__);
+ abort();
+ }
+
++int iswlower (wint_t __wc)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
++int
++iswlower_l (wint_t wc, locale_t locale)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
+ int wcscoll (__const wchar_t *__s1, __const wchar_t *__s2)
+ {
+ printf("%s: Not implemented\n", __func__);
+@@ -22,12 +35,47 @@
+ abort();
+ }
+
+-int iswlower (wint_t __wc)
++int wcscoll_l (__const wchar_t *__s1, __const wchar_t *__s2,
++ locale_t loc)
+ {
+ printf("%s: Not implemented\n", __func__);
+ abort();
+ }
+
++int wcscasecmp (__const wchar_t *__s1, __const wchar_t *__s2)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
++int wcsncasecmp (__const wchar_t *__s1, __const wchar_t *__s2,
++ size_t __n)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
++int wcscasecmp_l (__const wchar_t *__s1, __const wchar_t *__s2,
++ locale_t __loc)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
++int wcsncasecmp_l (__const wchar_t *__s1, __const wchar_t *__s2,
++ size_t __n, locale_t __loc)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
++unsigned long int wcstoul (__const wchar_t *__restrict __nptr,
++ wchar_t **__restrict __endptr, int __base)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
+ long long int wcstoll (__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr, int __base)
+ {
+@@ -63,6 +111,13 @@
+ abort();
+ }
+
++size_t wcsxfrm_l (wchar_t *__s1, __const wchar_t *__s2,
++ size_t __n, locale_t __loc)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
+ float wcstof (__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr)
+ {
+@@ -83,6 +138,13 @@
+ abort();
+ }
+
++int
++iswblank_l (wint_t __wc, locale_t __locale)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
+ int iswctype (wint_t __wc, wctype_t __desc)
+ {
+ printf("%s: Not implemented\n", __func__);
+@@ -89,6 +151,12 @@
+ abort();
+ }
+
++int iswctype_l (wint_t __wc, wctype_t __desc, locale_t __locale)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
+ unsigned long long int wcstoull (__const wchar_t *__restrict __nptr,
+ wchar_t **__restrict __endptr,
+ int __base)
+@@ -116,6 +184,12 @@
+ abort();
+ }
+
++wctype_t wctype_l (__const char *__property, locale_t __locale)
++{
++ printf("%s: Not implemented\n", __func__);
++ abort();
++}
++
+ wint_t ungetwc(wint_t wc, FILE *stream)
+ {
+ printf("%s: Not implemented\n", __func__);
diff --git a/arm-unknown-riscos/recipes/patches/gcc4/ppl-download.p b/arm-unknown-riscos/recipes/patches/gcc4/ppl-download.p
index 7eb77c3..128e9eb 100644
--- a/arm-unknown-riscos/recipes/patches/gcc4/ppl-download.p
+++ b/arm-unknown-riscos/recipes/patches/gcc4/ppl-download.p
@@ -19,9 +19,9 @@
-$(SRCORIGDIR)/ppl-$(PPL_VERSION).tar.gz:
+$(SRCORIGDIR)/ppl-$(PPL_VERSION).tar.xz:
-mkdir -p $(SRCORIGDIR)
-- cd $(SRCORIGDIR) && wget -c http://www.cs.unipr.it/ppl/download/ftp/releases/$(PPL_VERSION)/ppl-$(PPL_VERSION).tar.gz
+- cd $(SRCORIGDIR) && wget -c https://www.bugseng.com/external/ppl/download/ftp/releases/$(PPL_VERSION)/ppl-$(PPL_VERSION).tar.gz
- touch $@
-+ wget -O $@ -c http://ci.netsurf-browser.org/toolchain/arm-unknown-riscos/ppl-$(PPL_VERSION).tar.xz
++ wget -O $@ -c https://ci.netsurf-browser.org/toolchain/arm-unknown-riscos/ppl-$(PPL_VERSION).tar.xz
# Download CLooG source:
$(SRCORIGDIR)/cloog-ppl-$(CLOOG_VERSION).tar.gz:
diff --git a/arm-unknown-riscos/recipes/patches/gcc4/ppl-version.p b/arm-unknown-riscos/recipes/patches/gcc4/ppl-version.p
deleted file mode 100644
index 7631c68..0000000
--- a/arm-unknown-riscos/recipes/patches/gcc4/ppl-version.p
+++ /dev/null
@@ -1,175 +0,0 @@
-Index: gcc4/Makefile
-===================================================================
---- gcc4/Makefile (revision 7156)
-+++ gcc4/Makefile (working copy)
-@@ -45,7 +45,7 @@
- MPFR_VERSION=3.0.1
- MPC_VERSION=0.8.2
- GCC_USE_PPL_CLOOG=yes
--PPL_VERSION=0.11.2
-+PPL_VERSION=1.2
- CLOOG_VERSION=0.15.11
- GCC_USE_LTO=yes
-
-@@ -182,8 +182,8 @@
- RONATIVE_MPFR_CONFIG_ARGS := --disable-shared --with-gmp=$(PREFIX_RONATIVEGCC_LIBS) --host=$(TARGET) --prefix=$(PREFIX_RONATIVEGCC_LIBS)
-
- # Configure arguments PPL:
--CROSS_PPL_CONFIG_ARGS := --disable-shared --disable-watchdog --with-gnu-ld --with-gmp-prefix=$(PREFIX_CROSSGCC_LIBS) --prefix=$(PREFIX_CROSSGCC_LIBS)
--RONATIVE_PPL_CONFIG_ARGS := --disable-shared --disable-watchdog --with-gnu-ld --with-gmp-prefix=$(PREFIX_RONATIVEGCC_LIBS) --host=$(TARGET) --prefix=$(PREFIX_RONATIVEGCC_LIBS)
-+CROSS_PPL_CONFIG_ARGS := --disable-shared --disable-watchdog --with-gnu-ld --with-gmp=$(PREFIX_CROSSGCC_LIBS) --prefix=$(PREFIX_CROSSGCC_LIBS)
-+RONATIVE_PPL_CONFIG_ARGS := --disable-shared --disable-watchdog --with-gnu-ld --with-gmp=$(PREFIX_RONATIVEGCC_LIBS) --host=$(TARGET) --prefix=$(PREFIX_RONATIVEGCC_LIBS)
-
- # Configure arguments CLooG:
- CROSS_CLOOG_CONFIG_ARGS := --disable-shared --with-gmp=$(PREFIX_CROSSGCC_LIBS) --with-bits=gmp --with-ppl=$(PREFIX_CROSSGCC_LIBS) --with-host-libstdcxx='-lstdc++' --prefix=$(PREFIX_CROSSGCC_LIBS)
-Index: gcc4/recipe/patches/cloog/configure.in.p
-===================================================================
---- gcc4/recipe/patches/cloog/configure.in.p (revision 7156)
-+++ gcc4/recipe/patches/cloog/configure.in.p (working copy)
-@@ -1,5 +1,5 @@
----- configure.in.orig 2013-05-01 16:15:33.235945936 +0200
--+++ configure.in 2013-05-01 16:15:15.484169106 +0200
-+--- configure.in.orig 2017-04-23 11:55:00.956204411 +0100
-++++ configure.in 2017-04-23 11:50:39.385519538 +0100
- @@ -41,7 +41,7 @@ dnl ************************************
- AC_PREREQ(2.13)
- AC_INIT(source/cloog.c)
-@@ -9,7 +9,13 @@
- dnl Every other copy of the package version number gets its value from here.
- AM_INIT_AUTOMAKE(cloog, 0.15)
- AC_CONFIG_HEADER(include/cloog/cloog-config.h)
--@@ -343,7 +343,7 @@ if test "x$with_ppl" != "x" -a "x$with_p
-+@@ -338,12 +338,12 @@ if test "x$with_ppl" != "x" -a "x$with_p
-+
-+ AC_MSG_CHECKING([for version 0.10 (or later revision) of PPL])
-+ AC_TRY_COMPILE([#include "ppl_c.h"],[
-+- #if PPL_VERSION_MAJOR != 0 || PPL_VERSION_MINOR < 10
-++ #if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 10
-+ choke me
- #endif
- ], [AC_MSG_RESULT([yes])], [AC_MSG_ERROR(Can't find correct version of PPL.) ])
-
-Index: gcc4/recipe/patches/gcc/configure.ac.p
-===================================================================
---- gcc4/recipe/patches/gcc/configure.ac.p (revision 7156)
-+++ gcc4/recipe/patches/gcc/configure.ac.p (working copy)
-@@ -1,6 +1,6 @@
- Index: configure.ac
- ===================================================================
----- configure.ac (revision 197339)
-+--- configure.ac (revision 247077)
- +++ configure.ac (working copy)
- @@ -152,6 +152,7 @@
- # Note that libiberty is not a target library.
-@@ -34,6 +34,15 @@
-
- if test "$enable_ppl_version_check" != no; then
- saved_CFLAGS="$CFLAGS"
-+@@ -1577,7 +1586,7 @@
-+ CFLAGS="$CFLAGS $pplinc $gmpinc"
-+ AC_MSG_CHECKING([for version 0.11 (revision 0 or later) of PPL])
-+ AC_TRY_COMPILE([#include "ppl_c.h"],[
-+- #if PPL_VERSION_MAJOR != 0 || PPL_VERSION_MINOR < 11
-++ #if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 11
-+ choke me
-+ #endif
-+ ], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]); ppllibs= ; pplinc= ; with_ppl=no ])
- @@ -2895,6 +2904,10 @@
- ;;
- esac
-Index: gcc4/recipe/patches/ppl/src.Congruence_System.defs.hh.p
-===================================================================
---- gcc4/recipe/patches/ppl/src.Congruence_System.defs.hh.p (revision 7156)
-+++ gcc4/recipe/patches/ppl/src.Congruence_System.defs.hh.p (nonexistent)
-@@ -1,19 +0,0 @@
----- src/Congruence_System.defs.hh.orig 2015-03-01 19:57:52.887328139 +0100
--+++ src/Congruence_System.defs.hh 2015-03-01 19:57:12.315328259 +0100
--@@ -33,6 +33,7 @@ site: http://www.cs.unipr.it/ppl/ . */
-- #include "Grid.types.hh"
-- #include "Grid_Certificate.types.hh"
-- #include <iosfwd>
--+#include <cstddef>
--
-- namespace Parma_Polyhedra_Library {
--
--@@ -235,7 +236,7 @@ public:
-- class const_iterator
-- : public std::iterator<std::forward_iterator_tag,
-- Congruence,
--- ptrdiff_t,
--+ std::ptrdiff_t,
-- const Congruence*,
-- const Congruence&> {
-- public:
-Index: gcc4/recipe/patches/ppl/src.Constraint_System.defs.hh.p
-===================================================================
---- gcc4/recipe/patches/ppl/src.Constraint_System.defs.hh.p (revision 7156)
-+++ gcc4/recipe/patches/ppl/src.Constraint_System.defs.hh.p (nonexistent)
-@@ -1,19 +0,0 @@
----- src/Constraint_System.defs.hh.orig 2015-03-01 19:58:03.831328106 +0100
--+++ src/Constraint_System.defs.hh 2015-03-01 19:57:12.315328259 +0100
--@@ -33,6 +33,7 @@ site: http://www.cs.unipr.it/ppl/ . */
-- #include "Congruence_System.types.hh"
-- #include <iterator>
-- #include <iosfwd>
--+#include <cstddef>
--
-- namespace Parma_Polyhedra_Library {
--
--@@ -204,7 +205,7 @@ public:
-- class const_iterator
-- : public std::iterator<std::forward_iterator_tag,
-- Constraint,
--- ptrdiff_t,
--+ std::ptrdiff_t,
-- const Constraint*,
-- const Constraint&> {
-- public:
-Index: gcc4/recipe/patches/ppl/src.Generator_System.defs.hh.p
-===================================================================
---- gcc4/recipe/patches/ppl/src.Generator_System.defs.hh.p (revision 7156)
-+++ gcc4/recipe/patches/ppl/src.Generator_System.defs.hh.p (nonexistent)
-@@ -1,19 +0,0 @@
----- src/Generator_System.defs.hh.orig 2015-03-01 19:58:13.511328077 +0100
--+++ src/Generator_System.defs.hh 2015-03-01 19:57:12.319328259 +0100
--@@ -33,6 +33,7 @@ site: http://www.cs.unipr.it/ppl/ . */
-- #include "Polyhedron.types.hh"
-- #include "Poly_Con_Relation.defs.hh"
-- #include <iosfwd>
--+#include <cstddef>
--
-- namespace Parma_Polyhedra_Library {
--
--@@ -250,7 +251,7 @@ public:
-- class const_iterator
-- : public std::iterator<std::forward_iterator_tag,
-- Generator,
--- ptrdiff_t,
--+ std::ptrdiff_t,
-- const Generator*,
-- const Generator&> {
-- public:
-Index: gcc4/recipe/patches/ppl/src.Grid_Generator_System.defs.hh.p
-===================================================================
---- gcc4/recipe/patches/ppl/src.Grid_Generator_System.defs.hh.p (revision 7156)
-+++ gcc4/recipe/patches/ppl/src.Grid_Generator_System.defs.hh.p (nonexistent)
-@@ -1,19 +0,0 @@
----- src/Grid_Generator_System.defs.hh.orig 2015-03-01 19:57:31.127328203 +0100
--+++ src/Grid_Generator_System.defs.hh 2015-03-01 19:57:12.315328259 +0100
--@@ -30,6 +30,7 @@ site: http://www.cs.unipr.it/ppl/ . */
-- #include "Variables_Set.types.hh"
-- #include "Grid.types.hh"
-- #include <iosfwd>
--+#include <cstddef>
--
-- namespace Parma_Polyhedra_Library {
--
--@@ -267,7 +268,7 @@ public:
-- class const_iterator
-- : public std::iterator<std::forward_iterator_tag,
-- Grid_Generator,
--- ptrdiff_t,
--+ std::ptrdiff_t,
-- const Grid_Generator*,
-- const Grid_Generator&>,
-- private Generator_System::const_iterator {
diff --git a/arm-unknown-riscos/recipes/patches/gcc4/unixlib-ldrex-strex.p b/arm-unknown-riscos/recipes/patches/gcc4/unixlib-ldrex-strex.p
deleted file mode 100644
index 045a0b8..0000000
--- a/arm-unknown-riscos/recipes/patches/gcc4/unixlib-ldrex-strex.p
+++ /dev/null
@@ -1,304 +0,0 @@
-Backport r7043 from upstream: partially replaces use of SWP with LDREX/STREX
-on systems where SWP is no longer available. This fix is incomplete,
-but sufficient for our purposes.
-
-Fri Mar 11 14:51:54 GMT 2016 Lee Noar <leenoar@sky.com>
-
- * sys/_cpucaps.s: New file. Provide functions to probe the
- OS for details of the CPU (currently SWP, LDREX/STREX
- availability).
- * Makefile.am: Add above file.
- * include/unixlib/local.h: Add declarations for user facing
- functions provided above.
- * incl-local/internal/asm_dec.s(__ul_global): Add entry to
- record CPU flags.
- * incl-local/internal/unix.h: Likewise.
- * pthread/_ints.s(__pthread_disable_ints,__pthread_protect_unsafe):
- Use CPU flags to determine whether to use the SWP instruction or
- LRDEX/STREX.
- * sys/_syslib.s(__main): Add call to __probe_cpu_caps.
- (__unixlib_fatal): Use CPU flags to determine whether to use the
- SWP instruction or LRDEX/STREX.
-
-
-Index: gcc4/recipe/files/gcc/libunixlib/pthread/_ints.s
-===================================================================
---- gcc4/recipe/files/gcc/libunixlib/pthread/_ints.s (revision 7042)
-+++ gcc4/recipe/files/gcc/libunixlib/pthread/_ints.s (revision 7043)
-@@ -2,7 +2,7 @@
- @ disable_ints can be called multiple times, provided enable_ints is
- @ subsequently called an equal number of times
- @ Written by Martin Piper and Alex Waugh
--@ Copyright (c) 2002-2008 UnixLib Developers
-+@ Copyright (c) 2002-2016 UnixLib Developers
-
- #include "internal/asm_dec.s"
-
-@@ -20,15 +20,26 @@
- PICEQ "LDR a2, [a2, #0]"
- PICEQ "LDR a2, [a2, #__GOTT_INDEX__]" @ a2 = GOT ptr
-
-- LDR a1, .L0 @=__ul_global
-+ LDR a1, .L0 @ =__ul_global
- PICEQ "LDR a1, [a2, a1]"
-+ LDR a4, [a1, #GBL_CPU_FLAGS]
- ADD a1, a1, #GBL_PTH_WORKSEMAPHORE
-+ TST a4, #__CPUCAP_HAVE_SWP
-+ @ From this point onwards we will not be interrupted by the callback
-+ BEQ 0f
-+
- MOV a3, #1
- SWP a2, a3, [a1]
-- @ From this point onwards we will not be interrupted by the callback
- ADD a2, a2, #1
- STR a2, [a1]
- MOV pc, lr
-+0:
-+ LDREX a2, [a1]
-+ ADD a2, a2, #1
-+ STREX a3, a2, [a1]
-+ TEQ a3, #1
-+ BEQ 0b
-+ MOV pc, lr
- .L0:
- WORD __ul_global
- DECLARE_FUNCTION __pthread_disable_ints
-@@ -78,18 +89,32 @@
- PICEQ "LDR a1, [a1, #0]"
- PICEQ "LDR a1, [a1, #__GOTT_INDEX__]" @ a1 = GOT ptr
-
-- LDR a4, .L2 @=__ul_global
-+ LDR a4, .L2 @ =__ul_global
- PICEQ "LDR a4, [a1, a4]"
-+ LDR a2, [a4, #GBL_CPU_FLAGS]
- ADD a1, a4, #GBL_PTH_WORKSEMAPHORE
-+ TST a2, #__CPUCAP_HAVE_SWP
-+ @ From this point onwards we cannot be interrupted by the callback
-+ BEQ 0f
-+
- MOV a2, #1
- SWP a3, a2, [a1]
-- @ From this point onwards we cannot be interrupted by the callback
- CMP a3, #0
-- STRNE a3, [a1, #0] @ Restore original value
-+ BEQ 1f
-+ STR a3, [a1, #0] @ Restore original value
- @ Return, as if ints are disabled on entry to the
- @ calling function then they should not be reenabled
- @ until the calling function has returned
-+ MOV pc, lr
-+0:
-+ LDREX a3, [a1]
-+ MOV ip, #1
-+ STREX a2, ip, [a1]
-+ TEQ a2, #1
-+ BEQ 0b
-+ TEQ a3, #0
- MOVNE pc, lr
-+1:
-
- #if __UNIXLIB_PARANOID
- LDR a3, [a4, #GBL_PTH_RETURN_ADDRESS]
-Index: gcc4/recipe/files/gcc/libunixlib/include/unixlib/local.h
-===================================================================
---- gcc4/recipe/files/gcc/libunixlib/include/unixlib/local.h (revision 7042)
-+++ gcc4/recipe/files/gcc/libunixlib/include/unixlib/local.h (revision 7043)
-@@ -133,6 +133,16 @@
- socket. Is -1 when socket handle is not valid. */
- extern int __get_ro_socket (int __sockfd);
-
-+/* Return 1 if the SWP instruction is available, otherwise 0. */
-+extern unsigned int __cpucap_have_swp (void);
-+
-+/* Return 1 if the LDREX/STREX instructions are available, otherwise 0. */
-+extern unsigned int __cpucap_have_rex (void);
-+
-+/* Return 1 if the LDREX/STREX instructions that operate on bytes, half-words
-+ and double words are available, otherwise 0. */
-+extern unsigned int __cpucap_have_rexbhd (void);
-+
- __END_DECLS
-
- #endif
- * incl-local/internal/asm_dec.s(XSOM_DeregisterClient): Add
-Index: gcc4/recipe/files/gcc/libunixlib/Makefile.am
-===================================================================
---- gcc4/recipe/files/gcc/libunixlib/Makefile.am (revision 7042)
-+++ gcc4/recipe/files/gcc/libunixlib/Makefile.am (revision 7043)
-@@ -1027,6 +1027,7 @@
- sys/sigsetjmp.c \
- sys/stackalloc.c \
- sys/vfork.c \
-+ sys/_cpucaps.s \
- sys/_getcpuarch.s \
- sys/_jmp.s \
- sys/_mman.s \
-Index: gcc4/recipe/files/gcc/libunixlib/incl-local/internal/asm_dec.s
-===================================================================
---- gcc4/recipe/files/gcc/libunixlib/incl-local/internal/asm_dec.s (revision 7042)
-+++ gcc4/recipe/files/gcc/libunixlib/incl-local/internal/asm_dec.s (revision 7043)
-@@ -269,8 +269,10 @@
- .set GBL_FLS_LBSTM_ON_RD, 108 @ = __ul_global.fls_lbstm_on_rd
- .set GBL_PTH_CALLEVERY_RMA, 112 @ = __ul_global.pthread_callevery_rma
-
-+.set GBL_CPU_FLAGS, 116 @ = __ul_global.cpu_flags
-+
- #if !defined(__SOFTFP__) && defined(__VFP_FP__)
--.set GBL_VFP_REGCOUNT, 116 @ = __ul_global.vfp_regcount
-+.set GBL_VFP_REGCOUNT, 120 @ = __ul_global.vfp_regcount
- #endif
-
- @ Entries in the __ul_memory table. Must be kept in sync with
-@@ -322,3 +324,7 @@
- .set CRT1_LIB_FINI, 32 @ Ptr to function to finalise shared libraries
- @ at program exit - can be NULL.
- #endif
-+
-+#define __CPUCAP_HAVE_SWP 0x1
-+#define __CPUCAP_HAVE_REX 0x2
-+#define __CPUCAP_HAVE_REXBHD 0x4
-Index: gcc4/recipe/files/gcc/libunixlib/incl-local/internal/unix.h
-===================================================================
---- gcc4/recipe/files/gcc/libunixlib/incl-local/internal/unix.h (revision 7042)
-+++ gcc4/recipe/files/gcc/libunixlib/incl-local/internal/unix.h (revision 7043)
-@@ -197,6 +197,8 @@
- the life of the program. This block is passed to the call_every handler in
- r12. */
-
-+ unsigned int cpu_flags; /* Flags indicating the capabilities of the CPU. */
-+
- #if !defined(__SOFTFP__) && defined(__VFP_FP__)
- int vfp_regcount; /* Number of doubleword registers we should request for
- VFP contexts */
-Index: gcc4/recipe/files/gcc/libunixlib/sys/_cpucaps.s
-===================================================================
---- gcc4/recipe/files/gcc/libunixlib/sys/_cpucaps.s (revision 0)
-+++ gcc4/recipe/files/gcc/libunixlib/sys/_cpucaps.s (revision 7043)
-@@ -0,0 +1,91 @@
-+@ Determine the capabilities of the CPU and allow callers to enquire
-+@ what they are.
-+@ Copyright (c) 2016 UnixLib Developers.
-+@ Written by Lee Noar.
-+
-+#include "internal/asm_dec.s"
-+
-+ .text
-+
-+@ Determine what the CPU capabilities are, and record them.
-+@ Called early on during program initialisation in _syslib.s.
-+ .global __probe_cpu_caps
-+ NAME __probe_cpu_caps
-+__probe_cpu_caps:
-+ MOV r0, #0
-+ SWI XOS_PlatformFeatures
-+ MOVVS r0, #0
-+
-+ MOV r2, #0
-+ @ The OS flag is set to 1 to indicate _no_ SWP instruction available (for
-+ @ backwards compatibility). We reverse it here and set our flag to 1 to
-+ @ indicate that SWP _is_ available.
-+ TST r0, #1<<11 @ SWP{B} not available
-+ ORREQ r2, r2, #__CPUCAP_HAVE_SWP
-+ TST r0, #1<<12 @ LDREX/STREX available
-+ ORRNE r2, r2, #__CPUCAP_HAVE_REX
-+ TST r0, #1<<13 @ LDREX/STREX{B/H/D} available
-+ ORRNE r2, r2, #__CPUCAP_HAVE_REXBHD
-+
-+ PICEQ "LDR r0, =__GOTT_BASE__"
-+ PICEQ "LDR r0, [r0, #0]"
-+ PICEQ "LDR r0, [r0, #__GOTT_INDEX__]" @ r0 = GOT ptr
-+ LDR r1, .L0 @ =__ul_global
-+ PICEQ "LDR r1, [r0, r1]"
-+ STR r2, [r1, #GBL_CPU_FLAGS]
-+
-+ MOV pc, lr
-+.L0:
-+ WORD __ul_global
-+ DECLARE_FUNCTION __probe_cpu_caps
-+
-+ .global __cpucap_have_swp
-+ NAME __cpucap_have_swp
-+__cpucap_have_swp:
-+ PICEQ "LDR r0, =__GOTT_BASE__"
-+ PICEQ "LDR r0, [r0, #0]"
-+ PICEQ "LDR r0, [r0, #__GOTT_INDEX__]" @ r0 = GOT ptr
-+ LDR r1, .L0 @ =__ul_global
-+ PICEQ "LDR r1, [r0, r1]"
-+ LDR r0, [r1, #GBL_CPU_FLAGS]
-+ TST r0, #__CPUCAP_HAVE_SWP
-+ MOVEQ r0, #0
-+ MOVNE r0, #1
-+
-+ MOV pc, lr
-+ DECLARE_FUNCTION __cpucap_have_swp
-+
-+@ Return 1 if LDREX/STREX instructions are available on the CPU, otherwise 0.
-+ .global __cpucap_have_rex
-+ NAME __cpucap_have_rex
-+__cpucap_have_rex:
-+ PICEQ "LDR r0, =__GOTT_BASE__"
-+ PICEQ "LDR r0, [r0, #0]"
-+ PICEQ "LDR r0, [r0, #__GOTT_INDEX__]" @ r0 = GOT ptr
-+ LDR r1, .L0 @ =__ul_global
-+ PICEQ "LDR r1, [r0, r1]"
-+ LDR r0, [r1, #GBL_CPU_FLAGS]
-+ TST r0, #__CPUCAP_HAVE_REX
-+ MOVEQ r0, #0
-+ MOVNE r0, #1
-+
-+ MOV pc, lr
-+ DECLARE_FUNCTION __cpucap_have_rex
-+
-+@ Return 1 if LDREX/STREX instructions that work on non-32 bit data sizes
-+@ are available on the CPU, otherwise 0.
-+ .global __cpucap_have_rexbhd
-+ NAME __cpucap_have_rexbhd
-+__cpucap_have_rexbhd:
-+ PICEQ "LDR r0, =__GOTT_BASE__"
-+ PICEQ "LDR r0, [r0, #0]"
-+ PICEQ "LDR r0, [r0, #__GOTT_INDEX__]" @ r0 = GOT ptr
-+ LDR r1, .L0 @ =__ul_global
-+ PICEQ "LDR r1, [r0, r1]"
-+ LDR r0, [r1, #GBL_CPU_FLAGS]
-+ TST r0, #__CPUCAP_HAVE_REXBHD
-+ MOVEQ r0, #0
-+ MOVNE r0, #1
-+
-+ MOV pc, lr
-+ DECLARE_FUNCTION __cpucap_have_rexbhd
-Index: gcc4/recipe/files/gcc/libunixlib/sys/_syslib.s
-===================================================================
---- gcc4/recipe/files/gcc/libunixlib/sys/_syslib.s (revision 7042)
-+++ gcc4/recipe/files/gcc/libunixlib/sys/_syslib.s (revision 7043)
-@@ -255,6 +255,8 @@
- BCC __exit_with_error_num
- unknown_cpu_arch:
-
-+ BL __probe_cpu_caps
-+
- @ Use of DAs explicitly overridden if __dynamic_no_da is declared
- MOV lr, #-1
- STR lr, [ip, #GBL_DYNAMIC_NUM]
-@@ -1286,9 +1288,21 @@
- @ error handling. As last resort to avoid an infinite loop
- @ we go for a straight OS_Exit scenario. Anything better we
- @ can do ?
-+ ADD a3, a4, #GBL_PANIC_MODE
-+ LDR a2, [a4, #GBL_CPU_FLAGS]
-+ TST a2, #__CPUCAP_HAVE_SWP
-+ BEQ 0f
-+
- MOV a2, #1
-- ADD a3, a4, #GBL_PANIC_MODE
- SWP a2, a2, [a3]
-+ B 1f
-+0:
-+ LDREX a2, [a3]
-+ MOV ip, #1
-+ STREX lr, ip, [a3]
-+ TEQ lr, #1
-+ BEQ 0b
-+1:
- TEQ a2, #0
- BEQ __unixlib_fatal_cont1
-
diff --git a/i686-w64-mingw32/Makefile b/i686-w64-mingw32/Makefile
index 484c476..5d35249 100644
--- a/i686-w64-mingw32/Makefile
+++ b/i686-w64-mingw32/Makefile
@@ -1,29 +1,28 @@
-#!/usr/bin/make
+#!/bin/make
# Build cross toolchain for i686 processor with a win32 (mingw) ABI
-UPSTREAM_GCC_VERSION := 4.8.4
-UPSTREAM_GCC_TARBALL := gcc-$(UPSTREAM_GCC_VERSION).tar.bz2
+UPSTREAM_GCC_VERSION := 12.2.0
+UPSTREAM_GCC_TARBALL := gcc-$(UPSTREAM_GCC_VERSION).tar.xz
UPSTREAM_GCC_URI := http://ftpmirror.gnu.org/gcc/gcc-$(UPSTREAM_GCC_VERSION)/$(UPSTREAM_GCC_TARBALL)
-UPSTREAM_BINUTILS_VERSION := 2.25
+UPSTREAM_BINUTILS_VERSION := 2.39
UPSTREAM_BINUTILS_TARBALL := binutils-$(UPSTREAM_BINUTILS_VERSION).tar.bz2
UPSTREAM_BINUTILS_URI := http://ftpmirror.gnu.org/binutils/$(UPSTREAM_BINUTILS_TARBALL)
-UPSTREAM_GMP_VERSION := 5.0.5
+UPSTREAM_GMP_VERSION := 6.2.1
UPSTREAM_GMP_TARBALL := gmp-$(UPSTREAM_GMP_VERSION).tar.bz2
-UPSTREAM_GMP_URI := https://gmplib.org/download/gmp-$(UPSTREAM_GMP_VERSION)/$(UPSTREAM_GMP_TARBALL)
+UPSTREAM_GMP_URI := http://ftp.gnu.org/gnu/gmp/$(UPSTREAM_GMP_TARBALL)
-# Would use 3.0.0, but that dislikes in-tree gmp sources
-UPSTREAM_MPFR_VERSION := 2.4.2
-UPSTREAM_MPFR_TARBALL := mpfr-$(UPSTREAM_MPFR_VERSION).tar.bz2
+UPSTREAM_MPFR_VERSION := 4.2.0
+UPSTREAM_MPFR_TARBALL := mpfr-$(UPSTREAM_MPFR_VERSION).tar.xz
UPSTREAM_MPFR_URI := http://www.mpfr.org/mpfr-$(UPSTREAM_MPFR_VERSION)/$(UPSTREAM_MPFR_TARBALL)
-UPSTREAM_MPC_VERSION := 0.8.2
+UPSTREAM_MPC_VERSION := 1.3.0
UPSTREAM_MPC_TARBALL := mpc-$(UPSTREAM_MPC_VERSION).tar.gz
UPSTREAM_MPC_URI := http://www.multiprecision.org/downloads/$(UPSTREAM_MPC_TARBALL)
-UPSTREAM_MINGW_VERSION := 3.3.0
+UPSTREAM_MINGW_VERSION := 10.0.0
UPSTREAM_MINGW_TARBALL := mingw-w64-v$(UPSTREAM_MINGW_VERSION).tar.bz2
UPSTREAM_MINGW_URI := "http://downloads.sourceforge.net/project/mingw-w64/mingw-w64/mingw-w64-release/$(UPSTREAM_MINGW_TARBALL)?r=http%3A%2F%2Fmingw-w64.sourceforge.net%2Fdownload.php&ts=1426088797&use_mirror=cznic"
@@ -62,7 +61,7 @@ $(BUILDSTEPS)/gcc-core.d: $(BUILDSTEPS)/srcdir-step3.d $(BUILDSTEPS)/binutils.d
--prefix=$(PREFIX) --target=$(TARGET_NAME) \
--enable-languages=c,c++ --with-system-zlib --disable-multilib \
--enable-shared --enable-fully-dynamic-string
- cd $(BUILDDIR)/gcc && PATH="$(PREFIX)/bin:$(PATH)" make all-gcc
+ cd $(BUILDDIR)/gcc && PATH="$(PREFIX)/bin:$(PATH)" make all-gcc -j 8
cd $(BUILDDIR)/gcc && PATH="$(PREFIX)/bin:$(PATH)" make install-gcc
touch $@
@@ -104,7 +103,6 @@ $(BUILDSTEPS)/mingw-srcdir.d: $(SOURCESDIR)/$(UPSTREAM_MINGW_TARBALL)
###
$(BUILDSTEPS)/srcdir-step3.d: $(BUILDSTEPS)/srcdir-step2.d
- for p in `ls $(RECIPES)/patches/gcc4/*.p` ; do patch -d $(GCC_SRCDIR) -p0 <$$p ; done
touch $@
$(BUILDSTEPS)/srcdir-step2.d: $(BUILDSTEPS)/srcdir-step1.d $(SOURCESDIR)/$(UPSTREAM_GMP_TARBALL) $(SOURCESDIR)/$(UPSTREAM_MPFR_TARBALL) $(SOURCESDIR)/$(UPSTREAM_MPC_TARBALL)
@@ -144,28 +142,22 @@ $(BUILDSTEPS)/binutils-srcdir.d: $(SOURCESDIR)/$(UPSTREAM_BINUTILS_TARBALL)
###
$(SOURCESDIR)/$(UPSTREAM_GCC_TARBALL):
- wget -q -O $@ $(UPSTREAM_GCC_URI)
- touch $@
+ wget -q -O $@ $(UPSTREAM_GCC_URI)
$(SOURCESDIR)/$(UPSTREAM_GMP_TARBALL):
wget -q -O $@ $(UPSTREAM_GMP_URI)
- touch $@
$(SOURCESDIR)/$(UPSTREAM_MPFR_TARBALL):
wget -q -O $@ $(UPSTREAM_MPFR_URI)
- touch $@
$(SOURCESDIR)/$(UPSTREAM_MPC_TARBALL):
wget -q -O $@ $(UPSTREAM_MPC_URI)
- touch $@
$(SOURCESDIR)/$(UPSTREAM_BINUTILS_TARBALL):
wget -q -O $@ $(UPSTREAM_BINUTILS_URI)
- touch $@
$(SOURCESDIR)/$(UPSTREAM_MINGW_TARBALL):
wget -q -O $@ $(UPSTREAM_MINGW_URI)
- touch $@
###
# Rule to create buildsteps dir
@@ -176,7 +168,7 @@ $(BUILDSTEPS)/buildsteps.d: $(SOURCESDIR) $(SRCDIR)
touch $@
$(SOURCESDIR):
- mkdir -p $@
+ mkdir -p $(SOURCESDIR)
$(SRCDIR):
- mkdir -p $@
+ mkdir -p $(SRCDIR)
diff --git a/m5475-atari-mint/Makefile b/m5475-atari-mint/Makefile
index 43e6c56..6ed3b4c 100644
--- a/m5475-atari-mint/Makefile
+++ b/m5475-atari-mint/Makefile
@@ -5,13 +5,13 @@
UPSTREAM_GCC_VERSION := 4.6.4
UPSTREAM_GCC_TARBALL := gcc-$(UPSTREAM_GCC_VERSION).tar.bz2
UPSTREAM_GCC_URI := http://ftp.gnu.org/gnu/gcc/gcc-$(UPSTREAM_GCC_VERSION)/$(UPSTREAM_GCC_TARBALL)
-UPSTREAM_GCC_PATCH := gcc-4.6.4-mint-20130415.patch.bz2
+UPSTREAM_GCC_PATCH := gcc-4.6.4-mint-20200504.patch.bz2
UPSTREAM_GCC_PATCH_URI := http://vincent.riviere.free.fr/soft/m68k-atari-mint/archives/$(UPSTREAM_GCC_PATCH)
-UPSTREAM_BINUTILS_VERSION := 2.24
+UPSTREAM_BINUTILS_VERSION := 2.30
UPSTREAM_BINUTILS_TARBALL := binutils-$(UPSTREAM_BINUTILS_VERSION).tar.bz2
UPSTREAM_BINUTILS_URI := ftp://ftp.gnu.org/gnu/binutils/$(UPSTREAM_BINUTILS_TARBALL)
-UPSTREAM_BINUTILS_PATCH := binutils-2.24-mint-20131217.patch.bz2
+UPSTREAM_BINUTILS_PATCH := binutils-2.30-mint-20180703.patch.bz2
UPSTREAM_BINUTILS_PATCH_URI := http://vincent.riviere.free.fr/soft/m68k-atari-mint/archives/$(UPSTREAM_BINUTILS_PATCH)
UPSTREAM_GMP_VERSION := 4.3.2
@@ -27,21 +27,21 @@ UPSTREAM_MPC_VERSION := 0.8.2
UPSTREAM_MPC_TARBALL := mpc-$(UPSTREAM_MPC_VERSION).tar.gz
UPSTREAM_MPC_URI := http://www.multiprecision.org/mpc/download/$(UPSTREAM_MPC_TARBALL)
-UPSTREAM_MINTBIN_VERSION := CVS-20110527
+UPSTREAM_MINTBIN_VERSION := Git-20201129
UPSTREAM_MINTBIN_TARBALL := mintbin-$(UPSTREAM_MINTBIN_VERSION).tar.gz
UPSTREAM_MINTBIN_URI := http://vincent.riviere.free.fr/soft/m68k-atari-mint/archives/$(UPSTREAM_MINTBIN_TARBALL)
-UPSTREAM_MINTLIB_VERSION := CVS-20131219
+UPSTREAM_MINTLIB_VERSION := Git-20220821
UPSTREAM_MINTLIB_TARBALL := mintlib-$(UPSTREAM_MINTLIB_VERSION).tar.gz
UPSTREAM_MINTLIB_URI := http://vincent.riviere.free.fr/soft/m68k-atari-mint/archives/$(UPSTREAM_MINTLIB_TARBALL)
UPSTREAM_PML_VERSION := 2.03
UPSTREAM_PML_TARBALL := pml-$(UPSTREAM_PML_VERSION).tar.bz2
UPSTREAM_PML_URI := http://vincent.riviere.free.fr/soft/m68k-atari-mint/archives/$(UPSTREAM_PML_TARBALL)
-UPSTREAM_PML_PATCH := pml-2.03-mint-20110207.patch.bz2
+UPSTREAM_PML_PATCH := pml-2.03-mint-20191013.patch.bz2
UPSTREAM_PML_PATCH_URI := http://vincent.riviere.free.fr/soft/m68k-atari-mint/archives/$(UPSTREAM_PML_PATCH)
-UPSTREAM_GEMLIB_VERSION := CVS-20130415
+UPSTREAM_GEMLIB_VERSION := Git-20230112
UPSTREAM_GEMLIB_TARBALL := gemlib-$(UPSTREAM_GEMLIB_VERSION).tar.bz2
UPSTREAM_GEMLIB_URI := http://vincent.riviere.free.fr/soft/m68k-atari-mint/archives/$(UPSTREAM_GEMLIB_TARBALL)
@@ -49,6 +49,9 @@ GCC_AUTOCONF := autoconf2.64
GCC_AUTOHEADER := autoheader2.64
GCC_AUTORECONF := autoreconf2.64
GCC_AUTOM4TE := autom4te2.64
+GCC_AUTOMAKE := automake-1.11
+GCC_ACLOCAL := aclocal-1.11
+GCC_MAKEINFO := :
TOP := $(CURDIR)
RECIPES := $(TOP)/recipes
@@ -59,6 +62,8 @@ SRCDIR := $(BUILDDIR)/srcdir
GCC_SRCDIR := $(SRCDIR)/gcc
BINUTILS_SRCDIR := $(SRCDIR)/binutils
MINTBIN_SRCDIR := $(SRCDIR)/mintbin
+# optionally pass -jN here
+BUILD_SMP :=
TARGET_NAME := m5475-atari-mint
@@ -81,8 +86,8 @@ $(BUILDSTEPS)/gemlib.d: $(BUILDSTEPS)/stage2.d $(SOURCESDIR)/$(UPSTREAM_GEMLIB_T
tar xjf $(SOURCESDIR)/$(UPSTREAM_GEMLIB_TARBALL)
mv gemlib-$(UPSTREAM_GEMLIB_VERSION) $(BUILDDIR)/gemlib
for p in `ls $(RECIPES)/patches/gemlib/*.p` ; do patch -d $(BUILDDIR)/gemlib -p0 <$$p ; done
- cd $(BUILDDIR)/gemlib/gemlib && PATH="$(PREFIX)/bin:$(PATH)" make
- cd $(BUILDDIR)/gemlib/gemlib && PATH="$(PREFIX)/bin:$(PATH)" make install
+ cd $(BUILDDIR)/gemlib && PATH="$(PREFIX)/bin:$(PATH)" make
+ cd $(BUILDDIR)/gemlib && PATH="$(PREFIX)/bin:$(PATH)" make install
touch $@
###
@@ -131,7 +136,7 @@ $(BUILDSTEPS)/mintlib.d: $(BUILDSTEPS)/bootstrap-compiler.d $(SOURCESDIR)/$(UPST
# Rules to build and install the bootstrap compiler
###
-GCC_ENV_PARAMS := AUTOCONF=$(GCC_AUTOCONF) AUTOHEADER=$(GCC_AUTOHEADER) AUTOM4TE=$(GCC_AUTOM4TE) PATH="$(PREFIX)/bin:$(PATH)"
+GCC_ENV_PARAMS := AUTOCONF=$(GCC_AUTOCONF) AUTOHEADER=$(GCC_AUTOHEADER) AUTOM4TE=$(GCC_AUTOM4TE) ACLOCAL=$(GCC_ACLOCAL) AUTOMAKE=$(GCC_AUTOMAKE) MAKEINFO=$(GCC_MAKEINFO) PATH="$(PREFIX)/bin:$(PATH)"
$(BUILDSTEPS)/bootstrap-compiler.d: $(BUILDSTEPS)/srcdir-step3.d $(BUILDSTEPS)/binutils.d $(BUILDSTEPS)/mintbin.d
cd $(BUILDDIR) && $(GCC_ENV_PARAMS) $(GCC_SRCDIR)/configure \
@@ -140,9 +145,9 @@ $(BUILDSTEPS)/bootstrap-compiler.d: $(BUILDSTEPS)/srcdir-step3.d $(BUILDSTEPS)/b
--enable-checking=no --enable-c99 \
--enable-maintainer-mode --without-headers \
--with-arch=cf
- cd $(BUILDDIR) && $(GCC_ENV_PARAMS) make all-gcc
+ cd $(BUILDDIR) && $(GCC_ENV_PARAMS) make $(BUILD_SMP) all-gcc
cd $(BUILDDIR) && $(GCC_ENV_PARAMS) make install-gcc
- cd $(BUILDDIR) && $(GCC_ENV_PARAMS) make all-target-libgcc
+ cd $(BUILDDIR) && $(GCC_ENV_PARAMS) make $(BUILD_SMP) all-target-libgcc
cd $(BUILDDIR) && $(GCC_ENV_PARAMS) make install-target-libgcc
touch $@
@@ -154,9 +159,9 @@ $(BUILDSTEPS)/bootstrap-compiler.d: $(BUILDSTEPS)/srcdir-step3.d $(BUILDSTEPS)/b
$(BUILDSTEPS)/srcdir-step3.d: $(BUILDSTEPS)/srcdir-step2.d $(SOURCESDIR)/$(UPSTREAM_GCC_PATCH)
bzcat $(SOURCESDIR)/$(UPSTREAM_GCC_PATCH) | patch -d $(GCC_SRCDIR) -p1
cd $(GCC_SRCDIR) && ./contrib/gcc_update --touch
- $(GCC_AUTORECONF) -f $(GCC_SRCDIR)/libmudflap
- $(GCC_AUTORECONF) -f $(GCC_SRCDIR)/libssp
- $(GCC_AUTORECONF) -f $(GCC_SRCDIR)/libquadmath
+ $(GCC_ENV_PARAMS) $(GCC_AUTORECONF) -f $(GCC_SRCDIR)/libmudflap
+ $(GCC_ENV_PARAMS) $(GCC_AUTORECONF) -f $(GCC_SRCDIR)/libssp
+ $(GCC_ENV_PARAMS) $(GCC_AUTORECONF) -f $(GCC_SRCDIR)/libquadmath
for p in `ls $(RECIPES)/patches/gcc/*.p` ; do patch -d $(GCC_SRCDIR) -p0 <$$p ; done
touch $@
@@ -183,7 +188,7 @@ $(BUILDSTEPS)/$(UPSTREAM_GCC_TARBALL).d: $(BUILDSTEPS)/buildsteps.d $(SOURCESDIR
$(BUILDSTEPS)/mintbin.d: $(BUILDSTEPS)/mintbin-srcdir.d
mkdir -p $(BUILDDIR)/mintbin
- cd $(BUILDDIR)/mintbin && $(BINUTILS_SRCDIR)/configure --prefix=$(PREFIX) --target=$(TARGET_NAME) --disable-nls
+ cd $(BUILDDIR)/mintbin && $(MINTBIN_SRCDIR)/configure --prefix=$(PREFIX) --target=$(TARGET_NAME) --disable-nls
cd $(BUILDDIR)/mintbin && make
cd $(BUILDDIR)/mintbin && make install
touch $@
@@ -200,7 +205,7 @@ $(BUILDSTEPS)/mintbin-srcdir.d: $(SOURCESDIR)/$(UPSTREAM_MINTBIN_TARBALL)
$(BUILDSTEPS)/binutils.d: $(BUILDSTEPS)/binutils-srcdir.d
mkdir -p $(BUILDDIR)/binutils
cd $(BUILDDIR)/binutils && $(BINUTILS_SRCDIR)/configure --prefix=$(PREFIX) --target=$(TARGET_NAME) --disable-nls
- cd $(BUILDDIR)/binutils && make
+ cd $(BUILDDIR)/binutils && make $(BUILD_SMP)
cd $(BUILDDIR)/binutils && make install
touch $@
diff --git a/m5475-atari-mint/fetchsrc b/m5475-atari-mint/fetchsrc
index bbe8f6b..9396a4e 100755
--- a/m5475-atari-mint/fetchsrc
+++ b/m5475-atari-mint/fetchsrc
@@ -4,7 +4,7 @@
# Usage fetchsrc <target> <source> <upstream> <output>
-NSSRV="http://ci.netsurf-browser.org/toolchain/"
+NSSRV="https://ci.netsurf-browser.org/toolchain/"
wget -q -O ${4} ${NSSRV}/${1}/${2}
if [ $? -ne 0 ];then
diff --git a/m5475-atari-mint/recipes/patches/gemlib/CONFIGVARS.p b/m5475-atari-mint/recipes/patches/gemlib/CONFIGVARS.p
index 5692a21..f65dc89 100644
--- a/m5475-atari-mint/recipes/patches/gemlib/CONFIGVARS.p
+++ b/m5475-atari-mint/recipes/patches/gemlib/CONFIGVARS.p
@@ -1,29 +1,28 @@
---- CONFIGVARS.orig 2012-10-11 17:55:52.000000000 +0100
-+++ CONFIGVARS 2012-10-11 17:56:37.000000000 +0100
-@@ -1,8 +1,8 @@
- #
- #
+--- CONFIGVARS 2011-05-13 23:38:45.000000000 +0100
++++ CONFIGVARS 2011-05-13 23:40:11.000000000 +0100
+@@ -3,6 +3,7 @@
# cross compiling
--#CROSS = yes
--CROSS = no
+ #CROSS = yes
+ #CROSS = no
+CROSS = yes
-+#CROSS = no
- #
- # build alternate libraries for processor variants
-@@ -15,13 +15,13 @@
#
+ # cross compiling
+@@ -33,7 +34,7 @@
+ CROSS := yes
+ else
ifeq ($(CROSS),yes)
-
--CROSSPREFIX=m68k-atari-mint-
-+CROSSPREFIX=m5475-atari-mint-
-
- NATIVECC = gcc
+- CROSS_TOOL=m68k-atari-mint
++ CROSS_TOOL=m5475-atari-mint
+ CROSSPREFIX=$(CROSS_TOOL)-
+ else
+ CROSSPREFIX=
+@@ -46,7 +47,7 @@
NATIVECFLAGS = -O
CRLF = echo crlf -s
--PREFIX=/usr/m68k-atari-mint
+-PREFIX=$(shell $(CROSSPREFIX)gcc -print-sysroot)/usr
+PREFIX=/opt/netsurf/m5475-atari-mint/cross/m5475-atari-mint
-
- else
-
+ ifeq ($(PREFIX),)
+ PREFIX=/usr/$(CROSS_TOOL)
+ endif
diff --git a/m5475-atari-mint/recipes/patches/mintlib/configvars.p b/m5475-atari-mint/recipes/patches/mintlib/configvars.p
index f72d6f4..803272a 100644
--- a/m5475-atari-mint/recipes/patches/mintlib/configvars.p
+++ b/m5475-atari-mint/recipes/patches/mintlib/configvars.p
@@ -1,6 +1,6 @@
--- ./configvars.orig 2012-05-03 19:26:10.000000000 +0200
-+++ ./configvars 2012-11-05 23:03:52.000000000 +0100
-@@ -12,14 +12,14 @@
++++ ./configvars 2012-11-05 22:34:07.000000000 +0100
+@@ -12,7 +12,7 @@
# get installed. You have to take car yourself that the libraries
# and include files and so on will get installed in the right place
# The easiest way to do this is to change "prefix", see below.
@@ -9,29 +9,30 @@
# Silent build or verbose
AM_DEFAULT_VERBOSITY = 1
-
- # Define this to "m68k-atari-mint-" if you cross compile.
+@@ -35,7 +35,7 @@
+ CROSS := yes
+ else
ifeq ($(CROSS),yes)
-- toolprefix=m68k-atari-mint-
-+ toolprefix=m5475-atari-mint-
+- CROSS_TOOL=m68k-atari-mint
++ CROSS_TOOL=m5475-atari-mint
+ toolprefix=$(CROSS_TOOL)-
else
toolprefix=
- endif
-@@ -47,7 +47,7 @@
+@@ -64,7 +64,7 @@
+ # This variable is used for various others. Change its value if
# need be. When cross-compiling you will usually want to set this
# to "/usr/m68k-atari-mint".
- ifeq ($(CROSS),yes)
-- prefix=/usr/m68k-atari-mint
-+ prefix=/opt/netsurf/m5475-atari-mint/cross/m5475-atari-mint
- else
- prefix=/usr
- endif
-@@ -124,7 +124,7 @@
- CFLAGS=-O2 -fomit-frame-pointer
+-prefix=/usr
++prefix=/opt/netsurf/m5475-atari-mint/cross/m5475-atari-mint
+
+ # This is where include files get installed.
+ includedir=${prefix}/include
+@@ -141,7 +141,7 @@
+ LDFLAGS=
# Additional defines.
-DEFS=
+DEFS=-DREGEX_MALLOC
# Define this to the warning level you want.
- WARN=-Wall
+ WARN=-Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -Wold-style-declaration -Wold-style-definition
diff --git a/m5475-atari-mint/recipes/patches/mintlib/posix_regex.p b/m5475-atari-mint/recipes/patches/mintlib/posix_regex.p
new file mode 100644
index 0000000..6a42a40
--- /dev/null
+++ b/m5475-atari-mint/recipes/patches/mintlib/posix_regex.p
@@ -0,0 +1,11 @@
+--- ./posix/regex.c.orig 2012-05-03 19:26:10.000000000 +0200
++++ ./posix/regex.c 2012-11-05 22:34:07.000000000 +0100
+@@ -1364,6 +1364,7 @@
+ \
+ DEBUG_PRINT2 (" Pushing failure id: %u\n", failure_id); \
+ DEBUG_PUSH (failure_id); \
++ (void) destination; \
+ } while (0)
+
+ /* This is the number of items that are pushed and popped on the stack
+
diff --git a/m68k-atari-mint/Makefile b/m68k-atari-mint/Makefile
index d60f818..f05fb8e 100644
--- a/m68k-atari-mint/Makefile
+++ b/m68k-atari-mint/Makefile
@@ -5,13 +5,13 @@
UPSTREAM_GCC_VERSION := 4.6.4
UPSTREAM_GCC_TARBALL := gcc-$(UPSTREAM_GCC_VERSION).tar.bz2
UPSTREAM_GCC_URI := http://ftp.gnu.org/gnu/gcc/gcc-$(UPSTREAM_GCC_VERSION)/$(UPSTREAM_GCC_TARBALL)
-UPSTREAM_GCC_PATCH := gcc-4.6.4-mint-20130415.patch.bz2
+UPSTREAM_GCC_PATCH := gcc-4.6.4-mint-20200504.patch.bz2
UPSTREAM_GCC_PATCH_URI := http://vincent.riviere.free.fr/soft/m68k-atari-mint/archives/$(UPSTREAM_GCC_PATCH)
-UPSTREAM_BINUTILS_VERSION := 2.24
+UPSTREAM_BINUTILS_VERSION := 2.30
UPSTREAM_BINUTILS_TARBALL := binutils-$(UPSTREAM_BINUTILS_VERSION).tar.bz2
UPSTREAM_BINUTILS_URI := ftp://ftp.gnu.org/gnu/binutils/$(UPSTREAM_BINUTILS_TARBALL)
-UPSTREAM_BINUTILS_PATCH := binutils-2.24-mint-20131217.patch.bz2
+UPSTREAM_BINUTILS_PATCH := binutils-2.30-mint-20180703.patch.bz2
UPSTREAM_BINUTILS_PATCH_URI := http://vincent.riviere.free.fr/soft/m68k-atari-mint/archives/$(UPSTREAM_BINUTILS_PATCH)
UPSTREAM_GMP_VERSION := 4.3.2
@@ -27,21 +27,21 @@ UPSTREAM_MPC_VERSION := 0.8.2
UPSTREAM_MPC_TARBALL := mpc-$(UPSTREAM_MPC_VERSION).tar.gz
UPSTREAM_MPC_URI := http://www.multiprecision.org/mpc/download/$(UPSTREAM_MPC_TARBALL)
-UPSTREAM_MINTBIN_VERSION := CVS-20110527
+UPSTREAM_MINTBIN_VERSION := Git-20201129
UPSTREAM_MINTBIN_TARBALL := mintbin-$(UPSTREAM_MINTBIN_VERSION).tar.gz
UPSTREAM_MINTBIN_URI := http://vincent.riviere.free.fr/soft/m68k-atari-mint/archives/$(UPSTREAM_MINTBIN_TARBALL)
-UPSTREAM_MINTLIB_VERSION := Git-20170304
+UPSTREAM_MINTLIB_VERSION := Git-20220821
UPSTREAM_MINTLIB_TARBALL := mintlib-$(UPSTREAM_MINTLIB_VERSION).tar.gz
UPSTREAM_MINTLIB_URI := http://vincent.riviere.free.fr/soft/m68k-atari-mint/archives/$(UPSTREAM_MINTLIB_TARBALL)
UPSTREAM_PML_VERSION := 2.03
UPSTREAM_PML_TARBALL := pml-$(UPSTREAM_PML_VERSION).tar.bz2
UPSTREAM_PML_URI := http://vincent.riviere.free.fr/soft/m68k-atari-mint/archives/$(UPSTREAM_PML_TARBALL)
-UPSTREAM_PML_PATCH := pml-2.03-mint-20110207.patch.bz2
+UPSTREAM_PML_PATCH := pml-2.03-mint-20191013.patch.bz2
UPSTREAM_PML_PATCH_URI := http://vincent.riviere.free.fr/soft/m68k-atari-mint/archives/$(UPSTREAM_PML_PATCH)
-UPSTREAM_GEMLIB_VERSION := CVS-20130415
+UPSTREAM_GEMLIB_VERSION := Git-20230112
UPSTREAM_GEMLIB_TARBALL := gemlib-$(UPSTREAM_GEMLIB_VERSION).tar.bz2
UPSTREAM_GEMLIB_URI := http://vincent.riviere.free.fr/soft/m68k-atari-mint/archives/$(UPSTREAM_GEMLIB_TARBALL)
@@ -49,6 +49,9 @@ GCC_AUTOCONF := autoconf2.64
GCC_AUTOHEADER := autoheader2.64
GCC_AUTORECONF := autoreconf2.64
GCC_AUTOM4TE := autom4te2.64
+GCC_AUTOMAKE := automake-1.11
+GCC_ACLOCAL := aclocal-1.11
+GCC_MAKEINFO := :
TOP := $(CURDIR)
RECIPES := $(TOP)/recipes
@@ -59,6 +62,8 @@ SRCDIR := $(BUILDDIR)/srcdir
GCC_SRCDIR := $(SRCDIR)/gcc
BINUTILS_SRCDIR := $(SRCDIR)/binutils
MINTBIN_SRCDIR := $(SRCDIR)/mintbin
+# optionally pass -jN here
+BUILD_SMP :=
TARGET_NAME := m68k-atari-mint
@@ -81,8 +86,8 @@ $(BUILDSTEPS)/gemlib.d: $(BUILDSTEPS)/stage2.d $(SOURCESDIR)/$(UPSTREAM_GEMLIB_T
tar xjf $(SOURCESDIR)/$(UPSTREAM_GEMLIB_TARBALL)
mv gemlib-$(UPSTREAM_GEMLIB_VERSION) $(BUILDDIR)/gemlib
for p in `ls $(RECIPES)/patches/gemlib/*.p` ; do patch -d $(BUILDDIR)/gemlib -p0 <$$p ; done
- cd $(BUILDDIR)/gemlib/gemlib && PATH="$(PREFIX)/bin:$(PATH)" make
- cd $(BUILDDIR)/gemlib/gemlib && PATH="$(PREFIX)/bin:$(PATH)" make install
+ cd $(BUILDDIR)/gemlib && PATH="$(PREFIX)/bin:$(PATH)" make
+ cd $(BUILDDIR)/gemlib && PATH="$(PREFIX)/bin:$(PATH)" make install
touch $@
###
@@ -131,7 +136,7 @@ $(BUILDSTEPS)/mintlib.d: $(BUILDSTEPS)/bootstrap-compiler.d $(SOURCESDIR)/$(UPST
# Rules to build and install the bootstrap compiler
###
-GCC_ENV_PARAMS := AUTOCONF=$(GCC_AUTOCONF) AUTOHEADER=$(GCC_AUTOHEADER) AUTOM4TE=$(GCC_AUTOM4TE) PATH="$(PREFIX)/bin:$(PATH)"
+GCC_ENV_PARAMS := AUTOCONF=$(GCC_AUTOCONF) AUTOHEADER=$(GCC_AUTOHEADER) AUTOM4TE=$(GCC_AUTOM4TE) ACLOCAL=$(GCC_ACLOCAL) AUTOMAKE=$(GCC_AUTOMAKE) MAKEINFO=$(GCC_MAKEINFO) PATH="$(PREFIX)/bin:$(PATH)"
$(BUILDSTEPS)/bootstrap-compiler.d: $(BUILDSTEPS)/srcdir-step3.d $(BUILDSTEPS)/binutils.d $(BUILDSTEPS)/mintbin.d
cd $(BUILDDIR) && $(GCC_ENV_PARAMS) $(GCC_SRCDIR)/configure \
@@ -139,9 +144,9 @@ $(BUILDSTEPS)/bootstrap-compiler.d: $(BUILDSTEPS)/srcdir-step3.d $(BUILDSTEPS)/b
--disable-nls --enable-languages=c \
--enable-checking=no --enable-c99 \
--enable-maintainer-mode --without-headers
- cd $(BUILDDIR) && $(GCC_ENV_PARAMS) make all-gcc
+ cd $(BUILDDIR) && $(GCC_ENV_PARAMS) make $(BUILD_SMP) all-gcc
cd $(BUILDDIR) && $(GCC_ENV_PARAMS) make install-gcc
- cd $(BUILDDIR) && $(GCC_ENV_PARAMS) make all-target-libgcc
+ cd $(BUILDDIR) && $(GCC_ENV_PARAMS) make $(BUILD_SMP) all-target-libgcc
cd $(BUILDDIR) && $(GCC_ENV_PARAMS) make install-target-libgcc
touch $@
@@ -153,9 +158,9 @@ $(BUILDSTEPS)/bootstrap-compiler.d: $(BUILDSTEPS)/srcdir-step3.d $(BUILDSTEPS)/b
$(BUILDSTEPS)/srcdir-step3.d: $(BUILDSTEPS)/srcdir-step2.d $(SOURCESDIR)/$(UPSTREAM_GCC_PATCH)
bzcat $(SOURCESDIR)/$(UPSTREAM_GCC_PATCH) | patch -d $(GCC_SRCDIR) -p1
cd $(GCC_SRCDIR) && ./contrib/gcc_update --touch
- $(GCC_AUTORECONF) -f $(GCC_SRCDIR)/libmudflap
- $(GCC_AUTORECONF) -f $(GCC_SRCDIR)/libssp
- $(GCC_AUTORECONF) -f $(GCC_SRCDIR)/libquadmath
+ $(GCC_ENV_PARAMS) $(GCC_AUTORECONF) -f $(GCC_SRCDIR)/libmudflap
+ $(GCC_ENV_PARAMS) $(GCC_AUTORECONF) -f $(GCC_SRCDIR)/libssp
+ $(GCC_ENV_PARAMS) $(GCC_AUTORECONF) -f $(GCC_SRCDIR)/libquadmath
for p in `ls $(RECIPES)/patches/gcc/*.p` ; do patch -d $(GCC_SRCDIR) -p0 <$$p ; done
touch $@
@@ -182,7 +187,7 @@ $(BUILDSTEPS)/$(UPSTREAM_GCC_TARBALL).d: $(BUILDSTEPS)/buildsteps.d $(SOURCESDIR
$(BUILDSTEPS)/mintbin.d: $(BUILDSTEPS)/mintbin-srcdir.d
mkdir -p $(BUILDDIR)/mintbin
- cd $(BUILDDIR)/mintbin && $(BINUTILS_SRCDIR)/configure --prefix=$(PREFIX) --target=$(TARGET_NAME) --disable-nls
+ cd $(BUILDDIR)/mintbin && $(MINTBIN_SRCDIR)/configure --prefix=$(PREFIX) --target=$(TARGET_NAME) --disable-nls
cd $(BUILDDIR)/mintbin && make
cd $(BUILDDIR)/mintbin && make install
touch $@
@@ -199,7 +204,7 @@ $(BUILDSTEPS)/mintbin-srcdir.d: $(SOURCESDIR)/$(UPSTREAM_MINTBIN_TARBALL)
$(BUILDSTEPS)/binutils.d: $(BUILDSTEPS)/binutils-srcdir.d
mkdir -p $(BUILDDIR)/binutils
cd $(BUILDDIR)/binutils && $(BINUTILS_SRCDIR)/configure --prefix=$(PREFIX) --target=$(TARGET_NAME) --disable-nls
- cd $(BUILDDIR)/binutils && make
+ cd $(BUILDDIR)/binutils && make $(BUILD_SMP)
cd $(BUILDDIR)/binutils && make install
touch $@
diff --git a/m68k-atari-mint/fetchsrc b/m68k-atari-mint/fetchsrc
index e71d85f..92ae5bf 100755
--- a/m68k-atari-mint/fetchsrc
+++ b/m68k-atari-mint/fetchsrc
@@ -4,7 +4,7 @@
# Usage fetchsrc <target> <source> <upstream> <output>
-NSSRV="http://ci.netsurf-browser.org/toolchain/"
+NSSRV="https://ci.netsurf-browser.org/toolchain/"
wget -q -O ${4} ${NSSRV}/${1}/${2}
if [ $? -ne 0 ];then
diff --git a/m68k-atari-mint/recipes/patches/gemlib/CONFIGVARS.p b/m68k-atari-mint/recipes/patches/gemlib/CONFIGVARS.p
index 6f774db..c865542 100644
--- a/m68k-atari-mint/recipes/patches/gemlib/CONFIGVARS.p
+++ b/m68k-atari-mint/recipes/patches/gemlib/CONFIGVARS.p
@@ -1,20 +1,19 @@
--- CONFIGVARS 2011-05-13 23:38:45.000000000 +0100
+++ CONFIGVARS 2011-05-13 23:40:11.000000000 +0100
-@@ -2,7 +2,7 @@
- #
+@@ -3,6 +3,7 @@
# cross compiling
#CROSS = yes
--CROSS = no
+ #CROSS = no
+CROSS = yes
- #
- # build alternate libraries for processor variants
-@@ -21,7 +21,7 @@
+ #
+ # cross compiling
+@@ -46,7 +47,7 @@
NATIVECFLAGS = -O
CRLF = echo crlf -s
--PREFIX=/usr/m68k-atari-mint
+-PREFIX=$(shell $(CROSSPREFIX)gcc -print-sysroot)/usr
+PREFIX=/opt/netsurf/m68k-atari-mint/cross/m68k-atari-mint
-
- else
-
+ ifeq ($(PREFIX),)
+ PREFIX=/usr/$(CROSS_TOOL)
+ endif
diff --git a/m68k-atari-mint/recipes/patches/mintlib/configvars.p b/m68k-atari-mint/recipes/patches/mintlib/configvars.p
index 1df9fae..a3acd90 100644
--- a/m68k-atari-mint/recipes/patches/mintlib/configvars.p
+++ b/m68k-atari-mint/recipes/patches/mintlib/configvars.p
@@ -9,21 +9,21 @@
# Silent build or verbose
AM_DEFAULT_VERBOSITY = 1
-@@ -47,7 +47,7 @@
+@@ -64,7 +64,7 @@
+ # This variable is used for various others. Change its value if
# need be. When cross-compiling you will usually want to set this
# to "/usr/m68k-atari-mint".
- ifeq ($(CROSS),yes)
-- prefix=/usr/m68k-atari-mint
-+ prefix=/opt/netsurf/m68k-atari-mint/cross/m68k-atari-mint
- else
- prefix=/usr
- endif
-@@ -124,7 +124,7 @@
- CFLAGS=-O2 -fomit-frame-pointer
+-prefix=/usr
++prefix=/opt/netsurf/m68k-atari-mint/cross/m68k-atari-mint
+
+ # This is where include files get installed.
+ includedir=${prefix}/include
+@@ -141,7 +141,7 @@
+ LDFLAGS=
# Additional defines.
-DEFS=
+DEFS=-DREGEX_MALLOC
# Define this to the warning level you want.
- WARN=-Wall
+ WARN=-Wall -Werror -Wstrict-prototypes -Wmissing-prototypes -Wold-style-declaration -Wold-style-definition
diff --git a/m68k-atari-mint/recipes/patches/mintlib/posix_regex.p b/m68k-atari-mint/recipes/patches/mintlib/posix_regex.p
new file mode 100644
index 0000000..6a42a40
--- /dev/null
+++ b/m68k-atari-mint/recipes/patches/mintlib/posix_regex.p
@@ -0,0 +1,11 @@
+--- ./posix/regex.c.orig 2012-05-03 19:26:10.000000000 +0200
++++ ./posix/regex.c 2012-11-05 22:34:07.000000000 +0100
+@@ -1364,6 +1364,7 @@
+ \
+ DEBUG_PRINT2 (" Pushing failure id: %u\n", failure_id); \
+ DEBUG_PUSH (failure_id); \
++ (void) destination; \
+ } while (0)
+
+ /* This is the number of items that are pushed and popped on the stack
+
diff --git a/m68k-unknown-amigaos/Makefile b/m68k-unknown-amigaos/Makefile
index 8597dcf..d3b3d52 100644
--- a/m68k-unknown-amigaos/Makefile
+++ b/m68k-unknown-amigaos/Makefile
@@ -36,6 +36,10 @@ UPSTREAM_OPENURL_VERSION := 7.16
UPSTREAM_OPENURL_TARBALL := openurl-$(UPSTREAM_OPENURL_VERSION)
UPSTREAM_OPENURL_URI := https://github.com/jens-maus/libopenurl/archive/$(UPSTREAM_OPENURL_VERSION).tar.gz
+UPSTREAM_AMISSL_VERSION := 5.13
+UPSTREAM_AMISSL_TARBALL := AmiSSL-$(UPSTREAM_AMISSL_VERSION)-SDK.lha
+UPSTREAM_AMISSL_URI := https://github.com/jens-maus/amissl/releases/download/$(UPSTREAM_AMISSL_VERSION)/$(UPSTREAM_AMISSL_TARBALL)
+
UPSTREAM_GUIGFX_TARBALL := guigfxlib.lha
UPSTREAM_GUIGFX_URI := http://neoscientists.org/~bifat/binarydistillery/$(UPSTREAM_GUIGFX_TARBALL)
@@ -96,23 +100,31 @@ $(BUILDSTEPS)/stage2.d: $(BUILDSTEPS)/clib2.d
# Rules to build and install Clib2
###
-$(BUILDSTEPS)/clib2.d: $(BUILDSTEPS)/bootstrap-compiler.d $(BUILDSTEPS)/ndk.d $(SOURCESDIR)/$(UPSTREAM_CLIB2_TARBALL)
- tar xaf $(SOURCESDIR)/$(UPSTREAM_CLIB2_TARBALL)
- mv clib2-$(UPSTREAM_CLIB2_VERSION)/library $(BUILDDIR)/clib2
- for p in `ls $(RECIPES)/patches/clib2/*.p` ; do patch -d $(BUILDDIR)/clib2 -p0 <$$p ; done
- for dir in `find $(RECIPES)/files/clib2/ -type d | grep -v '\.svn' | sed 's#$(RECIPES)/files/clib2##'` ; do mkdir -p $(BUILDDIR)/clib2$$dir ; done
- for file in `find $(RECIPES)/files/clib2/ -type f | grep -v '\.svn' | sed 's#$(RECIPES)/files/clib2##'` ; do cp -p $(RECIPES)/files/clib2$$file $(BUILDDIR)/clib2$$file ; done
+$(BUILDSTEPS)/clib2.d: $(BUILDSTEPS)/bootstrap-compiler.d $(BUILDSTEPS)/ndk.d $(BUILDSTEPS)/clib2-src.d
cd $(BUILDDIR)/clib2 && PATH="$(PREFIX)/bin:$(PATH)" make -f GNUmakefile.68k
cp -r $(BUILDDIR)/clib2/include $(PREFIX)/$(TARGET_NAME)
cp -r $(BUILDDIR)/clib2/lib $(PREFIX)/$(TARGET_NAME)
ln -sf $(PREFIX)/$(TARGET_NAME)/lib/ncrt0.o $(PREFIX)/$(TARGET_NAME)/lib/crt0.o
touch $@
+
+$(BUILDSTEPS)/clib2-src.d: $(SOURCESDIR)/$(UPSTREAM_CLIB2_TARBALL)
+ $(RM) -rf $(SOURCESDIR)/clib2-$(UPSTREAM_CLIB2_VERSION)
+ $(RM) -rf $(BUILDDIR)/clib2
+ cd $(SOURCESDIR) && tar xaf $(SOURCESDIR)/$(UPSTREAM_CLIB2_TARBALL)
+ mv $(SOURCESDIR)/clib2-$(UPSTREAM_CLIB2_VERSION)/library $(BUILDDIR)/clib2
+ $(RM) -rf $(SOURCESDIR)/clib2-$(UPSTREAM_CLIB2_VERSION)
+ for p in `ls $(RECIPES)/patches/clib2/*.p` ; do patch -d $(BUILDDIR)/clib2 -p0 <$$p || exit $0 ; done
+ for dir in `find $(RECIPES)/files/clib2/ -type d | grep -v '\.svn' | sed 's#$(RECIPES)/files/clib2##'` ; do mkdir -p $(BUILDDIR)/clib2$$dir ; done
+ for file in `find $(RECIPES)/files/clib2/ -type f | grep -v '\.svn' | sed 's#$(RECIPES)/files/clib2##'` ; do cp -p $(RECIPES)/files/clib2$$file $(BUILDDIR)/clib2$$file ; done
+ touch $@
+
+
###
# Rules to install the NDK
###
-$(BUILDSTEPS)/ndk.d: $(SOURCESDIR)/$(UPSTREAM_NDK_TARBALL) $(SOURCESDIR)/$(UPSTREAM_OPENURL_TARBALL) $(SOURCESDIR)/$(UPSTREAM_GUIGFX_TARBALL) $(SOURCESDIR)/$(UPSTREAM_RENDER_TARBALL) $(SOURCESDIR)/$(UPSTREAM_CODESETS_TARBALL)
+$(BUILDSTEPS)/ndk.d: $(SOURCESDIR)/$(UPSTREAM_NDK_TARBALL) $(SOURCESDIR)/$(UPSTREAM_OPENURL_TARBALL) $(SOURCESDIR)/$(UPSTREAM_GUIGFX_TARBALL) $(SOURCESDIR)/$(UPSTREAM_RENDER_TARBALL) $(SOURCESDIR)/$(UPSTREAM_CODESETS_TARBALL) $(SOURCESDIR)/$(UPSTREAM_AMISSL_TARBALL)
mkdir -p $(PREFIX)/$(TARGET_NAME)
tar -C $(PREFIX)/$(TARGET_NAME) --strip-components=2 -xjf $(SOURCESDIR)/$(UPSTREAM_NDK_TARBALL)
for p in `ls $(RECIPES)/patches/ndk/*.p` ; do patch -d $(PREFIX)/$(TARGET_NAME) -p0 <$$p ; done
@@ -130,6 +142,10 @@ $(BUILDSTEPS)/ndk.d: $(SOURCESDIR)/$(UPSTREAM_NDK_TARBALL) $(SOURCESDIR)/$(UPSTR
mkdir -p $(BUILDDIR)/codesets
lha xw=$(BUILDDIR)/codesets $(SOURCESDIR)/$(UPSTREAM_CODESETS_TARBALL)
cp -r $(BUILDDIR)/codesets/codesets/Developer/include/* $(PREFIX)/$(TARGET_NAME)/sys-include/
+ mkdir -p $(BUILDDIR)/AmiSSL
+ lha xw=$(BUILDDIR)/AmiSSL $(SOURCESDIR)/$(UPSTREAM_AMISSL_TARBALL)
+ cp -r $(BUILDDIR)/AmiSSL/AmiSSL/Developer/include/* $(PREFIX)/$(TARGET_NAME)/sys-include/
+ cp -r $(BUILDDIR)/AmiSSL/AmiSSL/Developer/lib/AmigaOS3/* $(PREFIX)/$(TARGET_NAME)/lib/
touch $@
###
@@ -192,6 +208,7 @@ $(BUILDSTEPS)/bison.d: $(BUILDSTEPS)/srcdir-bison.d
$(BUILDSTEPS)/srcdir-bison.d: $(BUILDSTEPS)/$(UPSTREAM_BISON_TARBALL).d
tar axf $(SOURCESDIR)/$(UPSTREAM_BISON_TARBALL)
mv bison-$(UPSTREAM_BISON_VERSION) $(BISON_SRCDIR)
+ for p in `ls $(RECIPES)/patches/bison/*.p` ; do patch -d $(BISON_SRCDIR) -p0 <$$p ; done
touch $@
$(BUILDSTEPS)/$(UPSTREAM_BISON_TARBALL).d: $(BUILDSTEPS)/buildsteps.d $(SOURCESDIR)/$(UPSTREAM_BISON_TARBALL)
@@ -255,6 +272,9 @@ $(SOURCESDIR)/$(UPSTREAM_BISON_TARBALL):
$(SOURCESDIR)/$(UPSTREAM_CODESETS_TARBALL):
wget -q -O $@ $(UPSTREAM_CODESETS_URI)
+$(SOURCESDIR)/$(UPSTREAM_AMISSL_TARBALL):
+ wget -q -O $@ $(UPSTREAM_AMISSL_URI)
+
###
# Rule to create buildsteps dir
###
diff --git a/m68k-unknown-amigaos/recipes/files/ndk/sys-include/inline/macros.h b/m68k-unknown-amigaos/recipes/files/ndk/sys-include/inline/macros.h
new file mode 100644
index 0000000..2a07ae6
--- /dev/null
+++ b/m68k-unknown-amigaos/recipes/files/ndk/sys-include/inline/macros.h
@@ -0,0 +1,1749 @@
+#ifndef __INLINE_MACROS_H
+#define __INLINE_MACROS_H
+
+/*
+ General macros for Amiga function calls. Not all the possibilities have
+ been created - only the ones which exist in OS 3.1. Third party libraries
+ and future versions of AmigaOS will maybe need some new ones...
+
+ LPX - functions that take X arguments.
+
+ Modifiers (variations are possible):
+ NR - no return (void),
+ A4, A5 - "a4" or "a5" is used as one of the arguments,
+ UB - base will be given explicitly by user (see cia.resource).
+ FP - one of the parameters has type "pointer to function".
+ FR - the return type is a "pointer to function".
+
+ "bt" arguments are not used - they are provided for backward compatibility
+ only.
+*/
+
+#ifndef __INLINE_STUB_H
+#include <inline/stubs.h>
+#endif
+
+#define LP0(offs, rt, name, bt, bn) \
+({ \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP0FR(offs, rt, name, bt, bn, fpr) \
+({ \
+ typedef fpr; \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP0NR(offs, name, bt, bn) \
+({ \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+#define LP1(offs, rt, name, t1, v1, r1, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP1FP(offs, rt, name, t1, v1, r1, bt, bn, fpt) \
+({ \
+ typedef fpt; \
+ t1 _##name##_v1 = (v1); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP1FR(offs, rt, name, t1, v1, r1, bt, bn, fpr) \
+({ \
+ typedef fpr; \
+ t1 _##name##_v1 = (v1); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP1FPFR(offs, rt, name, t1, v1, r1, bt, bn, fpt, fpr) \
+({ \
+ typedef fpr; \
+ typedef fpt; \
+ t1 _##name##_v1 = (v1); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP1NR(offs, name, t1, v1, r1, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+/* Only graphics.library/AttemptLockLayerRom() */
+#define LP1A5(offs, rt, name, t1, v1, r1, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ __asm volatile ("exg d7,a5\n\tjsr a6@(-"#offs":W)\n\texg d7,a5" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+/* Only graphics.library/LockLayerRom() and graphics.library/UnlockLayerRom() */
+#define LP1NRA5(offs, name, t1, v1, r1, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ __asm volatile ("exg d7,a5\n\tjsr a6@(-"#offs":W)\n\texg d7,a5" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+/* Only exec.library/Supervisor() */
+#define LP1A5FP(offs, rt, name, t1, v1, r1, bt, bn, fpt) \
+({ \
+ typedef fpt; \
+ t1 _##name##_v1 = (v1); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ __asm volatile ("exg d7,a5\n\tjsr a6@(-"#offs":W)\n\texg d7,a5" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP1NRFP(offs, name, t1, v1, r1, bt, bn, fpt) \
+({ \
+ typedef fpt; \
+ t1 _##name##_v1 = (v1); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+#define LP2(offs, rt, name, t1, v1, r1, t2, v2, r2, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP2NR(offs, name, t1, v1, r1, t2, v2, r2, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+/* Only cia.resource/AbleICR() and cia.resource/SetICR() */
+#define LP2UB(offs, rt, name, t1, v1, r1, t2, v2, r2) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r"(_n1), "rf"(_n2) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+/* Only dos.library/InternalUnLoadSeg() */
+#define LP2FP(offs, rt, name, t1, v1, r1, t2, v2, r2, bt, bn, fpt) \
+({ \
+ typedef fpt; \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP2FPFR(offs, rt, name, t1, v1, r1, t2, v2, r2, bt, bn, fpt, fpr) \
+({ \
+ typedef fpr; \
+ typedef fpt; \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP2NRFP(offs, name, t1, v1, r1, t2, v2, r2, bt, bn, fpt) \
+({ \
+ typedef fpt; \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+#define LP3(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP3NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+/* Only cia.resource/AddICRVector() */
+#define LP3UB(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r"(_n1), "rf"(_n2), "rf"(_n3) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+/* Only cia.resource/RemICRVector() */
+#define LP3NRUB(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r"(_n1), "rf"(_n2), "rf"(_n3) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+/* Only exec.library/SetFunction() */
+#define LP3FP(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, bt, bn, fpt) \
+({ \
+ typedef fpt; \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP3FP2(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, bt, bn, fpt1, fpt2) \
+({ \
+ typedef fpt1; \
+ typedef fpt2; \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP3FP3(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, bt, bn, fpt1, fpt2, fpt3) \
+({ \
+ typedef fpt1; \
+ typedef fpt2; \
+ typedef fpt3; \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+/* Only graphics.library/SetCollision() */
+#define LP3NRFP(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, bt, bn, fpt) \
+({ \
+ typedef fpt; \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+#define LP3NRFP2(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, bt, bn, fpt1, fpt2) \
+({ \
+ typedef fpt1; \
+ typedef fpt2; \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+#define LP3NRFP3(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, bt, bn, fpt1, fpt2, fpt3) \
+({ \
+ typedef fpt1; \
+ typedef fpt2; \
+ typedef fpt3; \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+#define LP4(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP4NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+#define LP4NRFP3(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, bt, bn, fpt1, fpt2, fpt3) \
+({ \
+ typedef fpt1; \
+ typedef fpt2; \
+ typedef fpt3; \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+/* Only exec.library/RawDoFmt() */
+#define LP4FP(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, bt, bn, fpt) \
+({ \
+ typedef fpt; \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP4FP4(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, bt, bn, fpt1, fpt2, fpt3, fpt4) \
+({ \
+ typedef fpt1; \
+ typedef fpt2; \
+ typedef fpt3; \
+ typedef fpt4; \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP5(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP5NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+#define LP5NRA4(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ __asm volatile ("exg d7,a4\n\tjsr a6@(-"#offs":W)\n\texg d7,a4" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5) \
+ : "fp0", "fp1", "cc", "memory"); \
+ }; \
+})
+
+#define LP5NRA5(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ __asm volatile ("exg d7,a5\n\tjsr a6@(-"#offs":W)\n\texg d7,a5" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+/* Only exec.library/MakeLibrary() */
+#define LP5FP(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, bt, bn, fpt) \
+({ \
+ typedef fpt; \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+/* Only reqtools.library/XXX() */
+#define LP5A4(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ __asm volatile ("exg d7,a4\n\tjsr a6@(-"#offs":W)\n\texg d7,a4" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP5A4FP(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, bt, bn, fpt) \
+({ \
+ typedef fpt; \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ __asm volatile ("exg d7,a4\n\tjsr a6@(-"#offs":W)\n\texg d7,a4" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP6(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP6NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+#define LP6A4(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ __asm volatile ("exg d7,a4\n\tjsr a6@(-"#offs":W)\n\texg d7,a4" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP6NRA4(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ __asm volatile ("exg d7,a4\n\tjsr a6@(-"#offs":W)\n\texg d7,a4" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6) \
+ : "fp0", "fp1", "cc", "memory"); \
+ }; \
+})
+
+#define LP6FP(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, bt, bn, fpt) \
+({ \
+ typedef fpt; \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP6A4FP(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, bt, bn, fpt) \
+({ \
+ typedef fpt; \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ __asm volatile ("exg d7,a4\n\tjsr a6@(-"#offs":W)\n\texg d7,a4" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP7(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ t7 _##name##_v7 = (v7); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ register t7 _n7 __asm(#r7) = _##name##_v7; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6), "rf"(_n7) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP7NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ t7 _##name##_v7 = (v7); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ register t7 _n7 __asm(#r7) = _##name##_v7; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6), "rf"(_n7) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+#define LP7NRFP6(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, bt, bn, fpt1, fpt2, fpt3, fpt4, fpt5, fpt6) \
+({ \
+ typedef fpt1; \
+ typedef fpt2; \
+ typedef fpt3; \
+ typedef fpt4; \
+ typedef fpt5; \
+ typedef fpt6; \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ t7 _##name##_v7 = (v7); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ register t7 _n7 __asm(#r7) = _##name##_v7; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6), "rf"(_n7) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+/* Only workbench.library/AddAppIconA() */
+#define LP7A4(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ t7 _##name##_v7 = (v7); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ register t7 _n7 __asm(#r7) = _##name##_v7; \
+ __asm volatile ("exg d7,a4\n\tjsr a6@(-"#offs":W)\n\texg d7,a4" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6), "rf"(_n7) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP7A4FP(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, bt, bn, fpt) \
+({ \
+ typedef fpt; \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ t7 _##name##_v7 = (v7); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ register t7 _n7 __asm(#r7) = _##name##_v7; \
+ __asm volatile ("exg d7,a4\n\tjsr a6@(-"#offs":W)\n\texg d7,a4" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6), "rf"(_n7) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP7NRA4(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ t7 _##name##_v7 = (v7); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ register t7 _n7 __asm(#r7) = _##name##_v7; \
+ __asm volatile ("exg d7,a4\n\tjsr a6@(-"#offs":W)\n\texg d7,a4" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6), "rf"(_n7) \
+ : "fp0", "fp1", "cc", "memory"); \
+ }; \
+})
+
+/* Would you believe that there really are beasts that need more than 7
+ arguments? :-) */
+
+/* For example intuition.library/AutoRequest() */
+#define LP8(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ t7 _##name##_v7 = (v7); \
+ t8 _##name##_v8 = (v8); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ register t7 _n7 __asm(#r7) = _##name##_v7; \
+ register t8 _n8 __asm(#r8) = _##name##_v8; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6), "rf"(_n7), "rf"(_n8) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+/* For example intuition.library/ModifyProp() */
+#define LP8NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ t7 _##name##_v7 = (v7); \
+ t8 _##name##_v8 = (v8); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ register t7 _n7 __asm(#r7) = _##name##_v7; \
+ register t8 _n8 __asm(#r8) = _##name##_v8; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6), "rf"(_n7), "rf"(_n8) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+#define LP8A4(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ t7 _##name##_v7 = (v7); \
+ t8 _##name##_v8 = (v8); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ register t7 _n7 __asm(#r7) = _##name##_v7; \
+ register t8 _n8 __asm(#r8) = _##name##_v8; \
+ __asm volatile ("exg d7,a4\n\tjsr a6@(-"#offs":W)\n\texg d7,a4" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6), "rf"(_n7), "rf"(_n8) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP8NRA4(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ t7 _##name##_v7 = (v7); \
+ t8 _##name##_v8 = (v8); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ register t7 _n7 __asm(#r7) = _##name##_v7; \
+ register t8 _n8 __asm(#r8) = _##name##_v8; \
+ __asm volatile ("exg d7,a4\n\tjsr a6@(-"#offs":W)\n\texg d7,a4" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6), "rf"(_n7), "rf"(_n8) \
+ : "fp0", "fp1", "cc", "memory"); \
+ }; \
+})
+
+/* For example layers.library/CreateUpfrontHookLayer() */
+#define LP9(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ t7 _##name##_v7 = (v7); \
+ t8 _##name##_v8 = (v8); \
+ t9 _##name##_v9 = (v9); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ register t7 _n7 __asm(#r7) = _##name##_v7; \
+ register t8 _n8 __asm(#r8) = _##name##_v8; \
+ register t9 _n9 __asm(#r9) = _##name##_v9; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6), "rf"(_n7), "rf"(_n8), "rf"(_n9) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+/* For example intuition.library/NewModifyProp() */
+#define LP9NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ t7 _##name##_v7 = (v7); \
+ t8 _##name##_v8 = (v8); \
+ t9 _##name##_v9 = (v9); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ register t7 _n7 __asm(#r7) = _##name##_v7; \
+ register t8 _n8 __asm(#r8) = _##name##_v8; \
+ register t9 _n9 __asm(#r9) = _##name##_v9; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6), "rf"(_n7), "rf"(_n8), "rf"(_n9) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+#define LP9A4(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ t7 _##name##_v7 = (v7); \
+ t8 _##name##_v8 = (v8); \
+ t9 _##name##_v9 = (v9); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ register t7 _n7 __asm(#r7) = _##name##_v7; \
+ register t8 _n8 __asm(#r8) = _##name##_v8; \
+ register t9 _n9 __asm(#r9) = _##name##_v9; \
+ __asm volatile ("exg d7,a4\n\tjsr a6@(-"#offs":W)\n\texg d7,a4" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6), "rf"(_n7), "rf"(_n8), "rf"(_n9) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#define LP9NRA4(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ t7 _##name##_v7 = (v7); \
+ t8 _##name##_v8 = (v8); \
+ t9 _##name##_v9 = (v9); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ register t7 _n7 __asm(#r7) = _##name##_v7; \
+ register t8 _n8 __asm(#r8) = _##name##_v8; \
+ register t9 _n9 __asm(#r9) = _##name##_v9; \
+ __asm volatile ("exg d7,a4\n\tjsr a6@(-"#offs":W)\n\texg d7,a4" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6), "rf"(_n7), "rf"(_n8), "rf"(_n9) \
+ : "fp0", "fp1", "cc", "memory"); \
+ }; \
+})
+
+/* Kriton Kyrimis <kyrimis@cti.gr> says CyberGraphics needs the following */
+#define LP10(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, t10, v10, r10, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ t7 _##name##_v7 = (v7); \
+ t8 _##name##_v8 = (v8); \
+ t9 _##name##_v9 = (v9); \
+ t10 _##name##_v10 = (v10); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ register t7 _n7 __asm(#r7) = _##name##_v7; \
+ register t8 _n8 __asm(#r8) = _##name##_v8; \
+ register t9 _n9 __asm(#r9) = _##name##_v9; \
+ register t10 _n10 __asm(#r10) = _##name##_v10; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6), "rf"(_n7), "rf"(_n8), "rf"(_n9), "rf"(_n10) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+/* Only graphics.library/BltMaskBitMapRastPort() */
+#define LP10NR(offs, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, t10, v10, r10, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ t7 _##name##_v7 = (v7); \
+ t8 _##name##_v8 = (v8); \
+ t9 _##name##_v9 = (v9); \
+ t10 _##name##_v10 = (v10); \
+ { \
+ register int _d0 __asm("d0"); \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ register t7 _n7 __asm(#r7) = _##name##_v7; \
+ register t8 _n8 __asm(#r8) = _##name##_v8; \
+ register t9 _n9 __asm(#r9) = _##name##_v9; \
+ register t10 _n10 __asm(#r10) = _##name##_v10; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_d0), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6), "rf"(_n7), "rf"(_n8), "rf"(_n9), "rf"(_n10) \
+ : "fp0", "fp1", "cc", "memory"); \
+ } \
+})
+
+#define LP10A4(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, t10, v10, r10, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ t7 _##name##_v7 = (v7); \
+ t8 _##name##_v8 = (v8); \
+ t9 _##name##_v9 = (v9); \
+ t10 _##name##_v10 = (v10); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ register t7 _n7 __asm(#r7) = _##name##_v7; \
+ register t8 _n8 __asm(#r8) = _##name##_v8; \
+ register t9 _n9 __asm(#r9) = _##name##_v9; \
+ register t10 _n10 __asm(#r10) = _##name##_v10; \
+ __asm volatile ("exg d7,a4\n\tjsr a6@(-"#offs":W)\n\texg d7,a4" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6), "rf"(_n7), "rf"(_n8), "rf"(_n9), "rf"(_n10) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+/* Only graphics.library/BltBitMap() */
+#define LP11(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, t10, v10, r10, t11, v11, r11, bt, bn) \
+({ \
+ t1 _##name##_v1 = (v1); \
+ t2 _##name##_v2 = (v2); \
+ t3 _##name##_v3 = (v3); \
+ t4 _##name##_v4 = (v4); \
+ t5 _##name##_v5 = (v5); \
+ t6 _##name##_v6 = (v6); \
+ t7 _##name##_v7 = (v7); \
+ t8 _##name##_v8 = (v8); \
+ t9 _##name##_v9 = (v9); \
+ t10 _##name##_v10 = (v10); \
+ t11 _##name##_v11 = (v11); \
+ rt _##name##_re2 = \
+ ({ \
+ register int _d1 __asm("d1"); \
+ register int _a0 __asm("a0"); \
+ register int _a1 __asm("a1"); \
+ register rt _##name##_re __asm("d0"); \
+ register void *const _##name##_bn __asm("a6") = (bn); \
+ register t1 _n1 __asm(#r1) = _##name##_v1; \
+ register t2 _n2 __asm(#r2) = _##name##_v2; \
+ register t3 _n3 __asm(#r3) = _##name##_v3; \
+ register t4 _n4 __asm(#r4) = _##name##_v4; \
+ register t5 _n5 __asm(#r5) = _##name##_v5; \
+ register t6 _n6 __asm(#r6) = _##name##_v6; \
+ register t7 _n7 __asm(#r7) = _##name##_v7; \
+ register t8 _n8 __asm(#r8) = _##name##_v8; \
+ register t9 _n9 __asm(#r9) = _##name##_v9; \
+ register t10 _n10 __asm(#r10) = _##name##_v10; \
+ register t11 _n11 __asm(#r11) = _##name##_v11; \
+ __asm volatile ("jsr a6@(-"#offs":W)" \
+ : "=r" (_##name##_re), "=r" (_d1), "=r" (_a0), "=r" (_a1) \
+ : "r" (_##name##_bn), "rf"(_n1), "rf"(_n2), "rf"(_n3), "rf"(_n4), "rf"(_n5), "rf"(_n6), "rf"(_n7), "rf"(_n8), "rf"(_n9), "rf"(_n10), "rf"(_n11) \
+ : "fp0", "fp1", "cc", "memory"); \
+ _##name##_re; \
+ }); \
+ _##name##_re2; \
+})
+
+#endif /* __INLINE_MACROS_H */
+
diff --git a/m68k-unknown-amigaos/recipes/patches/bison/fseterr.c.p b/m68k-unknown-amigaos/recipes/patches/bison/fseterr.c.p
new file mode 100644
index 0000000..a47a2f9
--- /dev/null
+++ b/m68k-unknown-amigaos/recipes/patches/bison/fseterr.c.p
@@ -0,0 +1,11 @@
+--- lib/fseterr.c.old 2020-03-11 10:08:25.275228721 +0000
++++ lib/fseterr.c 2020-03-11 10:08:35.199250194 +0000
+@@ -29,7 +29,7 @@
+ /* Most systems provide FILE as a struct and the necessary bitmask in
+ <stdio.h>, because they need it for implementing getc() and putc() as
+ fast macros. */
+-#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
++#if defined _IO_EOF_SEEN || defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+ fp->_flags |= _IO_ERR_SEEN;
+ #elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin */
+ fp_->_flags |= __SERR;
diff --git a/ppc-amigaos/Makefile b/ppc-amigaos/Makefile
index 38a424e..47260b1 100644
--- a/ppc-amigaos/Makefile
+++ b/ppc-amigaos/Makefile
@@ -18,8 +18,15 @@ UPSTREAM_MPC_VERSION := 1.0.2
UPSTREAM_MPC_TARBALL := mpc-$(UPSTREAM_MPC_VERSION).tar.gz
UPSTREAM_MPC_URI := http://ftp.gnu.org/gnu/mpc/$(UPSTREAM_MPC_TARBALL)
-UPSTREAM_NDK_TARBALL := SDK_53.29.lha
-UPSTREAM_NDK_URI := "http://hyperion-entertainment.biz/index.php/downloads?view=download&format=raw&file=82"
+UPSTREAM_LHASA_VERSION := 887d68ebca0cbad392af3709203745d202a2020b
+UPSTREAM_LHASA_TARBALL := lhasa-$(UPSTREAM_LHASA_VERSION).zip
+UPSTREAM_LHASA_URI := https://github.com/fragglet/lhasa/archive/$(UPSTREAM_LHASA_VERSION).zip
+
+UPSTREAM_NDK_TARBALL := SDK_54.16.lha
+UPSTREAM_NDK_URI := "http://hyperion-entertainment.biz/index.php/downloads?view=download&format=raw&file=127"
+
+UPSTREAM_NDK_UPDATE_TARBALL := SDK_addon_final_edition_update2.zip
+UPSTREAM_NDK_UPDATE_URI := http://kas1e.mikendezign.com/aos4/SDK_addon_final_edition_update2.zip
UPSTREAM_OPENURL_VERSION := 7.16
UPSTREAM_OPENURL_TARBALL := openurl-$(UPSTREAM_OPENURL_VERSION).tar.gz
@@ -71,7 +78,7 @@ distclean: clean
# Rules to build the full compiler
###
-GCC_ENV_PARAMS := AUTOCONF=$(GCC_AUTOCONF) AUTOHEADER=$(GCC_AUTOHEADER) AUTOM4TE=$(GCC_AUTOM4TE) PATH="$(PREFIX)/bin:$(PATH)"
+GCC_ENV_PARAMS := AUTOCONF=$(GCC_AUTOCONF) AUTOHEADER=$(GCC_AUTOHEADER) AUTOM4TE=$(GCC_AUTOM4TE) PATH="$(PREFIX)/bin:$(PATH)" CXXFLAGS="-fpermissive"
$(BUILDSTEPS)/stage2.d: $(BUILDSTEPS)/srcdir-step3.d $(BUILDSTEPS)/binutils.d $(BUILDSTEPS)/ndk.d
cd $(BUILDDIR) && $(GCC_ENV_PARAMS) $(GCC_SRCDIR)/configure \
@@ -89,36 +96,60 @@ $(BUILDSTEPS)/stage2.d: $(BUILDSTEPS)/srcdir-step3.d $(BUILDSTEPS)/binutils.d $(
# Rules to install the NDK
###
-$(BUILDSTEPS)/ndk.d: $(SOURCESDIR)/$(UPSTREAM_NDK_TARBALL) $(SOURCESDIR)/$(UPSTREAM_OPENURL_TARBALL) $(SOURCESDIR)/$(UPSTREAM_ONCHIPMEM_TARBALL) $(SOURCESDIR)/$(UPSTREAM_GUIGFX_TARBALL) $(SOURCESDIR)/$(UPSTREAM_RENDER_TARBALL) $(SOURCESDIR)/$(UPSTREAM_CODESETS_TARBALL)
+$(BUILDSTEPS)/ndk.d: $(BUILDSTEPS)/lhasa.d $(SOURCESDIR)/$(UPSTREAM_NDK_TARBALL) $(SOURCESDIR)/$(UPSTREAM_NDK_UPDATE_TARBALL) $(SOURCESDIR)/$(UPSTREAM_OPENURL_TARBALL) $(SOURCESDIR)/$(UPSTREAM_ONCHIPMEM_TARBALL) $(SOURCESDIR)/$(UPSTREAM_GUIGFX_TARBALL) $(SOURCESDIR)/$(UPSTREAM_RENDER_TARBALL) $(SOURCESDIR)/$(UPSTREAM_CODESETS_TARBALL)
mkdir -p $(BUILDDIR)/ndk/tmp/
- lha xw=$(BUILDDIR)/ndk $(SOURCESDIR)/$(UPSTREAM_NDK_TARBALL)
- lha xw=$(BUILDDIR)/ndk/tmp $(BUILDDIR)/ndk/SDK_Install/base.lha
- lha xw=$(BUILDDIR)/ndk/tmp $(BUILDDIR)/ndk/SDK_Install/newlib-53.30.lha
- lha xw=$(BUILDDIR)/ndk/tmp $(BUILDDIR)/ndk/SDK_Install/clib2-1.206.lha
- lha xw=$(BUILDDIR)/ndk/tmp $(BUILDDIR)/ndk/SDK_Install/pthreads-53.11.lha
- lha xw=$(BUILDDIR)/ndk/tmp $(SOURCESDIR)/$(UPSTREAM_ONCHIPMEM_TARBALL)
+ $(BUILDDIR)/prefix/bin/lha xw=$(BUILDDIR)/ndk $(SOURCESDIR)/$(UPSTREAM_NDK_TARBALL)
+ $(BUILDDIR)/prefix/bin/lha xw=$(BUILDDIR)/ndk/tmp $(BUILDDIR)/ndk/SDK_Install/base.lha
+ $(BUILDDIR)/prefix/bin/lha xw=$(BUILDDIR)/ndk/tmp $(BUILDDIR)/ndk/SDK_Install/execsg_sdk-54.31.lha
+ $(BUILDDIR)/prefix/bin/lha xw=$(BUILDDIR)/ndk/tmp $(BUILDDIR)/ndk/SDK_Install/newlib-53.80.lha
+ $(BUILDDIR)/prefix/bin/lha xw=$(BUILDDIR)/ndk/tmp $(BUILDDIR)/ndk/SDK_Install/clib2.lha
+ $(BUILDDIR)/prefix/bin/lha xw=$(BUILDDIR)/ndk/tmp $(BUILDDIR)/ndk/SDK_Install/pthreads-53.12.lha
+ $(BUILDDIR)/prefix/bin/lha xw=$(BUILDDIR)/ndk/tmp $(SOURCESDIR)/$(UPSTREAM_ONCHIPMEM_TARBALL)
mkdir -p $(PREFIX)/$(TARGET_NAME)/SDK
+ unzip -o $(SOURCESDIR)/$(UPSTREAM_NDK_UPDATE_TARBALL) -d $(BUILDDIR)/ndk/tmp
cp -r $(BUILDDIR)/ndk/tmp/Include $(PREFIX)/$(TARGET_NAME)/SDK/include
cp -r $(BUILDDIR)/ndk/tmp/newlib $(PREFIX)/$(TARGET_NAME)/SDK/newlib
cp -r $(BUILDDIR)/ndk/tmp/clib2 $(PREFIX)/$(TARGET_NAME)/SDK/clib2
cp -r $(BUILDDIR)/ndk/tmp/Local/common/include/* $(PREFIX)/$(TARGET_NAME)/SDK/newlib/include/
cp -r $(BUILDDIR)/ndk/tmp/Local/newlib/lib/* $(PREFIX)/$(TARGET_NAME)/SDK/newlib/lib/
cp -r $(BUILDDIR)/ndk/tmp/SDK/Include/* $(PREFIX)/$(TARGET_NAME)/SDK/include
+ cp -r $(BUILDDIR)/ndk/tmp/SDK/newlib $(PREFIX)/$(TARGET_NAME)/SDK/newlib
+ cp -r $(BUILDDIR)/ndk/tmp/SDK/local/newlib/lib/* $(PREFIX)/$(TARGET_NAME)/SDK/newlib/lib/
+ cp -r $(BUILDDIR)/ndk/tmp/SDK/local/common/include/* $(PREFIX)/$(TARGET_NAME)/SDK/newlib/include/
+ unzip -o $(SOURCESDIR)/$(UPSTREAM_NDK_UPDATE_TARBALL) -d $(BUILDDIR)/ndk/tmp
mkdir -p $(BUILDDIR)/openurl
cd $(BUILDDIR)/openurl && tar xaf $(SOURCESDIR)/$(UPSTREAM_OPENURL_TARBALL)
cp -r $(BUILDDIR)/openurl/libopenurl-$(UPSTREAM_OPENURL_VERSION)/include/* $(PREFIX)/$(TARGET_NAME)/SDK/include/include_h/
mkdir -p $(BUILDDIR)/guigfxlib
- lha xw=$(BUILDDIR)/guigfxlib $(SOURCESDIR)/$(UPSTREAM_GUIGFX_TARBALL)
+ $(BUILDDIR)/prefix/bin/lha xw=$(BUILDDIR)/guigfxlib $(SOURCESDIR)/$(UPSTREAM_GUIGFX_TARBALL)
cp -r $(BUILDDIR)/guigfxlib/include_os4/* $(PREFIX)/$(TARGET_NAME)/SDK/include/include_h/
mkdir -p $(BUILDDIR)/renderlib
- lha xw=$(BUILDDIR)/renderlib $(SOURCESDIR)/$(UPSTREAM_RENDER_TARBALL)
+ $(BUILDDIR)/prefix/bin/lha xw=$(BUILDDIR)/renderlib $(SOURCESDIR)/$(UPSTREAM_RENDER_TARBALL)
cp -r $(BUILDDIR)/renderlib/renderlib/include_os4/* $(PREFIX)/$(TARGET_NAME)/SDK/include/include_h/
mkdir -p $(BUILDDIR)/codesets
- lha xw=$(BUILDDIR)/codesets $(SOURCESDIR)/$(UPSTREAM_CODESETS_TARBALL)
+ $(BUILDDIR)/prefix/bin/lha xw=$(BUILDDIR)/codesets $(SOURCESDIR)/$(UPSTREAM_CODESETS_TARBALL)
cp -r $(BUILDDIR)/codesets/codesets/Developer/include/* $(PREFIX)/$(TARGET_NAME)/SDK/include/include_h/
touch $@
###
+# Rules to build and install lhasa
+###
+
+$(BUILDSTEPS)/lhasa.d: $(BUILDSTEPS)/lhasa-srcdir.d
+ mkdir -p $(BUILDDIR)/lhasa
+ mkdir -p $(BUILDDIR)/prefix
+ cd $(BUILDDIR)/lhasa && $(SRCDIR)/lhasa/configure --prefix=$(BUILDDIR)/prefix
+ cd $(BUILDDIR)/lhasa && make
+ cd $(BUILDDIR)/lhasa && make install
+ touch $@
+
+$(BUILDSTEPS)/lhasa-srcdir.d: $(SOURCESDIR)/$(UPSTREAM_LHASA_TARBALL)
+ unzip $(SOURCESDIR)/$(UPSTREAM_LHASA_TARBALL)
+ mv lhasa-$(UPSTREAM_LHASA_VERSION) $(SRCDIR)/lhasa
+ cd $(SRCDIR)/lhasa && autoreconf -i
+ touch $@
+
+###
# Rules to create the GCC source tree
###
@@ -184,9 +215,15 @@ $(SOURCESDIR)/$(UPSTREAM_MPC_TARBALL):
$(SOURCESDIR)/$(UPSTREAM_BINUTILS_TARBALL):
wget -q -O $@ $(UPSTREAM_BINUTILS_URI)
+$(SOURCESDIR)/$(UPSTREAM_LHASA_TARBALL):
+ wget -q -O $@ $(UPSTREAM_LHASA_URI)
+
$(SOURCESDIR)/$(UPSTREAM_NDK_TARBALL):
wget -q -O $@ $(UPSTREAM_NDK_URI)
+$(SOURCESDIR)/$(UPSTREAM_NDK_UPDATE_TARBALL):
+ wget -q -O $@ $(UPSTREAM_NDK_UPDATE_URI)
+
$(SOURCESDIR)/$(UPSTREAM_OPENURL_TARBALL):
wget -q -O $@ $(UPSTREAM_OPENURL_URI)
diff --git a/sdk/Makefile b/sdk/Makefile
index 3827095..340be7d 100644
--- a/sdk/Makefile
+++ b/sdk/Makefile
@@ -7,11 +7,13 @@
# GCCSDK_INSTALL_CROSSBIN -- /path/to/toolchain/bin
#
# supported targets are:
+# arm-riscos-gnueabi
# arm-unknown-riscos
# m68k-atari-mint
# m5475-atari-mint
# ppc-amigaos
# i686-w64-mingw32
+# x86_64-w64-mingw32
# m68k-unknown-amigaos
ifeq ($(GCCSDK_INSTALL_ENV),)
@@ -23,23 +25,64 @@ ifeq ($(GCCSDK_INSTALL_CROSSBIN),)
endif
# Upstream package versions
-VERSION_ZLIB := 1.2.11
-VERSION_LIBICONV := 1.15
+# https://zlib.net/
+VERSION_ZLIB := 1.2.13
+CKSUM_ZLIB := b3a24de97a8fdbc835b9833169501030b8977031bcb54b3b3ac13740f846ab30
+# https://www.gnu.org/software/libiconv/
+VERSION_LIBICONV := 1.17
+CKSUM_LIBICONV := 8f74213b56238c85a50a5329f77e06198771e70dd9a739779f4c02f65d971313
+# https://laurikari.net/tre/
VERSION_LIBTRE := 0.8.0
-VERSION_OPENSSL := 1.1.0j
-VERSION_LIBPNG := 1.6.36
+CKSUM_LIBTRE := 8dc642c2cde02b2dac6802cdbe2cda201daf79c4ebcbb3ea133915edf1636658
+# https://www.openssl.org/
+VERSION_OPENSSL := 3.0.12
+CKSUM_OPENSSL := f93c9e8edde5e9166119de31755fc87b4aa34863662f67ddfcba14d0b6b69b61
+# http://www.libpng.org/pub/png/libpng.html
+VERSION_LIBPNG := 1.6.40
+CKSUM_LIBPNG := 8f720b363aa08683c9bf2a563236f45313af2c55d542b5481ae17dd8d183bb42
+# http://libjpeg.sourceforge.net/
VERSION_LIBJPEG := 8d
-VERSION_LIBJPEG_TURBO := 1.5.3
-VERSION_LIBCARES := 1.13.0
-VERSION_LIBCURL := 7.64.0
+CKSUM_LIBJPEG := 00029b1473f0f0ea72fbca3230e8cb25797fbb27e58ae2e46bb8bf5a806fe0b3
+# https://libjpeg-turbo.org/
+VERSION_LIBJPEG_TURBO := 3.0.1
+CKSUM_LIBJPEG_TURBO := 22429507714ae147b3acacd299e82099fce5d9f456882fc28e252e4579ba2a75
+# https://developers.google.com/speed/webp/
+VERSION_LIBWEBP := 1.3.2
+CKSUM_LIBWEBP := 2a499607df669e40258e53d0ade8035ba4ec0175244869d1025d460562aa09b4
+# https://c-ares.org/
+VERSION_LIBCARES := 1.23.0
+CKSUM_LIBCARES := cb614ecf78b477d35963ebffcf486fc9d55cc3d3216f00700e71b7d4868f79f5
+# https://curl.se/
+VERSION_LIBCURL := 8.5.0
+CKSUM_LIBCURL := ce4b6a6655431147624aaf582632a36fe1ade262d5fab385c60f78942dd8d87b
+#
VERSION_LIBGNURX := 2.5.1
+CKSUM_LIBGNURX := 7147b7f806ec3d007843b38e19f42a5b7c65894a57ffc297a76b0dcd5f675d76
+# http://mission-base.com/peter/source/
+# 1.7.0: https://github.com/peterGraf/pbl/releases
VERSION_LIBPBL := 1_04
+CKSUM_LIBPBL := 20f0ab1af09a22a8f3cb3ce3832247a6b51d8db57211f6bb0794af9485229a67
+# Git-20170304
VERSION_LIBCF := CVS-20130415
-VERSION_LIBEXPAT := 2.2.1
-VERSION_LDG := 2.32
+CKSUM_LIBCF := 5d25c4faa2f5b7fc106bb47d093646f79d0fa72a34aaf8122110a2e4cf9eb6cc
+# https://github.com/libexpat/libexpat
+VERSION_LIBEXPAT := 2.5.0
+CKSUM_LIBEXPAT := 6f0e6e01f7b30025fa05c85fdad1e5d0ec7fd35d9f61b22f34998de11969ff67
+#
+VERSION_LDG := SVN-20150827
+CKSUM_LDG := ca7959d31b46cb1e755005eddcc0daf6a91f7faad7d869d82e94d98d20650d94
+#
VERSION_WINDOM := 2.0.1
+CKSUM_WINDOM := 2539c15c22f7b8ca48c015f0c3d33f3bd1666cc8aa56eef6f38de2cc98a3479e
+# https://github.com/berkus/hermes-pixel-format/archive/refs/tags/v1.3.3.tar.gz
VERSION_HERMES := 1.3.3
-VERSION_FREETYPE := 2.7.1
+CKSUM_HERMES := e86374606105d2a251d4406e5f9fca8d09e2fd971ebb0dfd342e40953676c46e
+# https://www.freetype.org/
+VERSION_FREETYPE := 2.13.2
+CKSUM_FREETYPE := 1ac27e16c134a7f2ccea177faba19801131116fd682efc1f5737037c5db224b5
+#
+VERSION_ROADSHOW := 7_64_0-amissl
+CKSUM_ROADSHOW := 5af092c2319f184d49f5eda72d160231b3f3551f9884f8136c531521059a4ad2
# Path
path__ := $(GCCSDK_INSTALL_CROSSBIN):$(PATH)
@@ -49,6 +92,7 @@ cc__ := $(word 1,$(wildcard $(GCCSDK_INSTALL_CROSSBIN)/*gcc))
cxx__ := $(word 1,$(wildcard $(GCCSDK_INSTALL_CROSSBIN)/*g++))
ar__ := $(word 1,$(wildcard $(GCCSDK_INSTALL_CROSSBIN)/*ar))
ranlib__ := $(word 1,$(wildcard $(GCCSDK_INSTALL_CROSSBIN)/*ranlib))
+windres__ := $(word 1,$(wildcard $(GCCSDK_INSTALL_CROSSBIN)/*windres))
# Flags
cflags__ := -I$(GCCSDK_INSTALL_ENV)/include
@@ -59,11 +103,31 @@ pkg_config_libdir__ := $(GCCSDK_INSTALL_ENV)/lib/pkgconfig
# Target
TARGET := $(shell $(cc__) -dumpmachine)
+ifeq ($(findstring -riscos,$(TARGET)),-riscos)
+ cflags__ := $(cflags__) -mpoke-function-name
+ ifeq ($(findstring -gnueabi,$(TARGET)),-gnueabi)
+ cflags__ := $(cflags__) -funwind-tables
+ endif
+endif
+
# Environment
# Newer autotools objects to -I appearing in CFLAGS
cleanenv := PATH="$(path__)" CC="$(cc__)" CXX="$(cxx__)" AR="$(ar__)" RANLIB="$(ranlib__)" CPPFLAGS="$(cppflags__)" LDFLAGS="$(ldflags__)" PKG_CONFIG_LIBDIR="$(pkg_config_libdir__)"
env := $(cleanenv) CFLAGS="$(cflags__)"
+# Cross-compiling CMake invocation.
+NS_SDK_CMAKE_CMD=cmake \
+ -DCMAKE_INSTALL_PREFIX="$(GCCSDK_INSTALL_ENV)" \
+ -DBUILD_SHARED_LIBS=OFF \
+ -DCMAKE_COLOR_MAKEFILE=OFF \
+ -DBUILD_DOC=OFF \
+ -DBUILD_DOCS=OFF \
+ -DBUILD_EXAMPLE=OFF \
+ -DBUILD_EXAMPLES=OFF \
+ -DBUILD_TEST=OFF \
+ -DBUILD_TESTS=OFF \
+ -DBUILD_TESTING=OFF \
+
RECIPES := $(CURDIR)/recipes
SOURCEDIR := $(CURDIR)/sources
BUILDDIR := $(CURDIR)/builddir-$(TARGET)
@@ -79,15 +143,26 @@ SDK_ITEMS :=
COMMON_SDK_ITEMS := zlib.d openssl.d libpng.d libcares.d libcurl.d libexpat.d
-LIBCURL_DISABLES := $(patsubst %,--disable-%,ftp file dict ldap ldaps rtsp telnet gopher tftp pop3 imap smb smtp manual)
+LIBCURL_SSL := openssl
+LIBCURL_DISABLES := $(patsubst %,--disable-%,ftp file dict ldap ldaps mqtt rtsp telnet gopher tftp pop3 imap smb smtp manual)
FREETYPE_ENV := LIBPNG_CFLAGS=$$($(GCCSDK_INSTALL_ENV)/bin/libpng-config --cflags) LIBPNG_LDFLAGS=$$($(GCCSDK_INSTALL_ENV)/bin/libpng-config --ldflags)
# per target environments
LIBJPEG_TURBO_BUILDDIR:=$(BUILDDIR)/libjpegturbo
+# Openssl target has to alter for mingw
+TARGET_OPENSSL:=$(TARGET)
+
# Target Specific setup
+ifeq ($(TARGET),arm-riscos-gnueabi)
+ SDK_ITEMS := $(addprefix $(BUILDSTEPS)/, $(COMMON_SDK_ITEMS) libjpeg-turbo.d libwebp.d)
+ EXTRAARGS_LIBCARES := --disable-shared
+ EXTRAARGS_LIBCURL := --enable-nonblocking --enable-ares --with-random="/dev/urandom" $(LIBCURL_DISABLES)
+ EXTRAARGS_OPENSSL := no-asm
+endif
+
ifeq ($(TARGET),arm-unknown-riscos)
- SDK_ITEMS := $(addprefix $(BUILDSTEPS)/, $(COMMON_SDK_ITEMS) libjpeg-turbo.d)
+ SDK_ITEMS := $(addprefix $(BUILDSTEPS)/, $(COMMON_SDK_ITEMS) libjpeg-turbo.d libwebp.d)
EXTRAARGS_LIBCARES := --disable-shared
EXTRAARGS_LIBCURL := --enable-nonblocking --enable-ares --with-random="/dev/urandom" $(LIBCURL_DISABLES)
EXTRAARGS_OPENSSL := no-asm
@@ -113,25 +188,48 @@ endif
ifeq ($(TARGET),ppc-amigaos)
SDK_ITEMS := $(addprefix $(BUILDSTEPS)/, libiconv.d libtre.d libpbl.d $(COMMON_SDK_ITEMS) libjpeg-turbo.d)
EXTRAARGS_LIBCARES := --disable-shared
- EXTRAARGS_LIBCURL := --disable-ntlm-wb --without-random --enable-threaded-resolver LIBS=-lpthread
+ EXTRAARGS_LIBCURL := --disable-ntlm-wb --without-random --enable-threaded-resolver --disable-ipv6 LIBS=-lpthread
endif
ifeq ($(TARGET),i686-w64-mingw32)
- SDK_ITEMS := $(addprefix $(BUILDSTEPS)/, libiconv.d libgnurx.d $(COMMON_SDK_ITEMS) libjpeg.d)
+ SDK_ITEMS := $(addprefix $(BUILDSTEPS)/, libiconv.d libgnurx.d $(COMMON_SDK_ITEMS) libjpeg.d libwebp.d)
+ EXTRAARGS_LIBCARES := --disable-shared
+ EXTRAARGS_LIBCURL := --enable-nonblocking --enable-ares --disable-ldap --without-random
+ LIBCURL_ENV := CFLAGS="-DCARES_STATICLIB" LIBS="-lgdi32 -lcrypt32 -liphlpapi"
+ TARGET_OPENSSL := mingw
+ ENV_OPENSSL := WINDRES="$(windres__)"
+ EXTRAARGS_OPENSSL := no-asm enable-capieng
+endif
+
+ifeq ($(TARGET),x86_64-w64-mingw32)
+ SDK_ITEMS := $(addprefix $(BUILDSTEPS)/, libiconv.d libgnurx.d $(COMMON_SDK_ITEMS) libjpeg.d libwebp.d)
EXTRAARGS_LIBCARES := --disable-shared
EXTRAARGS_LIBCURL := --enable-nonblocking --enable-ares --disable-ldap --without-random
- LIBCURL_ENV := CFLAGS="-DCARES_STATICLIB" LIBS="-lgdi32 -lcrypt32"
+ LIBCURL_ENV := CFLAGS="-DCARES_STATICLIB" LIBS="-lgdi32 -lcrypt32 -liphlpapi"
+ TARGET_OPENSSL := mingw64
EXTRAARGS_OPENSSL := no-asm enable-capieng
endif
ifeq ($(TARGET),m68k-unknown-amigaos)
- SDK_ITEMS := $(addprefix $(BUILDSTEPS)/, libiconv.d libtre.d libpbl.d $(COMMON_SDK_ITEMS) libjpeg.d)
+ SDK_ITEMS := $(addprefix $(BUILDSTEPS)/, roadshow.d libiconv.d libtre.d libpbl.d $(COMMON_SDK_ITEMS) libjpeg.d)
EXTRAARGS_LIBCARES := --disable-shared --without-random
- EXTRAARGS_LIBCURL := --disable-ntlm-wb --without-random --disable-threaded-resolver --with-ssl --with-zlib
- LIBICONV_ENV := CFLAGS="-DPATH_MAX=1024"
+ LIBCARES_ENV := LIBS="-lm"
+ LIBCURL_SSL := amissl
+ EXTRAARGS_LIBCURL := --disable-ntlm-wb --without-random --disable-threaded-resolver --with-zlib --disable-rt --disable-ipv6
+ LIBICONV_ENV := CFLAGS="-DPATH_MAX=1024 -DRLIMIT_NOFILE=6"
LIBJPEG_ENV := LDFLAGS="-lm"
LIBJPEG_TURBO_ENV := LDFLAGS="-lm"
- LIBCURL_ENV := LIBS="-lm"
+ # XXX: build openssl against bsdsocket.library?
+ # ENV_OPENSSL := CFLAGS="-I$(GCCSDK_INSTALL_ENV)/netinclude" CPPFLAGS="-D__NO_NET_API"
+ ifeq ($(LIBCURL_SSL),openssl)
+ LIBCURL_ENV := LIBS="-lm -lnet"
+ else
+ LIBCURL_ENV := CFLAGS="-I$(GCCSDK_INSTALL_ENV)/netinclude -D__NO_NET_API -DHAVE_IOCTLSOCKET_CAMEL_FIONBIO" LIBS="-lm"
+ endif
+ # XXX: libgcc is meant to be implied, but for some reason that
+ # results in ld evaluating it after libm and thus failing to find symbols.
+ # Hack around it by forcing the link order here.
+ LIBEXPAT_ENV := LDFLAGS="-lgcc -lm"
endif
ifeq ($(SDK_ITEMS),)
@@ -173,7 +271,7 @@ endif
touch $@
$(SOURCEDIR)/zlib-$(VERSION_ZLIB).tar.gz:
- $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "http://zlib.net/$(subst $(SOURCEDIR)/,,$@)" $@
+ $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "https://zlib.net/fossils/$(subst $(SOURCEDIR)/,,$@)" $(CKSUM_ZLIB) $@
# libiconv
$(BUILDSTEPS)/libiconv.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/libiconv-src.d
@@ -191,7 +289,7 @@ $(BUILDSTEPS)/libiconv-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/libiconv-$(
touch $@
$(SOURCEDIR)/libiconv-$(VERSION_LIBICONV).tar.gz:
- $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "http://ftp.gnu.org/pub/gnu/libiconv/$(subst $(SOURCEDIR)/,,$@)" $@
+ $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "https://ftp.gnu.org/pub/gnu/libiconv/$(subst $(SOURCEDIR)/,,$@)" $(CKSUM_LIBICONV) $@
# libgnurx
$(BUILDSTEPS)/libgnurx.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/libgnurx-src.d
@@ -211,7 +309,7 @@ $(BUILDSTEPS)/libgnurx-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/libgnurx-$(
touch $@
$(SOURCEDIR)/libgnurx-$(VERSION_LIBGNURX).tar.gz:
- $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "http://downloads.sourceforge.net/project/mingw/Other/UserContributed/regex/mingw-regex-$(VERSION_LIBGNURX)/mingw-libgnurx-$(VERSION_LIBGNURX)-src.tar.gz" $@
+ $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "https://downloads.sourceforge.net/project/mingw/Other/UserContributed/regex/mingw-regex-$(VERSION_LIBGNURX)/mingw-libgnurx-$(VERSION_LIBGNURX)-src.tar.gz" $(CKSUM_LIBGNURX) $@
# atari cf library
$(BUILDSTEPS)/libcf.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/libcf-src.d
@@ -229,7 +327,7 @@ $(BUILDSTEPS)/libcf-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/libcf-$(VERSIO
touch $@
$(SOURCEDIR)/libcf-$(VERSION_LIBCF).tar.bz2:
- $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "http://vincent.riviere.free.fr/soft/m68k-atari-mint/archives/cflib-$(VERSION_LIBCF).tar.bz2" $@
+ $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "http://vincent.riviere.free.fr/soft/m68k-atari-mint/archives/cflib-$(VERSION_LIBCF).tar.bz2" $(CKSUM_LIBCF) $@
# atari windom library
$(BUILDSTEPS)/windom.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/windom-src.d
@@ -247,12 +345,12 @@ $(BUILDSTEPS)/windom-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/windom-$(VERS
touch $@
$(SOURCEDIR)/windom-$(VERSION_WINDOM).zip:
- $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "http://downloads.sourceforge.net/project/windom/windom/$(VERSION_WINDOM)/windom-$(VERSION_WINDOM)-1.zip" $@
+ $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "https://downloads.sourceforge.net/project/windom/windom/$(VERSION_WINDOM)/windom-$(VERSION_WINDOM)-1.zip" $(CKSUM_WINDOM) $@
# atari ldg library
$(BUILDSTEPS)/ldg.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/ldg-src.d
mkdir -p $(BUILDDIR)/ldg
- cd $(BUILDDIR)/ldg && unzip $(SOURCEDIR)/ldg-$(VERSION_LDG).zip
+ cd $(BUILDDIR)/ldg && tar xjf $(SOURCEDIR)/ldg-$(VERSION_LDG).tar.bz2
$(env) make -C $(BUILDDIR)/ldg/ldg-$(VERSION_LDG)/src/devel -f gcc.mak CROSS=yes PREFIX=$(GCCSDK_INSTALL_ENV) CC=${TARGET}-gcc AR=${TARGET}-ar
cp $(BUILDDIR)/ldg/ldg-$(VERSION_LDG)/lib/gcc/libldg.a $(GCCSDK_INSTALL_ENV)/lib/
cp $(BUILDDIR)/ldg/ldg-$(VERSION_LDG)/include/ldg.h $(GCCSDK_INSTALL_ENV)/include/ldg.h
@@ -260,31 +358,31 @@ $(BUILDSTEPS)/ldg.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/ldg-src.d
cp $(BUILDDIR)/ldg/ldg-$(VERSION_LDG)/include/ldg/mem.h $(GCCSDK_INSTALL_ENV)/include/ldg/
touch $@
-$(BUILDSTEPS)/ldg-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/ldg-$(VERSION_LDG).zip
+$(BUILDSTEPS)/ldg-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/ldg-$(VERSION_LDG).tar.bz2
touch $@
-$(SOURCEDIR)/ldg-$(VERSION_LDG).zip:
- $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "http://ldg.org.free.fr/distrib/ldg-$(VERSION_LDG).zip" $@
+$(SOURCEDIR)/ldg-$(VERSION_LDG).tar.bz2:
+ $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "http://vincent.riviere.free.fr/soft/m68k-atari-mint/archives/ldg-$(VERSION_LDG).tar.bz2" $(CKSUM_LDG) $@
# hermes bitmap lib
$(BUILDSTEPS)/hermes.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/hermes-src.d
- cd $(BUILDDIR)/hermes/Hermes-$(VERSION_HERMES)
- for p in `ls $(RECIPES)/patches/hermes/*.p` ; do $(PATCH) -d $(BUILDDIR)/hermes/Hermes-$(VERSION_HERMES) -p0 <$$p ; done
+ cd $(BUILDDIR)/hermes/hermes-pixel-format-$(VERSION_HERMES)
+ for p in `ls $(RECIPES)/patches/hermes/*.p` ; do $(PATCH) -d $(BUILDDIR)/hermes/hermes-pixel-format-$(VERSION_HERMES) -p0 <$$p ; done
ifneq ($(realpath $(RECIPES)/patches/hermes/$(TARGET)),)
- for p in `ls $(RECIPES)/patches/hermes/$(TARGET)/*.p` ; do $(PATCH) -d $(BUILDDIR)/hermes/Hermes-$(VERSION_HERMES) -p0 <$$p ; done
+ for p in `ls $(RECIPES)/patches/hermes/$(TARGET)/*.p` ; do $(PATCH) -d $(BUILDDIR)/hermes/hermes-pixel-format-$(VERSION_HERMES) -p0 <$$p ; done
endif
- cd $(BUILDDIR)/hermes/Hermes-$(VERSION_HERMES) && $(env) ./configure --prefix=$(GCCSDK_INSTALL_ENV) --target=$(TARGET) --host=$(TARGET) --disable-shared --disable-x86asm
- cd $(BUILDDIR)/hermes/Hermes-$(VERSION_HERMES) && $(env) make CFLAGS="-D__BIG_ENDIAN__" install
+ cd $(BUILDDIR)/hermes/hermes-pixel-format-$(VERSION_HERMES) && $(env) ./configure --prefix=$(GCCSDK_INSTALL_ENV) --target=$(TARGET) --host=$(TARGET) --disable-shared --disable-x86asm
+ cd $(BUILDDIR)/hermes/hermes-pixel-format-$(VERSION_HERMES) && $(env) make CFLAGS="-D__BIG_ENDIAN__" install
touch $@
-$(BUILDSTEPS)/hermes-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/hermes-$(VERSION_HERMES).tar.bz2
+$(BUILDSTEPS)/hermes-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/hermes-$(VERSION_HERMES).tar.gz
$(RM) -rf $(BUILDDIR)/hermes
mkdir -p $(BUILDDIR)/hermes
- cd $(BUILDDIR)/hermes && tar xaf $(SOURCEDIR)/hermes-$(VERSION_HERMES).tar.bz2
+ cd $(BUILDDIR)/hermes && tar xaf $(SOURCEDIR)/hermes-$(VERSION_HERMES).tar.gz
touch $@
-$(SOURCEDIR)/hermes-$(VERSION_HERMES).tar.bz2:
- $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "http://clanlib.org/download/legacy/Hermes-$(VERSION_HERMES).tar.bz2" $@
+$(SOURCEDIR)/hermes-$(VERSION_HERMES).tar.gz:
+ $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "https://github.com/berkus/hermes-pixel-format/archive/refs/tags/v$(VERSION_HERMES).tar.gz" $(CKSUM_HERMES) $@
# freetype font lib
$(BUILDSTEPS)/freetype.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/freetype-src.d
@@ -293,14 +391,31 @@ $(BUILDSTEPS)/freetype.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/freetype-src.d
cd $(BUILDDIR)/freetype/freetype-$(VERSION_FREETYPE) && $(env) make install
touch $@
-$(BUILDSTEPS)/freetype-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/freetype-$(VERSION_FREETYPE).tar.bz2
+$(BUILDSTEPS)/freetype-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/freetype-$(VERSION_FREETYPE).tar.gz
$(RM) -rf $(BUILDDIR)/freetype
mkdir -p $(BUILDDIR)/freetype
- cd $(BUILDDIR)/freetype && tar xaf $(SOURCEDIR)/freetype-$(VERSION_FREETYPE).tar.bz2
+ cd $(BUILDDIR)/freetype && tar xaf $(SOURCEDIR)/freetype-$(VERSION_FREETYPE).tar.gz
+ifneq ($(realpath $(RECIPES)/files/freetype/$(TARGET)),)
+ cp -r $(RECIPES)/files/freetype/$(TARGET)/* $(BUILDDIR)/freetype/freetype-$(VERSION_FREETYPE)/
+endif
+ touch $@
+
+$(SOURCEDIR)/freetype-$(VERSION_FREETYPE).tar.gz:
+ $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "https://download.savannah.gnu.org/releases/freetype/freetype-$(VERSION_FREETYPE).tar.gz" $(CKSUM_FREETYPE) $@
+
+# amiga roadshow sdk
+$(BUILDSTEPS)/roadshow.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/roadshow-src.d
+ mkdir -p $(BUILDDIR)/Roadshow-SDK
+ lha xw=$(BUILDDIR)/Roadshow-SDK $(SOURCEDIR)/Roadshow-SDK-NS-$(VERSION_ROADSHOW).lha
+ mkdir -p $(GCCSDK_INSTALL_ENV)/netinclude
+ cp -r $(BUILDDIR)/Roadshow-SDK/SDK/netinclude/* $(GCCSDK_INSTALL_ENV)/netinclude/
touch $@
-$(SOURCEDIR)/freetype-$(VERSION_FREETYPE).tar.bz2:
- $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "http://download.savannah.gnu.org/releases/freetype/freetype-$(VERSION_FREETYPE).tar.bz2" $@
+$(BUILDSTEPS)/roadshow-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/Roadshow-SDK-NS-$(VERSION_ROADSHOW).lha
+ touch $@
+
+$(SOURCEDIR)/Roadshow-SDK-NS-$(VERSION_ROADSHOW).lha:
+ $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "https://github.com/chris-y/curl/releases/download/curl-$(VERSION_ROADSHOW)/Roadshow-SDK-NS.lha" $(CKSUM_ROADSHOW) $@
# regex
$(BUILDSTEPS)/libtre.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/libtre-src.d
@@ -315,7 +430,7 @@ $(BUILDSTEPS)/libtre-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/tre-$(VERSION
touch $@
$(SOURCEDIR)/tre-$(VERSION_LIBTRE).tar.bz2:
- $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "http://laurikari.net/tre/$(subst $(SOURCEDIR)/,,$@)" $@
+ $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "https://laurikari.net/tre/$(subst $(SOURCEDIR)/,,$@)" $(CKSUM_LIBTRE) $@
# libpbl
$(BUILDSTEPS)/libpbl.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/libpbl-src.d
@@ -332,28 +447,33 @@ $(BUILDSTEPS)/libpbl-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/pbl_$(VERSION
touch $@
$(SOURCEDIR)/pbl_$(VERSION_LIBPBL).tar.gz:
- $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "http://www.mission-base.com/peter/source/$(subst $(SOURCEDIR)/,,$@)" $@
+ $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "https://www.mission-base.com/peter/source/$(subst $(SOURCEDIR)/,,$@)" $(CKSUM_LIBPBL) $@
# OpenSSL
$(BUILDSTEPS)/openssl.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/zlib.d $(BUILDSTEPS)/openssl-src.d
+ifeq ($(LIBCURL_SSL),openssl)
+ cd $(BUILDDIR)/openssl/openssl-$(VERSION_OPENSSL) && $(env) $(ENV_OPENSSL) ./Configure --prefix=$(GCCSDK_INSTALL_ENV) $(TARGET_OPENSSL) no-shared no-threads $(EXTRAARGS_OPENSSL)
+ cd $(BUILDDIR)/openssl/openssl-$(VERSION_OPENSSL) && $(env) make install
+endif
+ touch $@
+
+# prepare the openssl source tree
+$(BUILDSTEPS)/openssl-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/openssl-$(VERSION_OPENSSL).tar.gz
+ $(RM) -rf $(BUILDDIR)/openssl
mkdir -p $(BUILDDIR)/openssl
cd $(BUILDDIR)/openssl && tar xaf $(SOURCEDIR)/openssl-$(VERSION_OPENSSL).tar.gz
- for p in `ls $(RECIPES)/patches/openssl/*.p` ; do $(PATCH) -d $(BUILDDIR)/openssl/openssl-$(VERSION_OPENSSL) -p0 <$$p ; done
+ for p in `ls $(RECIPES)/patches/openssl/*.p` ; do $(PATCH) -d $(BUILDDIR)/openssl/openssl-$(VERSION_OPENSSL) -p0 <$$p || exit $0 ; done
ifneq ($(realpath $(RECIPES)/patches/openssl/$(TARGET)),)
- for p in `ls $(RECIPES)/patches/openssl/$(TARGET)/*.p` ; do $(PATCH) -d $(BUILDDIR)/openssl/openssl-$(VERSION_OPENSSL) -p0 <$$p ; done
+ for p in `ls $(RECIPES)/patches/openssl/$(TARGET)/*.p` ; do $(PATCH) -d $(BUILDDIR)/openssl/openssl-$(VERSION_OPENSSL) -p0 <$$p || exit $0 ; done
endif
ifneq ($(realpath $(RECIPES)/files/openssl/$(TARGET)),)
cp -r $(RECIPES)/files/openssl/$(TARGET)/* $(BUILDDIR)/openssl/openssl-$(VERSION_OPENSSL)
endif
- cd $(BUILDDIR)/openssl/openssl-$(VERSION_OPENSSL) && $(env) ./Configure --prefix=$(GCCSDK_INSTALL_ENV) $(TARGET) no-shared no-threads $(EXTRAARGS_OPENSSL)
- cd $(BUILDDIR)/openssl/openssl-$(VERSION_OPENSSL) && $(env) make install
- touch $@
-
-$(BUILDSTEPS)/openssl-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/openssl-$(VERSION_OPENSSL).tar.gz
touch $@
+# get the openssl source tar
$(SOURCEDIR)/openssl-$(VERSION_OPENSSL).tar.gz:
- $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "http://www.openssl.org/source/$(subst $(SOURCEDIR)/,,$@)" $@
+ $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "https://www.openssl.org/source/$(subst $(SOURCEDIR)/,,$@)" $(CKSUM_OPENSSL) $@
# libPNG
$(BUILDSTEPS)/libpng.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/zlib.d $(BUILDSTEPS)/libpng-src.d
@@ -370,7 +490,7 @@ $(BUILDSTEPS)/libpng-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/libpng-$(VERS
touch $@
$(SOURCEDIR)/libpng-$(VERSION_LIBPNG).tar.gz:
- $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "http://downloads.sourceforge.net/libpng/$(subst $(SOURCEDIR)/,,$@)" $@
+ $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "https://downloads.sourceforge.net/libpng/$(subst $(SOURCEDIR)/,,$@)" $(CKSUM_LIBPNG) $@
# libjpeg
@@ -389,8 +509,7 @@ $(BUILDSTEPS)/libjpeg-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/jpegsrc.v$(V
touch $@
$(SOURCEDIR)/jpegsrc.v$(VERSION_LIBJPEG).tar.gz:
- $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "http://ijg.org/files/$(subst $(SOURCEDIR)/,,$@)" $@
-
+ $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "https://ijg.org/files/$(subst $(SOURCEDIR)/,,$@)" $(CKSUM_LIBJPEG) $@
# libjpegturbo
$(BUILDSTEPS)/libjpeg-turbo.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/libjpeg-turbo-src.d
@@ -400,15 +519,38 @@ $(BUILDSTEPS)/libjpeg-turbo.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/libjpeg-tu
ifneq ($(realpath $(RECIPES)/patches/libjpegturbo/$(TARGET)),)
for p in `ls $(RECIPES)/patches/libjpegturbo/$(TARGET)/*.p` ; do $(PATCH) -d $(LIBJPEG_TURBO_BUILDDIR)/libjpeg-turbo-$(VERSION_LIBJPEG_TURBO) -p0 <$$p ; done
endif
- cd $(LIBJPEG_TURBO_BUILDDIR)/libjpeg-turbo-$(VERSION_LIBJPEG_TURBO) && $(env) $(LIBJPEG_TURBO_ENV) ./configure --prefix=$(GCCSDK_INSTALL_ENV) --target=$(TARGET) --host=$(TARGET) --disable-shared
- cd $(LIBJPEG_TURBO_BUILDDIR)/libjpeg-turbo-$(VERSION_LIBJPEG_TURBO) && $(env) make install
+ mkdir -p $(LIBJPEG_TURBO_BUILDDIR)/libjpeg-turbo-$(VERSION_LIBJPEG_TURBO)/ns-sdk-build
+ cd $(LIBJPEG_TURBO_BUILDDIR)/libjpeg-turbo-$(VERSION_LIBJPEG_TURBO)/ns-sdk-build && $(env) $(LIBJPEG_TURBO_ENV) $(NS_SDK_CMAKE_CMD) \
+ -DENABLE_STATIC=ON \
+ -DENABLE_SHARED=OFF \
+ ..
+ cd $(LIBJPEG_TURBO_BUILDDIR)/libjpeg-turbo-$(VERSION_LIBJPEG_TURBO)/ns-sdk-build && $(env) make install VERBOSE=1
touch $@
$(BUILDSTEPS)/libjpeg-turbo-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/libjpeg-turbo-src-$(VERSION_LIBJPEG_TURBO).tar.gz
touch $@
$(SOURCEDIR)/libjpeg-turbo-src-$(VERSION_LIBJPEG_TURBO).tar.gz:
- $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "http://sourceforge.net/projects/libjpeg-turbo/files/$(VERSION_LIBJPEG_TURBO)/libjpeg-turbo-$(VERSION_LIBJPEG_TURBO).tar.gz/download" $@
+ $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "https://github.com/libjpeg-turbo/libjpeg-turbo/releases/download/$(VERSION_LIBJPEG_TURBO)/libjpeg-turbo-$(VERSION_LIBJPEG_TURBO).tar.gz" $(CKSUM_LIBJPEG_TURBO) $@
+
+
+# libwebp
+$(BUILDSTEPS)/libwebp.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/libwebp-src.d
+ mkdir -p $(BUILDDIR)/libwebp
+ cd $(BUILDDIR)/libwebp && tar xaf $(SOURCEDIR)/libwebp-$(VERSION_LIBWEBP).tar.gz
+ for p in `ls $(RECIPES)/patches/libwebp/*.p` ; do $(PATCH) -d $(BUILDDIR)/libwebp/libwebp-$(VERSION_LIBWEBP) -p0 <$$p ; done
+ifneq ($(realpath $(RECIPES)/patches/libwebp/$(TARGET)),)
+ for p in `ls $(RECIPES)/patches/libwebp/$(TARGET)/*.p` ; do $(PATCH) -d $(BUILDDIR)/libwebp/libwebp-$(VERSION_LIBWEBP) -p0 <$$p ; done
+endif
+ cd $(BUILDDIR)/libwebp/libwebp-$(VERSION_LIBWEBP) && $(env) $(LIBWEBP_ENV) ./configure --prefix=$(GCCSDK_INSTALL_ENV) --target=$(TARGET) --host=$(TARGET) --disable-shared $(EXTRAARGS_LIBWEBP)
+ cd $(BUILDDIR)/libwebp/libwebp-$(VERSION_LIBWEBP) && $(env) make install
+ touch $@
+
+$(BUILDSTEPS)/libwebp-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/libwebp-$(VERSION_LIBWEBP).tar.gz
+ touch $@
+
+$(SOURCEDIR)/libwebp-$(VERSION_LIBWEBP).tar.gz:
+ $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-$(VERSION_LIBWEBP).tar.gz" $(CKSUM_LIBWEBP) $@
# libcares
@@ -419,7 +561,7 @@ $(BUILDSTEPS)/libcares.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/libcares-src.d
ifneq ($(realpath $(RECIPES)/patches/libcares/$(TARGET)),)
for p in `ls $(RECIPES)/patches/libcares/$(TARGET)/*.p` ; do $(PATCH) -d $(BUILDDIR)/libcares/c-ares-$(VERSION_LIBCARES) -p0 <$$p ; done
endif
- cd $(BUILDDIR)/libcares/c-ares-$(VERSION_LIBCARES) && $(cleanenv) ./configure --prefix=$(GCCSDK_INSTALL_ENV) --target=$(TARGET) --host=$(TARGET) $(EXTRAARGS_LIBCARES)
+ cd $(BUILDDIR)/libcares/c-ares-$(VERSION_LIBCARES) && $(cleanenv) $(LIBCARES_ENV) ./configure --prefix=$(GCCSDK_INSTALL_ENV) --target=$(TARGET) --host=$(TARGET) $(EXTRAARGS_LIBCARES)
cd $(BUILDDIR)/libcares/c-ares-$(VERSION_LIBCARES) && $(cleanenv) make install
touch $@
@@ -427,12 +569,12 @@ $(BUILDSTEPS)/libcares-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/c-ares-$(VE
touch $@
$(SOURCEDIR)/c-ares-$(VERSION_LIBCARES).tar.gz:
- $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "http://c-ares.haxx.se/download/$(subst $(SOURCEDIR)/,,$@)" $@
+ $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "https://c-ares.org/download/$(subst $(SOURCEDIR)/,,$@)" $(CKSUM_LIBCARES) $@
# libcurl
$(BUILDSTEPS)/libcurl.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/zlib.d $(BUILDSTEPS)/openssl.d $(BUILDSTEPS)/libcares.d $(BUILDSTEPS)/libcurl-src.d
- cd $(BUILDDIR)/libcurl/curl-$(VERSION_LIBCURL) && $(env) CFLAGS="" $(LIBCURL_ENV) ./configure --prefix=$(GCCSDK_INSTALL_ENV) --target=$(TARGET) --host=$(TARGET) --disable-shared --without-libidn ${EXTRAARGS_LIBCURL}
+ cd $(BUILDDIR)/libcurl/curl-$(VERSION_LIBCURL) && $(env) CFLAGS="" $(LIBCURL_ENV) ./configure --prefix=$(GCCSDK_INSTALL_ENV) --target=$(TARGET) --host=$(TARGET) --disable-shared --with-$(LIBCURL_SSL) --without-libidn2 ${EXTRAARGS_LIBCURL}
cd $(BUILDDIR)/libcurl/curl-$(VERSION_LIBCURL) && $(env) make install
touch $@
@@ -446,20 +588,23 @@ endif
touch $@
$(SOURCEDIR)/curl-$(VERSION_LIBCURL).tar.bz2:
- $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "http://curl.haxx.se/download/$(subst $(SOURCEDIR)/,,$@)" $@
+ $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "https://curl.se/download/$(subst $(SOURCEDIR)/,,$@)" $(CKSUM_LIBCURL) $@
# libexpat
$(BUILDSTEPS)/libexpat.d: $(BUILDSTEPS)/builddir.d $(BUILDSTEPS)/libexpat-src.d
- mkdir -p $(BUILDDIR)/libexpat
- cd $(BUILDDIR)/libexpat && tar xaf $(SOURCEDIR)/expat-$(VERSION_LIBEXPAT).tar.bz2
- cd $(BUILDDIR)/libexpat/expat-$(VERSION_LIBEXPAT) && $(env) ./configure --prefix=$(GCCSDK_INSTALL_ENV) --target=$(TARGET) --host=$(TARGET) --disable-shared
- cd $(BUILDDIR)/libexpat/expat-$(VERSION_LIBEXPAT) && $(env) make install
+ cd $(BUILDDIR)/libexpat/expat-$(VERSION_LIBEXPAT) && $(env) $(LIBEXPAT_ENV) ./configure --prefix=$(GCCSDK_INSTALL_ENV) --target=$(TARGET) --host=$(TARGET) --disable-shared
+ cd $(BUILDDIR)/libexpat/expat-$(VERSION_LIBEXPAT) && $(env) $(LIBEXPAT_ENV) make install
touch $@
$(BUILDSTEPS)/libexpat-src.d: $(BUILDSTEPS)/sourcedir.d $(SOURCEDIR)/expat-$(VERSION_LIBEXPAT).tar.bz2
+ mkdir -p $(BUILDDIR)/libexpat
+ cd $(BUILDDIR)/libexpat && tar xaf $(SOURCEDIR)/expat-$(VERSION_LIBEXPAT).tar.bz2
+ifneq ($(realpath $(RECIPES)/patches/libexpat/$(TARGET)),)
+ for p in `ls $(RECIPES)/patches/libexpat/$(TARGET)/*.p` ; do $(PATCH) -d $(BUILDDIR)/libexpat/expat-$(VERSION_LIBEXPAT) -p0 <$$p ; done
+endif
touch $@
$(SOURCEDIR)/expat-$(VERSION_LIBEXPAT).tar.bz2:
- $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "http://downloads.sourceforge.net/project/expat/expat/$(VERSION_LIBEXPAT)/expat-$(VERSION_LIBEXPAT).tar.bz2" $@
+ $(FETCHSRC) sdk $(subst $(SOURCEDIR)/,,$@) "https://github.com/libexpat/libexpat/releases/download/R_$(subst .,_,$(VERSION_LIBEXPAT))/expat-$(VERSION_LIBEXPAT).tar.bz2" $(CKSUM_LIBEXPAT) $@
diff --git a/sdk/fetchsrc b/sdk/fetchsrc
index 46b72b0..6a7b3b8 100755
--- a/sdk/fetchsrc
+++ b/sdk/fetchsrc
@@ -4,15 +4,18 @@ set -x
# script to fetch toolchain source tar using ci.netsurf-browser.org as a cache
-# Usage fetchsrc <target> <source> <upstream> <output>
+# Usage fetchsrc <target> <source> <upstream> <sha256sum> <output>
-NSSRV="http://ci.netsurf-browser.org/toolchain/"
+NSSRV="https://ci.netsurf-browser.org/toolchain/"
-wget -q -O ${4} ${NSSRV}/${1}/${2}
+wget -q -O ${5} ${NSSRV}/${1}/${2}
if [ $? -ne 0 ];then
- wget -q -O ${4} ${3}
+ wget -q -O ${5} ${3}
if [ $? -ne 0 ];then
- rm ${4}
+ rm ${5}
exit 1
fi
fi
+
+echo "${4} *${5}" | sha256sum --strict -c -
+exit $?
diff --git a/sdk/recipes/files/freetype/m5475-atari-mint/builds/unix/config.sub b/sdk/recipes/files/freetype/m5475-atari-mint/builds/unix/config.sub
new file mode 100755
index 0000000..ba37cf9
--- /dev/null
+++ b/sdk/recipes/files/freetype/m5475-atari-mint/builds/unix/config.sub
@@ -0,0 +1,1805 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright 1992-2018 Free Software Foundation, Inc.
+
+timestamp='2018-04-24'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches to <config-patches@gnu.org>.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+
+Canonicalize a configuration name.
+
+Options:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2018 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help"
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo "$1"
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
+ kopensolaris*-gnu* | cloudabi*-eabi* | \
+ storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ android-linux)
+ os=-linux-android
+ basic_machine=`echo "$1" | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+ ;;
+ *)
+ basic_machine=`echo "$1" | sed 's/-[^-]*$//'`
+ if [ "$basic_machine" != "$1" ]
+ then os=`echo "$1" | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple | -axis | -knuth | -cray | -microblaze*)
+ os=
+ basic_machine=$1
+ ;;
+ -bluegene*)
+ os=-cnk
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -chorusos*)
+ os=-chorusos
+ basic_machine=$1
+ ;;
+ -chorusrdb)
+ os=-chorusrdb
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco6)
+ os=-sco5v6
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*178)
+ os=-lynxos178
+ ;;
+ -lynx*5)
+ os=-lynxos5
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo "$1" | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ 1750a | 580 \
+ | a29k \
+ | aarch64 | aarch64_be \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arceb \
+ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv6m | armv[78][arm] \
+ | avr | avr32 \
+ | ba \
+ | be32 | be64 \
+ | bfin \
+ | c4x | c8051 | clipper | csky \
+ | d10v | d30v | dlx | dsp16xx \
+ | e2k | epiphany \
+ | fido | fr30 | frv | ft32 \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | hexagon \
+ | i370 | i860 | i960 | ia16 | ia64 \
+ | ip2k | iq2000 \
+ | k1om \
+ | le32 | le64 \
+ | lm32 \
+ | m32c | m32r | m32rle | m68000 | m68k | m88k \
+ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64octeon | mips64octeonel \
+ | mips64orion | mips64orionel \
+ | mips64r5900 | mips64r5900el \
+ | mips64vr | mips64vrel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa32r6 | mipsisa32r6el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64r6 | mipsisa64r6el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipsr5900 | mipsr5900el \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | moxie \
+ | mt \
+ | msp430 \
+ | nds32 | nds32le | nds32be \
+ | nios | nios2 | nios2eb | nios2el \
+ | ns16k | ns32k \
+ | open8 | or1k | or1knd | or32 \
+ | pdp10 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle \
+ | pru \
+ | pyramid \
+ | riscv32 | riscv64 \
+ | rl78 | rx \
+ | score \
+ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+ | spu \
+ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+ | ubicom32 \
+ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+ | visium \
+ | wasm32 \
+ | x86 | xc16x | xstormy16 | xtensa \
+ | z8k | z80)
+ basic_machine=$basic_machine-unknown
+ ;;
+ c54x)
+ basic_machine=tic54x-unknown
+ ;;
+ c55x)
+ basic_machine=tic55x-unknown
+ ;;
+ c6x)
+ basic_machine=tic6x-unknown
+ ;;
+ leon|leon[3-9])
+ basic_machine=sparc-$basic_machine
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65)
+ ;;
+ m9s12z | m68hcs12z | hcs12z | s12z)
+ basic_machine=s12z-unknown
+ os=-none
+ ;;
+ ms1)
+ basic_machine=mt-unknown
+ ;;
+
+ strongarm | thumb | xscale)
+ basic_machine=arm-unknown
+ ;;
+ xgate)
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ xscaleeb)
+ basic_machine=armeb-unknown
+ ;;
+
+ xscaleel)
+ basic_machine=armel-unknown
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ 580-* \
+ | a29k-* \
+ | aarch64-* | aarch64_be-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* | avr32-* \
+ | ba-* \
+ | be32-* | be64-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* \
+ | c8051-* | clipper-* | craynv-* | csky-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | e2k-* | elxsi-* \
+ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | hexagon-* \
+ | i*86-* | i860-* | i960-* | ia16-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | k1om-* \
+ | le32-* | le64-* \
+ | lm32-* \
+ | m32c-* | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
+ | microblaze-* | microblazeel-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64octeon-* | mips64octeonel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64r5900-* | mips64r5900el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa32r6-* | mipsisa32r6el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64r6-* | mipsisa64r6el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipsr5900-* | mipsr5900el-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | mt-* \
+ | msp430-* \
+ | nds32-* | nds32le-* | nds32be-* \
+ | nios-* | nios2-* | nios2eb-* | nios2el-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | open8-* \
+ | or1k*-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+ | pru-* \
+ | pyramid-* \
+ | riscv32-* | riscv64-* \
+ | rl78-* | romp-* | rs6000-* | rx-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
+ | tahoe-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tile*-* \
+ | tron-* \
+ | ubicom32-* \
+ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+ | vax-* \
+ | visium-* \
+ | wasm32-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xc16x-* | xps100-* \
+ | xstormy16-* | xtensa*-* \
+ | ymp-* \
+ | z8k-* | z80-*)
+ ;;
+ # Recognize the basic CPU types without company name, with glob match.
+ xtensa*)
+ basic_machine=$basic_machine-unknown
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-pc
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ abacus)
+ basic_machine=abacus-unknown
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amd64)
+ basic_machine=x86_64-pc
+ ;;
+ amd64-*)
+ basic_machine=x86_64-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-unknown
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aros)
+ basic_machine=i386-pc
+ os=-aros
+ ;;
+ asmjs)
+ basic_machine=asmjs-unknown
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ blackfin)
+ basic_machine=bfin-unknown
+ os=-linux
+ ;;
+ blackfin-*)
+ basic_machine=bfin-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ bluegene*)
+ basic_machine=powerpc-ibm
+ os=-cnk
+ ;;
+ c54x-*)
+ basic_machine=tic54x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ c55x-*)
+ basic_machine=tic55x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ c6x-*)
+ basic_machine=tic6x-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ cegcc)
+ basic_machine=arm-unknown
+ os=-cegcc
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | j90)
+ basic_machine=j90-cray
+ os=-unicos
+ ;;
+ craynv)
+ basic_machine=craynv-cray
+ os=-unicosmp
+ ;;
+ cr16 | cr16-*)
+ basic_machine=cr16-unknown
+ os=-elf
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ crisv32 | crisv32-* | etraxfs*)
+ basic_machine=crisv32-axis
+ ;;
+ cris | cris-* | etrax*)
+ basic_machine=cris-axis
+ ;;
+ crx)
+ basic_machine=crx-unknown
+ os=-elf
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ decsystem10* | dec10*)
+ basic_machine=pdp10-dec
+ os=-tops10
+ ;;
+ decsystem20* | dec20*)
+ basic_machine=pdp10-dec
+ os=-tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ dicos)
+ basic_machine=i686-pc
+ os=-dicos
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ os=-msdosdjgpp
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2*)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ e500v[12])
+ basic_machine=powerpc-unknown
+ os=$os"spe"
+ ;;
+ e500v[12]-*)
+ basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ os=$os"spe"
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ os=-go32
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+ i*86v32)
+ basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i*86v4*)
+ basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i*86v)
+ basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i*86sol2)
+ basic_machine=`echo "$1" | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ leon-*|leon[3-9]-*)
+ basic_machine=sparc-`echo "$basic_machine" | sed 's/-.*//'`
+ ;;
+ m68knommu)
+ basic_machine=m68k-unknown
+ os=-linux
+ ;;
+ m68knommu-*)
+ basic_machine=m68k-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ microblaze*)
+ basic_machine=microblaze-xilinx
+ ;;
+ mingw64)
+ basic_machine=x86_64-pc
+ os=-mingw64
+ ;;
+ mingw32)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ os=-mingw32ce
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mips3*-*)
+ basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo "$basic_machine" | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ os=-morphos
+ ;;
+ moxiebox)
+ basic_machine=moxie-unknown
+ os=-moxiebox
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ os=-msdos
+ ;;
+ ms1-*)
+ basic_machine=`echo "$basic_machine" | sed -e 's/ms1-/mt-/'`
+ ;;
+ msys)
+ basic_machine=i686-pc
+ os=-msys
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ nacl)
+ basic_machine=le32-unknown
+ os=-nacl
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next)
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ os=-nonstopux
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ neo-tandem)
+ basic_machine=neo-tandem
+ ;;
+ nse-tandem)
+ basic_machine=nse-tandem
+ ;;
+ nsr-tandem)
+ basic_machine=nsr-tandem
+ ;;
+ nsv-tandem)
+ basic_machine=nsv-tandem
+ ;;
+ nsx-tandem)
+ basic_machine=nsx-tandem
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ openrisc | openrisc-*)
+ basic_machine=or32-unknown
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ os=-os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ parisc)
+ basic_machine=hppa-unknown
+ os=-linux
+ ;;
+ parisc-*)
+ basic_machine=hppa-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ os=-linux
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pc98)
+ basic_machine=i386-pc
+ ;;
+ pc98-*)
+ basic_machine=i386-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ pentium | p5 | k5 | k6 | nexgen | viac3)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86 | athlon | athlon_*)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2 | pentiumiii | pentium3)
+ basic_machine=i686-pc
+ ;;
+ pentium4)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ basic_machine=i586-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-*)
+ basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ basic_machine=i686-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ pentium4-*)
+ basic_machine=i786-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=power-ibm
+ ;;
+ ppc | ppcbe) basic_machine=powerpc-unknown
+ ;;
+ ppc-* | ppcbe-*)
+ basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ ppc64) basic_machine=powerpc64-unknown
+ ;;
+ ppc64-*) basic_machine=powerpc64-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ ppc64le | powerpc64little)
+ basic_machine=powerpc64le-unknown
+ ;;
+ ppc64le-* | powerpc64little-*)
+ basic_machine=powerpc64le-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ os=-pw32
+ ;;
+ rdos | rdos64)
+ basic_machine=x86_64-pc
+ os=-rdos
+ ;;
+ rdos32)
+ basic_machine=i386-pc
+ os=-rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ s390 | s390-*)
+ basic_machine=s390-ibm
+ ;;
+ s390x | s390x-*)
+ basic_machine=s390x-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sb1)
+ basic_machine=mipsisa64sb1-unknown
+ ;;
+ sb1el)
+ basic_machine=mipsisa64sb1el-unknown
+ ;;
+ sde)
+ basic_machine=mipsisa32-sde
+ os=-elf
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh5el)
+ basic_machine=sh5le-unknown
+ ;;
+ simso-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ strongarm-* | thumb-*)
+ basic_machine=arm-`echo "$basic_machine" | sed 's/^[^-]*-//'`
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ os=-unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ os=-unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ os=-unicos
+ ;;
+ tile*)
+ basic_machine=$basic_machine-unknown
+ os=-linux-gnu
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ os=-tops20
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ os=-tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ x64)
+ basic_machine=x86_64-pc
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ os=-mingw32
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ xscale-* | xscalee[bl]-*)
+ basic_machine=`echo "$basic_machine" | sed 's/^xscale/arm/'`
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ mmix)
+ basic_machine=mmix-knuth
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+ basic_machine=sh-unknown
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ *-unknown)
+ # Make sure to match an already-canonicalized machine name.
+ ;;
+ *)
+ echo Invalid configuration \`"$1"\': machine \`"$basic_machine"\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo "$basic_machine" | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo "$basic_machine" | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases that might get confused
+ # with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -auroraux)
+ os=-auroraux
+ ;;
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # es1800 is here to avoid being matched by es* (a different OS)
+ -es1800*)
+ os=-ose
+ ;;
+ # Now accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST end in a * to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+ | -sym* | -kopensolaris* | -plan9* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* | -aros* | -cloudabi* | -sortix* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \
+ | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
+ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* | -hcos* \
+ | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \
+ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+ | -linux-newlib* | -linux-musl* | -linux-uclibc* \
+ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
+ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \
+ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+ | -morphos* | -superux* | -rtmk* | -windiss* \
+ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
+ | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \
+ | -midnightbsd*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -qnx*)
+ case $basic_machine in
+ x86-* | i*86-*)
+ ;;
+ *)
+ os=-nto$os
+ ;;
+ esac
+ ;;
+ -nto-qnx*)
+ ;;
+ -nto*)
+ os=`echo $os | sed -e 's|nto|nto-qnx|'`
+ ;;
+ -sim | -xray | -os68k* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* \
+ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo "$os" | sed -e 's|mac|macos|'`
+ ;;
+ -linux-dietlibc)
+ os=-linux-dietlibc
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -os400*)
+ os=-os400
+ ;;
+ -wince*)
+ os=-wince
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -atheos*)
+ os=-atheos
+ ;;
+ -syllable*)
+ os=-syllable
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -nova*)
+ os=-rtmk-nova
+ ;;
+ -ns2)
+ os=-nextstep2
+ ;;
+ -nsk*)
+ os=-nsk
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -tpf*)
+ os=-tpf
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ os=-mint
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -dicos*)
+ os=-dicos
+ ;;
+ -pikeos*)
+ # Until real need of OS specific support for
+ # particular features comes up, bare metal
+ # configurations are quite functional.
+ case $basic_machine in
+ arm*)
+ os=-eabi
+ ;;
+ *)
+ os=-elf
+ ;;
+ esac
+ ;;
+ -nacl*)
+ ;;
+ -ios)
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ score-*)
+ os=-elf
+ ;;
+ spu-*)
+ os=-elf
+ ;;
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ os=-coff
+ ;;
+ c8051-*)
+ os=-elf
+ ;;
+ hexagon-*)
+ os=-elf
+ ;;
+ tic54x-*)
+ os=-coff
+ ;;
+ tic55x-*)
+ os=-coff
+ ;;
+ tic6x-*)
+ os=-coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=-tops20
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mep-*)
+ os=-elf
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ or32-*)
+ os=-coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ pru-*)
+ os=-elf
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-knuth)
+ os=-mmixware
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next)
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -cnk*|-aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -os400*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -tpf*)
+ vendor=ibm
+ ;;
+ -vxsim* | -vxworks* | -windiss*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+ vendor=atari
+ ;;
+ -vos*)
+ vendor=stratus
+ ;;
+ esac
+ basic_machine=`echo "$basic_machine" | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo "$basic_machine$os"
+exit
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/sdk/recipes/files/openssl/m68k-unknown-amigaos/crypto/rand/rand_amiga.c b/sdk/recipes/files/openssl/m68k-unknown-amigaos/crypto/rand/rand_amiga.c
deleted file mode 100644
index 3c18b7d..0000000
--- a/sdk/recipes/files/openssl/m68k-unknown-amigaos/crypto/rand/rand_amiga.c
+++ /dev/null
@@ -1,189 +0,0 @@
-#include <openssl/rand.h>
-#include <openssl/sha.h>
-#include "rand_lcl.h"
-
-#if defined(OPENSSL_SYS_AMIGAOS3) || defined(OPENSSL_SYS_AMIGAOS4)
-#define __USE_INLINE__ 1
-
-#include <proto/exec.h>
-#include <proto/timer.h>
-#include <devices/timer.h>
-
-/* Maximum number of attempts to get a delay of 1 microsecond that is not equal to 0 */
-#define MAX_ATTEMPTS 1000
-
-#ifdef __amigaos4__
-
-#ifdef CreateMsgPort
-#undef CreateMsgPort
-#endif
-#define CreateMsgPort() AllocSysObject(ASOT_PORT,NULL)
-#ifdef DeleteMsgPort
-#undef DeleteMsgPort
-#endif
-#define DeleteMsgPort(msgPort) FreeSysObject(ASOT_PORT,msgPort)
-#ifdef CreateIORequest
-#undef CreateIORequest
-#endif
-#define CreateIORequest(ioReplyPort,size) AllocSysObjectTags(ASOT_IOREQUEST,ASOIOR_ReplyPort,ioReplyPort,ASOIOR_Size,size,TAG_DONE)
-#ifdef DeleteIORequest
-#undef DeleteIORequest
-#endif
-#define DeleteIORequest(ioReq) FreeSysObject(ASOT_IOREQUEST,ioReq)
-
-#else
-
-#define GetInterface(a, b, c, d) 1
-#define DropInterface(x)
-
-/* OS3 has a different but compatible TimeVal definition */
-struct TimeVal
-{
- ULONG Seconds;
- ULONG Microseconds;
-};
-
-/* ...and ditto for TimeRequest */
-struct TimeRequest
-{
- struct IORequest Request;
- struct TimeVal Time;
-};
-
-#endif /* !__amigaos4__ */
-
-int RAND_poll(void)
-{
- unsigned char temp_buffer[SHA_DIGEST_LENGTH], data_buffer[SHA_DIGEST_LENGTH];
- struct MsgPort *port = NULL;
- double entropy_added = 0;
- struct TimeRequest *time_request = NULL;
-#ifdef __amigaos4__
- struct IOStdReq *entropy_request = NULL;
-
- if ((port = CreateMsgPort())
- && (entropy_request = (struct IOStdReq *)CreateIORequest(port, sizeof(*entropy_request))))
- {
- if (OpenDevice(TIMERNAME, UNIT_ENTROPY, (struct IORequest *)entropy_request, 0) == 0)
- {
- while(entropy_added < ENTROPY_NEEDED)
- {
- entropy_request->io_Command = TR_READENTROPY;
- entropy_request->io_Data = &temp_buffer[0];
- entropy_request->io_Length = sizeof(temp_buffer);
-
- if (DoIO((struct IORequest *)entropy_request) == 0)
- {
- SHA1(&temp_buffer[0], sizeof(temp_buffer), &data_buffer[0]);
- RAND_add(&data_buffer[0], sizeof(data_buffer), sizeof(data_buffer));
- entropy_added += sizeof(data_buffer);
- }
- else
- break;
- }
-
- CloseDevice((struct IORequest *)entropy_request);
- }
- }
-
- DeleteIORequest((struct IORequest *)entropy_request);
-#endif /* __amigaos4__ */
-
- /* The following block will be used on "classic" machines. It does not generate
- * a high degree of randomness, but it does the job since RAND_poll is
- * called only once by OpenSSL to generate a 32 byte seed.
- */
- if (entropy_added < ENTROPY_NEEDED
- && (port || (port = CreateMsgPort()))
- && (time_request = (struct TimeRequest *)CreateIORequest(port, sizeof(*time_request))))
- {
- if (OpenDevice(TIMERNAME, UNIT_VBLANK, (struct IORequest *)time_request, 0) == 0)
- {
- #if defined(__amigaos4__)
- struct TimerIFace *ITimer = NULL;
- #endif
- struct Device *TimerBase;
-
- if ((TimerBase = time_request->Request.io_Device)
- #if defined(__amigaos4__)
- && (ITimer = (struct TimerIFace *)GetInterface((struct Library *)TimerBase, "main", 1, NULL))
- #endif
- )
- {
- struct EClockVal curr_eclock;
- ULONG prev_ev_lo = 0;
- struct TimeVal tv;
- int i, attempt;
- BOOL aborted;
-
- ReadEClock(&curr_eclock);
- aborted = FALSE;
-
- while(!aborted && entropy_added < ENTROPY_NEEDED)
- {
- for(i = 0;
- !aborted && i < (int)sizeof(temp_buffer) - (int)sizeof(ULONG);
- i++)
- {
- attempt = 0;
-
- /* Ask for a one microsecond delay and measure the time
- * the delay actually took.
- */
- do
- {
- time_request->Request.io_Command = TR_ADDREQUEST;
- time_request->Time.Seconds = 0;
- time_request->Time.Microseconds = 1;
-
- if (DoIO((struct IORequest *)time_request) == 0)
- {
- prev_ev_lo = curr_eclock.ev_lo;
- ReadEClock(&curr_eclock);
-
- attempt++;
- }
- else
- aborted = TRUE;
- } while(!aborted && prev_ev_lo == 0 && attempt < MAX_ATTEMPTS);
-
- if (attempt >= MAX_ATTEMPTS)
- aborted = TRUE;
-
- /* Since we are going for randomness, ev_hi is irrelevant */
- temp_buffer[i] = (unsigned char)(curr_eclock.ev_lo - prev_ev_lo);
- }
-
- GetSysTime(&tv);
-
- if (sizeof(temp_buffer) > sizeof(ULONG))
- *(ULONG *)&temp_buffer[sizeof(temp_buffer) - sizeof(ULONG)]
- = tv.Microseconds;
-
- /* Shuffle the bits around and specify that about
- * one fourth of it adds to the entropy.
- */
- if (!aborted)
- {
- SHA1(&temp_buffer[0], sizeof(temp_buffer), &data_buffer[0]);
- RAND_add(&data_buffer[0], sizeof(data_buffer), (double)sizeof(data_buffer) / 4);
- entropy_added += sizeof(data_buffer) / 4;
- }
- }
- }
-
- #if defined(__amigaos4__)
- DropInterface((struct Interface *)ITimer);
- #endif
- CloseDevice((struct IORequest *)time_request);
- }
- }
-
- DeleteIORequest((struct IORequest *)time_request);
-
- DeleteMsgPort(port);
-
- return(entropy_added >= ENTROPY_NEEDED);
-}
-
-#endif /* OPENSSL_SYS_AMIGA */
diff --git a/sdk/recipes/files/openssl/m68k-unknown-amigaos/providers/implementations/rands/seeding/rand_amiga.c b/sdk/recipes/files/openssl/m68k-unknown-amigaos/providers/implementations/rands/seeding/rand_amiga.c
new file mode 100644
index 0000000..205d527
--- /dev/null
+++ b/sdk/recipes/files/openssl/m68k-unknown-amigaos/providers/implementations/rands/seeding/rand_amiga.c
@@ -0,0 +1,282 @@
+#include "internal/cryptlib.h"
+#include <openssl/rand.h>
+#include <openssl/sha.h>
+#include "crypto/rand_pool.h"
+#include "crypto/rand.h"
+#include "prov/seeding.h"
+
+#if defined(OPENSSL_SYS_AMIGAOS3) || defined(OPENSSL_SYS_AMIGAOS4)
+
+# ifndef OPENSSL_RAND_SEED_OS
+# error "Unsupported seeding method configured; must be os"
+# endif
+
+#define __USE_INLINE__ 1
+
+#include <sys/types.h>
+#include <time.h>
+#include <unistd.h>
+
+#include <proto/exec.h>
+#include <proto/timer.h>
+#include <devices/timer.h>
+
+/* Maximum number of attempts to get a delay of 1 microsecond that is not equal to 0 */
+#define MAX_ATTEMPTS 1000
+
+#ifdef __amigaos4__
+
+#ifdef CreateMsgPort
+#undef CreateMsgPort
+#endif
+#define CreateMsgPort() AllocSysObject(ASOT_PORT,NULL)
+#ifdef DeleteMsgPort
+#undef DeleteMsgPort
+#endif
+#define DeleteMsgPort(msgPort) FreeSysObject(ASOT_PORT,msgPort)
+#ifdef CreateIORequest
+#undef CreateIORequest
+#endif
+#define CreateIORequest(ioReplyPort,size) AllocSysObjectTags(ASOT_IOREQUEST,ASOIOR_ReplyPort,ioReplyPort,ASOIOR_Size,size,TAG_DONE)
+#ifdef DeleteIORequest
+#undef DeleteIORequest
+#endif
+#define DeleteIORequest(ioReq) FreeSysObject(ASOT_IOREQUEST,ioReq)
+
+#else
+
+#define GetInterface(a, b, c, d) 1
+#define DropInterface(x)
+
+/* OS3 has a different but compatible TimeVal definition */
+struct TimeVal
+{
+ ULONG Seconds;
+ ULONG Microseconds;
+};
+
+/* ... and ditto for TimeRequest */
+struct TimeRequest
+{
+ struct IORequest Request;
+ struct TimeVal Time;
+};
+
+#endif /* !__amigaos4__ */
+
+size_t ossl_pool_acquire_entropy(RAND_POOL *pool)
+{
+ unsigned char temp_buffer[SHA_DIGEST_LENGTH], data_buffer[SHA_DIGEST_LENGTH];
+ struct MsgPort *port = NULL;
+ size_t bytes_needed;
+ size_t entropy_available = 0;
+ struct TimeRequest *time_request = NULL;
+#ifdef __amigaos4__
+ struct IOStdReq *entropy_request = NULL;
+
+ bytes_needed = ossl_rand_pool_bytes_needed(pool, 1);
+
+ if ((port = CreateMsgPort())
+ && (entropy_request = (struct IOStdReq *)CreateIORequest(port, sizeof(*entropy_request))))
+ {
+ if (OpenDevice(TIMERNAME, UNIT_ENTROPY, (struct IORequest *)entropy_request, 0) == 0)
+ {
+ while(bytes_needed > 0)
+ {
+ entropy_request->io_Command = TR_READENTROPY;
+ entropy_request->io_Data = &temp_buffer[0];
+ entropy_request->io_Length = sizeof(temp_buffer);
+
+ if (DoIO((struct IORequest *)entropy_request) == 0)
+ {
+ unsigned char *buffer;
+ size_t bytes = (bytes_needed < sizeof(data_buffer) ? bytes_needed : sizeof(data_buffer));
+
+ buffer = ossl_rand_pool_add_begin(pool, bytes_needed);
+ SHA1(&temp_buffer[0], sizeof(temp_buffer), &data_buffer[0]);
+ memcpy(buffer, data_buffer, bytes);
+ ossl_rand_pool_add_end(pool, bytes, 8 * bytes);
+ bytes_needed -= bytes;
+ }
+ else
+ break;
+ }
+
+ CloseDevice((struct IORequest *)entropy_request);
+ }
+ }
+
+ DeleteIORequest((struct IORequest *)entropy_request);
+
+ entropy_available = ossl_rand_pool_entropy_available(pool);
+ if (entropy_available > 0)
+ return entropy_available;
+#endif /* __amigaos4__ */
+
+ /* The following block will be used on "classic" machines. It does not generate
+ * a high degree of randomness, but it does the job since RAND_poll is
+ * called only once by OpenSSL to generate a 32 byte seed.
+ */
+
+ bytes_needed = ossl_rand_pool_bytes_needed(pool, 1);
+
+ if (bytes_needed > 0
+ && (port || (port = CreateMsgPort()))
+ && (time_request = (struct TimeRequest *)CreateIORequest(port, sizeof(*time_request))))
+ {
+ if (OpenDevice(TIMERNAME, UNIT_VBLANK, (struct IORequest *)time_request, 0) == 0)
+ {
+ #if defined(__amigaos4__)
+ struct TimerIFace *ITimer = NULL;
+ #endif
+ struct Device *TimerBase;
+
+ if ((TimerBase = time_request->Request.io_Device)
+ #if defined(__amigaos4__)
+ && (ITimer = (struct TimerIFace *)GetInterface((struct Library *)TimerBase, "main", 1, NULL))
+ #endif
+ )
+ {
+ struct EClockVal curr_eclock;
+ ULONG prev_ev_lo = 0;
+ struct TimeVal tv;
+ int i, attempt;
+ BOOL aborted;
+
+ ReadEClock(&curr_eclock);
+ aborted = FALSE;
+
+ while(!aborted && bytes_needed > 0)
+ {
+ for(i = 0;
+ !aborted && i < (int)sizeof(temp_buffer) - (int)sizeof(ULONG);
+ i++)
+ {
+ attempt = 0;
+
+ /* Ask for a one microsecond delay and measure the time
+ * the delay actually took.
+ */
+ do
+ {
+ time_request->Request.io_Command = TR_ADDREQUEST;
+ time_request->Time.Seconds = 0;
+ time_request->Time.Microseconds = 1;
+
+ if (DoIO((struct IORequest *)time_request) == 0)
+ {
+ prev_ev_lo = curr_eclock.ev_lo;
+ ReadEClock(&curr_eclock);
+
+ attempt++;
+ }
+ else
+ aborted = TRUE;
+ } while(!aborted && prev_ev_lo == 0 && attempt < MAX_ATTEMPTS);
+
+ if (attempt >= MAX_ATTEMPTS)
+ aborted = TRUE;
+
+ /* Since we are going for randomness, ev_hi is irrelevant */
+ temp_buffer[i] = (unsigned char)(curr_eclock.ev_lo - prev_ev_lo);
+ }
+
+ GetSysTime(&tv);
+
+ if (sizeof(temp_buffer) > sizeof(ULONG))
+ *(ULONG *)&temp_buffer[sizeof(temp_buffer) - sizeof(ULONG)]
+ = tv.Microseconds;
+
+ /* Shuffle the bits around and specify that about
+ * one fourth of it adds to the entropy.
+ */
+ if (!aborted)
+ {
+ unsigned char *buffer;
+ size_t bytes = (bytes_needed < sizeof(data_buffer) ? bytes_needed : sizeof(data_buffer));
+
+ SHA1(&temp_buffer[0], sizeof(temp_buffer), &data_buffer[0]);
+
+ ossl_rand_pool_add_end(pool, bytes, (sizeof(data_buffer) / 4) * 8);
+ bytes_needed -= bytes;
+ }
+ }
+ }
+
+ #if defined(__amigaos4__)
+ DropInterface((struct Interface *)ITimer);
+ #endif
+ CloseDevice((struct IORequest *)time_request);
+ }
+ }
+
+ DeleteIORequest((struct IORequest *)time_request);
+
+ DeleteMsgPort(port);
+
+ return ossl_rand_pool_entropy_available(pool);
+}
+
+int ossl_pool_add_nonce_data(RAND_POOL *pool)
+{
+ struct {
+ pid_t pid;
+ CRYPTO_THREAD_ID tid;
+ uint64_t time;
+ } data;
+
+ /* Erase the entire structure including any padding */
+ memset(&data, 0, sizeof(data));
+
+ /*
+ * Add process id, thread id, and a high resolution timestamp to
+ * ensure that the nonce is unique with high probability for
+ * different process instances.
+ */
+ data.pid = getpid();
+ data.tid = CRYPTO_THREAD_get_current_id();
+ /*XXX: can this be improved? */
+ data.time = time(NULL);
+
+ return ossl_rand_pool_add(pool, (unsigned char *)&data, sizeof(data), 0);
+}
+
+int ossl_rand_pool_add_additional_data(RAND_POOL *pool)
+{
+ struct {
+ int fork_id;
+ CRYPTO_THREAD_ID tid;
+ uint64_t time;
+ } data;
+
+ /* Erase the entire structure including any padding */
+ memset(&data, 0, sizeof(data));
+
+ /*
+ * Add some noise from the thread id and a high resolution timer.
+ * The fork_id adds some extra fork-safety.
+ * The thread id adds a little randomness if the drbg is accessed
+ * concurrently (which is the case for the <master> drbg).
+ */
+ data.fork_id = openssl_get_fork_id();
+ data.tid = CRYPTO_THREAD_get_current_id();
+ /*XXX: can this be improved? */
+ data.time = (uint64_t) time(NULL);
+
+ return ossl_rand_pool_add(pool, (unsigned char *)&data, sizeof(data), 0);
+}
+
+int ossl_rand_pool_init(void)
+{
+ return 1;
+}
+
+void ossl_rand_pool_cleanup(void)
+{
+}
+
+void ossl_rand_pool_keep_random_devices_open(int keep)
+{
+}
+
+#endif /* OPENSSL_SYS_AMIGA */
diff --git a/sdk/recipes/files/openssl/ppc-amigaos/crypto/rand/rand_amiga.c b/sdk/recipes/files/openssl/ppc-amigaos/crypto/rand/rand_amiga.c
deleted file mode 100644
index cd3f236..0000000
--- a/sdk/recipes/files/openssl/ppc-amigaos/crypto/rand/rand_amiga.c
+++ /dev/null
@@ -1,182 +0,0 @@
-#include <openssl/rand.h>
-#include <openssl/sha.h>
-#include "rand_lcl.h"
-
-#if defined(OPENSSL_SYS_AMIGAOS3) || defined(OPENSSL_SYS_AMIGAOS4)
-#define __USE_INLINE__ 1
-
-#include <proto/exec.h>
-#include <proto/timer.h>
-#include <devices/timer.h>
-
-/* Maximum number of attempts to get a delay of 1 microsecond that is not equal to 0 */
-#define MAX_ATTEMPTS 1000
-
-#ifdef __amigaos4__
-
-#ifdef CreateMsgPort
-#undef CreateMsgPort
-#endif
-#define CreateMsgPort() AllocSysObject(ASOT_PORT,NULL)
-#ifdef DeleteMsgPort
-#undef DeleteMsgPort
-#endif
-#define DeleteMsgPort(msgPort) FreeSysObject(ASOT_PORT,msgPort)
-#ifdef CreateIORequest
-#undef CreateIORequest
-#endif
-#define CreateIORequest(ioReplyPort,size) AllocSysObjectTags(ASOT_IOREQUEST,ASOIOR_ReplyPort,ioReplyPort,ASOIOR_Size,size,TAG_DONE)
-#ifdef DeleteIORequest
-#undef DeleteIORequest
-#endif
-#define DeleteIORequest(ioReq) FreeSysObject(ASOT_IOREQUEST,ioReq)
-
-#else
-
-#define GetInterface(a, b, c, d) 1
-#define DropInterface(x)
-
-/* OS3 has a different but compatible TimeVal definition */
-struct TimeVal
-{
- uint32 Seconds;
- uint32 Microseconds;
-};
-
-#endif /* !__amigaos4__ */
-
-int RAND_poll(void)
-{
- unsigned char temp_buffer[SHA_DIGEST_LENGTH], data_buffer[SHA_DIGEST_LENGTH];
- struct MsgPort *port = NULL;
- double entropy_added = 0;
- struct TimeRequest *time_request = NULL;
-#ifdef __amigaos4__
- struct IOStdReq *entropy_request = NULL;
-
- if ((port = CreateMsgPort())
- && (entropy_request = (struct IOStdReq *)CreateIORequest(port, sizeof(*entropy_request))))
- {
- if (OpenDevice(TIMERNAME, UNIT_ENTROPY, (struct IORequest *)entropy_request, 0) == 0)
- {
- while(entropy_added < ENTROPY_NEEDED)
- {
- entropy_request->io_Command = TR_READENTROPY;
- entropy_request->io_Data = &temp_buffer[0];
- entropy_request->io_Length = sizeof(temp_buffer);
-
- if (DoIO((struct IORequest *)entropy_request) == 0)
- {
- SHA1(&temp_buffer[0], sizeof(temp_buffer), &data_buffer[0]);
- RAND_add(&data_buffer[0], sizeof(data_buffer), sizeof(data_buffer));
- entropy_added += sizeof(data_buffer);
- }
- else
- break;
- }
-
- CloseDevice((struct IORequest *)entropy_request);
- }
- }
-
- DeleteIORequest((struct IORequest *)entropy_request);
-#endif /* __amigaos4__ */
-
- /* The following block will be used on "classic" machines. It does not generate
- * a high degree of randomness, but it does the job since RAND_poll is
- * called only once by OpenSSL to generate a 32 byte seed.
- */
- if (entropy_added < ENTROPY_NEEDED
- && (port || (port = CreateMsgPort()))
- && (time_request = (struct TimeRequest *)CreateIORequest(port, sizeof(*time_request))))
- {
- if (OpenDevice(TIMERNAME, UNIT_VBLANK, (struct IORequest *)time_request, 0) == 0)
- {
- #if defined(__amigaos4__)
- struct TimerIFace *ITimer = NULL;
- #endif
- struct Device *TimerBase;
-
- if ((TimerBase = time_request->Request.io_Device)
- #if defined(__amigaos4__)
- && (ITimer = (struct TimerIFace *)GetInterface((struct Library *)TimerBase, "main", 1, NULL))
- #endif
- )
- {
- struct EClockVal curr_eclock;
- ULONG prev_ev_lo = 0;
- struct TimeVal tv;
- int i, attempt;
- BOOL aborted;
-
- ReadEClock(&curr_eclock);
- aborted = FALSE;
-
- while(!aborted && entropy_added < ENTROPY_NEEDED)
- {
- for(i = 0;
- !aborted && i < (int)sizeof(temp_buffer) - (int)sizeof(ULONG);
- i++)
- {
- attempt = 0;
-
- /* Ask for a one microsecond delay and measure the time
- * the delay actually took.
- */
- do
- {
- time_request->Request.io_Command = TR_ADDREQUEST;
- time_request->Time.Seconds = 0;
- time_request->Time.Microseconds = 1;
-
- if (DoIO((struct IORequest *)time_request) == 0)
- {
- prev_ev_lo = curr_eclock.ev_lo;
- ReadEClock(&curr_eclock);
-
- attempt++;
- }
- else
- aborted = TRUE;
- } while(!aborted && prev_ev_lo == 0 && attempt < MAX_ATTEMPTS);
-
- if (attempt >= MAX_ATTEMPTS)
- aborted = TRUE;
-
- /* Since we are going for randomness, ev_hi is irrelevant */
- temp_buffer[i] = (unsigned char)(curr_eclock.ev_lo - prev_ev_lo);
- }
-
- GetSysTime(&tv);
-
- if (sizeof(temp_buffer) > sizeof(ULONG))
- *(ULONG *)&temp_buffer[sizeof(temp_buffer) - sizeof(ULONG)]
- = tv.Microseconds;
-
- /* Shuffle the bits around and specify that about
- * one fourth of it adds to the entropy.
- */
- if (!aborted)
- {
- SHA1(&temp_buffer[0], sizeof(temp_buffer), &data_buffer[0]);
- RAND_add(&data_buffer[0], sizeof(data_buffer), (double)sizeof(data_buffer) / 4);
- entropy_added += sizeof(data_buffer) / 4;
- }
- }
- }
-
- #if defined(__amigaos4__)
- DropInterface((struct Interface *)ITimer);
- #endif
- CloseDevice((struct IORequest *)time_request);
- }
- }
-
- DeleteIORequest((struct IORequest *)time_request);
-
- DeleteMsgPort(port);
-
- return(entropy_added >= ENTROPY_NEEDED);
-}
-
-#endif /* OPENSSL_SYS_AMIGA */
diff --git a/sdk/recipes/files/openssl/ppc-amigaos/providers/implementations/rands/seeding/rand_amiga.c b/sdk/recipes/files/openssl/ppc-amigaos/providers/implementations/rands/seeding/rand_amiga.c
new file mode 100644
index 0000000..ed315ed
--- /dev/null
+++ b/sdk/recipes/files/openssl/ppc-amigaos/providers/implementations/rands/seeding/rand_amiga.c
@@ -0,0 +1,275 @@
+#include "internal/cryptlib.h"
+#include <openssl/rand.h>
+#include <openssl/sha.h>
+#include "crypto/rand_pool.h"
+#include "crypto/rand.h"
+#include "prov/seeding.h"
+
+#if defined(OPENSSL_SYS_AMIGAOS3) || defined(OPENSSL_SYS_AMIGAOS4)
+
+# ifndef OPENSSL_RAND_SEED_OS
+# error "Unsupported seeding method configured; must be os"
+# endif
+
+#define __USE_INLINE__ 1
+
+#include <sys/types.h>
+#include <time.h>
+#include <unistd.h>
+
+#include <proto/exec.h>
+#include <proto/timer.h>
+#include <devices/timer.h>
+
+/* Maximum number of attempts to get a delay of 1 microsecond that is not equal to 0 */
+#define MAX_ATTEMPTS 1000
+
+#ifdef __amigaos4__
+
+#ifdef CreateMsgPort
+#undef CreateMsgPort
+#endif
+#define CreateMsgPort() AllocSysObject(ASOT_PORT,NULL)
+#ifdef DeleteMsgPort
+#undef DeleteMsgPort
+#endif
+#define DeleteMsgPort(msgPort) FreeSysObject(ASOT_PORT,msgPort)
+#ifdef CreateIORequest
+#undef CreateIORequest
+#endif
+#define CreateIORequest(ioReplyPort,size) AllocSysObjectTags(ASOT_IOREQUEST,ASOIOR_ReplyPort,ioReplyPort,ASOIOR_Size,size,TAG_DONE)
+#ifdef DeleteIORequest
+#undef DeleteIORequest
+#endif
+#define DeleteIORequest(ioReq) FreeSysObject(ASOT_IOREQUEST,ioReq)
+
+#else
+
+#define GetInterface(a, b, c, d) 1
+#define DropInterface(x)
+
+/* OS3 has a different but compatible TimeVal definition */
+struct TimeVal
+{
+ uint32 Seconds;
+ uint32 Microseconds;
+};
+
+#endif /* !__amigaos4__ */
+
+size_t ossl_pool_acquire_entropy(RAND_POOL *pool)
+{
+ unsigned char temp_buffer[SHA_DIGEST_LENGTH], data_buffer[SHA_DIGEST_LENGTH];
+ struct MsgPort *port = NULL;
+ size_t bytes_needed;
+ size_t entropy_available = 0;
+ struct TimeRequest *time_request = NULL;
+#ifdef __amigaos4__
+ struct IOStdReq *entropy_request = NULL;
+
+ bytes_needed = ossl_rand_pool_bytes_needed(pool, 1);
+
+ if ((port = CreateMsgPort())
+ && (entropy_request = (struct IOStdReq *)CreateIORequest(port, sizeof(*entropy_request))))
+ {
+ if (OpenDevice(TIMERNAME, UNIT_ENTROPY, (struct IORequest *)entropy_request, 0) == 0)
+ {
+ while(bytes_needed > 0)
+ {
+ entropy_request->io_Command = TR_READENTROPY;
+ entropy_request->io_Data = &temp_buffer[0];
+ entropy_request->io_Length = sizeof(temp_buffer);
+
+ if (DoIO((struct IORequest *)entropy_request) == 0)
+ {
+ unsigned char *buffer;
+ size_t bytes = (bytes_needed < sizeof(data_buffer) ? bytes_needed : sizeof(data_buffer));
+
+ buffer = ossl_rand_pool_add_begin(pool, bytes_needed);
+ SHA1(&temp_buffer[0], sizeof(temp_buffer), &data_buffer[0]);
+ memcpy(buffer, data_buffer, bytes);
+ ossl_rand_pool_add_end(pool, bytes, 8 * bytes);
+ bytes_needed -= bytes;
+ }
+ else
+ break;
+ }
+
+ CloseDevice((struct IORequest *)entropy_request);
+ }
+ }
+
+ DeleteIORequest((struct IORequest *)entropy_request);
+
+ entropy_available = ossl_rand_pool_entropy_available(pool);
+ if (entropy_available > 0)
+ return entropy_available;
+#endif /* __amigaos4__ */
+
+ /* The following block will be used on "classic" machines. It does not generate
+ * a high degree of randomness, but it does the job since RAND_poll is
+ * called only once by OpenSSL to generate a 32 byte seed.
+ */
+
+ bytes_needed = ossl_rand_pool_bytes_needed(pool, 1);
+
+ if (bytes_needed > 0
+ && (port || (port = CreateMsgPort()))
+ && (time_request = (struct TimeRequest *)CreateIORequest(port, sizeof(*time_request))))
+ {
+ if (OpenDevice(TIMERNAME, UNIT_VBLANK, (struct IORequest *)time_request, 0) == 0)
+ {
+ #if defined(__amigaos4__)
+ struct TimerIFace *ITimer = NULL;
+ #endif
+ struct Device *TimerBase;
+
+ if ((TimerBase = time_request->Request.io_Device)
+ #if defined(__amigaos4__)
+ && (ITimer = (struct TimerIFace *)GetInterface((struct Library *)TimerBase, "main", 1, NULL))
+ #endif
+ )
+ {
+ struct EClockVal curr_eclock;
+ ULONG prev_ev_lo = 0;
+ struct TimeVal tv;
+ int i, attempt;
+ BOOL aborted;
+
+ ReadEClock(&curr_eclock);
+ aborted = FALSE;
+
+ while(!aborted && bytes_needed > 0)
+ {
+ for(i = 0;
+ !aborted && i < (int)sizeof(temp_buffer) - (int)sizeof(ULONG);
+ i++)
+ {
+ attempt = 0;
+
+ /* Ask for a one microsecond delay and measure the time
+ * the delay actually took.
+ */
+ do
+ {
+ time_request->Request.io_Command = TR_ADDREQUEST;
+ time_request->Time.Seconds = 0;
+ time_request->Time.Microseconds = 1;
+
+ if (DoIO((struct IORequest *)time_request) == 0)
+ {
+ prev_ev_lo = curr_eclock.ev_lo;
+ ReadEClock(&curr_eclock);
+
+ attempt++;
+ }
+ else
+ aborted = TRUE;
+ } while(!aborted && prev_ev_lo == 0 && attempt < MAX_ATTEMPTS);
+
+ if (attempt >= MAX_ATTEMPTS)
+ aborted = TRUE;
+
+ /* Since we are going for randomness, ev_hi is irrelevant */
+ temp_buffer[i] = (unsigned char)(curr_eclock.ev_lo - prev_ev_lo);
+ }
+
+ GetSysTime(&tv);
+
+ if (sizeof(temp_buffer) > sizeof(ULONG))
+ *(ULONG *)&temp_buffer[sizeof(temp_buffer) - sizeof(ULONG)]
+ = tv.Microseconds;
+
+ /* Shuffle the bits around and specify that about
+ * one fourth of it adds to the entropy.
+ */
+ if (!aborted)
+ {
+ unsigned char *buffer;
+ size_t bytes = (bytes_needed < sizeof(data_buffer) ? bytes_needed : sizeof(data_buffer));
+
+ SHA1(&temp_buffer[0], sizeof(temp_buffer), &data_buffer[0]);
+
+ ossl_rand_pool_add_end(pool, bytes, (sizeof(data_buffer) / 4) * 8);
+ bytes_needed -= bytes;
+ }
+ }
+ }
+
+ #if defined(__amigaos4__)
+ DropInterface((struct Interface *)ITimer);
+ #endif
+ CloseDevice((struct IORequest *)time_request);
+ }
+ }
+
+ DeleteIORequest((struct IORequest *)time_request);
+
+ DeleteMsgPort(port);
+
+ return ossl_rand_pool_entropy_available(pool);
+}
+
+int ossl_pool_add_nonce_data(RAND_POOL *pool)
+{
+ struct {
+ pid_t pid;
+ CRYPTO_THREAD_ID tid;
+ uint64_t time;
+ } data;
+
+ /* Erase the entire structure including any padding */
+ memset(&data, 0, sizeof(data));
+
+ /*
+ * Add process id, thread id, and a high resolution timestamp to
+ * ensure that the nonce is unique with high probability for
+ * different process instances.
+ */
+ data.pid = getpid();
+ data.tid = CRYPTO_THREAD_get_current_id();
+ /*XXX: can this be improved? */
+ data.time = time(NULL);
+
+ return ossl_rand_pool_add(pool, (unsigned char *)&data, sizeof(data), 0);
+}
+
+int ossl_rand_pool_add_additional_data(RAND_POOL *pool)
+{
+ struct {
+ int fork_id;
+ CRYPTO_THREAD_ID tid;
+ uint64_t time;
+ } data;
+
+ /* Erase the entire structure including any padding */
+ memset(&data, 0, sizeof(data));
+
+ /*
+ * Add some noise from the thread id and a high resolution timer.
+ * The fork_id adds some extra fork-safety.
+ * The thread id adds a little randomness if the drbg is accessed
+ * concurrently (which is the case for the <master> drbg).
+ */
+ data.fork_id = openssl_get_fork_id();
+ data.tid = CRYPTO_THREAD_get_current_id();
+ /*XXX: can this be improved? */
+ data.time = (uint64_t) time(NULL);
+
+ return ossl_rand_pool_add(pool, (unsigned char *)&data, sizeof(data), 0);
+}
+
+int ossl_rand_pool_init(void)
+{
+ return 1;
+}
+
+void ossl_rand_pool_cleanup(void)
+{
+}
+
+void ossl_rand_pool_keep_random_devices_open(int keep)
+{
+}
+
+#endif /* OPENSSL_SYS_AMIGA */
diff --git a/sdk/recipes/patches/libcares/m5475-atari-mint/config.sub.p b/sdk/recipes/patches/libcares/m5475-atari-mint/config.sub.p
new file mode 100644
index 0000000..a681d0a
--- /dev/null
+++ b/sdk/recipes/patches/libcares/m5475-atari-mint/config.sub.p
@@ -0,0 +1,11 @@
+--- config.sub.orig 2023-10-01 08:53:00.740777146 +0100
++++ config.sub 2023-10-01 08:59:22.657161841 +0100
+@@ -1209,7 +1209,7 @@
+ | lm32 \
+ | loongarch32 | loongarch64 | loongarchx32 \
+ | m32c | m32r | m32rle \
+- | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
++ | m5200 | m5475 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+ | m88110 | m88k | maxq | mb | mcore | mep | metag \
+ | microblaze | microblazeel \
diff --git a/sdk/recipes/patches/libcares/m68k-atari-mint/configure.p b/sdk/recipes/patches/libcares/m68k-atari-mint/configure.p
deleted file mode 100644
index 254a483..0000000
--- a/sdk/recipes/patches/libcares/m68k-atari-mint/configure.p
+++ /dev/null
@@ -1,11 +0,0 @@
---- configure.orig 2011-03-08 23:18:37.000000000 +0000
-+++ configure 2011-03-08 23:18:59.000000000 +0000
-@@ -18503,8 +18503,6 @@
- stdbool.h \
- time.h \
- limits.h \
-- arpa/nameser.h \
-- arpa/nameser_compat.h \
- arpa/inet.h
- do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
diff --git a/sdk/recipes/patches/libcares/m68k-unknown-amigaos/ipv6-support.p b/sdk/recipes/patches/libcares/m68k-unknown-amigaos/ipv6-support.p
new file mode 100644
index 0000000..ce60c44
--- /dev/null
+++ b/sdk/recipes/patches/libcares/m68k-unknown-amigaos/ipv6-support.p
@@ -0,0 +1,71 @@
+--- src/lib/ares_ipv6.h.orig 2017-10-10 15:19:45.611896396 +0100
++++ src/lib/ares_ipv6.h 2017-10-17 15:42:25.304921197 +0100
+@@ -32,6 +32,11 @@
+ #endif
+
++#ifndef INET6_ADDRSTRLEN
++#define INET6_ADDRSTRLEN 46
++#endif
++
+ #ifndef HAVE_STRUCT_SOCKADDR_IN6
++#define s6_addr _S6_un._S6_u8
+ struct sockaddr_in6 {
+ unsigned short sin6_family;
+ unsigned short sin6_port;
+--- src/lib/ares__sortaddrinfo.c.orig 2017-10-10 15:19:45.611896396 +0100
++++ src/lib/ares__sortaddrinfo.c 2017-10-17 15:42:25.304921197 +0100
+@@ -73,6 +73,40 @@
+ #define ARES_IN_LOOPBACK(a) \
+ ((((long unsigned int)(a)) & 0xff000000) == 0x7f000000)
+
++#include <inttypes.h>
++#ifndef IN6_IS_ADDR_LINKLOCAL
++#define IN6_IS_ADDR_LINKLOCAL(a) \
++ ((((__const uint32_t *) (a))[0] & htonl (0xffc00000)) \
++ == htonl (0xfe800000))
++#endif
++#ifndef IN6_IS_ADDR_LOOPBACK
++#define IN6_IS_ADDR_LOOPBACK(a) \
++ (((__const uint32_t *) (a))[0] == 0 \
++ && ((__const uint32_t *) (a))[1] == 0 \
++ && ((__const uint32_t *) (a))[2] == 0 \
++ && ((__const uint32_t *) (a))[3] == htonl (1))
++#endif
++#ifndef IN6_IS_ADDR_MULTICAST
++#define IN6_IS_ADDR_MULTICAST(a) (((__const uint8_t *) (a))[0] == 0xff)
++#endif
++#ifndef IN6_IS_ADDR_SITELOCAL
++#define IN6_IS_ADDR_SITELOCAL(a) \
++ ((((__const uint32_t *) (a))[0] & htonl (0xffc00000)) \
++ == htonl (0xfec00000))
++#endif
++#ifndef IN6_IS_ADDR_V4COMPAT
++#define IN6_IS_ADDR_V4COMPAT(a) \
++ ((((__const uint32_t *) (a))[0] == 0) \
++ && (((__const uint32_t *) (a))[1] == 0) \
++ && (((__const uint32_t *) (a))[2] == 0) \
++ && (ntohl (((__const uint32_t *) (a))[3]) > 1))
++#endif
++#ifndef IN6_IS_ADDR_V4MAPPED
++#define IN6_IS_ADDR_V4MAPPED(a) \
++ ((((__const uint32_t *) (a))[0] == 0) \
++ && (((__const uint32_t *) (a))[1] == 0) \
++ && (((__const uint32_t *) (a))[2] == htonl (0xffff)))
++#endif
+ /* RFC 4193. */
+ #define ARES_IN6_IS_ADDR_ULA(a) (((a)->s6_addr[0] & 0xfe) == 0xfc)
+
+@@ -205,8 +239,13 @@
+ /*
+ * Find number of matching initial bits between the two addresses a1 and a2.
+ */
++#ifndef HAVE_STRUCT_SOCKADDR_IN6
++static size_t common_prefix_len(const struct ares_in6_addr *a1,
++ const struct ares_in6_addr *a2)
++#else
+ static size_t common_prefix_len(const struct in6_addr *a1,
+ const struct in6_addr *a2)
++#endif
+ {
+ const unsigned char *p1 = (const unsigned char *)a1;
+ const unsigned char *p2 = (const unsigned char *)a2;
diff --git a/sdk/recipes/patches/libcares/ppc-amigaos/configure.p b/sdk/recipes/patches/libcares/ppc-amigaos/configure.p
deleted file mode 100644
index 254a483..0000000
--- a/sdk/recipes/patches/libcares/ppc-amigaos/configure.p
+++ /dev/null
@@ -1,11 +0,0 @@
---- configure.orig 2011-03-08 23:18:37.000000000 +0000
-+++ configure 2011-03-08 23:18:59.000000000 +0000
-@@ -18503,8 +18503,6 @@
- stdbool.h \
- time.h \
- limits.h \
-- arpa/nameser.h \
-- arpa/nameser_compat.h \
- arpa/inet.h
- do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
diff --git a/sdk/recipes/patches/libcares/ppc-amigaos/ipv6-support.p b/sdk/recipes/patches/libcares/ppc-amigaos/ipv6-support.p
new file mode 100644
index 0000000..f34fb45
--- /dev/null
+++ b/sdk/recipes/patches/libcares/ppc-amigaos/ipv6-support.p
@@ -0,0 +1,70 @@
+--- src/lib/ares_ipv6.h.orig 2017-10-10 15:19:45.611896396 +0100
++++ src/lib/ares_ipv6.h 2017-10-17 15:42:25.304921197 +0100
+@@ -32,6 +32,11 @@
+ #endif
+
++#ifndef INET6_ADDRSTRLEN
++#define INET6_ADDRSTRLEN 46
++#endif
++
+ #ifndef HAVE_STRUCT_SOCKADDR_IN6
++#define s6_addr _S6_un._S6_u8
+ struct sockaddr_in6 {
+ unsigned short sin6_family;
+ unsigned short sin6_port;
+--- src/lib/ares__sortaddrinfo.c.orig 2017-10-10 15:19:45.611896396 +0100
++++ src/lib/ares__sortaddrinfo.c 2017-10-17 15:42:25.304921197 +0100
+@@ -73,6 +73,39 @@
+ #define ARES_IN_LOOPBACK(a) \
+ ((((long unsigned int)(a)) & 0xff000000) == 0x7f000000)
+
++#ifndef IN6_IS_ADDR_LINKLOCAL
++#define IN6_IS_ADDR_LINKLOCAL(a) \
++ ((((__const uint32_t *) (a))[0] & htonl (0xffc00000)) \
++ == htonl (0xfe800000))
++#endif
++#ifndef IN6_IS_ADDR_LOOPBACK
++#define IN6_IS_ADDR_LOOPBACK(a) \
++ (((__const uint32_t *) (a))[0] == 0 \
++ && ((__const uint32_t *) (a))[1] == 0 \
++ && ((__const uint32_t *) (a))[2] == 0 \
++ && ((__const uint32_t *) (a))[3] == htonl (1))
++#endif
++#ifndef IN6_IS_ADDR_MULTICAST
++#define IN6_IS_ADDR_MULTICAST(a) (((__const uint8_t *) (a))[0] == 0xff)
++#endif
++#ifndef IN6_IS_ADDR_SITELOCAL
++#define IN6_IS_ADDR_SITELOCAL(a) \
++ ((((__const uint32_t *) (a))[0] & htonl (0xffc00000)) \
++ == htonl (0xfec00000))
++#endif
++#ifndef IN6_IS_ADDR_V4COMPAT
++#define IN6_IS_ADDR_V4COMPAT(a) \
++ ((((__const uint32_t *) (a))[0] == 0) \
++ && (((__const uint32_t *) (a))[1] == 0) \
++ && (((__const uint32_t *) (a))[2] == 0) \
++ && (ntohl (((__const uint32_t *) (a))[3]) > 1))
++#endif
++#ifndef IN6_IS_ADDR_V4MAPPED
++#define IN6_IS_ADDR_V4MAPPED(a) \
++ ((((__const uint32_t *) (a))[0] == 0) \
++ && (((__const uint32_t *) (a))[1] == 0) \
++ && (((__const uint32_t *) (a))[2] == htonl (0xffff)))
++#endif
+ /* RFC 4193. */
+ #define ARES_IN6_IS_ADDR_ULA(a) (((a)->s6_addr[0] & 0xfe) == 0xfc)
+
+@@ -205,8 +238,13 @@
+ /*
+ * Find number of matching initial bits between the two addresses a1 and a2.
+ */
++#ifndef HAVE_STRUCT_SOCKADDR_IN6
++static size_t common_prefix_len(const struct ares_in6_addr *a1,
++ const struct ares_in6_addr *a2)
++#else
+ static size_t common_prefix_len(const struct in6_addr *a1,
+ const struct in6_addr *a2)
++#endif
+ {
+ const unsigned char *p1 = (const unsigned char *)a1;
+ const unsigned char *p2 = (const unsigned char *)a2;
diff --git a/sdk/recipes/patches/libcurl/m5475-atari-mint/config.sub.p b/sdk/recipes/patches/libcurl/m5475-atari-mint/config.sub.p
new file mode 100644
index 0000000..a681d0a
--- /dev/null
+++ b/sdk/recipes/patches/libcurl/m5475-atari-mint/config.sub.p
@@ -0,0 +1,11 @@
+--- config.sub.orig 2023-10-01 08:53:00.740777146 +0100
++++ config.sub 2023-10-01 08:59:22.657161841 +0100
+@@ -1209,7 +1209,7 @@
+ | lm32 \
+ | loongarch32 | loongarch64 | loongarchx32 \
+ | m32c | m32r | m32rle \
+- | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
++ | m5200 | m5475 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+ | m88110 | m88k | maxq | mb | mcore | mep | metag \
+ | microblaze | microblazeel \
diff --git a/sdk/recipes/patches/libcurl/m68k-unknown-amigaos/lib.amigaos.c.p b/sdk/recipes/patches/libcurl/m68k-unknown-amigaos/lib.amigaos.c.p
deleted file mode 100644
index 5b6c913..0000000
--- a/sdk/recipes/patches/libcurl/m68k-unknown-amigaos/lib.amigaos.c.p
+++ /dev/null
@@ -1,11 +0,0 @@
---- lib/amigaos.c 2014-06-11 18:52:29.000000000 +0100
-+++ lib/amigaos.c 2014-12-20 21:34:06.686013103 +0000
-@@ -22,7 +22,7 @@
-
- #include "curl_setup.h"
-
--#if defined(__AMIGA__) && !defined(__ixemul__)
-+#if 0
-
- #include <amitcp/socketbasetags.h>
-
diff --git a/sdk/recipes/patches/libcurl/m68k-unknown-amigaos/lib.amigaos.h.p b/sdk/recipes/patches/libcurl/m68k-unknown-amigaos/lib.amigaos.h.p
deleted file mode 100644
index de22d82..0000000
--- a/sdk/recipes/patches/libcurl/m68k-unknown-amigaos/lib.amigaos.h.p
+++ /dev/null
@@ -1,11 +0,0 @@
---- lib/amigaos.h 2014-06-11 18:52:29.000000000 +0100
-+++ lib/amigaos.h 2014-12-20 21:34:20.390013061 +0000
-@@ -23,7 +23,7 @@
- ***************************************************************************/
- #include "curl_setup.h"
-
--#if defined(__AMIGA__) && !defined(__ixemul__)
-+#if 0
-
- bool Curl_amiga_init();
- void Curl_amiga_cleanup();
diff --git a/sdk/recipes/patches/libcurl/m68k-unknown-amigaos/lib.curl_setup.h.p b/sdk/recipes/patches/libcurl/m68k-unknown-amigaos/lib.curl_setup.h.p
index c9b9af3..ba595ca 100644
--- a/sdk/recipes/patches/libcurl/m68k-unknown-amigaos/lib.curl_setup.h.p
+++ b/sdk/recipes/patches/libcurl/m68k-unknown-amigaos/lib.curl_setup.h.p
@@ -1,10 +1,10 @@
---- lib/curl_setup.h 2014-08-25 22:45:11.000000000 +0100
-+++ lib/curl_setup.h 2014-12-20 21:35:26.494012868 +0000
-@@ -311,7 +311,6 @@
- # include <exec/execbase.h>
- # include <proto/exec.h>
- # include <proto/dos.h>
--# define select(a,b,c,d,e) WaitSelect(a,b,c,d,e,0)
- # endif
+--- lib/curl_setup.h.orig 2017-10-10 15:19:45.611896396 +0100
++++ lib/curl_setup.h 2017-10-17 15:42:25.304921197 +0100
+@@ -314,7 +314,6 @@
+ * In clib2 arpa/inet.h warns that some prototypes may clash
+ * with bsdsocket.library. This avoids the definition of those.
+ */
+-# define __NO_NET_API
#endif
+ #include <stdio.h>
diff --git a/sdk/recipes/patches/libcurl/m68k-unknown-amigaos/src.tool_getpass.c.p b/sdk/recipes/patches/libcurl/m68k-unknown-amigaos/src.tool_getpass.c.p
deleted file mode 100644
index 7de5cba..0000000
--- a/sdk/recipes/patches/libcurl/m68k-unknown-amigaos/src.tool_getpass.c.p
+++ /dev/null
@@ -1,13 +0,0 @@
---- ./tool_getpass.c 2014-06-11 18:52:29.000000000 +0100
-+++ src/tool_getpass.c 2015-01-05 21:42:31.826011647 +0000
-@@ -24,6 +24,10 @@
- #ifndef HAVE_GETPASS_R
- /* this file is only for systems without getpass_r() */
-
-+#ifdef __AMIGA__
-+#undef HAVE_TERMIOS_H
-+#endif
-+
- #ifdef HAVE_FCNTL_H
- # include <fcntl.h>
- #endif
diff --git a/sdk/recipes/patches/libcurl/m68k-unknown-amigaos/src.tool_operate.c.p b/sdk/recipes/patches/libcurl/m68k-unknown-amigaos/src.tool_operate.c.p
deleted file mode 100644
index 6237496..0000000
--- a/sdk/recipes/patches/libcurl/m68k-unknown-amigaos/src.tool_operate.c.p
+++ /dev/null
@@ -1,26 +0,0 @@
---- src/tool_operate.c.orig 2019-02-14 14:10:08.086190650 +0000
-+++ src/tool_operate.c 2019-02-14 14:10:04.862196063 +0000
-@@ -33,6 +33,10 @@
- # include <fabdef.h>
- #endif
-
-+#ifdef __AMIGA__
-+#include <proto/dos.h>
-+#endif
-+
- #include "strcase.h"
-
- #define ENABLE_CURLX_PRINTF
-@@ -1856,9 +1860,9 @@
- #ifdef __AMIGA__
- if(!result && outs.s_isreg && outs.filename) {
- /* Set the url (up to 80 chars) as comment for the file */
-- if(strlen(url) > 78)
-- url[79] = '\0';
-- SetComment(outs.filename, url);
-+ if(strlen(urlnode->url) > 78)
-+ urlnode->url[79] = '\0';
-+ /*SetComment(outs.filename, urlnode->url);*/ /* cannot get a header to include that provides this function */
- }
- #endif
-
diff --git a/sdk/recipes/patches/libcurl/ppc-amigaos/lib.amigaos.c.p b/sdk/recipes/patches/libcurl/ppc-amigaos/lib.amigaos.c.p
index 9833c94..384bcd5 100644
--- a/sdk/recipes/patches/libcurl/ppc-amigaos/lib.amigaos.c.p
+++ b/sdk/recipes/patches/libcurl/ppc-amigaos/lib.amigaos.c.p
@@ -1,11 +1,12 @@
---- lib/amigaos.c.old 2012-10-19 21:37:45.000000000 +0100
-+++ lib/amigaos.c 2012-10-19 21:38:09.000000000 +0100
-@@ -22,7 +22,7 @@
-
- #include "curl_setup.h"
-
--#if defined(__AMIGA__) && !defined(__ixemul__)
-+#if defined(__AMIGA__) && !(defined(__ixemul__) || defined(__amigaos4__))
-
- #include <amitcp/socketbasetags.h>
-
+--- lib/amigaos.c.orig 2017-10-10 15:19:45.611896396 +0100
++++ lib/amigaos.c 2017-10-17 15:42:25.304921197 +0100
+@@ -86,7 +86,9 @@
+ ULONG enabled = 0;
+
+ SocketBaseTags(SBTM_SETVAL(SBTC_CAN_SHARE_LIBRARY_BASES), TRUE,
++#ifdef SBTC_HAVE_GETHOSTADDR_R_API
+ SBTM_GETREF(SBTC_HAVE_GETHOSTADDR_R_API), (ULONG)&enabled,
++#endif
+ TAG_DONE);
+
+ if(enabled) {
diff --git a/sdk/recipes/patches/libcurl/ppc-amigaos/lib.amigaos.h.p b/sdk/recipes/patches/libcurl/ppc-amigaos/lib.amigaos.h.p
deleted file mode 100644
index 050bea7..0000000
--- a/sdk/recipes/patches/libcurl/ppc-amigaos/lib.amigaos.h.p
+++ /dev/null
@@ -1,11 +0,0 @@
---- lib/amigaos.h.old 2012-10-19 21:36:23.000000000 +0100
-+++ lib/amigaos.h 2012-10-19 21:37:26.000000000 +0100
-@@ -23,7 +23,7 @@
- ***************************************************************************/
- #include "curl_setup.h"
-
--#if defined(__AMIGA__) && !defined(__ixemul__)
-+#if defined(__AMIGA__) && !(defined(__ixemul__) || defined(__amigaos4__))
-
- bool Curl_amiga_init();
- void Curl_amiga_cleanup();
diff --git a/sdk/recipes/patches/libcurl/ppc-amigaos/lib.curl_setup.h.p b/sdk/recipes/patches/libcurl/ppc-amigaos/lib.curl_setup.h.p
deleted file mode 100644
index 7e47a50..0000000
--- a/sdk/recipes/patches/libcurl/ppc-amigaos/lib.curl_setup.h.p
+++ /dev/null
@@ -1,23 +0,0 @@
---- lib/curl_setup.h.old 2012-10-19 21:58:12.000000000 +0100
-+++ lib/curl_setup.h 2012-10-19 21:59:17.000000000 +0100
-@@ -323,11 +323,15 @@
-
- #ifdef __AMIGA__
- # ifndef __ixemul__
--# include <exec/types.h>
--# include <exec/execbase.h>
--# include <proto/exec.h>
--# include <proto/dos.h>
--# define select(a,b,c,d,e) WaitSelect(a,b,c,d,e,0)
-+# ifdef __amigaos4__
-+# include <unistd.h>
-+# else
-+# include <exec/types.h>
-+# include <exec/execbase.h>
-+# include <proto/exec.h>
-+# include <proto/dos.h>
-+# define select(a,b,c,d,e) WaitSelect(a,b,c,d,e,0)
-+# endif
- # endif
- #endif
-
diff --git a/sdk/recipes/patches/libcurl/ppc-amigaos/lib.hostip4.c.p b/sdk/recipes/patches/libcurl/ppc-amigaos/lib.hostip4.c.p
deleted file mode 100644
index b6287ca..0000000
--- a/sdk/recipes/patches/libcurl/ppc-amigaos/lib.hostip4.c.p
+++ /dev/null
@@ -1,60 +0,0 @@
---- lib/hostip4.c 2017-03-26 23:41:52.304617207 +0100
-+++ lib/hostip4.c 2017-03-26 23:41:11.000000000 +0100
-@@ -119,6 +119,10 @@ Curl_addrinfo *Curl_getaddrinfo(struct c
- * implying that only threadsafe code and function calls may be used.
- *
- */
-+#ifdef __amigaos4__
-+#include <proto/exec.h>
-+#include <proto/bsdsocket.h>
-+#endif
- Curl_addrinfo *Curl_ipv4_resolve_r(const char *hostname,
- int port)
- {
-@@ -129,6 +133,9 @@ Curl_addrinfo *Curl_ipv4_resolve_r(const
- struct hostent *h = NULL;
- struct in_addr in;
- struct hostent *buf = NULL;
-+#ifdef __amigaos4__
-+ struct SocketIFace *ISocket = NULL;
-+#endif
-
- if(Curl_inet_pton(AF_INET, hostname, &in) > 0)
- /* This is a dotted IP address 123.123.123.123-style */
-@@ -291,7 +298,20 @@ Curl_addrinfo *Curl_ipv4_resolve_r(const
- * gethostbyname() is the preferred one.
- */
- else {
-+#ifdef __amigaos4__
-+ struct Library *SocketBase = IExec->OpenLibrary("bsdsocket.library", 4);
-+ if (SocketBase)
-+ {
-+ ISocket = (struct SocketIFace *)IExec->GetInterface(SocketBase, "main", 1, NULL);
-+ }
-+
-+ if (ISocket)
-+ {
-+ h = ISocket->gethostbyname((void*)hostname);
-+ }
-+#else
- h = gethostbyname((void *)hostname);
-+#endif
- #endif /* HAVE_GETADDRINFO_THREADSAFE || HAVE_GETHOSTBYNAME_R */
- }
-
-@@ -301,7 +321,14 @@ Curl_addrinfo *Curl_ipv4_resolve_r(const
- if(buf) /* used a *_r() function */
- free(buf);
- }
--
-+#ifdef __amigaos4__
-+ if (ISocket)
-+ {
-+ struct Library *SocketBase = ISocket->Data.LibBase;
-+ IExec->DropInterface((struct Interface *)ISocket);
-+ IExec->CloseLibrary(SocketBase);
-+ }
-+#endif
- return ai;
- }
- #endif /* defined(CURLRES_IPV4) && !defined(CURLRES_ARES) */
diff --git a/sdk/recipes/patches/libcurl/ppc-amigaos/src.tool_operate.c.p b/sdk/recipes/patches/libcurl/ppc-amigaos/src.tool_operate.c.p
deleted file mode 100644
index 6237496..0000000
--- a/sdk/recipes/patches/libcurl/ppc-amigaos/src.tool_operate.c.p
+++ /dev/null
@@ -1,26 +0,0 @@
---- src/tool_operate.c.orig 2019-02-14 14:10:08.086190650 +0000
-+++ src/tool_operate.c 2019-02-14 14:10:04.862196063 +0000
-@@ -33,6 +33,10 @@
- # include <fabdef.h>
- #endif
-
-+#ifdef __AMIGA__
-+#include <proto/dos.h>
-+#endif
-+
- #include "strcase.h"
-
- #define ENABLE_CURLX_PRINTF
-@@ -1856,9 +1860,9 @@
- #ifdef __AMIGA__
- if(!result && outs.s_isreg && outs.filename) {
- /* Set the url (up to 80 chars) as comment for the file */
-- if(strlen(url) > 78)
-- url[79] = '\0';
-- SetComment(outs.filename, url);
-+ if(strlen(urlnode->url) > 78)
-+ urlnode->url[79] = '\0';
-+ /*SetComment(outs.filename, urlnode->url);*/ /* cannot get a header to include that provides this function */
- }
- #endif
-
diff --git a/sdk/recipes/patches/libexpat/m5475-atari-mint/conftools.config.sub.p b/sdk/recipes/patches/libexpat/m5475-atari-mint/conftools.config.sub.p
new file mode 100644
index 0000000..90e61b1
--- /dev/null
+++ b/sdk/recipes/patches/libexpat/m5475-atari-mint/conftools.config.sub.p
@@ -0,0 +1,11 @@
+--- conftools/config.sub.orig 2023-10-01 08:53:00.740777146 +0100
++++ conftools/config.sub 2023-10-01 08:59:22.657161841 +0100
+@@ -1209,7 +1209,7 @@
+ | lm32 \
+ | loongarch32 | loongarch64 | loongarchx32 \
+ | m32c | m32r | m32rle \
+- | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
++ | m5200 | m5475 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+ | m88110 | m88k | maxq | mb | mcore | mep | metag \
+ | microblaze | microblazeel \
diff --git a/sdk/recipes/patches/libexpat/m68k-unknown-amigaos/xmlwf.xmltchar.h.p b/sdk/recipes/patches/libexpat/m68k-unknown-amigaos/xmlwf.xmltchar.h.p
new file mode 100644
index 0000000..c9da0e8
--- /dev/null
+++ b/sdk/recipes/patches/libexpat/m68k-unknown-amigaos/xmlwf.xmltchar.h.p
@@ -0,0 +1,9 @@
+--- xmlwf/xmltchar.h.orig 2017-10-10 15:19:45.611896396 +0100
++++ xmlwf/xmltchar.h 2017-10-17 15:42:25.304921197 +0100
+@@ -75,5 +75,5 @@
+ # define tremove remove
+ # define tchar char
+ # define tcstof strtof
+-# define tcstoull strtoull
++# define tcstoull strtoul
+ #endif /* not XML_UNICODE */
diff --git a/sdk/recipes/patches/libiconv/libcharset.lib.localcharset.c.p b/sdk/recipes/patches/libiconv/libcharset.lib.localcharset.c.p
index b456c94..3296a6e 100644
--- a/sdk/recipes/patches/libiconv/libcharset.lib.localcharset.c.p
+++ b/sdk/recipes/patches/libiconv/libcharset.lib.localcharset.c.p
@@ -1,6 +1,6 @@
--- libcharset/lib/localcharset.c.old 2010-12-29 19:12:21.000000000 +0000
+++ libcharset/lib/localcharset.c 2010-12-29 19:12:49.000000000 +0000
-@@ -352,9 +352,6 @@
+@@ -824,9 +824,6 @@
If the canonical name cannot be determined, the result is a non-canonical
name. */
diff --git a/sdk/recipes/patches/libiconv/m5475-atari-mint/build-aux.config.sub.p b/sdk/recipes/patches/libiconv/m5475-atari-mint/build-aux.config.sub.p
new file mode 100644
index 0000000..9bacbb8
--- /dev/null
+++ b/sdk/recipes/patches/libiconv/m5475-atari-mint/build-aux.config.sub.p
@@ -0,0 +1,11 @@
+--- build-aux/config.sub.orig 2023-10-01 08:53:00.740777146 +0100
++++ build-aux/config.sub 2023-10-01 08:59:22.657161841 +0100
+@@ -1209,7 +1209,7 @@
+ | lm32 \
+ | loongarch32 | loongarch64 | loongarchx32 \
+ | m32c | m32r | m32rle \
+- | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
++ | m5200 | m5475 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+ | m88110 | m88k | maxq | mb | mcore | mep | metag \
+ | microblaze | microblazeel \
diff --git a/sdk/recipes/patches/libiconv/m5475-atari-mint/libcharset.build-aux.config.sub.p b/sdk/recipes/patches/libiconv/m5475-atari-mint/libcharset.build-aux.config.sub.p
new file mode 100644
index 0000000..d615e13
--- /dev/null
+++ b/sdk/recipes/patches/libiconv/m5475-atari-mint/libcharset.build-aux.config.sub.p
@@ -0,0 +1,11 @@
+--- libcharset/build-aux/config.sub.orig 2023-10-01 08:53:00.740777146 +0100
++++ libcharset/build-aux/config.sub 2023-10-01 08:59:22.657161841 +0100
+@@ -1209,7 +1209,7 @@
+ | lm32 \
+ | loongarch32 | loongarch64 | loongarchx32 \
+ | m32c | m32r | m32rle \
+- | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
++ | m5200 | m5475 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+ | m88110 | m88k | maxq | mb | mcore | mep | metag \
+ | microblaze | microblazeel \
diff --git a/sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.getprogname.c.p b/sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.getprogname.c.p
index 3d7938d..ac19b03 100644
--- a/sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.getprogname.c.p
+++ b/sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.getprogname.c.p
@@ -1,11 +1,11 @@
---- srclib/getprogname.c 2017-01-01 23:02:21.000000000 +0000
-+++ srclib/getprogname.c 2017-03-26 23:21:25.532012988 +0100
-@@ -144,7 +144,7 @@ getprogname (void)
+--- srclib/getprogname.c 2019-04-26 19:29:00.000000000 +0100
++++ srclib/getprogname.c 2020-03-06 19:32:44.157018596 +0000
+@@ -288,7 +288,7 @@ getprogname (void)
}
- return p;
+ return "?";
# else
-# error "getprogname module not ported to this OS"
-+ const char *p = ""; /* this is never used for anything important */
++ return ""; /* this is never used for anything important */
# endif
}
diff --git a/sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.signal.in.h.p b/sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.signal.in.h.p
index 8647b83..0102857 100644
--- a/sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.signal.in.h.p
+++ b/sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.signal.in.h.p
@@ -1,6 +1,6 @@
--- srclib/signal.in.h 2017-01-01 23:02:22.000000000 +0000
+++ srclib/signal.in.h 2017-03-26 22:56:18.360017409 +0100
-@@ -211,69 +211,6 @@ typedef int verify_NSIG_constraint[NSIG
+@@ -223,69 +223,6 @@ typedef int verify_NSIG_constraint[NSIG
# undef sigismember
#endif
diff --git a/sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.sigprocmask.c.p b/sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.sigprocmask.c.p
index a811881..fbf554a 100644
--- a/sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.sigprocmask.c.p
+++ b/sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.sigprocmask.c.p
@@ -1,6 +1,6 @@
--- srclib/sigprocmask.c.orig 2011-08-07 14:42:06.000000000 +0100
+++ srclib/sigprocmask.c 2014-01-15 00:59:33.130968152 +0000
-@@ -83,77 +83,6 @@
+@@ -110,77 +110,6 @@
# define signal ext_signal
#endif
diff --git a/sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.time.in.h.p b/sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.time.in.h.p
new file mode 100644
index 0000000..0d10bce
--- /dev/null
+++ b/sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.time.in.h.p
@@ -0,0 +1,11 @@
+--- srclib/time.in.h 2019-01-06 08:51:41.000000000 +0000
++++ srclib/time.in.h 2020-03-06 19:46:37.429016156 +0000
+@@ -76,7 +76,7 @@ extern "C" {
+ # define timespec rpl_timespec
+ struct timespec
+ {
+- time_t tv_sec;
++ time_t tv_secs;
+ long int tv_nsec;
+ };
+ # define GNULIB_defined_struct_timespec 1
diff --git a/sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.unistd.in.h.p b/sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.unistd.in.h.p
index 2e1cf5e..a70f0b5 100644
--- a/sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.unistd.in.h.p
+++ b/sdk/recipes/patches/libiconv/m68k-unknown-amigaos/srclib.unistd.in.h.p
@@ -1,6 +1,6 @@
--- srclib/unistd.in.h.orig 2017-03-27 23:12:52.149619622 +0100
+++ srclib/unistd.in.h 2017-03-27 23:13:12.582243962 +0100
-@@ -1262,40 +1262,6 @@
+@@ -1873,44 +1873,6 @@
#endif
@@ -9,24 +9,28 @@
- bytes of it into BUF. Return the number of bytes placed into BUF if
- successful, otherwise -1 and errno set.
- See the POSIX:2008 specification
-- <http://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html>. */
+- <https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html>. */
-# if @REPLACE_READLINK@
-# if !(defined __cplusplus && defined GNULIB_NAMESPACE)
-# define readlink rpl_readlink
-# endif
-_GL_FUNCDECL_RPL (readlink, ssize_t,
-- (const char *file, char *buf, size_t bufsize)
+- (const char *restrict file,
+- char *restrict buf, size_t bufsize)
- _GL_ARG_NONNULL ((1, 2)));
-_GL_CXXALIAS_RPL (readlink, ssize_t,
-- (const char *file, char *buf, size_t bufsize));
+- (const char *restrict file,
+- char *restrict buf, size_t bufsize));
-# else
-# if !@HAVE_READLINK@
-_GL_FUNCDECL_SYS (readlink, ssize_t,
-- (const char *file, char *buf, size_t bufsize)
+- (const char *restrict file,
+- char *restrict buf, size_t bufsize)
- _GL_ARG_NONNULL ((1, 2)));
-# endif
-_GL_CXXALIAS_SYS (readlink, ssize_t,
-- (const char *file, char *buf, size_t bufsize));
+- (const char *restrict file,
+- char *restrict buf, size_t bufsize));
-# endif
-_GL_CXXALIASWARN (readlink);
-#elif defined GNULIB_POSIXCHECK
diff --git a/sdk/recipes/patches/libiconv/ppc-amigaos/srclib.getprogname.c.p b/sdk/recipes/patches/libiconv/ppc-amigaos/srclib.getprogname.c.p
index 3d7938d..ac19b03 100644
--- a/sdk/recipes/patches/libiconv/ppc-amigaos/srclib.getprogname.c.p
+++ b/sdk/recipes/patches/libiconv/ppc-amigaos/srclib.getprogname.c.p
@@ -1,11 +1,11 @@
---- srclib/getprogname.c 2017-01-01 23:02:21.000000000 +0000
-+++ srclib/getprogname.c 2017-03-26 23:21:25.532012988 +0100
-@@ -144,7 +144,7 @@ getprogname (void)
+--- srclib/getprogname.c 2019-04-26 19:29:00.000000000 +0100
++++ srclib/getprogname.c 2020-03-06 19:32:44.157018596 +0000
+@@ -288,7 +288,7 @@ getprogname (void)
}
- return p;
+ return "?";
# else
-# error "getprogname module not ported to this OS"
-+ const char *p = ""; /* this is never used for anything important */
++ return ""; /* this is never used for anything important */
# endif
}
diff --git a/sdk/recipes/patches/libiconv/ppc-amigaos/srclib.signal.in.h.p b/sdk/recipes/patches/libiconv/ppc-amigaos/srclib.signal.in.h.p
index 8647b83..0102857 100644
--- a/sdk/recipes/patches/libiconv/ppc-amigaos/srclib.signal.in.h.p
+++ b/sdk/recipes/patches/libiconv/ppc-amigaos/srclib.signal.in.h.p
@@ -1,6 +1,6 @@
--- srclib/signal.in.h 2017-01-01 23:02:22.000000000 +0000
+++ srclib/signal.in.h 2017-03-26 22:56:18.360017409 +0100
-@@ -211,69 +211,6 @@ typedef int verify_NSIG_constraint[NSIG
+@@ -223,69 +223,6 @@ typedef int verify_NSIG_constraint[NSIG
# undef sigismember
#endif
diff --git a/sdk/recipes/patches/libiconv/ppc-amigaos/srclib.sigprocmask.c.p b/sdk/recipes/patches/libiconv/ppc-amigaos/srclib.sigprocmask.c.p
index a811881..fbf554a 100644
--- a/sdk/recipes/patches/libiconv/ppc-amigaos/srclib.sigprocmask.c.p
+++ b/sdk/recipes/patches/libiconv/ppc-amigaos/srclib.sigprocmask.c.p
@@ -1,6 +1,6 @@
--- srclib/sigprocmask.c.orig 2011-08-07 14:42:06.000000000 +0100
+++ srclib/sigprocmask.c 2014-01-15 00:59:33.130968152 +0000
-@@ -83,77 +83,6 @@
+@@ -110,77 +110,6 @@
# define signal ext_signal
#endif
diff --git a/sdk/recipes/patches/libpng/m5475-atari-mint/config.sub.p b/sdk/recipes/patches/libpng/m5475-atari-mint/config.sub.p
new file mode 100644
index 0000000..a681d0a
--- /dev/null
+++ b/sdk/recipes/patches/libpng/m5475-atari-mint/config.sub.p
@@ -0,0 +1,11 @@
+--- config.sub.orig 2023-10-01 08:53:00.740777146 +0100
++++ config.sub 2023-10-01 08:59:22.657161841 +0100
+@@ -1209,7 +1209,7 @@
+ | lm32 \
+ | loongarch32 | loongarch64 | loongarchx32 \
+ | m32c | m32r | m32rle \
+- | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
++ | m5200 | m5475 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+ | m88110 | m88k | maxq | mb | mcore | mep | metag \
+ | microblaze | microblazeel \
diff --git a/sdk/recipes/patches/libwebp/configure.ac.p b/sdk/recipes/patches/libwebp/configure.ac.p
new file mode 100644
index 0000000..30150d1
--- /dev/null
+++ b/sdk/recipes/patches/libwebp/configure.ac.p
@@ -0,0 +1,11 @@
+--- configure.ac.orig 2019-07-04 20:32:37.000000000 +0100
++++ configure.ac 2019-08-26 01:10:45.539132422 +0100
+@@ -485,7 +485,7 @@
+ libpng12-config])
+ if test -n "$LIBPNG_CONFIG"; then
+ PNG_INCLUDES=`$LIBPNG_CONFIG --cflags`
+- PNG_LIBS="`$LIBPNG_CONFIG --ldflags`"
++ PNG_LIBS="`$LIBPNG_CONFIG --static --ldflags`"
+ fi
+
+ WITHLIB_OPTION([png], [PNG])
diff --git a/sdk/recipes/patches/libwebp/configure.p b/sdk/recipes/patches/libwebp/configure.p
new file mode 100644
index 0000000..02dc813
--- /dev/null
+++ b/sdk/recipes/patches/libwebp/configure.p
@@ -0,0 +1,11 @@
+--- configure.orig 2019-07-04 20:43:58.000000000 +0100
++++ configure 2019-08-26 01:11:13.365038420 +0100
+@@ -14312,7 +14312,7 @@
+
+ if test -n "$LIBPNG_CONFIG"; then
+ PNG_INCLUDES=`$LIBPNG_CONFIG --cflags`
+- PNG_LIBS="`$LIBPNG_CONFIG --ldflags`"
++ PNG_LIBS="`$LIBPNG_CONFIG --static --ldflags`"
+ fi
+
+
diff --git a/sdk/recipes/patches/openssl/Configurations-50-amigaos.conf.p b/sdk/recipes/patches/openssl/Configurations-50-amigaos.conf.p
index 3012ad2..26bb873 100644
--- a/sdk/recipes/patches/openssl/Configurations-50-amigaos.conf.p
+++ b/sdk/recipes/patches/openssl/Configurations-50-amigaos.conf.p
@@ -1,16 +1,17 @@
--- /dev/null 2017-10-10 15:19:45.611896396 +0100
+++ Configurations/50-amigaos.conf 2017-10-17 15:42:25.304921197 +0100
-@@ -0,0 +1,31 @@
-+%targets = (
+@@ -0,0 +1,32 @@
++my %targets = (
+
+ "ppc-amigaos" => {
-+ inherit_from => [ "BASE_unix", asm("ppc32_asm") ],
++ inherit_from => [ "BASE_unix" ],
+ cc => "ppc-amigaos-gcc",
+ cflags => picker(default => "-DB_ENDIAN -DTERMIOS -DNO_SYS_UN_H -DNO_SYSLOG",
+ debug => "-O0 -g",
+ release => "-O3 -fomit-frame-pointer",
-+ threads("-D_REENTRANT")),
++ threads("-D_REENTRANT")),
+ thread_scheme => "(unknown)",
++ asm_arch => "ppc32",
+ perlasm_scheme => "linux32",
+ sys_id => "AMIGAOS4",
+ bn_ops => "THIRTY_TWO_BIT BN_LLONG RC4_CHAR",
@@ -23,7 +24,7 @@
+ cflags => picker(default => "-DB_ENDIAN -DTERMIOS -DNO_SYS_UN_H -DNO_SYS_PARAM_H -DNO_SYSLOG -m68020 -std=gnu99",
+ debug => "-O0 -g",
+ release => "-O3 -fomit-frame-pointer",
-+ threads("-D_REENTRANT")),
++ threads("-D_REENTRANT")),
+ thread_scheme => "(unknown)",
+ ex_libs => add("-lm -lnet"),
+ sys_id => "AMIGAOS3",
diff --git a/sdk/recipes/patches/openssl/Configurations-50-atari.conf.p b/sdk/recipes/patches/openssl/Configurations-50-atari.conf.p
new file mode 100644
index 0000000..d9c51be
--- /dev/null
+++ b/sdk/recipes/patches/openssl/Configurations-50-atari.conf.p
@@ -0,0 +1,45 @@
+--- /dev/null 2018-06-01 10:46:49.956110101 +0200
++++ Configurations/50-atari.conf 2018-06-03 03:10:55.000000000 +0200
+@@ -0,0 +1,42 @@
++my %targets = (
++ "atari-common" => {
++ inherit_from => [ "BASE_unix" ],
++ template => 1,
++ cc => "m68k-atari-mint-gcc",
++ cflags => add_before(picker(default => "-DB_ENDIAN -DTERMIOS -DNO_SYSLOG -DNO_SYS_UN_H -DOPENSSL_USE_IPV6=0 -Wall",
++ debug => "-g -O0",
++ release => "-O3 -fomit-frame-pointer")),
++ sys_id => "MINT",
++ ranlib => "m68k-atari-mint-ranlib",
++# ? bn_ops => "THIRTY_TWO_BIT BN_LLONG",
++ bn_ops => "BN_LLONG",
++# ex_libs => "-lnetwork",
++# perlasm_scheme => "elf",
++ thread_scheme => "(unknown)",
++# dso_scheme => "dlfcn",
++# shared_target => "gnu-shared",
++# shared_cflag => "-fPIC",
++# shared_ldflag => "-shared",
++# shared_extension => ".so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++ },
++
++ "m68k-atari-mint000" => {
++ inherit_from => [ "atari-common" ],
++# XXX: does it work on 68000?
++# bn_asm_src => "asm/bn_m68k.s",
++ },
++
++ "m68k-atari-mint" => {
++ inherit_from => [ "atari-common" ],
++ cflags => add(picker(release => "-m68020-60")),
++ bn_asm_src => "asm/bn_m68k.s",
++ },
++
++ "m5475-atari-mint" => {
++ inherit_from => [ "atari-common" ],
++ cc => "m5475-atari-mint-gcc",
++# bn_asm_src => "asm/bn_m68k.s",
++ bn_ops => "BN_LLONG DES_RISC1",
++ ranlib => "m5475-atari-mint-ranlib",
++ },
++);
diff --git a/sdk/recipes/patches/openssl/Configurations-50-riscos.conf.p b/sdk/recipes/patches/openssl/Configurations-50-riscos.conf.p
index 128d400..c3f2fe5 100644
--- a/sdk/recipes/patches/openssl/Configurations-50-riscos.conf.p
+++ b/sdk/recipes/patches/openssl/Configurations-50-riscos.conf.p
@@ -1,7 +1,7 @@
--- /dev/null 2017-10-10 15:19:45.611896396 +0100
+++ Configurations/50-riscos.conf 2017-10-17 15:42:25.304921197 +0100
-@@ -0,0 +1,14 @@
-+%targets = (
+@@ -0,0 +1,26 @@
++my %targets = (
+
+ "arm-unknown-riscos" => {
+ inherit_from => [ "BASE_unix" ],
@@ -14,4 +14,16 @@
+ sys_id => "RISCOS",
+ bn_ops => "BN_LLONG",
+ },
++
++ "arm-riscos-gnueabi" => {
++ inherit_from => [ "BASE_unix" ],
++ cc => "arm-riscos-gnueabi-gcc",
++ cflags => picker(default => "-DL_ENDIAN -DTERMIOS -DNO_SYS_UN_H",
++ debug => "-O0 -g",
++ release => "-O3 ",
++ threads("-D_REENTRANT")),
++ thread_scheme => "(unknown)",
++ sys_id => "RISCOS",
++ bn_ops => "BN_LLONG",
++ },
+);
diff --git a/sdk/recipes/patches/openssl/Configurations-50-windows.conf.p b/sdk/recipes/patches/openssl/Configurations-50-windows.conf.p
index c492c01..fafa6cf 100644
--- a/sdk/recipes/patches/openssl/Configurations-50-windows.conf.p
+++ b/sdk/recipes/patches/openssl/Configurations-50-windows.conf.p
@@ -1,20 +1,21 @@
--- /dev/null 2017-10-10 15:19:45.611896396 +0100
+++ Configurations/50-windows.conf 2017-10-17 15:42:25.304921197 +0100
-@@ -0,0 +1,25 @@
-+%targets = (
+@@ -0,0 +1,26 @@
++my %targets = (
+
+ "i686-w64-mingw32" => {
-+ inherit_from => [ "BASE_unix", asm("x86_asm"),
-+ sub { $disabled{shared} ? () : "x86_uplink" } ],
++ inherit_from => [ "BASE_unix",
++ sub { $disabled{shared} ? () : "x86_uplink" } ],
+ cc => "gcc",
+ cflags => combine(picker(default => "-DL_ENDIAN -DWIN32_LEAN_AND_MEAN -DUNICODE -D_UNICODE -m32 -Wall",
-+ debug => "-g -O0",
++ debug => "-g -O0",
+ release => "-O3 -fomit-frame-pointer"),
+ threads("-D_MT")),
+ sys_id => "MINGW32",
+ ex_libs => add("-lws2_32 -lgdi32 -lcrypt32"),
+ bn_ops => "BN_LLONG EXPORT_VAR_AS_FN",
+ thread_scheme => "winthreads",
++ asm_arch => "x86",
+ perlasm_scheme => "coff",
+ dso_scheme => "win32",
+ shared_target => "mingw-shared",
diff --git a/sdk/recipes/patches/openssl/Configure.p b/sdk/recipes/patches/openssl/Configure.p
index c26e08b..aff7878 100644
--- a/sdk/recipes/patches/openssl/Configure.p
+++ b/sdk/recipes/patches/openssl/Configure.p
@@ -1,10 +1,11 @@
--- Configure.orig 2017-10-17 14:53:18.369801491 +0100
+++ Configure 2017-10-17 15:11:04.312242542 +0100
-@@ -946,6 +946,7 @@
- $target{exe_extension}=".exe" if ($config{target} eq "DJGPP"
- || $config{target} =~ /^(?:Cygwin|mingw)/);
+@@ -1329,6 +1329,8 @@
+ $target{cxxflags}//=$target{cflags} if $target{CXX};
+ $target{exe_extension}=".exe" if ($config{target} eq "DJGPP");
$target{exe_extension}=".pm" if ($config{target} =~ /vos/);
++$target{exe_extension}=",e1f" if ($config{target} eq "arm-riscos-gnueabi");
+$target{exe_extension}=",e1f" if ($config{target} eq "arm-unknown-riscos");
- ($target{shared_extension_simple}=$target{shared_extension})
- =~ s|\.\$\(SHLIB_MAJOR\)\.\$\(SHLIB_MINOR\)||;
+ # Fill %config with values from %user, and in case those are undefined or
+ # empty, use values from %target (acting as a default).
diff --git a/sdk/recipes/patches/openssl/apps.s_socket.c.p b/sdk/recipes/patches/openssl/apps.s_socket.c.p
deleted file mode 100644
index f4c8e1c..0000000
--- a/sdk/recipes/patches/openssl/apps.s_socket.c.p
+++ /dev/null
@@ -1,18 +0,0 @@
---- apps/s_socket.c.orig 2019-02-13 18:04:36.643334493 +0000
-+++ apps/s_socket.c 2019-02-13 18:04:46.271279170 +0000
-@@ -160,6 +160,7 @@
- sock_protocol = BIO_ADDRINFO_protocol(res);
- sock_address = BIO_ADDRINFO_address(res);
- next = BIO_ADDRINFO_next(res);
-+#ifdef AF_INET6
- if (sock_family == AF_INET6)
- sock_options |= BIO_SOCK_V6_ONLY;
- if (next != NULL
-@@ -174,6 +175,7 @@
- sock_options &= ~BIO_SOCK_V6_ONLY;
- }
- }
-+#endif
-
- asock = BIO_socket(sock_family, sock_type, sock_protocol, 0);
- if (asock == INVALID_SOCKET
diff --git a/sdk/recipes/patches/openssl/apps.speed.c.p b/sdk/recipes/patches/openssl/apps.speed.c.p
index 88ae1c3..132d473 100644
--- a/sdk/recipes/patches/openssl/apps.speed.c.p
+++ b/sdk/recipes/patches/openssl/apps.speed.c.p
@@ -1,7 +1,7 @@
---- apps/speed.c.orig 2017-11-22 08:07:53.851790744 +0000
-+++ apps/speed.c 2017-11-22 08:15:49.608768064 +0000
-@@ -111,6 +111,12 @@
- #endif
+--- apps/speed.c.orig 2017-11-21 22:49:00.185608040 +0000
++++ apps/speed.c 2017-11-21 22:49:21.488219518 +0000
+@@ -62,6 +62,12 @@
+ #include "./testdsa.h"
#include <openssl/modes.h>
+
@@ -11,18 +11,24 @@
+#endif
+
#ifndef HAVE_FORK
- # if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS)
+ # if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_VXWORKS)
# define HAVE_FORK 0
---- apps/speed.c.orig 2017-11-22 08:33:02.137445746 +0000
-+++ apps/speed.c 2017-11-22 08:36:00.833790589 +0000
-@@ -345,8 +345,10 @@
- static double Time_F(int s)
- {
- double ret = app_tminterval(s, usertime);
-+ #ifdef SIGALRM
- if (s == STOP)
- alarm(0);
-+ #endif
+@@ -186,6 +192,18 @@
+
return ret;
}
++#elif defined(OPENSSL_SYS_AMIGAOS3) || defined(OPENSSL_SYS_AMIGAOS4)
++static void alarm_aos(unsigned int secs)
++{
++ (void) secs;
++}
++#define alarm alarm_aos
++
++static double Time_F(int s)
++{
++ double ret = app_tminterval(s, usertime);
++ return ret;
++}
+ #else
+ # error "SIGALRM not defined and the platform is not Windows"
#endif
diff --git a/sdk/recipes/patches/openssl/aps.opt.c.p b/sdk/recipes/patches/openssl/aps.opt.c.p
deleted file mode 100644
index 531cf76..0000000
--- a/sdk/recipes/patches/openssl/aps.opt.c.p
+++ /dev/null
@@ -1,14 +0,0 @@
---- apps/opt.c.orig 2017-11-22 08:42:07.605882648 +0000
-+++ apps/opt.c 2017-11-22 08:48:31.712843519 +0000
-@@ -353,6 +353,11 @@
- #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L && \
- defined(INTMAX_MAX) && defined(UINTMAX_MAX)
-
-+#if defined(OPENSSL_SYS_AMIGAOS3) || defined(OPENSSL_SYS_AMIGAOS4)
-+# define strtoimax strtol
-+# define strtoumax strtoul
-+#endif
-+
- /* Parse an intmax_t, put it into *result; return 0 on failure, else 1. */
- int opt_imax(const char *value, intmax_t *result)
- {
diff --git a/sdk/recipes/patches/openssl/crypto.arm_arch.h.p b/sdk/recipes/patches/openssl/crypto.arm_arch.h.p
new file mode 100644
index 0000000..093e4de
--- /dev/null
+++ b/sdk/recipes/patches/openssl/crypto.arm_arch.h.p
@@ -0,0 +1,11 @@
+--- crypto/arm_arch.h 2015-07-09 12:21:24.000000000 +0000
++++ crypto/arm_arch.h 2015-11-13 13:47:02.386910047 +0000
+@@ -51,6 +51,8 @@
+ # define __ARM_ARCH__ 5
+ # elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__)
+ # define __ARM_ARCH__ 4
++# elif defined(__ARM_ARCH_3__)
++# define __ARM_ARCH__ 3
+ # else
+ # error "unsupported ARM architecture"
+ # endif
diff --git a/sdk/recipes/patches/openssl/bio_lcl.h.p b/sdk/recipes/patches/openssl/crypto.bio.bio_local.h.p
index feae76f..e811d8b 100644
--- a/sdk/recipes/patches/openssl/bio_lcl.h.p
+++ b/sdk/recipes/patches/openssl/crypto.bio.bio_local.h.p
@@ -1,5 +1,5 @@
---- crypto/bio/bio_lcl.h.orig 2017-10-17 16:19:36.908150231 +0100
-+++ crypto/bio/bio_lcl.h 2017-10-17 16:19:52.056631064 +0100
+--- crypto/bio/bio_local.h.orig 2017-10-17 16:19:36.908150231 +0100
++++ crypto/bio/bio_local.h 2017-10-17 16:19:52.056631064 +0100
@@ -36,7 +36,7 @@
/*
* Undefine AF_UNIX on systems that define it but don't support it.
diff --git a/sdk/recipes/patches/openssl/crypto.rand.rand_unix.c.p b/sdk/recipes/patches/openssl/crypto.rand.rand_unix.c.p
index a4513f2..366cd19 100644
--- a/sdk/recipes/patches/openssl/crypto.rand.rand_unix.c.p
+++ b/sdk/recipes/patches/openssl/crypto.rand.rand_unix.c.p
@@ -1,11 +1,12 @@
---- crypto/rand/rand_unix.c.orig 2017-11-22 11:25:03.096636507 +0000
-+++ crypto/rand/rand_unix.c 2017-11-22 11:25:52.649406308 +0000
-@@ -15,7 +15,7 @@
- #include <openssl/rand.h>
- #include "rand_lcl.h"
+--- providers/implementations/rands/seeding/rand_unix.c.orig 2017-11-22 11:25:03.096636507 +0000
++++ providers/implementations/rands/seeding/rand_unix.c 2017-11-22 11:25:52.649406308 +0000
+@@ -109,7 +109,8 @@
--#if !(defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_UEFI))
-+#if !(defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_VXWORKS) || defined(OPENSSL_SYS_UEFI) || defined(OPENSSL_SYS_AMIGAOS3) || defined(OPENSSL_SYS_AMIGAOS4))
+ #if !(defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32) \
+ || defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_VXWORKS) \
+- || defined(OPENSSL_SYS_UEFI))
++ || defined(OPENSSL_SYS_UEFI) || defined(OPENSSL_SYS_AMIGAOS3) \
++ || defined(OPENSSL_SYS_AMIGAOS4))
+
+ # if defined(OPENSSL_SYS_VOS)
- # include <sys/types.h>
- # include <sys/time.h>
diff --git a/sdk/recipes/patches/openssl/e_os.h.p b/sdk/recipes/patches/openssl/e_os.h.p
new file mode 100644
index 0000000..07ed97e
--- /dev/null
+++ b/sdk/recipes/patches/openssl/e_os.h.p
@@ -0,0 +1,13 @@
+--- e_os.h.orig 2019-02-13 14:25:17.725058588 +0000
++++ e_os.h 2019-02-13 14:35:39.790029062 +0000
+@@ -399,6 +399,10 @@
+ # ifndef OPENSSL_NO_SECURE_MEMORY
+ /* unistd.h defines _POSIX_VERSION */
+ # if (defined(OPENSSL_SYS_UNIX) \
++ && !defined(OPENSSL_SYS_RISCOS) \
++ && !defined(OPENSSL_SYS_AMIGAOS3) \
++ && !defined(OPENSSL_SYS_AMIGAOS4) \
++ && !defined(OPENSSL_SYS_MINT) \
+ && ( (defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L) \
+ || defined(__sun) || defined(__hpux) || defined(__sgi) \
+ || defined(__osf__) )) \
diff --git a/sdk/recipes/patches/openssl/m5475-atari-mint/apps.lib.s_socket.c.p b/sdk/recipes/patches/openssl/m5475-atari-mint/apps.lib.s_socket.c.p
new file mode 100644
index 0000000..d659de7
--- /dev/null
+++ b/sdk/recipes/patches/openssl/m5475-atari-mint/apps.lib.s_socket.c.p
@@ -0,0 +1,12 @@
+--- apps/lib/s_socket.c.orig 2018-06-03 03:19:29.000000000 +0200
++++ apps/lib/s_socket.c 2018-06-03 03:19:36.000000000 +0200
+@@ -179,7 +179,9 @@
+ BIO_ADDRINFO_family(res) == AF_INET6 ? "IPv6 " :
+ #endif
+ BIO_ADDRINFO_family(res) == AF_INET ? "IPv4 " :
++#ifdef AF_UNIX
+ BIO_ADDRINFO_family(res) == AF_UNIX ? "unix " : "",
++#endif
+ bindhost != NULL ? bindhost : "",
+ bindport != NULL ? ":" : "",
+ bindport != NULL ? bindport : "");
diff --git a/sdk/recipes/patches/openssl/m5475-atari-mint/include.internal.sockets.h.p b/sdk/recipes/patches/openssl/m5475-atari-mint/include.internal.sockets.h.p
new file mode 100644
index 0000000..5ad3a7b
--- /dev/null
+++ b/sdk/recipes/patches/openssl/m5475-atari-mint/include.internal.sockets.h.p
@@ -0,0 +1,19 @@
+--- include/internal/sockets.h.orig 2018-06-03 03:19:29.000000000 +0200
++++ include/internal/sockets.h 2018-06-03 03:19:36.000000000 +0200
+@@ -124,6 +124,16 @@
+ # define OPENSSL_USE_IPV6 0
+ # endif
+ # endif
++/*
++ * We mean it
++ */
++# if (OPENSSL_USE_IPV6 == 0)
++# undef AF_INET6
++# warning undef AF_INET6
++# undef AF_UNIX
++# warning undef AF_UNIX
++# undef IPV6_V6ONLY
++# endif
+
+ # define get_last_socket_error() errno
+ # define clear_socket_error() errno=0
diff --git a/sdk/recipes/patches/openssl/m5475-atari-mint/include.openssl.e_os2.h.p b/sdk/recipes/patches/openssl/m5475-atari-mint/include.openssl.e_os2.h.p
new file mode 100644
index 0000000..8a47b6b
--- /dev/null
+++ b/sdk/recipes/patches/openssl/m5475-atari-mint/include.openssl.e_os2.h.p
@@ -0,0 +1,14 @@
+--- include/openssl/e_os2.h.orig 2018-06-03 03:39:16.000000000 +0200
++++ include/openssl/e_os2.h 2018-06-03 03:43:34.000000000 +0200
+@@ -212,6 +212,11 @@
+ # endif
+ # endif
+
++# ifdef __MINT__
++# define ossl_ssize_t int
++# define OSSL_SSIZE_MAX INT_MAX
++# endif
++
+ # if defined(OPENSSL_SYS_UEFI) && !defined(ossl_ssize_t)
+ # define ossl_ssize_t INTN
+ # define OSSL_SSIZE_MAX MAX_INTN
diff --git a/sdk/recipes/patches/openssl/m68k-atari-mint/apps.lib.s_socket.c.p b/sdk/recipes/patches/openssl/m68k-atari-mint/apps.lib.s_socket.c.p
new file mode 100644
index 0000000..d659de7
--- /dev/null
+++ b/sdk/recipes/patches/openssl/m68k-atari-mint/apps.lib.s_socket.c.p
@@ -0,0 +1,12 @@
+--- apps/lib/s_socket.c.orig 2018-06-03 03:19:29.000000000 +0200
++++ apps/lib/s_socket.c 2018-06-03 03:19:36.000000000 +0200
+@@ -179,7 +179,9 @@
+ BIO_ADDRINFO_family(res) == AF_INET6 ? "IPv6 " :
+ #endif
+ BIO_ADDRINFO_family(res) == AF_INET ? "IPv4 " :
++#ifdef AF_UNIX
+ BIO_ADDRINFO_family(res) == AF_UNIX ? "unix " : "",
++#endif
+ bindhost != NULL ? bindhost : "",
+ bindport != NULL ? ":" : "",
+ bindport != NULL ? bindport : "");
diff --git a/sdk/recipes/patches/openssl/m68k-atari-mint/crypto.bn.Makefile.p b/sdk/recipes/patches/openssl/m68k-atari-mint/crypto.bn.Makefile.p
deleted file mode 100644
index 8d3bfc6..0000000
--- a/sdk/recipes/patches/openssl/m68k-atari-mint/crypto.bn.Makefile.p
+++ /dev/null
@@ -1,12 +0,0 @@
---- crypto/bn/Makefile 2017-01-26 13:22:03.000000000 +0000
-+++ crypto/bn/Makefile 2017-02-11 15:24:31.133017711 +0000
-@@ -60,6 +60,9 @@ lib: $(LIBOBJ)
- $(RANLIB) $(LIB) || echo Never mind.
- @touch lib
-
-+bn_m68k.o: asm/bn_m68k.s
-+ $(CC) $(CFLAGS) -c -o $@ asm/bn_m68k.s
-+
- bn-586.s: asm/bn-586.pl ../perlasm/x86asm.pl
- $(PERL) asm/bn-586.pl $(PERLASM_SCHEME) $(CFLAGS) $(PROCESSOR) > $@
- co-586.s: asm/co-586.pl ../perlasm/x86asm.pl
diff --git a/sdk/recipes/patches/openssl/m68k-atari-mint/include.internal.sockets.h.p b/sdk/recipes/patches/openssl/m68k-atari-mint/include.internal.sockets.h.p
new file mode 100644
index 0000000..5ad3a7b
--- /dev/null
+++ b/sdk/recipes/patches/openssl/m68k-atari-mint/include.internal.sockets.h.p
@@ -0,0 +1,19 @@
+--- include/internal/sockets.h.orig 2018-06-03 03:19:29.000000000 +0200
++++ include/internal/sockets.h 2018-06-03 03:19:36.000000000 +0200
+@@ -124,6 +124,16 @@
+ # define OPENSSL_USE_IPV6 0
+ # endif
+ # endif
++/*
++ * We mean it
++ */
++# if (OPENSSL_USE_IPV6 == 0)
++# undef AF_INET6
++# warning undef AF_INET6
++# undef AF_UNIX
++# warning undef AF_UNIX
++# undef IPV6_V6ONLY
++# endif
+
+ # define get_last_socket_error() errno
+ # define clear_socket_error() errno=0
diff --git a/sdk/recipes/patches/openssl/m68k-atari-mint/include.openssl.e_os2.h.p b/sdk/recipes/patches/openssl/m68k-atari-mint/include.openssl.e_os2.h.p
new file mode 100644
index 0000000..8a47b6b
--- /dev/null
+++ b/sdk/recipes/patches/openssl/m68k-atari-mint/include.openssl.e_os2.h.p
@@ -0,0 +1,14 @@
+--- include/openssl/e_os2.h.orig 2018-06-03 03:39:16.000000000 +0200
++++ include/openssl/e_os2.h 2018-06-03 03:43:34.000000000 +0200
+@@ -212,6 +212,11 @@
+ # endif
+ # endif
+
++# ifdef __MINT__
++# define ossl_ssize_t int
++# define OSSL_SSIZE_MAX INT_MAX
++# endif
++
+ # if defined(OPENSSL_SYS_UEFI) && !defined(ossl_ssize_t)
+ # define ossl_ssize_t INTN
+ # define OSSL_SSIZE_MAX MAX_INTN
diff --git a/sdk/recipes/patches/openssl/m68k-unknown-amigaos/apps.apps.c.p b/sdk/recipes/patches/openssl/m68k-unknown-amigaos/apps.apps.c.p
index 947eeca..1e677d2 100644
--- a/sdk/recipes/patches/openssl/m68k-unknown-amigaos/apps.apps.c.p
+++ b/sdk/recipes/patches/openssl/m68k-unknown-amigaos/apps.apps.c.p
@@ -1,6 +1,6 @@
---- apps.c 2014-10-15 13:53:39.000000000 +0100
-+++ apps/apps.c 2015-01-05 21:02:13.650018727 +0000
-@@ -2872,10 +2872,11 @@ double app_tminterval(int stop, int user
+--- apps/lib/apps.c.orig 2014-10-15 13:53:39.000000000 +0100
++++ apps/lib/apps.c 2015-01-05 21:02:13.650018727 +0000
+@@ -2797,10 +2797,11 @@ double app_tminterval(int stop, int user
struct rusage rus;
struct timeval now;
static struct timeval tmstart;
diff --git a/sdk/recipes/patches/openssl/m68k-unknown-amigaos/apps.include.http_server.h.p b/sdk/recipes/patches/openssl/m68k-unknown-amigaos/apps.include.http_server.h.p
new file mode 100644
index 0000000..8d9684e
--- /dev/null
+++ b/sdk/recipes/patches/openssl/m68k-unknown-amigaos/apps.include.http_server.h.p
@@ -0,0 +1,11 @@
+--- apps/include/http_server.h.orig 2017-11-21 22:49:00.185608040 +0000
++++ apps/include/http_server.h 2017-11-21 22:49:21.488219518 +0000
+@@ -27,7 +27,7 @@
+ # endif
+
+ # if !defined(NO_FORK) && !defined(OPENSSL_NO_SOCK) \
+- && !defined(OPENSSL_NO_POSIX_IO)
++ && !defined(OPENSSL_NO_POSIX_IO) && !defined(NO_SYSLOG)
+ # define HTTP_DAEMON
+ # include <sys/types.h>
+ # include <sys/wait.h>
diff --git a/sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.bio.b_sock2.c.p b/sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.bio.b_sock2.c.p
index 1d506af..93db04c 100644
--- a/sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.bio.b_sock2.c.p
+++ b/sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.bio.b_sock2.c.p
@@ -1,14 +1,14 @@
---- crypto/bio/b_sock2.c.orig 2017-11-23 12:39:17.912640213 +0000
-+++ crypto/bio/b_sock2.c 2017-11-23 12:41:56.350294762 +0000
-@@ -94,6 +94,7 @@
+--- crypto/bio/bio_sock2.c.orig 2019-02-15 10:07:24.181612545 +0000
++++ crypto/bio/bio_sock2.c 2019-02-15 10:07:15.637654488 +0000
+@@ -98,6 +98,7 @@
}
}
+#if defined(TCP_NODELAY)
if (options & BIO_SOCK_NODELAY) {
- if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)) != 0) {
- SYSerr(SYS_F_SETSOCKOPT, get_last_socket_error());
-@@ -101,6 +102,7 @@
+ if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,
+ (const void *)&on, sizeof(on)) != 0) {
+@@ -107,6 +108,7 @@
return 0;
}
}
@@ -16,21 +16,19 @@
if (connect(sock, BIO_ADDR_sockaddr(addr),
BIO_ADDR_sockaddr_size(addr)) == -1) {
---- crypto/bio/b_sock2.c.orig 2017-11-23 12:43:56.318461652 +0000
-+++ crypto/bio/b_sock2.c 2017-11-23 12:44:36.139861658 +0000
-@@ -193,6 +193,7 @@
+@@ -252,6 +254,7 @@
}
}
+#if defined(TCP_NODELAY)
if (options & BIO_SOCK_NODELAY) {
- if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)) != 0) {
- SYSerr(SYS_F_SETSOCKOPT, get_last_socket_error());
-@@ -200,6 +201,7 @@
+ if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,
+ (const void *)&on, sizeof(on)) != 0) {
+@@ -261,6 +264,7 @@
return 0;
}
}
+#endif
- # ifdef IPV6_V6ONLY
- if ((options & BIO_SOCK_V6_ONLY) && BIO_ADDR_family(addr) == AF_INET6) {
+ /* On OpenBSD it is always ipv6 only with ipv6 sockets thus read-only */
+ # if defined(IPV6_V6ONLY) && !defined(__OpenBSD__)
diff --git a/sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.bn.bn_div.c.p b/sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.bn.bn_div.c.p
index 0d5492f..3fa3a53 100644
--- a/sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.bn.bn_div.c.p
+++ b/sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.bn.bn_div.c.p
@@ -1,6 +1,6 @@
--- crypto/bn/bn_div.c 2017-01-26 13:22:03.000000000 +0000
+++ crypto/bn/bn_div.c 2017-02-11 16:06:29.437010335 +0000
-@@ -175,6 +175,22 @@ int BN_div(BIGNUM *dv, BIGNUM *rem, cons
+@@ -194,6 +194,22 @@ int BN_div(BIGNUM *dv, BIGNUM *rem, cons
q; \
})
# define REMAINDER_IS_ALREADY_CALCULATED
diff --git a/sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.include.internal.md32_common.h.p b/sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.include.internal.md32_common.h.p
deleted file mode 100644
index 7447d54..0000000
--- a/sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.include.internal.md32_common.h.p
+++ /dev/null
@@ -1,36 +0,0 @@
---- crypto/include/internal/md32_common.h 2017-11-02 14:29:03.000000000 +0000
-+++ crypto/include/internal/md32_common.h 2018-07-23 20:12:11.228066913 +0100
-@@ -182,6 +182,9 @@
- # define HOST_l2c(l,c) (*((unsigned int *)(c))=(l), (c)+=4, (l))
- # endif
- # endif
-+# elif defined(__mc68020)
-+# define HOST_c2l(c,l) ({ asm volatile ("movel %0@+,%1" : "=a"(c), "=d"(l) : "0"(c)); })
-+# define HOST_l2c(l,c) ({ asm volatile ("movel %1,%0@+" : "=a"(c) : "d"(l), "0"(c)); })
- # endif
- # endif
- # if defined(__s390__) || defined(__s390x__)
-@@ -215,6 +218,22 @@
- # define HOST_l2c(l,c) ({ asm ("strv %1,%0" \
- :"=m"(*(unsigned int *)(c)) :"d"(l));\
- (c)+=4; (l); })
-+# elif defined(__mc68020)
-+# define HOST_c2l(c,l) ({ unsigned int r; \
-+ asm volatile ("movel %1@+,%0\n" \
-+ "rorw #8,%0\n" \
-+ "swap %0\n" \
-+ "rorw #8,%0\n" \
-+ : "=d"(r), "=a"(c) \
-+ : "1"(c)); \
-+ (l)=r; })
-+# define HOST_l2c(l,c) ({ unsigned int r=(l); \
-+ asm volatile ("rorw #8,%0\n" \
-+ "swap %0\n" \
-+ "rorw #8,%0\n" \
-+ "movel %0,%1@+\n" \
-+ : "=d"(r), "=a"(c) \
-+ : "0"(r), "1"(c)); })
- # endif
- # endif
- # if defined(__i386) || defined(__i386__) || defined(__x86_64) || defined(__x86_64__)
-
diff --git a/sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.rand.build.info.p b/sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.rand.build.info.p
deleted file mode 100644
index 58b672f..0000000
--- a/sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.rand.build.info.p
+++ /dev/null
@@ -1,9 +0,0 @@
---- crypto/rand/build.info.orig 2017-11-22 11:36:06.585363219 +0000
-+++ crypto/rand/build.info 2017-11-22 11:36:39.267232034 +0000
-@@ -1,4 +1,4 @@
- LIBS=../../libcrypto
- SOURCE[../../libcrypto]=\
-- md_rand.c randfile.c rand_lib.c rand_err.c rand_egd.c \
-- rand_win.c rand_unix.c rand_vms.c
-+ md_rand.c randfile.c rand_lib.c rand_err.c rand_amiga.c \
-+ rand_egd.c rand_win.c rand_unix.c rand_vms.c
diff --git a/sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.ui.ui_openssl.c.p b/sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.ui.ui_openssl.c.p
index 0448499..3407a48 100644
--- a/sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.ui.ui_openssl.c.p
+++ b/sdk/recipes/patches/openssl/m68k-unknown-amigaos/crypto.ui.ui_openssl.c.p
@@ -1,21 +1,21 @@
--- crypto/ui/ui_openssl.c.orig 2017-11-23 13:22:15.760078583 +0000
+++ crypto/ui/ui_openssl.c 2017-11-23 13:21:40.534382076 +0000
-@@ -99,6 +99,18 @@
+@@ -103,6 +103,18 @@
+ # undef SGTTY
+ # endif
- #endif
-
-+#if defined(OPENSSL_SYS_AMIGAOS3)
-+#undef TERMIOS
-+#undef TERMIO
-+#undef SGTTY
++# if defined(OPENSSL_SYS_AMIGAOS3)
++# undef TERMIOS
++# undef TERMIO
++# undef SGTTY
+struct termios { int foo; };
-+# define TTY_STRUCT struct termios
-+# define TTY_FLAGS foo
-+# define TTY_get(tty,data) /* tcgetattr(tty,data) */ -1
-+# define TTY_set(tty,data) /* tcsetattr(tty,TCSANOW,data) */ 0
-+# define ECHO 0
-+#endif
++# define TTY_STRUCT struct termios
++# define TTY_FLAGS foo
++# define TTY_get(tty,data) /* tcgetattr(tty,data) */ -1
++# define TTY_set(tty,data) /* tcsetattr(tty,TCSANOW,data) */ 0
++# define ECHO 0
++# endif
+
- #ifdef TERMIOS
- # include <termios.h>
- # define TTY_STRUCT struct termios
+ # ifdef TERMIOS
+ # include <termios.h>
+ # define TTY_STRUCT struct termios
diff --git a/sdk/recipes/patches/openssl/m68k-unknown-amigaos/include.openssl.e_os2.h.p b/sdk/recipes/patches/openssl/m68k-unknown-amigaos/include.openssl.e_os2.h.p
deleted file mode 100644
index 6ea1ec8..0000000
--- a/sdk/recipes/patches/openssl/m68k-unknown-amigaos/include.openssl.e_os2.h.p
+++ /dev/null
@@ -1,11 +0,0 @@
---- include/openssl/e_os2.h.orig 2017-11-21 23:09:39.684814614 +0000
-+++ include/openssl/e_os2.h 2017-11-21 23:10:32.501369938 +0000
-@@ -223,6 +223,8 @@
- # define OSSL_SSIZE_MAX SSIZE_MAX
- # elif defined(_POSIX_SSIZE_MAX)
- # define OSSL_SSIZE_MAX _POSIX_SSIZE_MAX
-+# else
-+# define OSSL_SSIZE_MAX INT_MAX
- # endif
- # endif
-
diff --git a/sdk/recipes/patches/openssl/m68k-unknown-amigaos/providers.implementations.rands.seeding.build.info.p b/sdk/recipes/patches/openssl/m68k-unknown-amigaos/providers.implementations.rands.seeding.build.info.p
new file mode 100644
index 0000000..c887eff
--- /dev/null
+++ b/sdk/recipes/patches/openssl/m68k-unknown-amigaos/providers.implementations.rands.seeding.build.info.p
@@ -0,0 +1,12 @@
+--- providers/implementations/rands/seeding/build.info.orig 2017-11-21 22:49:00.185608040 +0000
++++ providers/implementations/rands/seeding/build.info 2017-11-21 22:49:21.488219518 +0000
+@@ -5,6 +5,9 @@
+ IF[{- $config{target} =~ /vms/i -}]
+ $COMMON=$COMMON rand_vms.c
+ ENDIF
++IF[{- $config{target} =~ /amiga/i -}]
++ $COMMON=$COMMON rand_amiga.c
++ENDIF
+
+ SOURCE[../../../libdefault.a]=$COMMON
+
diff --git a/sdk/recipes/patches/openssl/mem_sec.c.p b/sdk/recipes/patches/openssl/mem_sec.c.p
deleted file mode 100644
index e209f75..0000000
--- a/sdk/recipes/patches/openssl/mem_sec.c.p
+++ /dev/null
@@ -1,15 +0,0 @@
---- crypto/mem_sec.c.orig 2019-02-13 14:25:17.725058588 +0000
-+++ crypto/mem_sec.c 2019-02-13 14:35:39.790029062 +0000
-@@ -25,7 +25,11 @@
- #include <string.h>
-
- /* e_os.h includes unistd.h, which defines _POSIX_VERSION */
--#if !defined(OPENSSL_NO_SECURE_MEMORY) && defined(OPENSSL_SYS_UNIX) \
-+#if !defined(OPENSSL_NO_SECURE_MEMORY) \
-+ && !defined(OPENSSL_SYS_RISCOS) \
-+ && !defined(OPENSSL_SYS_AMIGAOS3) \
-+ && !defined(OPENSSL_SYS_AMIGAOS4) \
-+ && defined(OPENSSL_SYS_UNIX) \
- && ( (defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112L) \
- || defined(__sun) || defined(__hpux) || defined(__sgi) \
- || defined(__osf__) )
diff --git a/sdk/recipes/patches/openssl/newlib-no-strtoiumax.p b/sdk/recipes/patches/openssl/newlib-no-strtoiumax.p
new file mode 100644
index 0000000..27f6a9d
--- /dev/null
+++ b/sdk/recipes/patches/openssl/newlib-no-strtoiumax.p
@@ -0,0 +1,22 @@
+--- apps/lib/opt.c.orig 2017-10-10 15:19:45.611896396 +0100
++++ apps/lib/opt.c 2017-10-17 15:42:25.304921197 +0100
+@@ -562,7 +562,7 @@
+
+ #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L && \
+ defined(INTMAX_MAX) && defined(UINTMAX_MAX) && \
+- !defined(OPENSSL_NO_INTTYPES_H)
++ !defined(OPENSSL_NO_INTTYPES_H) && !defined(OPENSSL_SYS_AMIGAOS3) && !defined(OPENSSL_SYS_AMIGAOS4)
+
+ /* Parse an intmax_t, put it into *result; return 0 on failure, else 1. */
+ int opt_intmax(const char *value, ossl_intmax_t *result)
+--- test/params_conversion_test.c.orig 2017-10-10 15:19:45.611896396 +0100
++++ test/params_conversion_test.c 2017-10-17 15:42:25.304921197 +0100
+@@ -15,7 +15,7 @@
+ /* On machines that dont support <inttypes.h> just disable the tests */
+ #if !defined(OPENSSL_NO_INTTYPES_H)
+
+-# ifdef OPENSSL_SYS_VMS
++# if defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_AMIGAOS3) || defined(OPENSSL_SYS_AMIGAOS4)
+ # define strtoumax strtoull
+ # define strtoimax strtoll
+ # endif
diff --git a/sdk/recipes/patches/openssl/ppc-amigaos/apps.include.http_server.h.p b/sdk/recipes/patches/openssl/ppc-amigaos/apps.include.http_server.h.p
new file mode 100644
index 0000000..8d9684e
--- /dev/null
+++ b/sdk/recipes/patches/openssl/ppc-amigaos/apps.include.http_server.h.p
@@ -0,0 +1,11 @@
+--- apps/include/http_server.h.orig 2017-11-21 22:49:00.185608040 +0000
++++ apps/include/http_server.h 2017-11-21 22:49:21.488219518 +0000
+@@ -27,7 +27,7 @@
+ # endif
+
+ # if !defined(NO_FORK) && !defined(OPENSSL_NO_SOCK) \
+- && !defined(OPENSSL_NO_POSIX_IO)
++ && !defined(OPENSSL_NO_POSIX_IO) && !defined(NO_SYSLOG)
+ # define HTTP_DAEMON
+ # include <sys/types.h>
+ # include <sys/wait.h>
diff --git a/sdk/recipes/patches/openssl/ppc-amigaos/atomics-are-broken.p b/sdk/recipes/patches/openssl/ppc-amigaos/atomics-are-broken.p
new file mode 100644
index 0000000..c6abf48
--- /dev/null
+++ b/sdk/recipes/patches/openssl/ppc-amigaos/atomics-are-broken.p
@@ -0,0 +1,22 @@
+--- include/internal/tsan_assist.h.orig 2017-11-21 22:49:00.185608040 +0000
++++ include/internal/tsan_assist.h 2017-11-21 22:49:21.488219518 +0000
+@@ -48,7 +48,7 @@
+ */
+
+ #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L \
+- && !defined(__STDC_NO_ATOMICS__)
++ && !defined(__STDC_NO_ATOMICS__) && !defined(__AMIGA__)
+ # include <stdatomic.h>
+
+ # if defined(ATOMIC_POINTER_LOCK_FREE) \
+--- include/internal/refcount.h.orig 2017-11-21 22:49:00.185608040 +0000
++++ include/internal/refcount.h 2017-11-21 22:49:21.488219518 +0000
+@@ -15,7 +15,7 @@
+
+ # if defined(OPENSSL_THREADS) && !defined(OPENSSL_DEV_NO_ATOMICS)
+ # if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L \
+- && !defined(__STDC_NO_ATOMICS__)
++ && !defined(__STDC_NO_ATOMICS__) && !defined(__AMIGA__)
+ # include <stdatomic.h>
+ # define HAVE_C11_ATOMICS
+ # endif
diff --git a/sdk/recipes/patches/openssl/ppc-amigaos/crypto.bio_b_addr.c.p b/sdk/recipes/patches/openssl/ppc-amigaos/crypto.bio_b_addr.c.p
index dd10e8c..ac14e86 100644
--- a/sdk/recipes/patches/openssl/ppc-amigaos/crypto.bio_b_addr.c.p
+++ b/sdk/recipes/patches/openssl/ppc-amigaos/crypto.bio_b_addr.c.p
@@ -1,6 +1,6 @@
---- crypto/bio/b_addr.c.orig 2017-11-21 22:49:00.185608040 +0000
-+++ crypto/bio/b_addr.c 2017-11-21 22:49:21.488219518 +0000
-@@ -854,7 +854,7 @@
+--- crypto/bio/bio_addr.c.orig 2017-11-21 22:49:00.185608040 +0000
++++ crypto/bio/bio_addr.c 2017-11-21 22:49:21.488219518 +0000
+@@ -910,7 +910,7 @@
addrlistp++)
;
diff --git a/sdk/recipes/patches/openssl/ppc-amigaos/crypto.ppccap.c.p b/sdk/recipes/patches/openssl/ppc-amigaos/crypto.ppccap.c.p
index 56949ca..46d6213 100644
--- a/sdk/recipes/patches/openssl/ppc-amigaos/crypto.ppccap.c.p
+++ b/sdk/recipes/patches/openssl/ppc-amigaos/crypto.ppccap.c.p
@@ -1,15 +1,15 @@
--- crypto/ppccap.c.orig 2017-11-22 13:14:44.655536374 +0000
+++ crypto/ppccap.c 2017-11-22 13:16:03.666387174 +0000
-@@ -135,6 +135,8 @@
- }
- #endif
+@@ -34,6 +34,8 @@
+
+ static sigset_t all_masked;
+#ifndef OPENSSL_SYS_AMIGAOS4
+
static sigjmp_buf ill_jmp;
static void ill_handler(int sig)
{
-@@ -341,3 +343,24 @@
+@@ -309,3 +311,29 @@
sigaction(SIGILL, &ill_oact, NULL);
sigprocmask(SIG_SETMASK, &oset, NULL);
}
@@ -33,4 +33,9 @@
+ OPENSSL_ppccap_P |= PPC_ALTIVEC;
+ }
+}
++
++uint32_t OPENSSL_rdtsc(void)
++{
++ return 0;
++}
+#endif
diff --git a/sdk/recipes/patches/openssl/ppc-amigaos/crypto.rand.build.info.p b/sdk/recipes/patches/openssl/ppc-amigaos/crypto.rand.build.info.p
deleted file mode 100644
index 58b672f..0000000
--- a/sdk/recipes/patches/openssl/ppc-amigaos/crypto.rand.build.info.p
+++ /dev/null
@@ -1,9 +0,0 @@
---- crypto/rand/build.info.orig 2017-11-22 11:36:06.585363219 +0000
-+++ crypto/rand/build.info 2017-11-22 11:36:39.267232034 +0000
-@@ -1,4 +1,4 @@
- LIBS=../../libcrypto
- SOURCE[../../libcrypto]=\
-- md_rand.c randfile.c rand_lib.c rand_err.c rand_egd.c \
-- rand_win.c rand_unix.c rand_vms.c
-+ md_rand.c randfile.c rand_lib.c rand_err.c rand_amiga.c \
-+ rand_egd.c rand_win.c rand_unix.c rand_vms.c
diff --git a/sdk/recipes/patches/openssl/ppc-amigaos/include.openssl.e_os2.h.p b/sdk/recipes/patches/openssl/ppc-amigaos/include.openssl.e_os2.h.p
deleted file mode 100644
index 6ea1ec8..0000000
--- a/sdk/recipes/patches/openssl/ppc-amigaos/include.openssl.e_os2.h.p
+++ /dev/null
@@ -1,11 +0,0 @@
---- include/openssl/e_os2.h.orig 2017-11-21 23:09:39.684814614 +0000
-+++ include/openssl/e_os2.h 2017-11-21 23:10:32.501369938 +0000
-@@ -223,6 +223,8 @@
- # define OSSL_SSIZE_MAX SSIZE_MAX
- # elif defined(_POSIX_SSIZE_MAX)
- # define OSSL_SSIZE_MAX _POSIX_SSIZE_MAX
-+# else
-+# define OSSL_SSIZE_MAX INT_MAX
- # endif
- # endif
-
diff --git a/sdk/recipes/patches/openssl/ppc-amigaos/providers.implementations.rands.seeding.build.info.p b/sdk/recipes/patches/openssl/ppc-amigaos/providers.implementations.rands.seeding.build.info.p
new file mode 100644
index 0000000..c887eff
--- /dev/null
+++ b/sdk/recipes/patches/openssl/ppc-amigaos/providers.implementations.rands.seeding.build.info.p
@@ -0,0 +1,12 @@
+--- providers/implementations/rands/seeding/build.info.orig 2017-11-21 22:49:00.185608040 +0000
++++ providers/implementations/rands/seeding/build.info 2017-11-21 22:49:21.488219518 +0000
+@@ -5,6 +5,9 @@
+ IF[{- $config{target} =~ /vms/i -}]
+ $COMMON=$COMMON rand_vms.c
+ ENDIF
++IF[{- $config{target} =~ /amiga/i -}]
++ $COMMON=$COMMON rand_amiga.c
++ENDIF
+
+ SOURCE[../../../libdefault.a]=$COMMON
+
diff --git a/sdk/recipes/patches/openssl/ppc-amigaos/test.rsa_complex.c.p b/sdk/recipes/patches/openssl/ppc-amigaos/test.rsa_complex.c.p
index a5fa68a..969062b 100644
--- a/sdk/recipes/patches/openssl/ppc-amigaos/test.rsa_complex.c.p
+++ b/sdk/recipes/patches/openssl/ppc-amigaos/test.rsa_complex.c.p
@@ -1,14 +1,14 @@
--- test/rsa_complex.c.orig 2019-02-14 10:16:06.665734720 +0000
+++ test/rsa_complex.c 2019-02-14 10:16:18.581682332 +0000
-@@ -12,11 +12,6 @@
- * The former defines "I" as a macro and earlier versions of the latter use
- * for function arguments.
+@@ -16,11 +16,6 @@
*/
--#if defined(__STDC_VERSION__)
--# if __STDC_VERSION__ >= 199901L
--# include <complex.h>
+
+ #if !defined(__DJGPP__)
+-# if defined(__STDC_VERSION__)
+-# if __STDC_VERSION__ >= 199901L
+-# include <complex.h>
+-# endif
-# endif
--#endif
- #include <openssl/rsa.h>
+ # include <openssl/rsa.h>
+ #endif
#include <stdlib.h>
-
diff --git a/sdk/recipes/patches/openssl/test.drbgtest.c.p b/sdk/recipes/patches/openssl/test.drbgtest.c.p
new file mode 100644
index 0000000..ecf3e81
--- /dev/null
+++ b/sdk/recipes/patches/openssl/test.drbgtest.c.p
@@ -0,0 +1,20 @@
+--- test/drbgtest.c.orig 2017-10-10 15:19:45.611896396 +0100
++++ test/drbgtest.c 2017-10-17 15:42:25.304921197 +0100
+@@ -277,7 +277,7 @@
+ }
+
+
+-#if defined(OPENSSL_SYS_UNIX) && !defined(OPENSSL_RAND_SEED_EGD)
++#if defined(OPENSSL_SYS_UNIX) && !defined(OPENSSL_RAND_SEED_EGD) && !defined(OPENSSL_SYS_AMIGAOS3) && !defined(OPENSSL_SYS_AMIGAOS4)
+ /* number of children to fork */
+ #define DRBG_FORK_COUNT 9
+ /* two results per child, two for the parent */
+@@ -895,7 +895,7 @@
+ int setup_tests(void)
+ {
+ ADD_TEST(test_rand_reseed);
+-#if defined(OPENSSL_SYS_UNIX) && !defined(OPENSSL_RAND_SEED_EGD)
++#if defined(OPENSSL_SYS_UNIX) && !defined(OPENSSL_RAND_SEED_EGD) && !defined(OPENSSL_SYS_AMIGAOS3) && !defined(OPENSSL_SYS_AMIGAOS4)
+ ADD_ALL_TESTS(test_rand_fork_safety, RANDOM_SIZE);
+ #endif
+ ADD_TEST(test_rand_prediction_resistance);
diff --git a/sdk/recipes/patches/windom/src.globals.h.p b/sdk/recipes/patches/windom/src.globals.h.p
new file mode 100644
index 0000000..34a7901
--- /dev/null
+++ b/sdk/recipes/patches/windom/src.globals.h.p
@@ -0,0 +1,19 @@
+--- src/globals.h.orig 2023-10-01 03:02:16.247962097 +0100
++++ src/globals.h 2023-10-01 03:03:20.403979699 +0100
+@@ -806,6 +806,8 @@
+ RSC header and support struct
+ *******************************************************************************/
+
++#ifndef __RSXHDR
++#define __RSXHDR
+ typedef struct { /* fichier ressource tendu */
+ UWORD rsh_vrsn; /* should be 3 */
+ UWORD rsh_extvrsn; /* not used, initialised to 'IN' for Interface */
+@@ -827,6 +829,7 @@
+ ULONG rsh_nimages;
+ ULONG rsh_rssize; /* total bytes in resource */
+ } RSXHDR;
++#endif
+
+ typedef struct {
+ unsigned long rlen;
diff --git a/sdk/recipes/patches/zlib/arm-riscos-gnueabi/configure.p b/sdk/recipes/patches/zlib/arm-riscos-gnueabi/configure.p
new file mode 100644
index 0000000..24d7a7e
--- /dev/null
+++ b/sdk/recipes/patches/zlib/arm-riscos-gnueabi/configure.p
@@ -0,0 +1,42 @@
+--- configure.orig 2012-05-02 05:17:08.000000000 +0100
++++ configure 2012-07-17 17:57:01.000000000 +0100
+@@ -423,18 +423,18 @@
+ echo >> configure.log
+
+ # check for large file support, and if none, check for fseeko()
+-cat > $test.c <<EOF
+-#include <sys/types.h>
+-off64_t dummy = 0;
+-EOF
+-if try $CC -c $CFLAGS -D_LARGEFILE64_SOURCE=1 $test.c; then
+- CFLAGS="${CFLAGS} -D_LARGEFILE64_SOURCE=1"
+- SFLAGS="${SFLAGS} -D_LARGEFILE64_SOURCE=1"
+- ALL="${ALL} all64"
+- TEST="${TEST} test64"
+- echo "Checking for off64_t... Yes." | tee -a configure.log
+- echo "Checking for fseeko... Yes." | tee -a configure.log
+-else
++#cat > $test.c <<EOF
++##include <sys/types.h>
++#off64_t dummy = 0;
++#EOF
++#if try $CC -c $CFLAGS -D_LARGEFILE64_SOURCE=1 $test.c; then
++# CFLAGS="${CFLAGS} -D_LARGEFILE64_SOURCE=1"
++# SFLAGS="${SFLAGS} -D_LARGEFILE64_SOURCE=1"
++# ALL="${ALL} all64"
++# TEST="${TEST} test64"
++# echo "Checking for off64_t... Yes." | tee -a configure.log
++# echo "Checking for fseeko... Yes." | tee -a configure.log
++#else
+ echo "Checking for off64_t... No." | tee -a configure.log
+ echo >> configure.log
+ cat > $test.c <<EOF
+@@ -451,7 +451,7 @@
+ SFLAGS="${SFLAGS} -DNO_FSEEKO"
+ echo "Checking for fseeko... No." | tee -a configure.log
+ fi
+-fi
++##fi
+
+ echo >> configure.log
+
diff --git a/x86_64-w64-mingw32/Makefile b/x86_64-w64-mingw32/Makefile
index 240411b..154be8f 100644
--- a/x86_64-w64-mingw32/Makefile
+++ b/x86_64-w64-mingw32/Makefile
@@ -2,28 +2,27 @@
# mingw toolchain
-UPSTREAM_GCC_VERSION := 4.8.4
-UPSTREAM_GCC_TARBALL := gcc-$(UPSTREAM_GCC_VERSION).tar.bz2
+UPSTREAM_GCC_VERSION := 12.2.0
+UPSTREAM_GCC_TARBALL := gcc-$(UPSTREAM_GCC_VERSION).tar.xz
UPSTREAM_GCC_URI := http://ftpmirror.gnu.org/gcc/gcc-$(UPSTREAM_GCC_VERSION)/$(UPSTREAM_GCC_TARBALL)
-UPSTREAM_BINUTILS_VERSION := 2.25
+UPSTREAM_BINUTILS_VERSION := 2.39
UPSTREAM_BINUTILS_TARBALL := binutils-$(UPSTREAM_BINUTILS_VERSION).tar.bz2
UPSTREAM_BINUTILS_URI := http://ftpmirror.gnu.org/binutils/$(UPSTREAM_BINUTILS_TARBALL)
-UPSTREAM_GMP_VERSION := 4.3.2
+UPSTREAM_GMP_VERSION := 6.2.1
UPSTREAM_GMP_TARBALL := gmp-$(UPSTREAM_GMP_VERSION).tar.bz2
UPSTREAM_GMP_URI := http://ftp.gnu.org/gnu/gmp/$(UPSTREAM_GMP_TARBALL)
-# Would use 3.0.0, but that dislikes in-tree gmp sources
-UPSTREAM_MPFR_VERSION := 2.4.2
-UPSTREAM_MPFR_TARBALL := mpfr-$(UPSTREAM_MPFR_VERSION).tar.bz2
+UPSTREAM_MPFR_VERSION := 4.2.0
+UPSTREAM_MPFR_TARBALL := mpfr-$(UPSTREAM_MPFR_VERSION).tar.xz
UPSTREAM_MPFR_URI := http://www.mpfr.org/mpfr-$(UPSTREAM_MPFR_VERSION)/$(UPSTREAM_MPFR_TARBALL)
-UPSTREAM_MPC_VERSION := 0.8.2
+UPSTREAM_MPC_VERSION := 1.3.0
UPSTREAM_MPC_TARBALL := mpc-$(UPSTREAM_MPC_VERSION).tar.gz
UPSTREAM_MPC_URI := http://www.multiprecision.org/downloads/$(UPSTREAM_MPC_TARBALL)
-UPSTREAM_MINGW_VERSION := 3.3.0
+UPSTREAM_MINGW_VERSION := 10.0.0
UPSTREAM_MINGW_TARBALL := mingw-w64-v$(UPSTREAM_MINGW_VERSION).tar.bz2
UPSTREAM_MINGW_URI := "http://downloads.sourceforge.net/project/mingw-w64/mingw-w64/mingw-w64-release/$(UPSTREAM_MINGW_TARBALL)?r=http%3A%2F%2Fmingw-w64.sourceforge.net%2Fdownload.php&ts=1426088797&use_mirror=cznic"
@@ -62,7 +61,7 @@ $(BUILDSTEPS)/gcc-core.d: $(BUILDSTEPS)/srcdir-step3.d $(BUILDSTEPS)/binutils.d
--prefix=$(PREFIX) --target=$(TARGET_NAME) \
--enable-languages=c,c++ --with-system-zlib --disable-multilib \
--enable-shared --enable-fully-dynamic-string
- cd $(BUILDDIR)/gcc && PATH="$(PREFIX)/bin:$(PATH)" make all-gcc -j 4
+ cd $(BUILDDIR)/gcc && PATH="$(PREFIX)/bin:$(PATH)" make all-gcc -j 8
cd $(BUILDDIR)/gcc && PATH="$(PREFIX)/bin:$(PATH)" make install-gcc
touch $@