From f4efb25ae9e8845ae8c154f85efe96ba97b2ed80 Mon Sep 17 00:00:00 2001 From: Thomas Bernard Date: Tue, 12 Dec 2017 21:47:15 +0100 Subject: [PATCH] New package: arm-none-eabi-newlib Newlib package for arm bare metal toolchain --- .../enable-with-multilib-list-for-arm.patch | 215 ++++++++++++++++++ .../files/fix-cxxflags-passing.patch | 1 + srcpkgs/arm-none-eabi-newlib/template | 190 ++++++++++++++++ 3 files changed, 406 insertions(+) create mode 100644 srcpkgs/arm-none-eabi-newlib/files/enable-with-multilib-list-for-arm.patch create mode 120000 srcpkgs/arm-none-eabi-newlib/files/fix-cxxflags-passing.patch create mode 100644 srcpkgs/arm-none-eabi-newlib/template diff --git a/srcpkgs/arm-none-eabi-newlib/files/enable-with-multilib-list-for-arm.patch b/srcpkgs/arm-none-eabi-newlib/files/enable-with-multilib-list-for-arm.patch new file mode 100644 index 00000000000..8825c30ca1b --- /dev/null +++ b/srcpkgs/arm-none-eabi-newlib/files/enable-with-multilib-list-for-arm.patch @@ -0,0 +1,215 @@ +commit 71587241301d28b68bbe2f41c5eb2856053c750c +Author: Anatol Pomozov +Date: Tue May 9 21:19:27 2017 -0700 + + ARM patch https://gcc.gnu.org/ml/gcc-patches/2012-05/msg00083/enable-with-multilib-list-for-arm.patch + +diff --git a/gcc/Makefile.in b/gcc/Makefile.in +index f675e073ecc..cced5329b47 100644 +--- a/gcc/Makefile.in ++++ b/gcc/Makefile.in +@@ -558,6 +558,7 @@ lang_opt_files=@lang_opt_files@ $(srcdir)/c-family/c.opt $(srcdir)/common.opt + lang_specs_files=@lang_specs_files@ + lang_tree_files=@lang_tree_files@ + target_cpu_default=@target_cpu_default@ ++with_multilib_list=@with_multilib_list@ + OBJC_BOEHM_GC=@objc_boehm_gc@ + extra_modes_file=@extra_modes_file@ + extra_opt_files=@extra_opt_files@ +diff --git a/gcc/config.gcc b/gcc/config.gcc +index b8bb4d65825..713e35b62af 100644 +--- a/gcc/config.gcc ++++ b/gcc/config.gcc +@@ -1140,7 +1140,7 @@ arm*-*-eabi* | arm*-*-symbianelf* | arm*-*-rtems* | arm*-*-fuchsia*) + case ${target} in + arm*-*-eabi*) + tm_file="$tm_file newlib-stdint.h" +- tmake_file="${tmake_file} arm/t-bpabi" ++ tmake_file="${tmake_file} arm/t-bpabi arm/t-mlibs" + use_gcc_stdint=wrap + ;; + arm*-*-fuchsia*) +@@ -3787,56 +3787,6 @@ case "${target}" in + echo "Switch \"--with-tune\" may not be used with switch \"--with-cpu\"" 1>&2 + exit 1 + fi +- +- # Add extra multilibs +- if test "x$with_multilib_list" != x; then +- arm_multilibs=`echo $with_multilib_list | sed -e 's/,/ /g'` +- case ${arm_multilibs} in +- aprofile) +- # Note that arm/t-aprofile is a +- # stand-alone make file fragment to be +- # used only with itself. We do not +- # specifically use the +- # TM_MULTILIB_OPTION framework because +- # this shorthand is more +- # pragmatic. +- tmake_profile_file="arm/t-aprofile" +- ;; +- rmprofile) +- # Note that arm/t-rmprofile is a +- # stand-alone make file fragment to be +- # used only with itself. We do not +- # specifically use the +- # TM_MULTILIB_OPTION framework because +- # this shorthand is more +- # pragmatic. +- tmake_profile_file="arm/t-rmprofile" +- ;; +- default) +- ;; +- *) +- echo "Error: --with-multilib-list=${with_multilib_list} not supported." 1>&2 +- exit 1 +- ;; +- esac +- +- if test "x${tmake_profile_file}" != x ; then +- # arm/t-aprofile and arm/t-rmprofile are only +- # designed to work without any with-cpu, +- # with-arch, with-mode, with-fpu or with-float +- # options. +- if test "x$with_arch" != x \ +- || test "x$with_cpu" != x \ +- || test "x$with_float" != x \ +- || test "x$with_fpu" != x \ +- || test "x$with_mode" != x ; then +- echo "Error: You cannot use any of --with-arch/cpu/fpu/float/mode with --with-multilib-list=${with_multilib_list}" 1>&2 +- exit 1 +- fi +- +- tmake_file="${tmake_file} ${tmake_profile_file}" +- fi +- fi + ;; + + fr*-*-*linux*) +diff --git a/gcc/config/arm/t-mlibs b/gcc/config/arm/t-mlibs +new file mode 100644 +index 00000000000..5720cf7503d +--- /dev/null ++++ b/gcc/config/arm/t-mlibs +@@ -0,0 +1,89 @@ ++# A set of predefined MULTILIB which can be used for different ARM targets. ++# Via the configure option --with-multilib-list, user can customize the ++# final MULTILIB implementation. ++ ++comma := , ++space := ++space += ++ ++MULTILIB_OPTIONS = mthumb/marm ++MULTILIB_DIRNAMES = thumb arm ++MULTILIB_OPTIONS += march=armv6s-m/march=armv7-m/march=armv7e-m/march=armv7 ++MULTILIB_DIRNAMES += armv6-m armv7-m armv7e-m armv7-ar ++MULTILIB_OPTIONS += mfloat-abi=softfp/mfloat-abi=hard ++MULTILIB_DIRNAMES += softfp fpu ++MULTILIB_OPTIONS += mfpu=fpv4-sp-d16/mfpu=vfpv3-d16 ++MULTILIB_DIRNAMES += fpv4-sp-d16 vfpv3-d16 ++ ++MULTILIB_MATCHES = march?armv6s-m=mcpu?cortex-m0 ++MULTILIB_MATCHES += march?armv6s-m=mcpu?cortex-m0plus ++MULTILIB_MATCHES += march?armv6s-m=mcpu?cortex-m1 ++MULTILIB_MATCHES += march?armv6s-m=march?armv6-m ++MULTILIB_MATCHES += march?armv7-m=mcpu?cortex-m3 ++MULTILIB_MATCHES += march?armv7e-m=mcpu?cortex-m4 ++MULTILIB_MATCHES += march?armv7e-m=mcpu?cortex-m7 ++MULTILIB_MATCHES += march?armv7=march?armv7-r ++MULTILIB_MATCHES += march?armv7=march?armv7-a ++MULTILIB_MATCHES += march?armv7=mcpu?cortex-r4 ++MULTILIB_MATCHES += march?armv7=mcpu?cortex-r4f ++MULTILIB_MATCHES += march?armv7=mcpu?cortex-r5 ++MULTILIB_MATCHES += march?armv7=mcpu?cortex-r7 ++MULTILIB_MATCHES += march?armv7=mcpu?cortex-a5 ++MULTILIB_MATCHES += march?armv7=mcpu?cortex-a7 ++MULTILIB_MATCHES += march?armv7=mcpu?cortex-a8 ++MULTILIB_MATCHES += march?armv7=mcpu?cortex-a9 ++MULTILIB_MATCHES += march?armv7=mcpu?cortex-a15 ++MULTILIB_MATCHES += mfpu?fpv4-sp-d16=mfpu?fpv5-sp-d16 ++MULTILIB_MATCHES += mfpu?fpv4-sp-d16=mfpu?fpv5-d16 ++MULTILIB_MATCHES += mfpu?vfpv3-d16=mfpu?vfpv3 ++MULTILIB_MATCHES += mfpu?vfpv3-d16=mfpu?vfpv3-fp16 ++MULTILIB_MATCHES += mfpu?vfpv3-d16=mfpu?vfpv3-d16-fp16 ++MULTILIB_MATCHES += mfpu?vfpv3-d16=mfpu?vfpv3xd ++MULTILIB_MATCHES += mfpu?vfpv3-d16=mfpu?vfpv3xd-fp16 ++MULTILIB_MATCHES += mfpu?vfpv3-d16=mfpu?vfpv4 ++MULTILIB_MATCHES += mfpu?vfpv3-d16=mfpu?vfpv4-d16 ++MULTILIB_MATCHES += mfpu?vfpv3-d16=mfpu?neon ++MULTILIB_MATCHES += mfpu?vfpv3-d16=mfpu?neon-fp16 ++MULTILIB_MATCHES += mfpu?vfpv3-d16=mfpu?neon-vfpv4 ++ ++MULTILIB_EXCEPTIONS = ++MULTILIB_REUSE = ++ ++MULTILIB_REQUIRED = mthumb ++MULTILIB_REQUIRED += marm ++MULTILIB_REQUIRED += mfloat-abi=hard ++ ++MULTILIB_OSDIRNAMES = mthumb=!thumb ++MULTILIB_OSDIRNAMES += marm=!arm ++MULTILIB_OSDIRNAMES += mfloat-abi.hard=!fpu ++ ++ifneq (,$(findstring armv6-m,$(subst $(comma),$(space),$(with_multilib_list)))) ++MULTILIB_REQUIRED += mthumb/march=armv6s-m ++MULTILIB_OSDIRNAMES += mthumb/march.armv6s-m=!armv6-m ++endif ++ ++ifneq (,$(findstring armv7-m,$(subst $(comma),$(space),$(with_multilib_list)))) ++MULTILIB_REQUIRED += mthumb/march=armv7-m ++MULTILIB_OSDIRNAMES += mthumb/march.armv7-m=!armv7-m ++endif ++ ++ifneq (,$(findstring armv7e-m,$(subst $(comma),$(space),$(with_multilib_list)))) ++MULTILIB_REQUIRED += mthumb/march=armv7e-m ++MULTILIB_REQUIRED += mthumb/march=armv7e-m/mfloat-abi=softfp/mfpu=fpv4-sp-d16 ++MULTILIB_REQUIRED += mthumb/march=armv7e-m/mfloat-abi=hard/mfpu=fpv4-sp-d16 ++MULTILIB_OSDIRNAMES += mthumb/march.armv7e-m=!armv7e-m ++MULTILIB_OSDIRNAMES += mthumb/march.armv7e-m/mfloat-abi.hard/mfpu.fpv4-sp-d16=!armv7e-m/fpu ++MULTILIB_OSDIRNAMES += mthumb/march.armv7e-m/mfloat-abi.softfp/mfpu.fpv4-sp-d16=!armv7e-m/softfp ++endif ++ ++ifneq (,$(filter armv7 armv7-r armv7-a,$(subst $(comma),$(space),$(with_multilib_list)))) ++MULTILIB_REQUIRED += mthumb/march=armv7 ++MULTILIB_REQUIRED += mthumb/march=armv7/mfloat-abi=softfp/mfpu=vfpv3-d16 ++MULTILIB_REQUIRED += mthumb/march=armv7/mfloat-abi=hard/mfpu=vfpv3-d16 ++MULTILIB_OSDIRNAMES += mthumb/march.armv7=!armv7-ar/thumb ++MULTILIB_OSDIRNAMES += mthumb/march.armv7/mfloat-abi.hard/mfpu.vfpv3-d16=!armv7-ar/thumb/fpu ++MULTILIB_OSDIRNAMES += mthumb/march.armv7/mfloat-abi.softfp/mfpu.vfpv3-d16=!armv7-ar/thumb/softfp ++MULTILIB_REUSE += mthumb/march.armv7=marm/march.armv7 ++MULTILIB_REUSE += mthumb/march.armv7/mfloat-abi.softfp/mfpu.vfpv3-d16=marm/march.armv7/mfloat-abi.softfp/mfpu.vfpv3-d16 ++MULTILIB_REUSE += mthumb/march.armv7/mfloat-abi.hard/mfpu.vfpv3-d16=marm/march.armv7/mfloat-abi.hard/mfpu.vfpv3-d16 ++endif +diff --git a/gcc/configure b/gcc/configure +index ea73b151a4e..c609f25e50c 100755 +--- a/gcc/configure ++++ b/gcc/configure +@@ -772,6 +772,7 @@ SET_MAKE + accel_dir_suffix + real_target_noncanonical + enable_as_accelerator ++with_multilib_list + REPORT_BUGS_TEXI + REPORT_BUGS_TO + PKGVERSION +@@ -7763,6 +7764,7 @@ else + fi + + ++ + # ------------------------- + # Checks for other programs + # ------------------------- +diff --git a/gcc/configure.ac b/gcc/configure.ac +index 9d4c792a33f..abd988eb113 100644 +--- a/gcc/configure.ac ++++ b/gcc/configure.ac +@@ -1007,6 +1007,7 @@ AC_ARG_WITH(multilib-list, + [AS_HELP_STRING([--with-multilib-list], [select multilibs (AArch64, SH and x86-64 only)])], + :, + with_multilib_list=default) ++AC_SUBST(with_multilib_list) + + # ------------------------- + # Checks for other programs diff --git a/srcpkgs/arm-none-eabi-newlib/files/fix-cxxflags-passing.patch b/srcpkgs/arm-none-eabi-newlib/files/fix-cxxflags-passing.patch new file mode 120000 index 00000000000..4a8c831e615 --- /dev/null +++ b/srcpkgs/arm-none-eabi-newlib/files/fix-cxxflags-passing.patch @@ -0,0 +1 @@ +../../gcc/patches/fix-cxxflags-passing.patch \ No newline at end of file diff --git a/srcpkgs/arm-none-eabi-newlib/template b/srcpkgs/arm-none-eabi-newlib/template new file mode 100644 index 00000000000..8bd06d8eb29 --- /dev/null +++ b/srcpkgs/arm-none-eabi-newlib/template @@ -0,0 +1,190 @@ +# Template file for 'arm-none-eabi-newlib' +_gcc_version=7.2.0 +_newlib_version=2.4.0.20161025 + +_triplet=arm-none-eabi +_sysroot="/usr/${_triplet}" + +pkgname=${_triplet}-newlib +version=2.4.0 +revision=1 +short_desc="GNU Cross bare metal toolchain" +maintainer="Thomas Bernard " +homepage="http://www.voidlinux.eu" +license="GPL-3, GPL-2, LGPL-2.1" +distfiles=" + ${GNU_SITE}/gcc/gcc-${_gcc_version}/gcc-${_gcc_version}.tar.gz + ftp://sources.redhat.com/pub/newlib/newlib-${_newlib_version}.tar.gz +" + +checksum=" + 0153a003d3b433459336a91610cca2995ee0fb3d71131bd72555f2231a6efcfc + cbecbc637496fcec02829c12babf8441c6500eb1933c776d2fa4e0a9a35f081f +" + +lib32disabled=yes +nostrip=yes +nodebug=yes +create_wrksrc=yes + +hostmakedepends="perl flex bison gcc arm-none-eabi-binutils" +makedepends="zlib-devel gmp-devel mpfr-devel libmpc-devel isl15-devel" + +_apply_patch() { + local args="$1" pname="$(basename $2)" + + if [ ! -f ".${pname}_done" ]; then + patch -N $args -i $2 + touch .${pname}_done + fi +} + +_gcc_bootstrap() { + local _args + + [ -f ${wrksrc}/.gcc_bootstrap_done ] && return 0 + + cd ${wrksrc}/gcc-${_gcc_version} + _apply_patch -p0 ${FILESDIR}/fix-cxxflags-passing.patch + _apply_patch -p1 ${FILESDIR}/enable-with-multilib-list-for-arm.patch + + msg_normal "Building cross gcc bootstrap\n" + + [ ! -d ../gcc-bootstrap ] && mkdir ../gcc-bootstrap + cd ../gcc-bootstrap + + _args="--prefix=/usr" + _args+=" --host=${XBPS_CROSS_TRIPLET}" + _args+=" --target=${_triplet}" + _args+=" --quiet" + _args+=" --without-headers" + _args+=" --enable-internetwork" + _args+=" --enable-multilib" + _args+=" --enable-languages=c" + _args+=" --with-newlib" + _args+=" --disable-nls" + _args+=" --disable-shared" + _args+=" --disable-libquadmath" + _args+=" --disable-decimal-float" + _args+=" --disable-libgomp" + _args+=" --disable-libmpx" + _args+=" --disable-libmudflap" + _args+=" --disable-libssp" + _args+=" --disable-libitm" + _args+=" --disable-libatomic" + _args+=" --disable-threads" + _args+=" --disable-sjlj-exceptions" + _args+=" --with-gnu-ld" + _args+=" --with-gnu-as" + + CFLAGS="-O0 -g0" CXXFLAGS="-O0 -g0" \ + ../gcc-${_gcc_version}/configure ${_args} + + make ${makejobs} all-gcc + make install-gcc + + touch ${wrksrc}/.gcc_bootstrap_done +} + +_newlib_build() { + local _args + + [ -f ${wrksrc}/.newlib_build_done ] && return 0 + + cd ${wrksrc} + msg_normal "Building cross newlib\n" + + [ ! -d newlib-build ] && mkdir newlib-build + cd newlib-build + + export CFLAGS="-O2 -ffunction-sections -fdata-sections" + + _args="--prefix=/usr" + _args+=" --target=${_triplet}" + _args+=" --with-sysroot=${_sysroot}" + _args+=" --enable-interwork" + _args+=" --quiet" + _args+=" --with-gnu-as" + _args+=" --with-gnu-ld" + _args+=" --disable-nls" + _args+=" --disable-newlib-supplied-syscalls" + _args+=" --enable-newlib-io-long-long" + _args+=" --enable-newlib-register-fini" + + ../newlib-${_newlib_version}/configure ${_args} + + make ${makejobs} + + touch ${wrksrc}/.newlib_build_done +} + +_newlib_nano_build() { + local _args + + [ -f ${wrksrc}/.newlib_nano_build_done ] && return 0 + + cd ${wrksrc} + msg_normal "Building cross newlib nano\n" + + [ ! -d newlib-nano-build ] && mkdir newlib-nano-build + cd newlib-nano-build + + export CFLAGS_FOR_TARGET="-Os -ffunction-sections -fdata-sections" + + _args="--prefix=/usr" + _args+=" --target=${_triplet}" + _args+=" --with-sysroot=${_sysroot}" + _args+=" --quiet" + _args+=" --enable-interwork" + _args+=" --with-gnu-as" + _args+=" --with-gnu-ld" + _args+=" --disable-nls" + _args+=" --disable-newlib-supplied-syscalls" + _args+=" --disable-newlib-fvwrite-in-streamio" + _args+=" --disable-newlib-fseek-optimization" + _args+=" --disable-newlib-wide-orient" + _args+=" --enable-newlib-nano-malloc" + _args+=" --disable-newlib-unbuf-stream-opt" + _args+=" --enable-lite-exit" + _args+=" --enable-newlib-global-atexit" + _args+=" --enable-newlib-nano-formatted-io" + _args+=" --enable-newlib-reent-small" + + ../newlib-${_newlib_version}/configure ${_args} + + make ${makejobs} + + touch ${wrksrc}/.newlib_nano_build_done +} + + +do_build() { + for f in include lib bin; do + if [ ! -d ${_sysroot}/usr/${f} ]; then + mkdir -p ${_sysroot}/usr/${f} + fi + if [ ! -h ${_sysroot}/${f} ]; then + ln -sfr ${_sysroot}/usr/${f} ${_sysroot}/${f} + fi + done + # Ensure we use sane environment + export CFLAGS="-Os" CXXFLAGS="-Os" + + _gcc_bootstrap + _newlib_nano_build + _newlib_build +} + +do_install() { + + # install newlib for target + cd ${wrksrc}/newlib-nano-build + make DESTDIR=${DESTDIR} install + find "$DESTDIR" -regex ".*/lib\(c\|g\|rdimon\)\.a" -exec rename .a _nano.a '{}' \; + + cd ${wrksrc}/newlib-build + make DESTDIR=${DESTDIR} install + + # strip target binaries + find ${DESTDIR}/${_sysroot}/lib \( -name "*.a" -or -name "*.o" \) -exec ${_triplet}-strip '{}' \; +}