From fe903c0d9292cf54f44ef3ee6054a1377f2655d1 Mon Sep 17 00:00:00 2001 From: John-Mark Bell Date: Thu, 3 Nov 2022 19:31:20 +0000 Subject: Drop "hf" from arm-riscos-gnueabihf ABI triplet The way we configure this toolchain means that it will generate Risc PC-compatible ARMv4 binaries using the soft-float ABI. These are not compatible with the ARMv7 hard-float binaries produced by the upstream compiler, so change the triplet to avoid confusion. --- arm-riscos-gnueabi/.gitignore | 2 + arm-riscos-gnueabi/Makefile | 201 ++ arm-riscos-gnueabi/fetchsrc | 16 + arm-riscos-gnueabi/recipes/files/gccsdk/Makefile | 447 +++++ .../recipes/files/gccsdk/config.sub.p | 11 + .../recipes/files/gccsdk/gccsdk-params | 8 + .../recipes/patches/gccsdk/elf2aif-eabi-support.p | 110 ++ .../patches/gccsdk/gcc-add-mhalfword-access.p | 153 ++ .../gccsdk/gcc-default-no-halfword-access.p | 13 + .../patches/gccsdk/gcc-libgcc-no-linux-atomics.p | 56 + .../recipes/patches/gccsdk/ld-armv4.p | 13 + .../recipes/patches/gccsdk/libtool.m4.p.p | 119 ++ .../recipes/patches/gccsdk/posix-extended-locale.p | 1920 ++++++++++++++++++++ .../patches/gccsdk/roinstall-objdump-name.p | 13 + .../recipes/patches/gccsdk/unixlib-armv4.p | 80 + .../recipes/patches/gccsdk/unixlib-initial-sp.p | 31 + .../patches/gccsdk/unixlib-no-armv7-memcpy.p | 34 + .../recipes/patches/gccsdk/unixlib-stdtime.p | 17 + .../gccsdk/unixlib-sync-and-fetch-atomics.p | 22 + .../recipes/patches/infozip/globals.p | 13 + arm-riscos-gnueabi/recipes/patches/infozip/zip.p | 58 + arm-riscos-gnueabi/recipes/patches/infozip/zipup.p | 162 ++ .../recipes/patches/oslib/buildsystem-elfeabi.p | 144 ++ .../recipes/patches/oslib/defmod-elfeabi.p | 84 + arm-riscos-gnueabi/recipes/patches/oslib/vapi.p | 10 + arm-riscos-gnueabihf/.gitignore | 2 - arm-riscos-gnueabihf/Makefile | 201 -- arm-riscos-gnueabihf/fetchsrc | 16 - arm-riscos-gnueabihf/recipes/files/gccsdk/Makefile | 447 ----- .../recipes/files/gccsdk/config.sub.p | 11 - .../recipes/files/gccsdk/gccsdk-params | 8 - .../recipes/patches/gccsdk/elf2aif-eabi-support.p | 110 -- .../patches/gccsdk/gcc-add-mhalfword-access.p | 153 -- .../gccsdk/gcc-default-no-halfword-access.p | 13 - .../patches/gccsdk/gcc-libgcc-no-linux-atomics.p | 56 - .../recipes/patches/gccsdk/ld-armv4.p | 13 - .../recipes/patches/gccsdk/libtool.m4.p.p | 119 -- .../recipes/patches/gccsdk/posix-extended-locale.p | 1920 -------------------- .../patches/gccsdk/roinstall-objdump-name.p | 13 - .../recipes/patches/gccsdk/unixlib-armv4.p | 80 - .../recipes/patches/gccsdk/unixlib-initial-sp.p | 31 - .../patches/gccsdk/unixlib-no-armv7-memcpy.p | 34 - .../recipes/patches/gccsdk/unixlib-stdtime.p | 17 - .../gccsdk/unixlib-sync-and-fetch-atomics.p | 22 - .../recipes/patches/infozip/globals.p | 13 - arm-riscos-gnueabihf/recipes/patches/infozip/zip.p | 58 - .../recipes/patches/infozip/zipup.p | 162 -- .../recipes/patches/oslib/buildsystem-elfeabi.p | 144 -- .../recipes/patches/oslib/defmod-elfeabi.p | 84 - arm-riscos-gnueabihf/recipes/patches/oslib/vapi.p | 10 - 50 files changed, 3737 insertions(+), 3737 deletions(-) create mode 100644 arm-riscos-gnueabi/.gitignore create mode 100644 arm-riscos-gnueabi/Makefile create mode 100755 arm-riscos-gnueabi/fetchsrc create mode 100644 arm-riscos-gnueabi/recipes/files/gccsdk/Makefile create mode 100644 arm-riscos-gnueabi/recipes/files/gccsdk/config.sub.p create mode 100644 arm-riscos-gnueabi/recipes/files/gccsdk/gccsdk-params create mode 100644 arm-riscos-gnueabi/recipes/patches/gccsdk/elf2aif-eabi-support.p create mode 100644 arm-riscos-gnueabi/recipes/patches/gccsdk/gcc-add-mhalfword-access.p create mode 100644 arm-riscos-gnueabi/recipes/patches/gccsdk/gcc-default-no-halfword-access.p create mode 100644 arm-riscos-gnueabi/recipes/patches/gccsdk/gcc-libgcc-no-linux-atomics.p create mode 100644 arm-riscos-gnueabi/recipes/patches/gccsdk/ld-armv4.p create mode 100644 arm-riscos-gnueabi/recipes/patches/gccsdk/libtool.m4.p.p create mode 100644 arm-riscos-gnueabi/recipes/patches/gccsdk/posix-extended-locale.p create mode 100644 arm-riscos-gnueabi/recipes/patches/gccsdk/roinstall-objdump-name.p create mode 100644 arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-armv4.p create mode 100644 arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-initial-sp.p create mode 100644 arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-no-armv7-memcpy.p create mode 100644 arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-stdtime.p create mode 100644 arm-riscos-gnueabi/recipes/patches/gccsdk/unixlib-sync-and-fetch-atomics.p create mode 100644 arm-riscos-gnueabi/recipes/patches/infozip/globals.p create mode 100644 arm-riscos-gnueabi/recipes/patches/infozip/zip.p create mode 100644 arm-riscos-gnueabi/recipes/patches/infozip/zipup.p create mode 100644 arm-riscos-gnueabi/recipes/patches/oslib/buildsystem-elfeabi.p create mode 100644 arm-riscos-gnueabi/recipes/patches/oslib/defmod-elfeabi.p create mode 100644 arm-riscos-gnueabi/recipes/patches/oslib/vapi.p delete mode 100644 arm-riscos-gnueabihf/.gitignore delete mode 100644 arm-riscos-gnueabihf/Makefile delete mode 100755 arm-riscos-gnueabihf/fetchsrc delete mode 100644 arm-riscos-gnueabihf/recipes/files/gccsdk/Makefile delete mode 100644 arm-riscos-gnueabihf/recipes/files/gccsdk/config.sub.p delete mode 100644 arm-riscos-gnueabihf/recipes/files/gccsdk/gccsdk-params delete mode 100644 arm-riscos-gnueabihf/recipes/patches/gccsdk/elf2aif-eabi-support.p delete mode 100644 arm-riscos-gnueabihf/recipes/patches/gccsdk/gcc-add-mhalfword-access.p delete mode 100644 arm-riscos-gnueabihf/recipes/patches/gccsdk/gcc-default-no-halfword-access.p delete mode 100644 arm-riscos-gnueabihf/recipes/patches/gccsdk/gcc-libgcc-no-linux-atomics.p delete mode 100644 arm-riscos-gnueabihf/recipes/patches/gccsdk/ld-armv4.p delete mode 100644 arm-riscos-gnueabihf/recipes/patches/gccsdk/libtool.m4.p.p delete mode 100644 arm-riscos-gnueabihf/recipes/patches/gccsdk/posix-extended-locale.p delete mode 100644 arm-riscos-gnueabihf/recipes/patches/gccsdk/roinstall-objdump-name.p delete mode 100644 arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-armv4.p delete mode 100644 arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-initial-sp.p delete mode 100644 arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-no-armv7-memcpy.p delete mode 100644 arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-stdtime.p delete mode 100644 arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-sync-and-fetch-atomics.p delete mode 100644 arm-riscos-gnueabihf/recipes/patches/infozip/globals.p delete mode 100644 arm-riscos-gnueabihf/recipes/patches/infozip/zip.p delete mode 100644 arm-riscos-gnueabihf/recipes/patches/infozip/zipup.p delete mode 100644 arm-riscos-gnueabihf/recipes/patches/oslib/buildsystem-elfeabi.p delete mode 100644 arm-riscos-gnueabihf/recipes/patches/oslib/defmod-elfeabi.p delete mode 100644 arm-riscos-gnueabihf/recipes/patches/oslib/vapi.p 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..74e64c2 --- /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 := abdbd16 +UPSTREAM_MAKERUN_TARBALL := makerun$(UPSTREAM_MAKERUN_VERSION).tar.gz +UPSTREAM_MAKERUN_URI := git://git.netsurf-browser.org/makerun.git + +# Squeeze +UPSTREAM_SQUEEZE_VERSION := f26ccd6 +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 + +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/elf2aif-eabi-support.p b/arm-riscos-gnueabi/recipes/patches/gccsdk/elf2aif-eabi-support.p new file mode 100644 index 0000000..1d8b841 --- /dev/null +++ b/arm-riscos-gnueabi/recipes/patches/gccsdk/elf2aif-eabi-support.p @@ -0,0 +1,110 @@ +Index: elf2aif/src/elf2aif.c +=================================================================== +--- elf2aif/src/elf2aif.c (revision 7698) ++++ elf2aif/src/elf2aif.c (working copy) +@@ -72,12 +72,13 @@ + } 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 const unsigned int aifcode[] = { ++static const uint32_t aifcode[] = { + 0xE1A00000, /* NOP (BL decompress) */ + 0xE1A00000, /* NOP (BL self-relocate) */ + 0xEB00000C, /* BL zero-init */ +@@ -113,6 +114,24 @@ + 0xEAFFFFFB /* B zeroloop */ + }; + ++static const uint32_t crt0code[] = { ++ 0xE59F3010, /* LDR R3, =crt1_data */ ++ 0xE583000C, /* STR R0, [R3, #12] */ ++ 0xE583101C, /* STR R1, [R3, #28] */ ++ 0xE5832020, /* STR R2, [R3, #32] */ ++ 0xE1A00003 /* MOV R0, R3 */ ++ /* B __main */ ++}; ++ ++static const uint32_t eabi_crt0code[] = { ++ 0xE59F3010, /* LDR R3, =crt1_data */ ++ 0xE583000C, /* STR R0, [R3, #12] */ ++ 0xE3A00002, /* MOV R0, #2 */ ++ 0xEF059D01, /* SWI ARMEABISupport_AbortOp */ ++ 0xE1A00003 /* MOV R0, R3 */ ++ /* B __main */ ++}; ++ + /* Read a little-endian 'short' value. */ + static uint16_t + RdShort (const uint8_t sh[2]) +@@ -143,6 +162,7 @@ + fprintf (stderr, "Usage: elf2aif [options] []\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 +221,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; +@@ -503,6 +524,37 @@ + return EXIT_FAILURE; + } + ++ /* In the EABI case we need to inject the code to install ++ * the ARMEABISupport abort handler */ ++ if (opt_eabi) ++ { ++ uint32_t crt0[5]; ++ assert(sizeof (crt0code) == sizeof (crt0)); ++ assert(sizeof (eabi_crt0code) == sizeof (crt0)); ++ ++ if (opt_verbose) ++ printf ("Rewriting crt0 at offset 0x%x\n", (exec_addr - load_addr)); ++ ++ if (fseek (elfhandle, (exec_addr - load_addr), SEEK_SET) != 0 || ++ fread (crt0, sizeof (crt0), 1, elfhandle) != 1) ++ { ++ fprintf (stderr, "Failed to read crt0\n"); ++ return EXIT_FAILURE; ++ } ++ if (memcmp(crt0, crt0code, sizeof (crt0)) != 0) ++ { ++ fprintf (stderr, "crt0 code not as expected\n"); ++ return EXIT_FAILURE; ++ } ++ if (fseek (aifhandle, (exec_addr - load_addr), SEEK_SET) != 0 || ++ fwrite (eabi_crt0code, sizeof (crt0), 1, aifhandle) != 1 || ++ fseek (aifhandle, aifend, SEEK_SET) != 0) ++ { ++ fprintf (stderr, "Failed to write crt0\n"); ++ return EXIT_FAILURE; ++ } ++ } ++ + return EXIT_SUCCESS; + } + +@@ -683,6 +735,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 +-# . +- +-# 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 + #include + +-/* 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 ++#include + + 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 ++#include + + 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 ++#include + + 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 ++#include + + 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 ++#include + + 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 ++#include + + 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 ++#include + + 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 ++#include + + 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 ++#include + + 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 ++#include + + 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 ++#include + + 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 ++#include + + 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 ++#include + + 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 ++ ++/* 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 for +- more information. */ ++#ifdef __USE_XOPEN2K8 ++# include + +-/* Get locale datatype definition. */ +-# include +- + /* 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 ++ + 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 ++ ++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 ++ ++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 + ++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 ++# include + + 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 " into "#include " + * - 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 ++# include + + /* 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 ++#include ++#include + #include +-#include + #include +-#include ++#include + +-struct _locale { +- struct lconv lc; +-}; ++#include + + /* 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 +- +-/* 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 + #include + #include ++#include + + 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 + #include + #include ++#include + + 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 ++#include + #include + + 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 ++#include + #include + #include +-#include +-#include + + 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/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 | > ] " + "[-byte_wide ] " + "[-26bit | -32bit] " +- "[-asmtype [objasm | asasmaof | asasmelf | gccaof | armasm | gccelf]] " ++ "[-asmtype [objasm | asasmaof | asasmelf | gccaof | armasm | gccelf | gccelfeabi]] " + "[-float-abi [soft | hard]] " + "< \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 + #include + #include ++#include + + #include "oslib/os.h" + diff --git a/arm-riscos-gnueabihf/.gitignore b/arm-riscos-gnueabihf/.gitignore deleted file mode 100644 index e6483c4..0000000 --- a/arm-riscos-gnueabihf/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -builddir -sources diff --git a/arm-riscos-gnueabihf/Makefile b/arm-riscos-gnueabihf/Makefile deleted file mode 100644 index 1deec0f..0000000 --- a/arm-riscos-gnueabihf/Makefile +++ /dev/null @@ -1,201 +0,0 @@ -# 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 := abdbd16 -UPSTREAM_MAKERUN_TARBALL := makerun$(UPSTREAM_MAKERUN_VERSION).tar.gz -UPSTREAM_MAKERUN_URI := git://git.netsurf-browser.org/makerun.git - -# Squeeze -UPSTREAM_SQUEEZE_VERSION := f26ccd6 -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-gnueabihf - -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-gnueabihf/fetchsrc b/arm-riscos-gnueabihf/fetchsrc deleted file mode 100755 index 92ae5bf..0000000 --- a/arm-riscos-gnueabihf/fetchsrc +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -# script to fetch toolchain source tar using ci.netsurf-browser.org as a cache - -# Usage fetchsrc - -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-gnueabihf/recipes/files/gccsdk/Makefile b/arm-riscos-gnueabihf/recipes/files/gccsdk/Makefile deleted file mode 100644 index 4e3467b..0000000 --- a/arm-riscos-gnueabihf/recipes/files/gccsdk/Makefile +++ /dev/null @@ -1,447 +0,0 @@ -# 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-gnueabihf -TARGET=arm-riscos-gnueabihf -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-gnueabihf/recipes/files/gccsdk/config.sub.p b/arm-riscos-gnueabihf/recipes/files/gccsdk/config.sub.p deleted file mode 100644 index 181b56f..0000000 --- a/arm-riscos-gnueabihf/recipes/files/gccsdk/config.sub.p +++ /dev/null @@ -1,11 +0,0 @@ ---- 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-gnueabihf/recipes/files/gccsdk/gccsdk-params b/arm-riscos-gnueabihf/recipes/files/gccsdk/gccsdk-params deleted file mode 100644 index 4f48c3c..0000000 --- a/arm-riscos-gnueabihf/recipes/files/gccsdk/gccsdk-params +++ /dev/null @@ -1,8 +0,0 @@ -# -- 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-gnueabihf/recipes/patches/gccsdk/elf2aif-eabi-support.p b/arm-riscos-gnueabihf/recipes/patches/gccsdk/elf2aif-eabi-support.p deleted file mode 100644 index 1d8b841..0000000 --- a/arm-riscos-gnueabihf/recipes/patches/gccsdk/elf2aif-eabi-support.p +++ /dev/null @@ -1,110 +0,0 @@ -Index: elf2aif/src/elf2aif.c -=================================================================== ---- elf2aif/src/elf2aif.c (revision 7698) -+++ elf2aif/src/elf2aif.c (working copy) -@@ -72,12 +72,13 @@ - } 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 const unsigned int aifcode[] = { -+static const uint32_t aifcode[] = { - 0xE1A00000, /* NOP (BL decompress) */ - 0xE1A00000, /* NOP (BL self-relocate) */ - 0xEB00000C, /* BL zero-init */ -@@ -113,6 +114,24 @@ - 0xEAFFFFFB /* B zeroloop */ - }; - -+static const uint32_t crt0code[] = { -+ 0xE59F3010, /* LDR R3, =crt1_data */ -+ 0xE583000C, /* STR R0, [R3, #12] */ -+ 0xE583101C, /* STR R1, [R3, #28] */ -+ 0xE5832020, /* STR R2, [R3, #32] */ -+ 0xE1A00003 /* MOV R0, R3 */ -+ /* B __main */ -+}; -+ -+static const uint32_t eabi_crt0code[] = { -+ 0xE59F3010, /* LDR R3, =crt1_data */ -+ 0xE583000C, /* STR R0, [R3, #12] */ -+ 0xE3A00002, /* MOV R0, #2 */ -+ 0xEF059D01, /* SWI ARMEABISupport_AbortOp */ -+ 0xE1A00003 /* MOV R0, R3 */ -+ /* B __main */ -+}; -+ - /* Read a little-endian 'short' value. */ - static uint16_t - RdShort (const uint8_t sh[2]) -@@ -143,6 +162,7 @@ - fprintf (stderr, "Usage: elf2aif [options] []\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 +221,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; -@@ -503,6 +524,37 @@ - return EXIT_FAILURE; - } - -+ /* In the EABI case we need to inject the code to install -+ * the ARMEABISupport abort handler */ -+ if (opt_eabi) -+ { -+ uint32_t crt0[5]; -+ assert(sizeof (crt0code) == sizeof (crt0)); -+ assert(sizeof (eabi_crt0code) == sizeof (crt0)); -+ -+ if (opt_verbose) -+ printf ("Rewriting crt0 at offset 0x%x\n", (exec_addr - load_addr)); -+ -+ if (fseek (elfhandle, (exec_addr - load_addr), SEEK_SET) != 0 || -+ fread (crt0, sizeof (crt0), 1, elfhandle) != 1) -+ { -+ fprintf (stderr, "Failed to read crt0\n"); -+ return EXIT_FAILURE; -+ } -+ if (memcmp(crt0, crt0code, sizeof (crt0)) != 0) -+ { -+ fprintf (stderr, "crt0 code not as expected\n"); -+ return EXIT_FAILURE; -+ } -+ if (fseek (aifhandle, (exec_addr - load_addr), SEEK_SET) != 0 || -+ fwrite (eabi_crt0code, sizeof (crt0), 1, aifhandle) != 1 || -+ fseek (aifhandle, aifend, SEEK_SET) != 0) -+ { -+ fprintf (stderr, "Failed to write crt0\n"); -+ return EXIT_FAILURE; -+ } -+ } -+ - return EXIT_SUCCESS; - } - -@@ -683,6 +735,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-gnueabihf/recipes/patches/gccsdk/gcc-add-mhalfword-access.p b/arm-riscos-gnueabihf/recipes/patches/gccsdk/gcc-add-mhalfword-access.p deleted file mode 100644 index 43061b9..0000000 --- a/arm-riscos-gnueabihf/recipes/patches/gccsdk/gcc-add-mhalfword-access.p +++ /dev/null @@ -1,153 +0,0 @@ -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-gnueabihf/recipes/patches/gccsdk/gcc-default-no-halfword-access.p b/arm-riscos-gnueabihf/recipes/patches/gccsdk/gcc-default-no-halfword-access.p deleted file mode 100644 index 400341f..0000000 --- a/arm-riscos-gnueabihf/recipes/patches/gccsdk/gcc-default-no-halfword-access.p +++ /dev/null @@ -1,13 +0,0 @@ -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-gnueabihf/recipes/patches/gccsdk/gcc-libgcc-no-linux-atomics.p b/arm-riscos-gnueabihf/recipes/patches/gccsdk/gcc-libgcc-no-linux-atomics.p deleted file mode 100644 index 12a88ac..0000000 --- a/arm-riscos-gnueabihf/recipes/patches/gccsdk/gcc-libgcc-no-linux-atomics.p +++ /dev/null @@ -1,56 +0,0 @@ -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 --# . -- --# 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-gnueabihf) - + 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-gnueabihf/recipes/patches/gccsdk/ld-armv4.p b/arm-riscos-gnueabihf/recipes/patches/gccsdk/ld-armv4.p deleted file mode 100644 index ae85eb0..0000000 --- a/arm-riscos-gnueabihf/recipes/patches/gccsdk/ld-armv4.p +++ /dev/null @@ -1,13 +0,0 @@ -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-gnueabihf/recipes/patches/gccsdk/libtool.m4.p.p b/arm-riscos-gnueabihf/recipes/patches/gccsdk/libtool.m4.p.p deleted file mode 100644 index 8061b92..0000000 --- a/arm-riscos-gnueabihf/recipes/patches/gccsdk/libtool.m4.p.p +++ /dev/null @@ -1,119 +0,0 @@ -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-gnueabihf/recipes/patches/gccsdk/posix-extended-locale.p b/arm-riscos-gnueabihf/recipes/patches/gccsdk/posix-extended-locale.p deleted file mode 100644 index e422786..0000000 --- a/arm-riscos-gnueabihf/recipes/patches/gccsdk/posix-extended-locale.p +++ /dev/null @@ -1,1920 +0,0 @@ -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 - #include - --/* 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 -+#include - - 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 -+#include - - 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 -+#include - - 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 -+#include - - 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 -+#include - - 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 -+#include - - 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 -+#include - - 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 -+#include - - 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 -+#include - - 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 -+#include - - 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 -+#include - - 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 -+#include - - 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 -+#include - - 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 -+ -+/* 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 for -- more information. */ -+#ifdef __USE_XOPEN2K8 -+# include - --/* Get locale datatype definition. */ --# include -- - /* 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 -+ - 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 -+ -+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 -+ -+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 - -+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 -+# include - - 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 " into "#include " - * - 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 -+# include - - /* 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 -+#include -+#include - #include --#include - #include --#include -+#include - --struct _locale { -- struct lconv lc; --}; -+#include - - /* 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 -- --/* 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 - #include - #include -+#include - - 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 - #include - #include -+#include - - 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 -+#include - #include - - 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 -+#include - #include - #include --#include --#include - - 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-gnueabihf/recipes/patches/gccsdk/roinstall-objdump-name.p b/arm-riscos-gnueabihf/recipes/patches/gccsdk/roinstall-objdump-name.p deleted file mode 100644 index 7451829..0000000 --- a/arm-riscos-gnueabihf/recipes/patches/gccsdk/roinstall-objdump-name.p +++ /dev/null @@ -1,13 +0,0 @@ -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-gnueabihf-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-gnueabihf/recipes/patches/gccsdk/unixlib-armv4.p b/arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-armv4.p deleted file mode 100644 index 1343d13..0000000 --- a/arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-armv4.p +++ /dev/null @@ -1,80 +0,0 @@ -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-gnueabihf/recipes/patches/gccsdk/unixlib-initial-sp.p b/arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-initial-sp.p deleted file mode 100644 index f3309c2..0000000 --- a/arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-initial-sp.p +++ /dev/null @@ -1,31 +0,0 @@ -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-gnueabihf/recipes/patches/gccsdk/unixlib-no-armv7-memcpy.p b/arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-no-armv7-memcpy.p deleted file mode 100644 index c89d6ab..0000000 --- a/arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-no-armv7-memcpy.p +++ /dev/null @@ -1,34 +0,0 @@ -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-gnueabihf/recipes/patches/gccsdk/unixlib-stdtime.p b/arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-stdtime.p deleted file mode 100644 index 3ad890a..0000000 --- a/arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-stdtime.p +++ /dev/null @@ -1,17 +0,0 @@ -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-gnueabihf/recipes/patches/gccsdk/unixlib-sync-and-fetch-atomics.p b/arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-sync-and-fetch-atomics.p deleted file mode 100644 index f9764ba..0000000 --- a/arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-sync-and-fetch-atomics.p +++ /dev/null @@ -1,22 +0,0 @@ -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-gnueabihf/recipes/patches/infozip/globals.p b/arm-riscos-gnueabihf/recipes/patches/infozip/globals.p deleted file mode 100644 index c10adfa..0000000 --- a/arm-riscos-gnueabihf/recipes/patches/infozip/globals.p +++ /dev/null @@ -1,13 +0,0 @@ ---- 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-gnueabihf/recipes/patches/infozip/zip.p b/arm-riscos-gnueabihf/recipes/patches/infozip/zip.p deleted file mode 100644 index aee2b24..0000000 --- a/arm-riscos-gnueabihf/recipes/patches/infozip/zip.p +++ /dev/null @@ -1,58 +0,0 @@ ---- 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-gnueabihf/recipes/patches/infozip/zipup.p b/arm-riscos-gnueabihf/recipes/patches/infozip/zipup.p deleted file mode 100644 index f4d43d0..0000000 --- a/arm-riscos-gnueabihf/recipes/patches/infozip/zipup.p +++ /dev/null @@ -1,162 +0,0 @@ ---- 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-gnueabihf/recipes/patches/oslib/buildsystem-elfeabi.p b/arm-riscos-gnueabihf/recipes/patches/oslib/buildsystem-elfeabi.p deleted file mode 100644 index a729f9e..0000000 --- a/arm-riscos-gnueabihf/recipes/patches/oslib/buildsystem-elfeabi.p +++ /dev/null @@ -1,144 +0,0 @@ -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-gnueabihf-gcc $(CCFLAGS) -+export CXX := arm-riscos-gnueabihf-g++ $(CCFLAGS) -+export AS := arm-riscos-gnueabihf-gcc -c -xassembler-with-cpp $(CCFLAGS) -I.. -I$(SOURCEDIR)/Types -+export LIBFILE := arm-riscos-gnueabihf-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-gnueabihf/recipes/patches/oslib/defmod-elfeabi.p b/arm-riscos-gnueabihf/recipes/patches/oslib/defmod-elfeabi.p deleted file mode 100644 index 97e15f8..0000000 --- a/arm-riscos-gnueabihf/recipes/patches/oslib/defmod-elfeabi.p +++ /dev/null @@ -1,84 +0,0 @@ -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-gnueabihf-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 | > ] " - "[-byte_wide ] " - "[-26bit | -32bit] " -- "[-asmtype [objasm | asasmaof | asasmelf | gccaof | armasm | gccelf]] " -+ "[-asmtype [objasm | asasmaof | asasmelf | gccaof | armasm | gccelf | gccelfeabi]] " - "[-float-abi [soft | hard]] " - "< \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-gnueabihf/recipes/patches/oslib/vapi.p b/arm-riscos-gnueabihf/recipes/patches/oslib/vapi.p deleted file mode 100644 index a3daf40..0000000 --- a/arm-riscos-gnueabihf/recipes/patches/oslib/vapi.p +++ /dev/null @@ -1,10 +0,0 @@ ---- 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 - #include - #include -+#include - - #include "oslib/os.h" - -- cgit v1.2.3