From 76d90c2ed2956d27e0c8af8fb0b76b3069228d5f Mon Sep 17 00:00:00 2001 From: Mike Baker <mbm@openwrt.org> Date: Sun, 16 Jan 2005 11:43:02 +0000 Subject: [PATCH] Initial revision SVN-Revision: 197 --- openwrt/.cvsignore | 6 + openwrt/.defconfig | 113 + openwrt/Config.in | 109 + openwrt/Makefile | 191 + openwrt/docs/README | 18 + openwrt/docs/buildroot-documentation.html | 644 +++ openwrt/docs/stylesheet.css | 65 + openwrt/package/Config.in | 15 + openwrt/package/Makefile.in | 64 + openwrt/package/bridge/Config.in | 8 + openwrt/package/bridge/Makefile.in | 3 + openwrt/package/bridge/bridge.mk | 61 + openwrt/package/bridge/bridge.patch | 11 + openwrt/package/busybox/Config.in | 19 + openwrt/package/busybox/Makefile.in | 3 + openwrt/package/busybox/busybox.config | 464 +++ openwrt/package/busybox/busybox.mk | 62 + openwrt/package/config/.cvsignore | 8 + openwrt/package/config/Config.in | 8 + openwrt/package/config/Kconfig-language.txt | 255 ++ openwrt/package/config/Makefile | 112 + openwrt/package/config/Makefile.in | 3 + openwrt/package/config/checklist.c | 372 ++ openwrt/package/config/colors.h | 161 + openwrt/package/config/conf.c | 583 +++ openwrt/package/config/confdata.c | 447 ++ openwrt/package/config/dialog.h | 196 + openwrt/package/config/expr.c | 1089 +++++ openwrt/package/config/expr.h | 193 + openwrt/package/config/inputbox.c | 240 ++ openwrt/package/config/lex.zconf.c_shipped | 3688 +++++++++++++++++ openwrt/package/config/lkc.h | 113 + openwrt/package/config/lkc_proto.h | 39 + openwrt/package/config/mconf.c | 713 ++++ openwrt/package/config/menu.c | 431 ++ openwrt/package/config/menubox.c | 436 ++ openwrt/package/config/msgbox.c | 85 + openwrt/package/config/symbol.c | 771 ++++ openwrt/package/config/textbox.c | 556 +++ openwrt/package/config/util.c | 375 ++ openwrt/package/config/yesno.c | 118 + openwrt/package/config/zconf.l | 366 ++ openwrt/package/config/zconf.tab.c_shipped | 2127 ++++++++++ openwrt/package/config/zconf.tab.h_shipped | 125 + openwrt/package/config/zconf.y | 687 +++ openwrt/package/dnsmasq/Config.in | 8 + openwrt/package/dnsmasq/Makefile.in | 3 + openwrt/package/dnsmasq/dnsmasq.mk | 50 + .../package/dnsmasq/dnsmasq1-100-bugfix.patch | 25 + .../package/dnsmasq/dnsmasq2-100-config.patch | 49 + openwrt/package/dropbear_sshd/Config.in | 7 + openwrt/package/dropbear_sshd/Makefile.in | 3 + .../package/dropbear_sshd/dropbear-init.patch | 59 + .../package/dropbear_sshd/dropbear_sshd.mk | 79 + openwrt/package/iptables/Config.in | 7 + openwrt/package/iptables/Makefile.in | 3 + openwrt/package/iptables/iptables.mk | 51 + openwrt/package/linux/Config.in | 7 + openwrt/package/linux/Makefile.in | 3 + .../kernel-patches/001-linux-2.4.patch.bz2 | Bin 0 -> 428187 bytes .../kernel-patches/003_kbuild_fixes.diff.bz2 | Bin 0 -> 1091 bytes .../linux/kernel-patches/004_386_emu.diff.bz2 | Bin 0 -> 5292 bytes .../005_modularize_vesafb.diff.bz2 | Bin 0 -> 710 bytes .../kernel-patches/006_init_unshare.diff.bz2 | Bin 0 -> 299 bytes .../007-scsi_add_remove_single.bz2 | Bin 0 -> 3988 bytes .../linux/kernel-patches/008-ieee1394-fix.bz2 | Bin 0 -> 390 bytes .../kernel-patches/009-always-inline.bz2 | Bin 0 -> 468 bytes .../kernel-patches/010-optimize-for-size.bz2 | Bin 0 -> 1201 bytes .../kernel-patches/012-x86-check_gcc.bz2 | Bin 0 -> 329 bytes .../kernel-patches/015_cramfs_initrd.diff.bz2 | Bin 0 -> 406 bytes .../linux/kernel-patches/017-printk.bz2 | Bin 0 -> 336 bytes .../kernel-patches/018-slab-loop-init.bz2 | Bin 0 -> 268 bytes .../kernel-patches/041-changeloop.patch.bz2 | Bin 0 -> 2783 bytes .../kernel-patches/042-loopfixes.patch.bz2 | Bin 0 -> 640 bytes .../linux/kernel-patches/044-streaming_io.bz2 | Bin 0 -> 1743 bytes .../kernel-patches/062-silence-blk-queue.bz2 | Bin 0 -> 374 bytes .../kernel-patches/063-silence.kbd.patch.bz2 | Bin 0 -> 506 bytes .../linux/kernel-patches/064-shutup-md.bz2 | Bin 0 -> 501 bytes .../kernel-patches/067-squashfs2.patch.bz2 | Bin 0 -> 12850 bytes .../linux/kernel-patches/076-nmap-freak.bz2 | Bin 0 -> 1577 bytes .../kernel-patches/077-orinoco-0.13e.bz2 | Bin 0 -> 7387 bytes .../linux/kernel-patches/078-hostap.bz2 | Bin 0 -> 113612 bytes .../linux/kernel-patches/079-jiffies64.bz2 | Bin 0 -> 4774 bytes .../kernel-patches/089-no-touch-makedep.bz2 | Bin 0 -> 858 bytes .../linux/kernel-patches/100_VERSION.bz2 | Bin 0 -> 235 bytes openwrt/package/linux/linux.config | 853 ++++ openwrt/package/linux/linux.mk | 115 + openwrt/package/sed/Config.in | 9 + openwrt/package/sed/Makefile.in | 3 + openwrt/package/sed/sed.mk | 136 + openwrt/package/sed/sedcheck.sh | 21 + openwrt/target/Config.in | 8 + openwrt/target/Makefile.in | 1 + openwrt/target/default/device_table.txt | 162 + openwrt/target/default/skel.tar.gz | Bin 0 -> 4846 bytes openwrt/target/default/target_skeleton/etc/TZ | 1 + .../target/default/target_skeleton/etc/fstab | 8 + .../target/default/target_skeleton/etc/group | 10 + .../default/target_skeleton/etc/hostname | 1 + .../target/default/target_skeleton/etc/hosts | 1 + .../target_skeleton/etc/init.d/S20urandom | 44 + .../target_skeleton/etc/init.d/S40network | 35 + .../default/target_skeleton/etc/init.d/rcS | 27 + .../default/target_skeleton/etc/inittab | 47 + .../default/target_skeleton/etc/inputrc | 44 + .../target/default/target_skeleton/etc/issue | 4 + .../target_skeleton/etc/network/interfaces | 4 + .../target/default/target_skeleton/etc/passwd | 13 + .../default/target_skeleton/etc/profile | 48 + .../default/target_skeleton/etc/protocols | 31 + .../default/target_skeleton/etc/random-seed | Bin 0 -> 512 bytes .../default/target_skeleton/etc/resolv.conf | 2 + .../default/target_skeleton/etc/securetty | 12 + .../default/target_skeleton/etc/services | 302 ++ .../target/default/target_skeleton/etc/shadow | 12 + .../target_skeleton/root/.bash_history | 0 .../default/target_skeleton/root/.bash_logout | 7 + .../target_skeleton/root/.bash_profile | 15 + .../default/target_skeleton/root/.bashrc | 48 + .../target_skeleton/usr/share/terminfo/a/ansi | Bin 0 -> 1450 bytes .../target_skeleton/usr/share/terminfo/d/dumb | Bin 0 -> 308 bytes .../usr/share/terminfo/l/linux | Bin 0 -> 1551 bytes .../target_skeleton/usr/share/terminfo/r/rxvt | Bin 0 -> 1627 bytes .../usr/share/terminfo/s/screen | Bin 0 -> 1318 bytes .../usr/share/terminfo/s/screen-w | Bin 0 -> 1334 bytes .../target_skeleton/usr/share/terminfo/s/sun | Bin 0 -> 1019 bytes .../usr/share/terminfo/v/vt100 | Bin 0 -> 1143 bytes .../usr/share/terminfo/v/vt220 | Bin 0 -> 975 bytes .../target_skeleton/usr/share/terminfo/v/vt52 | Bin 0 -> 461 bytes .../usr/share/terminfo/x/xterm | Bin 0 -> 1366 bytes .../usr/share/terminfo/x/xterm-xfree86 | Bin 0 -> 1840 bytes .../usr/share/udhcpc/default.script | 39 + openwrt/target/jffs2/Config.in | 6 + openwrt/target/jffs2/Makefile.in | 3 + openwrt/target/jffs2/jffs2root.mk | 50 + openwrt/toolchain/Config.in | 57 + openwrt/toolchain/Makefile.in | 7 + .../binutils/2.14.90.0.6/001-debian.patch | 185 + .../2.14.90.0.6/100-uclibc-conf.patch | 646 +++ .../2.14.90.0.6/200-build_modules.patch | 31 + .../binutils/2.14.90.0.6/210-cflags.patch | 32 + .../binutils/2.14.90.0.7/001-debian.patch | 2394 +++++++++++ .../2.14.90.0.7/100-uclibc-conf.patch | 646 +++ .../2.14.90.0.7/200-build_modules.patch | 31 + .../binutils/2.14.90.0.7/210-cflags.patch | 32 + .../2.14.90.0.7/600-arm-textrel.patch | 63 + .../binutils/2.14.90.0.8/001-debian.patch | 142 + .../2.14.90.0.8/100-uclibc-conf.patch | 630 +++ .../2.14.90.0.8/600-arm-textrel.patch | 63 + .../2.15.90.0.1.1/100-uclibc-conf.patch | 692 ++++ .../2.15.90.0.1.1/600-arm-textrel.patch | 63 + .../2.15.90.0.1/100-uclibc-conf.patch | 692 ++++ .../2.15.90.0.1/600-arm-textrel.patch | 63 + .../2.15.90.0.2/100-uclibc-conf.patch | 692 ++++ .../2.15.90.0.2/600-arm-textrel.patch | 63 + .../2.15.90.0.3/100-uclibc-conf.patch | 692 ++++ .../binutils/2.15.90.0.3/210-cflags.patch | 32 + .../2.15.90.0.3/500-branch-likely.patch | 10 + .../2.15.90.0.3/600-arm-textrel.patch | 63 + .../2.15.91.0.1/100-uclibc-conf.patch | 692 ++++ .../2.15.91.0.1/600-arm-textrel.patch | 63 + .../2.15.91.0.2/100-uclibc-conf.patch | 722 ++++ .../2.15.91.0.2/500-branch-likely.patch | 10 + .../2.15.91.0.2/600-arm-textrel.patch | 63 + .../700-binutils-20040817-linkonce.patch | 118 + .../701-binutils-dup-sections.patch | 68 + .../702-binutils-skip-comments.patch | 101 + .../2.15.92.0.2/100-uclibc-conf.patch | 724 ++++ .../300-001_ld_makefile_patch.patch | 52 + .../300-006_better_file_error.patch | 43 + .../300-012_check_ldrunpath_length.patch | 47 + .../300-117_mips_symbolic_link.patch | 42 + ...00-120_mips_xgot_multigot_workaround.patch | 39 + .../2.15.92.0.2/600-arm-textrel.patch | 54 + .../702-binutils-skip-comments.patch | 101 + .../2.15.94.0.1/100-uclibc-conf.patch | 734 ++++ .../300-001_ld_makefile_patch.patch | 52 + .../300-006_better_file_error.patch | 43 + .../300-012_check_ldrunpath_length.patch | 47 + ...00-120_mips_xgot_multigot_workaround.patch | 39 + .../702-binutils-skip-comments.patch | 101 + .../2.15.94.0.2/100-uclibc-conf.patch | 749 ++++ .../300-001_ld_makefile_patch.patch | 52 + .../300-006_better_file_error.patch | 43 + .../300-012_check_ldrunpath_length.patch | 47 + ...00-120_mips_xgot_multigot_workaround.patch | 39 + .../702-binutils-skip-comments.patch | 101 + .../binutils/2.15/100-uclibc-conf.patch | 692 ++++ .../binutils/2.15/600-arm-textrel.patch | 63 + openwrt/toolchain/binutils/Config.in | 66 + openwrt/toolchain/binutils/Makefile.in | 1 + openwrt/toolchain/binutils/binutils.mk | 134 + openwrt/toolchain/ccache/Config.in | 10 + openwrt/toolchain/ccache/Config.in.2 | 8 + openwrt/toolchain/ccache/Makefile.in | 6 + openwrt/toolchain/ccache/ccache.mk | 151 + .../gcc/2.95/050-debian-subset.patch.bz2 | Bin 0 -> 125295 bytes .../toolchain/gcc/2.95/100-uclibc-conf.patch | 291 ++ .../toolchain/gcc/2.95/STLport-4.5.3.patch | 407 ++ .../toolchain/gcc/3.3.3/100-uclibc-conf.patch | 1635 ++++++++ .../toolchain/gcc/3.3.3/110-uclibc-conf.patch | 55 + .../toolchain/gcc/3.3.3/120-softfloat.patch | 14 + .../gcc/3.3.3/200-uclibc-locale.patch | 3021 ++++++++++++++ openwrt/toolchain/gcc/3.3.3/500-loop.patch | 10 + .../toolchain/gcc/3.3.4/100-uclibc-conf.patch | 1635 ++++++++ .../toolchain/gcc/3.3.4/110-uclibc-conf.patch | 55 + .../toolchain/gcc/3.3.4/120-softfloat.patch | 14 + .../gcc/3.3.4/200-uclibc-locale.patch | 3021 ++++++++++++++ openwrt/toolchain/gcc/3.3.4/500-loop.patch | 10 + .../toolchain/gcc/3.3.4/specs-arm-soft-float | 124 + .../toolchain/gcc/3.3.4/specs-mips-soft-float | 145 + .../gcc/3.3.4/specs-mipsel-soft-float | 145 + .../gcc/3.3.4/specs-powerpc-soft-float | 352 ++ .../toolchain/gcc/3.3.5/100-uclibc-conf.patch | 1635 ++++++++ .../toolchain/gcc/3.3.5/110-uclibc-conf.patch | 55 + .../toolchain/gcc/3.3.5/120-softfloat.patch | 14 + .../gcc/3.3.5/200-uclibc-locale.patch | 3021 ++++++++++++++ openwrt/toolchain/gcc/3.3.5/500-loop.patch | 10 + .../toolchain/gcc/3.3.5/specs-arm-soft-float | 124 + .../toolchain/gcc/3.3.5/specs-mips-soft-float | 145 + .../gcc/3.3.5/specs-mipsel-soft-float | 145 + .../gcc/3.3.5/specs-powerpc-soft-float | 352 ++ .../toolchain/gcc/3.4.0/100-uclibc-conf.patch | 442 ++ .../gcc/3.4.0/200-uclibc-locale.patch | 3246 +++++++++++++++ .../gcc/3.4.0/arm-softfloat.patch.conditional | 256 ++ .../toolchain/gcc/3.4.1/100-uclibc-conf.patch | 442 ++ .../gcc/3.4.1/200-uclibc-locale.patch | 3241 +++++++++++++++ .../gcc/3.4.1/400-mips-delay-slot.patch | 46 + .../gcc/3.4.1/800-arm-bigendian.patch | 70 + .../gcc/3.4.1/810-arm-bigendian-uclibc.patch | 27 + .../gcc/3.4.1/arm-softfloat.patch.conditional | 270 ++ .../toolchain/gcc/3.4.2/100-uclibc-conf.patch | 442 ++ .../gcc/3.4.2/200-uclibc-locale.patch | 3246 +++++++++++++++ .../gcc/3.4.2/300-libstdc++-pic.patch | 47 + openwrt/toolchain/gcc/3.4.2/300-pr15526.patch | 53 + openwrt/toolchain/gcc/3.4.2/300-pr17541.patch | 234 ++ openwrt/toolchain/gcc/3.4.2/300-pr17976.patch | 106 + .../gcc/3.4.2/400-mips-pr17565.patch | 102 + .../gcc/3.4.2/401-ppc-eabi-typo.patch | 20 + .../gcc/3.4.2/402-mips-pr17770.patch | 12 + .../3.4.2/600-gcc34-arm-ldm-peephole.patch | 79 + .../gcc/3.4.2/601-gcc34-arm-ldm.patch | 119 + .../3.4.2/602-sdk-libstdc++-includes.patch | 22 + .../toolchain/gcc/3.4.2/700-pr15068-fix.patch | 44 + .../gcc/3.4.2/800-arm-bigendian.patch | 70 + .../gcc/3.4.2/810-arm-bigendian-uclibc.patch | 27 + .../gcc/3.4.2/arm-softfloat.patch.conditional | 270 ++ .../toolchain/gcc/3.4.3/100-uclibc-conf.patch | 442 ++ .../gcc/3.4.3/200-uclibc-locale.patch | 3246 +++++++++++++++ .../gcc/3.4.3/300-libstdc++-pic.patch | 47 + .../3.4.3/600-gcc34-arm-ldm-peephole.patch | 79 + .../gcc/3.4.3/601-gcc34-arm-ldm.patch | 119 + .../3.4.3/602-sdk-libstdc++-includes.patch | 22 + .../toolchain/gcc/3.4.3/700-pr15068-fix.patch | 44 + .../gcc/3.4.3/800-arm-bigendian.patch | 70 + .../gcc/3.4.3/810-arm-bigendian-uclibc.patch | 27 + .../gcc/3.4.3/arm-softfloat.patch.conditional | 270 ++ openwrt/toolchain/gcc/Config.in | 76 + openwrt/toolchain/gcc/Config.in.2 | 6 + openwrt/toolchain/gcc/Makefile.in | 26 + openwrt/toolchain/gcc/gcc-uclibc-2.95.mk | 277 ++ openwrt/toolchain/gcc/gcc-uclibc-3.x.mk | 321 ++ .../toolchain/gcc/i386-gcc-soft-float.patch | 61 + .../toolchain/gdb/5.3/050-debian-subset.patch | 633 +++ openwrt/toolchain/gdb/5.3/100-uclibc.patch | 154 + .../toolchain/gdb/6.1.1/100-uclibc-conf.patch | 290 ++ .../gdb/6.1.1/200-uclibc-readline-conf.patch | 15 + .../toolchain/gdb/6.2.1/100-uclibc-conf.patch | 290 ++ .../gdb/6.2.1/200-uclibc-readline-conf.patch | 15 + .../gdb/6.2.1/400-mips-coredump.patch | 28 + .../toolchain/gdb/6.2/100-uclibc-conf.patch | 290 ++ .../gdb/6.2/200-uclibc-readline-conf.patch | 15 + openwrt/toolchain/gdb/Config.in | 49 + openwrt/toolchain/gdb/Makefile.in | 10 + openwrt/toolchain/gdb/gdb.mk | 189 + openwrt/toolchain/patch-kernel.sh | 53 + openwrt/toolchain/uClibc/Config.in | 23 + openwrt/toolchain/uClibc/uClibc.config | 150 + openwrt/toolchain/uClibc/uClibc.config-locale | 142 + openwrt/toolchain/uClibc/uclibc.mk | 167 + 280 files changed, 69781 insertions(+) create mode 100644 openwrt/.cvsignore create mode 100644 openwrt/.defconfig create mode 100644 openwrt/Config.in create mode 100644 openwrt/Makefile create mode 100644 openwrt/docs/README create mode 100644 openwrt/docs/buildroot-documentation.html create mode 100644 openwrt/docs/stylesheet.css create mode 100644 openwrt/package/Config.in create mode 100644 openwrt/package/Makefile.in create mode 100644 openwrt/package/bridge/Config.in create mode 100644 openwrt/package/bridge/Makefile.in create mode 100644 openwrt/package/bridge/bridge.mk create mode 100644 openwrt/package/bridge/bridge.patch create mode 100644 openwrt/package/busybox/Config.in create mode 100644 openwrt/package/busybox/Makefile.in create mode 100644 openwrt/package/busybox/busybox.config create mode 100644 openwrt/package/busybox/busybox.mk create mode 100644 openwrt/package/config/.cvsignore create mode 100644 openwrt/package/config/Config.in create mode 100644 openwrt/package/config/Kconfig-language.txt create mode 100644 openwrt/package/config/Makefile create mode 100644 openwrt/package/config/Makefile.in create mode 100644 openwrt/package/config/checklist.c create mode 100644 openwrt/package/config/colors.h create mode 100644 openwrt/package/config/conf.c create mode 100644 openwrt/package/config/confdata.c create mode 100644 openwrt/package/config/dialog.h create mode 100644 openwrt/package/config/expr.c create mode 100644 openwrt/package/config/expr.h create mode 100644 openwrt/package/config/inputbox.c create mode 100644 openwrt/package/config/lex.zconf.c_shipped create mode 100644 openwrt/package/config/lkc.h create mode 100644 openwrt/package/config/lkc_proto.h create mode 100644 openwrt/package/config/mconf.c create mode 100644 openwrt/package/config/menu.c create mode 100644 openwrt/package/config/menubox.c create mode 100644 openwrt/package/config/msgbox.c create mode 100644 openwrt/package/config/symbol.c create mode 100644 openwrt/package/config/textbox.c create mode 100644 openwrt/package/config/util.c create mode 100644 openwrt/package/config/yesno.c create mode 100644 openwrt/package/config/zconf.l create mode 100644 openwrt/package/config/zconf.tab.c_shipped create mode 100644 openwrt/package/config/zconf.tab.h_shipped create mode 100644 openwrt/package/config/zconf.y create mode 100644 openwrt/package/dnsmasq/Config.in create mode 100644 openwrt/package/dnsmasq/Makefile.in create mode 100644 openwrt/package/dnsmasq/dnsmasq.mk create mode 100644 openwrt/package/dnsmasq/dnsmasq1-100-bugfix.patch create mode 100644 openwrt/package/dnsmasq/dnsmasq2-100-config.patch create mode 100644 openwrt/package/dropbear_sshd/Config.in create mode 100644 openwrt/package/dropbear_sshd/Makefile.in create mode 100644 openwrt/package/dropbear_sshd/dropbear-init.patch create mode 100644 openwrt/package/dropbear_sshd/dropbear_sshd.mk create mode 100644 openwrt/package/iptables/Config.in create mode 100644 openwrt/package/iptables/Makefile.in create mode 100644 openwrt/package/iptables/iptables.mk create mode 100644 openwrt/package/linux/Config.in create mode 100644 openwrt/package/linux/Makefile.in create mode 100644 openwrt/package/linux/kernel-patches/001-linux-2.4.patch.bz2 create mode 100644 openwrt/package/linux/kernel-patches/003_kbuild_fixes.diff.bz2 create mode 100644 openwrt/package/linux/kernel-patches/004_386_emu.diff.bz2 create mode 100644 openwrt/package/linux/kernel-patches/005_modularize_vesafb.diff.bz2 create mode 100644 openwrt/package/linux/kernel-patches/006_init_unshare.diff.bz2 create mode 100644 openwrt/package/linux/kernel-patches/007-scsi_add_remove_single.bz2 create mode 100644 openwrt/package/linux/kernel-patches/008-ieee1394-fix.bz2 create mode 100644 openwrt/package/linux/kernel-patches/009-always-inline.bz2 create mode 100644 openwrt/package/linux/kernel-patches/010-optimize-for-size.bz2 create mode 100644 openwrt/package/linux/kernel-patches/012-x86-check_gcc.bz2 create mode 100644 openwrt/package/linux/kernel-patches/015_cramfs_initrd.diff.bz2 create mode 100644 openwrt/package/linux/kernel-patches/017-printk.bz2 create mode 100644 openwrt/package/linux/kernel-patches/018-slab-loop-init.bz2 create mode 100644 openwrt/package/linux/kernel-patches/041-changeloop.patch.bz2 create mode 100644 openwrt/package/linux/kernel-patches/042-loopfixes.patch.bz2 create mode 100644 openwrt/package/linux/kernel-patches/044-streaming_io.bz2 create mode 100644 openwrt/package/linux/kernel-patches/062-silence-blk-queue.bz2 create mode 100644 openwrt/package/linux/kernel-patches/063-silence.kbd.patch.bz2 create mode 100644 openwrt/package/linux/kernel-patches/064-shutup-md.bz2 create mode 100644 openwrt/package/linux/kernel-patches/067-squashfs2.patch.bz2 create mode 100644 openwrt/package/linux/kernel-patches/076-nmap-freak.bz2 create mode 100644 openwrt/package/linux/kernel-patches/077-orinoco-0.13e.bz2 create mode 100644 openwrt/package/linux/kernel-patches/078-hostap.bz2 create mode 100644 openwrt/package/linux/kernel-patches/079-jiffies64.bz2 create mode 100644 openwrt/package/linux/kernel-patches/089-no-touch-makedep.bz2 create mode 100644 openwrt/package/linux/kernel-patches/100_VERSION.bz2 create mode 100644 openwrt/package/linux/linux.config create mode 100644 openwrt/package/linux/linux.mk create mode 100644 openwrt/package/sed/Config.in create mode 100644 openwrt/package/sed/Makefile.in create mode 100644 openwrt/package/sed/sed.mk create mode 100755 openwrt/package/sed/sedcheck.sh create mode 100644 openwrt/target/Config.in create mode 100644 openwrt/target/Makefile.in create mode 100644 openwrt/target/default/device_table.txt create mode 100644 openwrt/target/default/skel.tar.gz create mode 100644 openwrt/target/default/target_skeleton/etc/TZ create mode 100644 openwrt/target/default/target_skeleton/etc/fstab create mode 100644 openwrt/target/default/target_skeleton/etc/group create mode 100644 openwrt/target/default/target_skeleton/etc/hostname create mode 100644 openwrt/target/default/target_skeleton/etc/hosts create mode 100755 openwrt/target/default/target_skeleton/etc/init.d/S20urandom create mode 100755 openwrt/target/default/target_skeleton/etc/init.d/S40network create mode 100755 openwrt/target/default/target_skeleton/etc/init.d/rcS create mode 100644 openwrt/target/default/target_skeleton/etc/inittab create mode 100644 openwrt/target/default/target_skeleton/etc/inputrc create mode 100644 openwrt/target/default/target_skeleton/etc/issue create mode 100644 openwrt/target/default/target_skeleton/etc/network/interfaces create mode 100644 openwrt/target/default/target_skeleton/etc/passwd create mode 100644 openwrt/target/default/target_skeleton/etc/profile create mode 100644 openwrt/target/default/target_skeleton/etc/protocols create mode 100644 openwrt/target/default/target_skeleton/etc/random-seed create mode 100644 openwrt/target/default/target_skeleton/etc/resolv.conf create mode 100644 openwrt/target/default/target_skeleton/etc/securetty create mode 100644 openwrt/target/default/target_skeleton/etc/services create mode 100644 openwrt/target/default/target_skeleton/etc/shadow create mode 100644 openwrt/target/default/target_skeleton/root/.bash_history create mode 100644 openwrt/target/default/target_skeleton/root/.bash_logout create mode 100644 openwrt/target/default/target_skeleton/root/.bash_profile create mode 100644 openwrt/target/default/target_skeleton/root/.bashrc create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/a/ansi create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/d/dumb create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/l/linux create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/r/rxvt create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/s/screen create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/s/screen-w create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/s/sun create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/v/vt100 create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/v/vt220 create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/v/vt52 create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/x/xterm create mode 100644 openwrt/target/default/target_skeleton/usr/share/terminfo/x/xterm-xfree86 create mode 100755 openwrt/target/default/target_skeleton/usr/share/udhcpc/default.script create mode 100644 openwrt/target/jffs2/Config.in create mode 100644 openwrt/target/jffs2/Makefile.in create mode 100644 openwrt/target/jffs2/jffs2root.mk create mode 100644 openwrt/toolchain/Config.in create mode 100644 openwrt/toolchain/Makefile.in create mode 100644 openwrt/toolchain/binutils/2.14.90.0.6/001-debian.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.6/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.6/200-build_modules.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.6/210-cflags.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.7/001-debian.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.7/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.7/200-build_modules.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.7/210-cflags.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.7/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.8/001-debian.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.8/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.8/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.1.1/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.1.1/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.1/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.1/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.2/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.2/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.3/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.3/210-cflags.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.3/500-branch-likely.patch create mode 100644 openwrt/toolchain/binutils/2.15.90.0.3/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/2.15.91.0.1/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15.91.0.1/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/2.15.91.0.2/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15.91.0.2/500-branch-likely.patch create mode 100644 openwrt/toolchain/binutils/2.15.91.0.2/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/2.15.91.0.2/700-binutils-20040817-linkonce.patch create mode 100644 openwrt/toolchain/binutils/2.15.91.0.2/701-binutils-dup-sections.patch create mode 100644 openwrt/toolchain/binutils/2.15.91.0.2/702-binutils-skip-comments.patch create mode 100644 openwrt/toolchain/binutils/2.15.92.0.2/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15.92.0.2/300-001_ld_makefile_patch.patch create mode 100644 openwrt/toolchain/binutils/2.15.92.0.2/300-006_better_file_error.patch create mode 100644 openwrt/toolchain/binutils/2.15.92.0.2/300-012_check_ldrunpath_length.patch create mode 100644 openwrt/toolchain/binutils/2.15.92.0.2/300-117_mips_symbolic_link.patch create mode 100644 openwrt/toolchain/binutils/2.15.92.0.2/300-120_mips_xgot_multigot_workaround.patch create mode 100644 openwrt/toolchain/binutils/2.15.92.0.2/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/2.15.92.0.2/702-binutils-skip-comments.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.1/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.1/300-001_ld_makefile_patch.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.1/300-006_better_file_error.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.1/300-012_check_ldrunpath_length.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.1/300-120_mips_xgot_multigot_workaround.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.1/702-binutils-skip-comments.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.2/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.2/300-001_ld_makefile_patch.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.2/300-006_better_file_error.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.2/300-012_check_ldrunpath_length.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.2/300-120_mips_xgot_multigot_workaround.patch create mode 100644 openwrt/toolchain/binutils/2.15.94.0.2/702-binutils-skip-comments.patch create mode 100644 openwrt/toolchain/binutils/2.15/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/binutils/2.15/600-arm-textrel.patch create mode 100644 openwrt/toolchain/binutils/Config.in create mode 100644 openwrt/toolchain/binutils/Makefile.in create mode 100644 openwrt/toolchain/binutils/binutils.mk create mode 100644 openwrt/toolchain/ccache/Config.in create mode 100644 openwrt/toolchain/ccache/Config.in.2 create mode 100644 openwrt/toolchain/ccache/Makefile.in create mode 100644 openwrt/toolchain/ccache/ccache.mk create mode 100644 openwrt/toolchain/gcc/2.95/050-debian-subset.patch.bz2 create mode 100644 openwrt/toolchain/gcc/2.95/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/2.95/STLport-4.5.3.patch create mode 100644 openwrt/toolchain/gcc/3.3.3/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.3.3/110-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.3.3/120-softfloat.patch create mode 100644 openwrt/toolchain/gcc/3.3.3/200-uclibc-locale.patch create mode 100644 openwrt/toolchain/gcc/3.3.3/500-loop.patch create mode 100644 openwrt/toolchain/gcc/3.3.4/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.3.4/110-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.3.4/120-softfloat.patch create mode 100644 openwrt/toolchain/gcc/3.3.4/200-uclibc-locale.patch create mode 100644 openwrt/toolchain/gcc/3.3.4/500-loop.patch create mode 100644 openwrt/toolchain/gcc/3.3.4/specs-arm-soft-float create mode 100644 openwrt/toolchain/gcc/3.3.4/specs-mips-soft-float create mode 100644 openwrt/toolchain/gcc/3.3.4/specs-mipsel-soft-float create mode 100644 openwrt/toolchain/gcc/3.3.4/specs-powerpc-soft-float create mode 100644 openwrt/toolchain/gcc/3.3.5/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.3.5/110-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.3.5/120-softfloat.patch create mode 100644 openwrt/toolchain/gcc/3.3.5/200-uclibc-locale.patch create mode 100644 openwrt/toolchain/gcc/3.3.5/500-loop.patch create mode 100644 openwrt/toolchain/gcc/3.3.5/specs-arm-soft-float create mode 100644 openwrt/toolchain/gcc/3.3.5/specs-mips-soft-float create mode 100644 openwrt/toolchain/gcc/3.3.5/specs-mipsel-soft-float create mode 100644 openwrt/toolchain/gcc/3.3.5/specs-powerpc-soft-float create mode 100644 openwrt/toolchain/gcc/3.4.0/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.4.0/200-uclibc-locale.patch create mode 100644 openwrt/toolchain/gcc/3.4.0/arm-softfloat.patch.conditional create mode 100644 openwrt/toolchain/gcc/3.4.1/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.4.1/200-uclibc-locale.patch create mode 100644 openwrt/toolchain/gcc/3.4.1/400-mips-delay-slot.patch create mode 100644 openwrt/toolchain/gcc/3.4.1/800-arm-bigendian.patch create mode 100644 openwrt/toolchain/gcc/3.4.1/810-arm-bigendian-uclibc.patch create mode 100644 openwrt/toolchain/gcc/3.4.1/arm-softfloat.patch.conditional create mode 100644 openwrt/toolchain/gcc/3.4.2/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/200-uclibc-locale.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/300-libstdc++-pic.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/300-pr15526.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/300-pr17541.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/300-pr17976.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/400-mips-pr17565.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/401-ppc-eabi-typo.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/402-mips-pr17770.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/600-gcc34-arm-ldm-peephole.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/601-gcc34-arm-ldm.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/602-sdk-libstdc++-includes.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/700-pr15068-fix.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/800-arm-bigendian.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/810-arm-bigendian-uclibc.patch create mode 100644 openwrt/toolchain/gcc/3.4.2/arm-softfloat.patch.conditional create mode 100644 openwrt/toolchain/gcc/3.4.3/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gcc/3.4.3/200-uclibc-locale.patch create mode 100644 openwrt/toolchain/gcc/3.4.3/300-libstdc++-pic.patch create mode 100644 openwrt/toolchain/gcc/3.4.3/600-gcc34-arm-ldm-peephole.patch create mode 100644 openwrt/toolchain/gcc/3.4.3/601-gcc34-arm-ldm.patch create mode 100644 openwrt/toolchain/gcc/3.4.3/602-sdk-libstdc++-includes.patch create mode 100644 openwrt/toolchain/gcc/3.4.3/700-pr15068-fix.patch create mode 100644 openwrt/toolchain/gcc/3.4.3/800-arm-bigendian.patch create mode 100644 openwrt/toolchain/gcc/3.4.3/810-arm-bigendian-uclibc.patch create mode 100644 openwrt/toolchain/gcc/3.4.3/arm-softfloat.patch.conditional create mode 100644 openwrt/toolchain/gcc/Config.in create mode 100644 openwrt/toolchain/gcc/Config.in.2 create mode 100644 openwrt/toolchain/gcc/Makefile.in create mode 100644 openwrt/toolchain/gcc/gcc-uclibc-2.95.mk create mode 100644 openwrt/toolchain/gcc/gcc-uclibc-3.x.mk create mode 100644 openwrt/toolchain/gcc/i386-gcc-soft-float.patch create mode 100644 openwrt/toolchain/gdb/5.3/050-debian-subset.patch create mode 100644 openwrt/toolchain/gdb/5.3/100-uclibc.patch create mode 100644 openwrt/toolchain/gdb/6.1.1/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gdb/6.1.1/200-uclibc-readline-conf.patch create mode 100644 openwrt/toolchain/gdb/6.2.1/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gdb/6.2.1/200-uclibc-readline-conf.patch create mode 100644 openwrt/toolchain/gdb/6.2.1/400-mips-coredump.patch create mode 100644 openwrt/toolchain/gdb/6.2/100-uclibc-conf.patch create mode 100644 openwrt/toolchain/gdb/6.2/200-uclibc-readline-conf.patch create mode 100644 openwrt/toolchain/gdb/Config.in create mode 100644 openwrt/toolchain/gdb/Makefile.in create mode 100644 openwrt/toolchain/gdb/gdb.mk create mode 100755 openwrt/toolchain/patch-kernel.sh create mode 100644 openwrt/toolchain/uClibc/Config.in create mode 100644 openwrt/toolchain/uClibc/uClibc.config create mode 100644 openwrt/toolchain/uClibc/uClibc.config-locale create mode 100644 openwrt/toolchain/uClibc/uclibc.mk diff --git a/openwrt/.cvsignore b/openwrt/.cvsignore new file mode 100644 index 0000000000..60e1751b2e --- /dev/null +++ b/openwrt/.cvsignore @@ -0,0 +1,6 @@ +dl +.config* +.tmpconfig.h +root_fs* +build_* +toolchain_build_* diff --git a/openwrt/.defconfig b/openwrt/.defconfig new file mode 100644 index 0000000000..aba64ee53a --- /dev/null +++ b/openwrt/.defconfig @@ -0,0 +1,113 @@ +# +# Automatically generated make config: don't edit +# +BR2_HAVE_DOT_CONFIG=y +# BR2_arm is not set +# BR2_armeb is not set +# BR2_cris is not set +# BR2_i386 is not set +# BR2_m68k is not set +# BR2_mips is not set +BR2_mipsel=y +# BR2_powerpc is not set +# BR2_sh3 is not set +# BR2_sh3eb is not set +# BR2_sh4 is not set +# BR2_sh4eb is not set +# BR2_sparc is not set +BR2_ARCH="mipsel" + +# +# Build options +# +BR2_WGET="wget --passive-ftp" +# BR2_TAR_VERBOSITY is not set +BR2_STAGING_DIR="$(BUILD_DIR)/staging_dir" +BR2_JLEVEL=1 + +# +# Toolchain Options +# + +# +# uClibc Options +# +BR2_UCLIBC_VERSION_SNAPSHOT=y +BR2_USE_UCLIBC_SNAPSHOT="snapshot" +# BR2_ENABLE_LOCALE is not set + +# +# Binutils Options +# +# BR2_BINUTILS_VERSION_2_14_90_0_6 is not set +# BR2_BINUTILS_VERSION_2_14_90_0_7 is not set +# BR2_BINUTILS_VERSION_2_14_90_0_8 is not set +# BR2_BINUTILS_VERSION_2_15 is not set +# BR2_BINUTILS_VERSION_2_15_90_0_1 is not set +# BR2_BINUTILS_VERSION_2_15_90_0_1_1 is not set +# BR2_BINUTILS_VERSION_2_15_90_0_2 is not set +# BR2_BINUTILS_VERSION_2_15_90_0_3 is not set +# BR2_BINUTILS_VERSION_2_15_91_0_1 is not set +# BR2_BINUTILS_VERSION_2_15_91_0_2 is not set +# BR2_BINUTILS_VERSION_2_15_92_0_2 is not set +# BR2_BINUTILS_VERSION_2_15_94_0_1 is not set +BR2_BINUTILS_VERSION_2_15_94_0_2=y +BR2_BINUTILS_VERSION="2.15.94.0.2" + +# +# Gcc Options +# +# BR2_GCC_VERSION_2_95 is not set +# BR2_GCC_VERSION_3_3_3 is not set +# BR2_GCC_VERSION_3_3_4 is not set +# BR2_GCC_VERSION_3_3_5 is not set +# BR2_GCC_VERSION_3_4_0 is not set +# BR2_GCC_VERSION_3_4_1 is not set +# BR2_GCC_VERSION_3_4_2 is not set +BR2_GCC_VERSION_3_4_3=y +BR2_GCC_VERSION="3.4.3" +BR2_GCC_USE_SJLJ_EXCEPTIONS="--enable-sjlj-exceptions" +BR2_EXTRA_GCC_CONFIG_OPTIONS="" +# BR2_INSTALL_LIBSTDCPP is not set + +# +# Ccache Options +# +BR2_CCACHE=y + +# +# Gdb Options +# +# BR2_PACKAGE_GDB is not set +# BR2_PACKAGE_GDB_SERVER is not set + +# +# Common Toolchain Options +# +# BR2_ENABLE_MULTILIB is not set +# BR2_LARGEFILE is not set +BR2_TARGET_OPTIMIZATION="-Os -pipe" + +# +# OpenWrt Package Selection +# + +# +# The default set +# +BR2_PACKAGE_BUSYBOX=y +BR2_PACKAGE_BUSYBOX_SNAPSHOT=y +# BR2_PACKAGE_DNSMASQ is not set +# BR2_PACKAGE_LINUX is not set +# BR2_PACKAGE_IPTABLES is not set +# BR2_PACKAGE_BRIDGE is not set + +# +# Suggested Extras +# +# BR2_PACKAGE_DROPBEAR_SSHD is not set + +# +# Target Filesystem +# +# BR2_TARGET_ROOTFS_JFFS2 is not set diff --git a/openwrt/Config.in b/openwrt/Config.in new file mode 100644 index 0000000000..2b335e68b4 --- /dev/null +++ b/openwrt/Config.in @@ -0,0 +1,109 @@ +# + +mainmenu "Buildroot2 Configuration" + +config BR2_HAVE_DOT_CONFIG + bool + default y + +choice + prompt "Target Architecture" + default BR2_i386 + help + Stuff + +config BR2_arm + bool "arm" + +config BR2_armeb + bool "armeb" + +config BR2_cris + bool "cris" + +config BR2_i386 + bool "i386" + +config BR2_m68k + bool "m68k" + +config BR2_mips + bool "mips" + +config BR2_mipsel + bool "mipsel" + +config BR2_powerpc + bool "powerpc" + +config BR2_sh3 + bool "sh3" + +config BR2_sh3eb + bool "sh3eb" + +config BR2_sh4 + bool "sh4" + +config BR2_sh4eb + bool "sh4eb" + +config BR2_sparc + bool "sparc" + +endchoice + +config BR2_ARCH + string + default "arm" if BR2_arm + default "armeb" if BR2_armeb + default "cris" if BR2_cris + default "i386" if BR2_i386 + default "m68k" if BR2_m68k + default "mips" if BR2_mips + default "mipsel" if BR2_mipsel + default "powerpc" if BR2_powerpc + default "sh3" if BR2_sh3 + default "sh3eb" if BR2_sh3eb + default "sh4" if BR2_sh4 + default "sh4eb" if BR2_sh4eb + default "sparc" if BR2_sparc + + +menu "Build options" + +config BR2_WGET + string "Wget command" + default "wget --passive-ftp -nd" + +config BR2_TAR_VERBOSITY + bool "Tar verbose" + default n + +config BR2_STAGING_DIR + string "Toolchain and header file location?" + default "$(BUILD_DIR)/staging_dir" + help + This is the location where the toolchain will be installed. + Since the toolchain will not work if it is moved from this + location, it is important for people wishing to package up + a uClibc toolchain that this be set to the location in which + the toolchain will be used. + + Most people will leave this set to the default value of + "$(BUILD_DIR)/staging_dir". + +config BR2_JLEVEL + int "Number of jobs to run simultaneously" + default "1" + help + Number of jobs to run simultanesouly + +endmenu + +source "toolchain/Config.in" + +source "package/Config.in" + +source "target/Config.in" + diff --git a/openwrt/Makefile b/openwrt/Makefile new file mode 100644 index 0000000000..5434b0e7f1 --- /dev/null +++ b/openwrt/Makefile @@ -0,0 +1,191 @@ +# Makefile for buildroot2 +# +# Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> +# +# This program 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 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +#-------------------------------------------------------------- +# Just run 'make menuconfig', configure stuff, then run 'make'. +# You shouldn't need to mess with anything beyond this point... +#-------------------------------------------------------------- +TOPDIR=./ +CONFIG_CONFIG_IN = Config.in +CONFIG_DEFCONFIG = .defconfig +CONFIG = package/config + +noconfig_targets := menuconfig config oldconfig randconfig \ + defconfig allyesconfig allnoconfig release tags + +# Pull in the user's configuration file +ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),) +-include $(TOPDIR).config +endif + +ifeq ($(BR2_TAR_VERBOSITY),y) +TAR_OPTIONS=-xvf +else +TAR_OPTIONS=-xf +endif + +ifeq ($(strip $(BR2_HAVE_DOT_CONFIG)),y) + +############################################################# +# +# The list of stuff to build for the target toolchain +# along with the packages to build for the target. +# +############################################################## +TARGETS:=linux-headers host-sed uclibc-configured binutils gcc uclibc-target-utils +include toolchain/Makefile.in +include toolchain/*/Makefile.in +include package/Makefile.in +include package/*/Makefile.in +include target/Makefile.in +include target/*/Makefile.in + +############################################################# +# +# You should probably leave this stuff alone unless you know +# what you are doing. +# +############################################################# + + + +all: world + +# In this section, we need .config +include .config.cmd + +TARGETS_CLEAN:=$(patsubst %,%-clean,$(TARGETS)) +TARGETS_SOURCE:=$(patsubst %,%-source,$(TARGETS)) + +world: $(DL_DIR) $(BUILD_DIR) $(STAGING_DIR) $(TARGET_DIR) $(TARGETS) + +.PHONY: all world clean distclean source $(TARGETS) \ + $(TARGETS_CLEAN) $(TARGETS_DIRCLEAN) $(TARGETS_SOURCE) \ + $(DL_DIR) $(BUILD_DIR) $(TOOL_BUILD_DIR) $(STAGING_DIR) + +include toolchain/*/*.mk +include package/*/*.mk +include target/*/*.mk + +############################################################# +# +# staging and target directories do NOT list these as +# dependancies anywhere else +# +############################################################# +$(DL_DIR): + @mkdir -p $(DL_DIR) + +$(BUILD_DIR): + @mkdir -p $(BUILD_DIR) + +$(TOOL_BUILD_DIR): + @mkdir -p $(TOOL_BUILD_DIR) + +$(STAGING_DIR): + @mkdir -p $(STAGING_DIR)/lib + @mkdir -p $(STAGING_DIR)/include + @mkdir -p $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME) + @ln -sf ../lib $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib + +$(TARGET_DIR): + zcat target/default/skel.tar.gz | tar -C $(BUILD_DIR) -xf - + cp -a target/default/target_skeleton/* $(TARGET_DIR)/ + -find $(TARGET_DIR) -type d -name CVS -exec rm -rf {} \; > /dev/null 2>&1 + +source: $(TARGETS_SOURCE) + +############################################################# +# +# Cleanup and misc junk +# +############################################################# +clean: + rm -rf $(BUILD_DIR) $(IMAGE).* + @$(MAKE) -C $(CONFIG) clean + +distclean: clean + rm -rf $(DL_DIR) $(TOOL_BUILD_DIR) .config + +sourceball: + rm -rf $(BUILD_DIR) + set -e; \ + cd ..; \ + rm -f buildroot.tar.bz2; \ + tar -cvf buildroot.tar buildroot; \ + bzip2 -9 buildroot.tar; \ + + +else # ifeq ($(strip $(BR2_HAVE_DOT_CONFIG)),y) + +all: menuconfig + +# configuration +# --------------------------------------------------------------------------- + +$(CONFIG)/conf: + $(MAKE) -C $(CONFIG) conf + -@if [ ! -f .config ] ; then \ + cp $(CONFIG_DEFCONFIG) .config; \ + fi +$(CONFIG)/mconf: + $(MAKE) -C $(CONFIG) ncurses conf mconf + -@if [ ! -f .config ] ; then \ + cp $(CONFIG_DEFCONFIG) .config; \ + fi + +menuconfig: $(CONFIG)/mconf + @$(CONFIG)/mconf $(CONFIG_CONFIG_IN) + +config: $(CONFIG)/conf + @$(CONFIG)/conf $(CONFIG_CONFIG_IN) + +oldconfig: $(CONFIG)/conf + @$(CONFIG)/conf -o $(CONFIG_CONFIG_IN) + +randconfig: $(CONFIG)/conf + @$(CONFIG)/conf -r $(CONFIG_CONFIG_IN) + +allyesconfig: $(CONFIG)/conf + #@$(CONFIG)/conf -y $(CONFIG_CONFIG_IN) + #sed -i -e "s/^CONFIG_DEBUG.*/# CONFIG_DEBUG is not set/" .config + @$(CONFIG)/conf -o $(CONFIG_CONFIG_IN) + +allnoconfig: $(CONFIG)/conf + @$(CONFIG)/conf -n $(CONFIG_CONFIG_IN) + +defconfig: $(CONFIG)/conf + @$(CONFIG)/conf -d $(CONFIG_CONFIG_IN) + +############################################################# +# +# Cleanup and misc junk +# +############################################################# +clean: + @$(MAKE) -C $(CONFIG) clean + +distclean: clean + +endif # ifeq ($(strip $(BR2_HAVE_DOT_CONFIG)),y) + +.PHONY: dummy subdirs release distclean clean config oldconfig \ + menuconfig tags check test depend + + diff --git a/openwrt/docs/README b/openwrt/docs/README new file mode 100644 index 0000000000..0c7fb4cd4b --- /dev/null +++ b/openwrt/docs/README @@ -0,0 +1,18 @@ +To build and use the buildroot stuff, do the following: + +1) run 'make' +2) select which packages you wish to compile +3) run 'make' +4) wait while it compiles +5) Use your shiney new root filesystem. Depending on which sortof + root filesystem you selecter, you may want to loop mount it, + chroot into it, loop mount it and then nfs mount that on your + target device, burn it to flash, or whatever is appropriate + for your target system. + +You do not need to be root to build or run buildroot. Have fun! + + -Erik + +Please feed suggestions, bug reports, insults, and bribes back to: + Erik Andersen <andersen@codepoet.org> diff --git a/openwrt/docs/buildroot-documentation.html b/openwrt/docs/buildroot-documentation.html new file mode 100644 index 0000000000..8e6c08d047 --- /dev/null +++ b/openwrt/docs/buildroot-documentation.html @@ -0,0 +1,644 @@ +<?xml version="1.0" encoding="iso-8859-1"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> + <title>Buildroot - Usage and documentation</title> + <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> + <link rel="stylesheet" type="text/css" href="stylesheet.css" /> +</head> + +<body> + <div class="main"> + <div class="titre"> + <h1>Buildroot</h1> + </div> + + <p>Usage and documentation by Thomas Petazzoni. Contributions from + Karsten Kruse, Ned Ludd, Martin Herren.</p> + + <p><small>Last modification : $Id$</small></p> + + <ul> + <li><a href="#about">About Buildroot</a></li> + <li><a href="#download">Obtaining Buildroot</a></li> + <li><a href="#using">Using Buildroot</a></li> + <li><a href="#custom_targetfs">Customizing the target filesystem</a></li> + <li><a href="#custom_busybox">Customizing the Busybox + configuration</a></li> + <li><a href="#custom_uclibc">Customizing the uClibc + configuration</a></li> + <li><a href="#buildroot_innards">How Buildroot works</a></li> + <li><a href="#using_toolchain">Using the uClibc toolchain</a></li> + <li><a href="#toolchain_standalone">Using the uClibc toolchain + outside of Buildroot</a></li> + <li><a href="#downloaded_packages">Location of downloaded packages</a></li> + <li><a href="#add_software">Extending Buildroot with more + Software</a></li> + <li><a href="#links">Ressources</a></li> + </ul> + + <h2><a name="about" id="about"></a>About Buildroot</h2> + + <p>Buildroot is a set of Makefiles and patches that allows to easily + generate both a cross-compilation toolchain and a root filesystem for your + target. The cross-compilation toolchain uses uClibc (<a href= + "http://www.uclibc.org/">http://www.uclibc.org/</a>), a tiny C standard + library.</p> + + <p>Buildroot is useful mainly for people working with embedded systems. + Embedded systems often use processors that are not the regular x86 + processors everyone is used to have on his PC. It can be PowerPC + processors, MIPS processors, ARM processors, etc.</p> + + <p>A compilation toolchain is the set of tools that allows to + compile code for your system. It consists of a compiler (in our + case, <code>gcc</code>), binary utils like assembler and linker + (in our case, <code>binutils</code>) and a C standard library (for + example <a href="http://www.gnu.org/software/libc/libc.html">GNU + Libc</a>, <a href="http://www.uclibc.org">uClibc</a> or <a + href="http://www.fefe.de/dietlibc/">dietlibc</a>). The system + installed on your development station certainly already has a + compilation toolchain that you can use to compile application that + runs on your system. If you're using a PC, your compilation + toolchain runs on an x86 processor and generates code for a x86 + processor. Under most Linux systems, the compilation toolchain + uses the GNU libc as C standard library. This compilation + toolchain is called the "host compilation toolchain", and more + generally, the machine on which it is running, and on which you're + working is called the "host system". The compilation toolchain is + provided by your distribution, and Buildroot has nothing to do + with it.</p> + + <p>As said above, the compilation toolchain that comes with your system + runs and generates code for the processor of your host system. As your + embedded system has a different processor, you need a cross-compilation + toolchain: it's a compilation toolchain that runs on your host system but + that generates code for your target system (and target processor). For + example, if your host system uses x86 and your target system uses ARM, the + regular compilation toolchain of your host runs on x86 and generates code + for x86, while the cross-compilation toolchain runs on x86 and generates + code for ARM.</p> + + <p>Even if your embedded system uses a x86 processor, you might interested + in Buildroot, for two reasons:</p> + + <ul> + <li>The compilation toolchain of your host certainly uses the GNU Libc + which is a complete but huge C standard library. Instead of using GNU + Libc on your target system, you can use uClibc which is a tiny C standard + library. If you want to use this C library, then you need a compilation + toolchain to generate binaries linked with it. Buildroot can do it for + you.</li> + + <li>Buildroot automates the building of a root filesystem with all needed + tools like busybox. It makes it much easier than doing it by hand.</li> + </ul> + + <p>You might wonder why such a tool is needed when you can compile + <code>gcc</code>, <code>binutils</code>, uClibc and all the tools by hand. + Of course, doing so is possible. But dealing with all configure options, + with all problems of every <code>gcc</code> or <code>binutils</code> + version it very time-consuming and uninteresting. Buildroot automates this + process through the use of Makefiles, and has a collection of patches for + each <code>gcc</code> and <code>binutils</code> version to make them work + on most architectures.</p> + + <h2><a name="download" id="download"></a>Obtaining Buildroot</h2> + + <p>Buildroot is available as daily CVS snapshots or directly using + CVS.</p> + + <p>The latest snapshot is always available at <a + href="http://uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2">http://uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2</a>, + and previous snapshots are also available at <a + href="http://uclibc.org/downloads/snapshots/">http://uclibc.org/downloads/snapshots/</a>.</p> + + <p>To download Buildroot using CVS, you can simply follow + the rules described on the "Accessing CVS"-page (<a href= + "http://www.uclibc.org/cvs_anon.html">http://www.uclibc.org/cvs_anon.html</a>) + of the uClibc website (<a href= + "http://www.uclibc.org">http://www.uclibc.org</a>), and download the + <code>buildroot</code> CVS module. For the impatient, here's a quick + recipe:</p> + + <pre> + $ cvs -d:pserver:anonymous@uclibc.org:/var/cvs login + $ cvs -z3 -d:pserver:anonymous@uclibc.org:/var/cvs co buildroot +</pre> + + <h2><a name="using" id="using"></a>Using Buildroot</h2> + + <p>Buildroot has a nice configuration tool similar to the one you can find + in the Linux Kernel (<a href= + "http://www.kernel.org/">http://www.kernel.org/</a>) or in Busybox + (<a href="http://www.busybox.org/">http://www.busybox.org/</a>). Note that + you can run everything as a normal user. There is no need to be root to + configure and use Buildroot. The first step is to run the configuration + assistant:</p> + +<pre> + $ make menuconfig +</pre> + + <p>For each entry of the configuration tool, you can find associated help + that describes the purpose of the entry.</p> + + <p>Once everything is configured, the configuration tool has generated a + <code>.config</code> file that contains the description of your + configuration. It will be used by the Makefiles to do what's needed.</p> + + <p>Let's go:</p> + +<pre> + $ make +</pre> + + <p>This command will download, configure and compile all the selected + tools, and finally generate a target filesystem. The target filesystem will + be named <code>root_fs_ARCH.EXT</code> where <code>ARCH</code> is your + architecture and <code>EXT</code> depends on the type of target filesystem + selected in the <code>Target options</code> section of the configuration + tool.</p> + + <h2><a name="custom_targetfs" id="custom_targetfs"></a>Customizing the + target filesystem</h2> + + <p>There are two ways to customize the resulting target filesystem:</p> + + <ul> + <li>Customize the target filesystem directly, and rebuild the image. The + target filesystem is available under <code>build_ARCH/root/</code> where + <code>ARCH</code> is the chosen target architecture. You can simply make + your changes here, and run make afterwards, which will rebuild the target + filesystem image. This method allows to do everything on the target + filesystem, but if you decide to completely rebuild your toolchain and + tools, these changes will be lost.</li> + + <li>Customize the target filesystem skeleton, available under + <code>target/default/target_skeleton/</code>. You can customize + configuration files or other stuff here. However, the full file hierarchy + is not yet present, because it's created during the compilation process. + So you can't do everything on this target filesystem skeleton, but + changes to it remains even you completely rebuild the cross-compilation + toolchain and the tools.<br /> + You can also customize the <code>target/default/device_table.txt</code> + file which is used by the tools that generate the target filesystem image + to properly set permissions and create device nodes. The + <code>target/default/skel.tar.gz</code> file contains the main + directories of a root filesystem and there is no obvious reason for which + it should be changed. These main directories are in an tarball inside of + inside the skeleton because it contains symlinks that would be broken + otherwise.</li> + </ul> + + <h2><a name="custom_busybox" id="custom_busybox"></a>Customizing the + Busybox configuration</h2> + + <p>Busybox is very configurable, and you may want to customize it. You can + follow these simple steps to do it. It's not an optimal way, but it's + simple and it works.</p> + + <ol> + <li>Make a first compilation of buildroot with busybox without trying to + customize it.</li> + + <li>Go into <code>build_ARCH/busybox/</code> and run <code>make + menuconfig</code>. The nice configuration tool appears and you can + customize everything.</li> + + <li>Copy the <code>.config</code> file to + <code>package/busybox/busybox.config</code> so that your customized + configuration will remains even if you remove the cross-compilation + toolchain.</li> + + <li>Run the compilation of buildroot again.</li> + </ol> + + <p>Otherwise, you can simply change the + <code>package/busybox/busybox.config</code> file if you know the options + you want to change without using the configuration tool.</p> + + <h2><a name="custom_uclibc" id="custom_uclibc"></a>Customizing the uClibc + configuration</h2> + + <p>Just like <a href="#custom_busybox">BusyBox</a>, <a + href="http://www.uclibc.org">uClibc</a> offers a lot of + configuration options. They allow to select various + functionalities, depending on your needs and limitations.</p> + + <p>The easiest way to modify the configuration of uClibc is to + follow these steps :</p> + + <ol> + + <li>Make a first compilation of buildroot without trying to + customize uClibc.</li> + + <li>Go into the directory + <code>toolchain_build_ARCH/uClibc/</code> and run <code>make + menuconfig</code>. The nice configuration assistant, similar to + the one used in the Linux Kernel or in Buildroot appears. Make + your configuration as appropriate.</li> + + <li>Copy the <code>.config</code> file to + <code>toolchain/uClibc/uClibc.config</code> or + <code>toolchain/uClibc/uClibc.config-locale</code>. The former + is used if you haven't selected locale support in Buildroot + configuration, and the latter is used if you have selected + locale support.</li> + + <li>Run the compilation of Buildroot again</li> + + </ol> + + <p>Otherwise, you can simply change + <code>toolchain/uClibc/uClibc.config</code> or + <code>toolchain/uClibc/uClibc.config-locale</code> without running + the configuration assistant.</p> + + <h2><a name="buildroot_innards" id="buildroot_innards"></a>How Buildroot + works</h2> + + <p>As said above, Buildroot is basically a set of Makefiles that download, + configure and compiles software with the correct options. It also includes + some patches for various software, mainly the ones involved in the + cross-compilation tool chain (<code>gcc</code>, <code>binutils</code> and + uClibc).</p> + + <p>There is basically one Makefile per software, and they are named with + the <code>.mk</code> extension. Makefiles are split into three + sections:</p> + + <ul> + <li><b>package</b> (in the <code>package/</code> directory) contains the + Makefiles and associated files for all user-space tools that Buildroot + can compile and add to the target root filesystem. There is one + sub-directory per tool.</li> + + <li><b>toolchain</b> (in the <code>toolchain/</code> directory) contains + the Makefiles and associated files for all software related to the + cross-compilation toolchain : <code>binutils</code>, <code>ccache</code>, + <code>gcc</code>, <code>gdb</code>, <code>kernel-headers</code> and + <code>uClibc</code>.</li> + + <li><b>target</b> (in the <code>target</code> directory) contains the + Makefiles and associated files for software related to the generation of + the target root filesystem image. Four types of filesystems are supported + : ext2, jffs2, cramfs and squashfs. For each of them, there's a + sub-directory with the required files. There is also a + <code>default/</code> directory that contains the target filesystem + skeleton.</li> + </ul> + + <p>Each directory contains at least 3 files :</p> + + <ul> + <li><code>something.mk</code> is the Makefile that downloads, configures, + compiles and installs the software <code>something</code>.</li> + + <li><code>Config.in</code> is a part of the configuration tool + description file. It describes the option related to the current + software.</li> + + <li><code>Makefile.in</code> is a part of Makefile that sets various + variables according to the configuration given through the configuration + tool. For most tools it simply involves adding the name of the tool to + the <code>TARGETS</code> variable.</li> + </ul> + + <p>The main Makefile do the job through the following steps (once the + configuration is done):</p> + + <ol> + <li>Create the download directory (<code>dl/</code> by default). This is + where the tarballs will be downloaded. It is interesting to know that the + tarballs are in this directory because it may be useful to save them + somewhere to avoid further downloads.</li> + + <li>Create the build directory (<code>build_ARCH/</code> by default, + where <code>ARCH</code> is your architecture). This is where all + user-space tools while be compiled.</li> + + <li>Create the toolchain build directory + (<code>toolchain_build_ARCH/</code> by default, where <code>ARCH</code> + is your architecture). This is where the cross compilation toolchain will + be compiled.</li> + + <li>Setup the staging directory (<code>build_ARCH/staging_dir/</code> by + default). This is where the cross-compilation toolchain will be + installed. If you want to use the same cross-compilation toolchain for + other purposes, such as compiling third-party applications, you can add + <code>build_ARCH/staging_dir/bin</code> to your PATH, and then use + <code>arch-linux-gcc</code> to compile your application. In order to + setup this staging directory, it first removes it, and then it creates + various subdirectories and symlinks inside it.</li> + + <li>Create the target directory (<code>build_ARCH/root/</code> by + default) and the target filesystem skeleton. This directory will contain + the final root filesystem. To setup it up, it first deletes it, then it + uncompress the <code>target/default/skel.tar.gz</code> file to create the + main subdirectories and symlinks, copies the skeleton available in + <code>target/default/target_skeleton</code> and then removes useless + <code>CVS/</code> directories.</li> + + <li>Make the <code>TARGETS</code> dependency. This is where all the job + is done : all <code>Makefile.in</code> files "subscribe" targets into + this global variable, so that the needed tools gets compiled.</li> + </ol> + + <h2><a name="using_toolchain" id="using_toolchain"></a>Using the + uClibc toolchain</h2> + + <p>You may want to compile your own programs or other software + that are not packaged in Buildroot. In order to do this, you can + use the toolchain that was generated by Buildroot.</p> + + <p>The toolchain generated by Buildroot by default is located in + <code>build_ARCH/staging_dir/</code>. The simplest way to use it + is to add <code>build_ARCH/staging_dir/bin/</code> to your PATH + environnement variable, and then to use + <code>arch-linux-gcc</code>, <code>arch-linux-objdump</code>, + <code>arch-linux-ld</code>, etc.</p> + + <p>For example, you may add the following to your + <code>.bashrc</code> (considering you're building for the MIPS + architecture and that Buildroot is located in + <code>~/buildroot/</code>) :</p> + +<pre> +export PATH=$PATH:~/buildroot/build_mips/bin/ +</pre> + + <p>Then you can simply do :</p> + +<pre> +mips-linux-gcc -o foo foo.c +</pre> + + <p><b>Important</b> : do not try to move the toolchain to an other + directory, it won't work. There are some hard-coded paths in the + <i>gcc</i> configuration. If the default toolchain directory + doesn't suit your needs, please refer to the <a + href="#toolchain_standalone">Using the uClibc toolchain outside of + buildroot</a> section.</p> + + <h2><a name="toolchain_standalone" id="toolchain_standalone"></a>Using the + uClibc toolchain outside of buildroot</h2> + + <p>By default, the cross-compilation toolchain is generated inside + <code>build_ARCH/staging_dir/</code>. But sometimes, it may be useful to + install it somewhere else, so that it can be used to compile other programs + or by other users. Moving the <code>build_ARCH/staging_dir/</code> + directory elsewhere is <b>not possible</b>, because they are some hardcoded + paths in the toolchain configuration.</p> + + <p>If you want to use the generated toolchain for other purposes, + you can configure Buildroot to generate it elsewhere using the + option of the configuration tool : <code>Build options -> + Toolchain and header file location</code>, which defaults to + <code>$(BUILD_DIR)/staging_dir/</code>.</p> + + <h2><a name="downloaded_packages" + id="downloaded_packages"></a>Location of downloaded packages</h2> + + <p>It might be useful to know that the various tarballs that are + downloaded by the <i>Makefiles</i> are all stored in the + <code>DL_DIR</code> which by default is the <code>dl</code> + directory. It's useful for example if you want to keep a complete + version of Buildroot which is know to be working with the + associated tarballs. This will allow you to regenerate the + toolchain and the target filesystem with exactly the same + versions.</p> + + <h2><a name="add_software" id="add_software"></a>Extending Buildroot with + more software</h2> + + <p>This section will only consider the case in which you want to + add user-space software.</p> + + <h3>Package directory</h3> + + <p>First of all, create a directory under the <code>package</code> + directory for your software, for example <code>foo</code>.</p> + + <h3><code>Config.in</code> file</h3> + + <p>Then, create a file named <code>Config.in</code>. This file + will contain the portion of options description related to our + <code>foo</code> software that will be used and displayed in the + configuration tool. It should basically contain :</p> + +<pre> +config BR2_PACKAGE_FOO + bool "foo" + default n + help + This is a comment that explains what foo is. +</pre> + + <p>Of course, you can add other options to configure particular + things in your software.</p> + + <h3><code>Makefile.in</code> file</h3> + + <p>Then, write a <code>Makefile.in</code> file. Basically, this is + a very short <i>Makefile</i> that adds the name of the software to + the list of <code>TARGETS</code> that Buildroot will generate. In + fact, the name of the software is the the identifier of the target + inside the real <i>Makefile</i> that will do everything (download, + compile, install), and that we study below. Back to + <code>Makefile.in</code>, here is an example :</p> + +<pre> +ifeq ($(strip $(BR2_PACKAGE_FOO)),y) +TARGETS+=foo +endif +</pre> + + <p>As you can see, this short <i>Makefile</i> simply adds the + target <code>foo</code> to the list of targets handled by Buildroot + if software <i>foo</i> was selected using the configuration tool.</p> + + <h3>The real <i>Makefile</i></h3> + + <p>Finally, here's the hardest part. Create a file named + <code>foo.mk</code>. It will contain the <i>Makefile</i> rules that + are in charge of downloading, configuring, compiling and installing + the software. Below is an example that we will comment + afterwards.</p> + +<pre> + 1 ############################################################# + 2 # + 3 # foo + 4 # + 5 ############################################################# + 6 FOO_VERSION:=1.0 + 7 FOO_SOURCE:=less-$(FOO_VERSION).tar.gz + 8 FOO_SITE:=http://www.foosoftware.org/downloads + 9 FOO_DIR:=$(BUILD_DIR)/less-$(FOO_VERSION) + 10 FOO_BINARY:=foo + 11 FOO_TARGET_BINARY:=usr/bin/foo + 12 + 13 $(DL_DIR)/$(FOO_SOURCE): + 14 $(WGET) -P $(DL_DIR) $(FOO_SITE)/$(FOO_SOURCE) + 15 + 16 $(FOO_DIR)/.source: $(DL_DIR)/$(FOO_SOURCE) + 17 zcat $(DL_DIR)/$(FOO_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + 18 touch $(FOO_DIR)/.source + 19 + 20 $(FOO_DIR)/.configured: $(FOO_DIR)/.source + 21 (cd $(FOO_DIR); \ + 22 $(TARGET_CONFIGURE_OPTS) \ + 23 CFLAGS="$(TARGET_CFLAGS)" \ + 24 ./configure \ + 25 --target=$(GNU_TARGET_NAME) \ + 26 --host=$(GNU_TARGET_NAME) \ + 27 --build=$(GNU_HOST_NAME) \ + 28 --prefix=/usr \ + 29 --sysconfdir=/etc \ + 30 ); + 31 touch $(FOO_DIR)/.configured; + 32 + 33 $(FOO_DIR)/$(FOO_BINARY): $(FOO_DIR)/.configured + 34 $(MAKE) CC=$(TARGET_CC) -C $(FOO_DIR) + 35 + 36 $(TARGET_DIR)/$(FOO_TARGET_BINARY): $(FOO_DIR)/$(FOO_BINARY) + 37 $(MAKE) prefix=$(TARGET_DIR)/usr -C $(FOO_DIR) install + 38 rm -Rf $(TARGET_DIR)/usr/man + 39 + 40 foo: uclibc ncurses $(TARGET_DIR)/$(FOO_TARGET_BINARY) + 41 + 42 foo-source: $(DL_DIR)/$(FOO_SOURCE) + 43 + 44 foo-clean: + 45 $(MAKE) prefix=$(TARGET_DIR)/usr -C $(FOO_DIR) uninstall + 46 -$(MAKE) -C $(FOO_DIR) clean + 47 + 48 foo-dirclean: + 49 rm -rf $(FOO_DIR) + 50 +</pre> + + <p>First of all, this <i>Makefile</i> example works for a single + binary software. For other software such as libraries or more + complex stuff with multiple binaries, it should be adapted. Look at + the other <code>*.mk</code> files in the <code>package</code> + directory.</p> + + <p>At lines 6-11, a couple of useful variables are defined :</p> + + <ul> + + <li><code>FOO_VERSION</code> : The version of <i>foo</i> that + should be downloaded.</li> + + <li><code>FOO_SOURCE</code> : The name of the tarball of + <i>foo</i> on the download website of FTP site. As you can see + <code>FOO_VERSION</code> is used.</li> + + <li><code>FOO_SITE</code> : The HTTP or FTP site from which + <i>foo</i> archive is downloaded. It must include the complete + path to the directory where <code>FOO_SOURCE</code> can be + found.</li> + + <li><code>FOO_DIR</code> : The directory into which the software + will be configured and compiled. Basically, it's a subdirectory + of <code>BUILD_DIR</code> which is created upon decompression of + the tarball.</li> + + <li><code>FOO_BINARY</code> : Software binary name. As said + previously, this is an example for a single binary software.</li> + + <li><code>FOO_TARGET_BINARY</code> : The full path of the binary + inside the target filesystem.</li> + + </ul> + + <p>Lines 13-14 defines a target that downloads the tarball from + the remote site to the download directory + (<code>DL_DIR</code>).</p> + + <p>Lines 16-18 defines a target and associated rules that + uncompress the downloaded tarball. As you can see, this target + depends on the tarball file, so that the previous target (line + 13-14) is called before executing the rules of the current + target. Uncompressing is followed by <i>touching</i> a hidden file + to mark the software has having been uncompressed. This trick is + used everywhere in Buildroot <i>Makefile</i> to split steps + (download, uncompress, configure, compile, install) while still + having correct dependencies.</p> + + <p>Lines 20-31 defines a target and associated rules that + configures the software. It depends on the previous target (the + hidden <code>.source</code> file) so that we are sure the software has + been uncompressed. In order to configure it, it basically runs the + well-known <code>./configure</code>script. As we may be doing + cross-compilation, <code>target</code>, <code>host</code> and + <code>build</code> arguments are given. The prefix is also set to + <code>/usr</code>, not because the software will be installed in + <code>/usr</code> on your host system, but in the target + filesystem. Finally it creates a <code>.configured</code> file to + mark the software as configured.</p> + + <p>Lines 33-34 defines a target and a rule that compiles the + software. This target will create the binary file in the + compilation directory, and depends on the software being already + configured (hence the reference to the <code>.configured</code> + file). It basically runs <code>make</code> inside the source + directory.</p> + + <p>Lines 36-38 defines a target and associated rules that install + the software inside the target filesystem. It depends on the + binary file in the source directory, to make sure the software has + been compiled. It uses the <code>install</code> target of the + software <code>Makefile</code> by passing a <code>prefix</code> + argument, so that the <code>Makefile</code> doesn't try to install + the software inside host <code>/usr</code> but inside target + <code>/usr</code>. After the installation, the + <code>/usr/man</code> directory inside the target filesystem is + removed to save space.</p> + + <p>Line 40 defines the main target of the software, the one + referenced in the <code>Makefile.in</code> file. This targets + should first of all depends on the dependecies of the software (in + our example, <i>uclibc</i> and <i>ncurses</i>), and then to the + final binary. This last dependency will call all previous + dependencies in the right order. </p> + + <p>Line 42 defines a simple target that only downloads the code + source. This is not used during normal operation of Buildroot, but + might be useful.</p> + + <p>Lignes 44-46 define a simple target to clean the software build + by calling the <i>Makefiles</i> with the appropriate option.</p> + + <p>Lines 48-49 define a simple target to completely remove the + directory in which the software was uncompressed, configured and + compiled.</p> + + <h3>Conclusion</h3> + + <p>As you can see, adding a software to buildroot is simply a + matter of writing a <i>Makefile</i> using an already existing + example and to modify it according to the compilation process of + the software.</p> + + <p>If you package software that might be useful for other persons, + don't forget to send a patch to Buildroot developers !</p> + + <h2><a name="links" id="links"></a>Ressources</h2> + + <p>To learn more about Buildroot you can visit these + websites:</p> + + <ul> + <li><a href="http://www.uclibc.org/">http://www.uclibc.org/</a></li> + <li><a href="http://www.busybox.net/">http://www.busybox.net/</a></li> + </ul> + + </div> +</body> +</html> diff --git a/openwrt/docs/stylesheet.css b/openwrt/docs/stylesheet.css new file mode 100644 index 0000000000..2c36417823 --- /dev/null +++ b/openwrt/docs/stylesheet.css @@ -0,0 +1,65 @@ +body { + margin: 0px 0px 0px 0px; + color: white; + background-color: #93c6f9; + font: 12pt/18pt georgia; +} + +div.main { + margin: 10px 10px 10px 10px; + padding: 10px 10px 10px 10px; + color: black; + background-color: white; +} + +div.titre { + text-align: center; + background-color: #336699; + color: white; + padding: 10px 10px 10px 10px; +} + +h1 { + text-align: center; + font: 26pt georgia; + letter-spacing: 3px; +} + +h2 { + padding: 5px 5px 5px 5px; + background-color: #c2e0ff; + color: #336699; +} + +a:link, a:visited { + font-weight: bold; + text-decoration: none; + color: #336699; +} + +a:hover, a:active { + text-decoration: underline; + color: #9685BA; +} + +h3 { + font: italic normal 14pt georgia; + letter-spacing: 1px; + margin-bottom: 0px; + margin-left: 10px; + margin-right: 10px; + color: #336699; +} + +p { + margin-left: 10px; + margin-right: 10px; + text-align: justify; +} + +pre { + border-left: 3px #aaa solid; + margin-left: 1em; + padding: 0 1em; + color: #888; +} \ No newline at end of file diff --git a/openwrt/package/Config.in b/openwrt/package/Config.in new file mode 100644 index 0000000000..30f45ad142 --- /dev/null +++ b/openwrt/package/Config.in @@ -0,0 +1,15 @@ +# + +menu "OpenWrt Package Selection" + +comment "The default set" +source "package/busybox/Config.in" +source "package/dnsmasq/Config.in" +source "package/linux/Config.in" +source "package/iptables/Config.in" +source "package/bridge/Config.in" + +comment "Suggested Extras" +source "package/dropbear_sshd/Config.in" + +endmenu diff --git a/openwrt/package/Makefile.in b/openwrt/package/Makefile.in new file mode 100644 index 0000000000..a59ab973fb --- /dev/null +++ b/openwrt/package/Makefile.in @@ -0,0 +1,64 @@ +MAKE1=make +MAKE=make -j$(BR2_JLEVEL) + +# Strip off the annoying quoting +ARCH:=$(strip $(subst ",, $(BR2_ARCH))) +#" +WGET:=$(strip $(subst ",, $(BR2_WGET))) +#" + +ifneq ($(BR2_LARGEFILE),y) +DISABLE_LARGEFILE= --disable-largefile +endif +TARGET_CFLAGS=$(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING) + +HOSTCC:=gcc +BASE_DIR:=${shell pwd} +DL_DIR:=$(BASE_DIR)/dl +#PATCH_DIR=$(BASE_DIR)/sources/patches +BUILD_DIR:=$(BASE_DIR)/build_$(ARCH)$(ARCH_FPU_SUFFIX) +TARGET_DIR:=$(BUILD_DIR)/root +TOOL_BUILD_DIR=$(BASE_DIR)/toolchain_build_$(ARCH)$(ARCH_FPU_SUFFIX) +# Strip off the annoying quoting +STAGING_DIR:=$(strip $(subst ",, $(BR2_STAGING_DIR))) +#" +TARGET_PATH=$(STAGING_DIR)/bin:/bin:/sbin:/usr/bin:/usr/sbin +IMAGE:=$(BASE_DIR)/root_fs_$(ARCH)$(ARCH_FPU_SUFFIX) +REAL_GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux-uclibc +GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux +KERNEL_CROSS=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc- +TARGET_CROSS=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc- +TARGET_CC=$(TARGET_CROSS)gcc +STRIP=$(TARGET_CROSS)strip --remove-section=.comment --remove-section=.note + + +HOST_ARCH:=$(shell $(HOSTCC) -dumpmachine | sed -e s'/-.*//' \ + -e 's/sparc.*/sparc/' \ + -e 's/arm.*/arm/g' \ + -e 's/m68k.*/m68k/' \ + -e 's/ppc/powerpc/g' \ + -e 's/v850.*/v850/g' \ + -e 's/sh[234]/sh/' \ + -e 's/mips-.*/mips/' \ + -e 's/mipsel-.*/mipsel/' \ + -e 's/cris.*/cris/' \ + -e 's/i[3-9]86/i386/' \ + ) +GNU_HOST_NAME:=$(HOST_ARCH)-pc-linux-gnu +TARGET_CONFIGURE_OPTS=PATH=$(TARGET_PATH) \ + AR=$(TARGET_CROSS)ar \ + AS=$(TARGET_CROSS)as \ + LD=$(TARGET_CROSS)ld \ + NM=$(TARGET_CROSS)nm \ + CC=$(TARGET_CROSS)gcc \ + GCC=$(TARGET_CROSS)gcc \ + CXX=$(TARGET_CROSS)g++ \ + RANLIB=$(TARGET_CROSS)ranlib + +ifeq ($(ENABLE_LOCALE),true) +DISABLE_NLS:= +else +DISABLE_NLS:=--disable-nls +endif + + diff --git a/openwrt/package/bridge/Config.in b/openwrt/package/bridge/Config.in new file mode 100644 index 0000000000..8a5ebce0e9 --- /dev/null +++ b/openwrt/package/bridge/Config.in @@ -0,0 +1,8 @@ +config BR2_PACKAGE_BRIDGE + bool "bridge" + default n + help + Manage ethernet bridging; a way to connect networks together to + form a larger network. + + http://bridge.sourceforge.net/ diff --git a/openwrt/package/bridge/Makefile.in b/openwrt/package/bridge/Makefile.in new file mode 100644 index 0000000000..5636052953 --- /dev/null +++ b/openwrt/package/bridge/Makefile.in @@ -0,0 +1,3 @@ +ifeq ($(strip $(BR2_PACKAGE_BRIDGE)),y) +TARGETS+=bridge +endif diff --git a/openwrt/package/bridge/bridge.mk b/openwrt/package/bridge/bridge.mk new file mode 100644 index 0000000000..7865b6e308 --- /dev/null +++ b/openwrt/package/bridge/bridge.mk @@ -0,0 +1,61 @@ +############################################################# +# +# bridgeutils - User Space Program For Controling Bridging +# +############################################################# +# +BRIDGE_SOURCE_URL=http://umn.dl.sourceforge.net/sourceforge/bridge/ +BRIDGE_SOURCE=bridge-utils-1.0.4.tar.gz +BRIDGE_BUILD_DIR=$(BUILD_DIR)/bridge-utils-1.0.4 +BRIDGE_TARGET_BINARY:=usr/sbin/brctl + +$(DL_DIR)/$(BRIDGE_SOURCE): + $(WGET) -P $(DL_DIR) $(BRIDGE_SOURCE_URL)/$(BRIDGE_SOURCE) + +$(BRIDGE_BUILD_DIR)/.unpacked: $(DL_DIR)/$(BRIDGE_SOURCE) + zcat $(DL_DIR)/$(BRIDGE_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + patch -p1 -d $(BRIDGE_BUILD_DIR) < package/bridge/bridge.patch + touch $(BRIDGE_BUILD_DIR)/.unpacked + +$(BRIDGE_BUILD_DIR)/.configured: $(BRIDGE_BUILD_DIR)/.unpacked + (cd $(BRIDGE_BUILD_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + --with-linux=$(LINUX_DIR) \ + ); + touch $(BRIDGE_BUILD_DIR)/.configured + +$(BRIDGE_BUILD_DIR)/brctl/brctl: $(BRIDGE_BUILD_DIR)/.configured + $(MAKE) -C $(BRIDGE_BUILD_DIR) + +$(TARGET_DIR)/$(BRIDGE_TARGET_BINARY): $(BRIDGE_BUILD_DIR)/brctl/brctl + cp -af $(BRIDGE_BUILD_DIR)/brctl/brctl $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY) + $(STRIP) $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY) + #cp -af $(BRIDGE_BUILD_DIR)/brctl/brctld $(TARGET_DIR)/usr/sbin/ + #$(STRIP) $(TARGET_DIR)/usr/sbin/brctld + +bridge: linux $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY) + +bridge-source: $(DL_DIR)/$(BRIDGE_SOURCE) + +bridge-clean: + #$(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(BRIDGE_BUILD_DIR) uninstall + -$(MAKE) -C $(BRIDGE_BUILD_DIR) clean + +bridge-dirclean: + rm -rf $(BRIDGE_BUILD_DIR) diff --git a/openwrt/package/bridge/bridge.patch b/openwrt/package/bridge/bridge.patch new file mode 100644 index 0000000000..f44737750b --- /dev/null +++ b/openwrt/package/bridge/bridge.patch @@ -0,0 +1,11 @@ +--- bridge-utils-0.9.6/libbridge/Makefile.in.dist 2004-03-01 20:55:52.000000000 -0600 ++++ bridge-utils-0.9.6/libbridge/Makefile.in 2004-03-01 20:56:23.000000000 -0600 +@@ -5,7 +5,7 @@ + RANLIB=@RANLIB@ + + CC=@CC@ +-CFLAGS = -Wall -g $(KERNEL_HEADERS) ++CFLAGS = -Wall -g @CFLAGS@ $(KERNEL_HEADERS) + + prefix=@prefix@ + exec_prefix=@exec_prefix@ diff --git a/openwrt/package/busybox/Config.in b/openwrt/package/busybox/Config.in new file mode 100644 index 0000000000..320cb9b1c0 --- /dev/null +++ b/openwrt/package/busybox/Config.in @@ -0,0 +1,19 @@ +config BR2_PACKAGE_BUSYBOX + bool "busybox" + default y + help + The Swiss Army Knife of embedded Linux. It slices, it dices, it + makes Julian Fries. + + http://busybox.net/ + + Most people will answer Y. + +config BR2_PACKAGE_BUSYBOX_SNAPSHOT + bool "Use the daily snapshot of busybox?" + depends BR2_PACKAGE_BUSYBOX + default y + help + Use the latest busybox CVS snapshot instead of release. + + For fun, you should say Y. diff --git a/openwrt/package/busybox/Makefile.in b/openwrt/package/busybox/Makefile.in new file mode 100644 index 0000000000..a8efafb8b4 --- /dev/null +++ b/openwrt/package/busybox/Makefile.in @@ -0,0 +1,3 @@ +ifeq ($(strip $(BR2_PACKAGE_BUSYBOX)),y) +TARGETS+=busybox +endif diff --git a/openwrt/package/busybox/busybox.config b/openwrt/package/busybox/busybox.config new file mode 100644 index 0000000000..7335635f70 --- /dev/null +++ b/openwrt/package/busybox/busybox.config @@ -0,0 +1,464 @@ +# +# Automatically generated make config: don't edit +# +HAVE_DOT_CONFIG=y + +# +# General Configuration +# +# CONFIG_FEATURE_BUFFERS_USE_MALLOC is not set +CONFIG_FEATURE_BUFFERS_GO_ON_STACK=y +# CONFIG_FEATURE_BUFFERS_GO_IN_BSS is not set +CONFIG_FEATURE_VERBOSE_USAGE=y +# CONFIG_FEATURE_INSTALLER is not set +# CONFIG_LOCALE_SUPPORT is not set +# CONFIG_FEATURE_DEVFS is not set +CONFIG_FEATURE_DEVPTS=y +# CONFIG_FEATURE_CLEAN_UP is not set +CONFIG_FEATURE_SUID=y +# CONFIG_FEATURE_SUID_CONFIG is not set +# CONFIG_SELINUX is not set + +# +# Build Options +# +# CONFIG_STATIC is not set +CONFIG_LFS=y +# USING_CROSS_COMPILER is not set +EXTRA_CFLAGS_OPTIONS="" + +# +# Installation Options +# +# CONFIG_INSTALL_NO_USR is not set +PREFIX="./_install" + +# +# Archival Utilities +# +# CONFIG_AR is not set +CONFIG_BUNZIP2=y +# CONFIG_CPIO is not set +# CONFIG_DPKG is not set +# CONFIG_DPKG_DEB is not set +CONFIG_GUNZIP=y +# CONFIG_FEATURE_GUNZIP_UNCOMPRESS is not set +CONFIG_GZIP=y +# CONFIG_RPM2CPIO is not set +# CONFIG_RPM is not set +CONFIG_TAR=y +CONFIG_FEATURE_TAR_CREATE=y +CONFIG_FEATURE_TAR_BZIP2=y +# CONFIG_FEATURE_TAR_FROM is not set +CONFIG_FEATURE_TAR_GZIP=y +# CONFIG_FEATURE_TAR_COMPRESS is not set +# CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY is not set +CONFIG_FEATURE_TAR_GNU_EXTENSIONS=y +# CONFIG_FEATURE_TAR_LONG_OPTIONS is not set +# CONFIG_UNCOMPRESS is not set +CONFIG_UNZIP=y + +# +# Common options for cpio and tar +# +# CONFIG_FEATURE_UNARCHIVE_TAPE is not set + +# +# Coreutils +# +CONFIG_BASENAME=y +# CONFIG_CAL is not set +CONFIG_CAT=y +CONFIG_CHGRP=y +CONFIG_CHMOD=y +CONFIG_CHOWN=y +CONFIG_CHROOT=y +CONFIG_CMP=y +CONFIG_CP=y +CONFIG_CUT=y +CONFIG_DATE=y +CONFIG_FEATURE_DATE_ISOFMT=y +CONFIG_DD=y +CONFIG_DF=y +CONFIG_DIRNAME=y +CONFIG_DOS2UNIX=y +CONFIG_UNIX2DOS=y +CONFIG_DU=y +CONFIG_FEATURE_DU_DEFALT_BLOCKSIZE_1K=y +CONFIG_ECHO=y +CONFIG_FEATURE_FANCY_ECHO=y +CONFIG_ENV=y +CONFIG_EXPR=y +CONFIG_FALSE=y +# CONFIG_FOLD is not set +CONFIG_HEAD=y +# CONFIG_FEATURE_FANCY_HEAD is not set +CONFIG_HOSTID=y +CONFIG_ID=y +CONFIG_INSTALL=y +# CONFIG_LENGTH is not set +CONFIG_LN=y +CONFIG_LOGNAME=y +CONFIG_LS=y +CONFIG_FEATURE_LS_FILETYPES=y +CONFIG_FEATURE_LS_FOLLOWLINKS=y +CONFIG_FEATURE_LS_RECURSIVE=y +CONFIG_FEATURE_LS_SORTFILES=y +CONFIG_FEATURE_LS_TIMESTAMPS=y +CONFIG_FEATURE_LS_USERNAME=y +CONFIG_FEATURE_LS_COLOR=y +CONFIG_MD5SUM=y +CONFIG_MKDIR=y +# CONFIG_MKFIFO is not set +CONFIG_MKNOD=y +CONFIG_MV=y +# CONFIG_OD is not set +# CONFIG_PRINTF is not set +CONFIG_PWD=y +# CONFIG_REALPATH is not set +CONFIG_RM=y +CONFIG_RMDIR=y +# CONFIG_SEQ is not set +CONFIG_SHA1SUM=y +CONFIG_SLEEP=y +# CONFIG_FEATURE_FANCY_SLEEP is not set +CONFIG_SORT=y +CONFIG_STTY=y +CONFIG_SYNC=y +CONFIG_TAIL=y +CONFIG_FEATURE_FANCY_TAIL=y +CONFIG_TEE=y +CONFIG_FEATURE_TEE_USE_BLOCK_IO=y +CONFIG_TEST=y +CONFIG_FEATURE_TEST_64=y + +# +# test (forced enabled for use with shell) +# +CONFIG_TOUCH=y +# CONFIG_TR is not set +CONFIG_TRUE=y +CONFIG_TTY=y +CONFIG_UNAME=y +CONFIG_UNIQ=y +CONFIG_USLEEP=y +CONFIG_UUDECODE=y +CONFIG_UUENCODE=y +# CONFIG_WATCH is not set +CONFIG_WC=y +# CONFIG_WHO is not set +CONFIG_WHOAMI=y +CONFIG_YES=y + +# +# Common options for cp and mv +# +CONFIG_FEATURE_PRESERVE_HARDLINKS=y + +# +# Common options for ls and more +# +CONFIG_FEATURE_AUTOWIDTH=y + +# +# Common options for df, du, ls +# +CONFIG_FEATURE_HUMAN_READABLE=y + +# +# Common options for md5sum, sha1sum +# +CONFIG_FEATURE_MD5_SHA1_SUM_CHECK=y + +# +# Console Utilities +# +CONFIG_CHVT=y +CONFIG_CLEAR=y +CONFIG_DEALLOCVT=y +# CONFIG_DUMPKMAP is not set +# CONFIG_LOADFONT is not set +# CONFIG_LOADKMAP is not set +CONFIG_OPENVT=y +CONFIG_RESET=y +# CONFIG_SETKEYCODES is not set + +# +# Debian Utilities +# +CONFIG_MKTEMP=y +# CONFIG_PIPE_PROGRESS is not set +CONFIG_READLINK=y +CONFIG_FEATURE_READLINK_FOLLOW=y +CONFIG_RUN_PARTS=y +CONFIG_START_STOP_DAEMON=y +CONFIG_WHICH=y + +# +# Editors +# +# CONFIG_AWK is not set +# CONFIG_PATCH is not set +CONFIG_SED=y +CONFIG_VI=y +CONFIG_FEATURE_VI_COLON=y +CONFIG_FEATURE_VI_YANKMARK=y +CONFIG_FEATURE_VI_SEARCH=y +CONFIG_FEATURE_VI_USE_SIGNALS=y +CONFIG_FEATURE_VI_DOT_CMD=y +CONFIG_FEATURE_VI_READONLY=y +CONFIG_FEATURE_VI_SETOPTS=y +CONFIG_FEATURE_VI_SET=y +CONFIG_FEATURE_VI_WIN_RESIZE=y +CONFIG_FEATURE_VI_OPTIMIZE_CURSOR=y + +# +# Finding Utilities +# +CONFIG_FIND=y +CONFIG_FEATURE_FIND_MTIME=y +CONFIG_FEATURE_FIND_PERM=y +CONFIG_FEATURE_FIND_TYPE=y +CONFIG_FEATURE_FIND_XDEV=y +# CONFIG_FEATURE_FIND_NEWER is not set +# CONFIG_FEATURE_FIND_INUM is not set +CONFIG_GREP=y +CONFIG_FEATURE_GREP_EGREP_ALIAS=y +CONFIG_FEATURE_GREP_FGREP_ALIAS=y +CONFIG_FEATURE_GREP_CONTEXT=y +CONFIG_XARGS=y +# CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION is not set +CONFIG_FEATURE_XARGS_SUPPORT_QUOTES=y +CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT=y +CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM=y + +# +# Init Utilities +# +CONFIG_INIT=y +CONFIG_FEATURE_USE_INITTAB=y +CONFIG_FEATURE_INITRD=y +# CONFIG_FEATURE_INIT_COREDUMPS is not set +CONFIG_FEATURE_EXTRA_QUIET=y +CONFIG_HALT=y +CONFIG_POWEROFF=y +CONFIG_REBOOT=y +# CONFIG_MESG is not set + +# +# Login/Password Management Utilities +# +# CONFIG_USE_BB_PWD_GRP is not set +CONFIG_ADDGROUP=y +CONFIG_DELGROUP=y +CONFIG_ADDUSER=y +CONFIG_DELUSER=y +CONFIG_GETTY=y +# CONFIG_FEATURE_U_W_TMP is not set +CONFIG_LOGIN=y +CONFIG_FEATURE_SECURETTY=y +CONFIG_PASSWD=y +CONFIG_SU=y +CONFIG_SULOGIN=y +CONFIG_VLOCK=y + +# +# Common options for adduser, deluser, login, su +# +CONFIG_FEATURE_SHADOWPASSWDS=y + +# +# Miscellaneous Utilities +# +# CONFIG_ADJTIMEX is not set +# CONFIG_CROND is not set +# CONFIG_CRONTAB is not set +CONFIG_DC=y +# CONFIG_DEVFSD is not set +# CONFIG_LAST is not set +# CONFIG_HDPARM is not set +# CONFIG_MAKEDEVS is not set +CONFIG_MT=y +# CONFIG_RX is not set +CONFIG_STRINGS=y +CONFIG_TIME=y +# CONFIG_WATCHDOG is not set + +# +# Linux Module Utilities +# +CONFIG_INSMOD=y +CONFIG_FEATURE_2_4_MODULES=y +# CONFIG_FEATURE_2_6_MODULES is not set +# CONFIG_FEATURE_INSMOD_VERSION_CHECKING is not set +# CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS is not set +# CONFIG_FEATURE_INSMOD_LOADINKMEM is not set +# CONFIG_FEATURE_INSMOD_LOAD_MAP is not set +CONFIG_LSMOD=y +CONFIG_FEATURE_QUERY_MODULE_INTERFACE=y +CONFIG_MODPROBE=y +CONFIG_RMMOD=y +CONFIG_FEATURE_CHECK_TAINTED_MODULE=y + +# +# Networking Utilities +# +# CONFIG_FEATURE_IPV6 is not set +# CONFIG_ARPING is not set +# CONFIG_FTPGET is not set +# CONFIG_FTPPUT is not set +CONFIG_HOSTNAME=y +# CONFIG_HTTPD is not set +CONFIG_IFCONFIG=y +CONFIG_FEATURE_IFCONFIG_STATUS=y +# CONFIG_FEATURE_IFCONFIG_SLIP is not set +# CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ is not set +# CONFIG_FEATURE_IFCONFIG_HW is not set +# CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS is not set +CONFIG_IFUPDOWN=y +# CONFIG_FEATURE_IFUPDOWN_IP is not set +CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN=y +CONFIG_FEATURE_IFUPDOWN_IPV4=y +# CONFIG_FEATURE_IFUPDOWN_IPV6 is not set +# CONFIG_FEATURE_IFUPDOWN_IPX is not set +# CONFIG_FEATURE_IFUPDOWN_MAPPING is not set +# CONFIG_INETD is not set +# CONFIG_IP is not set +# CONFIG_IPCALC is not set +# CONFIG_IPADDR is not set +# CONFIG_IPLINK is not set +# CONFIG_IPROUTE is not set +# CONFIG_IPTUNNEL is not set +# CONFIG_NAMEIF is not set +# CONFIG_NC is not set +CONFIG_NETSTAT=y +CONFIG_NSLOOKUP=y +CONFIG_PING=y +CONFIG_FEATURE_FANCY_PING=y +CONFIG_ROUTE=y +CONFIG_TELNET=y +CONFIG_FEATURE_TELNET_TTYPE=y +# CONFIG_FEATURE_TELNET_AUTOLOGIN is not set +# CONFIG_TELNETD is not set +# CONFIG_TFTP is not set +# CONFIG_TRACEROUTE is not set +# CONFIG_VCONFIG is not set +CONFIG_WGET=y +CONFIG_FEATURE_WGET_STATUSBAR=y +CONFIG_FEATURE_WGET_AUTHENTICATION=y +# CONFIG_FEATURE_WGET_IP6_LITERAL is not set + +# +# udhcp Server/Client +# +CONFIG_UDHCPD=y +CONFIG_UDHCPC=y +CONFIG_DUMPLEASES=y +CONFIG_FEATURE_UDHCP_SYSLOG=y +# CONFIG_FEATURE_UDHCP_DEBUG is not set + +# +# Process Utilities +# +CONFIG_FREE=y +CONFIG_KILL=y +CONFIG_KILLALL=y +CONFIG_PIDOF=y +CONFIG_PS=y +# CONFIG_RENICE is not set +# CONFIG_TOP is not set +CONFIG_UPTIME=y +# CONFIG_SYSCTL is not set + +# +# Another Bourne-like Shell +# +CONFIG_FEATURE_SH_IS_ASH=y +# CONFIG_FEATURE_SH_IS_HUSH is not set +# CONFIG_FEATURE_SH_IS_LASH is not set +# CONFIG_FEATURE_SH_IS_MSH is not set +# CONFIG_FEATURE_SH_IS_NONE is not set +CONFIG_ASH=y + +# +# Ash Shell Options +# +CONFIG_ASH_JOB_CONTROL=y +CONFIG_ASH_ALIAS=y +CONFIG_ASH_MATH_SUPPORT=y +CONFIG_ASH_MATH_SUPPORT_64=y +# CONFIG_ASH_GETOPTS is not set +# CONFIG_ASH_CMDCMD is not set +# CONFIG_ASH_MAIL is not set +CONFIG_ASH_OPTIMIZE_FOR_SIZE=y +# CONFIG_ASH_RANDOM_SUPPORT is not set +# CONFIG_HUSH is not set +# CONFIG_LASH is not set +# CONFIG_MSH is not set + +# +# Bourne Shell Options +# +# CONFIG_FEATURE_SH_EXTRA_QUIET is not set +# CONFIG_FEATURE_SH_STANDALONE_SHELL is not set +CONFIG_FEATURE_COMMAND_EDITING=y +CONFIG_FEATURE_COMMAND_HISTORY=15 +CONFIG_FEATURE_COMMAND_SAVEHISTORY=y +CONFIG_FEATURE_COMMAND_TAB_COMPLETION=y +# CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION is not set +CONFIG_FEATURE_SH_FANCY_PROMPT=y + +# +# System Logging Utilities +# +CONFIG_SYSLOGD=y +CONFIG_FEATURE_ROTATE_LOGFILE=y +# CONFIG_FEATURE_REMOTE_LOG is not set +# CONFIG_FEATURE_IPC_SYSLOG is not set +CONFIG_KLOGD=y +CONFIG_LOGGER=y + +# +# Linux System Utilities +# +CONFIG_DMESG=y +# CONFIG_FBSET is not set +# CONFIG_FDFLUSH is not set +CONFIG_FDFORMAT=y +CONFIG_FDISK=y +FDISK_SUPPORT_LARGE_DISKS=y +CONFIG_FEATURE_FDISK_WRITABLE=y +# CONFIG_FEATURE_AIX_LABEL is not set +# CONFIG_FEATURE_SGI_LABEL is not set +# CONFIG_FEATURE_SUN_LABEL is not set +# CONFIG_FEATURE_OSF_LABEL is not set +# CONFIG_FEATURE_FDISK_ADVANCED is not set +# CONFIG_FREERAMDISK is not set +# CONFIG_FSCK_MINIX is not set +# CONFIG_MKFS_MINIX is not set +CONFIG_GETOPT=y +CONFIG_HEXDUMP=y +CONFIG_HWCLOCK=y +CONFIG_FEATURE_HWCLOCK_LONGOPTIONS=y +# CONFIG_LOSETUP is not set +# CONFIG_MKSWAP is not set +CONFIG_MORE=y +CONFIG_FEATURE_USE_TERMIOS=y +CONFIG_PIVOT_ROOT=y +CONFIG_RDATE=y +CONFIG_SWAPONOFF=y +CONFIG_MOUNT=y +# CONFIG_NFSMOUNT is not set +CONFIG_UMOUNT=y +# CONFIG_FEATURE_MOUNT_FORCE is not set + +# +# Common options for mount/umount +# +CONFIG_FEATURE_MOUNT_LOOP=y +# CONFIG_FEATURE_MTAB_SUPPORT is not set + +# +# Debugging Options +# +# CONFIG_DEBUG is not set diff --git a/openwrt/package/busybox/busybox.mk b/openwrt/package/busybox/busybox.mk new file mode 100644 index 0000000000..ae9abf1332 --- /dev/null +++ b/openwrt/package/busybox/busybox.mk @@ -0,0 +1,62 @@ +############################################################# +# +# busybox +# +############################################################# + +ifeq ($(strip $(BR2_PACKAGE_BUSYBOX_SNAPSHOT)),y) +# Be aware that this changes daily.... +BUSYBOX_DIR:=$(BUILD_DIR)/busybox +BUSYBOX_SOURCE:=busybox-snapshot.tar.bz2 +BUSYBOX_SITE:=http://www.busybox.net/downloads/snapshots +else +BUSYBOX_VER:=1.00 +BUSYBOX_DIR:=$(BUILD_DIR)/busybox-$(BUSYBOX_VER) +BUSYBOX_SOURCE:=busybox-$(BUSYBOX_VER).tar.bz2 +BUSYBOX_SITE:=http://www.busybox.net/downloads +endif +BUSYBOX_UNZIP=bzcat +BUSYBOX_CONFIG:=package/busybox/busybox.config + +$(DL_DIR)/$(BUSYBOX_SOURCE): + $(WGET) -P $(DL_DIR) $(BUSYBOX_SITE)/$(BUSYBOX_SOURCE) + +busybox-source: $(DL_DIR)/$(BUSYBOX_SOURCE) $(BUSYBOX_CONFIG) + +$(BUSYBOX_DIR)/.unpacked: $(DL_DIR)/$(BUSYBOX_SOURCE) + $(BUSYBOX_UNZIP) $(DL_DIR)/$(BUSYBOX_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + # Allow busybox patches. + toolchain/patch-kernel.sh $(BUSYBOX_DIR) package/busybox busybox-\*.patch + touch $(BUSYBOX_DIR)/.unpacked + +$(BUSYBOX_DIR)/.configured: $(BUSYBOX_DIR)/.unpacked $(BUSYBOX_CONFIG) + cp $(BUSYBOX_CONFIG) $(BUSYBOX_DIR)/.config + $(SED) "s,^CROSS.*,CROSS=$(TARGET_CROSS)\n\ + PREFIX=$(TARGET_DIR),;" $(BUSYBOX_DIR)/Rules.mak +ifeq ($(BR2_LARGEFILE),y) + $(SED) "s/^.*CONFIG_LFS.*/CONFIG_LFS=y/;" $(BUSYBOX_DIR)/.config +else + $(SED) "s/^.*CONFIG_LFS.*/CONFIG_LFS=n/;" $(BUSYBOX_DIR)/.config + $(SED) "s/^.*FDISK_SUPPORT_LARGE_DISKS.*/FDISK_SUPPORT_LARGE_DISKS=n/;" $(BUSYBOX_DIR)/.config +endif + $(MAKE) CC=$(TARGET_CC) CROSS="$(TARGET_CROSS)" -C $(BUSYBOX_DIR) oldconfig + touch $(BUSYBOX_DIR)/.configured + +$(BUSYBOX_DIR)/busybox: $(BUSYBOX_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) CROSS="$(TARGET_CROSS)" PREFIX="$(TARGET_DIR)" \ + EXTRA_CFLAGS="$(TARGET_CFLAGS)" -C $(BUSYBOX_DIR) + +$(TARGET_DIR)/bin/busybox: $(BUSYBOX_DIR)/busybox + $(MAKE) CC=$(TARGET_CC) CROSS="$(TARGET_CROSS)" PREFIX="$(TARGET_DIR)" \ + EXTRA_CFLAGS="$(TARGET_CFLAGS)" -C $(BUSYBOX_DIR) install + # Just in case + -chmod a+x $(TARGET_DIR)/usr/share/udhcpc/default.script + +busybox: uclibc $(TARGET_DIR)/bin/busybox + +busybox-clean: + rm -f $(TARGET_DIR)/bin/busybox + -$(MAKE) -C $(BUSYBOX_DIR) clean + +busybox-dirclean: + rm -rf $(BUSYBOX_DIR) diff --git a/openwrt/package/config/.cvsignore b/openwrt/package/config/.cvsignore new file mode 100644 index 0000000000..e8bf7a75ba --- /dev/null +++ b/openwrt/package/config/.cvsignore @@ -0,0 +1,8 @@ +conf +mconf +lkc_defs.h +lex.zconf.c +zconf.tab.h +zconf.tab.c +lex.backup +zconf.output diff --git a/openwrt/package/config/Config.in b/openwrt/package/config/Config.in new file mode 100644 index 0000000000..7b114d9dd5 --- /dev/null +++ b/openwrt/package/config/Config.in @@ -0,0 +1,8 @@ +# + +config BR2_PACKAGE_CONFIG + bool"config" + default n + help + Add help text here. + diff --git a/openwrt/package/config/Kconfig-language.txt b/openwrt/package/config/Kconfig-language.txt new file mode 100644 index 0000000000..493749b32a --- /dev/null +++ b/openwrt/package/config/Kconfig-language.txt @@ -0,0 +1,255 @@ +Introduction +------------ + +The configuration database is collection of configuration options +organized in a tree structure: + + +- Code maturity level options + | +- Prompt for development and/or incomplete code/drivers + +- General setup + | +- Networking support + | +- System V IPC + | +- BSD Process Accounting + | +- Sysctl support + +- Loadable module support + | +- Enable loadable module support + | +- Set version information on all module symbols + | +- Kernel module loader + +- ... + +Every entry has its own dependencies. These dependencies are used +to determine the visible of an entry. Any child entry is only +visible if its parent entry is also visible. + +Menu entries +------------ + +Most entries define a config option, all other entries help to organize +them. A single configuration option is defined like this: + +config MODVERSIONS + bool "Set version information on all module symbols" + depends MODULES + help + Usually, modules have to be recompiled whenever you switch to a new + kernel. ... + +Every line starts with a key word and can be followed by multiple +arguments. "config" starts a new config entry. The following lines +define attributes for this config option. Attributes can be the type of +the config option, input prompt, dependencies, help text and default +values. A config option can be defined multiple times with the same +name, but every definition can have only a single input prompt and the +type must not conflict. + +Menu attributes +--------------- + +A menu entry can have a number of attributes. Not all of them are +applicable everywhere (see syntax). + +- type definition: "bool"/"tristate"/"string"/"hex"/"integer" + Every config option must have a type. There are only two basic types: + tristate and string, the other types base on these two. The type + definition optionally accepts an input prompt, so these two examples + are equivalent: + + bool "Networking support" + and + bool + prompt "Networking support" + +- input prompt: "prompt" <prompt> ["if" <expr>] + Every menu entry can have at most one prompt, which is used to display + to the user. Optionally dependencies only for this prompt can be added + with "if". + +- default value: "default" <symbol> ["if" <expr>] + A config option can have any number of default values. If multiple + default values are visible, only the first defined one is active. + Default values are not limited to the menu entry, where they are + defined, this means the default can be defined somewhere else or be + overriden by an earlier definition. + The default value is only assigned to the config symbol if no other + value was set by the user (via the input prompt above). If an input + prompt is visible the default value is presented to the user and can + be overridden by him. + Optionally dependencies only for this default value can be added with + "if". + +- dependencies: "depends on"/"requires" <expr> + This defines a dependency for this menu entry. If multiple + dependencies are defined they are connected with '&&'. Dependencies + are applied to all other options within this menu entry (which also + accept "if" expression), so these two examples are equivalent: + + bool "foo" if BAR + default y if BAR + and + depends on BAR + bool "foo" + default y + +- help text: "help" + This defines a help text. The end of the help text is determined by + the level indentation, this means it ends at the first line which has + a smaller indentation than the first line of the help text. + + +Menu dependencies +----------------- + +Dependencies define the visibility of a menu entry and can also reduce +the input range of tristate symbols. The tristate logic used in the +expressions uses one more state than normal boolean logic to express the +module state. Dependency expressions have the following syntax: + +<expr> ::= <symbol> (1) + <symbol> '=' <symbol> (2) + <symbol> '!=' <symbol> (3) + '(' <expr> ')' (4) + '!' <expr> (5) + <expr> '||' <expr> (6) + <expr> '&&' <expr> (7) + +Expressions are listed in decreasing order of precedence. + +(1) Convert the symbol into an expression. Boolean and tristate symbols + are simply converted into the respective expression values. All + other symbol types result in 'n'. +(2) If the values of both symbols are equal, it returns 'y', + otherwise 'n'. +(3) If the values of both symbols are equal, it returns 'n', + otherwise 'y'. +(4) Returns the value of the expression. Used to override precedence. +(5) Returns the result of (2-/expr/). +(6) Returns the result of min(/expr/, /expr/). +(7) Returns the result of max(/expr/, /expr/). + +An expression can have a value of 'n', 'm' or 'y' (or 0, 1, 2 +respectively for calculations). A menu entry becomes visible when it's +expression evaluates to 'm' or 'y'. + +There are two type of symbols: constant and nonconstant symbols. +Nonconstant symbols are the most common ones and are defined with the +'config' statement. Nonconstant symbols consist entirely of alphanumeric +characters or underscores. +Constant symbols are only part of expressions. Constant symbols are +always surrounded by single or double quotes. Within the quote any +other character is allowed and the quotes can be escaped using '\'. + +Menu structure +-------------- + +The position of a menu entry in the tree is determined in two ways. First +it can be specified explicitely: + +menu "Network device support" + depends NET + +config NETDEVICES + ... + +endmenu + +All entries within the "menu" ... "endmenu" block become a submenu of +"Network device support". All subentries inherit the dependencies from +the menu entry, e.g. this means the dependency "NET" is added to the +dependency list of the config option NETDEVICES. + +The other way to generate the menu structure is done by analyzing the +dependencies. If a menu entry somehow depends on the previous entry, it +can be made a submenu of it. First the the previous (parent) symbol must +be part of the dependency list and then one of these two condititions +must be true: +- the child entry must become invisible, if the parent is set to 'n' +- the child entry must only be visible, if the parent is visible + +config MODULES + bool "Enable loadable module support" + +config MODVERSIONS + bool "Set version information on all module symbols" + depends MODULES + +comment "module support disabled" + depends !MODULES + +MODVERSIONS directly depends on MODULES, this means it's only visible if +MODULES is different from 'n'. The comment on the other hand is always +visible when MODULES it's visible (the (empty) dependency of MODULES is +also part of the comment dependencies). + + +Kconfig syntax +-------------- + +The configuration file describes a series of menu entries, where every +line starts with a keyword (except help texts). The following keywords +end a menu entry: +- config +- choice/endchoice +- comment +- menu/endmenu +- if/endif +- source +The first four also start the definition of a menu entry. + +config: + + "config" <symbol> + <config options> + +This defines a config symbol <symbol> and accepts any of above +attributes as options. + +choices: + + "choice" + <choice options> + <choice block> + "endchoice" + +This defines a choice group and accepts any of above attributes as +options. A choice can only be of type bool or tristate, while a boolean +choice only allows a single config entry to be selected, a tristate +choice also allows any number of config entries to be set to 'm'. This +can be used if multiple drivers for a single hardware exists and only a +single driver can be compiled/loaded into the kernel, but all drivers +can be compiled as modules. +A choice accepts another option "optional", which allows to set the +choice to 'n' and no entry needs to be selected. + +comment: + + "comment" <prompt> + <comment options> + +This defines a comment which is displayed to the user during the +configuration process and is also echoed to the output files. The only +possible options are dependencies. + +menu: + + "menu" <prompt> + <menu options> + <menu block> + "endmenu" + +This defines a menu block, see "Menu structure" above for more +information. The only possible options are dependencies. + +if: + + "if" <expr> + <if block> + "endif" + +This defines an if block. The dependency expression <expr> is appended +to all enclosed menu entries. + +source: + + "source" <prompt> + +This reads the specified configuration file. This file is always parsed. diff --git a/openwrt/package/config/Makefile b/openwrt/package/config/Makefile new file mode 100644 index 0000000000..455a33d233 --- /dev/null +++ b/openwrt/package/config/Makefile @@ -0,0 +1,112 @@ +# Makefile for buildroot2 +# +# Copyright (C) 2002-2004 Erik Andersen <andersen@codepoet.org> + + +# Select the compiler needed to build binaries for your development system +HOSTCC = gcc +HOSTCFLAGS= -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer +# Ensure consistent sort order, 'gcc -print-search-dirs' behavior, etc. +LC_ALL:= C + + +all: ncurses conf mconf + +LIBS = -lncurses +ifeq (/usr/include/ncurses/ncurses.h, $(wildcard /usr/include/ncurses/ncurses.h)) + HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>" +else +ifeq (/usr/include/ncurses/curses.h, $(wildcard /usr/include/ncurses/curses.h)) + HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="<ncurses/curses.h>" +else +ifeq (/usr/local/include/ncurses/ncurses.h, $(wildcard /usr/local/include/ncurses/ncurses.h)) + HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="<ncurses.h>" +else +ifeq (/usr/local/include/ncurses/curses.h, $(wildcard /usr/local/include/ncurses/curses.h)) + HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="<ncurses/curses.h>" +else +ifeq (/usr/include/ncurses.h, $(wildcard /usr/include/ncurses.h)) + HOSTNCURSES += -DCURSES_LOC="<ncurses.h>" +else + HOSTNCURSES += -DCURSES_LOC="<curses.h>" +endif +endif +endif +endif +endif + +CONF_SRC =conf.c +MCONF_SRC =mconf.c checklist.c menubox.c textbox.c yesno.c inputbox.c util.c msgbox.c +SHARED_SRC=zconf.tab.c +SHARED_DEPS:=lkc.h lkc_proto.h lkc_defs.h expr.h zconf.tab.h +CONF_OBJS =$(patsubst %.c,%.o, $(CONF_SRC)) +MCONF_OBJS=$(patsubst %.c,%.o, $(MCONF_SRC)) +SHARED_OBJS=$(patsubst %.c,%.o, $(SHARED_SRC)) + +conf: $(CONF_OBJS) $(SHARED_OBJS) + $(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@ + +mconf: $(MCONF_OBJS) $(SHARED_OBJS) + $(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@ $(LIBS) + +$(CONF_OBJS): %.o : %.c $(SHARED_DEPS) + $(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@ + +$(MCONF_OBJS): %.o : %.c $(SHARED_DEPS) + $(HOSTCC) $(HOSTCFLAGS) $(HOSTNCURSES) -I. -c $< -o $@ + +lkc_defs.h: lkc_proto.h + @sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/' + +### +# The following requires flex/bison +# By default we use the _shipped versions, uncomment the +# following line if you are modifying the flex/bison src. +#LKC_GENPARSER := 1 + +ifdef LKC_GENPARSER + +%.tab.c %.tab.h: %.y + bison -t -d -v -b $* -p $(notdir $*) $< + +lex.%.c: %.l + flex -P$(notdir $*) -o$@ $< +else + +lex.zconf.o: lex.zconf.c $(SHARED_DEPS) + $(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@ + +lex.zconf.c: lex.zconf.c_shipped + cp lex.zconf.c_shipped lex.zconf.c + +zconf.tab.o: zconf.tab.c lex.zconf.c confdata.c expr.c symbol.c menu.c $(SHARED_DEPS) + $(HOSTCC) $(HOSTCFLAGS) -I. -c $< -o $@ + +zconf.tab.c: zconf.tab.c_shipped + cp zconf.tab.c_shipped zconf.tab.c + +zconf.tab.h: zconf.tab.h_shipped + cp zconf.tab.h_shipped zconf.tab.h +endif + +.PHONY: ncurses + +ncurses: + @echo "main() {}" > lxtemp.c + @if $(HOSTCC) lxtemp.c $(LIBS) ; then \ + rm -f lxtemp.c a.out; \ + else \ + rm -f lxtemp.c; \ + echo -e "\007" ;\ + echo ">> Unable to find the Ncurses libraries." ;\ + echo ">>" ;\ + echo ">> You must have Ncurses installed in order" ;\ + echo ">> to use 'make menuconfig'" ;\ + echo ;\ + exit 1 ;\ + fi + +clean: + rm -f *.o *~ core $(TARGETS) $(MCONF_OBJS) $(CONF_OBJS) \ + conf mconf zconf.tab.c zconf.tab.h lex.zconf.c lkc_defs.h + diff --git a/openwrt/package/config/Makefile.in b/openwrt/package/config/Makefile.in new file mode 100644 index 0000000000..addf1b9819 --- /dev/null +++ b/openwrt/package/config/Makefile.in @@ -0,0 +1,3 @@ +ifeq ($(strip $(BR2_PACKAGE_CONFIG)),y) +TARGETS+=config +endif diff --git a/openwrt/package/config/checklist.c b/openwrt/package/config/checklist.c new file mode 100644 index 0000000000..4dbd16616d --- /dev/null +++ b/openwrt/package/config/checklist.c @@ -0,0 +1,372 @@ +/* + * checklist.c -- implements the checklist box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * Stuart Herbert - S.Herbert@sheffield.ac.uk: radiolist extension + * Alessandro Rubini - rubini@ipvvis.unipv.it: merged the two + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program 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 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +static int list_width, check_x, item_x, checkflag; + +/* + * Print list item + */ +static void +print_item (WINDOW * win, const char *item, int status, + int choice, int selected) +{ + int i; + + /* Clear 'residue' of last item */ + wattrset (win, menubox_attr); + wmove (win, choice, 0); + for (i = 0; i < list_width; i++) + waddch (win, ' '); + + wmove (win, choice, check_x); + wattrset (win, selected ? check_selected_attr : check_attr); + if (checkflag == FLAG_CHECK) + wprintw (win, "[%c]", status ? 'X' : ' '); + else + wprintw (win, "(%c)", status ? 'X' : ' '); + + wattrset (win, selected ? tag_selected_attr : tag_attr); + mvwaddch(win, choice, item_x, item[0]); + wattrset (win, selected ? item_selected_attr : item_attr); + waddstr (win, (char *)item+1); + if (selected) { + wmove (win, choice, check_x+1); + wrefresh (win); + } +} + +/* + * Print the scroll indicators. + */ +static void +print_arrows (WINDOW * win, int choice, int item_no, int scroll, + int y, int x, int height) +{ + wmove(win, y, x); + + if (scroll > 0) { + wattrset (win, uarrow_attr); + waddch (win, ACS_UARROW); + waddstr (win, "(-)"); + } + else { + wattrset (win, menubox_attr); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + } + + y = y + height + 1; + wmove(win, y, x); + + if ((height < item_no) && (scroll + choice < item_no - 1)) { + wattrset (win, darrow_attr); + waddch (win, ACS_DARROW); + waddstr (win, "(+)"); + } + else { + wattrset (win, menubox_border_attr); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + } +} + +/* + * Display the termination buttons + */ +static void +print_buttons( WINDOW *dialog, int height, int width, int selected) +{ + int x = width / 2 - 11; + int y = height - 2; + + print_button (dialog, "Select", y, x, selected == 0); + print_button (dialog, " Help ", y, x + 14, selected == 1); + + wmove(dialog, y, x+1 + 14*selected); + wrefresh (dialog); +} + +/* + * Display a dialog box with a list of options that can be turned on or off + * The `flag' parameter is used to select between radiolist and checklist. + */ +int +dialog_checklist (const char *title, const char *prompt, int height, int width, + int list_height, int item_no, struct dialog_list_item ** items, + int flag) + +{ + int i, x, y, box_x, box_y; + int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status; + WINDOW *dialog, *list; + + checkflag = flag; + + /* Allocate space for storing item on/off status */ + if ((status = malloc (sizeof (int) * item_no)) == NULL) { + endwin (); + fprintf (stderr, + "\nCan't allocate memory in dialog_checklist().\n"); + exit (-1); + } + + /* Initializes status */ + for (i = 0; i < item_no; i++) { + status[i] = (items[i]->selected == 1); /* ON */ + if ((!choice && status[i]) || items[i]->selected == 2) /* SELECTED */ + choice = i + 1; + } + if (choice) + choice--; + + max_choice = MIN (list_height, item_no); + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + draw_shadow (stdscr, y, x, height, width); + + dialog = newwin (height, width, y, x); + keypad (dialog, TRUE); + + draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); + wattrset (dialog, border_attr); + mvwaddch (dialog, height-3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch (dialog, ACS_HLINE); + wattrset (dialog, dialog_attr); + waddch (dialog, ACS_RTEE); + + if (title != NULL && strlen(title) >= width-2 ) { + /* truncate long title -- mec */ + char * title2 = malloc(width-2+1); + memcpy( title2, title, width-2 ); + title2[width-2] = '\0'; + title = title2; + } + + if (title != NULL) { + wattrset (dialog, title_attr); + mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); + waddstr (dialog, (char *)title); + waddch (dialog, ' '); + } + + wattrset (dialog, dialog_attr); + print_autowrap (dialog, prompt, width - 2, 1, 3); + + list_width = width - 6; + box_y = height - list_height - 5; + box_x = (width - list_width) / 2 - 1; + + /* create new window for the list */ + list = subwin (dialog, list_height, list_width, y+box_y+1, x+box_x+1); + + keypad (list, TRUE); + + /* draw a box around the list items */ + draw_box (dialog, box_y, box_x, list_height + 2, list_width + 2, + menubox_border_attr, menubox_attr); + + /* Find length of longest item in order to center checklist */ + check_x = 0; + for (i = 0; i < item_no; i++) + check_x = MAX (check_x, + strlen (items[i]->name) + 4); + + check_x = (list_width - check_x) / 2; + item_x = check_x + 4; + + if (choice >= list_height) { + scroll = choice - list_height + 1; + choice -= scroll; + } + + /* Print the list */ + for (i = 0; i < max_choice; i++) { + print_item (list, items[scroll + i]->name, + status[i+scroll], i, i == choice); + } + + print_arrows(dialog, choice, item_no, scroll, + box_y, box_x + check_x + 5, list_height); + + print_buttons(dialog, height, width, 0); + + wnoutrefresh (list); + wnoutrefresh (dialog); + doupdate (); + + while (key != ESC) { + key = wgetch (dialog); + + for (i = 0; i < max_choice; i++) + if (toupper(key) == toupper(items[scroll + i]->name[0])) + break; + + + if ( i < max_choice || key == KEY_UP || key == KEY_DOWN || + key == '+' || key == '-' ) { + if (key == KEY_UP || key == '-') { + if (!choice) { + if (!scroll) + continue; + /* Scroll list down */ + if (list_height > 1) { + /* De-highlight current first item */ + print_item (list, items[scroll]->name, + status[scroll], 0, FALSE); + scrollok (list, TRUE); + wscrl (list, -1); + scrollok (list, FALSE); + } + scroll--; + print_item (list, items[scroll]->name, + status[scroll], 0, TRUE); + wnoutrefresh (list); + + print_arrows(dialog, choice, item_no, scroll, + box_y, box_x + check_x + 5, list_height); + + wrefresh (dialog); + + continue; /* wait for another key press */ + } else + i = choice - 1; + } else if (key == KEY_DOWN || key == '+') { + if (choice == max_choice - 1) { + if (scroll + choice >= item_no - 1) + continue; + /* Scroll list up */ + if (list_height > 1) { + /* De-highlight current last item before scrolling up */ + print_item (list, items[scroll + max_choice - 1]->name, + status[scroll + max_choice - 1], + max_choice - 1, FALSE); + scrollok (list, TRUE); + scroll (list); + scrollok (list, FALSE); + } + scroll++; + print_item (list, items[scroll + max_choice - 1]->name, + status[scroll + max_choice - 1], + max_choice - 1, TRUE); + wnoutrefresh (list); + + print_arrows(dialog, choice, item_no, scroll, + box_y, box_x + check_x + 5, list_height); + + wrefresh (dialog); + + continue; /* wait for another key press */ + } else + i = choice + 1; + } + if (i != choice) { + /* De-highlight current item */ + print_item (list, items[scroll + choice]->name, + status[scroll + choice], choice, FALSE); + /* Highlight new item */ + choice = i; + print_item (list, items[scroll + choice]->name, + status[scroll + choice], choice, TRUE); + wnoutrefresh (list); + wrefresh (dialog); + } + continue; /* wait for another key press */ + } + switch (key) { + case 'H': + case 'h': + case '?': + for (i = 0; i < item_no; i++) + items[i]->selected = 0; + items[scroll + choice]->selected = 1; + delwin (dialog); + free (status); + return 1; + case TAB: + case KEY_LEFT: + case KEY_RIGHT: + button = ((key == KEY_LEFT ? --button : ++button) < 0) + ? 1 : (button > 1 ? 0 : button); + + print_buttons(dialog, height, width, button); + wrefresh (dialog); + break; + case 'S': + case 's': + case ' ': + case '\n': + if (!button) { + if (flag == FLAG_CHECK) { + status[scroll + choice] = !status[scroll + choice]; + wmove (list, choice, check_x); + wattrset (list, check_selected_attr); + wprintw (list, "[%c]", status[scroll + choice] ? 'X' : ' '); + } else { + if (!status[scroll + choice]) { + for (i = 0; i < item_no; i++) + status[i] = 0; + status[scroll + choice] = 1; + for (i = 0; i < max_choice; i++) + print_item (list, items[scroll + i]->name, + status[scroll + i], i, i == choice); + } + } + wnoutrefresh (list); + wrefresh (dialog); + + for (i = 0; i < item_no; i++) { + items[i]->selected = status[i]; + } + } else { + for (i = 0; i < item_no; i++) + items[i]->selected = 0; + items[scroll + choice]->selected = 1; + } + delwin (dialog); + free (status); + return button; + case 'X': + case 'x': + key = ESC; + case ESC: + break; + } + + /* Now, update everything... */ + doupdate (); + } + + + delwin (dialog); + free (status); + return -1; /* ESC pressed */ +} diff --git a/openwrt/package/config/colors.h b/openwrt/package/config/colors.h new file mode 100644 index 0000000000..d34dd37c6f --- /dev/null +++ b/openwrt/package/config/colors.h @@ -0,0 +1,161 @@ +/* + * colors.h -- color attribute definitions + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * This program 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 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + + +/* + * Default color definitions + * + * *_FG = foreground + * *_BG = background + * *_HL = highlight? + */ +#define SCREEN_FG COLOR_CYAN +#define SCREEN_BG COLOR_BLUE +#define SCREEN_HL TRUE + +#define SHADOW_FG COLOR_BLACK +#define SHADOW_BG COLOR_BLACK +#define SHADOW_HL TRUE + +#define DIALOG_FG COLOR_BLACK +#define DIALOG_BG COLOR_WHITE +#define DIALOG_HL FALSE + +#define TITLE_FG COLOR_YELLOW +#define TITLE_BG COLOR_WHITE +#define TITLE_HL TRUE + +#define BORDER_FG COLOR_WHITE +#define BORDER_BG COLOR_WHITE +#define BORDER_HL TRUE + +#define BUTTON_ACTIVE_FG COLOR_WHITE +#define BUTTON_ACTIVE_BG COLOR_BLUE +#define BUTTON_ACTIVE_HL TRUE + +#define BUTTON_INACTIVE_FG COLOR_BLACK +#define BUTTON_INACTIVE_BG COLOR_WHITE +#define BUTTON_INACTIVE_HL FALSE + +#define BUTTON_KEY_ACTIVE_FG COLOR_WHITE +#define BUTTON_KEY_ACTIVE_BG COLOR_BLUE +#define BUTTON_KEY_ACTIVE_HL TRUE + +#define BUTTON_KEY_INACTIVE_FG COLOR_RED +#define BUTTON_KEY_INACTIVE_BG COLOR_WHITE +#define BUTTON_KEY_INACTIVE_HL FALSE + +#define BUTTON_LABEL_ACTIVE_FG COLOR_YELLOW +#define BUTTON_LABEL_ACTIVE_BG COLOR_BLUE +#define BUTTON_LABEL_ACTIVE_HL TRUE + +#define BUTTON_LABEL_INACTIVE_FG COLOR_BLACK +#define BUTTON_LABEL_INACTIVE_BG COLOR_WHITE +#define BUTTON_LABEL_INACTIVE_HL TRUE + +#define INPUTBOX_FG COLOR_BLACK +#define INPUTBOX_BG COLOR_WHITE +#define INPUTBOX_HL FALSE + +#define INPUTBOX_BORDER_FG COLOR_BLACK +#define INPUTBOX_BORDER_BG COLOR_WHITE +#define INPUTBOX_BORDER_HL FALSE + +#define SEARCHBOX_FG COLOR_BLACK +#define SEARCHBOX_BG COLOR_WHITE +#define SEARCHBOX_HL FALSE + +#define SEARCHBOX_TITLE_FG COLOR_YELLOW +#define SEARCHBOX_TITLE_BG COLOR_WHITE +#define SEARCHBOX_TITLE_HL TRUE + +#define SEARCHBOX_BORDER_FG COLOR_WHITE +#define SEARCHBOX_BORDER_BG COLOR_WHITE +#define SEARCHBOX_BORDER_HL TRUE + +#define POSITION_INDICATOR_FG COLOR_YELLOW +#define POSITION_INDICATOR_BG COLOR_WHITE +#define POSITION_INDICATOR_HL TRUE + +#define MENUBOX_FG COLOR_BLACK +#define MENUBOX_BG COLOR_WHITE +#define MENUBOX_HL FALSE + +#define MENUBOX_BORDER_FG COLOR_WHITE +#define MENUBOX_BORDER_BG COLOR_WHITE +#define MENUBOX_BORDER_HL TRUE + +#define ITEM_FG COLOR_BLACK +#define ITEM_BG COLOR_WHITE +#define ITEM_HL FALSE + +#define ITEM_SELECTED_FG COLOR_WHITE +#define ITEM_SELECTED_BG COLOR_BLUE +#define ITEM_SELECTED_HL TRUE + +#define TAG_FG COLOR_YELLOW +#define TAG_BG COLOR_WHITE +#define TAG_HL TRUE + +#define TAG_SELECTED_FG COLOR_YELLOW +#define TAG_SELECTED_BG COLOR_BLUE +#define TAG_SELECTED_HL TRUE + +#define TAG_KEY_FG COLOR_YELLOW +#define TAG_KEY_BG COLOR_WHITE +#define TAG_KEY_HL TRUE + +#define TAG_KEY_SELECTED_FG COLOR_YELLOW +#define TAG_KEY_SELECTED_BG COLOR_BLUE +#define TAG_KEY_SELECTED_HL TRUE + +#define CHECK_FG COLOR_BLACK +#define CHECK_BG COLOR_WHITE +#define CHECK_HL FALSE + +#define CHECK_SELECTED_FG COLOR_WHITE +#define CHECK_SELECTED_BG COLOR_BLUE +#define CHECK_SELECTED_HL TRUE + +#define UARROW_FG COLOR_GREEN +#define UARROW_BG COLOR_WHITE +#define UARROW_HL TRUE + +#define DARROW_FG COLOR_GREEN +#define DARROW_BG COLOR_WHITE +#define DARROW_HL TRUE + +/* End of default color definitions */ + +#define C_ATTR(x,y) ((x ? A_BOLD : 0) | COLOR_PAIR((y))) +#define COLOR_NAME_LEN 10 +#define COLOR_COUNT 8 + +/* + * Global variables + */ + +typedef struct { + char name[COLOR_NAME_LEN]; + int value; +} color_names_st; + +extern color_names_st color_names[]; +extern int color_table[][3]; diff --git a/openwrt/package/config/conf.c b/openwrt/package/config/conf.c new file mode 100644 index 0000000000..46b7e08f7f --- /dev/null +++ b/openwrt/package/config/conf.c @@ -0,0 +1,583 @@ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#include <ctype.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <time.h> +#include <sys/stat.h> + +#define LKC_DIRECT_LINK +#include "lkc.h" + +static void conf(struct menu *menu); +static void check_conf(struct menu *menu); + +enum { + ask_all, + ask_new, + ask_silent, + set_default, + set_yes, + set_mod, + set_no, + set_random +} input_mode = ask_all; +char *defconfig_file; + +static int indent = 1; +static int valid_stdin = 1; +static int conf_cnt; +static char line[128]; +static struct menu *rootEntry; + +static char nohelp_text[] = "Sorry, no help available for this option yet.\n"; + +static void strip(char *str) +{ + char *p = str; + int l; + + while ((isspace(*p))) + p++; + l = strlen(p); + if (p != str) + memmove(str, p, l + 1); + if (!l) + return; + p = str + l - 1; + while ((isspace(*p))) + *p-- = 0; +} + +static void check_stdin(void) +{ + if (!valid_stdin && input_mode == ask_silent) { + printf("aborted!\n\n"); + printf("Console input/output is redirected. "); + printf("Run 'make oldconfig' to update configuration.\n\n"); + exit(1); + } +} + +static void conf_askvalue(struct symbol *sym, const char *def) +{ + enum symbol_type type = sym_get_type(sym); + tristate val; + + if (!sym_has_value(sym)) + printf("(NEW) "); + + line[0] = '\n'; + line[1] = 0; + + if (!sym_is_changable(sym)) { + printf("%s\n", def); + line[0] = '\n'; + line[1] = 0; + return; + } + + switch (input_mode) { + case ask_new: + case ask_silent: + if (sym_has_value(sym)) { + printf("%s\n", def); + return; + } + check_stdin(); + case ask_all: + fflush(stdout); + fgets(line, 128, stdin); + return; + case set_default: + printf("%s\n", def); + return; + default: + break; + } + + switch (type) { + case S_INT: + case S_HEX: + case S_STRING: + printf("%s\n", def); + return; + default: + ; + } + switch (input_mode) { + case set_yes: + if (sym_tristate_within_range(sym, yes)) { + line[0] = 'y'; + line[1] = '\n'; + line[2] = 0; + break; + } + case set_mod: + if (type == S_TRISTATE) { + if (sym_tristate_within_range(sym, mod)) { + line[0] = 'm'; + line[1] = '\n'; + line[2] = 0; + break; + } + } else { + if (sym_tristate_within_range(sym, yes)) { + line[0] = 'y'; + line[1] = '\n'; + line[2] = 0; + break; + } + } + case set_no: + if (sym_tristate_within_range(sym, no)) { + line[0] = 'n'; + line[1] = '\n'; + line[2] = 0; + break; + } + case set_random: + do { + val = (tristate)(random() % 3); + } while (!sym_tristate_within_range(sym, val)); + switch (val) { + case no: line[0] = 'n'; break; + case mod: line[0] = 'm'; break; + case yes: line[0] = 'y'; break; + } + line[1] = '\n'; + line[2] = 0; + break; + default: + break; + } + printf("%s", line); +} + +int conf_string(struct menu *menu) +{ + struct symbol *sym = menu->sym; + const char *def, *help; + + while (1) { + printf("%*s%s ", indent - 1, "", menu->prompt->text); + printf("(%s) ", sym->name); + def = sym_get_string_value(sym); + if (sym_get_string_value(sym)) + printf("[%s] ", def); + conf_askvalue(sym, def); + switch (line[0]) { + case '\n': + break; + case '?': + /* print help */ + if (line[1] == '\n') { + help = nohelp_text; + if (menu->sym->help) + help = menu->sym->help; + printf("\n%s\n", menu->sym->help); + def = NULL; + break; + } + default: + line[strlen(line)-1] = 0; + def = line; + } + if (def && sym_set_string_value(sym, def)) + return 0; + } +} + +static int conf_sym(struct menu *menu) +{ + struct symbol *sym = menu->sym; + int type; + tristate oldval, newval; + const char *help; + + while (1) { + printf("%*s%s ", indent - 1, "", menu->prompt->text); + if (sym->name) + printf("(%s) ", sym->name); + type = sym_get_type(sym); + putchar('['); + oldval = sym_get_tristate_value(sym); + switch (oldval) { + case no: + putchar('N'); + break; + case mod: + putchar('M'); + break; + case yes: + putchar('Y'); + break; + } + if (oldval != no && sym_tristate_within_range(sym, no)) + printf("/n"); + if (oldval != mod && sym_tristate_within_range(sym, mod)) + printf("/m"); + if (oldval != yes && sym_tristate_within_range(sym, yes)) + printf("/y"); + if (sym->help) + printf("/?"); + printf("] "); + conf_askvalue(sym, sym_get_string_value(sym)); + strip(line); + + switch (line[0]) { + case 'n': + case 'N': + newval = no; + if (!line[1] || !strcmp(&line[1], "o")) + break; + continue; + case 'm': + case 'M': + newval = mod; + if (!line[1]) + break; + continue; + case 'y': + case 'Y': + newval = yes; + if (!line[1] || !strcmp(&line[1], "es")) + break; + continue; + case 0: + newval = oldval; + break; + case '?': + goto help; + default: + continue; + } + if (sym_set_tristate_value(sym, newval)) + return 0; +help: + help = nohelp_text; + if (sym->help) + help = sym->help; + printf("\n%s\n", help); + } +} + +static int conf_choice(struct menu *menu) +{ + struct symbol *sym, *def_sym; + struct menu *child; + int type; + bool is_new; + + sym = menu->sym; + type = sym_get_type(sym); + is_new = !sym_has_value(sym); + if (sym_is_changable(sym)) { + conf_sym(menu); + sym_calc_value(sym); + switch (sym_get_tristate_value(sym)) { + case no: + return 1; + case mod: + return 0; + case yes: + break; + } + } else { + switch (sym_get_tristate_value(sym)) { + case no: + return 1; + case mod: + printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu)); + return 0; + case yes: + break; + } + } + + while (1) { + int cnt, def; + + printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu)); + def_sym = sym_get_choice_value(sym); + cnt = def = 0; + line[0] = '0'; + line[1] = 0; + for (child = menu->list; child; child = child->next) { + if (!menu_is_visible(child)) + continue; + if (!child->sym) { + printf("%*c %s\n", indent, '*', menu_get_prompt(child)); + continue; + } + cnt++; + if (child->sym == def_sym) { + def = cnt; + printf("%*c", indent, '>'); + } else + printf("%*c", indent, ' '); + printf(" %d. %s", cnt, menu_get_prompt(child)); + if (child->sym->name) + printf(" (%s)", child->sym->name); + if (!sym_has_value(child->sym)) + printf(" (NEW)"); + printf("\n"); + } + printf("%*schoice", indent - 1, ""); + if (cnt == 1) { + printf("[1]: 1\n"); + goto conf_childs; + } + printf("[1-%d", cnt); + if (sym->help) + printf("?"); + printf("]: "); + switch (input_mode) { + case ask_new: + case ask_silent: + if (!is_new) { + cnt = def; + printf("%d\n", cnt); + break; + } + check_stdin(); + case ask_all: + fflush(stdout); + fgets(line, 128, stdin); + strip(line); + if (line[0] == '?') { + printf("\n%s\n", menu->sym->help ? + menu->sym->help : nohelp_text); + continue; + } + if (!line[0]) + cnt = def; + else if (isdigit(line[0])) + cnt = atoi(line); + else + continue; + break; + case set_random: + def = (random() % cnt) + 1; + case set_default: + case set_yes: + case set_mod: + case set_no: + cnt = def; + printf("%d\n", cnt); + break; + } + + conf_childs: + for (child = menu->list; child; child = child->next) { + if (!child->sym || !menu_is_visible(child)) + continue; + if (!--cnt) + break; + } + if (!child) + continue; + if (line[strlen(line) - 1] == '?') { + printf("\n%s\n", child->sym->help ? + child->sym->help : nohelp_text); + continue; + } + sym_set_choice_value(sym, child->sym); + if (child->list) { + indent += 2; + conf(child->list); + indent -= 2; + } + return 1; + } +} + +static void conf(struct menu *menu) +{ + struct symbol *sym; + struct property *prop; + struct menu *child; + + if (!menu_is_visible(menu)) + return; + + sym = menu->sym; + prop = menu->prompt; + if (prop) { + const char *prompt; + + switch (prop->type) { + case P_MENU: + if (input_mode == ask_silent && rootEntry != menu) { + check_conf(menu); + return; + } + case P_COMMENT: + prompt = menu_get_prompt(menu); + if (prompt) + printf("%*c\n%*c %s\n%*c\n", + indent, '*', + indent, '*', prompt, + indent, '*'); + default: + ; + } + } + + if (!sym) + goto conf_childs; + + if (sym_is_choice(sym)) { + conf_choice(menu); + if (sym->curr.tri != mod) + return; + goto conf_childs; + } + + switch (sym->type) { + case S_INT: + case S_HEX: + case S_STRING: + conf_string(menu); + break; + default: + conf_sym(menu); + break; + } + +conf_childs: + if (sym) + indent += 2; + for (child = menu->list; child; child = child->next) + conf(child); + if (sym) + indent -= 2; +} + +static void check_conf(struct menu *menu) +{ + struct symbol *sym; + struct menu *child; + + if (!menu_is_visible(menu)) + return; + + sym = menu->sym; + if (sym) { + if (sym_is_changable(sym) && !sym_has_value(sym)) { + if (!conf_cnt++) + printf("*\n* Restart config...\n*\n"); + rootEntry = menu_get_parent_menu(menu); + conf(rootEntry); + } + if (sym_is_choice(sym) && sym_get_tristate_value(sym) != mod) + return; + } + + for (child = menu->list; child; child = child->next) + check_conf(child); +} + +int main(int ac, char **av) +{ + int i = 1; + const char *name; + struct stat tmpstat; + + if (ac > i && av[i][0] == '-') { + switch (av[i++][1]) { + case 'o': + input_mode = ask_new; + break; + case 's': + input_mode = ask_silent; + valid_stdin = isatty(0) && isatty(1) && isatty(2); + break; + case 'd': + input_mode = set_default; + break; + case 'D': + input_mode = set_default; + defconfig_file = av[i++]; + if (!defconfig_file) { + printf("%s: No default config file specified\n", + av[0]); + exit(1); + } + break; + case 'n': + input_mode = set_no; + break; + case 'm': + input_mode = set_mod; + break; + case 'y': + input_mode = set_yes; + break; + case 'r': + input_mode = set_random; + srandom(time(NULL)); + break; + case 'h': + case '?': + printf("%s [-o|-s] config\n", av[0]); + exit(0); + } + } + name = av[i]; + if (!name) { + printf("%s: configuration file missing\n", av[0]); + } + conf_parse(name); + //zconfdump(stdout); + switch (input_mode) { + case set_default: + if (!defconfig_file) + defconfig_file = conf_get_default_confname(); + if (conf_read(defconfig_file)) { + printf("***\n" + "*** Can't find default configuration \"%s\"!\n" + "***\n", defconfig_file); + exit(1); + } + break; + case ask_silent: + if (stat(".config", &tmpstat)) { + printf("***\n" + "*** You have not yet configured Buildroot!\n" + "***\n" + "*** Please run some configurator (e.g. \"make oldconfig\" or\n" + "*** \"make menuconfig\" or \"make config\").\n" + "***\n"); + exit(1); + } + case ask_all: + case ask_new: + conf_read(NULL); + break; + default: + break; + } + + if (input_mode != ask_silent) { + rootEntry = &rootmenu; + conf(&rootmenu); + if (input_mode == ask_all) { + input_mode = ask_silent; + valid_stdin = 1; + } + } + do { + conf_cnt = 0; + check_conf(&rootmenu); + } while (conf_cnt); + if (conf_write(NULL)) { + fprintf(stderr, "\n*** Error during writing of the Buildroot configuration.\n\n"); + return 1; + } + return 0; +} diff --git a/openwrt/package/config/confdata.c b/openwrt/package/config/confdata.c new file mode 100644 index 0000000000..fd3a345e26 --- /dev/null +++ b/openwrt/package/config/confdata.c @@ -0,0 +1,447 @@ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#include <sys/stat.h> +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#define LKC_DIRECT_LINK +#include "lkc.h" + +const char conf_def_filename[] = ".config"; + +const char conf_defname[] = "sysdeps/linux/defconfig"; + +const char *conf_confnames[] = { + ".config", + conf_defname, + NULL, +}; + +static char *conf_expand_value(const char *in) +{ + struct symbol *sym; + const char *src; + static char res_value[SYMBOL_MAXLENGTH]; + char *dst, name[SYMBOL_MAXLENGTH]; + + res_value[0] = 0; + dst = name; + while ((src = strchr(in, '$'))) { + strncat(res_value, in, src - in); + src++; + dst = name; + while (isalnum(*src) || *src == '_') + *dst++ = *src++; + *dst = 0; + sym = sym_lookup(name, 0); + sym_calc_value(sym); + strcat(res_value, sym_get_string_value(sym)); + in = src; + } + strcat(res_value, in); + + return res_value; +} + +char *conf_get_default_confname(void) +{ + struct stat buf; + static char fullname[PATH_MAX+1]; + char *env, *name; + + name = conf_expand_value(conf_defname); + env = getenv(SRCTREE); + if (env) { + sprintf(fullname, "%s/%s", env, name); + if (!stat(fullname, &buf)) + return fullname; + } + return name; +} + +int conf_read(const char *name) +{ + FILE *in = NULL; + char line[1024]; + char *p, *p2; + int lineno = 0; + struct symbol *sym; + struct property *prop; + struct expr *e; + int i; + + if (name) { + in = zconf_fopen(name); + } else { + const char **names = conf_confnames; + while ((name = *names++)) { + name = conf_expand_value(name); + in = zconf_fopen(name); + if (in) { + printf("#\n" + "# using defaults found in %s\n" + "#\n", name); + break; + } + } + } + + if (!in) + return 1; + + for_all_symbols(i, sym) { + sym->flags |= SYMBOL_NEW | SYMBOL_CHANGED; + sym->flags &= ~SYMBOL_VALID; + switch (sym->type) { + case S_INT: + case S_HEX: + case S_STRING: + if (sym->user.val) + free(sym->user.val); + default: + sym->user.val = NULL; + sym->user.tri = no; + } + } + + while (fgets(line, sizeof(line), in)) { + lineno++; + sym = NULL; + switch (line[0]) { + case '#': + if (line[1]!=' ') + continue; + p = strchr(line + 2, ' '); + if (!p) + continue; + *p++ = 0; + if (strncmp(p, "is not set", 10)) + continue; + sym = sym_find(line + 2); + if (!sym) { + fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line + 2); + break; + } + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + sym->user.tri = no; + sym->flags &= ~SYMBOL_NEW; + break; + default: + ; + } + break; + + case 'A' ... 'Z': + p = strchr(line, '='); + if (!p) + continue; + *p++ = 0; + p2 = strchr(p, '\n'); + if (p2) + *p2 = 0; + sym = sym_find(line); + if (!sym) { + fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line); + break; + } + switch (sym->type) { + case S_TRISTATE: + if (p[0] == 'm') { + sym->user.tri = mod; + sym->flags &= ~SYMBOL_NEW; + break; + } + case S_BOOLEAN: + if (p[0] == 'y') { + sym->user.tri = yes; + sym->flags &= ~SYMBOL_NEW; + break; + } + if (p[0] == 'n') { + sym->user.tri = no; + sym->flags &= ~SYMBOL_NEW; + break; + } + break; + case S_STRING: + if (*p++ != '"') + break; + for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) { + if (*p2 == '"') { + *p2 = 0; + break; + } + memmove(p2, p2 + 1, strlen(p2)); + } + if (!p2) { + fprintf(stderr, "%s:%d: invalid string found\n", name, lineno); + exit(1); + } + case S_INT: + case S_HEX: + if (sym_string_valid(sym, p)) { + sym->user.val = strdup(p); + sym->flags &= ~SYMBOL_NEW; + } else { + fprintf(stderr, "%s:%d: symbol value '%s' invalid for %s\n", name, lineno, p, sym->name); + exit(1); + } + break; + default: + ; + } + break; + case '\n': + break; + default: + continue; + } + if (sym && sym_is_choice_value(sym)) { + struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); + switch (sym->user.tri) { + case no: + break; + case mod: + if (cs->user.tri == yes) + /* warn? */; + break; + case yes: + if (cs->user.tri != no) + /* warn? */; + cs->user.val = sym; + break; + } + cs->user.tri = E_OR(cs->user.tri, sym->user.tri); + cs->flags &= ~SYMBOL_NEW; + } + } + fclose(in); + + if (modules_sym) + sym_calc_value(modules_sym); + for_all_symbols(i, sym) { + sym_calc_value(sym); + if (sym_has_value(sym) && !sym_is_choice_value(sym)) { + if (sym->visible == no) + sym->flags |= SYMBOL_NEW; + switch (sym->type) { + case S_STRING: + case S_INT: + case S_HEX: + if (!sym_string_within_range(sym, sym->user.val)) + sym->flags |= SYMBOL_NEW; + default: + break; + } + } + if (!sym_is_choice(sym)) + continue; + prop = sym_get_choice_prop(sym); + for (e = prop->expr; e; e = e->left.expr) + if (e->right.sym->visible != no) + sym->flags |= e->right.sym->flags & SYMBOL_NEW; + } + + sym_change_count = 1; + + return 0; +} + +int conf_write(const char *name) +{ + FILE *out, *out_h; + struct symbol *sym; + struct menu *menu; + const char *basename; + char dirname[128], tmpname[128], newname[128]; + int type, l; + const char *str; + + dirname[0] = 0; + if (name && name[0]) { + struct stat st; + char *slash; + + if (!stat(name, &st) && S_ISDIR(st.st_mode)) { + strcpy(dirname, name); + strcat(dirname, "/"); + basename = conf_def_filename; + } else if ((slash = strrchr(name, '/'))) { + int size = slash - name + 1; + memcpy(dirname, name, size); + dirname[size] = 0; + if (slash[1]) + basename = slash + 1; + else + basename = conf_def_filename; + } else + basename = name; + } else + basename = conf_def_filename; + + sprintf(newname, "%s.tmpconfig.%d", dirname, getpid()); + out = fopen(newname, "w"); + if (!out) + return 1; + out_h = NULL; + if (!name) { + out_h = fopen(".tmpconfig.h", "w"); + if (!out_h) + return 1; + } + fprintf(out, "#\n" + "# Automatically generated make config: don't edit\n" + "#\n"); + if (out_h) { + fprintf(out_h, "/*\n" + " * Automatically generated header file: don't edit\n" + " */\n\n" + "#define AUTOCONF_INCLUDED\n\n" + "/* Version Number */\n" + "#define BB_VER \"%s\"\n" + "#define BB_BT \"%s\"\n", + getenv("VERSION"), + getenv("BUILDTIME")); + if (getenv("EXTRA_VERSION")) + fprintf(out_h, "#define BB_EXTRA_VERSION \"%s\"\n", + getenv("EXTRA_VERSION")); + fprintf(out_h, "\n"); + } + + if (!sym_change_count) + sym_clear_all_valid(); + + menu = rootmenu.list; + while (menu) { + sym = menu->sym; + if (!sym) { + if (!menu_is_visible(menu)) + goto next; + str = menu_get_prompt(menu); + fprintf(out, "\n" + "#\n" + "# %s\n" + "#\n", str); + if (out_h) + fprintf(out_h, "\n" + "/*\n" + " * %s\n" + " */\n", str); + } else if (!(sym->flags & SYMBOL_CHOICE)) { + sym_calc_value(sym); + if (!(sym->flags & SYMBOL_WRITE)) + goto next; + sym->flags &= ~SYMBOL_WRITE; + type = sym->type; + if (type == S_TRISTATE) { + sym_calc_value(modules_sym); + if (modules_sym->curr.tri == no) + type = S_BOOLEAN; + } + switch (type) { + case S_BOOLEAN: + case S_TRISTATE: + switch (sym_get_tristate_value(sym)) { + case no: + fprintf(out, "# %s is not set\n", sym->name); + if (out_h) + fprintf(out_h, "#undef %s\n", sym->name); + break; + case mod: +#if 0 + fprintf(out, "%s=m\n", sym->name); + if (out_h) + fprintf(out_h, "#define %s_MODULE 1\n", sym->name); +#endif + break; + case yes: + fprintf(out, "%s=y\n", sym->name); + if (out_h) + fprintf(out_h, "#define %s 1\n", sym->name); + break; + } + break; + case S_STRING: + // fix me + str = sym_get_string_value(sym); + fprintf(out, "%s=\"", sym->name); + if (out_h) + fprintf(out_h, "#define %s \"", sym->name); + do { + l = strcspn(str, "\"\\"); + if (l) { + fwrite(str, l, 1, out); + if (out_h) + fwrite(str, l, 1, out_h); + } + str += l; + while (*str == '\\' || *str == '"') { + fprintf(out, "\\%c", *str); + if (out_h) + fprintf(out_h, "\\%c", *str); + str++; + } + } while (*str); + fputs("\"\n", out); + if (out_h) + fputs("\"\n", out_h); + break; + case S_HEX: + str = sym_get_string_value(sym); + if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { + fprintf(out, "%s=%s\n", sym->name, str); + if (out_h) + fprintf(out_h, "#define %s 0x%s\n", sym->name, str); + break; + } + case S_INT: + str = sym_get_string_value(sym); + fprintf(out, "%s=%s\n", sym->name, str); + if (out_h) + fprintf(out_h, "#define %s %s\n", sym->name, str); + break; + } + } + + next: + if (menu->list) { + menu = menu->list; + continue; + } + if (menu->next) + menu = menu->next; + else while ((menu = menu->parent)) { + if (menu->next) { + menu = menu->next; + break; + } + } + } + fclose(out); + if (out_h) { + fclose(out_h); + rename(".tmpconfig.h", "include/config.h"); + file_write_dep(NULL); + } + if (!name || basename != conf_def_filename) { + if (!name) + name = conf_def_filename; + sprintf(tmpname, "%s.old", name); + rename(name, tmpname); + } + sprintf(tmpname, "%s%s", dirname, basename); + if (rename(newname, tmpname)) + return 1; + + sym_change_count = 0; + + return 0; +} diff --git a/openwrt/package/config/dialog.h b/openwrt/package/config/dialog.h new file mode 100644 index 0000000000..6486cc8f77 --- /dev/null +++ b/openwrt/package/config/dialog.h @@ -0,0 +1,196 @@ + +/* + * dialog.h -- common declarations for all dialog modules + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * This program 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 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <sys/types.h> +#include <fcntl.h> +#include <unistd.h> +#include <ctype.h> +#include <stdlib.h> +#include <string.h> + +#ifdef CURSES_LOC +#include CURSES_LOC + +/* + * Colors in ncurses 1.9.9e do not work properly since foreground and + * background colors are OR'd rather than separately masked. This version + * of dialog was hacked to work with ncurses 1.9.9e, making it incompatible + * with standard curses. The simplest fix (to make this work with standard + * curses) uses the wbkgdset() function, not used in the original hack. + * Turn it off if we're building with 1.9.9e, since it just confuses things. + */ +#if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE) +#define OLD_NCURSES 1 +#undef wbkgdset +#define wbkgdset(w,p) /*nothing*/ +#else +#define OLD_NCURSES 0 +#endif + +#define TR(params) _tracef params + +#define ESC 27 +#define TAB 9 +#define MAX_LEN 2048 +#define BUF_SIZE (10*1024) +#define MIN(x,y) (x < y ? x : y) +#define MAX(x,y) (x > y ? x : y) + + +#ifndef ACS_ULCORNER +#define ACS_ULCORNER '+' +#endif +#ifndef ACS_LLCORNER +#define ACS_LLCORNER '+' +#endif +#ifndef ACS_URCORNER +#define ACS_URCORNER '+' +#endif +#ifndef ACS_LRCORNER +#define ACS_LRCORNER '+' +#endif +#ifndef ACS_HLINE +#define ACS_HLINE '-' +#endif +#ifndef ACS_VLINE +#define ACS_VLINE '|' +#endif +#ifndef ACS_LTEE +#define ACS_LTEE '+' +#endif +#ifndef ACS_RTEE +#define ACS_RTEE '+' +#endif +#ifndef ACS_UARROW +#define ACS_UARROW '^' +#endif +#ifndef ACS_DARROW +#define ACS_DARROW 'v' +#endif + +/* + * Attribute names + */ +#define screen_attr attributes[0] +#define shadow_attr attributes[1] +#define dialog_attr attributes[2] +#define title_attr attributes[3] +#define border_attr attributes[4] +#define button_active_attr attributes[5] +#define button_inactive_attr attributes[6] +#define button_key_active_attr attributes[7] +#define button_key_inactive_attr attributes[8] +#define button_label_active_attr attributes[9] +#define button_label_inactive_attr attributes[10] +#define inputbox_attr attributes[11] +#define inputbox_border_attr attributes[12] +#define searchbox_attr attributes[13] +#define searchbox_title_attr attributes[14] +#define searchbox_border_attr attributes[15] +#define position_indicator_attr attributes[16] +#define menubox_attr attributes[17] +#define menubox_border_attr attributes[18] +#define item_attr attributes[19] +#define item_selected_attr attributes[20] +#define tag_attr attributes[21] +#define tag_selected_attr attributes[22] +#define tag_key_attr attributes[23] +#define tag_key_selected_attr attributes[24] +#define check_attr attributes[25] +#define check_selected_attr attributes[26] +#define uarrow_attr attributes[27] +#define darrow_attr attributes[28] + +/* number of attributes */ +#define ATTRIBUTE_COUNT 29 + +/* + * Global variables + */ +extern bool use_colors; + +extern chtype attributes[]; +#endif + +extern char *backtitle; + +struct dialog_list_item { + char *name; + int namelen; + char *tag; + int selected; /* Set to 1 by dialog_*() function. */ +}; + +/* + * Function prototypes + */ + +void init_dialog (void); +void end_dialog (void); +void dialog_clear (void); +#ifdef CURSES_LOC +void attr_clear (WINDOW * win, int height, int width, chtype attr); +void color_setup (void); +void print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x); +void print_button (WINDOW * win, const char *label, int y, int x, int selected); +void draw_box (WINDOW * win, int y, int x, int height, int width, chtype box, + chtype border); +void draw_shadow (WINDOW * win, int y, int x, int height, int width); +#endif + +int first_alpha (const char *string, const char *exempt); +int dialog_yesno (const char *title, const char *prompt, int height, int width); +int dialog_msgbox (const char *title, const char *prompt, int height, + int width, int pause); +int dialog_textbox (const char *title, const char *file, int height, int width); +int dialog_menu (const char *title, const char *prompt, int height, int width, + int menu_height, const char *choice, int item_no, + struct dialog_list_item ** items); +int dialog_checklist (const char *title, const char *prompt, int height, + int width, int list_height, int item_no, + struct dialog_list_item ** items, int flag); +extern unsigned char dialog_input_result[]; +int dialog_inputbox (const char *title, const char *prompt, int height, + int width, const char *init); + +struct dialog_list_item *first_sel_item(int item_no, + struct dialog_list_item ** items); + +/* + * This is the base for fictitious keys, which activate + * the buttons. + * + * Mouse-generated keys are the following: + * -- the first 32 are used as numbers, in addition to '0'-'9' + * -- the lowercase are used to signal mouse-enter events (M_EVENT + 'o') + * -- uppercase chars are used to invoke the button (M_EVENT + 'O') + */ +#ifdef CURSES_LOC +#define M_EVENT (KEY_MAX+1) +#endif + + +/* + * The `flag' parameter in checklist is used to select between + * radiolist and checklist + */ +#define FLAG_CHECK 1 +#define FLAG_RADIO 0 diff --git a/openwrt/package/config/expr.c b/openwrt/package/config/expr.c new file mode 100644 index 0000000000..10f45232b4 --- /dev/null +++ b/openwrt/package/config/expr.c @@ -0,0 +1,1089 @@ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#define LKC_DIRECT_LINK +#include "lkc.h" + +#define DEBUG_EXPR 0 + +struct expr *expr_alloc_symbol(struct symbol *sym) +{ + struct expr *e = malloc(sizeof(*e)); + memset(e, 0, sizeof(*e)); + e->type = E_SYMBOL; + e->left.sym = sym; + return e; +} + +struct expr *expr_alloc_one(enum expr_type type, struct expr *ce) +{ + struct expr *e = malloc(sizeof(*e)); + memset(e, 0, sizeof(*e)); + e->type = type; + e->left.expr = ce; + return e; +} + +struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2) +{ + struct expr *e = malloc(sizeof(*e)); + memset(e, 0, sizeof(*e)); + e->type = type; + e->left.expr = e1; + e->right.expr = e2; + return e; +} + +struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2) +{ + struct expr *e = malloc(sizeof(*e)); + memset(e, 0, sizeof(*e)); + e->type = type; + e->left.sym = s1; + e->right.sym = s2; + return e; +} + +struct expr *expr_alloc_and(struct expr *e1, struct expr *e2) +{ + if (!e1) + return e2; + return e2 ? expr_alloc_two(E_AND, e1, e2) : e1; +} + +struct expr *expr_alloc_or(struct expr *e1, struct expr *e2) +{ + if (!e1) + return e2; + return e2 ? expr_alloc_two(E_OR, e1, e2) : e1; +} + +struct expr *expr_copy(struct expr *org) +{ + struct expr *e; + + if (!org) + return NULL; + + e = malloc(sizeof(*org)); + memcpy(e, org, sizeof(*org)); + switch (org->type) { + case E_SYMBOL: + e->left = org->left; + break; + case E_NOT: + e->left.expr = expr_copy(org->left.expr); + break; + case E_EQUAL: + case E_UNEQUAL: + e->left.sym = org->left.sym; + e->right.sym = org->right.sym; + break; + case E_AND: + case E_OR: + case E_CHOICE: + e->left.expr = expr_copy(org->left.expr); + e->right.expr = expr_copy(org->right.expr); + break; + default: + printf("can't copy type %d\n", e->type); + free(e); + e = NULL; + break; + } + + return e; +} + +void expr_free(struct expr *e) +{ + if (!e) + return; + + switch (e->type) { + case E_SYMBOL: + break; + case E_NOT: + expr_free(e->left.expr); + return; + case E_EQUAL: + case E_UNEQUAL: + break; + case E_OR: + case E_AND: + expr_free(e->left.expr); + expr_free(e->right.expr); + break; + default: + printf("how to free type %d?\n", e->type); + break; + } + free(e); +} + +static int trans_count; + +#define e1 (*ep1) +#define e2 (*ep2) + +static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct expr **ep2) +{ + if (e1->type == type) { + __expr_eliminate_eq(type, &e1->left.expr, &e2); + __expr_eliminate_eq(type, &e1->right.expr, &e2); + return; + } + if (e2->type == type) { + __expr_eliminate_eq(type, &e1, &e2->left.expr); + __expr_eliminate_eq(type, &e1, &e2->right.expr); + return; + } + if (e1->type == E_SYMBOL && e2->type == E_SYMBOL && + e1->left.sym == e2->left.sym && (e1->left.sym->flags & (SYMBOL_YES|SYMBOL_NO))) + return; + if (!expr_eq(e1, e2)) + return; + trans_count++; + expr_free(e1); expr_free(e2); + switch (type) { + case E_OR: + e1 = expr_alloc_symbol(&symbol_no); + e2 = expr_alloc_symbol(&symbol_no); + break; + case E_AND: + e1 = expr_alloc_symbol(&symbol_yes); + e2 = expr_alloc_symbol(&symbol_yes); + break; + default: + ; + } +} + +void expr_eliminate_eq(struct expr **ep1, struct expr **ep2) +{ + if (!e1 || !e2) + return; + switch (e1->type) { + case E_OR: + case E_AND: + __expr_eliminate_eq(e1->type, ep1, ep2); + default: + ; + } + if (e1->type != e2->type) switch (e2->type) { + case E_OR: + case E_AND: + __expr_eliminate_eq(e2->type, ep1, ep2); + default: + ; + } + e1 = expr_eliminate_yn(e1); + e2 = expr_eliminate_yn(e2); +} + +#undef e1 +#undef e2 + +int expr_eq(struct expr *e1, struct expr *e2) +{ + int res, old_count; + + if (e1->type != e2->type) + return 0; + switch (e1->type) { + case E_EQUAL: + case E_UNEQUAL: + return e1->left.sym == e2->left.sym && e1->right.sym == e2->right.sym; + case E_SYMBOL: + return e1->left.sym == e2->left.sym; + case E_NOT: + return expr_eq(e1->left.expr, e2->left.expr); + case E_AND: + case E_OR: + e1 = expr_copy(e1); + e2 = expr_copy(e2); + old_count = trans_count; + expr_eliminate_eq(&e1, &e2); + res = (e1->type == E_SYMBOL && e2->type == E_SYMBOL && + e1->left.sym == e2->left.sym); + expr_free(e1); + expr_free(e2); + trans_count = old_count; + return res; + case E_CHOICE: + case E_RANGE: + case E_NONE: + /* panic */; + } + + if (DEBUG_EXPR) { + expr_fprint(e1, stdout); + printf(" = "); + expr_fprint(e2, stdout); + printf(" ?\n"); + } + + return 0; +} + +struct expr *expr_eliminate_yn(struct expr *e) +{ + struct expr *tmp; + + if (e) switch (e->type) { + case E_AND: + e->left.expr = expr_eliminate_yn(e->left.expr); + e->right.expr = expr_eliminate_yn(e->right.expr); + if (e->left.expr->type == E_SYMBOL) { + if (e->left.expr->left.sym == &symbol_no) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + e->right.expr = NULL; + return e; + } else if (e->left.expr->left.sym == &symbol_yes) { + free(e->left.expr); + tmp = e->right.expr; + *e = *(e->right.expr); + free(tmp); + return e; + } + } + if (e->right.expr->type == E_SYMBOL) { + if (e->right.expr->left.sym == &symbol_no) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + e->right.expr = NULL; + return e; + } else if (e->right.expr->left.sym == &symbol_yes) { + free(e->right.expr); + tmp = e->left.expr; + *e = *(e->left.expr); + free(tmp); + return e; + } + } + break; + case E_OR: + e->left.expr = expr_eliminate_yn(e->left.expr); + e->right.expr = expr_eliminate_yn(e->right.expr); + if (e->left.expr->type == E_SYMBOL) { + if (e->left.expr->left.sym == &symbol_no) { + free(e->left.expr); + tmp = e->right.expr; + *e = *(e->right.expr); + free(tmp); + return e; + } else if (e->left.expr->left.sym == &symbol_yes) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + e->right.expr = NULL; + return e; + } + } + if (e->right.expr->type == E_SYMBOL) { + if (e->right.expr->left.sym == &symbol_no) { + free(e->right.expr); + tmp = e->left.expr; + *e = *(e->left.expr); + free(tmp); + return e; + } else if (e->right.expr->left.sym == &symbol_yes) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + e->right.expr = NULL; + return e; + } + } + break; + default: + ; + } + return e; +} + +/* + * bool FOO!=n => FOO + */ +struct expr *expr_trans_bool(struct expr *e) +{ + if (!e) + return NULL; + switch (e->type) { + case E_AND: + case E_OR: + case E_NOT: + e->left.expr = expr_trans_bool(e->left.expr); + e->right.expr = expr_trans_bool(e->right.expr); + break; + case E_UNEQUAL: + // FOO!=n -> FOO + if (e->left.sym->type == S_TRISTATE) { + if (e->right.sym == &symbol_no) { + e->type = E_SYMBOL; + e->right.sym = NULL; + } + } + break; + default: + ; + } + return e; +} + +/* + * e1 || e2 -> ? + */ +struct expr *expr_join_or(struct expr *e1, struct expr *e2) +{ + struct expr *tmp; + struct symbol *sym1, *sym2; + + if (expr_eq(e1, e2)) + return expr_copy(e1); + if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT) + return NULL; + if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT) + return NULL; + if (e1->type == E_NOT) { + tmp = e1->left.expr; + if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL) + return NULL; + sym1 = tmp->left.sym; + } else + sym1 = e1->left.sym; + if (e2->type == E_NOT) { + if (e2->left.expr->type != E_SYMBOL) + return NULL; + sym2 = e2->left.expr->left.sym; + } else + sym2 = e2->left.sym; + if (sym1 != sym2) + return NULL; + if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE) + return NULL; + if (sym1->type == S_TRISTATE) { + if (e1->type == E_EQUAL && e2->type == E_EQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) || + (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) { + // (a='y') || (a='m') -> (a!='n') + return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_no); + } + if (e1->type == E_EQUAL && e2->type == E_EQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) { + // (a='y') || (a='n') -> (a!='m') + return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_mod); + } + if (e1->type == E_EQUAL && e2->type == E_EQUAL && + ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) { + // (a='m') || (a='n') -> (a!='y') + return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_yes); + } + } + if (sym1->type == S_BOOLEAN && sym1 == sym2) { + if ((e1->type == E_NOT && e1->left.expr->type == E_SYMBOL && e2->type == E_SYMBOL) || + (e2->type == E_NOT && e2->left.expr->type == E_SYMBOL && e1->type == E_SYMBOL)) + return expr_alloc_symbol(&symbol_yes); + } + + if (DEBUG_EXPR) { + printf("optimize ("); + expr_fprint(e1, stdout); + printf(") || ("); + expr_fprint(e2, stdout); + printf(")?\n"); + } + return NULL; +} + +struct expr *expr_join_and(struct expr *e1, struct expr *e2) +{ + struct expr *tmp; + struct symbol *sym1, *sym2; + + if (expr_eq(e1, e2)) + return expr_copy(e1); + if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT) + return NULL; + if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT) + return NULL; + if (e1->type == E_NOT) { + tmp = e1->left.expr; + if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL) + return NULL; + sym1 = tmp->left.sym; + } else + sym1 = e1->left.sym; + if (e2->type == E_NOT) { + if (e2->left.expr->type != E_SYMBOL) + return NULL; + sym2 = e2->left.expr->left.sym; + } else + sym2 = e2->left.sym; + if (sym1 != sym2) + return NULL; + if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE) + return NULL; + + if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_yes) || + (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_yes)) + // (a) && (a='y') -> (a='y') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); + + if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_no) || + (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_no)) + // (a) && (a!='n') -> (a) + return expr_alloc_symbol(sym1); + + if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_mod) || + (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_mod)) + // (a) && (a!='m') -> (a='y') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); + + if (sym1->type == S_TRISTATE) { + if (e1->type == E_EQUAL && e2->type == E_UNEQUAL) { + // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' + sym2 = e1->right.sym; + if ((e2->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST)) + return sym2 != e2->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2) + : expr_alloc_symbol(&symbol_no); + } + if (e1->type == E_UNEQUAL && e2->type == E_EQUAL) { + // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' + sym2 = e2->right.sym; + if ((e1->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST)) + return sym2 != e1->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2) + : expr_alloc_symbol(&symbol_no); + } + if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) + // (a!='y') && (a!='n') -> (a='m') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_mod); + + if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) || + (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) + // (a!='y') && (a!='m') -> (a='n') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_no); + + if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && + ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) + // (a!='m') && (a!='n') -> (a='m') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); + + if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_mod) || + (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_mod) || + (e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_yes) || + (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_yes)) + return NULL; + } + + if (DEBUG_EXPR) { + printf("optimize ("); + expr_fprint(e1, stdout); + printf(") && ("); + expr_fprint(e2, stdout); + printf(")?\n"); + } + return NULL; +} + +static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct expr **ep2) +{ +#define e1 (*ep1) +#define e2 (*ep2) + struct expr *tmp; + + if (e1->type == type) { + expr_eliminate_dups1(type, &e1->left.expr, &e2); + expr_eliminate_dups1(type, &e1->right.expr, &e2); + return; + } + if (e2->type == type) { + expr_eliminate_dups1(type, &e1, &e2->left.expr); + expr_eliminate_dups1(type, &e1, &e2->right.expr); + return; + } + if (e1 == e2) + return; + + switch (e1->type) { + case E_OR: case E_AND: + expr_eliminate_dups1(e1->type, &e1, &e1); + default: + ; + } + + switch (type) { + case E_OR: + tmp = expr_join_or(e1, e2); + if (tmp) { + expr_free(e1); expr_free(e2); + e1 = expr_alloc_symbol(&symbol_no); + e2 = tmp; + trans_count++; + } + break; + case E_AND: + tmp = expr_join_and(e1, e2); + if (tmp) { + expr_free(e1); expr_free(e2); + e1 = expr_alloc_symbol(&symbol_yes); + e2 = tmp; + trans_count++; + } + break; + default: + ; + } +#undef e1 +#undef e2 +} + +static void expr_eliminate_dups2(enum expr_type type, struct expr **ep1, struct expr **ep2) +{ +#define e1 (*ep1) +#define e2 (*ep2) + struct expr *tmp, *tmp1, *tmp2; + + if (e1->type == type) { + expr_eliminate_dups2(type, &e1->left.expr, &e2); + expr_eliminate_dups2(type, &e1->right.expr, &e2); + return; + } + if (e2->type == type) { + expr_eliminate_dups2(type, &e1, &e2->left.expr); + expr_eliminate_dups2(type, &e1, &e2->right.expr); + } + if (e1 == e2) + return; + + switch (e1->type) { + case E_OR: + expr_eliminate_dups2(e1->type, &e1, &e1); + // (FOO || BAR) && (!FOO && !BAR) -> n + tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1))); + tmp2 = expr_copy(e2); + tmp = expr_extract_eq_and(&tmp1, &tmp2); + if (expr_is_yes(tmp1)) { + expr_free(e1); + e1 = expr_alloc_symbol(&symbol_no); + trans_count++; + } + expr_free(tmp2); + expr_free(tmp1); + expr_free(tmp); + break; + case E_AND: + expr_eliminate_dups2(e1->type, &e1, &e1); + // (FOO && BAR) || (!FOO || !BAR) -> y + tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1))); + tmp2 = expr_copy(e2); + tmp = expr_extract_eq_or(&tmp1, &tmp2); + if (expr_is_no(tmp1)) { + expr_free(e1); + e1 = expr_alloc_symbol(&symbol_yes); + trans_count++; + } + expr_free(tmp2); + expr_free(tmp1); + expr_free(tmp); + break; + default: + ; + } +#undef e1 +#undef e2 +} + +struct expr *expr_eliminate_dups(struct expr *e) +{ + int oldcount; + if (!e) + return e; + + oldcount = trans_count; + while (1) { + trans_count = 0; + switch (e->type) { + case E_OR: case E_AND: + expr_eliminate_dups1(e->type, &e, &e); + expr_eliminate_dups2(e->type, &e, &e); + default: + ; + } + if (!trans_count) + break; + e = expr_eliminate_yn(e); + } + trans_count = oldcount; + return e; +} + +struct expr *expr_transform(struct expr *e) +{ + struct expr *tmp; + + if (!e) + return NULL; + switch (e->type) { + case E_EQUAL: + case E_UNEQUAL: + case E_SYMBOL: + case E_CHOICE: + break; + default: + e->left.expr = expr_transform(e->left.expr); + e->right.expr = expr_transform(e->right.expr); + } + + switch (e->type) { + case E_EQUAL: + if (e->left.sym->type != S_BOOLEAN) + break; + if (e->right.sym == &symbol_no) { + e->type = E_NOT; + e->left.expr = expr_alloc_symbol(e->left.sym); + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_mod) { + printf("boolean symbol %s tested for 'm'? test forced to 'n'\n", e->left.sym->name); + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_yes) { + e->type = E_SYMBOL; + e->right.sym = NULL; + break; + } + break; + case E_UNEQUAL: + if (e->left.sym->type != S_BOOLEAN) + break; + if (e->right.sym == &symbol_no) { + e->type = E_SYMBOL; + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_mod) { + printf("boolean symbol %s tested for 'm'? test forced to 'y'\n", e->left.sym->name); + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_yes) { + e->type = E_NOT; + e->left.expr = expr_alloc_symbol(e->left.sym); + e->right.sym = NULL; + break; + } + break; + case E_NOT: + switch (e->left.expr->type) { + case E_NOT: + // !!a -> a + tmp = e->left.expr->left.expr; + free(e->left.expr); + free(e); + e = tmp; + e = expr_transform(e); + break; + case E_EQUAL: + case E_UNEQUAL: + // !a='x' -> a!='x' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = e->type == E_EQUAL ? E_UNEQUAL : E_EQUAL; + break; + case E_OR: + // !(a || b) -> !a && !b + tmp = e->left.expr; + e->type = E_AND; + e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr); + tmp->type = E_NOT; + tmp->right.expr = NULL; + e = expr_transform(e); + break; + case E_AND: + // !(a && b) -> !a || !b + tmp = e->left.expr; + e->type = E_OR; + e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr); + tmp->type = E_NOT; + tmp->right.expr = NULL; + e = expr_transform(e); + break; + case E_SYMBOL: + if (e->left.expr->left.sym == &symbol_yes) { + // !'y' -> 'n' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + break; + } + if (e->left.expr->left.sym == &symbol_mod) { + // !'m' -> 'm' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = E_SYMBOL; + e->left.sym = &symbol_mod; + break; + } + if (e->left.expr->left.sym == &symbol_no) { + // !'n' -> 'y' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + break; + } + break; + default: + ; + } + break; + default: + ; + } + return e; +} + +int expr_contains_symbol(struct expr *dep, struct symbol *sym) +{ + if (!dep) + return 0; + + switch (dep->type) { + case E_AND: + case E_OR: + return expr_contains_symbol(dep->left.expr, sym) || + expr_contains_symbol(dep->right.expr, sym); + case E_SYMBOL: + return dep->left.sym == sym; + case E_EQUAL: + case E_UNEQUAL: + return dep->left.sym == sym || + dep->right.sym == sym; + case E_NOT: + return expr_contains_symbol(dep->left.expr, sym); + default: + ; + } + return 0; +} + +bool expr_depends_symbol(struct expr *dep, struct symbol *sym) +{ + if (!dep) + return false; + + switch (dep->type) { + case E_AND: + return expr_depends_symbol(dep->left.expr, sym) || + expr_depends_symbol(dep->right.expr, sym); + case E_SYMBOL: + return dep->left.sym == sym; + case E_EQUAL: + if (dep->left.sym == sym) { + if (dep->right.sym == &symbol_yes || dep->right.sym == &symbol_mod) + return true; + } + break; + case E_UNEQUAL: + if (dep->left.sym == sym) { + if (dep->right.sym == &symbol_no) + return true; + } + break; + default: + ; + } + return false; +} + +struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2) +{ + struct expr *tmp = NULL; + expr_extract_eq(E_AND, &tmp, ep1, ep2); + if (tmp) { + *ep1 = expr_eliminate_yn(*ep1); + *ep2 = expr_eliminate_yn(*ep2); + } + return tmp; +} + +struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2) +{ + struct expr *tmp = NULL; + expr_extract_eq(E_OR, &tmp, ep1, ep2); + if (tmp) { + *ep1 = expr_eliminate_yn(*ep1); + *ep2 = expr_eliminate_yn(*ep2); + } + return tmp; +} + +void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2) +{ +#define e1 (*ep1) +#define e2 (*ep2) + if (e1->type == type) { + expr_extract_eq(type, ep, &e1->left.expr, &e2); + expr_extract_eq(type, ep, &e1->right.expr, &e2); + return; + } + if (e2->type == type) { + expr_extract_eq(type, ep, ep1, &e2->left.expr); + expr_extract_eq(type, ep, ep1, &e2->right.expr); + return; + } + if (expr_eq(e1, e2)) { + *ep = *ep ? expr_alloc_two(type, *ep, e1) : e1; + expr_free(e2); + if (type == E_AND) { + e1 = expr_alloc_symbol(&symbol_yes); + e2 = expr_alloc_symbol(&symbol_yes); + } else if (type == E_OR) { + e1 = expr_alloc_symbol(&symbol_no); + e2 = expr_alloc_symbol(&symbol_no); + } + } +#undef e1 +#undef e2 +} + +struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym) +{ + struct expr *e1, *e2; + + if (!e) { + e = expr_alloc_symbol(sym); + if (type == E_UNEQUAL) + e = expr_alloc_one(E_NOT, e); + return e; + } + switch (e->type) { + case E_AND: + e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym); + e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym); + if (sym == &symbol_yes) + e = expr_alloc_two(E_AND, e1, e2); + if (sym == &symbol_no) + e = expr_alloc_two(E_OR, e1, e2); + if (type == E_UNEQUAL) + e = expr_alloc_one(E_NOT, e); + return e; + case E_OR: + e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym); + e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym); + if (sym == &symbol_yes) + e = expr_alloc_two(E_OR, e1, e2); + if (sym == &symbol_no) + e = expr_alloc_two(E_AND, e1, e2); + if (type == E_UNEQUAL) + e = expr_alloc_one(E_NOT, e); + return e; + case E_NOT: + return expr_trans_compare(e->left.expr, type == E_EQUAL ? E_UNEQUAL : E_EQUAL, sym); + case E_UNEQUAL: + case E_EQUAL: + if (type == E_EQUAL) { + if (sym == &symbol_yes) + return expr_copy(e); + if (sym == &symbol_mod) + return expr_alloc_symbol(&symbol_no); + if (sym == &symbol_no) + return expr_alloc_one(E_NOT, expr_copy(e)); + } else { + if (sym == &symbol_yes) + return expr_alloc_one(E_NOT, expr_copy(e)); + if (sym == &symbol_mod) + return expr_alloc_symbol(&symbol_yes); + if (sym == &symbol_no) + return expr_copy(e); + } + break; + case E_SYMBOL: + return expr_alloc_comp(type, e->left.sym, sym); + case E_CHOICE: + case E_RANGE: + case E_NONE: + /* panic */; + } + return NULL; +} + +tristate expr_calc_value(struct expr *e) +{ + tristate val1, val2; + const char *str1, *str2; + + if (!e) + return yes; + + switch (e->type) { + case E_SYMBOL: + sym_calc_value(e->left.sym); + return e->left.sym->curr.tri; + case E_AND: + val1 = expr_calc_value(e->left.expr); + val2 = expr_calc_value(e->right.expr); + return E_AND(val1, val2); + case E_OR: + val1 = expr_calc_value(e->left.expr); + val2 = expr_calc_value(e->right.expr); + return E_OR(val1, val2); + case E_NOT: + val1 = expr_calc_value(e->left.expr); + return E_NOT(val1); + case E_EQUAL: + sym_calc_value(e->left.sym); + sym_calc_value(e->right.sym); + str1 = sym_get_string_value(e->left.sym); + str2 = sym_get_string_value(e->right.sym); + return !strcmp(str1, str2) ? yes : no; + case E_UNEQUAL: + sym_calc_value(e->left.sym); + sym_calc_value(e->right.sym); + str1 = sym_get_string_value(e->left.sym); + str2 = sym_get_string_value(e->right.sym); + return !strcmp(str1, str2) ? no : yes; + default: + printf("expr_calc_value: %d?\n", e->type); + return no; + } +} + +int expr_compare_type(enum expr_type t1, enum expr_type t2) +{ +#if 0 + return 1; +#else + if (t1 == t2) + return 0; + switch (t1) { + case E_EQUAL: + case E_UNEQUAL: + if (t2 == E_NOT) + return 1; + case E_NOT: + if (t2 == E_AND) + return 1; + case E_AND: + if (t2 == E_OR) + return 1; + case E_OR: + if (t2 == E_CHOICE) + return 1; + case E_CHOICE: + if (t2 == 0) + return 1; + default: + return -1; + } + printf("[%dgt%d?]", t1, t2); + return 0; +#endif +} + +void expr_print(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken) +{ + if (!e) { + fn(data, "y"); + return; + } + + if (expr_compare_type(prevtoken, e->type) > 0) + fn(data, "("); + switch (e->type) { + case E_SYMBOL: + if (e->left.sym->name) + fn(data, e->left.sym->name); + else + fn(data, "<choice>"); + break; + case E_NOT: + fn(data, "!"); + expr_print(e->left.expr, fn, data, E_NOT); + break; + case E_EQUAL: + fn(data, e->left.sym->name); + fn(data, "="); + fn(data, e->right.sym->name); + break; + case E_UNEQUAL: + fn(data, e->left.sym->name); + fn(data, "!="); + fn(data, e->right.sym->name); + break; + case E_OR: + expr_print(e->left.expr, fn, data, E_OR); + fn(data, " || "); + expr_print(e->right.expr, fn, data, E_OR); + break; + case E_AND: + expr_print(e->left.expr, fn, data, E_AND); + fn(data, " && "); + expr_print(e->right.expr, fn, data, E_AND); + break; + case E_CHOICE: + fn(data, e->right.sym->name); + if (e->left.expr) { + fn(data, " ^ "); + expr_print(e->left.expr, fn, data, E_CHOICE); + } + break; + case E_RANGE: + fn(data, "["); + fn(data, e->left.sym->name); + fn(data, " "); + fn(data, e->right.sym->name); + fn(data, "]"); + break; + default: + { + char buf[32]; + sprintf(buf, "<unknown type %d>", e->type); + fn(data, buf); + break; + } + } + if (expr_compare_type(prevtoken, e->type) > 0) + fn(data, ")"); +} + +static void expr_print_file_helper(void *data, const char *str) +{ + fwrite(str, strlen(str), 1, data); +} + +void expr_fprint(struct expr *e, FILE *out) +{ + expr_print(e, expr_print_file_helper, out, E_NONE); +} diff --git a/openwrt/package/config/expr.h b/openwrt/package/config/expr.h new file mode 100644 index 0000000000..cac51f6a86 --- /dev/null +++ b/openwrt/package/config/expr.h @@ -0,0 +1,193 @@ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#ifndef EXPR_H +#define EXPR_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <stdio.h> +#ifndef __cplusplus +#include <stdbool.h> +#endif + +struct file { + struct file *next; + struct file *parent; + char *name; + int lineno; + int flags; +}; + +#define FILE_BUSY 0x0001 +#define FILE_SCANNED 0x0002 +#define FILE_PRINTED 0x0004 + +typedef enum tristate { + no, mod, yes +} tristate; + +enum expr_type { + E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE +}; + +union expr_data { + struct expr *expr; + struct symbol *sym; +}; + +struct expr { + enum expr_type type; + union expr_data left, right; +}; + +#define E_OR(dep1, dep2) (((dep1)>(dep2))?(dep1):(dep2)) +#define E_AND(dep1, dep2) (((dep1)<(dep2))?(dep1):(dep2)) +#define E_NOT(dep) (2-(dep)) + +struct expr_value { + struct expr *expr; + tristate tri; +}; + +struct symbol_value { + void *val; + tristate tri; +}; + +enum symbol_type { + S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER +}; + +struct symbol { + struct symbol *next; + char *name; + char *help; + enum symbol_type type; + struct symbol_value curr, user; + tristate visible; + int flags; + struct property *prop; + struct expr *dep, *dep2; + struct expr_value rev_dep; +}; + +#define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER) + +#define SYMBOL_YES 0x0001 +#define SYMBOL_MOD 0x0002 +#define SYMBOL_NO 0x0004 +#define SYMBOL_CONST 0x0007 +#define SYMBOL_CHECK 0x0008 +#define SYMBOL_CHOICE 0x0010 +#define SYMBOL_CHOICEVAL 0x0020 +#define SYMBOL_PRINTED 0x0040 +#define SYMBOL_VALID 0x0080 +#define SYMBOL_OPTIONAL 0x0100 +#define SYMBOL_WRITE 0x0200 +#define SYMBOL_CHANGED 0x0400 +#define SYMBOL_NEW 0x0800 +#define SYMBOL_AUTO 0x1000 +#define SYMBOL_CHECKED 0x2000 +#define SYMBOL_CHECK_DONE 0x4000 +#define SYMBOL_WARNED 0x8000 + +#define SYMBOL_MAXLENGTH 256 +#define SYMBOL_HASHSIZE 257 +#define SYMBOL_HASHMASK 0xff + +enum prop_type { + P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE +}; + +struct property { + struct property *next; + struct symbol *sym; + enum prop_type type; + const char *text; + struct expr_value visible; + struct expr *expr; + struct menu *menu; + struct file *file; + int lineno; +}; + +#define for_all_properties(sym, st, tok) \ + for (st = sym->prop; st; st = st->next) \ + if (st->type == (tok)) +#define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT) +#define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE) +#define for_all_prompts(sym, st) \ + for (st = sym->prop; st; st = st->next) \ + if (st->text) + +struct menu { + struct menu *next; + struct menu *parent; + struct menu *list; + struct symbol *sym; + struct property *prompt; + struct expr *dep; + unsigned int flags; + //char *help; + struct file *file; + int lineno; + void *data; +}; + +#define MENU_CHANGED 0x0001 +#define MENU_ROOT 0x0002 + +#ifndef SWIG + +extern struct file *file_list; +extern struct file *current_file; +struct file *lookup_file(const char *name); + +extern struct symbol symbol_yes, symbol_no, symbol_mod; +extern struct symbol *modules_sym; +extern int cdebug; +struct expr *expr_alloc_symbol(struct symbol *sym); +struct expr *expr_alloc_one(enum expr_type type, struct expr *ce); +struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2); +struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2); +struct expr *expr_alloc_and(struct expr *e1, struct expr *e2); +struct expr *expr_alloc_or(struct expr *e1, struct expr *e2); +struct expr *expr_copy(struct expr *org); +void expr_free(struct expr *e); +int expr_eq(struct expr *e1, struct expr *e2); +void expr_eliminate_eq(struct expr **ep1, struct expr **ep2); +tristate expr_calc_value(struct expr *e); +struct expr *expr_eliminate_yn(struct expr *e); +struct expr *expr_trans_bool(struct expr *e); +struct expr *expr_eliminate_dups(struct expr *e); +struct expr *expr_transform(struct expr *e); +int expr_contains_symbol(struct expr *dep, struct symbol *sym); +bool expr_depends_symbol(struct expr *dep, struct symbol *sym); +struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2); +struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2); +void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2); +struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym); + +void expr_fprint(struct expr *e, FILE *out); + +static inline int expr_is_yes(struct expr *e) +{ + return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes); +} + +static inline int expr_is_no(struct expr *e) +{ + return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no); +} +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* EXPR_H */ diff --git a/openwrt/package/config/inputbox.c b/openwrt/package/config/inputbox.c new file mode 100644 index 0000000000..fa7bebc693 --- /dev/null +++ b/openwrt/package/config/inputbox.c @@ -0,0 +1,240 @@ +/* + * inputbox.c -- implements the input box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program 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 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +unsigned char dialog_input_result[MAX_LEN + 1]; + +/* + * Print the termination buttons + */ +static void +print_buttons(WINDOW *dialog, int height, int width, int selected) +{ + int x = width / 2 - 11; + int y = height - 2; + + print_button (dialog, " Ok ", y, x, selected==0); + print_button (dialog, " Help ", y, x + 14, selected==1); + + wmove(dialog, y, x+1+14*selected); + wrefresh(dialog); +} + +/* + * Display a dialog box for inputing a string + */ +int +dialog_inputbox (const char *title, const char *prompt, int height, int width, + const char *init) +{ + int i, x, y, box_y, box_x, box_width; + int input_x = 0, scroll = 0, key = 0, button = -1; + unsigned char *instr = dialog_input_result; + WINDOW *dialog; + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + + draw_shadow (stdscr, y, x, height, width); + + dialog = newwin (height, width, y, x); + keypad (dialog, TRUE); + + draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); + wattrset (dialog, border_attr); + mvwaddch (dialog, height-3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch (dialog, ACS_HLINE); + wattrset (dialog, dialog_attr); + waddch (dialog, ACS_RTEE); + + if (title != NULL && strlen(title) >= width-2 ) { + /* truncate long title -- mec */ + char * title2 = malloc(width-2+1); + memcpy( title2, title, width-2 ); + title2[width-2] = '\0'; + title = title2; + } + + if (title != NULL) { + wattrset (dialog, title_attr); + mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); + waddstr (dialog, (char *)title); + waddch (dialog, ' '); + } + + wattrset (dialog, dialog_attr); + print_autowrap (dialog, prompt, width - 2, 1, 3); + + /* Draw the input field box */ + box_width = width - 6; + getyx (dialog, y, x); + box_y = y + 2; + box_x = (width - box_width) / 2; + draw_box (dialog, y + 1, box_x - 1, 3, box_width + 2, + border_attr, dialog_attr); + + print_buttons(dialog, height, width, 0); + + /* Set up the initial value */ + wmove (dialog, box_y, box_x); + wattrset (dialog, inputbox_attr); + + if (!init) + instr[0] = '\0'; + else + strcpy (instr, init); + + input_x = strlen (instr); + + if (input_x >= box_width) { + scroll = input_x - box_width + 1; + input_x = box_width - 1; + for (i = 0; i < box_width - 1; i++) + waddch (dialog, instr[scroll + i]); + } else + waddstr (dialog, instr); + + wmove (dialog, box_y, box_x + input_x); + + wrefresh (dialog); + + while (key != ESC) { + key = wgetch (dialog); + + if (button == -1) { /* Input box selected */ + switch (key) { + case TAB: + case KEY_UP: + case KEY_DOWN: + break; + case KEY_LEFT: + continue; + case KEY_RIGHT: + continue; + case KEY_BACKSPACE: + case 127: + if (input_x || scroll) { + wattrset (dialog, inputbox_attr); + if (!input_x) { + scroll = scroll < box_width - 1 ? + 0 : scroll - (box_width - 1); + wmove (dialog, box_y, box_x); + for (i = 0; i < box_width; i++) + waddch (dialog, instr[scroll + input_x + i] ? + instr[scroll + input_x + i] : ' '); + input_x = strlen (instr) - scroll; + } else + input_x--; + instr[scroll + input_x] = '\0'; + mvwaddch (dialog, box_y, input_x + box_x, ' '); + wmove (dialog, box_y, input_x + box_x); + wrefresh (dialog); + } + continue; + default: + if (key < 0x100 && isprint (key)) { + if (scroll + input_x < MAX_LEN) { + wattrset (dialog, inputbox_attr); + instr[scroll + input_x] = key; + instr[scroll + input_x + 1] = '\0'; + if (input_x == box_width - 1) { + scroll++; + wmove (dialog, box_y, box_x); + for (i = 0; i < box_width - 1; i++) + waddch (dialog, instr[scroll + i]); + } else { + wmove (dialog, box_y, input_x++ + box_x); + waddch (dialog, key); + } + wrefresh (dialog); + } else + flash (); /* Alarm user about overflow */ + continue; + } + } + } + switch (key) { + case 'O': + case 'o': + delwin (dialog); + return 0; + case 'H': + case 'h': + delwin (dialog); + return 1; + case KEY_UP: + case KEY_LEFT: + switch (button) { + case -1: + button = 1; /* Indicates "Cancel" button is selected */ + print_buttons(dialog, height, width, 1); + break; + case 0: + button = -1; /* Indicates input box is selected */ + print_buttons(dialog, height, width, 0); + wmove (dialog, box_y, box_x + input_x); + wrefresh (dialog); + break; + case 1: + button = 0; /* Indicates "OK" button is selected */ + print_buttons(dialog, height, width, 0); + break; + } + break; + case TAB: + case KEY_DOWN: + case KEY_RIGHT: + switch (button) { + case -1: + button = 0; /* Indicates "OK" button is selected */ + print_buttons(dialog, height, width, 0); + break; + case 0: + button = 1; /* Indicates "Cancel" button is selected */ + print_buttons(dialog, height, width, 1); + break; + case 1: + button = -1; /* Indicates input box is selected */ + print_buttons(dialog, height, width, 0); + wmove (dialog, box_y, box_x + input_x); + wrefresh (dialog); + break; + } + break; + case ' ': + case '\n': + delwin (dialog); + return (button == -1 ? 0 : button); + case 'X': + case 'x': + key = ESC; + case ESC: + break; + } + } + + delwin (dialog); + return -1; /* ESC pressed */ +} diff --git a/openwrt/package/config/lex.zconf.c_shipped b/openwrt/package/config/lex.zconf.c_shipped new file mode 100644 index 0000000000..b877bb6b3c --- /dev/null +++ b/openwrt/package/config/lex.zconf.c_shipped @@ -0,0 +1,3688 @@ + +#line 3 "lex.zconf.c" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 31 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <stdlib.h> + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */ + +#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L +#include <inttypes.h> +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE zconfrestart(zconfin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +extern int zconfleng; + +extern FILE *zconfin, *zconfout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up zconftext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up zconftext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef unsigned int yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via zconfrestart()), so that the user can continue scanning by + * just pointing zconfin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when zconftext is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int zconfleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow zconfwrap()'s to do buffer switches + * instead of setting up a fresh zconfin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void zconfrestart (FILE *input_file ); +void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE zconf_create_buffer (FILE *file,int size ); +void zconf_delete_buffer (YY_BUFFER_STATE b ); +void zconf_flush_buffer (YY_BUFFER_STATE b ); +void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer ); +void zconfpop_buffer_state (void ); + +static void zconfensure_buffer_stack (void ); +static void zconf_load_buffer_state (void ); +static void zconf_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER zconf_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE zconf_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE zconf_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE zconf_scan_bytes (yyconst char *bytes,int len ); + +void *zconfalloc (yy_size_t ); +void *zconfrealloc (void *,yy_size_t ); +void zconffree (void * ); + +#define yy_new_buffer zconf_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + zconfensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + zconf_create_buffer(zconfin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + zconfensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + zconf_create_buffer(zconfin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +#define zconfwrap(n) 1 +#define YY_SKIP_YYWRAP + +typedef unsigned char YY_CHAR; + +FILE *zconfin = (FILE *) 0, *zconfout = (FILE *) 0; + +typedef int yy_state_type; + +extern int zconflineno; + +int zconflineno = 1; + +extern char *zconftext; +#define yytext_ptr zconftext +static yyconst flex_int16_t yy_nxt[][38] = + { + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 + }, + + { + 11, 12, 13, 14, 12, 12, 15, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12 + }, + + { + 11, 12, 13, 14, 12, 12, 15, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12 + }, + + { + 11, 16, 16, 17, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 18, 16, 16, 18, 18, 19, 20, + 21, 22, 18, 18, 23, 24, 18, 25, 18, 26, + 27, 18, 28, 29, 30, 18, 18, 16 + }, + + { + 11, 16, 16, 17, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 18, 16, 16, 18, 18, 19, 20, + 21, 22, 18, 18, 23, 24, 18, 25, 18, 26, + 27, 18, 28, 29, 30, 18, 18, 16 + + }, + + { + 11, 31, 32, 33, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31 + }, + + { + 11, 31, 32, 33, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31 + }, + + { + 11, 34, 34, 35, 34, 36, 34, 34, 36, 34, + 34, 34, 34, 34, 34, 37, 34, 34, 34, 34, + + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34 + }, + + { + 11, 34, 34, 35, 34, 36, 34, 34, 36, 34, + 34, 34, 34, 34, 34, 37, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34 + }, + + { + 11, 38, 38, 39, 40, 41, 42, 43, 41, 44, + 45, 46, 47, 47, 48, 49, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 50, 47, 47, 47, 51, + 47, 47, 47, 47, 47, 47, 47, 52 + + }, + + { + 11, 38, 38, 39, 40, 41, 42, 43, 41, 44, + 45, 46, 47, 47, 48, 49, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 50, 47, 47, 47, 51, + 47, 47, 47, 47, 47, 47, 47, 52 + }, + + { + -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, + -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, + -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, + -11, -11, -11, -11, -11, -11, -11, -11 + }, + + { + 11, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, + + -12, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12, -12 + }, + + { + 11, -13, 53, 54, -13, -13, 55, -13, -13, -13, + -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, + -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, + -13, -13, -13, -13, -13, -13, -13, -13 + }, + + { + 11, -14, -14, -14, -14, -14, -14, -14, -14, -14, + -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, + -14, -14, -14, -14, -14, -14, -14, -14, -14, -14, + -14, -14, -14, -14, -14, -14, -14, -14 + + }, + + { + 11, 56, 56, 57, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56 + }, + + { + 11, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16, -16 + }, + + { + 11, -17, -17, -17, -17, -17, -17, -17, -17, -17, + -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, + + -17, -17, -17, -17, -17, -17, -17, -17, -17, -17, + -17, -17, -17, -17, -17, -17, -17, -17 + }, + + { + 11, -18, -18, -18, -18, -18, -18, -18, -18, -18, + -18, -18, -18, 58, -18, -18, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -18 + }, + + { + 11, -19, -19, -19, -19, -19, -19, -19, -19, -19, + -19, -19, -19, 58, -19, -19, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 59, + 58, 58, 58, 58, 58, 58, 58, -19 + + }, + + { + 11, -20, -20, -20, -20, -20, -20, -20, -20, -20, + -20, -20, -20, 58, -20, -20, 58, 58, 58, 58, + 58, 58, 58, 58, 60, 58, 58, 58, 58, 61, + 58, 58, 58, 58, 58, 58, 58, -20 + }, + + { + 11, -21, -21, -21, -21, -21, -21, -21, -21, -21, + -21, -21, -21, 58, -21, -21, 58, 58, 58, 58, + 58, 62, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -21 + }, + + { + 11, -22, -22, -22, -22, -22, -22, -22, -22, -22, + -22, -22, -22, 58, -22, -22, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 63, 58, + 58, 58, 58, 58, 58, 58, 58, -22 + }, + + { + 11, -23, -23, -23, -23, -23, -23, -23, -23, -23, + -23, -23, -23, 58, -23, -23, 58, 58, 58, 58, + 58, 64, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -23 + }, + + { + 11, -24, -24, -24, -24, -24, -24, -24, -24, -24, + -24, -24, -24, 58, -24, -24, 58, 58, 58, 58, + 58, 58, 65, 58, 58, 58, 58, 58, 66, 58, + 58, 58, 58, 58, 58, 58, 58, -24 + + }, + + { + 11, -25, -25, -25, -25, -25, -25, -25, -25, -25, + -25, -25, -25, 58, -25, -25, 58, 67, 58, 58, + 58, 68, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -25 + }, + + { + 11, -26, -26, -26, -26, -26, -26, -26, -26, -26, + -26, -26, -26, 58, -26, -26, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 69, 58, 58, 58, 58, 58, 58, -26 + }, + + { + 11, -27, -27, -27, -27, -27, -27, -27, -27, -27, + -27, -27, -27, 58, -27, -27, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 70, 58, 58, 58, 58, -27 + }, + + { + 11, -28, -28, -28, -28, -28, -28, -28, -28, -28, + -28, -28, -28, 58, -28, -28, 58, 71, 58, 58, + 58, 72, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -28 + }, + + { + 11, -29, -29, -29, -29, -29, -29, -29, -29, -29, + -29, -29, -29, 58, -29, -29, 58, 58, 58, 58, + 58, 73, 58, 58, 58, 58, 58, 58, 58, 74, + 58, 58, 58, 58, 75, 58, 58, -29 + + }, + + { + 11, -30, -30, -30, -30, -30, -30, -30, -30, -30, + -30, -30, -30, 58, -30, -30, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 76, 58, 58, 58, 58, -30 + }, + + { + 11, 77, 77, -31, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77 + }, + + { + 11, -32, 78, 79, -32, -32, -32, -32, -32, -32, + -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, + + -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, + -32, -32, -32, -32, -32, -32, -32, -32 + }, + + { + 11, 80, -33, -33, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80 + }, + + { + 11, 81, 81, 82, 81, -34, 81, 81, -34, 81, + 81, 81, 81, 81, 81, -34, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81 + + }, + + { + 11, -35, -35, -35, -35, -35, -35, -35, -35, -35, + -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, + -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, + -35, -35, -35, -35, -35, -35, -35, -35 + }, + + { + 11, -36, -36, -36, -36, -36, -36, -36, -36, -36, + -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, + -36, -36, -36, -36, -36, -36, -36, -36, -36, -36, + -36, -36, -36, -36, -36, -36, -36, -36 + }, + + { + 11, 83, 83, 84, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83 + }, + + { + 11, -38, -38, -38, -38, -38, -38, -38, -38, -38, + -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, + -38, -38, -38, -38, -38, -38, -38, -38, -38, -38, + -38, -38, -38, -38, -38, -38, -38, -38 + }, + + { + 11, -39, -39, -39, -39, -39, -39, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -39, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -39, -39 + + }, + + { + 11, -40, -40, -40, -40, -40, -40, -40, -40, -40, + -40, -40, -40, -40, 85, -40, -40, -40, -40, -40, + -40, -40, -40, -40, -40, -40, -40, -40, -40, -40, + -40, -40, -40, -40, -40, -40, -40, -40 + }, + + { + 11, -41, -41, -41, -41, -41, -41, -41, -41, -41, + -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, + -41, -41, -41, -41, -41, -41, -41, -41, -41, -41, + -41, -41, -41, -41, -41, -41, -41, -41 + }, + + { + 11, 86, 86, -42, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86 + }, + + { + 11, -43, -43, -43, -43, -43, -43, 87, -43, -43, + -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, + -43, -43, -43, -43, -43, -43, -43, -43, -43, -43, + -43, -43, -43, -43, -43, -43, -43, -43 + }, + + { + 11, -44, -44, -44, -44, -44, -44, -44, -44, -44, + -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, + -44, -44, -44, -44, -44, -44, -44, -44, -44, -44, + -44, -44, -44, -44, -44, -44, -44, -44 + + }, + + { + 11, -45, -45, -45, -45, -45, -45, -45, -45, -45, + -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, + -45, -45, -45, -45, -45, -45, -45, -45, -45, -45, + -45, -45, -45, -45, -45, -45, -45, -45 + }, + + { + 11, -46, -46, -46, -46, -46, -46, -46, -46, -46, + -46, 88, 89, 89, -46, -46, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, -46 + }, + + { + 11, -47, -47, -47, -47, -47, -47, -47, -47, -47, + -47, 89, 89, 89, -47, -47, 89, 89, 89, 89, + + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, -47 + }, + + { + 11, -48, -48, -48, -48, -48, -48, -48, -48, -48, + -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, + -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, + -48, -48, -48, -48, -48, -48, -48, -48 + }, + + { + 11, -49, -49, 90, -49, -49, -49, -49, -49, -49, + -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, + -49, -49, -49, -49, -49, -49, -49, -49, -49, -49, + -49, -49, -49, -49, -49, -49, -49, -49 + + }, + + { + 11, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, 89, 89, 89, -50, -50, 89, 89, 89, 89, + 89, 89, 91, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, -50 + }, + + { + 11, -51, -51, -51, -51, -51, -51, -51, -51, -51, + -51, 89, 89, 89, -51, -51, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 92, 89, + 89, 89, 89, 89, 89, 89, 89, -51 + }, + + { + 11, -52, -52, -52, -52, -52, -52, -52, -52, -52, + -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, + + -52, -52, -52, -52, -52, -52, -52, -52, -52, -52, + -52, -52, -52, -52, -52, -52, -52, 93 + }, + + { + 11, -53, 53, 54, -53, -53, 55, -53, -53, -53, + -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, + -53, -53, -53, -53, -53, -53, -53, -53, -53, -53, + -53, -53, -53, -53, -53, -53, -53, -53 + }, + + { + 11, -54, -54, -54, -54, -54, -54, -54, -54, -54, + -54, -54, -54, -54, -54, -54, -54, -54, -54, -54, + -54, -54, -54, -54, -54, -54, -54, -54, -54, -54, + -54, -54, -54, -54, -54, -54, -54, -54 + + }, + + { + 11, 56, 56, 57, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56 + }, + + { + 11, 56, 56, 57, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56 + }, + + { + 11, -57, -57, -57, -57, -57, -57, -57, -57, -57, + -57, -57, -57, -57, -57, -57, -57, -57, -57, -57, + + -57, -57, -57, -57, -57, -57, -57, -57, -57, -57, + -57, -57, -57, -57, -57, -57, -57, -57 + }, + + { + 11, -58, -58, -58, -58, -58, -58, -58, -58, -58, + -58, -58, -58, 58, -58, -58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -58 + }, + + { + 11, -59, -59, -59, -59, -59, -59, -59, -59, -59, + -59, -59, -59, 58, -59, -59, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 94, + 58, 58, 58, 58, 58, 58, 58, -59 + + }, + + { + 11, -60, -60, -60, -60, -60, -60, -60, -60, -60, + -60, -60, -60, 58, -60, -60, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 95, + 58, 58, 58, 58, 58, 58, 58, -60 + }, + + { + 11, -61, -61, -61, -61, -61, -61, -61, -61, -61, + -61, -61, -61, 58, -61, -61, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 96, 97, 58, + 58, 58, 58, 58, 58, 58, 58, -61 + }, + + { + 11, -62, -62, -62, -62, -62, -62, -62, -62, -62, + -62, -62, -62, 58, -62, -62, 58, 58, 58, 58, + + 58, 58, 98, 58, 58, 58, 58, 58, 58, 58, + 99, 58, 58, 58, 58, 58, 58, -62 + }, + + { + 11, -63, -63, -63, -63, -63, -63, -63, -63, -63, + -63, -63, -63, 58, -63, -63, 58, 100, 58, 58, + 101, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -63 + }, + + { + 11, -64, -64, -64, -64, -64, -64, -64, -64, -64, + -64, -64, -64, 58, -64, -64, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 102, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 103, -64 + + }, + + { + 11, -65, -65, -65, -65, -65, -65, -65, -65, -65, + -65, -65, -65, 58, -65, -65, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -65 + }, + + { + 11, -66, -66, -66, -66, -66, -66, -66, -66, -66, + -66, -66, -66, 58, -66, -66, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 104, 58, 58, -66 + }, + + { + 11, -67, -67, -67, -67, -67, -67, -67, -67, -67, + -67, -67, -67, 58, -67, -67, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 105, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -67 + }, + + { + 11, -68, -68, -68, -68, -68, -68, -68, -68, -68, + -68, -68, -68, 58, -68, -68, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 106, 58, + 58, 58, 58, 58, 58, 58, 58, -68 + }, + + { + 11, -69, -69, -69, -69, -69, -69, -69, -69, -69, + -69, -69, -69, 58, -69, -69, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 107, 58, 58, -69 + + }, + + { + 11, -70, -70, -70, -70, -70, -70, -70, -70, -70, + -70, -70, -70, 58, -70, -70, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 108, + 58, 58, 58, 58, 58, 58, 58, -70 + }, + + { + 11, -71, -71, -71, -71, -71, -71, -71, -71, -71, + -71, -71, -71, 58, -71, -71, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 109, 58, + 58, 58, 58, 58, 58, 58, 58, -71 + }, + + { + 11, -72, -72, -72, -72, -72, -72, -72, -72, -72, + -72, -72, -72, 58, -72, -72, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 110, 58, 58, 58, 58, 58, -72 + }, + + { + 11, -73, -73, -73, -73, -73, -73, -73, -73, -73, + -73, -73, -73, 58, -73, -73, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 111, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -73 + }, + + { + 11, -74, -74, -74, -74, -74, -74, -74, -74, -74, + -74, -74, -74, 58, -74, -74, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 112, 58, -74 + + }, + + { + 11, -75, -75, -75, -75, -75, -75, -75, -75, -75, + -75, -75, -75, 58, -75, -75, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 113, 58, 58, 58, 58, -75 + }, + + { + 11, -76, -76, -76, -76, -76, -76, -76, -76, -76, + -76, -76, -76, 58, -76, -76, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 114, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -76 + }, + + { + 11, 77, 77, -77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77 + }, + + { + 11, -78, 78, 79, -78, -78, -78, -78, -78, -78, + -78, -78, -78, -78, -78, -78, -78, -78, -78, -78, + -78, -78, -78, -78, -78, -78, -78, -78, -78, -78, + -78, -78, -78, -78, -78, -78, -78, -78 + }, + + { + 11, 80, -79, -79, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80 + + }, + + { + 11, -80, -80, -80, -80, -80, -80, -80, -80, -80, + -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, + -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, + -80, -80, -80, -80, -80, -80, -80, -80 + }, + + { + 11, 81, 81, 82, 81, -81, 81, 81, -81, 81, + 81, 81, 81, 81, 81, -81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81 + }, + + { + 11, -82, -82, -82, -82, -82, -82, -82, -82, -82, + -82, -82, -82, -82, -82, -82, -82, -82, -82, -82, + + -82, -82, -82, -82, -82, -82, -82, -82, -82, -82, + -82, -82, -82, -82, -82, -82, -82, -82 + }, + + { + 11, -83, -83, 84, -83, -83, -83, -83, -83, -83, + -83, -83, -83, -83, -83, -83, -83, -83, -83, -83, + -83, -83, -83, -83, -83, -83, -83, -83, -83, -83, + -83, -83, -83, -83, -83, -83, -83, -83 + }, + + { + 11, -84, -84, -84, -84, -84, -84, -84, -84, -84, + -84, -84, -84, -84, -84, -84, -84, -84, -84, -84, + -84, -84, -84, -84, -84, -84, -84, -84, -84, -84, + -84, -84, -84, -84, -84, -84, -84, -84 + + }, + + { + 11, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85, -85, -85, + -85, -85, -85, -85, -85, -85, -85, -85 + }, + + { + 11, 86, 86, -86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86 + }, + + { + 11, -87, -87, -87, -87, -87, -87, -87, -87, -87, + -87, -87, -87, -87, -87, -87, -87, -87, -87, -87, + + -87, -87, -87, -87, -87, -87, -87, -87, -87, -87, + -87, -87, -87, -87, -87, -87, -87, -87 + }, + + { + 11, -88, -88, -88, -88, -88, -88, -88, -88, -88, + -88, 115, 89, 89, -88, -88, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, -88 + }, + + { + 11, -89, -89, -89, -89, -89, -89, -89, -89, -89, + -89, 89, 89, 89, -89, -89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, -89 + + }, + + { + 11, -90, -90, -90, -90, -90, -90, -90, -90, -90, + -90, -90, -90, -90, -90, -90, -90, -90, -90, -90, + -90, -90, -90, -90, -90, -90, -90, -90, -90, -90, + -90, -90, -90, -90, -90, -90, -90, -90 + }, + + { + 11, -91, -91, -91, -91, -91, -91, -91, -91, -91, + -91, 89, 89, 89, -91, -91, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, -91 + }, + + { + 11, -92, -92, -92, -92, -92, -92, -92, -92, -92, + -92, 89, 89, 89, -92, -92, 89, 89, 89, 89, + + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, -92 + }, + + { + 11, -93, -93, -93, -93, -93, -93, -93, -93, -93, + -93, -93, -93, -93, -93, -93, -93, -93, -93, -93, + -93, -93, -93, -93, -93, -93, -93, -93, -93, -93, + -93, -93, -93, -93, -93, -93, -93, -93 + }, + + { + 11, -94, -94, -94, -94, -94, -94, -94, -94, -94, + -94, -94, -94, 58, -94, -94, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 116, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -94 + + }, + + { + 11, -95, -95, -95, -95, -95, -95, -95, -95, -95, + -95, -95, -95, 58, -95, -95, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 117, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -95 + }, + + { + 11, -96, -96, -96, -96, -96, -96, -96, -96, -96, + -96, -96, -96, 58, -96, -96, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 118, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -96 + }, + + { + 11, -97, -97, -97, -97, -97, -97, -97, -97, -97, + -97, -97, -97, 58, -97, -97, 58, 58, 58, 58, + + 58, 58, 119, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -97 + }, + + { + 11, -98, -98, -98, -98, -98, -98, -98, -98, -98, + -98, -98, -98, 58, -98, -98, 120, 121, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -98 + }, + + { + 11, -99, -99, -99, -99, -99, -99, -99, -99, -99, + -99, -99, -99, 58, -99, -99, 58, 58, 58, 58, + 58, 122, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -99 + + }, + + { + 11, -100, -100, -100, -100, -100, -100, -100, -100, -100, + -100, -100, -100, 58, -100, -100, 58, 58, 123, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -100 + }, + + { + 11, -101, -101, -101, -101, -101, -101, -101, -101, -101, + -101, -101, -101, 58, -101, -101, 58, 58, 58, 124, + 58, 58, 58, 58, 58, 125, 58, 126, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -101 + }, + + { + 11, -102, -102, -102, -102, -102, -102, -102, -102, -102, + -102, -102, -102, 58, -102, -102, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 127, 58, 58, 58, 58, 58, 58, -102 + }, + + { + 11, -103, -103, -103, -103, -103, -103, -103, -103, -103, + -103, -103, -103, 58, -103, -103, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -103 + }, + + { + 11, -104, -104, -104, -104, -104, -104, -104, -104, -104, + -104, -104, -104, 58, -104, -104, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -104 + + }, + + { + 11, -105, -105, -105, -105, -105, -105, -105, -105, -105, + -105, -105, -105, 58, -105, -105, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 128, 58, + 58, 58, 58, 58, 58, 58, 58, -105 + }, + + { + 11, -106, -106, -106, -106, -106, -106, -106, -106, -106, + -106, -106, -106, 58, -106, -106, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 129, 58, -106 + }, + + { + 11, -107, -107, -107, -107, -107, -107, -107, -107, -107, + -107, -107, -107, 58, -107, -107, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 130, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -107 + }, + + { + 11, -108, -108, -108, -108, -108, -108, -108, -108, -108, + -108, -108, -108, 58, -108, -108, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 131, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -108 + }, + + { + 11, -109, -109, -109, -109, -109, -109, -109, -109, -109, + -109, -109, -109, 58, -109, -109, 58, 58, 58, 58, + 58, 58, 58, 132, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -109 + + }, + + { + 11, -110, -110, -110, -110, -110, -110, -110, -110, -110, + -110, -110, -110, 58, -110, -110, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 133, 58, -110 + }, + + { + 11, -111, -111, -111, -111, -111, -111, -111, -111, -111, + -111, -111, -111, 58, -111, -111, 58, 58, 58, 58, + 58, 134, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -111 + }, + + { + 11, -112, -112, -112, -112, -112, -112, -112, -112, -112, + -112, -112, -112, 58, -112, -112, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 135, 58, 58, 58, 58, -112 + }, + + { + 11, -113, -113, -113, -113, -113, -113, -113, -113, -113, + -113, -113, -113, 58, -113, -113, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 136, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -113 + }, + + { + 11, -114, -114, -114, -114, -114, -114, -114, -114, -114, + -114, -114, -114, 58, -114, -114, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 137, 58, 58, 58, -114 + + }, + + { + 11, -115, -115, -115, -115, -115, -115, -115, -115, -115, + -115, 89, 89, 89, -115, -115, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, -115 + }, + + { + 11, -116, -116, -116, -116, -116, -116, -116, -116, -116, + -116, -116, -116, 58, -116, -116, 58, 58, 58, 58, + 58, 138, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -116 + }, + + { + 11, -117, -117, -117, -117, -117, -117, -117, -117, -117, + -117, -117, -117, 58, -117, -117, 58, 58, 58, 139, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -117 + }, + + { + 11, -118, -118, -118, -118, -118, -118, -118, -118, -118, + -118, -118, -118, 58, -118, -118, 58, 58, 58, 58, + 58, 140, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -118 + }, + + { + 11, -119, -119, -119, -119, -119, -119, -119, -119, -119, + -119, -119, -119, 58, -119, -119, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 141, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -119 + + }, + + { + 11, -120, -120, -120, -120, -120, -120, -120, -120, -120, + -120, -120, -120, 58, -120, -120, 58, 58, 142, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 143, 58, 58, -120 + }, + + { + 11, -121, -121, -121, -121, -121, -121, -121, -121, -121, + -121, -121, -121, 58, -121, -121, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 144, 58, -121 + }, + + { + 11, -122, -122, -122, -122, -122, -122, -122, -122, -122, + -122, -122, -122, 58, -122, -122, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 145, 58, + 58, 58, 58, 58, 58, 58, 58, -122 + }, + + { + 11, -123, -123, -123, -123, -123, -123, -123, -123, -123, + -123, -123, -123, 58, -123, -123, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 146, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -123 + }, + + { + 11, -124, -124, -124, -124, -124, -124, -124, -124, -124, + -124, -124, -124, 58, -124, -124, 58, 58, 58, 58, + 58, 58, 58, 58, 147, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -124 + + }, + + { + 11, -125, -125, -125, -125, -125, -125, -125, -125, -125, + -125, -125, -125, 58, -125, -125, 58, 58, 58, 58, + 58, 58, 148, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -125 + }, + + { + 11, -126, -126, -126, -126, -126, -126, -126, -126, -126, + -126, -126, -126, 58, -126, -126, 58, 58, 58, 58, + 58, 149, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -126 + }, + + { + 11, -127, -127, -127, -127, -127, -127, -127, -127, -127, + -127, -127, -127, 58, -127, -127, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -127 + }, + + { + 11, -128, -128, -128, -128, -128, -128, -128, -128, -128, + -128, -128, -128, 58, -128, -128, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 150, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -128 + }, + + { + 11, -129, -129, -129, -129, -129, -129, -129, -129, -129, + -129, -129, -129, 58, -129, -129, 58, 58, 58, 151, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -129 + + }, + + { + 11, -130, -130, -130, -130, -130, -130, -130, -130, -130, + -130, -130, -130, 58, -130, -130, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 152, + 58, 58, 58, 58, 58, 58, 58, -130 + }, + + { + 11, -131, -131, -131, -131, -131, -131, -131, -131, -131, + -131, -131, -131, 58, -131, -131, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 153, 58, 58, 58, 58, 58, 58, -131 + }, + + { + 11, -132, -132, -132, -132, -132, -132, -132, -132, -132, + -132, -132, -132, 58, -132, -132, 58, 58, 58, 58, + + 58, 154, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -132 + }, + + { + 11, -133, -133, -133, -133, -133, -133, -133, -133, -133, + -133, -133, -133, 58, -133, -133, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 155, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -133 + }, + + { + 11, -134, -134, -134, -134, -134, -134, -134, -134, -134, + -134, -134, -134, 58, -134, -134, 58, 58, 58, 156, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -134 + + }, + + { + 11, -135, -135, -135, -135, -135, -135, -135, -135, -135, + -135, -135, -135, 58, -135, -135, 58, 58, 58, 157, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -135 + }, + + { + 11, -136, -136, -136, -136, -136, -136, -136, -136, -136, + -136, -136, -136, 58, -136, -136, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 158, 58, + 58, 58, 58, 58, 58, 58, 58, -136 + }, + + { + 11, -137, -137, -137, -137, -137, -137, -137, -137, -137, + -137, -137, -137, 58, -137, -137, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 159, 58, 58, -137 + }, + + { + 11, -138, -138, -138, -138, -138, -138, -138, -138, -138, + -138, -138, -138, 58, -138, -138, 58, 160, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -138 + }, + + { + 11, -139, -139, -139, -139, -139, -139, -139, -139, -139, + -139, -139, -139, 58, -139, -139, 58, 58, 58, 58, + 58, 161, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -139 + + }, + + { + 11, -140, -140, -140, -140, -140, -140, -140, -140, -140, + -140, -140, -140, 58, -140, -140, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 162, 58, + 58, 58, 58, 58, 58, 58, 58, -140 + }, + + { + 11, -141, -141, -141, -141, -141, -141, -141, -141, -141, + -141, -141, -141, 58, -141, -141, 58, 58, 58, 58, + 58, 58, 58, 163, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -141 + }, + + { + 11, -142, -142, -142, -142, -142, -142, -142, -142, -142, + -142, -142, -142, 58, -142, -142, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 164, + 58, 58, 58, 58, 58, 58, 58, -142 + }, + + { + 11, -143, -143, -143, -143, -143, -143, -143, -143, -143, + -143, -143, -143, 58, -143, -143, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 165, 58, 58, 58, 58, -143 + }, + + { + 11, -144, -144, -144, -144, -144, -144, -144, -144, -144, + -144, -144, -144, 58, -144, -144, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 166, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -144 + + }, + + { + 11, -145, -145, -145, -145, -145, -145, -145, -145, -145, + -145, -145, -145, 58, -145, -145, 58, 58, 58, 58, + 167, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -145 + }, + + { + 11, -146, -146, -146, -146, -146, -146, -146, -146, -146, + -146, -146, -146, 58, -146, -146, 58, 58, 58, 58, + 58, 168, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -146 + }, + + { + 11, -147, -147, -147, -147, -147, -147, -147, -147, -147, + -147, -147, -147, 58, -147, -147, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 169, + 58, 58, 58, 58, 58, 58, 58, -147 + }, + + { + 11, -148, -148, -148, -148, -148, -148, -148, -148, -148, + -148, -148, -148, 58, -148, -148, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -148 + }, + + { + 11, -149, -149, -149, -149, -149, -149, -149, -149, -149, + -149, -149, -149, 58, -149, -149, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 170, 58, + 58, 58, 58, 58, 58, 58, 58, -149 + + }, + + { + 11, -150, -150, -150, -150, -150, -150, -150, -150, -150, + -150, -150, -150, 58, -150, -150, 58, 58, 58, 58, + 58, 171, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -150 + }, + + { + 11, -151, -151, -151, -151, -151, -151, -151, -151, -151, + -151, -151, -151, 58, -151, -151, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 172, + 58, 58, 58, 58, 58, 58, 58, -151 + }, + + { + 11, -152, -152, -152, -152, -152, -152, -152, -152, -152, + -152, -152, -152, 58, -152, -152, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 173, 58, + 58, 58, 58, 58, 58, 58, 58, -152 + }, + + { + 11, -153, -153, -153, -153, -153, -153, -153, -153, -153, + -153, -153, -153, 58, -153, -153, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 174, 58, 58, -153 + }, + + { + 11, -154, -154, -154, -154, -154, -154, -154, -154, -154, + -154, -154, -154, 58, -154, -154, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -154 + + }, + + { + 11, -155, -155, -155, -155, -155, -155, -155, -155, -155, + -155, -155, -155, 58, -155, -155, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 175, 58, 58, 58, 58, -155 + }, + + { + 11, -156, -156, -156, -156, -156, -156, -156, -156, -156, + -156, -156, -156, 58, -156, -156, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 176, 58, 58, -156 + }, + + { + 11, -157, -157, -157, -157, -157, -157, -157, -157, -157, + -157, -157, -157, 58, -157, -157, 58, 58, 58, 58, + + 58, 177, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -157 + }, + + { + 11, -158, -158, -158, -158, -158, -158, -158, -158, -158, + -158, -158, -158, 58, -158, -158, 58, 58, 58, 58, + 58, 58, 58, 178, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -158 + }, + + { + 11, -159, -159, -159, -159, -159, -159, -159, -159, -159, + -159, -159, -159, 58, -159, -159, 58, 179, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -159 + + }, + + { + 11, -160, -160, -160, -160, -160, -160, -160, -160, -160, + -160, -160, -160, 58, -160, -160, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 180, 58, + 58, 58, 58, 58, 58, 58, 58, -160 + }, + + { + 11, -161, -161, -161, -161, -161, -161, -161, -161, -161, + -161, -161, -161, 58, -161, -161, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -161 + }, + + { + 11, -162, -162, -162, -162, -162, -162, -162, -162, -162, + -162, -162, -162, 58, -162, -162, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 181, 58, 58, -162 + }, + + { + 11, -163, -163, -163, -163, -163, -163, -163, -163, -163, + -163, -163, -163, 58, -163, -163, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -163 + }, + + { + 11, -164, -164, -164, -164, -164, -164, -164, -164, -164, + -164, -164, -164, 58, -164, -164, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 182, + 58, 58, 58, 58, 58, 58, 58, -164 + + }, + + { + 11, -165, -165, -165, -165, -165, -165, -165, -165, -165, + -165, -165, -165, 58, -165, -165, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 183, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -165 + }, + + { + 11, -166, -166, -166, -166, -166, -166, -166, -166, -166, + -166, -166, -166, 58, -166, -166, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 184, 58, 58, -166 + }, + + { + 11, -167, -167, -167, -167, -167, -167, -167, -167, -167, + -167, -167, -167, 58, -167, -167, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 185, 58, 58, 58, -167 + }, + + { + 11, -168, -168, -168, -168, -168, -168, -168, -168, -168, + -168, -168, -168, 58, -168, -168, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -168 + }, + + { + 11, -169, -169, -169, -169, -169, -169, -169, -169, -169, + -169, -169, -169, 58, -169, -169, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 186, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -169 + + }, + + { + 11, -170, -170, -170, -170, -170, -170, -170, -170, -170, + -170, -170, -170, 58, -170, -170, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 187, 58, -170 + }, + + { + 11, -171, -171, -171, -171, -171, -171, -171, -171, -171, + -171, -171, -171, 58, -171, -171, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 188, 58, + 58, 58, 58, 58, 58, 58, 58, -171 + }, + + { + 11, -172, -172, -172, -172, -172, -172, -172, -172, -172, + -172, -172, -172, 58, -172, -172, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 189, 58, + 58, 58, 58, 58, 58, 58, 58, -172 + }, + + { + 11, -173, -173, -173, -173, -173, -173, -173, -173, -173, + -173, -173, -173, 58, -173, -173, 58, 190, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -173 + }, + + { + 11, -174, -174, -174, -174, -174, -174, -174, -174, -174, + -174, -174, -174, 58, -174, -174, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -174 + + }, + + { + 11, -175, -175, -175, -175, -175, -175, -175, -175, -175, + -175, -175, -175, 58, -175, -175, 58, 58, 58, 58, + 58, 191, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -175 + }, + + { + 11, -176, -176, -176, -176, -176, -176, -176, -176, -176, + -176, -176, -176, 58, -176, -176, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -176 + }, + + { + 11, -177, -177, -177, -177, -177, -177, -177, -177, -177, + -177, -177, -177, 58, -177, -177, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -177 + }, + + { + 11, -178, -178, -178, -178, -178, -178, -178, -178, -178, + -178, -178, -178, 58, -178, -178, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -178 + }, + + { + 11, -179, -179, -179, -179, -179, -179, -179, -179, -179, + -179, -179, -179, 58, -179, -179, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 192, 58, 58, -179 + + }, + + { + 11, -180, -180, -180, -180, -180, -180, -180, -180, -180, + -180, -180, -180, 58, -180, -180, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -180 + }, + + { + 11, -181, -181, -181, -181, -181, -181, -181, -181, -181, + -181, -181, -181, 58, -181, -181, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -181 + }, + + { + 11, -182, -182, -182, -182, -182, -182, -182, -182, -182, + -182, -182, -182, 58, -182, -182, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 193, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -182 + }, + + { + 11, -183, -183, -183, -183, -183, -183, -183, -183, -183, + -183, -183, -183, 58, -183, -183, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 194, 58, 58, 58, -183 + }, + + { + 11, -184, -184, -184, -184, -184, -184, -184, -184, -184, + -184, -184, -184, 58, -184, -184, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -184 + + }, + + { + 11, -185, -185, -185, -185, -185, -185, -185, -185, -185, + -185, -185, -185, 58, -185, -185, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -185 + }, + + { + 11, -186, -186, -186, -186, -186, -186, -186, -186, -186, + -186, -186, -186, 58, -186, -186, 58, 58, 58, 195, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -186 + }, + + { + 11, -187, -187, -187, -187, -187, -187, -187, -187, -187, + -187, -187, -187, 58, -187, -187, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -187 + }, + + { + 11, -188, -188, -188, -188, -188, -188, -188, -188, -188, + -188, -188, -188, 58, -188, -188, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 196, 58, -188 + }, + + { + 11, -189, -189, -189, -189, -189, -189, -189, -189, -189, + -189, -189, -189, 58, -189, -189, 58, 58, 58, 58, + 58, 58, 197, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -189 + + }, + + { + 11, -190, -190, -190, -190, -190, -190, -190, -190, -190, + -190, -190, -190, 58, -190, -190, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 198, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -190 + }, + + { + 11, -191, -191, -191, -191, -191, -191, -191, -191, -191, + -191, -191, -191, 58, -191, -191, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 199, 58, 58, 58, -191 + }, + + { + 11, -192, -192, -192, -192, -192, -192, -192, -192, -192, + -192, -192, -192, 58, -192, -192, 58, 58, 58, 58, + + 58, 200, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -192 + }, + + { + 11, -193, -193, -193, -193, -193, -193, -193, -193, -193, + -193, -193, -193, 58, -193, -193, 58, 58, 58, 58, + 58, 201, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -193 + }, + + { + 11, -194, -194, -194, -194, -194, -194, -194, -194, -194, + -194, -194, -194, 58, -194, -194, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 202, 58, 58, -194 + + }, + + { + 11, -195, -195, -195, -195, -195, -195, -195, -195, -195, + -195, -195, -195, 58, -195, -195, 58, 58, 58, 58, + 58, 203, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -195 + }, + + { + 11, -196, -196, -196, -196, -196, -196, -196, -196, -196, + -196, -196, -196, 58, -196, -196, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -196 + }, + + { + 11, -197, -197, -197, -197, -197, -197, -197, -197, -197, + -197, -197, -197, 58, -197, -197, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 204, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -197 + }, + + { + 11, -198, -198, -198, -198, -198, -198, -198, -198, -198, + -198, -198, -198, 58, -198, -198, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -198 + }, + + { + 11, -199, -199, -199, -199, -199, -199, -199, -199, -199, + -199, -199, -199, 58, -199, -199, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -199 + + }, + + { + 11, -200, -200, -200, -200, -200, -200, -200, -200, -200, + -200, -200, -200, 58, -200, -200, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -200 + }, + + { + 11, -201, -201, -201, -201, -201, -201, -201, -201, -201, + -201, -201, -201, 58, -201, -201, 58, 205, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -201 + }, + + { + 11, -202, -202, -202, -202, -202, -202, -202, -202, -202, + -202, -202, -202, 58, -202, -202, 58, 206, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -202 + }, + + { + 11, -203, -203, -203, -203, -203, -203, -203, -203, -203, + -203, -203, -203, 58, -203, -203, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -203 + }, + + { + 11, -204, -204, -204, -204, -204, -204, -204, -204, -204, + -204, -204, -204, 58, -204, -204, 58, 58, 58, 58, + 58, 58, 58, 207, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -204 + + }, + + { + 11, -205, -205, -205, -205, -205, -205, -205, -205, -205, + -205, -205, -205, 58, -205, -205, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 208, 58, + 58, 58, 58, 58, 58, 58, 58, -205 + }, + + { + 11, -206, -206, -206, -206, -206, -206, -206, -206, -206, + -206, -206, -206, 58, -206, -206, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 209, 58, 58, -206 + }, + + { + 11, -207, -207, -207, -207, -207, -207, -207, -207, -207, + -207, -207, -207, 58, -207, -207, 58, 58, 58, 58, + + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -207 + }, + + { + 11, -208, -208, -208, -208, -208, -208, -208, -208, -208, + -208, -208, -208, 58, -208, -208, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -208 + }, + + { + 11, -209, -209, -209, -209, -209, -209, -209, -209, -209, + -209, -209, -209, 58, -209, -209, 58, 58, 58, 58, + 58, 210, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -209 + + }, + + { + 11, -210, -210, -210, -210, -210, -210, -210, -210, -210, + -210, -210, -210, 58, -210, -210, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, -210 + }, + + } ; + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up zconftext. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + zconfleng = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 64 +#define YY_END_OF_BUFFER 65 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[211] = + { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 65, 5, 4, 3, 2, 36, 37, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 63, 60, 62, 55, 59, 58, 57, 53, 48, 42, + 47, 51, 53, 40, 41, 50, 50, 43, 53, 50, + 50, 53, 4, 3, 2, 2, 1, 35, 35, 35, + 35, 35, 35, 35, 16, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 63, 60, 62, 61, + 55, 54, 57, 56, 44, 51, 38, 50, 50, 52, + 45, 46, 39, 35, 35, 35, 35, 35, 35, 35, + + 35, 35, 30, 29, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 49, 25, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 15, 35, 7, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 17, 35, 35, + 35, 35, 35, 34, 35, 35, 35, 35, 35, 35, + 10, 35, 13, 35, 35, 35, 35, 33, 35, 35, + 35, 35, 35, 22, 35, 32, 9, 31, 35, 26, + 12, 35, 35, 21, 18, 35, 8, 35, 35, 35, + 35, 35, 27, 35, 35, 6, 35, 20, 19, 23, + + 35, 35, 11, 35, 35, 35, 14, 28, 35, 24 + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 4, 5, 6, 1, 1, 7, 8, 9, + 10, 1, 1, 1, 11, 12, 12, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, + 14, 1, 1, 1, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 1, 15, 1, 1, 16, 1, 17, 18, 19, 20, + + 21, 22, 23, 24, 25, 13, 13, 26, 27, 28, + 29, 30, 31, 32, 33, 34, 35, 13, 13, 36, + 13, 13, 1, 37, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +extern int zconf_flex_debug; +int zconf_flex_debug = 0; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *zconftext; + +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#define LKC_DIRECT_LINK +#include "lkc.h" + +#define START_STRSIZE 16 + +char *text; +static char *text_ptr; +static int text_size, text_asize; + +struct buffer { + struct buffer *parent; + YY_BUFFER_STATE state; +}; + +struct buffer *current_buf; + +static int last_ts, first_ts; + +static void zconf_endhelp(void); +static struct buffer *zconf_endfile(void); + +void new_string(void) +{ + text = malloc(START_STRSIZE); + text_asize = START_STRSIZE; + text_ptr = text; + text_size = 0; + *text_ptr = 0; +} + +void append_string(const char *str, int size) +{ + int new_size = text_size + size + 1; + if (new_size > text_asize) { + text = realloc(text, new_size); + text_asize = new_size; + text_ptr = text + text_size; + } + memcpy(text_ptr, str, size); + text_ptr += size; + text_size += size; + *text_ptr = 0; +} + +void alloc_string(const char *str, int size) +{ + text = malloc(size + 1); + memcpy(text, str, size); + text[size] = 0; +} + +#define INITIAL 0 +#define COMMAND 1 +#define HELP 2 +#define STRING 3 +#define PARAM 4 + +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include <unistd.h> + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int zconfwrap (void ); +#else +extern int zconfwrap (void ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ); + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( zconftext, zconfleng, 1, zconfout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + errno=0; \ + while ( (result = read( fileno(zconfin), (char *) buf, max_size )) < 0 ) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(zconfin); \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int zconflex (void); + +#define YY_DECL int zconflex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after zconftext and zconfleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + + int str = 0; + int ts, i; + + if ( (yy_init) ) + { + (yy_init) = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! zconfin ) + zconfin = stdin; + + if ( ! zconfout ) + zconfout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + zconfensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + zconf_create_buffer(zconfin,YY_BUF_SIZE ); + } + + zconf_load_buffer_state( ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of zconftext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); +yy_match: + while ( (yy_current_state = yy_nxt[yy_current_state][ yy_ec[YY_SC_TO_UI(*yy_cp)] ]) > 0 ) + ++yy_cp; + + yy_current_state = -yy_current_state; + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ +case 1: +/* rule 1 can match eol */ +YY_RULE_SETUP +current_file->lineno++; + YY_BREAK +case 2: +YY_RULE_SETUP + + YY_BREAK +case 3: +/* rule 3 can match eol */ +YY_RULE_SETUP +current_file->lineno++; return T_EOL; + YY_BREAK +case 4: +YY_RULE_SETUP +{ + BEGIN(COMMAND); +} + YY_BREAK +case 5: +YY_RULE_SETUP +{ + unput(zconftext[0]); + BEGIN(COMMAND); +} + YY_BREAK + +case 6: +YY_RULE_SETUP +BEGIN(PARAM); return T_MAINMENU; + YY_BREAK +case 7: +YY_RULE_SETUP +BEGIN(PARAM); return T_MENU; + YY_BREAK +case 8: +YY_RULE_SETUP +BEGIN(PARAM); return T_ENDMENU; + YY_BREAK +case 9: +YY_RULE_SETUP +BEGIN(PARAM); return T_SOURCE; + YY_BREAK +case 10: +YY_RULE_SETUP +BEGIN(PARAM); return T_CHOICE; + YY_BREAK +case 11: +YY_RULE_SETUP +BEGIN(PARAM); return T_ENDCHOICE; + YY_BREAK +case 12: +YY_RULE_SETUP +BEGIN(PARAM); return T_COMMENT; + YY_BREAK +case 13: +YY_RULE_SETUP +BEGIN(PARAM); return T_CONFIG; + YY_BREAK +case 14: +YY_RULE_SETUP +BEGIN(PARAM); return T_MENUCONFIG; + YY_BREAK +case 15: +YY_RULE_SETUP +BEGIN(PARAM); return T_HELP; + YY_BREAK +case 16: +YY_RULE_SETUP +BEGIN(PARAM); return T_IF; + YY_BREAK +case 17: +YY_RULE_SETUP +BEGIN(PARAM); return T_ENDIF; + YY_BREAK +case 18: +YY_RULE_SETUP +BEGIN(PARAM); return T_DEPENDS; + YY_BREAK +case 19: +YY_RULE_SETUP +BEGIN(PARAM); return T_REQUIRES; + YY_BREAK +case 20: +YY_RULE_SETUP +BEGIN(PARAM); return T_OPTIONAL; + YY_BREAK +case 21: +YY_RULE_SETUP +BEGIN(PARAM); return T_DEFAULT; + YY_BREAK +case 22: +YY_RULE_SETUP +BEGIN(PARAM); return T_PROMPT; + YY_BREAK +case 23: +YY_RULE_SETUP +BEGIN(PARAM); return T_TRISTATE; + YY_BREAK +case 24: +YY_RULE_SETUP +BEGIN(PARAM); return T_DEF_TRISTATE; + YY_BREAK +case 25: +YY_RULE_SETUP +BEGIN(PARAM); return T_BOOLEAN; + YY_BREAK +case 26: +YY_RULE_SETUP +BEGIN(PARAM); return T_BOOLEAN; + YY_BREAK +case 27: +YY_RULE_SETUP +BEGIN(PARAM); return T_DEF_BOOLEAN; + YY_BREAK +case 28: +YY_RULE_SETUP +BEGIN(PARAM); return T_DEF_BOOLEAN; + YY_BREAK +case 29: +YY_RULE_SETUP +BEGIN(PARAM); return T_INT; + YY_BREAK +case 30: +YY_RULE_SETUP +BEGIN(PARAM); return T_HEX; + YY_BREAK +case 31: +YY_RULE_SETUP +BEGIN(PARAM); return T_STRING; + YY_BREAK +case 32: +YY_RULE_SETUP +BEGIN(PARAM); return T_SELECT; + YY_BREAK +case 33: +YY_RULE_SETUP +BEGIN(PARAM); return T_SELECT; + YY_BREAK +case 34: +YY_RULE_SETUP +BEGIN(PARAM); return T_RANGE; + YY_BREAK +case 35: +YY_RULE_SETUP +{ + alloc_string(zconftext, zconfleng); + zconflval.string = text; + return T_WORD; + } + YY_BREAK +case 36: +YY_RULE_SETUP + + YY_BREAK +case 37: +/* rule 37 can match eol */ +YY_RULE_SETUP +current_file->lineno++; BEGIN(INITIAL); + YY_BREAK + +case 38: +YY_RULE_SETUP +return T_AND; + YY_BREAK +case 39: +YY_RULE_SETUP +return T_OR; + YY_BREAK +case 40: +YY_RULE_SETUP +return T_OPEN_PAREN; + YY_BREAK +case 41: +YY_RULE_SETUP +return T_CLOSE_PAREN; + YY_BREAK +case 42: +YY_RULE_SETUP +return T_NOT; + YY_BREAK +case 43: +YY_RULE_SETUP +return T_EQUAL; + YY_BREAK +case 44: +YY_RULE_SETUP +return T_UNEQUAL; + YY_BREAK +case 45: +YY_RULE_SETUP +return T_IF; + YY_BREAK +case 46: +YY_RULE_SETUP +return T_ON; + YY_BREAK +case 47: +YY_RULE_SETUP +{ + str = zconftext[0]; + new_string(); + BEGIN(STRING); + } + YY_BREAK +case 48: +/* rule 48 can match eol */ +YY_RULE_SETUP +BEGIN(INITIAL); current_file->lineno++; return T_EOL; + YY_BREAK +case 49: +YY_RULE_SETUP +/* ignore */ + YY_BREAK +case 50: +YY_RULE_SETUP +{ + alloc_string(zconftext, zconfleng); + zconflval.string = text; + return T_WORD; + } + YY_BREAK +case 51: +YY_RULE_SETUP +/* comment */ + YY_BREAK +case 52: +/* rule 52 can match eol */ +YY_RULE_SETUP +current_file->lineno++; + YY_BREAK +case 53: +YY_RULE_SETUP + + YY_BREAK +case YY_STATE_EOF(PARAM): +{ + BEGIN(INITIAL); + } + YY_BREAK + +case 54: +/* rule 54 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up zconftext again */ +YY_RULE_SETUP +{ + append_string(zconftext, zconfleng); + zconflval.string = text; + return T_WORD_QUOTE; + } + YY_BREAK +case 55: +YY_RULE_SETUP +{ + append_string(zconftext, zconfleng); + } + YY_BREAK +case 56: +/* rule 56 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up zconftext again */ +YY_RULE_SETUP +{ + append_string(zconftext + 1, zconfleng - 1); + zconflval.string = text; + return T_WORD_QUOTE; + } + YY_BREAK +case 57: +YY_RULE_SETUP +{ + append_string(zconftext + 1, zconfleng - 1); + } + YY_BREAK +case 58: +YY_RULE_SETUP +{ + if (str == zconftext[0]) { + BEGIN(PARAM); + zconflval.string = text; + return T_WORD_QUOTE; + } else + append_string(zconftext, 1); + } + YY_BREAK +case 59: +/* rule 59 can match eol */ +YY_RULE_SETUP +{ + printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno()); + current_file->lineno++; + BEGIN(INITIAL); + return T_EOL; + } + YY_BREAK +case YY_STATE_EOF(STRING): +{ + BEGIN(INITIAL); + } + YY_BREAK + +case 60: +YY_RULE_SETUP +{ + ts = 0; + for (i = 0; i < zconfleng; i++) { + if (zconftext[i] == '\t') + ts = (ts & ~7) + 8; + else + ts++; + } + last_ts = ts; + if (first_ts) { + if (ts < first_ts) { + zconf_endhelp(); + return T_HELPTEXT; + } + ts -= first_ts; + while (ts > 8) { + append_string(" ", 8); + ts -= 8; + } + append_string(" ", ts); + } + } + YY_BREAK +case 61: +/* rule 61 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up zconftext again */ +YY_RULE_SETUP +{ + current_file->lineno++; + zconf_endhelp(); + return T_HELPTEXT; + } + YY_BREAK +case 62: +/* rule 62 can match eol */ +YY_RULE_SETUP +{ + current_file->lineno++; + append_string("\n", 1); + } + YY_BREAK +case 63: +YY_RULE_SETUP +{ + append_string(zconftext, zconfleng); + if (!first_ts) + first_ts = last_ts; + } + YY_BREAK +case YY_STATE_EOF(HELP): +{ + zconf_endhelp(); + return T_HELPTEXT; + } + YY_BREAK + +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(COMMAND): +{ + if (current_buf) { + zconf_endfile(); + return T_EOF; + } + fclose(zconfin); + yyterminate(); +} + YY_BREAK +case 64: +YY_RULE_SETUP +YY_FATAL_ERROR( "flex scanner jammed" ); + YY_BREAK + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed zconfin at a new source and called + * zconflex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = zconfin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( zconfwrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * zconftext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of zconflex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = (yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + size_t num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + + int yy_c_buf_p_offset = + (int) ((yy_c_buf_p) - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + zconfrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + zconfrestart(zconfin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = (yy_start); + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + yy_current_state = yy_nxt[yy_current_state][(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1)]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + register int yy_is_jam; + + yy_current_state = yy_nxt[yy_current_state][1]; + yy_is_jam = (yy_current_state <= 0); + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp ) +{ + register char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up zconftext */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = (yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + zconfrestart(zconfin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( zconfwrap( ) ) + return EOF; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve zconftext */ + (yy_hold_char) = *++(yy_c_buf_p); + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void zconfrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + zconfensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + zconf_create_buffer(zconfin,YY_BUF_SIZE ); + } + + zconf_init_buffer(YY_CURRENT_BUFFER,input_file ); + zconf_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * zconfpop_buffer_state(); + * zconfpush_buffer_state(new_buffer); + */ + zconfensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + zconf_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (zconfwrap()) processing, but the only time this flag + * is looked at is after zconfwrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void zconf_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + zconfin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE zconf_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) zconfalloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + zconf_init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with zconf_create_buffer() + * + */ + void zconf_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + zconffree((void *) b->yy_ch_buf ); + + zconffree((void *) b ); +} + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a zconfrestart() or at EOF. + */ + static void zconf_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + zconf_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then zconf_init_buffer was _probably_ + * called from zconfrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void zconf_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + zconf_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + zconfensure_buffer_stack(); + + /* This block is copied from zconf_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from zconf_switch_to_buffer. */ + zconf_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void zconfpop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + zconf_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + zconf_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void zconfensure_buffer_stack (void) +{ + int num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)zconfalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)zconfrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE zconf_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + zconf_switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to zconflex() will + * scan from a @e copy of @a str. + * @param str a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * zconf_scan_bytes() instead. + */ +YY_BUFFER_STATE zconf_scan_string (yyconst char * str ) +{ + + return zconf_scan_bytes(str,strlen(str) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to zconflex() will + * scan from a @e copy of @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE zconf_scan_bytes (yyconst char * bytes, int len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) zconfalloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = zconf_scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in zconf_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up zconftext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + zconftext[zconfleng] = (yy_hold_char); \ + (yy_c_buf_p) = zconftext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + zconfleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int zconfget_lineno (void) +{ + + return zconflineno; +} + +/** Get the input stream. + * + */ +FILE *zconfget_in (void) +{ + return zconfin; +} + +/** Get the output stream. + * + */ +FILE *zconfget_out (void) +{ + return zconfout; +} + +/** Get the length of the current token. + * + */ +int zconfget_leng (void) +{ + return zconfleng; +} + +/** Get the current token. + * + */ + +char *zconfget_text (void) +{ + return zconftext; +} + +/** Set the current line number. + * @param line_number + * + */ +void zconfset_lineno (int line_number ) +{ + + zconflineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see zconf_switch_to_buffer + */ +void zconfset_in (FILE * in_str ) +{ + zconfin = in_str ; +} + +void zconfset_out (FILE * out_str ) +{ + zconfout = out_str ; +} + +int zconfget_debug (void) +{ + return zconf_flex_debug; +} + +void zconfset_debug (int bdebug ) +{ + zconf_flex_debug = bdebug ; +} + +/* zconflex_destroy is for both reentrant and non-reentrant scanners. */ +int zconflex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + zconf_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + zconfpop_buffer_state(); + } + + /* Destroy the stack itself. */ + zconffree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *zconfalloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *zconfrealloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void zconffree (void * ptr ) +{ + free( (char *) ptr ); /* see zconfrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#undef YY_NEW_FILE +#undef YY_FLUSH_BUFFER +#undef yy_set_bol +#undef yy_new_buffer +#undef yy_set_interactive +#undef yytext_ptr +#undef YY_DO_BEFORE_ACTION + +#ifdef YY_DECL_IS_OURS +#undef YY_DECL_IS_OURS +#undef YY_DECL +#endif + +void zconf_starthelp(void) +{ + new_string(); + last_ts = first_ts = 0; + BEGIN(HELP); +} + +static void zconf_endhelp(void) +{ + zconflval.string = text; + BEGIN(INITIAL); +} + +/* + * Try to open specified file with following names: + * ./name + * $(srctree)/name + * The latter is used when srctree is separate from objtree + * when compiling the kernel. + * Return NULL if file is not found. + */ +FILE *zconf_fopen(const char *name) +{ + char *env, fullname[PATH_MAX+1]; + FILE *f; + + f = fopen(name, "r"); + if (!f && name[0] != '/') { + env = getenv(SRCTREE); + if (env) { + sprintf(fullname, "%s/%s", env, name); + f = fopen(fullname, "r"); + } + } + return f; +} + +void zconf_initscan(const char *name) +{ + zconfin = zconf_fopen(name); + if (!zconfin) { + printf("can't find file %s\n", name); + exit(1); + } + + current_buf = malloc(sizeof(*current_buf)); + memset(current_buf, 0, sizeof(*current_buf)); + + current_file = file_lookup(name); + current_file->lineno = 1; + current_file->flags = FILE_BUSY; +} + +void zconf_nextfile(const char *name) +{ + struct file *file = file_lookup(name); + struct buffer *buf = malloc(sizeof(*buf)); + memset(buf, 0, sizeof(*buf)); + + current_buf->state = YY_CURRENT_BUFFER; + zconfin = zconf_fopen(name); + if (!zconfin) { + printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name); + exit(1); + } + zconf_switch_to_buffer(zconf_create_buffer(zconfin,YY_BUF_SIZE)); + buf->parent = current_buf; + current_buf = buf; + + if (file->flags & FILE_BUSY) { + printf("recursive scan (%s)?\n", name); + exit(1); + } + if (file->flags & FILE_SCANNED) { + printf("file %s already scanned?\n", name); + exit(1); + } + file->flags |= FILE_BUSY; + file->lineno = 1; + file->parent = current_file; + current_file = file; +} + +static struct buffer *zconf_endfile(void) +{ + struct buffer *parent; + + current_file->flags |= FILE_SCANNED; + current_file->flags &= ~FILE_BUSY; + current_file = current_file->parent; + + parent = current_buf->parent; + if (parent) { + fclose(zconfin); + zconf_delete_buffer(YY_CURRENT_BUFFER); + zconf_switch_to_buffer(parent->state); + } + free(current_buf); + current_buf = parent; + + return parent; +} + +int zconf_lineno(void) +{ + if (current_buf) + return current_file->lineno - 1; + else + return 0; +} + +char *zconf_curname(void) +{ + if (current_buf) + return current_file->name; + else + return "<none>"; +} + diff --git a/openwrt/package/config/lkc.h b/openwrt/package/config/lkc.h new file mode 100644 index 0000000000..dd040f7a86 --- /dev/null +++ b/openwrt/package/config/lkc.h @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#ifndef LKC_H +#define LKC_H + +#include "expr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef LKC_DIRECT_LINK +#define P(name,type,arg) extern type name arg +#else +#include "lkc_defs.h" +#define P(name,type,arg) extern type (*name ## _p) arg +#endif +#include "lkc_proto.h" +#undef P + +#define SRCTREE "srctree" + +int zconfparse(void); +void zconfdump(FILE *out); + +extern int zconfdebug; +void zconf_starthelp(void); +FILE *zconf_fopen(const char *name); +void zconf_initscan(const char *name); +void zconf_nextfile(const char *name); +int zconf_lineno(void); +char *zconf_curname(void); + +/* confdata.c */ +extern const char conf_def_filename[]; +extern char conf_filename[]; + +char *conf_get_default_confname(void); + +/* kconfig_load.c */ +void kconfig_load(void); + +/* menu.c */ +void menu_init(void); +void menu_add_menu(void); +void menu_end_menu(void); +void menu_add_entry(struct symbol *sym); +void menu_end_entry(void); +void menu_add_dep(struct expr *dep); +struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep); +void menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep); +void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep); +void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep); +void menu_finalize(struct menu *parent); +void menu_set_type(int type); +struct file *file_lookup(const char *name); +int file_write_dep(const char *name); + +extern struct menu *current_entry; +extern struct menu *current_menu; + +/* symbol.c */ +void sym_init(void); +void sym_clear_all_valid(void); +void sym_set_changed(struct symbol *sym); +struct symbol *sym_check_deps(struct symbol *sym); +struct property *prop_alloc(enum prop_type type, struct symbol *sym); +struct symbol *prop_get_symbol(struct property *prop); + +static inline tristate sym_get_tristate_value(struct symbol *sym) +{ + return sym->curr.tri; +} + + +static inline struct symbol *sym_get_choice_value(struct symbol *sym) +{ + return (struct symbol *)sym->curr.val; +} + +static inline bool sym_set_choice_value(struct symbol *ch, struct symbol *chval) +{ + return sym_set_tristate_value(chval, yes); +} + +static inline bool sym_is_choice(struct symbol *sym) +{ + return sym->flags & SYMBOL_CHOICE ? true : false; +} + +static inline bool sym_is_choice_value(struct symbol *sym) +{ + return sym->flags & SYMBOL_CHOICEVAL ? true : false; +} + +static inline bool sym_is_optional(struct symbol *sym) +{ + return sym->flags & SYMBOL_OPTIONAL ? true : false; +} + +static inline bool sym_has_value(struct symbol *sym) +{ + return sym->flags & SYMBOL_NEW ? false : true; +} + +#ifdef __cplusplus +} +#endif + +#endif /* LKC_H */ diff --git a/openwrt/package/config/lkc_proto.h b/openwrt/package/config/lkc_proto.h new file mode 100644 index 0000000000..97c79178ee --- /dev/null +++ b/openwrt/package/config/lkc_proto.h @@ -0,0 +1,39 @@ + +/* confdata.c */ +P(conf_parse,void,(const char *name)); +P(conf_read,int,(const char *name)); +P(conf_write,int,(const char *name)); + +/* menu.c */ +P(rootmenu,struct menu,); + +P(menu_is_visible,bool,(struct menu *menu)); +P(menu_get_prompt,const char *,(struct menu *menu)); +P(menu_get_root_menu,struct menu *,(struct menu *menu)); +P(menu_get_parent_menu,struct menu *,(struct menu *menu)); + +/* symbol.c */ +P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]); +P(sym_change_count,int,); + +P(sym_lookup,struct symbol *,(const char *name, int isconst)); +P(sym_find,struct symbol *,(const char *name)); +P(sym_type_name,const char *,(enum symbol_type type)); +P(sym_calc_value,void,(struct symbol *sym)); +P(sym_get_type,enum symbol_type,(struct symbol *sym)); +P(sym_tristate_within_range,bool,(struct symbol *sym,tristate tri)); +P(sym_set_tristate_value,bool,(struct symbol *sym,tristate tri)); +P(sym_toggle_tristate_value,tristate,(struct symbol *sym)); +P(sym_string_valid,bool,(struct symbol *sym, const char *newval)); +P(sym_string_within_range,bool,(struct symbol *sym, const char *str)); +P(sym_set_string_value,bool,(struct symbol *sym, const char *newval)); +P(sym_is_changable,bool,(struct symbol *sym)); +P(sym_get_choice_prop,struct property *,(struct symbol *sym)); +P(sym_get_default_prop,struct property *,(struct symbol *sym)); +P(sym_get_string_value,const char *,(struct symbol *sym)); + +P(prop_get_type_name,const char *,(enum prop_type type)); + +/* expr.c */ +P(expr_compare_type,int,(enum expr_type t1, enum expr_type t2)); +P(expr_print,void,(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken)); diff --git a/openwrt/package/config/mconf.c b/openwrt/package/config/mconf.c new file mode 100644 index 0000000000..0db6f8f6c8 --- /dev/null +++ b/openwrt/package/config/mconf.c @@ -0,0 +1,713 @@ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + * + * Introduced single menu mode (show all sub-menus in one large tree). + * 2002-11-06 Petr Baudis <pasky@ucw.cz> + * + * Directly use liblxdialog library routines. + * 2002-11-14 Petr Baudis <pasky@ucw.cz> + */ + +#include <sys/ioctl.h> +#include <sys/wait.h> +#include <sys/termios.h> +#include <ctype.h> +#include <errno.h> +#include <fcntl.h> +#include <limits.h> +#include <signal.h> +#include <stdarg.h> +#include <stdlib.h> +#include <string.h> +#include <termios.h> +#include <unistd.h> + +#include "dialog.h" + +#define LKC_DIRECT_LINK +#include "lkc.h" + +static char menu_backtitle[128]; +static const char menu_instructions[] = + "Arrow keys navigate the menu. " + "<Enter> selects submenus --->. " + "Highlighted letters are hotkeys. " + "Pressing <Y> selectes a feature, while <N> will exclude a feature. " + "Press <Esc><Esc> to exit, <?> for Help. " + "Legend: [*] feature is selected [ ] feature is excluded", +radiolist_instructions[] = + "Use the arrow keys to navigate this window or " + "press the hotkey of the item you wish to select " + "followed by the <SPACE BAR>. " + "Press <?> for additional information about this option.", +inputbox_instructions_int[] = + "Please enter a decimal value. " + "Fractions will not be accepted. " + "Use the <TAB> key to move from the input field to the buttons below it.", +inputbox_instructions_hex[] = + "Please enter a hexadecimal value. " + "Use the <TAB> key to move from the input field to the buttons below it.", +inputbox_instructions_string[] = + "Please enter a string value. " + "Use the <TAB> key to move from the input field to the buttons below it.", +setmod_text[] = + "This feature depends on another which has been configured as a module.\n" + "As a result, this feature will be built as a module.", +nohelp_text[] = + "There is no help available for this option.\n", +load_config_text[] = + "Enter the name of the configuration file you wish to load. " + "Accept the name shown to restore the configuration you " + "last retrieved. Leave blank to abort.", +load_config_help[] = + "\n" + "For various reasons, one may wish to keep several different Buildroot\n" + "configurations available on a single machine.\n" + "\n" + "If you have saved a previous configuration in a file other than the\n" + "Buildroot's default, entering the name of the file here will allow you\n" + "to modify that configuration.\n" + "\n" + "If you are uncertain, then you have probably never used alternate\n" + "configuration files. You should therefor leave this blank to abort.\n", +save_config_text[] = + "Enter a filename to which this configuration should be saved " + "as an alternate. Leave blank to abort.", +save_config_help[] = + "\n" + "For various reasons, one may wish to keep different Buildroot\n" + "configurations available on a single machine.\n" + "\n" + "Entering a file name here will allow you to later retrieve, modify\n" + "and use the current configuration as an alternate to whatever\n" + "configuration options you have selected at that time.\n" + "\n" + "If you are uncertain what all this means then you should probably\n" + "leave this blank.\n", +top_menu_help[] = + "\n" + "Use the Up/Down arrow keys (cursor keys) to highlight the item\n" + "you wish to change or submenu wish to select and press <Enter>.\n" + "Submenus are designated by \"--->\".\n" + "\n" + "Shortcut: Press the option's highlighted letter (hotkey).\n" + "\n" + "You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n" + "unseen options into view.\n" +; + +static char filename[PATH_MAX+1] = ".config"; +static int indent = 0; +static struct termios ios_org; +static int rows, cols; +static struct menu *current_menu; +static int child_count; +static int single_menu_mode; + +static struct dialog_list_item *items[16384]; /* FIXME: This ought to be dynamic. */ +static int item_no; + +static void conf(struct menu *menu); +static void conf_choice(struct menu *menu); +static void conf_string(struct menu *menu); +static void conf_load(void); +static void conf_save(void); +static void show_textbox(const char *title, const char *text, int r, int c); +static void show_helptext(const char *title, const char *text); +static void show_help(struct menu *menu); +static void show_readme(void); + +static void init_wsize(void) +{ + struct winsize ws; + char *env; + + if (ioctl(1, TIOCGWINSZ, &ws) == -1) { + rows = 24; + cols = 80; + } else { + rows = ws.ws_row; + cols = ws.ws_col; + if (!rows) { + env = getenv("LINES"); + if (env) + rows = atoi(env); + if (!rows) + rows = 24; + } + if (!cols) { + env = getenv("COLUMNS"); + if (env) + cols = atoi(env); + if (!cols) + cols = 80; + } + } + + if (rows < 19 || cols < 80) { + fprintf(stderr, "Your display is too small to run Menuconfig!\n"); + fprintf(stderr, "It must be at least 19 lines by 80 columns.\n"); + exit(1); + } + + rows -= 4; + cols -= 5; +} + +static void cinit(void) +{ + item_no = 0; +} + +static void cmake(void) +{ + items[item_no] = malloc(sizeof(struct dialog_list_item)); + memset(items[item_no], 0, sizeof(struct dialog_list_item)); + items[item_no]->tag = malloc(32); items[item_no]->tag[0] = 0; + items[item_no]->name = malloc(512); items[item_no]->name[0] = 0; + items[item_no]->namelen = 0; + item_no++; +} + +static int cprint_name(const char *fmt, ...) +{ + va_list ap; + int res; + + if (!item_no) + cmake(); + va_start(ap, fmt); + res = vsnprintf(items[item_no - 1]->name + items[item_no - 1]->namelen, + 512 - items[item_no - 1]->namelen, fmt, ap); + if (res > 0) + items[item_no - 1]->namelen += res; + va_end(ap); + + return res; +} + +static int cprint_tag(const char *fmt, ...) +{ + va_list ap; + int res; + + if (!item_no) + cmake(); + va_start(ap, fmt); + res = vsnprintf(items[item_no - 1]->tag, 32, fmt, ap); + va_end(ap); + + return res; +} + +static void cdone(void) +{ + int i; + + for (i = 0; i < item_no; i++) { + free(items[i]->tag); + free(items[i]->name); + free(items[i]); + } + + item_no = 0; +} + +static void build_conf(struct menu *menu) +{ + struct symbol *sym; + struct property *prop; + struct menu *child; + int type, tmp, doint = 2; + tristate val; + char ch; + + if (!menu_is_visible(menu)) + return; + + sym = menu->sym; + prop = menu->prompt; + if (!sym) { + if (prop && menu != current_menu) { + const char *prompt = menu_get_prompt(menu); + switch (prop->type) { + case P_MENU: + child_count++; + cmake(); + cprint_tag("m%p", menu); + + if (single_menu_mode) { + cprint_name("%s%*c%s", + menu->data ? "-->" : "++>", + indent + 1, ' ', prompt); + } else { + cprint_name(" %*c%s --->", indent + 1, ' ', prompt); + } + + if (single_menu_mode && menu->data) + goto conf_childs; + return; + default: + if (prompt) { + child_count++; + cmake(); + cprint_tag(":%p", menu); + cprint_name("---%*c%s", indent + 1, ' ', prompt); + } + } + } else + doint = 0; + goto conf_childs; + } + + cmake(); + type = sym_get_type(sym); + if (sym_is_choice(sym)) { + struct symbol *def_sym = sym_get_choice_value(sym); + struct menu *def_menu = NULL; + + child_count++; + for (child = menu->list; child; child = child->next) { + if (menu_is_visible(child) && child->sym == def_sym) + def_menu = child; + } + + val = sym_get_tristate_value(sym); + if (sym_is_changable(sym)) { + cprint_tag("t%p", menu); + switch (type) { + case S_BOOLEAN: + cprint_name("[%c]", val == no ? ' ' : '*'); + break; + case S_TRISTATE: + switch (val) { + case yes: ch = '*'; break; + case mod: ch = 'M'; break; + default: ch = ' '; break; + } + cprint_name("<%c>", ch); + break; + } + } else { + cprint_tag("%c%p", def_menu ? 't' : ':', menu); + cprint_name(" "); + } + + cprint_name("%*c%s", indent + 1, ' ', menu_get_prompt(menu)); + if (val == yes) { + if (def_menu) { + cprint_name(" (%s)", menu_get_prompt(def_menu)); + cprint_name(" --->"); + if (def_menu->list) { + indent += 2; + build_conf(def_menu); + indent -= 2; + } + } + return; + } + } else { + child_count++; + val = sym_get_tristate_value(sym); + if (sym_is_choice_value(sym) && val == yes) { + cprint_tag(":%p", menu); + cprint_name(" "); + } else { + switch (type) { + case S_BOOLEAN: + cprint_tag("t%p", menu); + if (sym_is_changable(sym)) + cprint_name("[%c]", val == no ? ' ' : '*'); + else + cprint_name("---"); + break; + case S_TRISTATE: + cprint_tag("t%p", menu); + switch (val) { + case yes: ch = '*'; break; + case mod: ch = 'M'; break; + default: ch = ' '; break; + } + if (sym_is_changable(sym)) + cprint_name("<%c>", ch); + else + cprint_name("---"); + break; + default: + cprint_tag("s%p", menu); + tmp = cprint_name("(%s)", sym_get_string_value(sym)); + tmp = indent - tmp + 4; + if (tmp < 0) + tmp = 0; + cprint_name("%*c%s%s", tmp, ' ', menu_get_prompt(menu), + (sym_has_value(sym) || !sym_is_changable(sym)) ? + "" : " (NEW)"); + goto conf_childs; + } + } + cprint_name("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu), + (sym_has_value(sym) || !sym_is_changable(sym)) ? + "" : " (NEW)"); + if (menu->prompt->type == P_MENU) { + cprint_name(" --->"); + return; + } + } + +conf_childs: + indent += doint; + for (child = menu->list; child; child = child->next) + build_conf(child); + indent -= doint; +} + +static void conf(struct menu *menu) +{ + struct dialog_list_item *active_item = NULL; + struct menu *submenu; + const char *prompt = menu_get_prompt(menu); + struct symbol *sym; + char active_entry[40]; + int stat, type; + + unlink("lxdialog.scrltmp"); + active_entry[0] = 0; + while (1) { + indent = 0; + child_count = 0; + current_menu = menu; + cdone(); cinit(); + build_conf(menu); + if (!child_count) + break; + if (menu == &rootmenu) { + cmake(); cprint_tag(":"); cprint_name("--- "); + cmake(); cprint_tag("L"); cprint_name("Load an Alternate Configuration File"); + cmake(); cprint_tag("S"); cprint_name("Save Configuration to an Alternate File"); + } + dialog_clear(); + stat = dialog_menu(prompt ? prompt : "Main Menu", + menu_instructions, rows, cols, rows - 10, + active_entry, item_no, items); + if (stat < 0) + return; + + if (stat == 1 || stat == 255) + break; + + active_item = first_sel_item(item_no, items); + if (!active_item) + continue; + active_item->selected = 0; + strncpy(active_entry, active_item->tag, sizeof(active_entry)); + active_entry[sizeof(active_entry)-1] = 0; + type = active_entry[0]; + if (!type) + continue; + + sym = NULL; + submenu = NULL; + if (sscanf(active_entry + 1, "%p", &submenu) == 1) + sym = submenu->sym; + + switch (stat) { + case 0: + switch (type) { + case 'm': + if (single_menu_mode) + submenu->data = (void *) (long) !submenu->data; + else + conf(submenu); + break; + case 't': + if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes) + conf_choice(submenu); + else if (submenu->prompt->type == P_MENU) + conf(submenu); + break; + case 's': + conf_string(submenu); + break; + case 'L': + conf_load(); + break; + case 'S': + conf_save(); + break; + } + break; + case 2: + if (sym) + show_help(submenu); + else + show_readme(); + break; + case 3: + if (type == 't') { + if (sym_set_tristate_value(sym, yes)) + break; + if (sym_set_tristate_value(sym, mod)) + show_textbox(NULL, setmod_text, 6, 74); + } + break; + case 4: + if (type == 't') + sym_set_tristate_value(sym, no); + break; + case 5: + if (type == 't') + sym_set_tristate_value(sym, mod); + break; + case 6: + if (type == 't') + sym_toggle_tristate_value(sym); + else if (type == 'm') + conf(submenu); + break; + } + } +} + +static void show_textbox(const char *title, const char *text, int r, int c) +{ + int fd; + + fd = creat(".help.tmp", 0777); + write(fd, text, strlen(text)); + close(fd); + while (dialog_textbox(title, ".help.tmp", r, c) < 0) + ; + unlink(".help.tmp"); +} + +static void show_helptext(const char *title, const char *text) +{ + show_textbox(title, text, rows, cols); +} + +static void show_help(struct menu *menu) +{ + const char *help; + char *helptext; + struct symbol *sym = menu->sym; + + help = sym->help; + if (!help) + help = nohelp_text; + if (sym->name) { + helptext = malloc(strlen(sym->name) + strlen(help) + 16); + sprintf(helptext, "%s:\n\n%s", sym->name, help); + show_helptext(menu_get_prompt(menu), helptext); + free(helptext); + } else + show_helptext(menu_get_prompt(menu), help); +} + +static void show_readme(void) +{ + show_helptext("Help", top_menu_help); +} + +static void conf_choice(struct menu *menu) +{ + const char *prompt = menu_get_prompt(menu); + struct menu *child; + struct symbol *active; + + active = sym_get_choice_value(menu->sym); + while (1) { + current_menu = menu; + cdone(); cinit(); + for (child = menu->list; child; child = child->next) { + if (!menu_is_visible(child)) + continue; + cmake(); + cprint_tag("%p", child); + cprint_name("%s", menu_get_prompt(child)); + if (child->sym == sym_get_choice_value(menu->sym)) + items[item_no - 1]->selected = 1; /* ON */ + else if (child->sym == active) + items[item_no - 1]->selected = 2; /* SELECTED */ + else + items[item_no - 1]->selected = 0; /* OFF */ + } + + switch (dialog_checklist(prompt ? prompt : "Main Menu", + radiolist_instructions, 15, 70, 6, + item_no, items, FLAG_RADIO)) { + case 0: + if (sscanf(first_sel_item(item_no, items)->tag, "%p", &child) != 1) + break; + sym_set_tristate_value(child->sym, yes); + return; + case 1: + if (sscanf(first_sel_item(item_no, items)->tag, "%p", &child) == 1) { + show_help(child); + active = child->sym; + } else + show_help(menu); + break; + case 255: + return; + } + } +} + +static void conf_string(struct menu *menu) +{ + const char *prompt = menu_get_prompt(menu); + + while (1) { + char *heading; + + switch (sym_get_type(menu->sym)) { + case S_INT: + heading = (char *) inputbox_instructions_int; + break; + case S_HEX: + heading = (char *) inputbox_instructions_hex; + break; + case S_STRING: + heading = (char *) inputbox_instructions_string; + break; + default: + heading = "Internal mconf error!"; + /* panic? */; + } + + switch (dialog_inputbox(prompt ? prompt : "Main Menu", + heading, 10, 75, + sym_get_string_value(menu->sym))) { + case 0: + if (sym_set_string_value(menu->sym, dialog_input_result)) + return; + show_textbox(NULL, "You have made an invalid entry.", 5, 43); + break; + case 1: + show_help(menu); + break; + case 255: + return; + } + } +} + +static void conf_load(void) +{ + while (1) { + switch (dialog_inputbox(NULL, load_config_text, 11, 55, + filename)) { + case 0: + if (!dialog_input_result[0]) + return; + if (!conf_read(dialog_input_result)) + return; + show_textbox(NULL, "File does not exist!", 5, 38); + break; + case 1: + show_helptext("Load Alternate Configuration", load_config_help); + break; + case 255: + return; + } + } +} + +static void conf_save(void) +{ + while (1) { + switch (dialog_inputbox(NULL, save_config_text, 11, 55, + filename)) { + case 0: + if (!dialog_input_result[0]) + return; + if (!conf_write(dialog_input_result)) + return; + show_textbox(NULL, "Can't create file! Probably a nonexistent directory.", 5, 60); + break; + case 1: + show_helptext("Save Alternate Configuration", save_config_help); + break; + case 255: + return; + } + } +} + +static void conf_cleanup(void) +{ + tcsetattr(1, TCSAFLUSH, &ios_org); + unlink(".help.tmp"); +} + +static void winch_handler(int sig) +{ + struct winsize ws; + + if (ioctl(1, TIOCGWINSZ, &ws) == -1) { + rows = 24; + cols = 80; + } else { + rows = ws.ws_row; + cols = ws.ws_col; + } + + if (rows < 19 || cols < 80) { + end_dialog(); + fprintf(stderr, "Your display is too small to run Menuconfig!\n"); + fprintf(stderr, "It must be at least 19 lines by 80 columns.\n"); + exit(1); + } + + rows -= 4; + cols -= 5; + +} + +int main(int ac, char **av) +{ + int stat; + char *mode; + struct symbol *sym; + + conf_parse(av[1]); + conf_read(NULL); + + sym = sym_lookup("VERSION", 0); + sym_calc_value(sym); + snprintf(menu_backtitle, 128, "Buildroot v%s Configuration", + sym_get_string_value(sym)); + + mode = getenv("MENUCONFIG_MODE"); + if (mode) { + if (!strcasecmp(mode, "single_menu")) + single_menu_mode = 1; + } + + tcgetattr(1, &ios_org); + atexit(conf_cleanup); + init_wsize(); + init_dialog(); + signal(SIGWINCH, winch_handler); + conf(&rootmenu); + end_dialog(); + + /* Restart dialog to act more like when lxdialog was still separate */ + init_dialog(); + do { + stat = dialog_yesno(NULL, + "Do you wish to save your new Buildroot configuration?", 5, 60); + } while (stat < 0); + end_dialog(); + + if (stat == 0) { + conf_write(NULL); + printf("\n\n" + "*** End of Buildroot configuration.\n" + "*** Check the top-level Makefile for additional configuration options.\n\n"); + } else + printf("\n\nYour Buildroot configuration changes were NOT saved.\n\n"); + + return 0; +} diff --git a/openwrt/package/config/menu.c b/openwrt/package/config/menu.c new file mode 100644 index 0000000000..6425296fc3 --- /dev/null +++ b/openwrt/package/config/menu.c @@ -0,0 +1,431 @@ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#include <stdlib.h> +#include <string.h> + +#define LKC_DIRECT_LINK +#include "lkc.h" + +struct menu rootmenu; +struct menu *current_menu, *current_entry; +static struct menu **last_entry_ptr; + +struct file *file_list; +struct file *current_file; + +static void menu_warn(struct menu *menu, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "%s:%d:warning: ", menu->file->name, menu->lineno); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); +} + +static void prop_warn(struct property *prop, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "%s:%d:warning: ", prop->file->name, prop->lineno); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); +} + +void menu_init(void) +{ + current_entry = current_menu = &rootmenu; + last_entry_ptr = &rootmenu.list; +} + +void menu_add_entry(struct symbol *sym) +{ + struct menu *menu; + + menu = malloc(sizeof(*menu)); + memset(menu, 0, sizeof(*menu)); + menu->sym = sym; + menu->parent = current_menu; + menu->file = current_file; + menu->lineno = zconf_lineno(); + + *last_entry_ptr = menu; + last_entry_ptr = &menu->next; + current_entry = menu; +} + +void menu_end_entry(void) +{ +} + +void menu_add_menu(void) +{ + current_menu = current_entry; + last_entry_ptr = ¤t_entry->list; +} + +void menu_end_menu(void) +{ + last_entry_ptr = ¤t_menu->next; + current_menu = current_menu->parent; +} + +struct expr *menu_check_dep(struct expr *e) +{ + if (!e) + return e; + + switch (e->type) { + case E_NOT: + e->left.expr = menu_check_dep(e->left.expr); + break; + case E_OR: + case E_AND: + e->left.expr = menu_check_dep(e->left.expr); + e->right.expr = menu_check_dep(e->right.expr); + break; + case E_SYMBOL: + /* change 'm' into 'm' && MODULES */ + if (e->left.sym == &symbol_mod) + return expr_alloc_and(e, expr_alloc_symbol(modules_sym)); + break; + default: + break; + } + return e; +} + +void menu_add_dep(struct expr *dep) +{ + current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep)); +} + +void menu_set_type(int type) +{ + struct symbol *sym = current_entry->sym; + + if (sym->type == type) + return; + if (sym->type == S_UNKNOWN) { + sym->type = type; + return; + } + menu_warn(current_entry, "type of '%s' redefined from '%s' to '%s'\n", + sym->name ? sym->name : "<choice>", + sym_type_name(sym->type), sym_type_name(type)); +} + +struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep) +{ + struct property *prop = prop_alloc(type, current_entry->sym); + + prop->menu = current_entry; + prop->text = prompt; + prop->expr = expr; + prop->visible.expr = menu_check_dep(dep); + + if (prompt) { + if (current_entry->prompt) + menu_warn(current_entry, "prompt redefined\n"); + current_entry->prompt = prop; + } + + return prop; +} + +void menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep) +{ + menu_add_prop(type, prompt, NULL, dep); +} + +void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep) +{ + menu_add_prop(type, NULL, expr, dep); +} + +void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep) +{ + menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep); +} + +void sym_check_prop(struct symbol *sym) +{ + struct property *prop; + struct symbol *sym2; + for (prop = sym->prop; prop; prop = prop->next) { + switch (prop->type) { + case P_DEFAULT: + if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) && + prop->expr->type != E_SYMBOL) + prop_warn(prop, + "default for config symbol '%'" + " must be a single symbol", sym->name); + break; + case P_SELECT: + sym2 = prop_get_symbol(prop); + if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE) + prop_warn(prop, + "config symbol '%s' uses select, but is " + "not boolean or tristate", sym->name); + else if (sym2->type == S_UNKNOWN) + prop_warn(prop, + "'select' used by config symbol '%s' " + "refer to undefined symbol '%s'", + sym->name, sym2->name); + else if (sym2->type != S_BOOLEAN && sym2->type != S_TRISTATE) + prop_warn(prop, + "'%s' has wrong type. 'select' only " + "accept arguments of boolean and " + "tristate type", sym2->name); + break; + case P_RANGE: + if (sym->type != S_INT && sym->type != S_HEX) + prop_warn(prop, "range is only allowed " + "for int or hex symbols"); + if (!sym_string_valid(sym, prop->expr->left.sym->name) || + !sym_string_valid(sym, prop->expr->right.sym->name)) + prop_warn(prop, "range is invalid"); + break; + default: + ; + } + } +} + +void menu_finalize(struct menu *parent) +{ + struct menu *menu, *last_menu; + struct symbol *sym; + struct property *prop; + struct expr *parentdep, *basedep, *dep, *dep2, **ep; + + sym = parent->sym; + if (parent->list) { + if (sym && sym_is_choice(sym)) { + /* find the first choice value and find out choice type */ + for (menu = parent->list; menu; menu = menu->next) { + if (menu->sym) { + current_entry = parent; + menu_set_type(menu->sym->type); + current_entry = menu; + menu_set_type(sym->type); + break; + } + } + parentdep = expr_alloc_symbol(sym); + } else if (parent->prompt) + parentdep = parent->prompt->visible.expr; + else + parentdep = parent->dep; + + for (menu = parent->list; menu; menu = menu->next) { + basedep = expr_transform(menu->dep); + basedep = expr_alloc_and(expr_copy(parentdep), basedep); + basedep = expr_eliminate_dups(basedep); + menu->dep = basedep; + if (menu->sym) + prop = menu->sym->prop; + else + prop = menu->prompt; + for (; prop; prop = prop->next) { + if (prop->menu != menu) + continue; + dep = expr_transform(prop->visible.expr); + dep = expr_alloc_and(expr_copy(basedep), dep); + dep = expr_eliminate_dups(dep); + if (menu->sym && menu->sym->type != S_TRISTATE) + dep = expr_trans_bool(dep); + prop->visible.expr = dep; + if (prop->type == P_SELECT) { + struct symbol *es = prop_get_symbol(prop); + es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr, + expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep))); + } + } + } + for (menu = parent->list; menu; menu = menu->next) + menu_finalize(menu); + } else if (sym) { + basedep = parent->prompt ? parent->prompt->visible.expr : NULL; + basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no); + basedep = expr_eliminate_dups(expr_transform(basedep)); + last_menu = NULL; + for (menu = parent->next; menu; menu = menu->next) { + dep = menu->prompt ? menu->prompt->visible.expr : menu->dep; + if (!expr_contains_symbol(dep, sym)) + break; + if (expr_depends_symbol(dep, sym)) + goto next; + dep = expr_trans_compare(dep, E_UNEQUAL, &symbol_no); + dep = expr_eliminate_dups(expr_transform(dep)); + dep2 = expr_copy(basedep); + expr_eliminate_eq(&dep, &dep2); + expr_free(dep); + if (!expr_is_yes(dep2)) { + expr_free(dep2); + break; + } + expr_free(dep2); + next: + menu_finalize(menu); + menu->parent = parent; + last_menu = menu; + } + if (last_menu) { + parent->list = parent->next; + parent->next = last_menu->next; + last_menu->next = NULL; + } + } + for (menu = parent->list; menu; menu = menu->next) { + if (sym && sym_is_choice(sym) && menu->sym) { + menu->sym->flags |= SYMBOL_CHOICEVAL; + if (!menu->prompt) + menu_warn(menu, "choice value must have a prompt"); + for (prop = menu->sym->prop; prop; prop = prop->next) { + if (prop->type == P_PROMPT && prop->menu != menu) { + prop_warn(prop, "choice values " + "currently only support a " + "single prompt"); + } + if (prop->type == P_DEFAULT) + prop_warn(prop, "defaults for choice " + "values not supported"); + } + current_entry = menu; + menu_set_type(sym->type); + menu_add_symbol(P_CHOICE, sym, NULL); + prop = sym_get_choice_prop(sym); + for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr) + ; + *ep = expr_alloc_one(E_CHOICE, NULL); + (*ep)->right.sym = menu->sym; + } + if (menu->list && (!menu->prompt || !menu->prompt->text)) { + for (last_menu = menu->list; ; last_menu = last_menu->next) { + last_menu->parent = parent; + if (!last_menu->next) + break; + } + last_menu->next = menu->next; + menu->next = menu->list; + menu->list = NULL; + } + } + + if (sym && !(sym->flags & SYMBOL_WARNED)) { + if (sym->type == S_UNKNOWN) + menu_warn(parent, "config symbol defined " + "without type\n"); + + if (sym_is_choice(sym) && !parent->prompt) + menu_warn(parent, "choice must have a prompt\n"); + + /* Check properties connected to this symbol */ + sym_check_prop(sym); + sym->flags |= SYMBOL_WARNED; + } + + if (sym && !sym_is_optional(sym) && parent->prompt) { + sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr, + expr_alloc_and(parent->prompt->visible.expr, + expr_alloc_symbol(&symbol_mod))); + } +} + +bool menu_is_visible(struct menu *menu) +{ + struct menu *child; + struct symbol *sym; + tristate visible; + + if (!menu->prompt) + return false; + sym = menu->sym; + if (sym) { + sym_calc_value(sym); + visible = menu->prompt->visible.tri; + } else + visible = menu->prompt->visible.tri = expr_calc_value(menu->prompt->visible.expr); + + if (visible != no) + return true; + if (!sym || sym_get_tristate_value(menu->sym) == no) + return false; + + for (child = menu->list; child; child = child->next) + if (menu_is_visible(child)) + return true; + return false; +} + +const char *menu_get_prompt(struct menu *menu) +{ + if (menu->prompt) + return menu->prompt->text; + else if (menu->sym) + return menu->sym->name; + return NULL; +} + +struct menu *menu_get_root_menu(struct menu *menu) +{ + return &rootmenu; +} + +struct menu *menu_get_parent_menu(struct menu *menu) +{ + enum prop_type type; + + for (; menu != &rootmenu; menu = menu->parent) { + type = menu->prompt ? menu->prompt->type : 0; + if (type == P_MENU) + break; + } + return menu; +} + +struct file *file_lookup(const char *name) +{ + struct file *file; + + for (file = file_list; file; file = file->next) { + if (!strcmp(name, file->name)) + return file; + } + + file = malloc(sizeof(*file)); + memset(file, 0, sizeof(*file)); + file->name = strdup(name); + file->next = file_list; + file_list = file; + return file; +} + +int file_write_dep(const char *name) +{ + struct file *file; + FILE *out; + + if (!name) + name = ".config.cmd"; + out = fopen(".config.tmp", "w"); + if (!out) + return 1; + fprintf(out, "deps_config := \\\n"); + for (file = file_list; file; file = file->next) { + if (file->next) + fprintf(out, "\t%s \\\n", file->name); + else + fprintf(out, "\t%s\n", file->name); + } + fprintf(out, "\n.config include/config.h: $(deps_config)\n\n$(deps_config):\n"); + fclose(out); + rename(".config.tmp", name); + return 0; +} + diff --git a/openwrt/package/config/menubox.c b/openwrt/package/config/menubox.c new file mode 100644 index 0000000000..431f09fc99 --- /dev/null +++ b/openwrt/package/config/menubox.c @@ -0,0 +1,436 @@ +/* + * menubox.c -- implements the menu box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com) + * + * This program 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 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * Changes by Clifford Wolf (god@clifford.at) + * + * [ 1998-06-13 ] + * + * *) A bugfix for the Page-Down problem + * + * *) Formerly when I used Page Down and Page Up, the cursor would be set + * to the first position in the menu box. Now lxdialog is a bit + * smarter and works more like other menu systems (just have a look at + * it). + * + * *) Formerly if I selected something my scrolling would be broken because + * lxdialog is re-invoked by the Menuconfig shell script, can't + * remember the last scrolling position, and just sets it so that the + * cursor is at the bottom of the box. Now it writes the temporary file + * lxdialog.scrltmp which contains this information. The file is + * deleted by lxdialog if the user leaves a submenu or enters a new + * one, but it would be nice if Menuconfig could make another "rm -f" + * just to be sure. Just try it out - you will recognise a difference! + * + * [ 1998-06-14 ] + * + * *) Now lxdialog is crash-safe against broken "lxdialog.scrltmp" files + * and menus change their size on the fly. + * + * *) If for some reason the last scrolling position is not saved by + * lxdialog, it sets the scrolling so that the selected item is in the + * middle of the menu box, not at the bottom. + * + * 02 January 1999, Michael Elizabeth Chastain (mec@shout.net) + * Reset 'scroll' to 0 if the value from lxdialog.scrltmp is bogus. + * This fixes a bug in Menuconfig where using ' ' to descend into menus + * would leave mis-synchronized lxdialog.scrltmp files lying around, + * fscanf would read in 'scroll', and eventually that value would get used. + */ + +#include "dialog.h" + +static int menu_width, item_x; + +/* + * Print menu item + */ +static void +print_item (WINDOW * win, const char *item, int choice, int selected, int hotkey) +{ + int j; + char menu_item[menu_width+1]; + + strncpy(menu_item, item, menu_width); + menu_item[menu_width] = 0; + j = first_alpha(menu_item, "YyNnMm"); + + /* Clear 'residue' of last item */ + wattrset (win, menubox_attr); + wmove (win, choice, 0); +#if OLD_NCURSES + { + int i; + for (i = 0; i < menu_width; i++) + waddch (win, ' '); + } +#else + wclrtoeol(win); +#endif + wattrset (win, selected ? item_selected_attr : item_attr); + mvwaddstr (win, choice, item_x, menu_item); + if (hotkey) { + wattrset (win, selected ? tag_key_selected_attr : tag_key_attr); + mvwaddch(win, choice, item_x+j, menu_item[j]); + } + if (selected) { + wmove (win, choice, item_x+1); + wrefresh (win); + } +} + +/* + * Print the scroll indicators. + */ +static void +print_arrows (WINDOW * win, int item_no, int scroll, + int y, int x, int height) +{ + int cur_y, cur_x; + + getyx(win, cur_y, cur_x); + + wmove(win, y, x); + + if (scroll > 0) { + wattrset (win, uarrow_attr); + waddch (win, ACS_UARROW); + waddstr (win, "(-)"); + } + else { + wattrset (win, menubox_attr); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + } + + y = y + height + 1; + wmove(win, y, x); + + if ((height < item_no) && (scroll + height < item_no)) { + wattrset (win, darrow_attr); + waddch (win, ACS_DARROW); + waddstr (win, "(+)"); + } + else { + wattrset (win, menubox_border_attr); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + waddch (win, ACS_HLINE); + } + + wmove(win, cur_y, cur_x); +} + +/* + * Display the termination buttons. + */ +static void +print_buttons (WINDOW *win, int height, int width, int selected) +{ + int x = width / 2 - 16; + int y = height - 2; + + print_button (win, "Select", y, x, selected == 0); + print_button (win, " Exit ", y, x + 12, selected == 1); + print_button (win, " Help ", y, x + 24, selected == 2); + + wmove(win, y, x+1+12*selected); + wrefresh (win); +} + +/* + * Display a menu for choosing among a number of options + */ +int +dialog_menu (const char *title, const char *prompt, int height, int width, + int menu_height, const char *current, int item_no, + struct dialog_list_item ** items) +{ + int i, j, x, y, box_x, box_y; + int key = 0, button = 0, scroll = 0, choice = 0, first_item = 0, max_choice; + WINDOW *dialog, *menu; + FILE *f; + + max_choice = MIN (menu_height, item_no); + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + draw_shadow (stdscr, y, x, height, width); + + dialog = newwin (height, width, y, x); + keypad (dialog, TRUE); + + draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); + wattrset (dialog, border_attr); + mvwaddch (dialog, height - 3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch (dialog, ACS_HLINE); + wattrset (dialog, dialog_attr); + wbkgdset (dialog, dialog_attr & A_COLOR); + waddch (dialog, ACS_RTEE); + + if (title != NULL && strlen(title) >= width-2 ) { + /* truncate long title -- mec */ + char * title2 = malloc(width-2+1); + memcpy( title2, title, width-2 ); + title2[width-2] = '\0'; + title = title2; + } + + if (title != NULL) { + wattrset (dialog, title_attr); + mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); + waddstr (dialog, (char *)title); + waddch (dialog, ' '); + } + + wattrset (dialog, dialog_attr); + print_autowrap (dialog, prompt, width - 2, 1, 3); + + menu_width = width - 6; + box_y = height - menu_height - 5; + box_x = (width - menu_width) / 2 - 1; + + /* create new window for the menu */ + menu = subwin (dialog, menu_height, menu_width, + y + box_y + 1, x + box_x + 1); + keypad (menu, TRUE); + + /* draw a box around the menu items */ + draw_box (dialog, box_y, box_x, menu_height + 2, menu_width + 2, + menubox_border_attr, menubox_attr); + + /* + * Find length of longest item in order to center menu. + * Set 'choice' to default item. + */ + item_x = 0; + for (i = 0; i < item_no; i++) { + item_x = MAX (item_x, MIN(menu_width, strlen (items[i]->name) + 2)); + if (strcmp(current, items[i]->tag) == 0) choice = i; + } + + item_x = (menu_width - item_x) / 2; + + /* get the scroll info from the temp file */ + if ( (f=fopen("lxdialog.scrltmp","r")) != NULL ) { + if ( (fscanf(f,"%d\n",&scroll) == 1) && (scroll <= choice) && + (scroll+max_choice > choice) && (scroll >= 0) && + (scroll+max_choice <= item_no) ) { + first_item = scroll; + choice = choice - scroll; + fclose(f); + } else { + scroll=0; + remove("lxdialog.scrltmp"); + fclose(f); + f=NULL; + } + } + if ( (choice >= max_choice) || (f==NULL && choice >= max_choice/2) ) { + if (choice >= item_no-max_choice/2) + scroll = first_item = item_no-max_choice; + else + scroll = first_item = choice - max_choice/2; + choice = choice - scroll; + } + + /* Print the menu */ + for (i=0; i < max_choice; i++) { + print_item (menu, items[first_item + i]->name, i, i == choice, + (items[first_item + i]->tag[0] != ':')); + } + + wnoutrefresh (menu); + + print_arrows(dialog, item_no, scroll, + box_y, box_x+item_x+1, menu_height); + + print_buttons (dialog, height, width, 0); + wmove (menu, choice, item_x+1); + wrefresh (menu); + + while (key != ESC) { + key = wgetch(menu); + + if (key < 256 && isalpha(key)) key = tolower(key); + + if (strchr("ynm", key)) + i = max_choice; + else { + for (i = choice+1; i < max_choice; i++) { + j = first_alpha(items[scroll + i]->name, "YyNnMm>"); + if (key == tolower(items[scroll + i]->name[j])) + break; + } + if (i == max_choice) + for (i = 0; i < max_choice; i++) { + j = first_alpha(items[scroll + i]->name, "YyNnMm>"); + if (key == tolower(items[scroll + i]->name[j])) + break; + } + } + + if (i < max_choice || + key == KEY_UP || key == KEY_DOWN || + key == '-' || key == '+' || + key == KEY_PPAGE || key == KEY_NPAGE) { + + print_item (menu, items[scroll + choice]->name, choice, FALSE, + (items[scroll + choice]->tag[0] != ':')); + + if (key == KEY_UP || key == '-') { + if (choice < 2 && scroll) { + /* Scroll menu down */ + scrollok (menu, TRUE); + wscrl (menu, -1); + scrollok (menu, FALSE); + + scroll--; + + print_item (menu, items[scroll]->name, 0, FALSE, + (items[scroll]->tag[0] != ':')); + } else + choice = MAX(choice - 1, 0); + + } else if (key == KEY_DOWN || key == '+') { + + print_item (menu, items[scroll + choice]->name, choice, FALSE, + (items[scroll + choice]->tag[0] != ':')); + + if ((choice > max_choice-3) && + (scroll + max_choice < item_no) + ) { + /* Scroll menu up */ + scrollok (menu, TRUE); + scroll (menu); + scrollok (menu, FALSE); + + scroll++; + + print_item (menu, items[scroll + max_choice - 1]->name, + max_choice-1, FALSE, + (items[scroll + max_choice - 1]->tag[0] != ':')); + } else + choice = MIN(choice+1, max_choice-1); + + } else if (key == KEY_PPAGE) { + scrollok (menu, TRUE); + for (i=0; (i < max_choice); i++) { + if (scroll > 0) { + wscrl (menu, -1); + scroll--; + print_item (menu, items[scroll]->name, 0, FALSE, + (items[scroll]->tag[0] != ':')); + } else { + if (choice > 0) + choice--; + } + } + scrollok (menu, FALSE); + + } else if (key == KEY_NPAGE) { + for (i=0; (i < max_choice); i++) { + if (scroll+max_choice < item_no) { + scrollok (menu, TRUE); + scroll(menu); + scrollok (menu, FALSE); + scroll++; + print_item (menu, items[scroll + max_choice - 1]->name, + max_choice-1, FALSE, + (items[scroll + max_choice - 1]->tag[0] != ':')); + } else { + if (choice+1 < max_choice) + choice++; + } + } + + } else + choice = i; + + print_item (menu, items[scroll + choice]->name, choice, TRUE, + (items[scroll + choice]->tag[0] != ':')); + + print_arrows(dialog, item_no, scroll, + box_y, box_x+item_x+1, menu_height); + + wnoutrefresh (dialog); + wrefresh (menu); + + continue; /* wait for another key press */ + } + + switch (key) { + case KEY_LEFT: + case TAB: + case KEY_RIGHT: + button = ((key == KEY_LEFT ? --button : ++button) < 0) + ? 2 : (button > 2 ? 0 : button); + + print_buttons(dialog, height, width, button); + wrefresh (menu); + break; + case ' ': + case 's': + case 'y': + case 'n': + case 'm': + /* save scroll info */ + if ( (f=fopen("lxdialog.scrltmp","w")) != NULL ) { + fprintf(f,"%d\n",scroll); + fclose(f); + } + delwin (dialog); + items[scroll + choice]->selected = 1; + switch (key) { + case 's': return 3; + case 'y': return 3; + case 'n': return 4; + case 'm': return 5; + case ' ': return 6; + } + return 0; + case 'h': + case '?': + button = 2; + case '\n': + delwin (dialog); + items[scroll + choice]->selected = 1; + + remove("lxdialog.scrltmp"); + return button; + case 'e': + case 'x': + key = ESC; + case ESC: + break; + } + } + + delwin (dialog); + remove("lxdialog.scrltmp"); + return -1; /* ESC pressed */ +} diff --git a/openwrt/package/config/msgbox.c b/openwrt/package/config/msgbox.c new file mode 100644 index 0000000000..93692e1fbc --- /dev/null +++ b/openwrt/package/config/msgbox.c @@ -0,0 +1,85 @@ +/* + * msgbox.c -- implements the message box and info box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com) + * + * This program 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 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +/* + * Display a message box. Program will pause and display an "OK" button + * if the parameter 'pause' is non-zero. + */ +int +dialog_msgbox (const char *title, const char *prompt, int height, int width, + int pause) +{ + int i, x, y, key = 0; + WINDOW *dialog; + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + draw_shadow (stdscr, y, x, height, width); + + dialog = newwin (height, width, y, x); + keypad (dialog, TRUE); + + draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); + + if (title != NULL && strlen(title) >= width-2 ) { + /* truncate long title -- mec */ + char * title2 = malloc(width-2+1); + memcpy( title2, title, width-2 ); + title2[width-2] = '\0'; + title = title2; + } + + if (title != NULL) { + wattrset (dialog, title_attr); + mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); + waddstr (dialog, (char *)title); + waddch (dialog, ' '); + } + wattrset (dialog, dialog_attr); + print_autowrap (dialog, prompt, width - 2, 1, 2); + + if (pause) { + wattrset (dialog, border_attr); + mvwaddch (dialog, height - 3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch (dialog, ACS_HLINE); + wattrset (dialog, dialog_attr); + waddch (dialog, ACS_RTEE); + + print_button (dialog, " Ok ", + height - 2, width / 2 - 4, TRUE); + + wrefresh (dialog); + while (key != ESC && key != '\n' && key != ' ' && + key != 'O' && key != 'o' && key != 'X' && key != 'x') + key = wgetch (dialog); + } else { + key = '\n'; + wrefresh (dialog); + } + + delwin (dialog); + return key == ESC ? -1 : 0; +} diff --git a/openwrt/package/config/symbol.c b/openwrt/package/config/symbol.c new file mode 100644 index 0000000000..a9fae9c13a --- /dev/null +++ b/openwrt/package/config/symbol.c @@ -0,0 +1,771 @@ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#include <ctype.h> +#include <stdlib.h> +#include <string.h> +#include <sys/utsname.h> + +#define LKC_DIRECT_LINK +#include "lkc.h" + +struct symbol symbol_yes = { + .name = "y", + .curr = { "y", yes }, + .flags = SYMBOL_YES|SYMBOL_VALID, +}, symbol_mod = { + .name = "m", + .curr = { "m", mod }, + .flags = SYMBOL_MOD|SYMBOL_VALID, +}, symbol_no = { + .name = "n", + .curr = { "n", no }, + .flags = SYMBOL_NO|SYMBOL_VALID, +}, symbol_empty = { + .name = "", + .curr = { "", no }, + .flags = SYMBOL_VALID, +}; + +int sym_change_count; +struct symbol *modules_sym; +tristate modules_val; + +void sym_add_default(struct symbol *sym, const char *def) +{ + struct property *prop = prop_alloc(P_DEFAULT, sym); + + prop->expr = expr_alloc_symbol(sym_lookup(def, 1)); +} + +void sym_init(void) +{ + struct symbol *sym; + char *p; + static bool inited = false; + + if (inited) + return; + inited = true; + + sym = sym_lookup("VERSION", 0); + sym->type = S_STRING; + sym->flags |= SYMBOL_AUTO; + p = getenv("VERSION"); + if (p) + sym_add_default(sym, p); + + sym = sym_lookup("TARGET_ARCH", 0); + sym->type = S_STRING; + sym->flags |= SYMBOL_AUTO; + p = getenv("TARGET_ARCH"); + if (p) + sym_add_default(sym, p); + +} + +enum symbol_type sym_get_type(struct symbol *sym) +{ + enum symbol_type type = sym->type; + + if (type == S_TRISTATE) { + if (sym_is_choice_value(sym) && sym->visible == yes) + type = S_BOOLEAN; + else if (modules_val == no) + type = S_BOOLEAN; + } + return type; +} + +const char *sym_type_name(enum symbol_type type) +{ + switch (type) { + case S_BOOLEAN: + return "boolean"; + case S_TRISTATE: + return "tristate"; + case S_INT: + return "integer"; + case S_HEX: + return "hex"; + case S_STRING: + return "string"; + case S_UNKNOWN: + return "unknown"; + case S_OTHER: + break; + } + return "???"; +} + +struct property *sym_get_choice_prop(struct symbol *sym) +{ + struct property *prop; + + for_all_choices(sym, prop) + return prop; + return NULL; +} + +struct property *sym_get_default_prop(struct symbol *sym) +{ + struct property *prop; + + for_all_defaults(sym, prop) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + if (prop->visible.tri != no) + return prop; + } + return NULL; +} + +struct property *sym_get_range_prop(struct symbol *sym) +{ + struct property *prop; + + for_all_properties(sym, prop, P_RANGE) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + if (prop->visible.tri != no) + return prop; + } + return NULL; +} + +static void sym_calc_visibility(struct symbol *sym) +{ + struct property *prop; + tristate tri; + + /* any prompt visible? */ + tri = no; + for_all_prompts(sym, prop) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + tri = E_OR(tri, prop->visible.tri); + } + if (tri == mod && (sym->type != S_TRISTATE || modules_val == no)) + tri = yes; + if (sym->visible != tri) { + sym->visible = tri; + sym_set_changed(sym); + } + if (sym_is_choice_value(sym)) + return; + tri = no; + if (sym->rev_dep.expr) + tri = expr_calc_value(sym->rev_dep.expr); + if (tri == mod && sym_get_type(sym) == S_BOOLEAN) + tri = yes; + if (sym->rev_dep.tri != tri) { + sym->rev_dep.tri = tri; + sym_set_changed(sym); + } +} + +static struct symbol *sym_calc_choice(struct symbol *sym) +{ + struct symbol *def_sym; + struct property *prop; + struct expr *e; + + /* is the user choice visible? */ + def_sym = sym->user.val; + if (def_sym) { + sym_calc_visibility(def_sym); + if (def_sym->visible != no) + return def_sym; + } + + /* any of the defaults visible? */ + for_all_defaults(sym, prop) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + if (prop->visible.tri == no) + continue; + def_sym = prop_get_symbol(prop); + sym_calc_visibility(def_sym); + if (def_sym->visible != no) + return def_sym; + } + + /* just get the first visible value */ + prop = sym_get_choice_prop(sym); + for (e = prop->expr; e; e = e->left.expr) { + def_sym = e->right.sym; + sym_calc_visibility(def_sym); + if (def_sym->visible != no) + return def_sym; + } + + /* no choice? reset tristate value */ + sym->curr.tri = no; + return NULL; +} + +void sym_calc_value(struct symbol *sym) +{ + struct symbol_value newval, oldval; + struct property *prop; + struct expr *e; + + if (!sym) + return; + + if (sym->flags & SYMBOL_VALID) + return; + sym->flags |= SYMBOL_VALID; + + oldval = sym->curr; + + switch (sym->type) { + case S_INT: + case S_HEX: + case S_STRING: + newval = symbol_empty.curr; + break; + case S_BOOLEAN: + case S_TRISTATE: + newval = symbol_no.curr; + break; + default: + sym->curr.val = sym->name; + sym->curr.tri = no; + return; + } + if (!sym_is_choice_value(sym)) + sym->flags &= ~SYMBOL_WRITE; + + sym_calc_visibility(sym); + + /* set default if recursively called */ + sym->curr = newval; + + switch (sym_get_type(sym)) { + case S_BOOLEAN: + case S_TRISTATE: + if (sym_is_choice_value(sym) && sym->visible == yes) { + prop = sym_get_choice_prop(sym); + newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no; + } else if (E_OR(sym->visible, sym->rev_dep.tri) != no) { + sym->flags |= SYMBOL_WRITE; + if (sym_has_value(sym)) + newval.tri = sym->user.tri; + else if (!sym_is_choice(sym)) { + prop = sym_get_default_prop(sym); + if (prop) + newval.tri = expr_calc_value(prop->expr); + } + newval.tri = E_OR(E_AND(newval.tri, sym->visible), sym->rev_dep.tri); + } else if (!sym_is_choice(sym)) { + prop = sym_get_default_prop(sym); + if (prop) { + sym->flags |= SYMBOL_WRITE; + newval.tri = expr_calc_value(prop->expr); + } + } + if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN) + newval.tri = yes; + break; + case S_STRING: + case S_HEX: + case S_INT: + if (sym->visible != no) { + sym->flags |= SYMBOL_WRITE; + if (sym_has_value(sym)) { + newval.val = sym->user.val; + break; + } + } + prop = sym_get_default_prop(sym); + if (prop) { + struct symbol *ds = prop_get_symbol(prop); + if (ds) { + sym->flags |= SYMBOL_WRITE; + sym_calc_value(ds); + newval.val = ds->curr.val; + } + } + break; + default: + ; + } + + sym->curr = newval; + if (sym_is_choice(sym) && newval.tri == yes) + sym->curr.val = sym_calc_choice(sym); + + if (memcmp(&oldval, &sym->curr, sizeof(oldval))) + sym_set_changed(sym); + if (modules_sym == sym) + modules_val = modules_sym->curr.tri; + + if (sym_is_choice(sym)) { + int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE); + prop = sym_get_choice_prop(sym); + for (e = prop->expr; e; e = e->left.expr) { + e->right.sym->flags |= flags; + if (flags & SYMBOL_CHANGED) + sym_set_changed(e->right.sym); + } + } +} + +void sym_clear_all_valid(void) +{ + struct symbol *sym; + int i; + + for_all_symbols(i, sym) + sym->flags &= ~SYMBOL_VALID; + sym_change_count++; + if (modules_sym) + sym_calc_value(modules_sym); +} + +void sym_set_changed(struct symbol *sym) +{ + struct property *prop; + + sym->flags |= SYMBOL_CHANGED; + for (prop = sym->prop; prop; prop = prop->next) { + if (prop->menu) + prop->menu->flags |= MENU_CHANGED; + } +} + +void sym_set_all_changed(void) +{ + struct symbol *sym; + int i; + + for_all_symbols(i, sym) + sym_set_changed(sym); +} + +bool sym_tristate_within_range(struct symbol *sym, tristate val) +{ + int type = sym_get_type(sym); + + if (sym->visible == no) + return false; + + if (type != S_BOOLEAN && type != S_TRISTATE) + return false; + + if (type == S_BOOLEAN && val == mod) + return false; + if (sym->visible <= sym->rev_dep.tri) + return false; + if (sym_is_choice_value(sym) && sym->visible == yes) + return val == yes; + return val >= sym->rev_dep.tri && val <= sym->visible; +} + +bool sym_set_tristate_value(struct symbol *sym, tristate val) +{ + tristate oldval = sym_get_tristate_value(sym); + + if (oldval != val && !sym_tristate_within_range(sym, val)) + return false; + + if (sym->flags & SYMBOL_NEW) { + sym->flags &= ~SYMBOL_NEW; + sym_set_changed(sym); + } + if (sym_is_choice_value(sym) && val == yes) { + struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); + + cs->user.val = sym; + cs->flags &= ~SYMBOL_NEW; + } + + sym->user.tri = val; + if (oldval != val) { + sym_clear_all_valid(); + if (sym == modules_sym) + sym_set_all_changed(); + } + + return true; +} + +tristate sym_toggle_tristate_value(struct symbol *sym) +{ + tristate oldval, newval; + + oldval = newval = sym_get_tristate_value(sym); + do { + switch (newval) { + case no: + newval = mod; + break; + case mod: + newval = yes; + break; + case yes: + newval = no; + break; + } + if (sym_set_tristate_value(sym, newval)) + break; + } while (oldval != newval); + return newval; +} + +bool sym_string_valid(struct symbol *sym, const char *str) +{ + char ch; + + switch (sym->type) { + case S_STRING: + return true; + case S_INT: + ch = *str++; + if (ch == '-') + ch = *str++; + if (!isdigit(ch)) + return false; + if (ch == '0' && *str != 0) + return false; + while ((ch = *str++)) { + if (!isdigit(ch)) + return false; + } + return true; + case S_HEX: + if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) + str += 2; + ch = *str++; + do { + if (!isxdigit(ch)) + return false; + } while ((ch = *str++)); + return true; + case S_BOOLEAN: + case S_TRISTATE: + switch (str[0]) { + case 'y': case 'Y': + case 'm': case 'M': + case 'n': case 'N': + return true; + } + return false; + default: + return false; + } +} + +bool sym_string_within_range(struct symbol *sym, const char *str) +{ + struct property *prop; + int val; + + switch (sym->type) { + case S_STRING: + return sym_string_valid(sym, str); + case S_INT: + if (!sym_string_valid(sym, str)) + return false; + prop = sym_get_range_prop(sym); + if (!prop) + return true; + val = strtol(str, NULL, 10); + return val >= strtol(prop->expr->left.sym->name, NULL, 10) && + val <= strtol(prop->expr->right.sym->name, NULL, 10); + case S_HEX: + if (!sym_string_valid(sym, str)) + return false; + prop = sym_get_range_prop(sym); + if (!prop) + return true; + val = strtol(str, NULL, 16); + return val >= strtol(prop->expr->left.sym->name, NULL, 16) && + val <= strtol(prop->expr->right.sym->name, NULL, 16); + case S_BOOLEAN: + case S_TRISTATE: + switch (str[0]) { + case 'y': case 'Y': + return sym_tristate_within_range(sym, yes); + case 'm': case 'M': + return sym_tristate_within_range(sym, mod); + case 'n': case 'N': + return sym_tristate_within_range(sym, no); + } + return false; + default: + return false; + } +} + +bool sym_set_string_value(struct symbol *sym, const char *newval) +{ + const char *oldval; + char *val; + int size; + + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + switch (newval[0]) { + case 'y': case 'Y': + return sym_set_tristate_value(sym, yes); + case 'm': case 'M': + return sym_set_tristate_value(sym, mod); + case 'n': case 'N': + return sym_set_tristate_value(sym, no); + } + return false; + default: + ; + } + + if (!sym_string_within_range(sym, newval)) + return false; + + if (sym->flags & SYMBOL_NEW) { + sym->flags &= ~SYMBOL_NEW; + sym_set_changed(sym); + } + + oldval = sym->user.val; + size = strlen(newval) + 1; + if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) { + size += 2; + sym->user.val = val = malloc(size); + *val++ = '0'; + *val++ = 'x'; + } else if (!oldval || strcmp(oldval, newval)) + sym->user.val = val = malloc(size); + else + return true; + + strcpy(val, newval); + free((void *)oldval); + sym_clear_all_valid(); + + return true; +} + +const char *sym_get_string_value(struct symbol *sym) +{ + tristate val; + + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + val = sym_get_tristate_value(sym); + switch (val) { + case no: + return "n"; + case mod: + return "m"; + case yes: + return "y"; + } + break; + default: + ; + } + return (const char *)sym->curr.val; +} + +bool sym_is_changable(struct symbol *sym) +{ + return sym->visible > sym->rev_dep.tri; +} + +struct symbol *sym_lookup(const char *name, int isconst) +{ + struct symbol *symbol; + const char *ptr; + char *new_name; + int hash = 0; + + if (name) { + if (name[0] && !name[1]) { + switch (name[0]) { + case 'y': return &symbol_yes; + case 'm': return &symbol_mod; + case 'n': return &symbol_no; + } + } + for (ptr = name; *ptr; ptr++) + hash += *ptr; + hash &= 0xff; + + for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { + if (!strcmp(symbol->name, name)) { + if ((isconst && symbol->flags & SYMBOL_CONST) || + (!isconst && !(symbol->flags & SYMBOL_CONST))) + return symbol; + } + } + new_name = strdup(name); + } else { + new_name = NULL; + hash = 256; + } + + symbol = malloc(sizeof(*symbol)); + memset(symbol, 0, sizeof(*symbol)); + symbol->name = new_name; + symbol->type = S_UNKNOWN; + symbol->flags = SYMBOL_NEW; + if (isconst) + symbol->flags |= SYMBOL_CONST; + + symbol->next = symbol_hash[hash]; + symbol_hash[hash] = symbol; + + return symbol; +} + +struct symbol *sym_find(const char *name) +{ + struct symbol *symbol = NULL; + const char *ptr; + int hash = 0; + + if (!name) + return NULL; + + if (name[0] && !name[1]) { + switch (name[0]) { + case 'y': return &symbol_yes; + case 'm': return &symbol_mod; + case 'n': return &symbol_no; + } + } + for (ptr = name; *ptr; ptr++) + hash += *ptr; + hash &= 0xff; + + for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { + if (!strcmp(symbol->name, name) && + !(symbol->flags & SYMBOL_CONST)) + break; + } + + return symbol; +} + +struct symbol *sym_check_deps(struct symbol *sym); + +static struct symbol *sym_check_expr_deps(struct expr *e) +{ + struct symbol *sym; + + if (!e) + return NULL; + switch (e->type) { + case E_OR: + case E_AND: + sym = sym_check_expr_deps(e->left.expr); + if (sym) + return sym; + return sym_check_expr_deps(e->right.expr); + case E_NOT: + return sym_check_expr_deps(e->left.expr); + case E_EQUAL: + case E_UNEQUAL: + sym = sym_check_deps(e->left.sym); + if (sym) + return sym; + return sym_check_deps(e->right.sym); + case E_SYMBOL: + return sym_check_deps(e->left.sym); + default: + break; + } + printf("Oops! How to check %d?\n", e->type); + return NULL; +} + +struct symbol *sym_check_deps(struct symbol *sym) +{ + struct symbol *sym2; + struct property *prop; + + if (sym->flags & SYMBOL_CHECK_DONE) + return NULL; + if (sym->flags & SYMBOL_CHECK) { + printf("Warning! Found recursive dependency: %s", sym->name); + return sym; + } + + sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED); + sym2 = sym_check_expr_deps(sym->rev_dep.expr); + if (sym2) + goto out; + + for (prop = sym->prop; prop; prop = prop->next) { + if (prop->type == P_CHOICE || prop->type == P_SELECT) + continue; + sym2 = sym_check_expr_deps(prop->visible.expr); + if (sym2) + goto out; + if (prop->type != P_DEFAULT || sym_is_choice(sym)) + continue; + sym2 = sym_check_expr_deps(prop->expr); + if (sym2) + goto out; + } +out: + if (sym2) + printf(" %s", sym->name); + sym->flags &= ~SYMBOL_CHECK; + return sym2; +} + +struct property *prop_alloc(enum prop_type type, struct symbol *sym) +{ + struct property *prop; + struct property **propp; + + prop = malloc(sizeof(*prop)); + memset(prop, 0, sizeof(*prop)); + prop->type = type; + prop->sym = sym; + prop->file = current_file; + prop->lineno = zconf_lineno(); + + /* append property to the prop list of symbol */ + if (sym) { + for (propp = &sym->prop; *propp; propp = &(*propp)->next) + ; + *propp = prop; + } + + return prop; +} + +struct symbol *prop_get_symbol(struct property *prop) +{ + if (prop->expr && (prop->expr->type == E_SYMBOL || + prop->expr->type == E_CHOICE)) + return prop->expr->left.sym; + return NULL; +} + +const char *prop_get_type_name(enum prop_type type) +{ + switch (type) { + case P_PROMPT: + return "prompt"; + case P_COMMENT: + return "comment"; + case P_MENU: + return "menu"; + case P_DEFAULT: + return "default"; + case P_CHOICE: + return "choice"; + case P_SELECT: + return "select"; + case P_RANGE: + return "range"; + case P_UNKNOWN: + break; + } + return "unknown"; +} diff --git a/openwrt/package/config/textbox.c b/openwrt/package/config/textbox.c new file mode 100644 index 0000000000..a5a460b5cc --- /dev/null +++ b/openwrt/package/config/textbox.c @@ -0,0 +1,556 @@ +/* + * textbox.c -- implements the text box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program 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 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +static void back_lines (int n); +static void print_page (WINDOW * win, int height, int width); +static void print_line (WINDOW * win, int row, int width); +static char *get_line (void); +static void print_position (WINDOW * win, int height, int width); + +static int hscroll, fd, file_size, bytes_read; +static int begin_reached = 1, end_reached, page_length; +static char *buf, *page; + +/* + * Display text from a file in a dialog box. + */ +int +dialog_textbox (const char *title, const char *file, int height, int width) +{ + int i, x, y, cur_x, cur_y, fpos, key = 0; + int passed_end; + char search_term[MAX_LEN + 1]; + WINDOW *dialog, *text; + + search_term[0] = '\0'; /* no search term entered yet */ + + /* Open input file for reading */ + if ((fd = open (file, O_RDONLY)) == -1) { + endwin (); + fprintf (stderr, + "\nCan't open input file in dialog_textbox().\n"); + exit (-1); + } + /* Get file size. Actually, 'file_size' is the real file size - 1, + since it's only the last byte offset from the beginning */ + if ((file_size = lseek (fd, 0, SEEK_END)) == -1) { + endwin (); + fprintf (stderr, "\nError getting file size in dialog_textbox().\n"); + exit (-1); + } + /* Restore file pointer to beginning of file after getting file size */ + if (lseek (fd, 0, SEEK_SET) == -1) { + endwin (); + fprintf (stderr, "\nError moving file pointer in dialog_textbox().\n"); + exit (-1); + } + /* Allocate space for read buffer */ + if ((buf = malloc (BUF_SIZE + 1)) == NULL) { + endwin (); + fprintf (stderr, "\nCan't allocate memory in dialog_textbox().\n"); + exit (-1); + } + if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { + endwin (); + fprintf (stderr, "\nError reading file in dialog_textbox().\n"); + exit (-1); + } + buf[bytes_read] = '\0'; /* mark end of valid data */ + page = buf; /* page is pointer to start of page to be displayed */ + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + + draw_shadow (stdscr, y, x, height, width); + + dialog = newwin (height, width, y, x); + keypad (dialog, TRUE); + + /* Create window for text region, used for scrolling text */ + text = subwin (dialog, height - 4, width - 2, y + 1, x + 1); + wattrset (text, dialog_attr); + wbkgdset (text, dialog_attr & A_COLOR); + + keypad (text, TRUE); + + /* register the new window, along with its borders */ + draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); + + wattrset (dialog, border_attr); + mvwaddch (dialog, height-3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch (dialog, ACS_HLINE); + wattrset (dialog, dialog_attr); + wbkgdset (dialog, dialog_attr & A_COLOR); + waddch (dialog, ACS_RTEE); + + if (title != NULL && strlen(title) >= width-2 ) { + /* truncate long title -- mec */ + char * title2 = malloc(width-2+1); + memcpy( title2, title, width-2 ); + title2[width-2] = '\0'; + title = title2; + } + + if (title != NULL) { + wattrset (dialog, title_attr); + mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); + waddstr (dialog, (char *)title); + waddch (dialog, ' '); + } + print_button (dialog, " Exit ", height - 2, width / 2 - 4, TRUE); + wnoutrefresh (dialog); + getyx (dialog, cur_y, cur_x); /* Save cursor position */ + + /* Print first page of text */ + attr_clear (text, height - 4, width - 2, dialog_attr); + print_page (text, height - 4, width - 2); + print_position (dialog, height, width); + wmove (dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh (dialog); + + while ((key != ESC) && (key != '\n')) { + key = wgetch (dialog); + switch (key) { + case 'E': /* Exit */ + case 'e': + case 'X': + case 'x': + delwin (dialog); + free (buf); + close (fd); + return 0; + case 'g': /* First page */ + case KEY_HOME: + if (!begin_reached) { + begin_reached = 1; + /* First page not in buffer? */ + if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { + endwin (); + fprintf (stderr, + "\nError moving file pointer in dialog_textbox().\n"); + exit (-1); + } + if (fpos > bytes_read) { /* Yes, we have to read it in */ + if (lseek (fd, 0, SEEK_SET) == -1) { + endwin (); + fprintf (stderr, "\nError moving file pointer in " + "dialog_textbox().\n"); + exit (-1); + } + if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { + endwin (); + fprintf (stderr, + "\nError reading file in dialog_textbox().\n"); + exit (-1); + } + buf[bytes_read] = '\0'; + } + page = buf; + print_page (text, height - 4, width - 2); + print_position (dialog, height, width); + wmove (dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh (dialog); + } + break; + case 'G': /* Last page */ + case KEY_END: + + end_reached = 1; + /* Last page not in buffer? */ + if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { + endwin (); + fprintf (stderr, + "\nError moving file pointer in dialog_textbox().\n"); + exit (-1); + } + if (fpos < file_size) { /* Yes, we have to read it in */ + if (lseek (fd, -BUF_SIZE, SEEK_END) == -1) { + endwin (); + fprintf (stderr, + "\nError moving file pointer in dialog_textbox().\n"); + exit (-1); + } + if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { + endwin (); + fprintf (stderr, + "\nError reading file in dialog_textbox().\n"); + exit (-1); + } + buf[bytes_read] = '\0'; + } + page = buf + bytes_read; + back_lines (height - 4); + print_page (text, height - 4, width - 2); + print_position (dialog, height, width); + wmove (dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh (dialog); + break; + case 'K': /* Previous line */ + case 'k': + case KEY_UP: + if (!begin_reached) { + back_lines (page_length + 1); + + /* We don't call print_page() here but use scrolling to ensure + faster screen update. However, 'end_reached' and + 'page_length' should still be updated, and 'page' should + point to start of next page. This is done by calling + get_line() in the following 'for' loop. */ + scrollok (text, TRUE); + wscrl (text, -1); /* Scroll text region down one line */ + scrollok (text, FALSE); + page_length = 0; + passed_end = 0; + for (i = 0; i < height - 4; i++) { + if (!i) { + /* print first line of page */ + print_line (text, 0, width - 2); + wnoutrefresh (text); + } else + /* Called to update 'end_reached' and 'page' */ + get_line (); + if (!passed_end) + page_length++; + if (end_reached && !passed_end) + passed_end = 1; + } + + print_position (dialog, height, width); + wmove (dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh (dialog); + } + break; + case 'B': /* Previous page */ + case 'b': + case KEY_PPAGE: + if (begin_reached) + break; + back_lines (page_length + height - 4); + print_page (text, height - 4, width - 2); + print_position (dialog, height, width); + wmove (dialog, cur_y, cur_x); + wrefresh (dialog); + break; + case 'J': /* Next line */ + case 'j': + case KEY_DOWN: + if (!end_reached) { + begin_reached = 0; + scrollok (text, TRUE); + scroll (text); /* Scroll text region up one line */ + scrollok (text, FALSE); + print_line (text, height - 5, width - 2); + wnoutrefresh (text); + print_position (dialog, height, width); + wmove (dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh (dialog); + } + break; + case KEY_NPAGE: /* Next page */ + case ' ': + if (end_reached) + break; + + begin_reached = 0; + print_page (text, height - 4, width - 2); + print_position (dialog, height, width); + wmove (dialog, cur_y, cur_x); + wrefresh (dialog); + break; + case '0': /* Beginning of line */ + case 'H': /* Scroll left */ + case 'h': + case KEY_LEFT: + if (hscroll <= 0) + break; + + if (key == '0') + hscroll = 0; + else + hscroll--; + /* Reprint current page to scroll horizontally */ + back_lines (page_length); + print_page (text, height - 4, width - 2); + wmove (dialog, cur_y, cur_x); + wrefresh (dialog); + break; + case 'L': /* Scroll right */ + case 'l': + case KEY_RIGHT: + if (hscroll >= MAX_LEN) + break; + hscroll++; + /* Reprint current page to scroll horizontally */ + back_lines (page_length); + print_page (text, height - 4, width - 2); + wmove (dialog, cur_y, cur_x); + wrefresh (dialog); + break; + case ESC: + break; + } + } + + delwin (dialog); + free (buf); + close (fd); + return 1; /* ESC pressed */ +} + +/* + * Go back 'n' lines in text file. Called by dialog_textbox(). + * 'page' will be updated to point to the desired line in 'buf'. + */ +static void +back_lines (int n) +{ + int i, fpos; + + begin_reached = 0; + /* We have to distinguish between end_reached and !end_reached + since at end of file, the line is not ended by a '\n'. + The code inside 'if' basically does a '--page' to move one + character backward so as to skip '\n' of the previous line */ + if (!end_reached) { + /* Either beginning of buffer or beginning of file reached? */ + if (page == buf) { + if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { + endwin (); + fprintf (stderr, "\nError moving file pointer in " + "back_lines().\n"); + exit (-1); + } + if (fpos > bytes_read) { /* Not beginning of file yet */ + /* We've reached beginning of buffer, but not beginning of + file yet, so read previous part of file into buffer. + Note that we only move backward for BUF_SIZE/2 bytes, + but not BUF_SIZE bytes to avoid re-reading again in + print_page() later */ + /* Really possible to move backward BUF_SIZE/2 bytes? */ + if (fpos < BUF_SIZE / 2 + bytes_read) { + /* No, move less then */ + if (lseek (fd, 0, SEEK_SET) == -1) { + endwin (); + fprintf (stderr, "\nError moving file pointer in " + "back_lines().\n"); + exit (-1); + } + page = buf + fpos - bytes_read; + } else { /* Move backward BUF_SIZE/2 bytes */ + if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), SEEK_CUR) + == -1) { + endwin (); + fprintf (stderr, "\nError moving file pointer " + "in back_lines().\n"); + exit (-1); + } + page = buf + BUF_SIZE / 2; + } + if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { + endwin (); + fprintf (stderr, "\nError reading file in back_lines().\n"); + exit (-1); + } + buf[bytes_read] = '\0'; + } else { /* Beginning of file reached */ + begin_reached = 1; + return; + } + } + if (*(--page) != '\n') { /* '--page' here */ + /* Something's wrong... */ + endwin (); + fprintf (stderr, "\nInternal error in back_lines().\n"); + exit (-1); + } + } + /* Go back 'n' lines */ + for (i = 0; i < n; i++) + do { + if (page == buf) { + if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { + endwin (); + fprintf (stderr, + "\nError moving file pointer in back_lines().\n"); + exit (-1); + } + if (fpos > bytes_read) { + /* Really possible to move backward BUF_SIZE/2 bytes? */ + if (fpos < BUF_SIZE / 2 + bytes_read) { + /* No, move less then */ + if (lseek (fd, 0, SEEK_SET) == -1) { + endwin (); + fprintf (stderr, "\nError moving file pointer " + "in back_lines().\n"); + exit (-1); + } + page = buf + fpos - bytes_read; + } else { /* Move backward BUF_SIZE/2 bytes */ + if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), + SEEK_CUR) == -1) { + endwin (); + fprintf (stderr, "\nError moving file pointer" + " in back_lines().\n"); + exit (-1); + } + page = buf + BUF_SIZE / 2; + } + if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { + endwin (); + fprintf (stderr, "\nError reading file in " + "back_lines().\n"); + exit (-1); + } + buf[bytes_read] = '\0'; + } else { /* Beginning of file reached */ + begin_reached = 1; + return; + } + } + } while (*(--page) != '\n'); + page++; +} + +/* + * Print a new page of text. Called by dialog_textbox(). + */ +static void +print_page (WINDOW * win, int height, int width) +{ + int i, passed_end = 0; + + page_length = 0; + for (i = 0; i < height; i++) { + print_line (win, i, width); + if (!passed_end) + page_length++; + if (end_reached && !passed_end) + passed_end = 1; + } + wnoutrefresh (win); +} + +/* + * Print a new line of text. Called by dialog_textbox() and print_page(). + */ +static void +print_line (WINDOW * win, int row, int width) +{ + int y, x; + char *line; + + line = get_line (); + line += MIN (strlen (line), hscroll); /* Scroll horizontally */ + wmove (win, row, 0); /* move cursor to correct line */ + waddch (win, ' '); + waddnstr (win, line, MIN (strlen (line), width - 2)); + + getyx (win, y, x); + /* Clear 'residue' of previous line */ +#if OLD_NCURSES + { + int i; + for (i = 0; i < width - x; i++) + waddch (win, ' '); + } +#else + wclrtoeol(win); +#endif +} + +/* + * Return current line of text. Called by dialog_textbox() and print_line(). + * 'page' should point to start of current line before calling, and will be + * updated to point to start of next line. + */ +static char * +get_line (void) +{ + int i = 0, fpos; + static char line[MAX_LEN + 1]; + + end_reached = 0; + while (*page != '\n') { + if (*page == '\0') { + /* Either end of file or end of buffer reached */ + if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { + endwin (); + fprintf (stderr, "\nError moving file pointer in " + "get_line().\n"); + exit (-1); + } + if (fpos < file_size) { /* Not end of file yet */ + /* We've reached end of buffer, but not end of file yet, + so read next part of file into buffer */ + if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) { + endwin (); + fprintf (stderr, "\nError reading file in get_line().\n"); + exit (-1); + } + buf[bytes_read] = '\0'; + page = buf; + } else { + if (!end_reached) + end_reached = 1; + break; + } + } else if (i < MAX_LEN) + line[i++] = *(page++); + else { + /* Truncate lines longer than MAX_LEN characters */ + if (i == MAX_LEN) + line[i++] = '\0'; + page++; + } + } + if (i <= MAX_LEN) + line[i] = '\0'; + if (!end_reached) + page++; /* move pass '\n' */ + + return line; +} + +/* + * Print current position + */ +static void +print_position (WINDOW * win, int height, int width) +{ + int fpos, percent; + + if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) { + endwin (); + fprintf (stderr, "\nError moving file pointer in print_position().\n"); + exit (-1); + } + wattrset (win, position_indicator_attr); + wbkgdset (win, position_indicator_attr & A_COLOR); + percent = !file_size ? + 100 : ((fpos - bytes_read + page - buf) * 100) / file_size; + wmove (win, height - 3, width - 9); + wprintw (win, "(%3d%%)", percent); +} diff --git a/openwrt/package/config/util.c b/openwrt/package/config/util.c new file mode 100644 index 0000000000..0a2f827570 --- /dev/null +++ b/openwrt/package/config/util.c @@ -0,0 +1,375 @@ +/* + * util.c + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program 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 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + + +/* use colors by default? */ +bool use_colors = 1; + +char *backtitle = NULL; + +const char *dialog_result; + +/* + * Attribute values, default is for mono display + */ +chtype attributes[] = +{ + A_NORMAL, /* screen_attr */ + A_NORMAL, /* shadow_attr */ + A_NORMAL, /* dialog_attr */ + A_BOLD, /* title_attr */ + A_NORMAL, /* border_attr */ + A_REVERSE, /* button_active_attr */ + A_DIM, /* button_inactive_attr */ + A_REVERSE, /* button_key_active_attr */ + A_BOLD, /* button_key_inactive_attr */ + A_REVERSE, /* button_label_active_attr */ + A_NORMAL, /* button_label_inactive_attr */ + A_NORMAL, /* inputbox_attr */ + A_NORMAL, /* inputbox_border_attr */ + A_NORMAL, /* searchbox_attr */ + A_BOLD, /* searchbox_title_attr */ + A_NORMAL, /* searchbox_border_attr */ + A_BOLD, /* position_indicator_attr */ + A_NORMAL, /* menubox_attr */ + A_NORMAL, /* menubox_border_attr */ + A_NORMAL, /* item_attr */ + A_REVERSE, /* item_selected_attr */ + A_BOLD, /* tag_attr */ + A_REVERSE, /* tag_selected_attr */ + A_BOLD, /* tag_key_attr */ + A_REVERSE, /* tag_key_selected_attr */ + A_BOLD, /* check_attr */ + A_REVERSE, /* check_selected_attr */ + A_BOLD, /* uarrow_attr */ + A_BOLD /* darrow_attr */ +}; + + +#include "colors.h" + +/* + * Table of color values + */ +int color_table[][3] = +{ + {SCREEN_FG, SCREEN_BG, SCREEN_HL}, + {SHADOW_FG, SHADOW_BG, SHADOW_HL}, + {DIALOG_FG, DIALOG_BG, DIALOG_HL}, + {TITLE_FG, TITLE_BG, TITLE_HL}, + {BORDER_FG, BORDER_BG, BORDER_HL}, + {BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL}, + {BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL}, + {BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL}, + {BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG, BUTTON_KEY_INACTIVE_HL}, + {BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG, BUTTON_LABEL_ACTIVE_HL}, + {BUTTON_LABEL_INACTIVE_FG, BUTTON_LABEL_INACTIVE_BG, + BUTTON_LABEL_INACTIVE_HL}, + {INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL}, + {INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL}, + {SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL}, + {SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL}, + {SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL}, + {POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL}, + {MENUBOX_FG, MENUBOX_BG, MENUBOX_HL}, + {MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL}, + {ITEM_FG, ITEM_BG, ITEM_HL}, + {ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL}, + {TAG_FG, TAG_BG, TAG_HL}, + {TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL}, + {TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL}, + {TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL}, + {CHECK_FG, CHECK_BG, CHECK_HL}, + {CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL}, + {UARROW_FG, UARROW_BG, UARROW_HL}, + {DARROW_FG, DARROW_BG, DARROW_HL}, +}; /* color_table */ + +/* + * Set window to attribute 'attr' + */ +void +attr_clear (WINDOW * win, int height, int width, chtype attr) +{ + int i, j; + + wattrset (win, attr); + for (i = 0; i < height; i++) { + wmove (win, i, 0); + for (j = 0; j < width; j++) + waddch (win, ' '); + } + touchwin (win); +} + +void dialog_clear (void) +{ + attr_clear (stdscr, LINES, COLS, screen_attr); + /* Display background title if it exists ... - SLH */ + if (backtitle != NULL) { + int i; + + wattrset (stdscr, screen_attr); + mvwaddstr (stdscr, 0, 1, (char *)backtitle); + wmove (stdscr, 1, 1); + for (i = 1; i < COLS - 1; i++) + waddch (stdscr, ACS_HLINE); + } + wnoutrefresh (stdscr); +} + +/* + * Do some initialization for dialog + */ +void +init_dialog (void) +{ + initscr (); /* Init curses */ + keypad (stdscr, TRUE); + cbreak (); + noecho (); + + + if (use_colors) /* Set up colors */ + color_setup (); + + + dialog_clear (); +} + +/* + * Setup for color display + */ +void +color_setup (void) +{ + int i; + + if (has_colors ()) { /* Terminal supports color? */ + start_color (); + + /* Initialize color pairs */ + for (i = 0; i < ATTRIBUTE_COUNT; i++) + init_pair (i + 1, color_table[i][0], color_table[i][1]); + + /* Setup color attributes */ + for (i = 0; i < ATTRIBUTE_COUNT; i++) + attributes[i] = C_ATTR (color_table[i][2], i + 1); + } +} + +/* + * End using dialog functions. + */ +void +end_dialog (void) +{ + endwin (); +} + + +/* + * Print a string of text in a window, automatically wrap around to the + * next line if the string is too long to fit on one line. Newline + * characters '\n' are replaced by spaces. We start on a new line + * if there is no room for at least 4 nonblanks following a double-space. + */ +void +print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x) +{ + int newl, cur_x, cur_y; + int i, prompt_len, room, wlen; + char tempstr[MAX_LEN + 1], *word, *sp, *sp2; + + strcpy (tempstr, prompt); + + prompt_len = strlen(tempstr); + + /* + * Remove newlines + */ + for(i=0; i<prompt_len; i++) { + if(tempstr[i] == '\n') tempstr[i] = ' '; + } + + if (prompt_len <= width - x * 2) { /* If prompt is short */ + wmove (win, y, (width - prompt_len) / 2); + waddstr (win, tempstr); + } else { + cur_x = x; + cur_y = y; + newl = 1; + word = tempstr; + while (word && *word) { + sp = index(word, ' '); + if (sp) + *sp++ = 0; + + /* Wrap to next line if either the word does not fit, + or it is the first word of a new sentence, and it is + short, and the next word does not fit. */ + room = width - cur_x; + wlen = strlen(word); + if (wlen > room || + (newl && wlen < 4 && sp && wlen+1+strlen(sp) > room + && (!(sp2 = index(sp, ' ')) || wlen+1+(sp2-sp) > room))) { + cur_y++; + cur_x = x; + } + wmove (win, cur_y, cur_x); + waddstr (win, word); + getyx (win, cur_y, cur_x); + cur_x++; + if (sp && *sp == ' ') { + cur_x++; /* double space */ + while (*++sp == ' '); + newl = 1; + } else + newl = 0; + word = sp; + } + } +} + +/* + * Print a button + */ +void +print_button (WINDOW * win, const char *label, int y, int x, int selected) +{ + int i, temp; + + wmove (win, y, x); + wattrset (win, selected ? button_active_attr : button_inactive_attr); + waddstr (win, "<"); + temp = strspn (label, " "); + label += temp; + wattrset (win, selected ? button_label_active_attr + : button_label_inactive_attr); + for (i = 0; i < temp; i++) + waddch (win, ' '); + wattrset (win, selected ? button_key_active_attr + : button_key_inactive_attr); + waddch (win, label[0]); + wattrset (win, selected ? button_label_active_attr + : button_label_inactive_attr); + waddstr (win, (char *)label + 1); + wattrset (win, selected ? button_active_attr : button_inactive_attr); + waddstr (win, ">"); + wmove (win, y, x + temp + 1); +} + +/* + * Draw a rectangular box with line drawing characters + */ +void +draw_box (WINDOW * win, int y, int x, int height, int width, + chtype box, chtype border) +{ + int i, j; + + wattrset (win, 0); + for (i = 0; i < height; i++) { + wmove (win, y + i, x); + for (j = 0; j < width; j++) + if (!i && !j) + waddch (win, border | ACS_ULCORNER); + else if (i == height - 1 && !j) + waddch (win, border | ACS_LLCORNER); + else if (!i && j == width - 1) + waddch (win, box | ACS_URCORNER); + else if (i == height - 1 && j == width - 1) + waddch (win, box | ACS_LRCORNER); + else if (!i) + waddch (win, border | ACS_HLINE); + else if (i == height - 1) + waddch (win, box | ACS_HLINE); + else if (!j) + waddch (win, border | ACS_VLINE); + else if (j == width - 1) + waddch (win, box | ACS_VLINE); + else + waddch (win, box | ' '); + } +} + +/* + * Draw shadows along the right and bottom edge to give a more 3D look + * to the boxes + */ +void +draw_shadow (WINDOW * win, int y, int x, int height, int width) +{ + int i; + + if (has_colors ()) { /* Whether terminal supports color? */ + wattrset (win, shadow_attr); + wmove (win, y + height, x + 2); + for (i = 0; i < width; i++) + waddch (win, winch (win) & A_CHARTEXT); + for (i = y + 1; i < y + height + 1; i++) { + wmove (win, i, x + width); + waddch (win, winch (win) & A_CHARTEXT); + waddch (win, winch (win) & A_CHARTEXT); + } + wnoutrefresh (win); + } +} + +/* + * Return the position of the first alphabetic character in a string. + */ +int +first_alpha(const char *string, const char *exempt) +{ + int i, in_paren=0, c; + + for (i = 0; i < strlen(string); i++) { + c = tolower(string[i]); + + if (strchr("<[(", c)) ++in_paren; + if (strchr(">])", c) && in_paren > 0) --in_paren; + + if ((! in_paren) && isalpha(c) && + strchr(exempt, c) == 0) + return i; + } + + return 0; +} + +/* + * Get the first selected item in the dialog_list_item list. + */ +struct dialog_list_item * +first_sel_item(int item_no, struct dialog_list_item ** items) +{ + int i; + + for (i = 0; i < item_no; i++) { + if (items[i]->selected) + return items[i]; + } + + return NULL; +} diff --git a/openwrt/package/config/yesno.c b/openwrt/package/config/yesno.c new file mode 100644 index 0000000000..11fcc25f51 --- /dev/null +++ b/openwrt/package/config/yesno.c @@ -0,0 +1,118 @@ +/* + * yesno.c -- implements the yes/no box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program 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 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +/* + * Display termination buttons + */ +static void +print_buttons(WINDOW *dialog, int height, int width, int selected) +{ + int x = width / 2 - 10; + int y = height - 2; + + print_button (dialog, " Yes ", y, x, selected == 0); + print_button (dialog, " No ", y, x + 13, selected == 1); + + wmove(dialog, y, x+1 + 13*selected ); + wrefresh (dialog); +} + +/* + * Display a dialog box with two buttons - Yes and No + */ +int +dialog_yesno (const char *title, const char *prompt, int height, int width) +{ + int i, x, y, key = 0, button = 0; + WINDOW *dialog; + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + draw_shadow (stdscr, y, x, height, width); + + dialog = newwin (height, width, y, x); + keypad (dialog, TRUE); + + draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr); + wattrset (dialog, border_attr); + mvwaddch (dialog, height-3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch (dialog, ACS_HLINE); + wattrset (dialog, dialog_attr); + waddch (dialog, ACS_RTEE); + + if (title != NULL && strlen(title) >= width-2 ) { + /* truncate long title -- mec */ + char * title2 = malloc(width-2+1); + memcpy( title2, title, width-2 ); + title2[width-2] = '\0'; + title = title2; + } + + if (title != NULL) { + wattrset (dialog, title_attr); + mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' '); + waddstr (dialog, (char *)title); + waddch (dialog, ' '); + } + + wattrset (dialog, dialog_attr); + print_autowrap (dialog, prompt, width - 2, 1, 3); + + print_buttons(dialog, height, width, 0); + + while (key != ESC) { + key = wgetch (dialog); + switch (key) { + case 'Y': + case 'y': + delwin (dialog); + return 0; + case 'N': + case 'n': + delwin (dialog); + return 1; + + case TAB: + case KEY_LEFT: + case KEY_RIGHT: + button = ((key == KEY_LEFT ? --button : ++button) < 0) + ? 1 : (button > 1 ? 0 : button); + + print_buttons(dialog, height, width, button); + wrefresh (dialog); + break; + case ' ': + case '\n': + delwin (dialog); + return button; + case ESC: + break; + } + } + + delwin (dialog); + return -1; /* ESC pressed */ +} diff --git a/openwrt/package/config/zconf.l b/openwrt/package/config/zconf.l new file mode 100644 index 0000000000..55517b2877 --- /dev/null +++ b/openwrt/package/config/zconf.l @@ -0,0 +1,366 @@ +%option backup nostdinit noyywrap never-interactive full ecs +%option 8bit backup nodefault perf-report perf-report +%x COMMAND HELP STRING PARAM +%{ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#define LKC_DIRECT_LINK +#include "lkc.h" + +#define START_STRSIZE 16 + +char *text; +static char *text_ptr; +static int text_size, text_asize; + +struct buffer { + struct buffer *parent; + YY_BUFFER_STATE state; +}; + +struct buffer *current_buf; + +static int last_ts, first_ts; + +static void zconf_endhelp(void); +static struct buffer *zconf_endfile(void); + +void new_string(void) +{ + text = malloc(START_STRSIZE); + text_asize = START_STRSIZE; + text_ptr = text; + text_size = 0; + *text_ptr = 0; +} + +void append_string(const char *str, int size) +{ + int new_size = text_size + size + 1; + if (new_size > text_asize) { + text = realloc(text, new_size); + text_asize = new_size; + text_ptr = text + text_size; + } + memcpy(text_ptr, str, size); + text_ptr += size; + text_size += size; + *text_ptr = 0; +} + +void alloc_string(const char *str, int size) +{ + text = malloc(size + 1); + memcpy(text, str, size); + text[size] = 0; +} +%} + +ws [ \n\t] +n [A-Za-z0-9_] + +%% + int str = 0; + int ts, i; + +[ \t]*#.*\n current_file->lineno++; +[ \t]*#.* + +[ \t]*\n current_file->lineno++; return T_EOL; + +[ \t]+ { + BEGIN(COMMAND); +} + +. { + unput(yytext[0]); + BEGIN(COMMAND); +} + + +<COMMAND>{ + "mainmenu" BEGIN(PARAM); return T_MAINMENU; + "menu" BEGIN(PARAM); return T_MENU; + "endmenu" BEGIN(PARAM); return T_ENDMENU; + "source" BEGIN(PARAM); return T_SOURCE; + "choice" BEGIN(PARAM); return T_CHOICE; + "endchoice" BEGIN(PARAM); return T_ENDCHOICE; + "comment" BEGIN(PARAM); return T_COMMENT; + "config" BEGIN(PARAM); return T_CONFIG; + "menuconfig" BEGIN(PARAM); return T_MENUCONFIG; + "help" BEGIN(PARAM); return T_HELP; + "if" BEGIN(PARAM); return T_IF; + "endif" BEGIN(PARAM); return T_ENDIF; + "depends" BEGIN(PARAM); return T_DEPENDS; + "requires" BEGIN(PARAM); return T_REQUIRES; + "optional" BEGIN(PARAM); return T_OPTIONAL; + "default" BEGIN(PARAM); return T_DEFAULT; + "prompt" BEGIN(PARAM); return T_PROMPT; + "tristate" BEGIN(PARAM); return T_TRISTATE; + "def_tristate" BEGIN(PARAM); return T_DEF_TRISTATE; + "bool" BEGIN(PARAM); return T_BOOLEAN; + "boolean" BEGIN(PARAM); return T_BOOLEAN; + "def_bool" BEGIN(PARAM); return T_DEF_BOOLEAN; + "def_boolean" BEGIN(PARAM); return T_DEF_BOOLEAN; + "int" BEGIN(PARAM); return T_INT; + "hex" BEGIN(PARAM); return T_HEX; + "string" BEGIN(PARAM); return T_STRING; + "select" BEGIN(PARAM); return T_SELECT; + "enable" BEGIN(PARAM); return T_SELECT; + "range" BEGIN(PARAM); return T_RANGE; + {n}+ { + alloc_string(yytext, yyleng); + zconflval.string = text; + return T_WORD; + } + . + \n current_file->lineno++; BEGIN(INITIAL); +} + +<PARAM>{ + "&&" return T_AND; + "||" return T_OR; + "(" return T_OPEN_PAREN; + ")" return T_CLOSE_PAREN; + "!" return T_NOT; + "=" return T_EQUAL; + "!=" return T_UNEQUAL; + "if" return T_IF; + "on" return T_ON; + \"|\' { + str = yytext[0]; + new_string(); + BEGIN(STRING); + } + \n BEGIN(INITIAL); current_file->lineno++; return T_EOL; + --- /* ignore */ + ({n}|[-/.])+ { + alloc_string(yytext, yyleng); + zconflval.string = text; + return T_WORD; + } + #.* /* comment */ + \\\n current_file->lineno++; + . + <<EOF>> { + BEGIN(INITIAL); + } +} + +<STRING>{ + [^'"\\\n]+/\n { + append_string(yytext, yyleng); + zconflval.string = text; + return T_WORD_QUOTE; + } + [^'"\\\n]+ { + append_string(yytext, yyleng); + } + \\.?/\n { + append_string(yytext + 1, yyleng - 1); + zconflval.string = text; + return T_WORD_QUOTE; + } + \\.? { + append_string(yytext + 1, yyleng - 1); + } + \'|\" { + if (str == yytext[0]) { + BEGIN(PARAM); + zconflval.string = text; + return T_WORD_QUOTE; + } else + append_string(yytext, 1); + } + \n { + printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno()); + current_file->lineno++; + BEGIN(INITIAL); + return T_EOL; + } + <<EOF>> { + BEGIN(INITIAL); + } +} + +<HELP>{ + [ \t]+ { + ts = 0; + for (i = 0; i < yyleng; i++) { + if (yytext[i] == '\t') + ts = (ts & ~7) + 8; + else + ts++; + } + last_ts = ts; + if (first_ts) { + if (ts < first_ts) { + zconf_endhelp(); + return T_HELPTEXT; + } + ts -= first_ts; + while (ts > 8) { + append_string(" ", 8); + ts -= 8; + } + append_string(" ", ts); + } + } + [ \t]*\n/[^ \t\n] { + current_file->lineno++; + zconf_endhelp(); + return T_HELPTEXT; + } + [ \t]*\n { + current_file->lineno++; + append_string("\n", 1); + } + [^ \t\n].* { + append_string(yytext, yyleng); + if (!first_ts) + first_ts = last_ts; + } + <<EOF>> { + zconf_endhelp(); + return T_HELPTEXT; + } +} + +<<EOF>> { + if (current_buf) { + zconf_endfile(); + return T_EOF; + } + fclose(yyin); + yyterminate(); +} + +%% +void zconf_starthelp(void) +{ + new_string(); + last_ts = first_ts = 0; + BEGIN(HELP); +} + +static void zconf_endhelp(void) +{ + zconflval.string = text; + BEGIN(INITIAL); +} + + +/* + * Try to open specified file with following names: + * ./name + * $(srctree)/name + * The latter is used when srctree is separate from objtree + * when compiling the kernel. + * Return NULL if file is not found. + */ +FILE *zconf_fopen(const char *name) +{ + char *env, fullname[PATH_MAX+1]; + FILE *f; + + f = fopen(name, "r"); + if (!f && name[0] != '/') { + env = getenv(SRCTREE); + if (env) { + sprintf(fullname, "%s/%s", env, name); + f = fopen(fullname, "r"); + } + } + return f; +} + +void zconf_initscan(const char *name) +{ + yyin = zconf_fopen(name); + if (!yyin) { + printf("can't find file %s\n", name); + exit(1); + } + + current_buf = malloc(sizeof(*current_buf)); + memset(current_buf, 0, sizeof(*current_buf)); + + current_file = file_lookup(name); + current_file->lineno = 1; + current_file->flags = FILE_BUSY; +} + +void zconf_nextfile(const char *name) +{ + struct file *file = file_lookup(name); + struct buffer *buf = malloc(sizeof(*buf)); + memset(buf, 0, sizeof(*buf)); + + current_buf->state = YY_CURRENT_BUFFER; + yyin = zconf_fopen(name); + if (!yyin) { + printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name); + exit(1); + } + yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE)); + buf->parent = current_buf; + current_buf = buf; + + if (file->flags & FILE_BUSY) { + printf("recursive scan (%s)?\n", name); + exit(1); + } + if (file->flags & FILE_SCANNED) { + printf("file %s already scanned?\n", name); + exit(1); + } + file->flags |= FILE_BUSY; + file->lineno = 1; + file->parent = current_file; + current_file = file; +} + +static struct buffer *zconf_endfile(void) +{ + struct buffer *parent; + + current_file->flags |= FILE_SCANNED; + current_file->flags &= ~FILE_BUSY; + current_file = current_file->parent; + + parent = current_buf->parent; + if (parent) { + fclose(yyin); + yy_delete_buffer(YY_CURRENT_BUFFER); + yy_switch_to_buffer(parent->state); + } + free(current_buf); + current_buf = parent; + + return parent; +} + +int zconf_lineno(void) +{ + if (current_buf) + return current_file->lineno - 1; + else + return 0; +} + +char *zconf_curname(void) +{ + if (current_buf) + return current_file->name; + else + return "<none>"; +} diff --git a/openwrt/package/config/zconf.tab.c_shipped b/openwrt/package/config/zconf.tab.c_shipped new file mode 100644 index 0000000000..83dbf9ed57 --- /dev/null +++ b/openwrt/package/config/zconf.tab.c_shipped @@ -0,0 +1,2127 @@ +/* A Bison parser, made by GNU Bison 1.875a. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + + This program 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 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + +/* If NAME_PREFIX is specified substitute the variables and functions + names. */ +#define yyparse zconfparse +#define yylex zconflex +#define yyerror zconferror +#define yylval zconflval +#define yychar zconfchar +#define yydebug zconfdebug +#define yynerrs zconfnerrs + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + T_MAINMENU = 258, + T_MENU = 259, + T_ENDMENU = 260, + T_SOURCE = 261, + T_CHOICE = 262, + T_ENDCHOICE = 263, + T_COMMENT = 264, + T_CONFIG = 265, + T_MENUCONFIG = 266, + T_HELP = 267, + T_HELPTEXT = 268, + T_IF = 269, + T_ENDIF = 270, + T_DEPENDS = 271, + T_REQUIRES = 272, + T_OPTIONAL = 273, + T_PROMPT = 274, + T_DEFAULT = 275, + T_TRISTATE = 276, + T_DEF_TRISTATE = 277, + T_BOOLEAN = 278, + T_DEF_BOOLEAN = 279, + T_STRING = 280, + T_INT = 281, + T_HEX = 282, + T_WORD = 283, + T_WORD_QUOTE = 284, + T_UNEQUAL = 285, + T_EOF = 286, + T_EOL = 287, + T_CLOSE_PAREN = 288, + T_OPEN_PAREN = 289, + T_ON = 290, + T_SELECT = 291, + T_RANGE = 292, + T_OR = 293, + T_AND = 294, + T_EQUAL = 295, + T_NOT = 296 + }; +#endif +#define T_MAINMENU 258 +#define T_MENU 259 +#define T_ENDMENU 260 +#define T_SOURCE 261 +#define T_CHOICE 262 +#define T_ENDCHOICE 263 +#define T_COMMENT 264 +#define T_CONFIG 265 +#define T_MENUCONFIG 266 +#define T_HELP 267 +#define T_HELPTEXT 268 +#define T_IF 269 +#define T_ENDIF 270 +#define T_DEPENDS 271 +#define T_REQUIRES 272 +#define T_OPTIONAL 273 +#define T_PROMPT 274 +#define T_DEFAULT 275 +#define T_TRISTATE 276 +#define T_DEF_TRISTATE 277 +#define T_BOOLEAN 278 +#define T_DEF_BOOLEAN 279 +#define T_STRING 280 +#define T_INT 281 +#define T_HEX 282 +#define T_WORD 283 +#define T_WORD_QUOTE 284 +#define T_UNEQUAL 285 +#define T_EOF 286 +#define T_EOL 287 +#define T_CLOSE_PAREN 288 +#define T_OPEN_PAREN 289 +#define T_ON 290 +#define T_SELECT 291 +#define T_RANGE 292 +#define T_OR 293 +#define T_AND 294 +#define T_EQUAL 295 +#define T_NOT 296 + + + + +/* Copy the first part of user declarations. */ + + +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#include <ctype.h> +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdbool.h> + +#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt) + +#define PRINTD 0x0001 +#define DEBUG_PARSE 0x0002 + +int cdebug = PRINTD; + +extern int zconflex(void); +static void zconfprint(const char *err, ...); +static void zconferror(const char *err); +static bool zconf_endtoken(int token, int starttoken, int endtoken); + +struct symbol *symbol_hash[257]; + +#define YYERROR_VERBOSE + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) + +typedef union YYSTYPE { + int token; + char *string; + struct symbol *symbol; + struct expr *expr; + struct menu *menu; +} YYSTYPE; +/* Line 191 of yacc.c. */ + +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +#define LKC_DIRECT_LINK +#include "lkc.h" + + +/* Line 214 of yacc.c. */ + + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# if YYSTACK_USE_ALLOCA +# define YYSTACK_ALLOC alloca +# else +# ifndef YYSTACK_USE_ALLOCA +# if defined (alloca) || defined (_ALLOCA_H) +# define YYSTACK_ALLOC alloca +# else +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# else +# if defined (__STDC__) || defined (__cplusplus) +# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +# define YYSTACK_ALLOC malloc +# define YYSTACK_FREE free +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + +#endif + +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short yysigned_char; +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 2 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 201 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 42 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 41 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 104 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 182 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 296 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned short yyprhs[] = +{ + 0, 0, 3, 4, 7, 9, 11, 13, 17, 19, + 21, 23, 26, 28, 30, 32, 34, 36, 38, 42, + 45, 49, 52, 53, 56, 59, 62, 65, 69, 74, + 78, 83, 87, 91, 95, 100, 105, 110, 116, 119, + 122, 124, 128, 131, 132, 135, 138, 141, 144, 149, + 153, 157, 160, 165, 166, 169, 173, 175, 179, 182, + 183, 186, 189, 192, 196, 199, 201, 205, 208, 209, + 212, 215, 218, 222, 226, 228, 232, 235, 238, 241, + 242, 245, 248, 253, 257, 261, 262, 265, 267, 269, + 272, 275, 278, 280, 282, 283, 286, 288, 292, 296, + 300, 303, 307, 311, 313 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yysigned_char yyrhs[] = +{ + 43, 0, -1, -1, 43, 44, -1, 45, -1, 55, + -1, 66, -1, 3, 77, 79, -1, 5, -1, 15, + -1, 8, -1, 1, 79, -1, 61, -1, 71, -1, + 47, -1, 49, -1, 69, -1, 79, -1, 10, 28, + 32, -1, 46, 50, -1, 11, 28, 32, -1, 48, + 50, -1, -1, 50, 51, -1, 50, 75, -1, 50, + 73, -1, 50, 32, -1, 21, 76, 32, -1, 22, + 81, 80, 32, -1, 23, 76, 32, -1, 24, 81, + 80, 32, -1, 26, 76, 32, -1, 27, 76, 32, + -1, 25, 76, 32, -1, 19, 77, 80, 32, -1, + 20, 81, 80, 32, -1, 36, 28, 80, 32, -1, + 37, 82, 82, 80, 32, -1, 7, 32, -1, 52, + 56, -1, 78, -1, 53, 58, 54, -1, 53, 58, + -1, -1, 56, 57, -1, 56, 75, -1, 56, 73, + -1, 56, 32, -1, 19, 77, 80, 32, -1, 21, + 76, 32, -1, 23, 76, 32, -1, 18, 32, -1, + 20, 28, 80, 32, -1, -1, 58, 45, -1, 14, + 81, 32, -1, 78, -1, 59, 62, 60, -1, 59, + 62, -1, -1, 62, 45, -1, 62, 66, -1, 62, + 55, -1, 4, 77, 32, -1, 63, 74, -1, 78, + -1, 64, 67, 65, -1, 64, 67, -1, -1, 67, + 45, -1, 67, 66, -1, 67, 55, -1, 67, 1, + 32, -1, 6, 77, 32, -1, 68, -1, 9, 77, + 32, -1, 70, 74, -1, 12, 32, -1, 72, 13, + -1, -1, 74, 75, -1, 74, 32, -1, 16, 35, + 81, 32, -1, 16, 81, 32, -1, 17, 81, 32, + -1, -1, 77, 80, -1, 28, -1, 29, -1, 5, + 79, -1, 8, 79, -1, 15, 79, -1, 32, -1, + 31, -1, -1, 14, 81, -1, 82, -1, 82, 40, + 82, -1, 82, 30, 82, -1, 34, 81, 33, -1, + 41, 81, -1, 81, 38, 81, -1, 81, 39, 81, + -1, 28, -1, 29, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned short yyrline[] = +{ + 0, 94, 94, 95, 98, 99, 100, 101, 102, 103, + 104, 105, 109, 110, 111, 112, 113, 114, 120, 128, + 134, 142, 152, 154, 155, 156, 157, 160, 166, 173, + 179, 186, 192, 198, 204, 210, 216, 222, 230, 239, + 245, 254, 255, 261, 263, 264, 265, 266, 269, 275, + 281, 287, 293, 299, 301, 306, 315, 324, 325, 331, + 333, 334, 335, 340, 347, 353, 362, 363, 369, 371, + 372, 373, 374, 377, 383, 390, 397, 404, 410, 417, + 418, 419, 422, 427, 432, 440, 442, 447, 448, 451, + 452, 453, 457, 457, 459, 460, 463, 464, 465, 466, + 467, 468, 469, 472, 473 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU", + "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG", + "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS", + "T_REQUIRES", "T_OPTIONAL", "T_PROMPT", "T_DEFAULT", "T_TRISTATE", + "T_DEF_TRISTATE", "T_BOOLEAN", "T_DEF_BOOLEAN", "T_STRING", "T_INT", + "T_HEX", "T_WORD", "T_WORD_QUOTE", "T_UNEQUAL", "T_EOF", "T_EOL", + "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_ON", "T_SELECT", "T_RANGE", "T_OR", + "T_AND", "T_EQUAL", "T_NOT", "$accept", "input", "block", + "common_block", "config_entry_start", "config_stmt", + "menuconfig_entry_start", "menuconfig_stmt", "config_option_list", + "config_option", "choice", "choice_entry", "choice_end", "choice_stmt", + "choice_option_list", "choice_option", "choice_block", "if", "if_end", + "if_stmt", "if_block", "menu", "menu_entry", "menu_end", "menu_stmt", + "menu_block", "source", "source_stmt", "comment", "comment_stmt", + "help_start", "help", "depends_list", "depends", "prompt_stmt_opt", + "prompt", "end", "nl_or_eof", "if_expr", "expr", "symbol", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 42, 43, 43, 44, 44, 44, 44, 44, 44, + 44, 44, 45, 45, 45, 45, 45, 45, 46, 47, + 48, 49, 50, 50, 50, 50, 50, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 52, 53, + 54, 55, 55, 56, 56, 56, 56, 56, 57, 57, + 57, 57, 57, 58, 58, 59, 60, 61, 61, 62, + 62, 62, 62, 63, 64, 65, 66, 66, 67, 67, + 67, 67, 67, 68, 69, 70, 71, 72, 73, 74, + 74, 74, 75, 75, 75, 76, 76, 77, 77, 78, + 78, 78, 79, 79, 80, 80, 81, 81, 81, 81, + 81, 81, 81, 82, 82 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 0, 2, 1, 1, 1, 3, 1, 1, + 1, 2, 1, 1, 1, 1, 1, 1, 3, 2, + 3, 2, 0, 2, 2, 2, 2, 3, 4, 3, + 4, 3, 3, 3, 4, 4, 4, 5, 2, 2, + 1, 3, 2, 0, 2, 2, 2, 2, 4, 3, + 3, 2, 4, 0, 2, 3, 1, 3, 2, 0, + 2, 2, 2, 3, 2, 1, 3, 2, 0, 2, + 2, 2, 3, 3, 1, 3, 2, 2, 2, 0, + 2, 2, 4, 3, 3, 0, 2, 1, 1, 2, + 2, 2, 1, 1, 0, 2, 1, 3, 3, 3, + 2, 3, 3, 1, 1 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned char yydefact[] = +{ + 2, 0, 1, 0, 0, 0, 8, 0, 0, 10, + 0, 0, 0, 0, 9, 93, 92, 3, 4, 22, + 14, 22, 15, 43, 53, 5, 59, 12, 79, 68, + 6, 74, 16, 79, 13, 17, 11, 87, 88, 0, + 0, 0, 38, 0, 0, 0, 103, 104, 0, 0, + 0, 96, 19, 21, 39, 42, 58, 64, 0, 76, + 7, 63, 73, 75, 18, 20, 0, 100, 55, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, + 85, 0, 85, 85, 85, 26, 0, 0, 23, 0, + 25, 24, 0, 0, 0, 85, 85, 47, 44, 46, + 45, 0, 0, 0, 54, 41, 40, 60, 62, 57, + 61, 56, 81, 80, 0, 69, 71, 66, 70, 65, + 99, 101, 102, 98, 97, 77, 0, 0, 0, 94, + 94, 0, 94, 94, 0, 94, 0, 0, 0, 94, + 0, 78, 51, 94, 94, 0, 0, 89, 90, 91, + 72, 0, 83, 84, 0, 0, 0, 27, 86, 0, + 29, 0, 33, 31, 32, 0, 94, 0, 0, 49, + 50, 82, 95, 34, 35, 28, 30, 36, 0, 48, + 52, 37 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const short yydefgoto[] = +{ + -1, 1, 17, 18, 19, 20, 21, 22, 52, 88, + 23, 24, 105, 25, 54, 98, 55, 26, 109, 27, + 56, 28, 29, 117, 30, 58, 31, 32, 33, 34, + 89, 90, 57, 91, 131, 132, 106, 35, 155, 50, + 51 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -99 +static const short yypact[] = +{ + -99, 48, -99, 38, 46, 46, -99, 46, -29, -99, + 46, -17, -3, -11, -99, -99, -99, -99, -99, -99, + -99, -99, -99, -99, -99, -99, -99, -99, -99, -99, + -99, -99, -99, -99, -99, -99, -99, -99, -99, 38, + 12, 15, -99, 18, 51, 62, -99, -99, -11, -11, + 4, -24, 138, 138, 160, 121, 110, -4, 81, -4, + -99, -99, -99, -99, -99, -99, -19, -99, -99, -11, + -11, 70, 70, 73, 32, -11, 46, -11, 46, -11, + 46, -11, 46, 46, 46, -99, 36, 70, -99, 95, + -99, -99, 96, 46, 106, 46, 46, -99, -99, -99, + -99, 38, 38, 38, -99, -99, -99, -99, -99, -99, + -99, -99, -99, -99, 112, -99, -99, -99, -99, -99, + -99, 117, -99, -99, -99, -99, -11, 33, 65, 131, + 1, 119, 131, 1, 136, 1, 153, 154, 155, 131, + 70, -99, -99, 131, 131, 156, 157, -99, -99, -99, + -99, 101, -99, -99, -11, 158, 159, -99, -99, 161, + -99, 162, -99, -99, -99, 163, 131, 164, 165, -99, + -99, -99, 99, -99, -99, -99, -99, -99, 166, -99, + -99, -99 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const short yypgoto[] = +{ + -99, -99, -99, 111, -99, -99, -99, -99, 178, -99, + -99, -99, -99, 91, -99, -99, -99, -99, -99, -99, + -99, -99, -99, -99, 115, -99, -99, -99, -99, -99, + -99, 146, 168, 89, 27, 0, 126, -1, -98, -48, + -63 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -68 +static const short yytable[] = +{ + 66, 67, 36, 42, 39, 40, 71, 41, 123, 124, + 43, 44, 74, 75, 120, 154, 72, 46, 47, 69, + 70, 121, 122, 48, 140, 45, 127, 128, 112, 130, + 49, 133, 156, 135, 158, 159, 68, 161, 60, 69, + 70, 165, 69, 70, 61, 167, 168, 62, 2, 3, + 63, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 46, 47, 13, 14, 139, 152, 48, 126, 178, 15, + 16, 69, 70, 49, 37, 38, 129, 166, 151, 15, + 16, -67, 114, 64, -67, 5, 101, 7, 8, 102, + 10, 11, 12, 143, 65, 13, 103, 153, 46, 47, + 147, 148, 149, 69, 70, 125, 172, 134, 141, 136, + 137, 138, 15, 16, 5, 101, 7, 8, 102, 10, + 11, 12, 145, 146, 13, 103, 101, 7, 142, 102, + 10, 11, 12, 171, 144, 13, 103, 69, 70, 69, + 70, 15, 16, 100, 150, 154, 113, 108, 113, 116, + 73, 157, 15, 16, 74, 75, 70, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 104, 107, 160, 115, + 85, 110, 73, 118, 86, 87, 74, 75, 92, 93, + 94, 95, 111, 96, 119, 162, 163, 164, 169, 170, + 173, 174, 97, 175, 176, 177, 179, 180, 181, 53, + 99, 59 +}; + +static const unsigned char yycheck[] = +{ + 48, 49, 3, 32, 4, 5, 30, 7, 71, 72, + 10, 28, 16, 17, 33, 14, 40, 28, 29, 38, + 39, 69, 70, 34, 87, 28, 74, 75, 32, 77, + 41, 79, 130, 81, 132, 133, 32, 135, 39, 38, + 39, 139, 38, 39, 32, 143, 144, 32, 0, 1, + 32, 3, 4, 5, 6, 7, 8, 9, 10, 11, + 28, 29, 14, 15, 28, 32, 34, 35, 166, 31, + 32, 38, 39, 41, 28, 29, 76, 140, 126, 31, + 32, 0, 1, 32, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 93, 32, 14, 15, 32, 28, 29, + 101, 102, 103, 38, 39, 32, 154, 80, 13, 82, + 83, 84, 31, 32, 4, 5, 6, 7, 8, 9, + 10, 11, 95, 96, 14, 15, 5, 6, 32, 8, + 9, 10, 11, 32, 28, 14, 15, 38, 39, 38, + 39, 31, 32, 54, 32, 14, 57, 56, 59, 58, + 12, 32, 31, 32, 16, 17, 39, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 55, 56, 32, 58, + 32, 56, 12, 58, 36, 37, 16, 17, 18, 19, + 20, 21, 56, 23, 58, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 21, + 54, 33 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 43, 0, 1, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 14, 15, 31, 32, 44, 45, 46, + 47, 48, 49, 52, 53, 55, 59, 61, 63, 64, + 66, 68, 69, 70, 71, 79, 79, 28, 29, 77, + 77, 77, 32, 77, 28, 28, 28, 29, 34, 41, + 81, 82, 50, 50, 56, 58, 62, 74, 67, 74, + 79, 32, 32, 32, 32, 32, 81, 81, 32, 38, + 39, 30, 40, 12, 16, 17, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 32, 36, 37, 51, 72, + 73, 75, 18, 19, 20, 21, 23, 32, 57, 73, + 75, 5, 8, 15, 45, 54, 78, 45, 55, 60, + 66, 78, 32, 75, 1, 45, 55, 65, 66, 78, + 33, 81, 81, 82, 82, 32, 35, 81, 81, 77, + 81, 76, 77, 81, 76, 81, 76, 76, 76, 28, + 82, 13, 32, 77, 28, 76, 76, 79, 79, 79, + 32, 81, 32, 32, 14, 80, 80, 32, 80, 80, + 32, 80, 32, 32, 32, 80, 82, 80, 80, 32, + 32, 32, 81, 32, 32, 32, 32, 32, 80, 32, + 32, 32 +}; + +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# if defined (__STDC__) || defined (__cplusplus) +# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrlab1 + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror ("syntax error: cannot back up");\ + YYERROR; \ + } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +/* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ + +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + Current.first_line = Rhs[1].first_line; \ + Current.first_column = Rhs[1].first_column; \ + Current.last_line = Rhs[N].last_line; \ + Current.last_column = Rhs[N].last_column; +#endif + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (YYLEX_PARAM) +#else +# define YYLEX yylex () +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +# define YYDSYMPRINT(Args) \ +do { \ + if (yydebug) \ + yysymprint Args; \ +} while (0) + +# define YYDSYMPRINTF(Title, Token, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Token, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (cinluded). | +`------------------------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_stack_print (short *bottom, short *top) +#else +static void +yy_stack_print (bottom, top) + short *bottom; + short *top; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_reduce_print (int yyrule) +#else +static void +yy_reduce_print (yyrule) + int yyrule; +#endif +{ + int yyi; + unsigned int yylineno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", + yyrule - 1, yylineno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YYDSYMPRINT(Args) +# define YYDSYMPRINTF(Title, Token, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#if YYMAXDEPTH == 0 +# undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + register const char *yys = yystr; + + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + register char *yyd = yydest; + register const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +#endif /* !YYERROR_VERBOSE */ + + + +#if YYDEBUG +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) +#else +static void +yysymprint (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (yytype < YYNTOKENS) + { + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +# ifdef YYPRINT + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + } + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyoutput, ")"); +} + +#endif /* ! YYDEBUG */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yydestruct (int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yytype, yyvaluep) + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + switch (yytype) + { + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM); +# else +int yyparse (); +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM) +# else +int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ + + register int yystate; + register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short yyssa[YYINITDEPTH]; + short *yyss = yyssa; + register short *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; + + + +#define YYPOPSTACK (yyvsp--, yyssp--) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ + int yylen; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyoverflowlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyoverflowlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + short *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; + + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + yystate = yyn; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 8: + + { zconfprint("unexpected 'endmenu' statement"); ;} + break; + + case 9: + + { zconfprint("unexpected 'endif' statement"); ;} + break; + + case 10: + + { zconfprint("unexpected 'endchoice' statement"); ;} + break; + + case 11: + + { zconfprint("syntax error"); yyerrok; ;} + break; + + case 18: + + { + struct symbol *sym = sym_lookup(yyvsp[-1].string, 0); + sym->flags |= SYMBOL_OPTIONAL; + menu_add_entry(sym); + printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string); +;} + break; + + case 19: + + { + menu_end_entry(); + printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 20: + + { + struct symbol *sym = sym_lookup(yyvsp[-1].string, 0); + sym->flags |= SYMBOL_OPTIONAL; + menu_add_entry(sym); + printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string); +;} + break; + + case 21: + + { + if (current_entry->prompt) + current_entry->prompt->type = P_MENU; + else + zconfprint("warning: menuconfig statement without prompt"); + menu_end_entry(); + printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 27: + + { + menu_set_type(S_TRISTATE); + printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 28: + + { + menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr); + menu_set_type(S_TRISTATE); + printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 29: + + { + menu_set_type(S_BOOLEAN); + printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 30: + + { + menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr); + menu_set_type(S_BOOLEAN); + printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 31: + + { + menu_set_type(S_INT); + printd(DEBUG_PARSE, "%s:%d:int\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 32: + + { + menu_set_type(S_HEX); + printd(DEBUG_PARSE, "%s:%d:hex\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 33: + + { + menu_set_type(S_STRING); + printd(DEBUG_PARSE, "%s:%d:string\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 34: + + { + menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr); + printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 35: + + { + menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr); + printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 36: + + { + menu_add_symbol(P_SELECT, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr); + printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 37: + + { + menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,yyvsp[-3].symbol, yyvsp[-2].symbol), yyvsp[-1].expr); + printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 38: + + { + struct symbol *sym = sym_lookup(NULL, 0); + sym->flags |= SYMBOL_CHOICE; + menu_add_entry(sym); + menu_add_expr(P_CHOICE, NULL, NULL); + printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 39: + + { + menu_end_entry(); + menu_add_menu(); +;} + break; + + case 40: + + { + if (zconf_endtoken(yyvsp[0].token, T_CHOICE, T_ENDCHOICE)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno()); + } +;} + break; + + case 42: + + { + printf("%s:%d: missing 'endchoice' for this 'choice' statement\n", current_menu->file->name, current_menu->lineno); + zconfnerrs++; +;} + break; + + case 48: + + { + menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr); + printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 49: + + { + menu_set_type(S_TRISTATE); + printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 50: + + { + menu_set_type(S_BOOLEAN); + printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 51: + + { + current_entry->sym->flags |= SYMBOL_OPTIONAL; + printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 52: + + { + menu_add_symbol(P_DEFAULT, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr); + printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 55: + + { + printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno()); + menu_add_entry(NULL); + menu_add_dep(yyvsp[-1].expr); + menu_end_entry(); + menu_add_menu(); +;} + break; + + case 56: + + { + if (zconf_endtoken(yyvsp[0].token, T_IF, T_ENDIF)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno()); + } +;} + break; + + case 58: + + { + printf("%s:%d: missing 'endif' for this 'if' statement\n", current_menu->file->name, current_menu->lineno); + zconfnerrs++; +;} + break; + + case 63: + + { + menu_add_entry(NULL); + menu_add_prop(P_MENU, yyvsp[-1].string, NULL, NULL); + printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 64: + + { + menu_end_entry(); + menu_add_menu(); +;} + break; + + case 65: + + { + if (zconf_endtoken(yyvsp[0].token, T_MENU, T_ENDMENU)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno()); + } +;} + break; + + case 67: + + { + printf("%s:%d: missing 'endmenu' for this 'menu' statement\n", current_menu->file->name, current_menu->lineno); + zconfnerrs++; +;} + break; + + case 72: + + { zconfprint("invalid menu option"); yyerrok; ;} + break; + + case 73: + + { + yyval.string = yyvsp[-1].string; + printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string); +;} + break; + + case 74: + + { + zconf_nextfile(yyvsp[0].string); +;} + break; + + case 75: + + { + menu_add_entry(NULL); + menu_add_prop(P_COMMENT, yyvsp[-1].string, NULL, NULL); + printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 76: + + { + menu_end_entry(); +;} + break; + + case 77: + + { + printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno()); + zconf_starthelp(); +;} + break; + + case 78: + + { + current_entry->sym->help = yyvsp[0].string; +;} + break; + + case 82: + + { + menu_add_dep(yyvsp[-1].expr); + printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 83: + + { + menu_add_dep(yyvsp[-1].expr); + printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 84: + + { + menu_add_dep(yyvsp[-1].expr); + printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 86: + + { + menu_add_prop(P_PROMPT, yyvsp[-1].string, NULL, yyvsp[0].expr); +;} + break; + + case 89: + + { yyval.token = T_ENDMENU; ;} + break; + + case 90: + + { yyval.token = T_ENDCHOICE; ;} + break; + + case 91: + + { yyval.token = T_ENDIF; ;} + break; + + case 94: + + { yyval.expr = NULL; ;} + break; + + case 95: + + { yyval.expr = yyvsp[0].expr; ;} + break; + + case 96: + + { yyval.expr = expr_alloc_symbol(yyvsp[0].symbol); ;} + break; + + case 97: + + { yyval.expr = expr_alloc_comp(E_EQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;} + break; + + case 98: + + { yyval.expr = expr_alloc_comp(E_UNEQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;} + break; + + case 99: + + { yyval.expr = yyvsp[-1].expr; ;} + break; + + case 100: + + { yyval.expr = expr_alloc_one(E_NOT, yyvsp[0].expr); ;} + break; + + case 101: + + { yyval.expr = expr_alloc_two(E_OR, yyvsp[-2].expr, yyvsp[0].expr); ;} + break; + + case 102: + + { yyval.expr = expr_alloc_two(E_AND, yyvsp[-2].expr, yyvsp[0].expr); ;} + break; + + case 103: + + { yyval.symbol = sym_lookup(yyvsp[0].string, 0); free(yyvsp[0].string); ;} + break; + + case 104: + + { yyval.symbol = sym_lookup(yyvsp[0].string, 1); free(yyvsp[0].string); ;} + break; + + + } + +/* Line 999 of yacc.c. */ + + + yyvsp -= yylen; + yyssp -= yylen; + + + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (YYPACT_NINF < yyn && yyn < YYLAST) + { + YYSIZE_T yysize = 0; + int yytype = YYTRANSLATE (yychar); + char *yymsg; + int yyx, yycount; + + yycount = 0; + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + yysize += yystrlen (yytname[yyx]) + 15, yycount++; + yysize += yystrlen ("syntax error, unexpected ") + 1; + yysize += yystrlen (yytname[yytype]); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) + { + char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); + + if (yycount < 5) + { + yycount = 0; + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); + yyx++) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + const char *yyq = ! yycount ? ", expecting " : " or "; + yyp = yystpcpy (yyp, yyq); + yyp = yystpcpy (yyp, yytname[yyx]); + yycount++; + } + } + yyerror (yymsg); + YYSTACK_FREE (yymsg); + } + else + yyerror ("syntax error; also virtual memory exhausted"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror ("syntax error"); + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + /* Return failure if at end of input. */ + if (yychar == YYEOF) + { + /* Pop the error token. */ + YYPOPSTACK; + /* Pop the rest of the stack. */ + while (yyss < yyssp) + { + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[*yyssp], yyvsp); + YYPOPSTACK; + } + YYABORT; + } + + YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); + yydestruct (yytoken, &yylval); + yychar = YYEMPTY; + + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*----------------------------------------------------. +| yyerrlab1 -- error raised explicitly by an action. | +`----------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[yystate], yyvsp); + yyvsp--; + yystate = *--yyssp; + + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + YYDPRINTF ((stderr, "Shifting error token, ")); + + *++yyvsp = yylval; + + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*----------------------------------------------. +| yyoverflowlab -- parser overflow comes here. | +`----------------------------------------------*/ +yyoverflowlab: + yyerror ("parser stack overflow"); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + return yyresult; +} + + + + + +void conf_parse(const char *name) +{ + struct symbol *sym; + int i; + + zconf_initscan(name); + + sym_init(); + menu_init(); + modules_sym = sym_lookup("MODULES", 0); + rootmenu.prompt = menu_add_prop(P_MENU, "Buildroot Configuration", NULL, NULL); + + //zconfdebug = 1; + zconfparse(); + if (zconfnerrs) + exit(1); + menu_finalize(&rootmenu); + for_all_symbols(i, sym) { + if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym)) + printf("\n"); + else + sym->flags |= SYMBOL_CHECK_DONE; + } + + sym_change_count = 1; +} + +const char *zconf_tokenname(int token) +{ + switch (token) { + case T_MENU: return "menu"; + case T_ENDMENU: return "endmenu"; + case T_CHOICE: return "choice"; + case T_ENDCHOICE: return "endchoice"; + case T_IF: return "if"; + case T_ENDIF: return "endif"; + } + return "<token>"; +} + +static bool zconf_endtoken(int token, int starttoken, int endtoken) +{ + if (token != endtoken) { + zconfprint("unexpected '%s' within %s block", zconf_tokenname(token), zconf_tokenname(starttoken)); + zconfnerrs++; + return false; + } + if (current_menu->file != current_file) { + zconfprint("'%s' in different file than '%s'", zconf_tokenname(token), zconf_tokenname(starttoken)); + zconfprint("location of the '%s'", zconf_tokenname(starttoken)); + zconfnerrs++; + return false; + } + return true; +} + +static void zconfprint(const char *err, ...) +{ + va_list ap; + + fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno() + 1); + va_start(ap, err); + vfprintf(stderr, err, ap); + va_end(ap); + fprintf(stderr, "\n"); +} + +static void zconferror(const char *err) +{ + fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err); +} + +void print_quoted_string(FILE *out, const char *str) +{ + const char *p; + int len; + + putc('"', out); + while ((p = strchr(str, '"'))) { + len = p - str; + if (len) + fprintf(out, "%.*s", len, str); + fputs("\\\"", out); + str = p + 1; + } + fputs(str, out); + putc('"', out); +} + +void print_symbol(FILE *out, struct menu *menu) +{ + struct symbol *sym = menu->sym; + struct property *prop; + + if (sym_is_choice(sym)) + fprintf(out, "choice\n"); + else + fprintf(out, "config %s\n", sym->name); + switch (sym->type) { + case S_BOOLEAN: + fputs(" boolean\n", out); + break; + case S_TRISTATE: + fputs(" tristate\n", out); + break; + case S_STRING: + fputs(" string\n", out); + break; + case S_INT: + fputs(" integer\n", out); + break; + case S_HEX: + fputs(" hex\n", out); + break; + default: + fputs(" ???\n", out); + break; + } + for (prop = sym->prop; prop; prop = prop->next) { + if (prop->menu != menu) + continue; + switch (prop->type) { + case P_PROMPT: + fputs(" prompt ", out); + print_quoted_string(out, prop->text); + if (!expr_is_yes(prop->visible.expr)) { + fputs(" if ", out); + expr_fprint(prop->visible.expr, out); + } + fputc('\n', out); + break; + case P_DEFAULT: + fputs( " default ", out); + expr_fprint(prop->expr, out); + if (!expr_is_yes(prop->visible.expr)) { + fputs(" if ", out); + expr_fprint(prop->visible.expr, out); + } + fputc('\n', out); + break; + case P_CHOICE: + fputs(" #choice value\n", out); + break; + default: + fprintf(out, " unknown prop %d!\n", prop->type); + break; + } + } + if (sym->help) { + int len = strlen(sym->help); + while (sym->help[--len] == '\n') + sym->help[len] = 0; + fprintf(out, " help\n%s\n", sym->help); + } + fputc('\n', out); +} + +void zconfdump(FILE *out) +{ + struct property *prop; + struct symbol *sym; + struct menu *menu; + + menu = rootmenu.list; + while (menu) { + if ((sym = menu->sym)) + print_symbol(out, menu); + else if ((prop = menu->prompt)) { + switch (prop->type) { + case P_COMMENT: + fputs("\ncomment ", out); + print_quoted_string(out, prop->text); + fputs("\n", out); + break; + case P_MENU: + fputs("\nmenu ", out); + print_quoted_string(out, prop->text); + fputs("\n", out); + break; + default: + ; + } + if (!expr_is_yes(prop->visible.expr)) { + fputs(" depends ", out); + expr_fprint(prop->visible.expr, out); + fputc('\n', out); + } + fputs("\n", out); + } + + if (menu->list) + menu = menu->list; + else if (menu->next) + menu = menu->next; + else while ((menu = menu->parent)) { + if (menu->prompt && menu->prompt->type == P_MENU) + fputs("\nendmenu\n", out); + if (menu->next) { + menu = menu->next; + break; + } + } + } +} + +#include "lex.zconf.c" +#include "confdata.c" +#include "expr.c" +#include "symbol.c" +#include "menu.c" + + diff --git a/openwrt/package/config/zconf.tab.h_shipped b/openwrt/package/config/zconf.tab.h_shipped new file mode 100644 index 0000000000..3b191ef599 --- /dev/null +++ b/openwrt/package/config/zconf.tab.h_shipped @@ -0,0 +1,125 @@ +/* A Bison parser, made from zconf.y, by GNU bison 1.75. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program 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 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +#ifndef BISON_ZCONF_TAB_H +# define BISON_ZCONF_TAB_H + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + T_MAINMENU = 258, + T_MENU = 259, + T_ENDMENU = 260, + T_SOURCE = 261, + T_CHOICE = 262, + T_ENDCHOICE = 263, + T_COMMENT = 264, + T_CONFIG = 265, + T_HELP = 266, + T_HELPTEXT = 267, + T_IF = 268, + T_ENDIF = 269, + T_DEPENDS = 270, + T_REQUIRES = 271, + T_OPTIONAL = 272, + T_PROMPT = 273, + T_DEFAULT = 274, + T_TRISTATE = 275, + T_BOOLEAN = 276, + T_INT = 277, + T_HEX = 278, + T_WORD = 279, + T_STRING = 280, + T_UNEQUAL = 281, + T_EOF = 282, + T_EOL = 283, + T_CLOSE_PAREN = 284, + T_OPEN_PAREN = 285, + T_ON = 286, + T_OR = 287, + T_AND = 288, + T_EQUAL = 289, + T_NOT = 290 + }; +#endif +#define T_MAINMENU 258 +#define T_MENU 259 +#define T_ENDMENU 260 +#define T_SOURCE 261 +#define T_CHOICE 262 +#define T_ENDCHOICE 263 +#define T_COMMENT 264 +#define T_CONFIG 265 +#define T_HELP 266 +#define T_HELPTEXT 267 +#define T_IF 268 +#define T_ENDIF 269 +#define T_DEPENDS 270 +#define T_REQUIRES 271 +#define T_OPTIONAL 272 +#define T_PROMPT 273 +#define T_DEFAULT 274 +#define T_TRISTATE 275 +#define T_BOOLEAN 276 +#define T_INT 277 +#define T_HEX 278 +#define T_WORD 279 +#define T_STRING 280 +#define T_UNEQUAL 281 +#define T_EOF 282 +#define T_EOL 283 +#define T_CLOSE_PAREN 284 +#define T_OPEN_PAREN 285 +#define T_ON 286 +#define T_OR 287 +#define T_AND 288 +#define T_EQUAL 289 +#define T_NOT 290 + + + + +#ifndef YYSTYPE +#line 33 "zconf.y" +typedef union { + int token; + char *string; + struct symbol *symbol; + struct expr *expr; + struct menu *menu; +} yystype; +/* Line 1281 of /usr/share/bison/yacc.c. */ +#line 118 "zconf.tab.h" +# define YYSTYPE yystype +#endif + +extern YYSTYPE zconflval; + + +#endif /* not BISON_ZCONF_TAB_H */ + diff --git a/openwrt/package/config/zconf.y b/openwrt/package/config/zconf.y new file mode 100644 index 0000000000..f354c89e6c --- /dev/null +++ b/openwrt/package/config/zconf.y @@ -0,0 +1,687 @@ +%{ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#include <ctype.h> +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdbool.h> + +#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt) + +#define PRINTD 0x0001 +#define DEBUG_PARSE 0x0002 + +int cdebug = PRINTD; + +extern int zconflex(void); +static void zconfprint(const char *err, ...); +static void zconferror(const char *err); +static bool zconf_endtoken(int token, int starttoken, int endtoken); + +struct symbol *symbol_hash[257]; + +#define YYERROR_VERBOSE +%} +%expect 40 + +%union +{ + int token; + char *string; + struct symbol *symbol; + struct expr *expr; + struct menu *menu; +} + +%token T_MAINMENU +%token T_MENU +%token T_ENDMENU +%token T_SOURCE +%token T_CHOICE +%token T_ENDCHOICE +%token T_COMMENT +%token T_CONFIG +%token T_MENUCONFIG +%token T_HELP +%token <string> T_HELPTEXT +%token T_IF +%token T_ENDIF +%token T_DEPENDS +%token T_REQUIRES +%token T_OPTIONAL +%token T_PROMPT +%token T_DEFAULT +%token T_TRISTATE +%token T_DEF_TRISTATE +%token T_BOOLEAN +%token T_DEF_BOOLEAN +%token T_STRING +%token T_INT +%token T_HEX +%token <string> T_WORD +%token <string> T_WORD_QUOTE +%token T_UNEQUAL +%token T_EOF +%token T_EOL +%token T_CLOSE_PAREN +%token T_OPEN_PAREN +%token T_ON +%token T_SELECT +%token T_RANGE + +%left T_OR +%left T_AND +%left T_EQUAL T_UNEQUAL +%nonassoc T_NOT + +%type <string> prompt +%type <string> source +%type <symbol> symbol +%type <expr> expr +%type <expr> if_expr +%type <token> end + +%{ +#define LKC_DIRECT_LINK +#include "lkc.h" +%} +%% +input: /* empty */ + | input block +; + +block: common_block + | choice_stmt + | menu_stmt + | T_MAINMENU prompt nl_or_eof + | T_ENDMENU { zconfprint("unexpected 'endmenu' statement"); } + | T_ENDIF { zconfprint("unexpected 'endif' statement"); } + | T_ENDCHOICE { zconfprint("unexpected 'endchoice' statement"); } + | error nl_or_eof { zconfprint("syntax error"); yyerrok; } +; + +common_block: + if_stmt + | comment_stmt + | config_stmt + | menuconfig_stmt + | source_stmt + | nl_or_eof +; + + +/* config/menuconfig entry */ + +config_entry_start: T_CONFIG T_WORD T_EOL +{ + struct symbol *sym = sym_lookup($2, 0); + sym->flags |= SYMBOL_OPTIONAL; + menu_add_entry(sym); + printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2); +}; + +config_stmt: config_entry_start config_option_list +{ + menu_end_entry(); + printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); +}; + +menuconfig_entry_start: T_MENUCONFIG T_WORD T_EOL +{ + struct symbol *sym = sym_lookup($2, 0); + sym->flags |= SYMBOL_OPTIONAL; + menu_add_entry(sym); + printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2); +}; + +menuconfig_stmt: menuconfig_entry_start config_option_list +{ + if (current_entry->prompt) + current_entry->prompt->type = P_MENU; + else + zconfprint("warning: menuconfig statement without prompt"); + menu_end_entry(); + printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); +}; + +config_option_list: + /* empty */ + | config_option_list config_option + | config_option_list depends + | config_option_list help + | config_option_list T_EOL +; + +config_option: T_TRISTATE prompt_stmt_opt T_EOL +{ + menu_set_type(S_TRISTATE); + printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_DEF_TRISTATE expr if_expr T_EOL +{ + menu_add_expr(P_DEFAULT, $2, $3); + menu_set_type(S_TRISTATE); + printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_BOOLEAN prompt_stmt_opt T_EOL +{ + menu_set_type(S_BOOLEAN); + printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_DEF_BOOLEAN expr if_expr T_EOL +{ + menu_add_expr(P_DEFAULT, $2, $3); + menu_set_type(S_BOOLEAN); + printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_INT prompt_stmt_opt T_EOL +{ + menu_set_type(S_INT); + printd(DEBUG_PARSE, "%s:%d:int\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_HEX prompt_stmt_opt T_EOL +{ + menu_set_type(S_HEX); + printd(DEBUG_PARSE, "%s:%d:hex\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_STRING prompt_stmt_opt T_EOL +{ + menu_set_type(S_STRING); + printd(DEBUG_PARSE, "%s:%d:string\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_PROMPT prompt if_expr T_EOL +{ + menu_add_prompt(P_PROMPT, $2, $3); + printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_DEFAULT expr if_expr T_EOL +{ + menu_add_expr(P_DEFAULT, $2, $3); + printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_SELECT T_WORD if_expr T_EOL +{ + menu_add_symbol(P_SELECT, sym_lookup($2, 0), $3); + printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno()); +}; + +config_option: T_RANGE symbol symbol if_expr T_EOL +{ + menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4); + printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno()); +}; + +/* choice entry */ + +choice: T_CHOICE T_EOL +{ + struct symbol *sym = sym_lookup(NULL, 0); + sym->flags |= SYMBOL_CHOICE; + menu_add_entry(sym); + menu_add_expr(P_CHOICE, NULL, NULL); + printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno()); +}; + +choice_entry: choice choice_option_list +{ + menu_end_entry(); + menu_add_menu(); +}; + +choice_end: end +{ + if (zconf_endtoken($1, T_CHOICE, T_ENDCHOICE)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno()); + } +}; + +choice_stmt: + choice_entry choice_block choice_end + | choice_entry choice_block +{ + printf("%s:%d: missing 'endchoice' for this 'choice' statement\n", current_menu->file->name, current_menu->lineno); + zconfnerrs++; +}; + +choice_option_list: + /* empty */ + | choice_option_list choice_option + | choice_option_list depends + | choice_option_list help + | choice_option_list T_EOL +; + +choice_option: T_PROMPT prompt if_expr T_EOL +{ + menu_add_prompt(P_PROMPT, $2, $3); + printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); +}; + +choice_option: T_TRISTATE prompt_stmt_opt T_EOL +{ + menu_set_type(S_TRISTATE); + printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno()); +}; + +choice_option: T_BOOLEAN prompt_stmt_opt T_EOL +{ + menu_set_type(S_BOOLEAN); + printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno()); +}; + +choice_option: T_OPTIONAL T_EOL +{ + current_entry->sym->flags |= SYMBOL_OPTIONAL; + printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno()); +}; + +choice_option: T_DEFAULT T_WORD if_expr T_EOL +{ + menu_add_symbol(P_DEFAULT, sym_lookup($2, 0), $3); + printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); +}; + +choice_block: + /* empty */ + | choice_block common_block +; + +/* if entry */ + +if: T_IF expr T_EOL +{ + printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno()); + menu_add_entry(NULL); + menu_add_dep($2); + menu_end_entry(); + menu_add_menu(); +}; + +if_end: end +{ + if (zconf_endtoken($1, T_IF, T_ENDIF)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno()); + } +}; + +if_stmt: + if if_block if_end + | if if_block +{ + printf("%s:%d: missing 'endif' for this 'if' statement\n", current_menu->file->name, current_menu->lineno); + zconfnerrs++; +}; + +if_block: + /* empty */ + | if_block common_block + | if_block menu_stmt + | if_block choice_stmt +; + +/* menu entry */ + +menu: T_MENU prompt T_EOL +{ + menu_add_entry(NULL); + menu_add_prop(P_MENU, $2, NULL, NULL); + printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno()); +}; + +menu_entry: menu depends_list +{ + menu_end_entry(); + menu_add_menu(); +}; + +menu_end: end +{ + if (zconf_endtoken($1, T_MENU, T_ENDMENU)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno()); + } +}; + +menu_stmt: + menu_entry menu_block menu_end + | menu_entry menu_block +{ + printf("%s:%d: missing 'endmenu' for this 'menu' statement\n", current_menu->file->name, current_menu->lineno); + zconfnerrs++; +}; + +menu_block: + /* empty */ + | menu_block common_block + | menu_block menu_stmt + | menu_block choice_stmt + | menu_block error T_EOL { zconfprint("invalid menu option"); yyerrok; } +; + +source: T_SOURCE prompt T_EOL +{ + $$ = $2; + printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2); +}; + +source_stmt: source +{ + zconf_nextfile($1); +}; + +/* comment entry */ + +comment: T_COMMENT prompt T_EOL +{ + menu_add_entry(NULL); + menu_add_prop(P_COMMENT, $2, NULL, NULL); + printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno()); +}; + +comment_stmt: comment depends_list +{ + menu_end_entry(); +}; + +/* help option */ + +help_start: T_HELP T_EOL +{ + printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno()); + zconf_starthelp(); +}; + +help: help_start T_HELPTEXT +{ + current_entry->sym->help = $2; +}; + +/* depends option */ + +depends_list: /* empty */ + | depends_list depends + | depends_list T_EOL +; + +depends: T_DEPENDS T_ON expr T_EOL +{ + menu_add_dep($3); + printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno()); +} + | T_DEPENDS expr T_EOL +{ + menu_add_dep($2); + printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno()); +} + | T_REQUIRES expr T_EOL +{ + menu_add_dep($2); + printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno()); +}; + +/* prompt statement */ + +prompt_stmt_opt: + /* empty */ + | prompt if_expr +{ + menu_add_prop(P_PROMPT, $1, NULL, $2); +}; + +prompt: T_WORD + | T_WORD_QUOTE +; + +end: T_ENDMENU nl_or_eof { $$ = T_ENDMENU; } + | T_ENDCHOICE nl_or_eof { $$ = T_ENDCHOICE; } + | T_ENDIF nl_or_eof { $$ = T_ENDIF; } +; + +nl_or_eof: + T_EOL | T_EOF; + +if_expr: /* empty */ { $$ = NULL; } + | T_IF expr { $$ = $2; } +; + +expr: symbol { $$ = expr_alloc_symbol($1); } + | symbol T_EQUAL symbol { $$ = expr_alloc_comp(E_EQUAL, $1, $3); } + | symbol T_UNEQUAL symbol { $$ = expr_alloc_comp(E_UNEQUAL, $1, $3); } + | T_OPEN_PAREN expr T_CLOSE_PAREN { $$ = $2; } + | T_NOT expr { $$ = expr_alloc_one(E_NOT, $2); } + | expr T_OR expr { $$ = expr_alloc_two(E_OR, $1, $3); } + | expr T_AND expr { $$ = expr_alloc_two(E_AND, $1, $3); } +; + +symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); } + | T_WORD_QUOTE { $$ = sym_lookup($1, 1); free($1); } +; + +%% + +void conf_parse(const char *name) +{ + struct symbol *sym; + int i; + + zconf_initscan(name); + + sym_init(); + menu_init(); + modules_sym = sym_lookup("MODULES", 0); + rootmenu.prompt = menu_add_prop(P_MENU, "Buildroot Configuration", NULL, NULL); + + //zconfdebug = 1; + zconfparse(); + if (zconfnerrs) + exit(1); + menu_finalize(&rootmenu); + for_all_symbols(i, sym) { + if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym)) + printf("\n"); + else + sym->flags |= SYMBOL_CHECK_DONE; + } + + sym_change_count = 1; +} + +const char *zconf_tokenname(int token) +{ + switch (token) { + case T_MENU: return "menu"; + case T_ENDMENU: return "endmenu"; + case T_CHOICE: return "choice"; + case T_ENDCHOICE: return "endchoice"; + case T_IF: return "if"; + case T_ENDIF: return "endif"; + } + return "<token>"; +} + +static bool zconf_endtoken(int token, int starttoken, int endtoken) +{ + if (token != endtoken) { + zconfprint("unexpected '%s' within %s block", zconf_tokenname(token), zconf_tokenname(starttoken)); + zconfnerrs++; + return false; + } + if (current_menu->file != current_file) { + zconfprint("'%s' in different file than '%s'", zconf_tokenname(token), zconf_tokenname(starttoken)); + zconfprint("location of the '%s'", zconf_tokenname(starttoken)); + zconfnerrs++; + return false; + } + return true; +} + +static void zconfprint(const char *err, ...) +{ + va_list ap; + + fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno() + 1); + va_start(ap, err); + vfprintf(stderr, err, ap); + va_end(ap); + fprintf(stderr, "\n"); +} + +static void zconferror(const char *err) +{ + fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err); +} + +void print_quoted_string(FILE *out, const char *str) +{ + const char *p; + int len; + + putc('"', out); + while ((p = strchr(str, '"'))) { + len = p - str; + if (len) + fprintf(out, "%.*s", len, str); + fputs("\\\"", out); + str = p + 1; + } + fputs(str, out); + putc('"', out); +} + +void print_symbol(FILE *out, struct menu *menu) +{ + struct symbol *sym = menu->sym; + struct property *prop; + + if (sym_is_choice(sym)) + fprintf(out, "choice\n"); + else + fprintf(out, "config %s\n", sym->name); + switch (sym->type) { + case S_BOOLEAN: + fputs(" boolean\n", out); + break; + case S_TRISTATE: + fputs(" tristate\n", out); + break; + case S_STRING: + fputs(" string\n", out); + break; + case S_INT: + fputs(" integer\n", out); + break; + case S_HEX: + fputs(" hex\n", out); + break; + default: + fputs(" ???\n", out); + break; + } + for (prop = sym->prop; prop; prop = prop->next) { + if (prop->menu != menu) + continue; + switch (prop->type) { + case P_PROMPT: + fputs(" prompt ", out); + print_quoted_string(out, prop->text); + if (!expr_is_yes(prop->visible.expr)) { + fputs(" if ", out); + expr_fprint(prop->visible.expr, out); + } + fputc('\n', out); + break; + case P_DEFAULT: + fputs( " default ", out); + expr_fprint(prop->expr, out); + if (!expr_is_yes(prop->visible.expr)) { + fputs(" if ", out); + expr_fprint(prop->visible.expr, out); + } + fputc('\n', out); + break; + case P_CHOICE: + fputs(" #choice value\n", out); + break; + default: + fprintf(out, " unknown prop %d!\n", prop->type); + break; + } + } + if (sym->help) { + int len = strlen(sym->help); + while (sym->help[--len] == '\n') + sym->help[len] = 0; + fprintf(out, " help\n%s\n", sym->help); + } + fputc('\n', out); +} + +void zconfdump(FILE *out) +{ + struct property *prop; + struct symbol *sym; + struct menu *menu; + + menu = rootmenu.list; + while (menu) { + if ((sym = menu->sym)) + print_symbol(out, menu); + else if ((prop = menu->prompt)) { + switch (prop->type) { + case P_COMMENT: + fputs("\ncomment ", out); + print_quoted_string(out, prop->text); + fputs("\n", out); + break; + case P_MENU: + fputs("\nmenu ", out); + print_quoted_string(out, prop->text); + fputs("\n", out); + break; + default: + ; + } + if (!expr_is_yes(prop->visible.expr)) { + fputs(" depends ", out); + expr_fprint(prop->visible.expr, out); + fputc('\n', out); + } + fputs("\n", out); + } + + if (menu->list) + menu = menu->list; + else if (menu->next) + menu = menu->next; + else while ((menu = menu->parent)) { + if (menu->prompt && menu->prompt->type == P_MENU) + fputs("\nendmenu\n", out); + if (menu->next) { + menu = menu->next; + break; + } + } + } +} + +#include "lex.zconf.c" +#include "confdata.c" +#include "expr.c" +#include "symbol.c" +#include "menu.c" diff --git a/openwrt/package/dnsmasq/Config.in b/openwrt/package/dnsmasq/Config.in new file mode 100644 index 0000000000..05e40f34eb --- /dev/null +++ b/openwrt/package/dnsmasq/Config.in @@ -0,0 +1,8 @@ +config BR2_PACKAGE_DNSMASQ + bool "dnsmasq" + default n + help + A lightweight DNS and DHCP server. It is intended to provide + coupled DNS and DHCP service to a LAN. + + http://www.thekelleys.org.uk/dnsmasq/ diff --git a/openwrt/package/dnsmasq/Makefile.in b/openwrt/package/dnsmasq/Makefile.in new file mode 100644 index 0000000000..36548bd2b1 --- /dev/null +++ b/openwrt/package/dnsmasq/Makefile.in @@ -0,0 +1,3 @@ +ifeq ($(strip $(BR2_PACKAGE_DNSMASQ)),y) +TARGETS+=dnsmasq +endif diff --git a/openwrt/package/dnsmasq/dnsmasq.mk b/openwrt/package/dnsmasq/dnsmasq.mk new file mode 100644 index 0000000000..b1848c6aa8 --- /dev/null +++ b/openwrt/package/dnsmasq/dnsmasq.mk @@ -0,0 +1,50 @@ +############################################################# +# +# dnsmasq +# +############################################################# + +DNSMASQ_SITE=http://thekelleys.org.uk/dnsmasq +ifeq ($(filter $(TARGETS),dnsmasq1),) +DNSMASQ_SOURCE=dnsmasq-2.15.tar.gz +DNSMASQ_DIR=$(BUILD_DIR)/dnsmasq-2.15 +DNSMASQ_VER=dnsmasq2 +else +DNSMASQ_SOURCE=dnsmasq-1.18.tar.gz +DNSMASQ_DIR=$(BUILD_DIR)/dnsmasq-1.18 +DNSMASQ_VER=dnsmasq1 +endif +DNSMASQ_BINARY=dnsmasq +DNSMASQ_TARGET_BINARY=usr/sbin/dnsmasq + +$(DL_DIR)/$(DNSMASQ_SOURCE): + $(WGET) -P $(DL_DIR) $(DNSMASQ_SITE)/$(DNSMASQ_SOURCE) + +$(DNSMASQ_DIR)/.source: $(DL_DIR)/$(DNSMASQ_SOURCE) + zcat $(DL_DIR)/$(DNSMASQ_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + toolchain/patch-kernel.sh $(DNSMASQ_DIR) package/dnsmasq/ \ + $(DNSMASQ_VER)-\*.patch + touch $(DNSMASQ_DIR)/.source + +$(DNSMASQ_DIR)/src/$(DNSMASQ_BINARY): $(DNSMASQ_DIR)/.source + $(MAKE) CC=$(TARGET_CC) CFLAGS="$(TARGET_CFLAGS)" \ + BINDIR=/usr/sbin MANDIR=/usr/man -C $(DNSMASQ_DIR) + +$(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY): $(DNSMASQ_DIR)/src/$(DNSMASQ_BINARY) + $(MAKE) BINDIR=/usr/sbin MANDIR=/usr/man \ + DESTDIR=$(TARGET_DIR) -C $(DNSMASQ_DIR) install + $(STRIP) $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY) + rm -rf $(TARGET_DIR)/usr/man + +dnsmasq: uclibc $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY) + +dnsmasq1: uclibc $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY) + +dnsmasq-source: $(DL_DIR)/$(DNSMASQ_SOURCE) + +dnsmasq-clean: + #$(MAKE) prefix=$(TARGET_DIR)/usr -C $(DNSMASQ_DIR) uninstall + -$(MAKE) -C $(DNSMASQ_DIR) clean + +dnsmasq-dirclean: + rm -rf $(DNSMASQ_DIR) diff --git a/openwrt/package/dnsmasq/dnsmasq1-100-bugfix.patch b/openwrt/package/dnsmasq/dnsmasq1-100-bugfix.patch new file mode 100644 index 0000000000..c676a1a398 --- /dev/null +++ b/openwrt/package/dnsmasq/dnsmasq1-100-bugfix.patch @@ -0,0 +1,25 @@ +--- dnsmasq-1.18/config.h.dist 2004-03-01 22:25:12.000000000 -0600 ++++ dnsmasq-1.18/config.h 2004-03-01 22:26:50.000000000 -0600 +@@ -126,7 +126,9 @@ + + /* Must preceed __linux__ since uClinux defines __linux__ too. */ + #if defined(__uClinux__) || defined(__UCLIBC__) ++#ifndef __UCLIBC_HAS_IPV6__ + #undef HAVE_LINUX_IPV6_PROC ++#endif + #define HAVE_GETOPT_LONG + #undef HAVE_ARC4RANDOM + #define HAVE_RANDOM +diff -x CVS -urN dnsmasq-1.18/option.c dnsmasq.old/option.c +--- dnsmasq-1.18/option.c 2003-11-05 08:22:18.000000000 -0600 ++++ dnsmasq.old/option.c 2004-01-05 23:40:11.000000000 -0600 +@@ -578,8 +578,8 @@ + #ifdef HAVE_IPV6 + else if (tmp->source_addr.sa.sa_family == AF_INET6) + tmp->source_addr.in6.sin6_port = htons(*query_port); +- } + #endif ++ } + } + + if (*if_addrs) diff --git a/openwrt/package/dnsmasq/dnsmasq2-100-config.patch b/openwrt/package/dnsmasq/dnsmasq2-100-config.patch new file mode 100644 index 0000000000..270c22740e --- /dev/null +++ b/openwrt/package/dnsmasq/dnsmasq2-100-config.patch @@ -0,0 +1,49 @@ +diff -ur dnsmasq-2.15.orig/src/config.h dnsmasq-2.15/src/config.h +--- dnsmasq-2.15.orig/src/config.h 2004-10-08 11:41:34.757371880 -0400 ++++ dnsmasq-2.15/src/config.h 2004-10-08 11:43:49.074952504 -0400 +@@ -78,6 +78,11 @@ + /* We assume that systems which don't have IPv6 + headers don't have ntop and pton either */ + ++#if defined(__UCLIBC__) && !defined(__UCLIBC_HAS_IPV6__) ++# undef NO_IPV6 ++# define NO_IPV6 ++#endif ++ + #if defined(INET6_ADDRSTRLEN) && defined(IPV6_V6ONLY) && !defined(NO_IPV6) + # define HAVE_IPV6 + # define ADDRSTRLEN INET6_ADDRSTRLEN +@@ -194,7 +199,7 @@ + /* platform dependent options. */ + + /* Must preceed __linux__ since uClinux defines __linux__ too. */ +-#if defined(__uClinux__) || defined(__UCLIBC__) ++#if defined(__uClinux__) + #undef HAVE_LINUX_IPV6_PROC + #define HAVE_GETOPT_LONG + #undef HAVE_ARC4RANDOM +@@ -208,6 +213,24 @@ + # define NO_FORK + #endif + ++#elif defined(__linux__) && defined(__UCLIBC__) ++# define HAVE_LINUX_IPV6_PROC ++# if defined(__UCLIBC_HAS_GNU_GETOPT__) || \ ++ ((__UCLIBC_MAJOR__==0) && (__UCLIBC_MINOR__==9) && (__UCLIBC_SUBLEVEL__<21)) ++# define HAVE_GETOPT_LONG ++# else ++# undef HAVE_GETOPT_LONG ++# endif ++#undef HAVE_ARC4RANDOM ++#define HAVE_RANDOM ++#define HAVE_DEV_URANDOM ++#define HAVE_DEV_RANDOM ++#undef HAVE_SOCKADDR_SA_LEN ++#undef HAVE_PSELECT ++#if !defined(__ARCH_HAS_MMU__) ++# define NO_FORK ++#endif ++ + /* libc5 - must precede __linux__ too */ + /* Note to build a libc5 binary on a modern Debian system: + install the packages altgcc libc5 and libc5-altdev diff --git a/openwrt/package/dropbear_sshd/Config.in b/openwrt/package/dropbear_sshd/Config.in new file mode 100644 index 0000000000..07c5218840 --- /dev/null +++ b/openwrt/package/dropbear_sshd/Config.in @@ -0,0 +1,7 @@ +config BR2_PACKAGE_DROPBEAR_SSHD + bool "dropbear_sshd" + default n + help + A small SSH 2 server designed for small memory environments. + + http://matt.ucc.asn.au/dropbear/ diff --git a/openwrt/package/dropbear_sshd/Makefile.in b/openwrt/package/dropbear_sshd/Makefile.in new file mode 100644 index 0000000000..87247fcee5 --- /dev/null +++ b/openwrt/package/dropbear_sshd/Makefile.in @@ -0,0 +1,3 @@ +ifeq ($(strip $(BR2_PACKAGE_DROPBEAR_SSHD)),y) +TARGETS+=dropbear_sshd +endif diff --git a/openwrt/package/dropbear_sshd/dropbear-init.patch b/openwrt/package/dropbear_sshd/dropbear-init.patch new file mode 100644 index 0000000000..d6bf1740a0 --- /dev/null +++ b/openwrt/package/dropbear_sshd/dropbear-init.patch @@ -0,0 +1,59 @@ +--- dropbear-0.42/S50dropbear ++++ dropbear-0.42/S50dropbear +@@ -0,0 +1,56 @@ ++#!/bin/sh ++# ++# Starts dropbear sshd. ++# ++ ++# Make sure the dropbearkey progam exists ++[ -f /usr/bin/dropbearkey ] || exit 0 ++ ++# Check for the Dropbear RSA key ++if [ ! -f /etc/dropbear/dropbear_rsa_host_key ] ; then ++ echo Generating RSA Key... ++ mkdir -p /etc/dropbear ++ /usr/bin/dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key ++fi ++ ++# Check for the Dropbear DSS key ++if [ ! -f /etc/dropbear/dropbear_dss_host_key ] ; then ++ echo Generating DSS Key... ++ mkdir -p /etc/dropbear ++ /usr/bin/dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key ++fi ++ ++umask 077 ++ ++start() { ++ echo -n "Starting dropbear sshd: " ++ start-stop-daemon --start --quiet --pidfile /var/run/dropbear.pid --exec /usr/sbin/dropbear ++ echo "OK" ++} ++stop() { ++ echo -n "Stopping sshd: " ++ start-stop-daemon --stop --quiet --pidfile /var/run/dropbear.pid ++ echo "OK" ++} ++restart() { ++ stop ++ start ++} ++ ++case "$1" in ++ start) ++ start ++ ;; ++ stop) ++ stop ++ ;; ++ restart|reload) ++ restart ++ ;; ++ *) ++ echo $"Usage: $0 {start|stop|restart}" ++ exit 1 ++esac ++ ++exit $? ++ diff --git a/openwrt/package/dropbear_sshd/dropbear_sshd.mk b/openwrt/package/dropbear_sshd/dropbear_sshd.mk new file mode 100644 index 0000000000..26c9b17830 --- /dev/null +++ b/openwrt/package/dropbear_sshd/dropbear_sshd.mk @@ -0,0 +1,79 @@ +############################################################# +# +# dropbear_sshd +# +############################################################# +DROPBEAR_SSHD_SOURCE:=dropbear-0.44.tar.bz2 +DROPBEAR_SSHD_SITE:=http://matt.ucc.asn.au/dropbear/releases/ +DROPBEAR_SSHD_DIR:=$(BUILD_DIR)/dropbear-0.44 +DROPBEAR_SSHD_CAT:=bzcat +DROPBEAR_SSHD_BINARY:=dropbearmulti +DROPBEAR_SSHD_TARGET_BINARY:=usr/sbin/dropbear + + +$(DL_DIR)/$(DROPBEAR_SSHD_SOURCE): + $(WGET) -P $(DL_DIR) $(DROPBEAR_SSHD_SITE)/$(DROPBEAR_SSHD_SOURCE) + +dropbear_sshd-source: $(DL_DIR)/$(DROPBEAR_SSHD_SOURCE) + +$(DROPBEAR_SSHD_DIR)/.unpacked: $(DL_DIR)/$(DROPBEAR_SSHD_SOURCE) + $(DROPBEAR_SSHD_CAT) $(DL_DIR)/$(DROPBEAR_SSHD_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + toolchain/patch-kernel.sh $(DROPBEAR_SSHD_DIR) package/dropbear_sshd/ dropbear-\*.patch + $(SED) 's,^/\* #define DROPBEAR_MULTI.*,#define DROPBEAR_MULTI,g' $(DROPBEAR_SSHD_DIR)/options.h + touch $(DROPBEAR_SSHD_DIR)/.unpacked + +$(DROPBEAR_SSHD_DIR)/.configured: $(DROPBEAR_SSHD_DIR)/.unpacked + (cd $(DROPBEAR_SSHD_DIR); rm -rf config.cache; \ + autoconf; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + --with-shared \ + ); + touch $(DROPBEAR_SSHD_DIR)/.configured + +$(DROPBEAR_SSHD_DIR)/$(DROPBEAR_SSHD_BINARY): $(DROPBEAR_SSHD_DIR)/.configured + $(MAKE) $(TARGET_CONFIGURE_OPTS) LD=$(TARGET_CC) \ + PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" \ + MULTI=1 SCPPROGRESS=1 -C $(DROPBEAR_SSHD_DIR) + +$(TARGET_DIR)/$(DROPBEAR_SSHD_TARGET_BINARY): $(DROPBEAR_SSHD_DIR)/$(DROPBEAR_SSHD_BINARY) + #$(MAKE) DESTDIR=$(TARGET_DIR) $(TARGET_CONFIGURE_OPTS) \ + # LD=$(TARGET_CC) -C $(DROPBEAR_SSHD_DIR) install + #rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + # $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + install -d -m 755 $(TARGET_DIR)/usr/sbin + install -d -m 755 $(TARGET_DIR)/usr/bin + install -m 755 $(DROPBEAR_SSHD_DIR)/$(DROPBEAR_SSHD_BINARY) \ + $(TARGET_DIR)/$(DROPBEAR_SSHD_TARGET_BINARY) + ln -sf ../sbin/dropbear $(TARGET_DIR)/usr/bin/scp + ln -sf ../sbin/dropbear $(TARGET_DIR)/usr/bin/ssh + ln -sf ../sbin/dropbear $(TARGET_DIR)/usr/bin/dropbearkey + ln -sf ../sbin/dropbear $(TARGET_DIR)/usr/bin/dropbearconvert + cp $(DROPBEAR_SSHD_DIR)/S50dropbear $(TARGET_DIR)/etc/init.d/ + chmod a+x $(TARGET_DIR)/etc/init.d/S50dropbear + +dropbear_sshd: uclibc zlib $(TARGET_DIR)/$(DROPBEAR_SSHD_TARGET_BINARY) + +dropbear_sshd-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) $(TARGET_CONFIGURE_OPTS) \ + LD=$(TARGET_CC) -C $(DROPBEAR_SSHD_DIR) uninstall + -$(MAKE) -C $(DROPBEAR_SSHD_DIR) clean + +dropbear_sshd-dirclean: + rm -rf $(DROPBEAR_SSHD_DIR) + diff --git a/openwrt/package/iptables/Config.in b/openwrt/package/iptables/Config.in new file mode 100644 index 0000000000..f1e5ef631d --- /dev/null +++ b/openwrt/package/iptables/Config.in @@ -0,0 +1,7 @@ +config BR2_PACKAGE_IPTABLES + bool "iptables" + default n + help + Linux kernel (2.4+) firewall, NAT, and packet mangling tools. + + http://www.iptables.org/ diff --git a/openwrt/package/iptables/Makefile.in b/openwrt/package/iptables/Makefile.in new file mode 100644 index 0000000000..5be894b9a6 --- /dev/null +++ b/openwrt/package/iptables/Makefile.in @@ -0,0 +1,3 @@ +ifeq ($(strip $(BR2_PACKAGE_IPTABLES)),y) +TARGETS+=iptables +endif diff --git a/openwrt/package/iptables/iptables.mk b/openwrt/package/iptables/iptables.mk new file mode 100644 index 0000000000..f053f1e33d --- /dev/null +++ b/openwrt/package/iptables/iptables.mk @@ -0,0 +1,51 @@ +############################################################# +# +# iptables +# +############################################################# +IPTABLES_VER:=1.2.11 +IPTABLES_SOURCE_URL:=http://www.netfilter.org/files +IPTABLES_SOURCE:=iptables-$(IPTABLES_VER).tar.bz2 +IPTABLES_BUILD_DIR:=$(BUILD_DIR)/iptables-$(IPTABLES_VER) + +$(DL_DIR)/$(IPTABLES_SOURCE): + $(WGET) -P $(DL_DIR) $(IPTABLES_SOURCE_URL)/$(IPTABLES_SOURCE) + +$(IPTABLES_BUILD_DIR)/.unpacked: $(DL_DIR)/$(IPTABLES_SOURCE) + bzcat $(DL_DIR)/$(IPTABLES_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + touch $(IPTABLES_BUILD_DIR)/.unpacked + +$(IPTABLES_BUILD_DIR)/.configured: $(IPTABLES_BUILD_DIR)/.unpacked + # Allow patches. Needed for openwrt for instance. + toolchain/patch-kernel.sh $(IPTABLES_BUILD_DIR) package/iptables/ iptables-\*.patch + # + $(SED) "s;\[ -f /usr/include/netinet/ip6.h \];grep -q '__UCLIBC_HAS_IPV6__ 1' \ + $(BUILD_DIR)/uClibc/include/bits/uClibc_config.h;" $(IPTABLES_BUILD_DIR)/Makefile + touch $(IPTABLES_BUILD_DIR)/.configured + +$(IPTABLES_BUILD_DIR)/iptables: $(IPTABLES_BUILD_DIR)/.configured + $(TARGET_CONFIGURE_OPTS) \ + $(MAKE) -C $(IPTABLES_BUILD_DIR) \ + KERNEL_DIR=$(LINUX_DIR) PREFIX=/usr \ + CC=$(TARGET_CC) COPT_FLAGS="$(TARGET_CFLAGS)" + +$(TARGET_DIR)/usr/sbin/iptables: $(IPTABLES_BUILD_DIR)/iptables + $(TARGET_CONFIGURE_OPTS) \ + $(MAKE) -C $(IPTABLES_BUILD_DIR) \ + KERNEL_DIR=$(LINUX_DIR) PREFIX=/usr \ + CC=$(TARGET_CC) COPT_FLAGS="$(TARGET_CFLAGS)" \ + DESTDIR=$(TARGET_DIR) install + $(STRIP) $(TARGET_DIR)/usr/sbin/iptables* + $(STRIP) $(TARGET_DIR)/usr/lib/iptables/*.so + rm -rf $(TARGET_DIR)/usr/man + +iptables: kernel-headers $(TARGET_DIR)/usr/sbin/iptables + +iptables-source: $(DL_DIR)/$(IPTABLES_SOURCE) + +iptables-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(IPTABLES_BUILD_DIR) uninstall + -$(MAKE) -C $(IPTABLES_BUILD_DIR) clean + +iptables-dirclean: + rm -rf $(IPTABLES_BUILD_DIR) diff --git a/openwrt/package/linux/Config.in b/openwrt/package/linux/Config.in new file mode 100644 index 0000000000..4588e48efb --- /dev/null +++ b/openwrt/package/linux/Config.in @@ -0,0 +1,7 @@ +config BR2_PACKAGE_LINUX + bool "linux" + default n + help + The Linux kernel. + + http://www.kernel.org/ diff --git a/openwrt/package/linux/Makefile.in b/openwrt/package/linux/Makefile.in new file mode 100644 index 0000000000..3b62d24c1d --- /dev/null +++ b/openwrt/package/linux/Makefile.in @@ -0,0 +1,3 @@ +ifeq ($(strip $(BR2_PACKAGE_LINUX)),y) +TARGETS+=linux +endif diff --git a/openwrt/package/linux/kernel-patches/001-linux-2.4.patch.bz2 b/openwrt/package/linux/kernel-patches/001-linux-2.4.patch.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..3e68dba7a3ead1614f99f4e8ca9d731acae24c44 GIT binary patch literal 428187 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%0A|Lxf+Lk?sA<g3gRtpMnr!ceyjffCq(VR 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⁡>M9N)p1iR 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 LoG3^usiO*jkgQhv literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/003_kbuild_fixes.diff.bz2 b/openwrt/package/linux/kernel-patches/003_kbuild_fixes.diff.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..cc68c5e7f4f583a4cd3d88522fcf28a98936123e GIT binary patch literal 1091 zcmV-J1ibq~T4*^jL0KkKS%uS1+W-NL-++2>b^rhWfA8NU|L@=KPy~4PO`{gs002ou z(uQgtng*tt29HpBngD19fB@07)b$!1WXYpIXwwmqp@?8j8e$Aag9rdHNRU%Ww21W7 z^*te=X{Ksu42?8-Lu5vWsAOmd88T?l8Z^XYXkr)>Mwo*UpuzwQ5=aO%nl#CvjZ<oR zo}<b(qtwtcX`p0e117{&1!BY}03gG!ArJ%v0*NRXF`>3U8Kak^aWP_G+hJp}$S?|~ zLMBL&c-rnB8S@dRFUn@jGP&<tCW&o@Ykh7~HFZe@xuWg<i8?LcsUYS^228?RGk*VG zEy`{=&adc@rWdfBa8FxI16W;$Qr7*JHDOrQlANNrm7-*~iU`Mw=9w80W1T)!2!%ve z)RHx$Oouoe>({3vC(xVJ(GHduPpD02R-|!;)1Z-eQtlXdLxu;rbdr%Mj$w<Y4;>W) zk9a`7m4o`!!d<Du6{)8V`HemDFVop~i&TtAF^2f^9)K#23zZr(Vo;Dtp1*W0hBFTc z<j0Wvjow6cm+O>>2o=d?a`-*`9xA0En5m@7x#JhNuKeDepFJtvoHuk8yMnbfB^{BR zVAwD<1nvtmfmN3f(9yTvgh?QAjW(YEuB~OF<2*zhBQb8SJT*i^a9-c~Yl@o?oI=Oy zfsiN^#l$#X5o#9%Nc0LK%uJ4tMEc?{g{CREQ(FP1J$MBdPC}xPrayQvOiVm&4-}Ka zs-*Ni`dQN+_reTJS_N<pL!ersa3m2IG@o;t%P<z8xeLMZBzNs5q|E|NEu^z)M?r1; zhH}G6ynV2i%xe(otP~iGqXAHWc~T+ntUl#Iww7pCCllp6%%~QTF-(8v<Fy}oxS8cF zAYw#$++I2c1|pJK58{KY!Oa@S%=S<Z@GRlPJS+5rkP3zY?=|@4v6oJErW9Q#fgQ9- zU^&WXZH+vo46Y9QQ86CEOU{%EX!SZ_`_vxO+OWB;g^mW$D@p@Y=OO`+u?puTPD6l5 zfdrt+w}lt1$%m@siwT#L3d<~33UJ`%D^WuQT1BkTT3$6~2FnH>5C|v|fezTB@|7bb zRPBMuVjO!6JG@RLjlqu4y21q$O_w;ugU(V=G@;W=fnc5*loGU}<_dHX#L&2>2B8cT z8!MSj3=EA+LLwc8si~X_&Ev)fD>a=53Xzon>`zo-kzI?4bEXbrAU#B3#R#GTm`UT& zA%+i)hXT!13|ekRLfkmEdrZ@ZsAffbgNd1#i@<TM!Q@7uqEAp#E+9VQIO4g|nojbO zP&ANXt|q$1wM^IYYb#56qk!Vjvovj80V{&zGZN%htUtl#19%7(zDfjdDqSKbBQl`a zm1>}R+H6*s6v=F;>Z}U*p}|1fQY=uYwMk%}A(P6(S+enbs*7PT>*ij5mHK<d+>uTc JBq4Ouw!l^&?^yr< literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/004_386_emu.diff.bz2 b/openwrt/package/linux/kernel-patches/004_386_emu.diff.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..bab1ac54ac2db68f62f361ee907ffdd74d568ed7 GIT binary patch literal 5292 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 literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/005_modularize_vesafb.diff.bz2 b/openwrt/package/linux/kernel-patches/005_modularize_vesafb.diff.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..f8efc501b8b85e106417a400196675612a730df1 GIT binary patch literal 710 zcmV;%0y+IcT4*^jL0KkKS*#1MSO5W%Uw~RLUH||3f9Kyyzwh7rKmw&Wg+Rhd6CtTj zCMo)9Ps*E6(=>)?gUUT1Xl+kZPbhkxrh`>KN_vcF)W`rD0009(0000S0|>%th+q&5 zfEY%ZGGQ19XcbdLll3x9HjOFiF&b!SJtIRv8UQpj07MFd;%hLIHy%Fhx|_)dcx-(X z<z3RD<>Rw7`5}D4KTA#ioC^~GF~z{-ylDC6)Vo-rc!JMAJ+`c6-h#V1pU8v=4uf6V z_>{765)QvFAVMde2rn85HzPq3qpF5kzgLzvs<Lrn>(1;2Z+bapTEFJQ7!~eymvKsK zu6IQ%3NMT>!;)k}4wm;BVZsbf<4F+8MvxkUbv$^$c^DUY?iP=^z;N4vvvLrLo1=`C zgdBy%Z&+)kl!@^w!pf8(&@u4#t;Jg0pz@fUw8|$bt*uryO|U6Ggy)N6Rqc|<Gi06h zl`OOC5n^eoSEX_7COHMO2c%50Eazy<FmwHpsv_&nlqS}CB+c2c@A%jm=exBXNo2$M zq0GIP(w>T8Qd=(bZLO)MOm!8d5~C7Mhb^y0DMikXF~g9`4kC@OlY!*ktrNC_^EsPz z3NFx;M=(T>@+kTNzFVjLK7&YYxHxYpTV&Zk6D9BNIEI#U+szWy{*GZwVMyqjjsgHP z?A-*62YaV@94H}i$x6_wlGkGv_H@X9U)=>`dREV1v0;0hws;$i(vvoPx@N|2k(+`X zoc~LS|C(YVgQbAIq(S%FQYhV~ySG`sE4P)5v2`awLS{+C6SpoEl$}Q6tVS*jd}U~D zv1s3}F-;O#wUL!HV`?ZVh5KzA=J2g#F3wFKn<^}nwxyF+$=etm7_l1|=Or}BVG~cb s*BLQwv#-yFEu{t*=kDG$nfX%@ID%BnfLTzaGnesqBvXY63c$McfT8zG$N&HU literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/006_init_unshare.diff.bz2 b/openwrt/package/linux/kernel-patches/006_init_unshare.diff.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..374282dfe6520cbb2b6c6235ca4e4d6524d6da5d GIT binary patch literal 299 zcmV+`0o49NT4*^jL0KkKS^UD+EdT&9Uw{HILI3}oKmY^)zwh4cFaZWE8ciCfsfL=G zX{V^#fB+gaWEzOb(@h$hG}8bkA)_V$N=BfYQ%y9`149HF44Mi932GZb%;RKlv*J8U zQX7FJm&M|LTM8lEl-OI+<paRm2f@j78z@Y>b&}9Wz(I_n?Jo*62Jou`262JPj;wyW z&76IgPmm=Tb{KUWOen%od}z^*Ads}Q#1A-lhfCxIq;V4!L0U+T3kL0E>F}&-=cHB8 zQ-UdY!_qNciSgnS56p~$6jh+Agj{9G%x!{euP-%;JD2I+!8oKis`g1*Ef$C{EJ;ZV xQUSCBB*su+u-8KoN(o^_WCHG407wfV&_%v;@Y^8}hqX5%?ntK!5+9ga<)Gf-e)<3a literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/007-scsi_add_remove_single.bz2 b/openwrt/package/linux/kernel-patches/007-scsi_add_remove_single.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..aca7fbd25897daa1968c653c4c236b90b24c2cce GIT binary patch literal 3988 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 literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/008-ieee1394-fix.bz2 b/openwrt/package/linux/kernel-patches/008-ieee1394-fix.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..7047e3d29deb421a5df8354f1b583dcddd6e6dd8 GIT binary patch literal 390 zcmV;10eSvHT4*^jL0KkKSsoU#I{*MaUw}d|LI3^xcqEDdzvtiVFab+3FqEcgN$Pnp zQK#ww4@fd;nF<1WX$Gn2n<?o=Kn8|@&;g(T0#J#iKSdv-Q%HK5q65?bG|*^0Pua`J zeiBUxxo+o+-^h*r44g@3dkF|`&DQ}XCW4Z;z$g&~oAZ1d+*1bNybw~Vr#?v=O?^DA zv&qOYh7ypRZ~AjQHQXy#0nWH)I|YfAC}Y}UcQKse==go*Cs>@Kn3N277ZVALI9?a0 zA^P#q8ZnU13WtoCJ{&+eR=oBU*x^zVfx5m)M3o97GgrpNH(AEUY{(k4A401&+s^uK zCeA|>QlH}3Bi<oVYiOP&?xpeouI7=7m!%z3dzJFj;#|{iA#vmnFxHMprYLz({H3BU zXPRGP#H`ZR(Y6v7S}Ryoo5eb_D2D<T#_=Q>+XS5jW`L!a0|~(>B$-ZYX#s_(MZYpQ kvZ$&EAp}VPVTe&o3!pi{A3#XS6#t94BAh5l4+~hGfb0#b?EnA( literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/009-always-inline.bz2 b/openwrt/package/linux/kernel-patches/009-always-inline.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..e81c1a0e2ea7b17727a167cb0e301ebc60c70269 GIT binary patch literal 468 zcmV;_0W1DOT4*^jL0KkKS@yEVW&i*~Uw}d|NPquxPUqS{zwh7SKmn%?&A^mI)MY<L zsqIZQJx@&#(?9?;&@h`&HBU+CjWGxs00000007lJPby?$Jt3xsjQ|)%BR~KGQ&jYg zH5!1?rqpOL8&hcjZA}J%NI>)7r^T|fN2t8f_K9kgQMFh_K}!_PQ1-OZJ-qRQ>b5Lb z0~2rMdgQ-m>oHw{50y$B_fG8Zrx=S!XAGeb%Un>&Mj498VhP(l4^rwdlx8tgNswy< zWh7{GY`h@dP~qO|qd1CGCJ$-mB3>zS)K!3$8gJMxD?7PObNGqc;m;w<h`C9q)Jo>Q zNtpE(u^i-(5g5i0V%4A%7j#+~ES8jZd`Le+3NwVvmx}1BW<fYbnIk4X1MIL<23(g8 zkOZoR9Z!CjKnie*BZE%zR;!K57vAZiF)h*)%sY<ijCLrOH~Z5nQWgrO2vG=>)>~-& zgN<S;Ath*HV-RVBgC-ibV4ZD1y%rjy9vR|D9IjGNiP0JmkgA>8fzt<xi7;W&!}*~n zGz;)1dc#~&K=kL(!i_QjOkJ=k!zxN9qyt1iN~ACY0K<%cP;r20D3%`vqFf+V{x0N- KaG@dXWsJ;m>dPAd literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/010-optimize-for-size.bz2 b/openwrt/package/linux/kernel-patches/010-optimize-for-size.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..9523e475d516731bef85e96f206d6b912a90d9ff GIT binary patch literal 1201 zcmV;i1Wx-xT4*^jL0KkKSuL2!TL1v@Uw}d|eDDAAfA8P4zyJU6Pz0(?y`jA0BTkJ0 zC`e7I>Y8m$s5JE&WYa(gq-mfAO$HzVs%D7vlQB&vq|+lKMwmko#2PUJLrhE(gaCj| z8fi4AsMFLmG{^wR4^SEd)DkEtnW?5tsL`RLKmZy5007Vcs;8owdPO{^l=VGK(<ITO zO`>fhC#ZUwG7L<O3{S^c0aNz+S05H{BPz2qgSw52)M~>T;g2@Q1ka9!bKe{Pmc!Q; zzpFFQ!z)Dsk(EH<RXE{#DTFyxO)3jul>)dBpbIwZlRRZvJ?a6Hk}YqKs%fO#+(~!9 zw1f%;qN7katSywcrzK)OK42?__R^7cE_hvXZ>`2wgjzIWVi@?%*aDb>T+`a*7mX5e zEy+EWNZGN8l`UeXiU|TsR8H;EVi&v2@2&wY&<d)BFG)XED8Nve?lwkKw4QUJx?>`e zBeiF%F--en|6Q7olJjP)<IVR7d#0z><nVzfCBprP7S0@+`j3eB)kN9>LZ}#6LwfH7 zCMH`xG^+B?fmv_X!LVaNGf=cBBb2t*O(<JMO#f*mwIX|P_?gI&V_2#vJvBSvNGdt| zH28stc>~QOxa?6aG3`oGp@wtq$QQ&6!UxQFMqx1n;`0d#3&VDExUVjGN~uaKGl(@T zO8FJ|@J05}$!<Rb#3^d*#nRBA!o-Lt5m=ISK@mDqPeTaIF_?`viz<ay=W<*O2WW%P z-9p1<L`+PSXXnA6#Mvb?520rjo0uZngCMb2ZGuzu396(ImD%oKzl{2@&Z?%W3t)R% z2o|MeAbeCwTo;>8#PVsog#^`o+Et}kl|+**{Wn~3Nb?6Vwa5^Pyrv<ps1wfwidXT% zf!6}TI|RW;U{%G=zl@Wr2@y?SRI@u_*CgnRsakP~bmx$&3iaWrj7-2>P~}u%%8i;g z8g6=ht72RCmT+4c1LSwN3)LRsds$=Ndn9rfLkQBZ)`eN3KbVM;WQ3#xDd%1h<B{%U zJe$!;2voIFb*wMiB&lc2o+6<aX2&YL9GeB_hTO4qmFu$vm&MWWoh6fO`5Z}`G5T_> zR{HA*r-&|^AsHHUg<de_!3?=)5`wqT(Y*)hi3;)Fa;|0(kZ5^L!ULX=20@+=Ol*;r zM8!MA0xT$`Y+@fNe>zJN%uR(VOR3-6>})c2Y#ndOUO*@cFqJPMa%40ek7lsdED=D( z>Z@~fE;m*zi@ky<Ev%DKLJ-*w*RxBx1!OHDWhiA%<#)<hy>OH(FD^4hcUDxXD6tC= z987Yevnsi$y`ZTRgn~C9wumx9tJH)DPGHEdVBnY`Uh}4I=9X-*H%~I>dR0N-rz=vp zo<;c<;X+wQ<0fc&&aSxK6M+GZ4u$BcL|z7ExZEP5+ZfE-X_n_$opUk_c<Qh<Ac`BL zR91W1?HFo1XQ-<c!Y|^|6I(rX*7V@)GRa_~xKO!KOdT%5!0G()r0Vsv@RWu;u&G## zj){1L8CL|Onu;*Q5@eGB%=o|*ragGnkq;hat;~~>>MX;Civ$WY2Ml*<RFdc6y+t^Q P|BJaIoG3^Z%w(;A1y?Z7 literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/012-x86-check_gcc.bz2 b/openwrt/package/linux/kernel-patches/012-x86-check_gcc.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..1f76f96b04af2897535e3f1f47d630f4ea0ca411 GIT binary patch literal 329 zcmV-P0k-}^T4*^jL0KkKSr+p)(f|NB-+%%zL~sAnYp>2gum9FSFabEw7zzLY3IG5A z00Aner1dn(jZHLYFpV_PpwMZi6F`bo@gpWiq<ci3rkOM}Y3etjPgB&>)b%Yf^u;#k zVzjGRZt>YU+?~zF-JWA<Mr`yaCoq_7y}`MeNr?|z`?s)nmK8`UGLmRy_rVFzNjr0% z2H6xpM`+|A@G3hA7ncxJP_&_OL%giSp>UL_LdJf};~7)K!%0p?hGxOl0NMnJK(<v8 zW~Ly@WP*@bI*|AV2D9)qZ)TXDiMV$Ukp5CNZz4m(i4m#^;&Dy}beY6%EhQx8<UY?b z!{~&bPbZ?9-zOCHP2~@Z>Y7Z+(eq0Z5(w>d3wg+EOv#@?asGTt-h|ss#GbH0P?%`~ bqlSitRXYy2Ian*O|BJaIoG3^Od7Ehf&p(#N literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/015_cramfs_initrd.diff.bz2 b/openwrt/package/linux/kernel-patches/015_cramfs_initrd.diff.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..6731cfaca4dedad833fb2697e4c8ab2758b86b14 GIT binary patch literal 406 zcmV;H0crk1T4*^jL0KkKS)?>R?*IV7Uw{IzK>z=HYUA1vzwe*0FadLBv<XB_H5k(= z>PDJ+Mt}gw(<9UY>IyX@Q)xV)XaS%A3IH@{0F;wWLne$y)B`{O02%-kLehC860sm5 z9d0r{lw{-GjtE2|B{*BI?pM>)7btT{k4#LcV_YTgDqWsEsNnFX@4a`@!<7koEB2n_ z23!cxT94PtE+Luo4}yWlEDs>#+Aux^04IWsbAm>Sz~l~96L{$<8c8a35JF=2yr3Qe zg@dtx=Tj1Z7*$3+HR2g#6P<PD@M&n30oF4<y}Pg3P5XL2`#Vbh=~=OiYs;)Wpu`CG zm7yeT@@7^r3c#0O9v^-(z00u#(PPtB;$i!OomoLaCXawa4_m>wKHs_+RtSWWh{SK_ zpb3_Uqr<VO7?4tSH<Do)2rzJM*jgB*gBv|7G~p5tYgR#_gOo&Lu|ZHubL5_pWEWKz zh@mJ87b7hRwb)74S|N6zpl<vK%Dk~gWYIPbx$u~9ENe{BWIx5+kxmpODGCp}z(IAd AhX4Qo literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/017-printk.bz2 b/openwrt/package/linux/kernel-patches/017-printk.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..7ffbd12a7a586943f950615f9dd7250bbef2e169 GIT binary patch literal 336 zcmV-W0k8f-T4*^jL0KkKSv0~FzyJU;-+)3eNPqu*Kp+qRzwh2~FabJ}VX2`{CWvJ6 zWi)6RG&E=mq$xBC05kvq02vGtrX(7k6+cw+gHIv=GCf1oG<^wWO*b>_o_ay)G(D6& zHGkSv?xlL*o5Y{L6Tcy7r|@-dht+~6o<&le{<gfw;CESA<daY!b5QFe0HE+w3giaV zucb>fFR<#{ovMF3WeJ5u5JE&uMjk?=3UC-!6U`rBnvh}~H%2^1kCADdj1LiZq0#rB z7Rat63X-;=YqZw@&T#_~9@$!ve|=N_gkVIrQ-U1oL!N?*t^+0-U`Z285wK=N<|PV@ z*UpGYS`5nN6}{F3ZgNG`PIeG6M+k$YP0@jE*Wi`6WL%iBNx^KIRC=aOZ^vXWAn6K& iO&68X(f2w#8HGY{UVu`Cg1}c)XcuxtI8cx@!W6(l1dUDr literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/018-slab-loop-init.bz2 b/openwrt/package/linux/kernel-patches/018-slab-loop-init.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..308e576fb1dcd5c9c58b6d18699a0b47375b3403 GIT binary patch literal 268 zcmV+n0rUPsT4*^jL0KkKS)USqB>(^~-+%%zK!5-LYUKa`yYHUTFaXwIN=c%6j7_PK z&;SYm^#DB})CitUA%w|^kYvPqni!b?N~!*)rjtjg8fXEa0000w5KBS=mShrnR!|f8 z=2#;c2J;Du@LIS|G#|KPOsHl;qeFDXbd-{+ev*M^G6R{KI)mb<I&q1`417lVcOD9z z!V#E|fWyZE)yg9v!-vbIh>;<*s98Bx0<y-UDUjZ+BB|ozmsdkeB6F$9o6p2jY!;6< zCW(8|sNWrDr>R3$NA6B<D`|0s%}Rj$(qM-42_&OOKj9Fui84<ep@a~Wk`L~fs~KvG S<jBxp@pmLsg$W7qC*n|;8h2p; literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/041-changeloop.patch.bz2 b/openwrt/package/linux/kernel-patches/041-changeloop.patch.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..d822e8a092ac76893a400e959219b3985a4a7828 GIT binary patch literal 2783 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 literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/042-loopfixes.patch.bz2 b/openwrt/package/linux/kernel-patches/042-loopfixes.patch.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..456ee6145af3b5161ac8329f174f4422017360ec GIT binary patch literal 640 zcmV-`0)PENT4*^jL0KkKSu}j=A^-tH|9}KMi~wQ(@9S<SkIKLA-}*oTc^xeP!ch=q zPt;^XPa-rLG-v^!Xc#n_G6xwlX{Hk+AYeu&j1hzyG{69YMIuiLKUB~(0B8UiG{j^y z!~npQ5;QbSr1lj&1c1Z<Jwc{`0pgR*c!8&@1;9$yX5PfGZurrfTDw>(NY>3tWuT>r z6_CUxnn-O3afrwzL?ms5Pcg;vah&TnEW8YEfyP_!AWL|7#%U;8be~nC%)oMuxSEa6 zx+088Nokq|ca$Zewk_N+7R+lr+L$p`LFt*xi?8vEVbU)l(rhY|h*B#OXG;$3J{V$p z7e&?(PuOu*-U!ofiU@|p@}1zO(CG@gQ+TX5MmTj0WTM6L1)MavvN4UkS<5?TQB>E| z%Tx@LWe*~_7zE!)lA}&F&k>Qunx!T(D(FWhC^e~^!&On}RZ9+yqpM#YGR_Dsw5OkH zCbe>z{7D`Y&`dDL_&pt~gMu5>S}Ih8!M<aUv@iP=n@!B8G=nHerwO{Ay>!S(zp0p^ z>kd5;`*6;3KGor)D~L4b7u+gRrn+e_QmB#UC79F}6cQpAnAwgA3&u4oD;@*;0z&n| z8N?+qROU!ISg^U#aiq48PQG<Z`J|KutXrHiM7Rm{h8?vNZ6K*%BD?}2up$JB6(HKn zjm5>M>FyQEsX_=U6i_l65<qzrFX6QL^c9gJ31EqFsB@gzjRXhkpmb1*j3_djZ*a~) zFu;n{ra>{7m`o6m;N>S0@}jaT$+8K^(W=cT$y=laWj6$dsAO9R1rv{$9I^d(7$D-z a5f-pw30OWMA$$3s;_gVN3K9m7okT#Z7aD8; literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/044-streaming_io.bz2 b/openwrt/package/linux/kernel-patches/044-streaming_io.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fc75024c9f8f81dc951599d2ef56a4d8074b443b GIT binary patch literal 1743 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 literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/062-silence-blk-queue.bz2 b/openwrt/package/linux/kernel-patches/062-silence-blk-queue.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..85a21e5f6fafcda2eb801fcbaab58d7d4c7d93b9 GIT binary patch literal 374 zcmV-+0g3)XT4*^jL0KkKSwI%?y8r+^Uw{fQT7UohW9G~RzpwwwFacDoXi9}N(@c#6 zK+tKR3INHbAOI4kjZCTFr|C=y>KXxnk3_^8VgM4RgeIrxX%qEFpnw_xz+`}Wo}<)S zgcX_uYYsl9;QfPjq?I@MBx*pVfP~*#(CI2CD14VUS}F2n7Lsj9&uSOf7ahlaR}kCm zADyuBopPF2SfI$1sI!aI4{23_h6`g#)+UVtd=<!jmGG=o8A=R>)f)y!NGZq)$2r)G z1wspb2Z-5REuvEZr{hOBK?z1XFHG7q2^-Q1FA~P=Q$Hk5M%P(fm#}_3Amf*D=xJ~` z5w@&hJp%JE>n`UH(QYQBB9I;qAz&d9ZDr$BOkSwLYJ=S@y9bL%3mGFx#8wBvH>(JO z{gCCL7{TY!dO#|$oESz>Rs68vpea>xBWDqj2gZujc=GXC%%stHoUD=bM~Rj&q$VFJ U2O4jKWKZ#TBvXY61OaawuxY%Z@c;k- literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/063-silence.kbd.patch.bz2 b/openwrt/package/linux/kernel-patches/063-silence.kbd.patch.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..472eb28dc5238af5047c1c39d3028740f4b5a12b GIT binary patch literal 506 zcmV<W0R{d-T4*^jL0KkKS-?d*j{pE;Uw}q1dVl};|Eu1Fzwh5_KmpotoB~oKRNk7C z@}^A&X#fYP(AoshXc})yY3c-|6+cZiPilG;^*v8hPf!2=10kRQG72f`WQIYY8VVW! z(V)-<jQ|5cs-_}F$p8Z*K+&MnK=m2`XaFinoB@yq%77UtLtq9KWW$@>D5#^ylqE7o zny86siwd}iD0(QzmkI^Hqp!2~UjT2FS_l{>zQONNJ?c-NP9bb2Ek&ZJo`@y1Xre^W zF0&*5r7yv_O*1DfE&_`z6K6-Fv?xnG6cAyNISN-u*t%A&huRRYUGYacG5J|-vV`WT z5^@G2a}>!LhHcI{Ot(2oOq2_SE9EmSphWs)lsJ|ZS+-xacC8t6sz$<F%CsYBpxV7m zSFjZ~SDy06jT7HaW+hsPnIw^?GC3L%Y;_9GG1AH!9kVMl*kr|qZzKr0crlgFXI&@R zh*4S5m((hxF%K-aXmKF6W)}}1Oun?hn*Q;%jkaOG*&tocNY5ZaO$v(CibjNs3TzoA z0*zb@O3UKGsccFK`C3eqjW{aq2`sichE#(I*5o|Kw54O%VVJ{NNu3j4LQhcPN(jw$ w&v3+Hnd2lZB(ZszvbQ}|MczzH-($v-NF~9gK}6u|6tD4jBvXY63<OiS@T;xaZvX%Q literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/064-shutup-md.bz2 b/openwrt/package/linux/kernel-patches/064-shutup-md.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..89ab47a2b5990c27301cc20892420b2faa6e1784 GIT binary patch literal 501 zcmV<R0Sf*?T4*^jL0KkKSxNpX8UO%mUw|SoP=Ej1XK&r4zwh7fKmpw%LqbXwKU8`& z$pZjGY6?9OqfIb0Ov(d6sY5oY={-!EXfYaSXaEL4G&BLB%n6C0!eq&lBME|OrbZ?J zh5;f%Q^e3y@~7z&$b&)Z2AMR-00*h!k(g?Qt{HQYF0sjtxsXASeePY_;E+l1bZQp4 zj&mCr1ftQvpX*iiSdBUCWvL2U)C;{#Kr4HQpKi!>P}6{XoQ2iK;aN(7NYkB@6Idx} z%lm*>sTr1$!lu5K*#y>+(DocTi7J?M2E(hXbjHsS(7boZq3u=y)^m_pT0wYNWt$~& zR22^v+m&Ww(({Od17M^`$YX%?ocIdTvtG(U%+cZVEJLTnO;?tUro%}?SAnow-Z;UQ zQ9zW2Axz?`r?gRun4h{P{2*eTZ-9h(RGmsD9KzxvbSmxZ`THZW!Z9kSpGwMYITc~Q zY#WFMg=<DtYA!iBY3?Yu=-&V`^WZP(GNiA#`jG|MaV`r<*`WOpFUCUXkyxy}nRVC@ zULRpZ^Kpct)ui4m5+$FyxDr+U)Wb%jQm+YdlrPTPcxnrUN`+zEDl<T<1XPuyOEBR? rgUzQzATnf-4g*FKM*xlxR16Xb2q<C15N#g^pZ+f7ig2MIll)XPV8rLH literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/067-squashfs2.patch.bz2 b/openwrt/package/linux/kernel-patches/067-squashfs2.patch.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..2772d734ca0e02df5f2a984020953817859f7072 GIT binary patch literal 12850 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 QdH?vkk}1N3f-Ve>;Cy3BGynhq literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/076-nmap-freak.bz2 b/openwrt/package/linux/kernel-patches/076-nmap-freak.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..4bd53a8a5b4a5378b2f6a249d0c5ef2752606db4 GIT binary patch literal 1577 zcmV+^2G;pPT4*^jL0KkKS!CAWO8^0JUw~dPegFUe|L@<bzwh7rU<Q5kwThI`$y8M; zs7eY#Oqyr|Lq?4X0B8UJ0000Q4jLIW(9<JBOpJpgBSRoDG-S{QOpHSuG%{(SrbdRD z83sm1hCpIy$)F6G7={ueAdD%LpM_5(Z6~8sX{g9(KT2p~0P=tXY8*5&X`!Y@hM5@# zMn;A}Vra>r44D{)5<~=OKqWsSdQD9|Ow&-)BWh`*Oo6onCea&H(prt6n0~*H>GuRU znA%hf8a8ez<Aa=vcV=ko+d${zx){^%_TO0ESKI6JLRQI&Ll3p%CiP&qIBWN5E{je! zCGEbfEO>_TZ;w^=YkzF^Y`0A`Hi;J~fv_4fXov<e;W+cE%T05BT0T}6rY=+XR_xQa zcMmWgK9l3`g5*J%>g75CX$njHH2Y0MbRJ#)NJ0;#^4?OyNT3-jo7FM|5Lp<)U>{BL zhlE3w>W>N;y9R9S(}cq)b>*jAU`+<I8AGqn2rYm$@ViBO;=>%LsjwG&tngtxB+itb zHP-U5ql8%)U9Lo>`sw6!@>>(h#^ZM5KTitI+wsVtw~4Vc+P)Gf@r-#Mn!ueGH@O>F zf7}&|S`m<#CMGDsfe11>KF>MP@Ob31@9p(=e&JIPz&JH<t}TZDr%tY&f42-tM1bQz za~*u(w+X>$1nmUQkuh88&GCGF%Yj}kV)Q`R?)rSEpTkSfGK@MFbIpO;;48}%@3Q2J z5hBgK-I?c0)p8h$H2}GnKO9-03$_YCw}N0@0Jj3LDZ~>TV5A_hV7L;9H2g}yRY%MU zRP>A!V~fF4RE4w@3^Fnk!z%)%hKMWk0|KbK5>lN)hrB6U+BpFnB+THebl?z%R3kA$ zGL+|kb%G}gU>*Ss0Tn2jQu50P#g8a3*z&IE;~g*Tf^8`fLcMO^i5*1>acJ}iB7?$% zu&^CpC%i`RJlXEARXo3DpgTS0S0lW^)Yh#;P%*3i2%%5<xl(6`&RzvuU%wHw<VY|D zEW0s?D9Z3AP!-@nh;{ZH2wakFmnb1ItkwpQv*!z`j4PN#XrNPql5b~`nVB;HR+RyT zlVqHdUJAx)*E#KXS%~xnfG~#10l*p|wXs)F3K6g)86kr&urC3~0jANP2uabC3RKOg zD{dgsj1`QY7?-LmnrsI_*#Kk|i?9%u;4^NJV<)8o;fPKDFBeNA&<c1wsU33Q@k@Q3 zaD8P;`}7xB&yj+LRVg~!hqo43m&OEU_oE}x5${Ccy)jv&sG)-KlPq;cy&8I8mQSc! zpA-t0nf>kOuQhN}X+VU6=u!ZHdWo}va0>MiOks?0Vy#fnENzui^uhq%LS5Lolyq#- z2-|5k&gDotn;GeWV<{U#xZZ;6#yB2Dqt=yXu=pc~0)x%RcLOh8-9`mb>0qGNklBlo zv%!(wVD3wiv_FJ<@I+Hf99^iDA!K|sbmcPBAw)X^yP&DWaVwLY1CE|t(NLWRnnxc| zy>{?WIgi<^wF2<2`c~7|$KMuND}_78WdO@cj3{JhyD6f~hGUc)V0iEmL}E*p&<03^ z3OgWjWR2q(Eld_LWRYFX!`#eAw}`vOqb=FkPdTO|0LMw4D{D^?xl?u}=QB)VQ^rMF z?EpLTLi=&b6Llhk^GZPKFc=Qy=*f|Q%aL+sL0hF^eS!v@u!fPm)vc&9LEu}ci+1*r z3krpavd`id2gIG#%HB)11>)OrPSIZ%R~ffKp3iUCdReOk`-CVO2yokNwl<4Hh+Pnl z&j!OKsNpW&xq}o12{qZ>m}lOM#AOytxd?^nnSpZiJ~g=H1#(aV^{|>!-?svXKeF{2 zCih{byLoa(%*PpX=4s0GOa%(gE=<?Mo>XA|@pF%|<)T#^ikVJq3!iaGnVWHNIK4aF z5E`&{8<54D2ZQel<$_98mR3zw2rZ*XtdYvgZO-J@j*OQSG}~n0Rl7E5cj*FSiwnYY zze5a<Wr+}&Ff14`g@}X`_pU6g7B<$(SJ<fC^AyGvsd7gmOPbKIs)XCt*o;mTs1jzf bF2!Im3+LR4?Ku=$5C0c(ML1B9WY*wIECt_m literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/077-orinoco-0.13e.bz2 b/openwrt/package/linux/kernel-patches/077-orinoco-0.13e.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..61fe9bb9644134c2d15f1694ebd41d8667b967fc GIT binary patch literal 7387 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 NF64@Ep&?TgBUo!Y#|;1g literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/078-hostap.bz2 b/openwrt/package/linux/kernel-patches/078-hostap.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..3a6f819081d310d55b05adf7de801b91f42a0ece GIT binary patch literal 113612 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 literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/079-jiffies64.bz2 b/openwrt/package/linux/kernel-patches/079-jiffies64.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..498f1fb3e4ca660c14de5a51566766ea8b09be48 GIT binary patch literal 4774 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 A9smFU literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/089-no-touch-makedep.bz2 b/openwrt/package/linux/kernel-patches/089-no-touch-makedep.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..df7f4a54d9aeecfe580f340d9c36b3985261a239 GIT binary patch literal 858 zcmV-g1Eu^zT4*^jL0KkKS+Oy#D*yo_Uw}d|e*gdbL5PSBzwh7vPy<-nT5aw^+d(KP zkWELXnmsA0=^A+^o6}VC8bcxK29HoNQ)!`1PgB(O0gwQCfY1l13IGObA}OJhMuDKn z00000XdJ>|696U?38nx56DFDl5+zR|CzC38)W)WoOlb^(rV}BEF{wv^XTrXs84eYU z6vRx#s3Im@r6j~CltO)d6qJxOBp^))1RyePo6z9^;Qoo3h^Pu(6v;YzwXI`P%T;iq zgS`p?RCN`uo-AU<;s^*D&z(>mxA-j2j!Z@v1cC+`h--(#YT~ywezHiG)wz3cZ2uy~ z%ziCwWdc1`+;3BM?S`X6U)+Wf7KB?wZ!{E4W&N=TQaKv_I)rg5ij(OOf~_`I=_4W+ zb<tWV&K}B#k_m=9J~%^zd953=rUq>%4qD!2f)VSRQ<~yz#y)zoy46a(@9a^QPm$7Q zW3#6CG;_s>W;E8~Flg1gg=<T<rtPZp0*YmK@M-P40igwg?Z|<#RdaVynD};Fk5Y-! zB~=$!WV4Iz!IG^fLCCy1c#$*Aa|(P%Ep}E(pBH%gb#J^_6U8S2f$b2Qg@U)DqiM!- zjCRAz*gTTOWal96lesMBlQt-Hn$u$f*~S~#*51tJ(`caaa6?jL72B60RuiR-jf*P` z;_MQHwx!DlmsNi0TynL~GDk3F(XDPy4|(^-lP8K9Q-T&1kh^s_#<Fxl91;kVbZKy= znh`!|O1U?0=8Zqx=yUVN+@ZcaSHW~j4z5cBn5gs^AG%^|%zSw33dYlhMoXZ^y%nLZ z%iWu&iJ}@CMGhFKmdWW3^17;+g)Ss|LIvWD?H<zSW*{vU2-J#g3&zd#+ymeuqWu#k zUV<XtD^i52^Qx0{_Ktut<ybKTbjXmjlmr|Iz{(Rw6ZPy(Wt0Fw&`Thf%@IgR5K8!$ z2-`>^Sj_PZ7%&ik20KuYk#^BUYmG~5e-k=Q@mj^JX3mUZW=1s8DwcPfR7?X%NK};& zR_Kt*s5MP)V4ehANy*};B83=zN;<g3<srjPP2vm@uKTm*D!CM|VHh(ZAvC_WNHZ3g kv+Fk_W-SaTD>mQpzQT+VdPn)q3Wxk%$rRy2Ld3?jtOUx2*Z=?k literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/kernel-patches/100_VERSION.bz2 b/openwrt/package/linux/kernel-patches/100_VERSION.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..cd4ee5d700c68d95dbbecbdb91b9d9f30dded919 GIT binary patch literal 235 zcmV<H02Kd1T4*^jL0KkKS-uwNo&W$I-+%%zL~r-fdT-xABdyXvFaXR0Q3>HEpo}#= zO&Ky^0%*`M(9=K)00w{nWHbpx)M#okBWgCIX&D(kPiZDK9+5*lwRIf1u?jf0)E1z2 z0|JxDDh4<aNc^D@fRvP{6V$el9LAw(8JN;I*WB?FXr`jU#)K)mK%)+{QV$lpl$t|m z#1v!Bv1mhmqqVoudPIpITtZv0WF!if{N7N7bs>M+tFJLaxS=#W5~;+D$UW?HN=Jhd ltgM{Q#%JMY6DbUbjgY31OeZrlhG%p9UC9*TLPGdkqIehaWLE$H literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/linux.config b/openwrt/package/linux/linux.config new file mode 100644 index 0000000000..60424cef4a --- /dev/null +++ b/openwrt/package/linux/linux.config @@ -0,0 +1,853 @@ +# +# Automatically generated by make menuconfig: don't edit +# +CONFIG_MIPS=y +CONFIG_MIPS32=y +# CONFIG_MIPS64 is not set + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y + +# +# Loadable module support +# +CONFIG_MODULES=y +# CONFIG_MODVERSIONS is not set +# CONFIG_KMOD is not set + +# +# Machine selection +# +# CONFIG_ACER_PICA_61 is not set +# CONFIG_MIPS_DB1000 is not set +# CONFIG_MIPS_DB1100 is not set +# CONFIG_MIPS_DB1500 is not set +# CONFIG_MIPS_PB1000 is not set +# CONFIG_MIPS_PB1100 is not set +# CONFIG_MIPS_PB1500 is not set +# CONFIG_BAGET_MIPS is not set +# CONFIG_CASIO_E55 is not set +# CONFIG_MIPS_COBALT is not set +# CONFIG_DECSTATION is not set +# CONFIG_MIPS_EV64120 is not set +# CONFIG_MIPS_EV96100 is not set +# CONFIG_MIPS_IVR is not set +# CONFIG_HP_LASERJET is not set +# CONFIG_IBM_WORKPAD is not set +# CONFIG_LASAT is not set +# CONFIG_MIPS_ITE8172 is not set +# CONFIG_MIPS_ATLAS is not set +# CONFIG_MIPS_MAGNUM_4000 is not set +# CONFIG_MIPS_MALTA is not set +# CONFIG_MIPS_SEAD is not set +# CONFIG_MOMENCO_OCELOT is not set +# CONFIG_MOMENCO_OCELOT_G is not set +# CONFIG_DDB5074 is not set +# CONFIG_DDB5476 is not set +# CONFIG_DDB5477 is not set +# CONFIG_NEC_OSPREY is not set +# CONFIG_NEC_EAGLE is not set +# CONFIG_OLIVETTI_M700 is not set +# CONFIG_NINO is not set +# CONFIG_SGI_IP22 is not set +# CONFIG_SGI_IP27 is not set +# CONFIG_SGI_IP32 is not set +# CONFIG_SIBYTE_SB1xxx_SOC is not set +CONFIG_MIPS_BRCM=y +CONFIG_BCM947XX=y +CONFIG_BCM4710=y +CONFIG_BCM4310=y +CONFIG_BCM4704=y +# CONFIG_BCM5365 is not set +# CONFIG_SNI_RM200_PCI is not set +# CONFIG_TOSHIBA_JMR3927 is not set +# CONFIG_VICTOR_MPC30X is not set +# CONFIG_ZAO_CAPCELLA is not set +# CONFIG_HIGHMEM is not set +CONFIG_RWSEM_GENERIC_SPINLOCK=y +# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set +CONFIG_CMDLINE="root=/dev/mtdblock2 rootfstype=squashfs init=/etc/preinit noinitrd console=ttyS0,115200" +CONFIG_PCI=y +CONFIG_NONCOHERENT_IO=y +CONFIG_NEW_TIME_C=y +CONFIG_NEW_IRQ=y +CONFIG_HND=y +# CONFIG_MIPS_AU1000 is not set + +# +# CPU selection +# +CONFIG_CPU_MIPS32=y +# CONFIG_CPU_MIPS64 is not set +# CONFIG_CPU_R3000 is not set +# CONFIG_CPU_TX39XX is not set +# CONFIG_CPU_VR41XX is not set +# CONFIG_CPU_R4300 is not set +# CONFIG_CPU_R4X00 is not set +# CONFIG_CPU_TX49XX is not set +# CONFIG_CPU_R5000 is not set +# CONFIG_CPU_R5432 is not set +# CONFIG_CPU_R6000 is not set +# CONFIG_CPU_NEVADA is not set +# CONFIG_CPU_R8000 is not set +# CONFIG_CPU_R10000 is not set +# CONFIG_CPU_RM7000 is not set +# CONFIG_CPU_SB1 is not set +CONFIG_CPU_HAS_PREFETCH=y +# CONFIG_VTAG_ICACHE is not set +# CONFIG_64BIT_PHYS_ADDR is not set +# CONFIG_CPU_ADVANCED is not set +CONFIG_CPU_HAS_LLSC=y +# CONFIG_CPU_HAS_LLDSCD is not set +# CONFIG_CPU_HAS_WB is not set +CONFIG_CPU_HAS_SYNC=y + +# +# General setup +# +CONFIG_CPU_LITTLE_ENDIAN=y +CONFIG_NET=y +# CONFIG_PCI_NAMES is not set +# CONFIG_ISA is not set +# CONFIG_EISA is not set +# CONFIG_TC is not set +# CONFIG_MCA is not set +# CONFIG_SBUS is not set +CONFIG_HOTPLUG=y + +# +# PCMCIA/CardBus support +# +# CONFIG_PCMCIA is not set + +# +# PCI Hotplug Support +# +# CONFIG_HOTPLUG_PCI is not set +# CONFIG_HOTPLUG_PCI_COMPAQ is not set +# CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM is not set +# CONFIG_HOTPLUG_PCI_ACPI is not set +CONFIG_SYSVIPC=y +# CONFIG_BSD_PROCESS_ACCT is not set +CONFIG_SYSCTL=y +# CONFIG_PRINT_SYSCALLS is not set +CONFIG_KCORE_ELF=y +# CONFIG_KCORE_AOUT is not set +# CONFIG_BINFMT_AOUT is not set +CONFIG_BINFMT_ELF=y +# CONFIG_MIPS32_COMPAT is not set +# CONFIG_MIPS32_O32 is not set +# CONFIG_MIPS32_N32 is not set +# CONFIG_BINFMT_ELF32 is not set +# CONFIG_BINFMT_MISC is not set +# CONFIG_PM is not set + +# +# Memory Technology Devices (MTD) +# +CONFIG_MTD=y +# CONFIG_MTD_DEBUG is not set +CONFIG_MTD_PARTITIONS=y +# CONFIG_MTD_CONCAT is not set +# CONFIG_MTD_REDBOOT_PARTS is not set +CONFIG_MTD_CHAR=y +# CONFIG_MTD_BLOCK is not set +CONFIG_MTD_BLOCK_RO=y +# CONFIG_FTL is not set +# CONFIG_NFTL is not set + +# +# RAM/ROM/Flash chip drivers +# +CONFIG_MTD_CFI=y +# CONFIG_MTD_JEDECPROBE is not set +CONFIG_MTD_GEN_PROBE=y +CONFIG_MTD_CFI_ADV_OPTIONS=y +CONFIG_MTD_CFI_NOSWAP=y +# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set +# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set +CONFIG_MTD_CFI_GEOMETRY=y +# CONFIG_MTD_CFI_B1 is not set +CONFIG_MTD_CFI_B2=y +# CONFIG_MTD_CFI_B4 is not set +CONFIG_MTD_CFI_I1=y +# CONFIG_MTD_CFI_I2 is not set +# CONFIG_MTD_CFI_I4 is not set +CONFIG_MTD_CFI_INTELEXT=y +CONFIG_MTD_CFI_AMDSTD=y +CONFIG_MTD_CFI_SSTSTD=y +# CONFIG_MTD_RAM is not set +# CONFIG_MTD_ROM is not set +# CONFIG_MTD_ABSENT is not set +# CONFIG_MTD_OBSOLETE_CHIPS is not set +# CONFIG_MTD_AMDSTD is not set +# CONFIG_MTD_SHARP is not set +# CONFIG_MTD_JEDEC is not set + +# +# Mapping drivers for chip access +# +# CONFIG_MTD_PHYSMAP is not set +CONFIG_MTD_BCM947XX=y +# CONFIG_MTD_PB1000 is not set +# CONFIG_MTD_PB1500 is not set +# CONFIG_MTD_PB1100 is not set +# CONFIG_MTD_CSTM_MIPS_IXX is not set +# CONFIG_MTD_OCELOT is not set +# CONFIG_MTD_LASAT is not set +# CONFIG_MTD_PCI is not set + +# +# Self-contained MTD device drivers +# +CONFIG_MTD_SFLASH=y +# CONFIG_MTD_PMC551 is not set +# CONFIG_MTD_SLRAM is not set +# CONFIG_MTD_MTDRAM is not set +# CONFIG_MTD_BLKMTD is not set +# CONFIG_MTD_DOC1000 is not set +# CONFIG_MTD_DOC2000 is not set +# CONFIG_MTD_DOC2001 is not set +# CONFIG_MTD_DOCPROBE is not set + +# +# NAND Flash Device Drivers +# +# CONFIG_MTD_NAND is not set + +# +# Parallel port support +# +# CONFIG_PARPORT is not set + +# +# Plug and Play configuration +# +# CONFIG_PNP is not set +# CONFIG_ISAPNP is not set + +# +# Block devices +# +# CONFIG_BLK_DEV_MSYS is not set +# CONFIG_NOROOT is not set +# CONFIG_BLK_DEV_FD is not set +# CONFIG_BLK_DEV_XD is not set +# CONFIG_PARIDE is not set +# CONFIG_BLK_CPQ_DA is not set +# CONFIG_BLK_CPQ_CISS_DA is not set +# CONFIG_CISS_SCSI_TAPE is not set +# CONFIG_BLK_DEV_DAC960 is not set +# CONFIG_BLK_DEV_UMEM is not set +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_NBD=m +# CONFIG_BLK_DEV_RAM is not set +# CONFIG_BLK_DEV_INITRD is not set +# CONFIG_BLK_STATS is not set + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set +# CONFIG_BLK_DEV_MD is not set +# CONFIG_MD_LINEAR is not set +# CONFIG_MD_RAID0 is not set +# CONFIG_MD_RAID1 is not set +# CONFIG_MD_RAID5 is not set +# CONFIG_MD_MULTIPATH is not set +# CONFIG_BLK_DEV_LVM is not set + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +CONFIG_NETLINK_DEV=m +CONFIG_NETFILTER=y +# CONFIG_NETFILTER_DEBUG is not set +# CONFIG_FILTER is not set +CONFIG_UNIX=y +CONFIG_NETSWAP=y +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_FWMARK=y +CONFIG_IP_ROUTE_NAT=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_TOS=y +# CONFIG_IP_ROUTE_VERBOSE is not set +# CONFIG_IP_ROUTE_LARGE_TABLES is not set +# CONFIG_IP_PNP is not set +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE=m +# CONFIG_ARPD is not set +# CONFIG_INET_ECN is not set +# CONFIG_SYN_COOKIES is not set + +# +# IP: Netfilter Configuration +# +CONFIG_IP_NF_CONNTRACK=y +CONFIG_IP_NF_FTP=y +CONFIG_IP_NF_H323=y +CONFIG_IP_NF_CONNTRACK_MARK=y +# CONFIG_IP_NF_AMANDA is not set +CONFIG_IP_NF_TFTP=y +CONFIG_IP_NF_IRC=y +CONFIG_IP_NF_CT_PROTO_GRE=y +CONFIG_IP_NF_PPTP=y +CONFIG_IP_NF_MMS=y +CONFIG_IP_NF_QUEUE=m +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_LIMIT=m +CONFIG_IP_NF_SET=m +CONFIG_IP_NF_SET_MAX=256 +CONFIG_IP_NF_SET_IPMAP=m +CONFIG_IP_NF_SET_PORTMAP=m +CONFIG_IP_NF_SET_MACIPMAP=m +CONFIG_IP_NF_SET_IPHASH=m +CONFIG_IP_NF_MATCH_QUOTA=m +CONFIG_IP_NF_POOL=m +CONFIG_IP_POOL_STATISTICS=y +CONFIG_IP_NF_MATCH_IPRANGE=m +CONFIG_IP_NF_MATCH_DSTLIMIT=m +CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_PKTTYPE=m +CONFIG_IP_NF_MATCH_MARK=y +CONFIG_IP_NF_MATCH_MULTIPORT=y +CONFIG_IP_NF_MATCH_TOS=m +CONFIG_IP_NF_MATCH_CONDITION=m +# CONFIG_IP_NF_MATCH_RANDOM is not set +CONFIG_IP_NF_MATCH_PSD=m +# CONFIG_IP_NF_MATCH_OSF is not set +# CONFIG_IP_NF_MATCH_NTH is not set +CONFIG_IP_NF_MATCH_IPV4OPTIONS=m +# CONFIG_IP_NF_MATCH_FUZZY is not set +CONFIG_IP_NF_MATCH_RECENT=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_DSCP=m +CONFIG_IP_NF_MATCH_AH_ESP=m +CONFIG_IP_NF_MATCH_LENGTH=m +# CONFIG_IP_NF_MATCH_U32 is not set +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_MATCH_TCPMSS=y +# CONFIG_IP_NF_MATCH_REALM is not set +CONFIG_IP_NF_MATCH_HELPER=m +CONFIG_IP_NF_MATCH_STATE=y +CONFIG_IP_NF_MATCH_CONNMARK=m +CONFIG_IP_NF_MATCH_CONNLIMIT=m +CONFIG_IP_NF_MATCH_CONNTRACK=m +CONFIG_IP_NF_MATCH_UNCLEAN=m +CONFIG_IP_NF_MATCH_STRING=m +# CONFIG_IP_NF_MATCH_OWNER is not set +CONFIG_IP_NF_MATCH_PHYSDEV=m +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=y +CONFIG_IP_NF_TARGET_NETLINK=m +CONFIG_IP_NF_TARGET_IPV4OPTSSTRIP=m +CONFIG_IP_NF_TARGET_MIRROR=m +CONFIG_IP_NF_NAT=y +CONFIG_IP_NF_NAT_NEEDED=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_TARGET_REDIRECT=y +CONFIG_IP_NF_NAT_H323=y +# CONFIG_IP_NF_TARGET_SAME is not set +# CONFIG_IP_NF_TARGET_NETMAP is not set +CONFIG_IP_NF_NAT_PPTP=y +CONFIG_IP_NF_NAT_PROTO_GRE=y +# CONFIG_IP_NF_NAT_LOCAL is not set +CONFIG_IP_NF_NAT_SNMP_BASIC=m +CONFIG_IP_NF_NAT_IRC=y +CONFIG_IP_NF_NAT_MMS=y +CONFIG_IP_NF_NAT_FTP=y +CONFIG_IP_NF_NAT_TFTP=y +CONFIG_IP_NF_MANGLE=y +CONFIG_IP_NF_TARGET_TOS=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_DSCP=m +CONFIG_IP_NF_TARGET_MARK=y +CONFIG_IP_NF_TARGET_IPMARK=m +CONFIG_IP_NF_TARGET_CLASSIFY=m +CONFIG_IP_NF_TARGET_LOG=y +CONFIG_IP_NF_TARGET_CONNMARK=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_TARGET_ULOG=m +CONFIG_IP_NF_TARGET_TCPMSS=y +# CONFIG_IP_NF_RAW is not set +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +CONFIG_IPV6=m + +# +# IPv6: Netfilter Configuration +# +CONFIG_IP6_NF_QUEUE=m +CONFIG_IP6_NF_IPTABLES=m +CONFIG_IP6_NF_MATCH_LIMIT=m +CONFIG_IP6_NF_MATCH_MAC=m +# CONFIG_IP6_NF_MATCH_RANDOM is not set +# CONFIG_IP6_NF_MATCH_NTH is not set +# CONFIG_IP6_NF_MATCH_FUZZY is not set +# CONFIG_IP6_NF_MATCH_RT is not set +# CONFIG_IP6_NF_MATCH_OPTS is not set +# CONFIG_IP6_NF_MATCH_FRAG is not set +# CONFIG_IP6_NF_MATCH_HL is not set +CONFIG_IP6_NF_MATCH_MULTIPORT=m +CONFIG_IP6_NF_MATCH_OWNER=m +CONFIG_IP6_NF_MATCH_MARK=m +# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set +# CONFIG_IP6_NF_MATCH_AHESP is not set +CONFIG_IP6_NF_MATCH_LENGTH=m +CONFIG_IP6_NF_MATCH_EUI64=m +CONFIG_IP6_NF_FILTER=m +CONFIG_IP6_NF_TARGET_REJECT=m +# CONFIG_IP6_NF_TARGET_HL is not set +CONFIG_IP6_NF_TARGET_LOG=m +CONFIG_IP6_NF_MANGLE=m +CONFIG_IP6_NF_TARGET_MARK=m +# CONFIG_KHTTPD is not set +# CONFIG_ATM is not set +CONFIG_VLAN_8021Q=y +# CONFIG_IPX is not set +# CONFIG_ATALK is not set + +# +# Appletalk devices +# +# CONFIG_DEV_APPLETALK is not set +# CONFIG_DECNET is not set +CONFIG_BRIDGE=y +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_BRIDGE_EBT_IPF=m +CONFIG_BRIDGE_EBT_ARPF=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_VLANF=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_MARKF=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_MARK_T=m +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_LLC is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +CONFIG_WAN_ROUTER=m +# CONFIG_NET_FASTROUTE is not set +# CONFIG_NET_HW_FLOWCONTROL is not set + +# +# QoS and/or fair queueing +# +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_CBQ=m +CONFIG_NET_SCH_HTB=m +CONFIG_NET_SCH_CSZ=m +CONFIG_NET_SCH_PRIO=m +CONFIG_NET_SCH_RED=m +CONFIG_NET_SCH_SFQ=m +CONFIG_NET_SCH_TEQL=m +CONFIG_NET_SCH_TBF=m +CONFIG_NET_SCH_GRED=m +CONFIG_NET_SCH_DSMARK=m +CONFIG_NET_SCH_INGRESS=m +CONFIG_NET_QOS=y +CONFIG_NET_ESTIMATOR=y +CONFIG_NET_CLS=y +CONFIG_NET_CLS_TCINDEX=m +CONFIG_NET_CLS_ROUTE4=m +CONFIG_NET_CLS_ROUTE=y +CONFIG_NET_CLS_FW=m +CONFIG_NET_CLS_U32=m +CONFIG_NET_CLS_RSVP=m +CONFIG_NET_CLS_RSVP6=m +CONFIG_NET_CLS_POLICE=y + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set + +# +# Telephony Support +# +# CONFIG_PHONE is not set +# CONFIG_PHONE_IXJ is not set +# CONFIG_PHONE_IXJ_PCMCIA is not set + +# +# ATA/IDE/MFM/RLL support +# +# CONFIG_IDE is not set +# CONFIG_BLK_DEV_IDE_MODES is not set +# CONFIG_BLK_DEV_HD is not set + +# +# SCSI support +# +# CONFIG_SCSI is not set + +# +# I2O device support +# +# CONFIG_I2O is not set +# CONFIG_I2O_PCI is not set +# CONFIG_I2O_BLOCK is not set +# CONFIG_I2O_LAN is not set +# CONFIG_I2O_SCSI is not set +# CONFIG_I2O_PROC is not set + +# +# Network device support +# +CONFIG_NETDEVICES=y + +# +# Broadcom HND network devices +# +CONFIG_HND=y +# CONFIG_IL is not set +CONFIG_ET=m +# CONFIG_ET_4413 is not set +CONFIG_ET_47XX=y +CONFIG_WL=m +CONFIG_WL_AP=y +CONFIG_WL_STA=y + +# +# ARCnet devices +# +# CONFIG_ARCNET is not set +# CONFIG_DUMMY is not set +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +CONFIG_TUN=m +# CONFIG_ETHERTAP is not set + +# +# Ethernet (10 or 100Mbit) +# +CONFIG_NET_ETHERNET=y +# CONFIG_SUNLANCE is not set +# CONFIG_HAPPYMEAL is not set +# CONFIG_SUNBMAC is not set +# CONFIG_SUNQE is not set +# CONFIG_SUNGEM is not set +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_LANCE is not set +# CONFIG_NET_VENDOR_SMC is not set +# CONFIG_NET_VENDOR_RACAL is not set +# CONFIG_HP100 is not set +# CONFIG_NET_ISA is not set +# CONFIG_NET_PCI is not set +# CONFIG_NET_POCKET is not set + +# +# Ethernet (1000 Mbit) +# +# CONFIG_ACENIC is not set +# CONFIG_DL2K is not set +# CONFIG_E1000 is not set +# CONFIG_MYRI_SBUS is not set +# CONFIG_NS83820 is not set +# CONFIG_HAMACHI is not set +# CONFIG_YELLOWFIN is not set +# CONFIG_SK98LIN is not set +# CONFIG_TIGON3 is not set +# CONFIG_FDDI is not set +# CONFIG_HIPPI is not set +# CONFIG_PLIP is not set +CONFIG_PPP=y +# CONFIG_PPP_MULTILINK is not set +# CONFIG_PPP_FILTER is not set +CONFIG_PPP_ASYNC=m +# CONFIG_PPP_SYNC_TTY is not set +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_MPPE=m +CONFIG_PPPOE=m +# CONFIG_SLIP is not set + +# +# Wireless LAN (non-hamradio) +# +CONFIG_NET_RADIO=y +# CONFIG_STRIP is not set +# CONFIG_WAVELAN is not set +# CONFIG_ARLAN is not set +# CONFIG_AIRONET4500 is not set +# CONFIG_AIRONET4500_NONCS is not set +# CONFIG_AIRONET4500_PROC is not set +# CONFIG_AIRO is not set +# CONFIG_HERMES is not set +# CONFIG_PLX_HERMES is not set +# CONFIG_PCI_HERMES is not set +CONFIG_NET_WIRELESS=y + +# +# Token Ring devices +# +# CONFIG_TR is not set +# CONFIG_NET_FC is not set +# CONFIG_RCPCI is not set +CONFIG_SHAPER=m + +# +# Wan interfaces +# +# CONFIG_WAN is not set + +# +# Amateur Radio support +# +# CONFIG_HAMRADIO is not set + +# +# IrDA (infrared) support +# +# CONFIG_IRDA is not set + +# +# ISDN subsystem +# +# CONFIG_ISDN is not set + +# +# Input core support +# +# CONFIG_INPUT is not set +# CONFIG_INPUT_KEYBDEV is not set +# CONFIG_INPUT_MOUSEDEV is not set +# CONFIG_INPUT_JOYDEV is not set +# CONFIG_INPUT_EVDEV is not set + +# +# Character devices +# +# CONFIG_VT is not set +CONFIG_SERIAL=y +CONFIG_SERIAL_CONSOLE=y +# CONFIG_SERIAL_EXTENDED is not set +# CONFIG_SERIAL_NONSTANDARD is not set +CONFIG_UNIX98_PTYS=y +CONFIG_UNIX98_PTY_COUNT=128 + +# +# I2C support +# +# CONFIG_I2C is not set + +# +# Mice +# +# CONFIG_BUSMOUSE is not set +# CONFIG_MOUSE is not set + +# +# Joysticks +# +# CONFIG_INPUT_GAMEPORT is not set +# CONFIG_QIC02_TAPE is not set + +# +# Watchdog Cards +# +CONFIG_WATCHDOG=y +CONFIG_WATCHDOG_NOWAYOUT=y +# CONFIG_ACQUIRE_WDT is not set +# CONFIG_ADVANTECH_WDT is not set +# CONFIG_ALIM7101_WDT is not set +# CONFIG_SC520_WDT is not set +# CONFIG_PCWATCHDOG is not set +# CONFIG_EUROTECH_WDT is not set +# CONFIG_IB700_WDT is not set +# CONFIG_WAFER_WDT is not set +# CONFIG_I810_TCO is not set +# CONFIG_MIXCOMWD is not set +# CONFIG_60XX_WDT is not set +# CONFIG_SC1200_WDT is not set +CONFIG_SOFT_WATCHDOG=y +# CONFIG_W83877F_WDT is not set +# CONFIG_WDT is not set +# CONFIG_WDTPCI is not set +# CONFIG_MACHZ_WDT is not set +# CONFIG_INDYDOG is not set +# CONFIG_AMD7XX_TCO is not set +# CONFIG_AMD_PM768 is not set +# CONFIG_NVRAM is not set +# CONFIG_RTC is not set +# CONFIG_DTLK is not set +# CONFIG_R3964 is not set +# CONFIG_APPLICOM is not set + +# +# Ftape, the floppy tape device driver +# +# CONFIG_FTAPE is not set +# CONFIG_AGP is not set +# CONFIG_DRM is not set + +# +# File systems +# +CONFIG_BLKDEV_SWAP=m +# CONFIG_QUOTA is not set +# CONFIG_AUTOFS_FS is not set +# CONFIG_AUTOFS4_FS is not set +# CONFIG_REISERFS_FS is not set +# CONFIG_REISERFS_CHECK is not set +# CONFIG_REISERFS_PROC_INFO is not set +# CONFIG_ADFS_FS is not set +# CONFIG_ADFS_FS_RW is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_BEFS_FS is not set +# CONFIG_BEFS_DEBUG is not set +# CONFIG_BFS_FS is not set +# CONFIG_EXT3_FS is not set +# CONFIG_JBD is not set +# CONFIG_JBD_DEBUG is not set +# CONFIG_FAT_FS is not set +# CONFIG_MSDOS_FS is not set +# CONFIG_UMSDOS_FS is not set +# CONFIG_VFAT_FS is not set +# CONFIG_EFS_FS is not set +# CONFIG_JFFS_FS is not set +CONFIG_JFFS2_FS=y +CONFIG_JFFS2_FS_DEBUG=0 +# CONFIG_JFFS2_BBC_ARMLIB is not set +CONFIG_JFFS2_BBC_LZO=y +CONFIG_JFFS2_BBC_LZARI=y +CONFIG_JFFS2_BBC_LZHD=y +CONFIG_JFFS2_BBC_LZSS=y +# CONFIG_CRAMFS is not set +CONFIG_SQUASHFS=y +# CONFIG_TMPFS is not set +CONFIG_RAMFS=y +# CONFIG_ISO9660_FS is not set +# CONFIG_JOLIET is not set +# CONFIG_ZISOFS is not set +# CONFIG_JFS_FS is not set +# CONFIG_JFS_DEBUG is not set +# CONFIG_JFS_STATISTICS is not set +# CONFIG_MINIX_FS is not set +# CONFIG_VXFS_FS is not set +# CONFIG_NTFS_FS is not set +# CONFIG_NTFS_RW is not set +# CONFIG_HPFS_FS is not set +CONFIG_PROC_FS=y +CONFIG_DEVFS_FS=y +CONFIG_DEVFS_MOUNT=y +# CONFIG_DEVFS_DEBUG is not set +# CONFIG_DEVPTS_FS is not set +# CONFIG_QNX4FS_FS is not set +# CONFIG_QNX4FS_RW is not set +# CONFIG_ROMFS_FS is not set +# CONFIG_EXT2_FS is not set +# CONFIG_SYSV_FS is not set +# CONFIG_UDF_FS is not set +# CONFIG_UDF_RW is not set +# CONFIG_UFS_FS is not set +# CONFIG_UFS_FS_WRITE is not set + +# +# Network File Systems +# +# CONFIG_CODA_FS is not set +# CONFIG_INTERMEZZO_FS is not set +CONFIG_NFS_FS=m +CONFIG_NFS_V3=y +# CONFIG_ROOT_NFS is not set +CONFIG_SWAP_VIA_NFS=m +CONFIG_NETSWAP=y +# CONFIG_NFSD is not set +# CONFIG_NFSD_V3 is not set +# CONFIG_NFSD_TCP is not set +CONFIG_SUNRPC=m +CONFIG_LOCKD=m +CONFIG_LOCKD_V4=y +# CONFIG_SMB_FS is not set +# CONFIG_NCP_FS is not set +# CONFIG_NCPFS_PACKET_SIGNING is not set +# CONFIG_NCPFS_IOCTL_LOCKING is not set +# CONFIG_NCPFS_STRONG is not set +# CONFIG_NCPFS_NFS_NS is not set +# CONFIG_NCPFS_OS2_NS is not set +# CONFIG_NCPFS_SMALLDOS is not set +# CONFIG_NCPFS_NLS is not set +# CONFIG_NCPFS_EXTRAS is not set +# CONFIG_ZISOFS_FS is not set + +# +# Partition Types +# +CONFIG_PARTITION_ADVANCED=y +# CONFIG_ACORN_PARTITION is not set +# CONFIG_OSF_PARTITION is not set +# CONFIG_AMIGA_PARTITION is not set +# CONFIG_ATARI_PARTITION is not set +# CONFIG_MAC_PARTITION is not set +# CONFIG_MSDOS_PARTITION is not set +# CONFIG_LDM_PARTITION is not set +# CONFIG_SGI_PARTITION is not set +# CONFIG_ULTRIX_PARTITION is not set +# CONFIG_SUN_PARTITION is not set +# CONFIG_EFI_PARTITION is not set +# CONFIG_SMB_NLS is not set +# CONFIG_NLS is not set + +# +# Multimedia devices +# +# CONFIG_VIDEO_DEV is not set + +# +# Sound +# +# CONFIG_SOUND is not set + +# +# USB support +# +# CONFIG_USB is not set + +# +# Support for USB gadgets +# +# CONFIG_USB_GADGET is not set + +# +# Bluetooth support +# +# CONFIG_BLUEZ is not set + +# +# Kernel hacking +# +CONFIG_CROSSCOMPILE=y +# CONFIG_KERNPROF is not set +# CONFIG_MCOUNT is not set +# CONFIG_DEBUG is not set +CONFIG_MAGIC_SYSRQ=y +# CONFIG_MIPS_UNCACHED is not set +# CONFIG_KTRACE is not set +# CONFIG_HWSIM is not set + +# +# Library routines +# +CONFIG_ZLIB_INFLATE=y +CONFIG_ZLIB_DEFLATE=y diff --git a/openwrt/package/linux/linux.mk b/openwrt/package/linux/linux.mk new file mode 100644 index 0000000000..69245b083c --- /dev/null +++ b/openwrt/package/linux/linux.mk @@ -0,0 +1,115 @@ +############################################################# +# +# Linux kernel targets +# +# Note: If you have any patches to apply, create the directory +# sources/kernel-patches and put your patches in there and number +# them in the order you wish to apply them... i.e. +# +# sources/kernel-patches/001-my-special-stuff.bz2 +# sources/kernel-patches/003-gcc-Os.bz2 +# sources/kernel-patches/004_no-warnings.bz2 +# sources/kernel-patches/030-lowlatency-mini.bz2 +# sources/kernel-patches/031-lowlatency-fixes-5.bz2 +# sources/kernel-patches/099-shutup.bz2 +# etc... +# +# these patches will all be applied by the patch-kernel.sh +# script (which will also abort the build if it finds rejects) +# -Erik +# +############################################################# +ifneq ($(filter $(TARGETS),linux),) + +# Version of Linux to download and then apply patches to +DOWNLOAD_LINUX_VERSION=2.4.27 +# Version of Linux AFTER patches +LINUX_VERSION=2.4.28-pre4-erik + +LINUX_FORMAT=vmlinux +#LINUX_FORMAT=images/zImage.prep +LINUX_KARCH:=$(shell echo $(ARCH) | sed -e 's/i[3-9]86/i386/' \ + -e 's/mipsel/mips/' \ + -e 's/powerpc/ppc/' \ + -e 's/sh[234]/sh/' \ + ) +LINUX_BINLOC=arch/$(LINUX_KARCH)/boot/$(LINUX_FORMAT) + +LINUX_DIR=$(BUILD_DIR)/linux-$(LINUX_VERSION) +LINUX_SOURCE=linux-$(DOWNLOAD_LINUX_VERSION).tar.bz2 +LINUX_SITE=http://www.kernel.org/pub/linux/kernel/v2.4 +LINUX_KCONFIG=package/linux/linux.config +LINUX_KERNEL=$(BUILD_DIR)/buildroot-kernel +# Used by pcmcia-cs and others +LINUX_SOURCE_DIR=$(LINUX_DIR) + + +$(DL_DIR)/$(LINUX_SOURCE): + -mkdir -p $(DL_DIR) + $(WGET) -P $(DL_DIR) $(LINUX_SITE)/$(LINUX_SOURCE) + +$(LINUX_DIR)/.unpacked: $(DL_DIR)/$(LINUX_SOURCE) + -mkdir -p $(TOOL_BUILD_DIR) + -(cd $(TOOL_BUILD_DIR); ln -sf $(LINUX_DIR) linux) + bzcat $(DL_DIR)/$(LINUX_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - +ifneq ($(DOWNLOAD_LINUX_VERSION),$(LINUX_VERSION)) + # Rename the dir from the downloaded version to the AFTER patch version + mv -f $(BUILD_DIR)/linux-$(DOWNLOAD_LINUX_VERSION) $(BUILD_DIR)/linux-$(LINUX_VERSION) +endif + mkdir -p package/linux/kernel-patches + toolchain/patch-kernel.sh $(LINUX_DIR) package/linux/kernel-patches + touch $(LINUX_DIR)/.unpacked + +$(LINUX_KCONFIG): + @if [ ! -f "$(LINUX_KCONFIG)" ] ; then \ + echo ""; \ + echo "You should create a .config for your kernel"; \ + echo "and install it as $(LINUX_KCONFIG)"; \ + echo ""; \ + sleep 5; \ + fi; + +$(LINUX_DIR)/.configured $(BUILD_DIR)/linux/.configured: $(LINUX_DIR)/.unpacked $(LINUX_KCONFIG) + $(SED) "s,^CROSS_COMPILE.*,CROSS_COMPILE=$(KERNEL_CROSS),g;" $(LINUX_DIR)/Makefile + -cp $(LINUX_KCONFIG) $(LINUX_DIR)/.config + $(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_KARCH) oldconfig include/linux/version.h + touch $(LINUX_DIR)/.configured + +$(LINUX_DIR)/.depend_done: $(LINUX_DIR)/.configured + $(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_KARCH) dep + touch $(LINUX_DIR)/.depend_done + +$(LINUX_DIR)/$(LINUX_BINLOC): $(LINUX_DIR)/.depend_done + $(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_KARCH) PATH=$(TARGET_PATH) $(LINUX_FORMAT) + $(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_KARCH) PATH=$(TARGET_PATH) modules + +$(LINUX_KERNEL): $(LINUX_DIR)/$(LINUX_BINLOC) + cp -fa $(LINUX_DIR)/$(LINUX_BINLOC) $(LINUX_KERNEL) + touch -c $(LINUX_KERNEL) + +$(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/modules.dep: $(LINUX_KERNEL) + rm -rf $(TARGET_DIR)/lib/modules + rm -f $(TARGET_DIR)/sbin/cardmgr + $(MAKE) -C $(LINUX_DIR) INSTALL_MOD_PATH=$(TARGET_DIR) modules_install + (cd $(TARGET_DIR)/lib/modules; ln -s $(LINUX_VERSION)/kernel/drivers .) + +$(STAGING_DIR)/include/linux/version.h: $(LINUX_DIR)/.configured + mkdir -p $(STAGING_DIR)/include + tar -ch -C $(LINUX_DIR)/include -f - linux | tar -xf - -C $(STAGING_DIR)/include/ + tar -ch -C $(LINUX_DIR)/include -f - asm | tar -xf - -C $(STAGING_DIR)/include/ + +linux: $(STAGING_DIR)/include/linux/version.h $(TARGET_DIR)/lib/modules/$(LINUX_VERSION)/modules.dep + +linux-source: $(DL_DIR)/$(LINUX_SOURCE) + +# This has been renamed so we do _NOT_ by default run this on 'make clean' +linuxclean: clean + rm -f $(LINUX_KERNEL) + -$(MAKE) -C $(LINUX_DIR) clean + +linux-dirclean: + rm -rf $(LINUX_DIR) + +linux-headers: $(LINUX_DIR)/.configured + +endif diff --git a/openwrt/package/sed/Config.in b/openwrt/package/sed/Config.in new file mode 100644 index 0000000000..5cfc12d41f --- /dev/null +++ b/openwrt/package/sed/Config.in @@ -0,0 +1,9 @@ +config BR2_PACKAGE_SED + bool "sed" + default n + help + Super-useful stream editor. + + http://sed.sourceforge.net/ + + Most people will answer Y. diff --git a/openwrt/package/sed/Makefile.in b/openwrt/package/sed/Makefile.in new file mode 100644 index 0000000000..6738e4f246 --- /dev/null +++ b/openwrt/package/sed/Makefile.in @@ -0,0 +1,3 @@ +ifeq ($(strip $(BR2_PACKAGE_SED)),y) +TARGETS+=sed +endif diff --git a/openwrt/package/sed/sed.mk b/openwrt/package/sed/sed.mk new file mode 100644 index 0000000000..5154c1f795 --- /dev/null +++ b/openwrt/package/sed/sed.mk @@ -0,0 +1,136 @@ +############################################################# +# +# sed +# +############################################################# +SED_VER:=4.1.2 +SED_SOURCE:=sed-$(SED_VER).tar.gz +SED_SITE:=ftp://ftp.gnu.org/gnu/sed +SED_CAT:=zcat +SED_DIR1:=$(TOOL_BUILD_DIR)/sed-$(SED_VER) +SED_DIR2:=$(BUILD_DIR)/sed-$(SED_VER) +SED_BINARY:=sed/sed +SED_TARGET_BINARY:=bin/sed +ifeq ($(strip $(BUILD_WITH_LARGEFILE)),true) +SED_CPPFLAGS=-D_FILE_OFFSET_BITS=64 +endif +SED:=$(STAGING_DIR)/bin/sed -i -e +HOST_SED_TARGET=$(shell package/sed/sedcheck.sh) + +$(DL_DIR)/$(SED_SOURCE): + mkdir -p $(DL_DIR) + $(WGET) -P $(DL_DIR) $(SED_SITE)/$(SED_SOURCE) + +sed-source: $(DL_DIR)/$(SED_SOURCE) + + +############################################################# +# +# build sed for use on the host system +# +############################################################# +$(SED_DIR1)/.unpacked: $(DL_DIR)/$(SED_SOURCE) + mkdir -p $(TOOL_BUILD_DIR) + mkdir -p $(STAGING_DIR)/bin; + $(SED_CAT) $(DL_DIR)/$(SED_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) - + touch $(SED_DIR1)/.unpacked + +$(SED_DIR1)/.configured: $(SED_DIR1)/.unpacked + (cd $(SED_DIR1); rm -rf config.cache; \ + ./configure \ + --prefix=$(STAGING_DIR) \ + --prefix=/usr \ + ); + touch $(SED_DIR1)/.configured + +$(SED_DIR1)/$(SED_BINARY): $(SED_DIR1)/.configured + $(MAKE) -C $(SED_DIR1) + +# This stuff is needed to work around GNU make deficiencies +build-sed-host-binary: $(SED_DIR1)/$(SED_BINARY) + @if [ -L $(STAGING_DIR)/$(SED_TARGET_BINARY) ] ; then \ + rm -f $(STAGING_DIR)/$(SED_TARGET_BINARY); fi; + @if [ ! -f $(STAGING_DIR)/$(SED_TARGET_BINARY) -o $(STAGING_DIR)/$(SED_TARGET_BINARY) \ + -ot $(SED_DIR1)/$(SED_BINARY) ] ; then \ + set -x; \ + mkdir -p $(STAGING_DIR)/bin; \ + $(MAKE) DESTDIR=$(STAGING_DIR) -C $(SED_DIR1) install; \ + mv $(STAGING_DIR)/usr/bin/sed $(STAGING_DIR)/bin/; \ + rm -rf $(STAGING_DIR)/share/locale $(STAGING_DIR)/usr/info \ + $(STAGING_DIR)/usr/man $(STAGING_DIR)/usr/share/doc; fi + +use-sed-host-binary: + @if [ -x /usr/bin/sed ]; then SED="/usr/bin/sed"; else \ + if [ -x /bin/sed ]; then SED="/bin/sed"; fi; fi; \ + mkdir -p $(STAGING_DIR)/bin; \ + rm -f $(STAGING_DIR)/$(SED_TARGET_BINARY); \ + ln -s $$SED $(STAGING_DIR)/$(SED_TARGET_BINARY) + +host-sed: $(HOST_SED_TARGET) + +host-sed-clean: + $(MAKE) DESTDIR=$(STAGING_DIR) -C $(SED_DIR1) uninstall + -$(MAKE) -C $(SED_DIR1) clean + +host-sed-dirclean: + rm -rf $(SED_DIR1) + + +############################################################# +# +# build sed for use on the target system +# +############################################################# +$(SED_DIR2)/.unpacked: $(DL_DIR)/$(SED_SOURCE) + $(SED_CAT) $(DL_DIR)/$(SED_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + touch $(SED_DIR2)/.unpacked + +$(SED_DIR2)/.configured: $(SED_DIR2)/.unpacked + (cd $(SED_DIR2); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS)" \ + CPPFLAGS="$(SED_CFLAGS)" \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + ); + touch $(SED_DIR2)/.configured + +$(SED_DIR2)/$(SED_BINARY): $(SED_DIR2)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(SED_DIR2) + +# This stuff is needed to work around GNU make deficiencies +sed-target_binary: $(SED_DIR2)/$(SED_BINARY) + @if [ -L $(TARGET_DIR)/$(SED_TARGET_BINARY) ] ; then \ + rm -f $(TARGET_DIR)/$(SED_TARGET_BINARY); fi; + + @if [ ! -f $(SED_DIR2)/$(SED_BINARY) -o $(TARGET_DIR)/$(SED_TARGET_BINARY) \ + -ot $(SED_DIR2)/$(SED_BINARY) ] ; then \ + set -x; \ + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(SED_DIR2) install; \ + mv $(TARGET_DIR)/usr/bin/sed $(TARGET_DIR)/bin/; \ + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc; fi + +sed: uclibc sed-target_binary + +sed-clean: + $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(SED_DIR2) uninstall + -$(MAKE) -C $(SED_DIR2) clean + +sed-dirclean: + rm -rf $(SED_DIR2) + + diff --git a/openwrt/package/sed/sedcheck.sh b/openwrt/package/sed/sedcheck.sh new file mode 100755 index 0000000000..4d645b6ab0 --- /dev/null +++ b/openwrt/package/sed/sedcheck.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +if [ -x /usr/bin/sed ]; then + SED="/usr/bin/sed"; +else + if [ -x /bin/sed ]; then + SED="/bin/sed"; + fi; +fi; + +echo "HELLO" > .sedtest +$SED -i -e "s/HELLO/GOODBYE/" .sedtest >/dev/null 2>&1 + +if [ $? != 0 ] ; then + echo build-sed-host-binary +else + echo use-sed-host-binary +fi; +rm -f .sedtest + + diff --git a/openwrt/target/Config.in b/openwrt/target/Config.in new file mode 100644 index 0000000000..18d4114e6d --- /dev/null +++ b/openwrt/target/Config.in @@ -0,0 +1,8 @@ +# + +menu "Target Filesystem" + +source "target/jffs2/Config.in" + +endmenu + diff --git a/openwrt/target/Makefile.in b/openwrt/target/Makefile.in new file mode 100644 index 0000000000..c01ade299a --- /dev/null +++ b/openwrt/target/Makefile.in @@ -0,0 +1 @@ +# Nothing diff --git a/openwrt/target/default/device_table.txt b/openwrt/target/default/device_table.txt new file mode 100644 index 0000000000..8b46ca0323 --- /dev/null +++ b/openwrt/target/default/device_table.txt @@ -0,0 +1,162 @@ +# When building a target filesystem, it is desirable to not have to +# become root and then run 'mknod' a thousand times. Using a device +# table you can create device nodes and directories "on the fly". +# +# This is a sample device table file for use with genext2fs. You can +# do all sorts of interesting things with a device table file. For +# example, if you want to adjust the permissions on a particular file +# you can just add an entry like: +# /sbin/foobar f 2755 0 0 - - - - - +# and (assuming the file /sbin/foobar exists) it will be made setuid +# root (regardless of what its permissions are on the host filesystem. +# Furthermore, you can use a single table entry to create a many device +# minors. For example, if I wanted to create /dev/hda and /dev/hda[0-15] +# I could just use the following two table entries: +# /dev/hda b 640 0 0 3 0 0 0 - +# /dev/hda b 640 0 0 3 1 1 1 15 +# +# Device table entries take the form of: +# <name> <type> <mode> <uid> <gid> <major> <minor> <start> <inc> <count> +# where name is the file name, type can be one of: +# f A regular file +# d Directory +# c Character special device file +# b Block special device file +# p Fifo (named pipe) +# uid is the user id for the target file, gid is the group id for the +# target file. The rest of the entries (major, minor, etc) apply only +# to device special files. + +# Have fun +# -Erik Andersen <andersen@codepoet.org> +# + +#<name> <type> <mode> <uid> <gid> <major> <minor> <start> <inc> <count> +/dev d 755 0 0 - - - - - +/dev/pts d 755 0 0 - - - - - +/tmp d 1777 0 0 - - - - - +/etc d 755 0 0 - - - - - +/home/default d 2755 1000 1000 - - - - - +#<name> <type> <mode> <uid> <gid> <major> <minor> <start> <inc> <count> +/bin/busybox f 4755 0 0 - - - - - +/etc/shadow f 600 0 0 - - - - - +/etc/passwd f 644 0 0 - - - - - +/etc/network/if-up.d d 755 0 0 - - - - - +/etc/network/if-pre-up.d d 755 0 0 - - - - - +/etc/network/if-down.d d 755 0 0 - - - - - +/etc/network/if-post-down.d d 755 0 0 - - - - - +/usr/share/udhcpc/default.script f 755 0 0 - - - - - +# uncomment this to allow starting x as non-root +#/usr/X11R6/bin/Xfbdev f 4755 0 0 - - - - - +# Normal system devices +/dev/mem c 640 0 0 1 1 0 0 - +/dev/kmem c 640 0 0 1 2 0 0 - +/dev/null c 666 0 0 1 3 0 0 - +/dev/zero c 666 0 0 1 5 0 0 - +/dev/random c 666 0 0 1 8 0 0 - +/dev/urandom c 666 0 0 1 9 0 0 - +/dev/ram b 640 0 0 1 1 0 0 - +/dev/ram b 640 0 0 1 0 0 1 4 +/dev/loop b 640 0 0 7 0 0 1 2 +/dev/rtc c 640 0 0 10 135 - - - +/dev/console c 666 0 0 5 1 - - - +/dev/tty c 666 0 0 5 0 - - - +/dev/tty c 666 0 0 4 0 0 1 8 +/dev/ttyp c 666 0 0 3 0 0 1 10 +/dev/ptyp c 666 0 0 2 0 0 1 10 +/dev/ptmx c 666 0 0 5 2 - - - +/dev/ttyP c 666 0 0 57 0 0 1 4 +/dev/ttyS c 666 0 0 4 64 0 1 4 +/dev/fb c 640 0 5 29 0 0 32 4 +#/dev/ttySA c 666 0 0 204 5 0 1 3 +/dev/psaux c 666 0 0 10 1 0 0 - +#/dev/ppp c 666 0 0 108 0 - - - + +# MTD stuff +/dev/mtd c 640 0 0 90 0 0 2 4 +/dev/mtdblock b 640 0 0 31 0 0 1 4 + +#Tun/tap driver +/dev/net d 755 0 0 - - - - - +/dev/net/tun c 660 0 0 10 200 - - - + +# Audio stuff +#/dev/audio c 666 0 29 14 4 - - - +#/dev/audio1 c 666 0 29 14 20 - - - +#/dev/dsp c 666 0 29 14 3 - - - +#/dev/dsp1 c 666 0 29 14 19 - - - +#/dev/sndstat c 666 0 29 14 6 - - - + +# User-mode Linux stuff +/dev/ubda b 640 0 0 98 0 0 0 - +/dev/ubda b 640 0 0 98 1 1 1 15 + +# IDE Devices +/dev/hda b 640 0 0 3 0 0 0 - +/dev/hda b 640 0 0 3 1 1 1 15 +/dev/hdb b 640 0 0 3 64 0 0 - +/dev/hdb b 640 0 0 3 65 1 1 15 +#/dev/hdc b 640 0 0 22 0 0 0 - +#/dev/hdc b 640 0 0 22 1 1 1 15 +#/dev/hdd b 640 0 0 22 64 0 0 - +#/dev/hdd b 640 0 0 22 65 1 1 15 +#/dev/hde b 640 0 0 33 0 0 0 - +#/dev/hde b 640 0 0 33 1 1 1 15 +#/dev/hdf b 640 0 0 33 64 0 0 - +#/dev/hdf b 640 0 0 33 65 1 1 15 +#/dev/hdg b 640 0 0 34 0 0 0 - +#/dev/hdg b 640 0 0 34 1 1 1 15 +#/dev/hdh b 640 0 0 34 64 0 0 - +#/dev/hdh b 640 0 0 34 65 1 1 15 + +# SCSI Devices +#/dev/sda b 640 0 0 8 0 0 0 - +#/dev/sda b 640 0 0 8 1 1 1 15 +#/dev/sdb b 640 0 0 8 16 0 0 - +#/dev/sdb b 640 0 0 8 17 1 1 15 +#/dev/sdc b 640 0 0 8 32 0 0 - +#/dev/sdc b 640 0 0 8 33 1 1 15 +#/dev/sdd b 640 0 0 8 48 0 0 - +#/dev/sdd b 640 0 0 8 49 1 1 15 +#/dev/sde b 640 0 0 8 64 0 0 - +#/dev/sde b 640 0 0 8 65 1 1 15 +#/dev/sdf b 640 0 0 8 80 0 0 - +#/dev/sdf b 640 0 0 8 81 1 1 15 +#/dev/sdg b 640 0 0 8 96 0 0 - +#/dev/sdg b 640 0 0 8 97 1 1 15 +#/dev/sdh b 640 0 0 8 112 0 0 - +#/dev/sdh b 640 0 0 8 113 1 1 15 +#/dev/sg c 640 0 0 21 0 0 1 15 +#/dev/scd b 640 0 0 11 0 0 1 15 +#/dev/st c 640 0 0 9 0 0 1 8 +#/dev/nst c 640 0 0 9 128 0 1 8 +#/dev/st c 640 0 0 9 32 1 1 4 +#/dev/st c 640 0 0 9 64 1 1 4 +#/dev/st c 640 0 0 9 96 1 1 4 + +# Floppy disk devices +#/dev/fd b 640 0 0 2 0 0 1 2 +#/dev/fd0d360 b 640 0 0 2 4 0 0 - +#/dev/fd1d360 b 640 0 0 2 5 0 0 - +#/dev/fd0h1200 b 640 0 0 2 8 0 0 - +#/dev/fd1h1200 b 640 0 0 2 9 0 0 - +#/dev/fd0u1440 b 640 0 0 2 28 0 0 - +#/dev/fd1u1440 b 640 0 0 2 29 0 0 - +#/dev/fd0u2880 b 640 0 0 2 32 0 0 - +#/dev/fd1u2880 b 640 0 0 2 33 0 0 - + +# All the proprietary cdrom devices in the world +#/dev/aztcd b 640 0 0 29 0 0 0 - +#/dev/bpcd b 640 0 0 41 0 0 0 - +#/dev/capi20 c 640 0 0 68 0 0 1 2 +#/dev/cdu31a b 640 0 0 15 0 0 0 - +#/dev/cdu535 b 640 0 0 24 0 0 0 - +#/dev/cm206cd b 640 0 0 32 0 0 0 - +#/dev/sjcd b 640 0 0 18 0 0 0 - +#/dev/sonycd b 640 0 0 15 0 0 0 - +#/dev/gscd b 640 0 0 16 0 0 0 - +#/dev/sbpcd b 640 0 0 25 0 0 0 - +#/dev/sbpcd b 640 0 0 25 0 0 1 4 +#/dev/mcd b 640 0 0 23 0 0 0 - +#/dev/optcd b 640 0 0 17 0 0 0 - + diff --git a/openwrt/target/default/skel.tar.gz b/openwrt/target/default/skel.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..aa6ba5518663acc7614d726718b3c4d59f720a6d GIT binary patch literal 4846 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 F{2%ai`9J^w literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/etc/TZ b/openwrt/target/default/target_skeleton/etc/TZ new file mode 100644 index 0000000000..9fcb2a3c56 --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/TZ @@ -0,0 +1 @@ +MST7MDT diff --git a/openwrt/target/default/target_skeleton/etc/fstab b/openwrt/target/default/target_skeleton/etc/fstab new file mode 100644 index 0000000000..6d33629a7b --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/fstab @@ -0,0 +1,8 @@ +# /etc/fstab: static file system information. +# +# <file system> <mount pt> <type> <options> <dump> <pass> +/dev/root / ext2 rw,noauto 0 1 +proc /proc proc defaults 0 0 +devpts /dev/pts devpts defaults,gid=5,mode=620 0 0 +tmpfs /tmp tmpfs defaults 0 0 + diff --git a/openwrt/target/default/target_skeleton/etc/group b/openwrt/target/default/target_skeleton/etc/group new file mode 100644 index 0000000000..a21ef0f769 --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/group @@ -0,0 +1,10 @@ +root:x:0: +daemon:x:1: +bin:x:2: +sys:x:3: +adm:x:4: +tty:x:5: +disk:x:6: +utmp:x:43: +staff:x:50: +default:x:1000: diff --git a/openwrt/target/default/target_skeleton/etc/hostname b/openwrt/target/default/target_skeleton/etc/hostname new file mode 100644 index 0000000000..52e67d68aa --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/hostname @@ -0,0 +1 @@ +uclibc diff --git a/openwrt/target/default/target_skeleton/etc/hosts b/openwrt/target/default/target_skeleton/etc/hosts new file mode 100644 index 0000000000..ba712fe033 --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/hosts @@ -0,0 +1 @@ +127.0.0.1 localhost diff --git a/openwrt/target/default/target_skeleton/etc/init.d/S20urandom b/openwrt/target/default/target_skeleton/etc/init.d/S20urandom new file mode 100755 index 0000000000..433fafee4e --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/init.d/S20urandom @@ -0,0 +1,44 @@ +#! /bin/sh +# +# urandom This script saves the random seed between reboots. +# It is called from the boot, halt and reboot scripts. +# +# Version: @(#)urandom 1.33 22-Jun-1998 miquels@cistron.nl +# + +[ -c /dev/urandom ] || exit 0 +#. /etc/default/rcS + +case "$1" in + start|"") + if [ "$VERBOSE" != no ] + then + echo -n "Initializing random number generator... " + fi + # Load and then save 512 bytes, + # which is the size of the entropy pool + if [ -f /etc/random-seed ] + then + cat /etc/random-seed >/dev/urandom + fi + rm -f /etc/random-seed + umask 077 + dd if=/dev/urandom of=/etc/random-seed count=1 \ + >/dev/null 2>&1 || echo "urandom start: failed." + umask 022 + [ "$VERBOSE" != no ] && echo "done." + ;; + stop) + # Carry a random seed from shut-down to start-up; + # see documentation in linux/drivers/char/random.c + [ "$VERBOSE" != no ] && echo -n "Saving random seed... " + umask 077 + dd if=/dev/urandom of=/etc/random-seed count=1 \ + >/dev/null 2>&1 || echo "urandom stop: failed." + [ "$VERBOSE" != no ] && echo "done." + ;; + *) + echo "Usage: urandom {start|stop}" >&2 + exit 1 + ;; +esac diff --git a/openwrt/target/default/target_skeleton/etc/init.d/S40network b/openwrt/target/default/target_skeleton/etc/init.d/S40network new file mode 100755 index 0000000000..d835d9c72a --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/init.d/S40network @@ -0,0 +1,35 @@ +#!/bin/sh +# +# Start the network.... +# + +start() { + echo "Starting network..." + /sbin/ifup -a +} +stop() { + echo -n "Stopping network..." + /sbin/ifdown -a +} +restart() { + stop + start +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart|reload) + restart + ;; + *) + echo $"Usage: $0 {start|stop|restart}" + exit 1 +esac + +exit $? + diff --git a/openwrt/target/default/target_skeleton/etc/init.d/rcS b/openwrt/target/default/target_skeleton/etc/init.d/rcS new file mode 100755 index 0000000000..de411534da --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/init.d/rcS @@ -0,0 +1,27 @@ +#!/bin/sh + + +# Start all init scripts in /etc/init.d +# executing them in numerical order. +# +for i in /etc/init.d/S??* ;do + + # Ignore dangling symlinks (if any). + [ ! -f "$i" ] && continue + + case "$i" in + *.sh) + # Source shell script for speed. + ( + trap - INT QUIT TSTP + set start + . $i + ) + ;; + *) + # No sh extension, so fork subprocess. + $i start + ;; + esac +done + diff --git a/openwrt/target/default/target_skeleton/etc/inittab b/openwrt/target/default/target_skeleton/etc/inittab new file mode 100644 index 0000000000..a6c014e751 --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/inittab @@ -0,0 +1,47 @@ +# /etc/inittab +# +# Copyright (C) 2001 Erik Andersen <andersen@codepoet.org> +# +# Note: BusyBox init doesn't support runlevels. The runlevels field is +# completely ignored by BusyBox init. If you want runlevels, use +# sysvinit. +# +# Format for each entry: <id>:<runlevels>:<action>:<process> +# +# id == tty to run on, or empty for /dev/console +# runlevels == ignored +# action == one of sysinit, respawn, askfirst, wait, and once +# process == program to run + +# Startup the system +null::sysinit:/bin/mount -o remount,rw / +null::sysinit:/bin/mount -t proc proc /proc +null::sysinit:/bin/mount -a +null::sysinit:/bin/hostname -F /etc/hostname +null::sysinit:/sbin/ifconfig lo 127.0.0.1 up +null::sysinit:/sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo +# now run any rc scripts +::sysinit:/etc/init.d/rcS + +# Set up a couple of getty's +tty1::respawn:/sbin/getty 38400 tty1 +tty2::respawn:/sbin/getty 38400 tty2 + +# Put a getty on the serial port +#ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100 + +# Logging junk +null::sysinit:/bin/touch /var/log/messages +null::respawn:/sbin/syslogd -n -m 0 +null::respawn:/sbin/klogd -n +tty3::respawn:/usr/bin/tail -f /var/log/messages + +# Stuff to do for the 3-finger salute +::ctrlaltdel:/sbin/reboot + +# Stuff to do before rebooting +null::shutdown:/usr/bin/killall klogd +null::shutdown:/usr/bin/killall syslogd +null::shutdown:/bin/umount -a -r +null::shutdown:/sbin/swapoff -a + diff --git a/openwrt/target/default/target_skeleton/etc/inputrc b/openwrt/target/default/target_skeleton/etc/inputrc new file mode 100644 index 0000000000..2f1cb601a5 --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/inputrc @@ -0,0 +1,44 @@ +# /etc/inputrc - global inputrc for libreadline +# See readline(3readline) and `info readline' for more information. + +# Be 8 bit clean. +set input-meta on +set output-meta on +set bell-style visible + +# To allow the use of 8bit-characters like the german umlauts, comment out +# the line below. However this makes the meta key not work as a meta key, +# which is annoying to those which don't need to type in 8-bit characters. + +# set convert-meta off + +"\e0d": backward-word +"\e0c": forward-word +"\e[h": beginning-of-line +"\e[f": end-of-line +"\e[1~": beginning-of-line +"\e[4~": end-of-line +#"\e[5~": beginning-of-history +#"\e[6~": end-of-history +"\e[3~": delete-char +"\e[2~": quoted-insert + +# Common standard keypad and cursor +# (codes courtsey Werner Fink, <werner@suse.de>) +#"\e[1~": history-search-backward +"\e[2~": yank +"\e[3~": delete-char +#"\e[4~": set-mark +"\e[5~": history-search-backward +"\e[6~": history-search-forward +# Normal keypad and cursor of xterm +"\e[F": end-of-line +"\e[H": beginning-of-line +# Application keypad and cursor of xterm +"\eOA": previous-history +"\eOC": forward-char +"\eOB": next-history +"\eOD": backward-char +"\eOF": end-of-line +"\eOH": beginning-of-line + diff --git a/openwrt/target/default/target_skeleton/etc/issue b/openwrt/target/default/target_skeleton/etc/issue new file mode 100644 index 0000000000..f24b862c97 --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/issue @@ -0,0 +1,4 @@ + + +Welcome to the Erik's uClibc development environment. + diff --git a/openwrt/target/default/target_skeleton/etc/network/interfaces b/openwrt/target/default/target_skeleton/etc/network/interfaces new file mode 100644 index 0000000000..218b82cde5 --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/network/interfaces @@ -0,0 +1,4 @@ +# Configure Loopback +auto lo +iface lo inet loopback + diff --git a/openwrt/target/default/target_skeleton/etc/passwd b/openwrt/target/default/target_skeleton/etc/passwd new file mode 100644 index 0000000000..e0f473fc7b --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/passwd @@ -0,0 +1,13 @@ +root:x:0:0:root:/root:/bin/sh +daemon:x:1:1:daemon:/usr/sbin:/bin/sh +bin:x:2:2:bin:/bin:/bin/sh +sys:x:3:3:sys:/dev:/bin/sh +sync:x:4:100:sync:/bin:/bin/sync +mail:x:8:8:mail:/var/spool/mail:/bin/sh +proxy:x:13:13:proxy:/bin:/bin/sh +www-data:x:33:33:www-data:/var/www:/bin/sh +backup:x:34:34:backup:/var/backups:/bin/sh +operator:x:37:37:Operator:/var:/bin/sh +sshd:x:103:99:Operator:/var:/bin/sh +nobody:x:99:99:nobody:/home:/bin/sh +default:x:1000:1000:Default non-root user:/home/default:/bin/sh diff --git a/openwrt/target/default/target_skeleton/etc/profile b/openwrt/target/default/target_skeleton/etc/profile new file mode 100644 index 0000000000..cc2e0beb87 --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/profile @@ -0,0 +1,48 @@ +# ~/.bashrc: executed by bash(1) for non-login interactive shells. + +export PATH=\ +/bin:\ +/sbin:\ +/usr/bin:\ +/usr/sbin:\ +/usr/bin/X11:\ +/usr/local/bin + +# If running interactively, then: +if [ "$PS1" ]; then + + if [ "$BASH" ]; then + export PS1="[\u@\h \W]\\$ " + alias ll='/bin/ls --color=tty -laFh' + alias ls='/bin/ls --color=tty -F' + export LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.png=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:'; + else + if [ "`id -u`" -eq 0 ]; then + export PS1='# ' + else + export PS1='$ ' + fi + fi + + export USER=`id -un` + export LOGNAME=$USER + export HOSTNAME=`/bin/hostname` + export HISTSIZE=1000 + export HISTFILESIZE=1000 + export PAGER='/bin/more ' + export EDITOR='/bin/vi' + export INPUTRC=/etc/inputrc + export DMALLOC_OPTIONS=debug=0x34f47d83,inter=100,log=logfile + + ### Some aliases + alias ps2='ps facux ' + alias ps1='ps faxo "%U %t %p %a" ' + alias af='ps af' + alias cls='clear' + alias df='df -h' + alias indent='indent -bad -bap -bbo -nbc -br -brs -c33 -cd33 -ncdb -ce -ci4 -cli0 -cp33 -cs -d0 -di1 -nfc1 -nfca -hnl -i4 -ip0 -l75 -lp -npcs -npsl -nsc -nsob -nss -ts4 ' + #alias bc='bc -l' + alias minicom='minicom -c on' + alias calc='calc -Cd ' + alias bc='calc -Cd ' +fi; diff --git a/openwrt/target/default/target_skeleton/etc/protocols b/openwrt/target/default/target_skeleton/etc/protocols new file mode 100644 index 0000000000..98f9f2d30e --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/protocols @@ -0,0 +1,31 @@ +# /etc/protocols: +# $Id$ +# +# Internet (IP) protocols +# +# from: @(#)protocols 5.1 (Berkeley) 4/17/89 +# +# Updated for NetBSD based on RFC 1340, Assigned Numbers (July 1992). + +ip 0 IP # internet protocol, pseudo protocol number +icmp 1 ICMP # internet control message protocol +igmp 2 IGMP # Internet Group Management +ggp 3 GGP # gateway-gateway protocol +ipencap 4 IP-ENCAP # IP encapsulated in IP (officially ``IP'') +st 5 ST # ST datagram mode +tcp 6 TCP # transmission control protocol +egp 8 EGP # exterior gateway protocol +pup 12 PUP # PARC universal packet protocol +udp 17 UDP # user datagram protocol +hmp 20 HMP # host monitoring protocol +xns-idp 22 XNS-IDP # Xerox NS IDP +rdp 27 RDP # "reliable datagram" protocol +iso-tp4 29 ISO-TP4 # ISO Transport Protocol class 4 +xtp 36 XTP # Xpress Tranfer Protocol +ddp 37 DDP # Datagram Delivery Protocol +idpr-cmtp 39 IDPR-CMTP # IDPR Control Message Transport +rspf 73 RSPF #Radio Shortest Path First. +vmtp 81 VMTP # Versatile Message Transport +ospf 89 OSPFIGP # Open Shortest Path First IGP +ipip 94 IPIP # Yet Another IP encapsulation +encap 98 ENCAP # Yet Another IP encapsulation diff --git a/openwrt/target/default/target_skeleton/etc/random-seed b/openwrt/target/default/target_skeleton/etc/random-seed new file mode 100644 index 0000000000000000000000000000000000000000..fbc7352fbb40c3cab0441fad743cf61c5342d51c GIT binary patch literal 512 zcmV+b0{{Iq0UOB42;n<rZ7)sf8Kr=fg87_s+y&vLYgGJP-sY`OWMEj0aQ&I{*g5$) zH?Zu5*rX8>4xpAvJIL$H4mg*!B4&9jh)7+B2j-fX7o@K*bzj;pJ$FwoQzl&MuZ^Wy zrYS)x9vq<)#e~&1uB|_ITW-fntEg1^KXs3>vvgL7?_kg!+6=fg{R%Utkr$#pm<zB( zu)oAUWFK-u-)cWcuSL*8$Q<cmC?ll~NEK@l5k|75(YzZ_p!I6FJ}YI_3>PZ13liCc zi|M+im&71p*p+Z|7f(m-aedNFtEezFN<xKEd-wQ71%XuGfKr+6VcDycMQ(v6+Z0G| z-MPjg@JHu%y(|g}cTa=a4(m?GyU)ZD-T+-vLXX}cCXyn}vCXC3Hn1ft`zDTL(};Rr z?3wX?Eh5%n+AXAeDtXvl!o>-nZHytAhV~}?OM$-f$(%cG(ioV{==Ub4mfZP}OaJJ7 z25tvCcku=>;L?}O-dvK9`}<^gmg@IrnfQm#P>RRF|C9c;GDgEg_bw26{dkIVt1`{` z3#ol{Q_FL91TBD~{uZn<gw?^=VUuSaIf)=p`07n=>RRZ(Otf!KXM&;q)8B<Q8(T)k z?Z}a{1Jyf~bQPL{qVQk6jFNfBr)0;57HwN`o6Kw{wdPGHUWrfsJ}0VmW|Tr22whlH CkpS8N literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/etc/resolv.conf b/openwrt/target/default/target_skeleton/etc/resolv.conf new file mode 100644 index 0000000000..71a86dd76c --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/resolv.conf @@ -0,0 +1,2 @@ +domain dev.null +nameserver 127.0.0.1 diff --git a/openwrt/target/default/target_skeleton/etc/securetty b/openwrt/target/default/target_skeleton/etc/securetty new file mode 100644 index 0000000000..81616f38ea --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/securetty @@ -0,0 +1,12 @@ +tty1 +tty2 +tty3 +tty4 +tty5 +tty6 +tty7 +tty8 +ttyS0 +ttyS1 +ttyS2 +ttyS3 diff --git a/openwrt/target/default/target_skeleton/etc/services b/openwrt/target/default/target_skeleton/etc/services new file mode 100644 index 0000000000..13718ef3de --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/services @@ -0,0 +1,302 @@ +# /etc/services: +# $Id$ +# +# Network services, Internet style +# +# Note that it is presently the policy of IANA to assign a single well-known +# port number for both TCP and UDP; hence, most entries here have two entries +# even if the protocol doesn't support UDP operations. +# Updated from RFC 1700, ``Assigned Numbers'' (October 1994). Not all ports +# are included, only the more common ones. + +tcpmux 1/tcp # TCP port service multiplexer +echo 7/tcp +echo 7/udp +discard 9/tcp sink null +discard 9/udp sink null +systat 11/tcp users +daytime 13/tcp +daytime 13/udp +netstat 15/tcp +qotd 17/tcp quote +msp 18/tcp # message send protocol +msp 18/udp # message send protocol +chargen 19/tcp ttytst source +chargen 19/udp ttytst source +ftp-data 20/tcp +ftp 21/tcp +fsp 21/udp fspd +ssh 22/tcp # SSH Remote Login Protocol +ssh 22/udp # SSH Remote Login Protocol +telnet 23/tcp +# 24 - private +smtp 25/tcp mail +# 26 - unassigned +time 37/tcp timserver +time 37/udp timserver +rlp 39/udp resource # resource location +nameserver 42/tcp name # IEN 116 +whois 43/tcp nicname +re-mail-ck 50/tcp # Remote Mail Checking Protocol +re-mail-ck 50/udp # Remote Mail Checking Protocol +domain 53/tcp nameserver # name-domain server +domain 53/udp nameserver +mtp 57/tcp # deprecated +bootps 67/tcp # BOOTP server +bootps 67/udp +bootpc 68/tcp # BOOTP client +bootpc 68/udp +tftp 69/udp +gopher 70/tcp # Internet Gopher +gopher 70/udp +rje 77/tcp netrjs +finger 79/tcp +www 80/tcp http # WorldWideWeb HTTP +www 80/udp # HyperText Transfer Protocol +link 87/tcp ttylink +kerberos 88/tcp kerberos5 krb5 # Kerberos v5 +kerberos 88/udp kerberos5 krb5 # Kerberos v5 +supdup 95/tcp +# 100 - reserved +hostnames 101/tcp hostname # usually from sri-nic +iso-tsap 102/tcp tsap # part of ISODE. +csnet-ns 105/tcp cso-ns # also used by CSO name server +csnet-ns 105/udp cso-ns +# unfortunately the poppassd (Eudora) uses a port which has already +# been assigned to a different service. We list the poppassd as an +# alias here. This should work for programs asking for this service. +# (due to a bug in inetd the 3com-tsmux line is disabled) +#3com-tsmux 106/tcp poppassd +#3com-tsmux 106/udp poppassd +rtelnet 107/tcp # Remote Telnet +rtelnet 107/udp +pop-2 109/tcp postoffice # POP version 2 +pop-2 109/udp +pop-3 110/tcp # POP version 3 +pop-3 110/udp +sunrpc 111/tcp portmapper # RPC 4.0 portmapper TCP +sunrpc 111/udp portmapper # RPC 4.0 portmapper UDP +auth 113/tcp authentication tap ident +sftp 115/tcp +uucp-path 117/tcp +nntp 119/tcp readnews untp # USENET News Transfer Protocol +ntp 123/tcp +ntp 123/udp # Network Time Protocol +netbios-ns 137/tcp # NETBIOS Name Service +netbios-ns 137/udp +netbios-dgm 138/tcp # NETBIOS Datagram Service +netbios-dgm 138/udp +netbios-ssn 139/tcp # NETBIOS session service +netbios-ssn 139/udp +imap2 143/tcp # Interim Mail Access Proto v2 +imap2 143/udp +snmp 161/udp # Simple Net Mgmt Proto +snmp-trap 162/udp snmptrap # Traps for SNMP +cmip-man 163/tcp # ISO mgmt over IP (CMOT) +cmip-man 163/udp +cmip-agent 164/tcp +cmip-agent 164/udp +xdmcp 177/tcp # X Display Mgr. Control Proto +xdmcp 177/udp +nextstep 178/tcp NeXTStep NextStep # NeXTStep window +nextstep 178/udp NeXTStep NextStep # server +bgp 179/tcp # Border Gateway Proto. +bgp 179/udp +prospero 191/tcp # Cliff Neuman's Prospero +prospero 191/udp +irc 194/tcp # Internet Relay Chat +irc 194/udp +smux 199/tcp # SNMP Unix Multiplexer +smux 199/udp +at-rtmp 201/tcp # AppleTalk routing +at-rtmp 201/udp +at-nbp 202/tcp # AppleTalk name binding +at-nbp 202/udp +at-echo 204/tcp # AppleTalk echo +at-echo 204/udp +at-zis 206/tcp # AppleTalk zone information +at-zis 206/udp +qmtp 209/tcp # The Quick Mail Transfer Protocol +qmtp 209/udp # The Quick Mail Transfer Protocol +z3950 210/tcp wais # NISO Z39.50 database +z3950 210/udp wais +ipx 213/tcp # IPX +ipx 213/udp +imap3 220/tcp # Interactive Mail Access +imap3 220/udp # Protocol v3 +ulistserv 372/tcp # UNIX Listserv +ulistserv 372/udp +https 443/tcp # MCom +https 443/udp # MCom +snpp 444/tcp # Simple Network Paging Protocol +snpp 444/udp # Simple Network Paging Protocol +saft 487/tcp # Simple Asynchronous File Transfer +saft 487/udp # Simple Asynchronous File Transfer +npmp-local 610/tcp dqs313_qmaster # npmp-local / DQS +npmp-local 610/udp dqs313_qmaster # npmp-local / DQS +npmp-gui 611/tcp dqs313_execd # npmp-gui / DQS +npmp-gui 611/udp dqs313_execd # npmp-gui / DQS +hmmp-ind 612/tcp dqs313_intercell# HMMP Indication / DQS +hmmp-ind 612/udp dqs313_intercell# HMMP Indication / DQS +# +# UNIX specific services +# +exec 512/tcp +biff 512/udp comsat +login 513/tcp +who 513/udp whod +shell 514/tcp cmd # no passwords used +syslog 514/udp +printer 515/tcp spooler # line printer spooler +talk 517/udp +ntalk 518/udp +route 520/udp router routed # RIP +timed 525/udp timeserver +tempo 526/tcp newdate +courier 530/tcp rpc +conference 531/tcp chat +netnews 532/tcp readnews +netwall 533/udp # -for emergency broadcasts +uucp 540/tcp uucpd # uucp daemon +afpovertcp 548/tcp # AFP over TCP +afpovertcp 548/udp # AFP over TCP +remotefs 556/tcp rfs_server rfs # Brunhoff remote filesystem +klogin 543/tcp # Kerberized `rlogin' (v5) +kshell 544/tcp krcmd # Kerberized `rsh' (v5) +kerberos-adm 749/tcp # Kerberos `kadmin' (v5) +# +webster 765/tcp # Network dictionary +webster 765/udp +# +# From ``Assigned Numbers'': +# +#> The Registered Ports are not controlled by the IANA and on most systems +#> can be used by ordinary user processes or programs executed by ordinary +#> users. +# +#> Ports are used in the TCP [45,106] to name the ends of logical +#> connections which carry long term conversations. For the purpose of +#> providing services to unknown callers, a service contact port is +#> defined. This list specifies the port used by the server process as its +#> contact port. While the IANA can not control uses of these ports it +#> does register or list uses of these ports as a convienence to the +#> community. +# +nfsdstatus 1110/tcp +nfsd-keepalive 1110/udp + +ingreslock 1524/tcp +ingreslock 1524/udp +prospero-np 1525/tcp # Prospero non-privileged +prospero-np 1525/udp +datametrics 1645/tcp old-radius # datametrics / old radius entry +datametrics 1645/udp old-radius # datametrics / old radius entry +sa-msg-port 1646/tcp old-radacct # sa-msg-port / old radacct entry +sa-msg-port 1646/udp old-radacct # sa-msg-port / old radacct entry +radius 1812/tcp # Radius +radius 1812/udp # Radius +radacct 1813/tcp # Radius Accounting +radacct 1813/udp # Radius Accounting +nfsd 2049/tcp nfs +nfsd 2049/udp nfs +cvspserver 2401/tcp # CVS client/server operations +cvspserver 2401/udp # CVS client/server operations +mysql 3306/tcp # MySQL +mysql 3306/udp # MySQL +rfe 5002/tcp # Radio Free Ethernet +rfe 5002/udp # Actually uses UDP only +cfengine 5308/tcp # CFengine +cfengine 5308/udp # CFengine +bbs 7000/tcp # BBS service +# +# +# Kerberos (Project Athena/MIT) services +# Note that these are for Kerberos v4, and are unofficial. Sites running +# v4 should uncomment these and comment out the v5 entries above. +# +kerberos4 750/udp kerberos-iv kdc # Kerberos (server) udp +kerberos4 750/tcp kerberos-iv kdc # Kerberos (server) tcp +kerberos_master 751/udp # Kerberos authentication +kerberos_master 751/tcp # Kerberos authentication +passwd_server 752/udp # Kerberos passwd server +krb_prop 754/tcp # Kerberos slave propagation +krbupdate 760/tcp kreg # Kerberos registration +kpasswd 761/tcp kpwd # Kerberos "passwd" +kpop 1109/tcp # Pop with Kerberos +knetd 2053/tcp # Kerberos de-multiplexor +zephyr-srv 2102/udp # Zephyr server +zephyr-clt 2103/udp # Zephyr serv-hm connection +zephyr-hm 2104/udp # Zephyr hostmanager +eklogin 2105/tcp # Kerberos encrypted rlogin +# +# Unofficial but necessary (for NetBSD) services +# +supfilesrv 871/tcp # SUP server +supfiledbg 1127/tcp # SUP debugging +# +# Datagram Delivery Protocol services +# +rtmp 1/ddp # Routing Table Maintenance Protocol +nbp 2/ddp # Name Binding Protocol +echo 4/ddp # AppleTalk Echo Protocol +zip 6/ddp # Zone Information Protocol +# +# Services added for the Debian GNU/Linux distribution +poppassd 106/tcp # Eudora +poppassd 106/udp # Eudora +mailq 174/tcp # Mailer transport queue for Zmailer +mailq 174/tcp # Mailer transport queue for Zmailer +omirr 808/tcp omirrd # online mirror +omirr 808/udp omirrd # online mirror +rmtcfg 1236/tcp # Gracilis Packeten remote config server +xtel 1313/tcp # french minitel +coda_opcons 1355/udp # Coda opcons (Coda fs) +coda_venus 1363/udp # Coda venus (Coda fs) +coda_auth 1357/udp # Coda auth (Coda fs) +coda_udpsrv 1359/udp # Coda udpsrv (Coda fs) +coda_filesrv 1361/udp # Coda filesrv (Coda fs) +codacon 1423/tcp venus.cmu # Coda Console (Coda fs) +coda_aux1 1431/tcp # coda auxiliary service (Coda fs) +coda_aux1 1431/udp # coda auxiliary service (Coda fs) +coda_aux2 1433/tcp # coda auxiliary service (Coda fs) +coda_aux2 1433/udp # coda auxiliary service (Coda fs) +coda_aux3 1435/tcp # coda auxiliary service (Coda fs) +coda_aux3 1435/udp # coda auxiliary service (Coda fs) +cfinger 2003/tcp # GNU Finger +afbackup 2988/tcp # Afbackup system +afbackup 2988/udp # Afbackup system +icp 3130/tcp # Internet Cache Protocol (Squid) +icp 3130/udp # Internet Cache Protocol (Squid) +postgres 5432/tcp # POSTGRES +postgres 5432/udp # POSTGRES +fax 4557/tcp # FAX transmission service (old) +hylafax 4559/tcp # HylaFAX client-server protocol (new) +noclog 5354/tcp # noclogd with TCP (nocol) +noclog 5354/udp # noclogd with UDP (nocol) +hostmon 5355/tcp # hostmon uses TCP (nocol) +hostmon 5355/udp # hostmon uses TCP (nocol) +ircd 6667/tcp # Internet Relay Chat +ircd 6667/udp # Internet Relay Chat +webcache 8080/tcp # WWW caching service +webcache 8080/udp # WWW caching service +tproxy 8081/tcp # Transparent Proxy +tproxy 8081/udp # Transparent Proxy +mandelspawn 9359/udp mandelbrot # network mandelbrot +amanda 10080/udp # amanda backup services +amandaidx 10082/tcp # amanda backup services +amidxtape 10083/tcp # amanda backup services +isdnlog 20011/tcp # isdn logging system +isdnlog 20011/udp # isdn logging system +vboxd 20012/tcp # voice box system +vboxd 20012/udp # voice box system +binkp 24554/tcp # Binkley +binkp 24554/udp # Binkley +asp 27374/tcp # Address Search Protocol +asp 27374/udp # Address Search Protocol +tfido 60177/tcp # Ifmail +tfido 60177/udp # Ifmail +fido 60179/tcp # Ifmail +fido 60179/udp # Ifmail + +# Local services + diff --git a/openwrt/target/default/target_skeleton/etc/shadow b/openwrt/target/default/target_skeleton/etc/shadow new file mode 100644 index 0000000000..4941a1ac53 --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/shadow @@ -0,0 +1,12 @@ +root::10933:0:99999:7::: +bin:*:10933:0:99999:7::: +daemon:*:10933:0:99999:7::: +adm:*:10933:0:99999:7::: +lp:*:10933:0:99999:7::: +sync:*:10933:0:99999:7::: +shutdown:*:10933:0:99999:7::: +halt:*:10933:0:99999:7::: +uucp:*:10933:0:99999:7::: +operator:*:10933:0:99999:7::: +nobody:*:10933:0:99999:7::: +default::10933:0:99999:7::: diff --git a/openwrt/target/default/target_skeleton/root/.bash_history b/openwrt/target/default/target_skeleton/root/.bash_history new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openwrt/target/default/target_skeleton/root/.bash_logout b/openwrt/target/default/target_skeleton/root/.bash_logout new file mode 100644 index 0000000000..77ef1f9508 --- /dev/null +++ b/openwrt/target/default/target_skeleton/root/.bash_logout @@ -0,0 +1,7 @@ +# ~/.bash_logout: executed by bash(1) when login shell exits. + +# when leaving the console clear the screen to increase privacy + +case "`tty`" in + /dev/tty[0-9]*) clear +esac diff --git a/openwrt/target/default/target_skeleton/root/.bash_profile b/openwrt/target/default/target_skeleton/root/.bash_profile new file mode 100644 index 0000000000..27bf14953d --- /dev/null +++ b/openwrt/target/default/target_skeleton/root/.bash_profile @@ -0,0 +1,15 @@ +# .bash_profile + +export PATH=\ +/bin:\ +/sbin:\ +/usr/bin:\ +/usr/sbin:\ +/usr/bin/X11:\ +/usr/local/bin + +umask 022 + +if [ -f ~/.bashrc ]; then + source ~/.bashrc +fi diff --git a/openwrt/target/default/target_skeleton/root/.bashrc b/openwrt/target/default/target_skeleton/root/.bashrc new file mode 100644 index 0000000000..d13c8f9026 --- /dev/null +++ b/openwrt/target/default/target_skeleton/root/.bashrc @@ -0,0 +1,48 @@ +# ~/.bashrc: executed by bash(1) for non-login interactive shells. + +export PATH=\ +/bin:\ +/sbin:\ +/usr/bin:\ +/usr/sbin:\ +/usr/bin/X11:\ +/usr/local/bin + +# If running interactively, then: +if [ "$PS1" ]; then + + if [ "$BASH" ]; then + export PS1="[\u@\h \W]\\$ " + else + if [ "`id -u`" -eq 0 ]; then + export PS1='# ' + else + export PS1='$ ' + fi + fi + + export USER=`id -un` + export LOGNAME=$USER + export HOSTNAME=`/bin/hostname` + export HISTSIZE=1000 + export HISTFILESIZE=1000 + export PAGER='/bin/more ' + export EDITOR='/bin/vi' + export INPUTRC=/etc/inputrc + export DMALLOC_OPTIONS=debug=0x34f47d83,inter=100,log=logfile + export LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.jpg=01;35:*.jpeg=01;35:*.png=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.mpg=01;35:*.mpeg=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:'; + + ### Some aliases + alias ps2='ps facux ' + alias ps1='ps faxo "%U %t %p %a" ' + alias af='ps af' + alias cls='clear' + alias ll='/bin/ls --color=tty -laFh' + alias ls='/bin/ls --color=tty -F' + alias df='df -h' + alias indent='indent -bad -bap -bbo -nbc -br -brs -c33 -cd33 -ncdb -ce -ci4 -cli0 -cp33 -cs -d0 -di1 -nfc1 -nfca -hnl -i4 -ip0 -l75 -lp -npcs -npsl -nsc -nsob -nss -ts4 ' + #alias bc='bc -l' + alias minicom='minicom -c on' + alias calc='calc -Cd ' + alias bc='calc -Cd ' +fi; diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/a/ansi b/openwrt/target/default/target_skeleton/usr/share/terminfo/a/ansi new file mode 100644 index 0000000000000000000000000000000000000000..d1e14008c5b102878b914b58343dad09d75a7f21 GIT binary patch literal 1450 zcmds$O=uHQ5Xa}O#fJ7$Az*8y^s*RjquFHh#j1%KFlq`#dyoXFX|}ej`7(*N+NR*i zqX!WM>%oHu4}wL#c=4n0=2cJ&dQkA_=Rq&V|LkUy9IW6;aN$4mdo%Oqy`4=q2{&z| zKB|ehlqpn<1vWcMSx<GUoFB>-^QBDHn9NNL%^KAitaHUOk)ZY??1i8)a!@}te)Bje zM(ePri`FCWpdNCfax-`fg=r^z%-k1;O+ZQX;x^-yq6w3DrGpGAP=)5`0$pszFVW>z z1y}KN6_M*5(Hk9XRdm{$bPM_0&6+z+zx>BNjm87yAJPgvrx)~wKF}xnL6Ybdc4wy; z5QD8%qu~SZf}-LI?6r=Jy@UM{;;U=qI_v%~e*2ei{9b$%-$b|6EB(7UIHken>27I6 z@=EF&cL__oC09B{-T2kJ(!Ob!ge!dz?hwRYHsq2b>-*cN$t9nxClJ^Rv5!OhpgqtS zGzuw79yY+nq%c#cWmG1!^HHww^3tnWo|%=zU$%Wn65Kwh$CW;UfZ2hMG-1>RzL*(_ z+0ZKHHfD-@nZP$UVcZ6O57mGP7{r+@7x?6Pr6zl1eUi(psp#g|_}+4q3#(d4));+2 z)k1$essaO6Gze5I3<1LyMmUNv-k#@rfQI`<HhB8C4|rFPcV(7Oe4qY2bNA${Q;%}5 z^N$P9ii@TC>3X?dnW(OuxqtS_?9;h>=f0l*GXHMjWo>EkCt9Q+g})_ktZTA<7#J+T tMCG*RReXLm5DbMQ$Fc~q{1Hu!@bLZSNSIWc+!*UtXd5&PHNP=`v|lT3JNf_s literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/d/dumb b/openwrt/target/default/target_skeleton/usr/share/terminfo/d/dumb new file mode 100644 index 0000000000000000000000000000000000000000..ffdc8acf34bed25a78f4a019267bfca72f716179 GIT binary patch literal 308 zcmb1Qlwe?DU}R`w;9y88%}uJYFwjlT&neB#Qvh)lN=hmj7#IT>{{LqHs{4-ySTID; P6bvIS8v{E77Z?Hn(+>pZ literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/l/linux b/openwrt/target/default/target_skeleton/usr/share/terminfo/l/linux new file mode 100644 index 0000000000000000000000000000000000000000..e9ec115d5c584a45dedfa30384ced55125c985d9 GIT binary patch literal 1551 zcmb_cOGs2v82-<}$ZAnSQ8@?|T_UWUd+xpSV5~7qoKhpiML2}UOg_i){U~*kAc7zw zXj8O`7Old_Hnk|twryJUkQO~~Q7a1~2%5hC+?lboNU6j8-~avp`Q|*nIZUBgPertr zM#X)ZXifGHjcD8w>rD1`CQcFwd=PqMNUo%GIv?@7kxylqA(E6w8>o=Bl0iGsv8jS8 zsfudB>nI9rK*XpSm`=A-Hw|buOk;Eo>;he)D|D4^&@J5`r+f5(CN<CQ`;4BWp2_rH zBfrhf&(cSlqc8Lg*H|Iehyt-u6p3vjo!)^c7GB{X^9W|LTP?=Dm@gBDfVGI|AJp+o zzfE+AAu%jQ#h7@5-uqwlv$^U6Sg~BZ+s~bnzszT~_7Zhj{le^%rLtT`<PljX>t&;C zl8Jv@ap4Zxx@Vc|4$8Cgyu2tcFY|lZ{r*S3CT}ij_uFzpuB6rEi5jg&mubX9Mwc?; zJ!n|XfQTo07^w=uIU}l^r>;Jtmx!PpR!)NQUDASd0I?r&6j6gP%?_Z$pqXN3vogTU zp97njKGHD|)61nd<Yqg8LTRniy0FuNt)0a7QswoQ?89ssqMFVCtrVafq0gaAF5Q~X z7Cp#N0WkeMV+J$^8I@OaO&M6~W8yHlH`CU!aeP62+?p)mBj`>wd19X9wd4tK$Mrc* z9zUDLYQB~cW@%r@Z-kgCP}`-}eAfnb+^z$vT<QZgUFru7xHQOJwBcKXR$-S)Dqgp% zVE3jyo4qrQc_;2PeQlm=8E<{s_Okt9;#J3^<de=+*L3%E&vb7?-{by?fyu$Cp}VI( zpZ+xbZsf)2_0)GPQjf4x_=|))+E|4OTsxw)IZ8XIw1bv*+fuBtwBFKslOGhEz;lbk em#8lZ2>W6{4l5Y4gZzVA+COG?j=3+0AHom(k1vV< literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/r/rxvt b/openwrt/target/default/target_skeleton/usr/share/terminfo/r/rxvt new file mode 100644 index 0000000000000000000000000000000000000000..ba6987a1a8ae0e70a6f1f4f24a1ee3f1c79dcff6 GIT binary patch literal 1627 zcmbVL&r4KM6h8NAr4b5&5k87ZnjDM5d2hy127gvC_ydiQGC>q)97o^GI6rj!H7*Ql zk&B{&Xc28Hh!)Z!Y7+#l+SH~^ix&L{1uY_I`p%iBW+tJRIp6utch9|Z@AuxTR%hr4 zRZ>Egm!xNBvWpC^Y$P3zB}QylBtC7AWRq!^=d$ZkED=uTTo>mu*+{&ONa4pp7)&?` za_*xtI!uLsj52D2PNb=ns;HW3=!Ep0q#!j@JB3hn(gk2Y4bU)!Wp<n<C`no2dBJ76 zPAg!y=r-L$end}cm0rl)8+tGKD}6`)A-qudiA<_cC`FX3N>!x{bxhT&)5=m!s#Tp= zU8)ar{fGfIq(+f>MAf89IJ~HA#gv*?SJeu-?y3js3G(V+D_*HjqWl6XU8?tLoC0wG zQ5+TepgyFl^-)o3fc@)p+%d4JVr5uIpvAW6Jh%Nwpg*H$*H`7imZiD|yy56Koy_~( z(f9R3{a8QK&-F|FTEErr{+QkVpLRa;VVC=U+~vBRpKxQvXXih^=x+{FC3{Nt(S9-p z-7)u+*BuVJr%ZP^4Z(^6LdKxkiQI+Yys0ZB3qz1wO}~xrN60wRSw#Cr*$3J~6+nL+ z-~|NG>kDwNk0HRifG>`Z+Zc>9n4QvP8;vM@HY?I&q6stpaR!#Lm2EU5d$~$ud2un0 z-x}a9Z_o<*f(^E_O&hwp<-pbwXa}Nk2w-}-^a?uM6h+#+KH+}BfMBCw6QfzrD6*_M zhpK@k>31AyA)^_RSk0~o=~*Lu4pI1gLb}%o?<NXwBn1Ap;H+{nzg$hOiksv9>|6+) z|FOcrdEjk;A0$o@qH;2NbBH;_G$Mt_(D3lc$k<pkIx#UhY1{F5B9Tl^O{G%lbS9I{ zPEXIw<Z`pKb93|a3k!>j`TP=J`wAJJ4x_FflwIoOTZ*yPaWJv6ky(HtjA&ruXBb78 zV!0`OrdVi-o2FQ9ise>uKe5}AeyjM1_;t0Kg1#nxPuA>Ru<G;fQ|>Tp>|m{@)+s$O I-cwJ%0l%&O@&Et; literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/s/screen b/openwrt/target/default/target_skeleton/usr/share/terminfo/s/screen new file mode 100644 index 0000000000000000000000000000000000000000..8f4206c81e6bb6dd8e0e7cc01cc0699d7d095c4f GIT binary patch literal 1318 zcmc&zJ8aWX6g>|REg(@gK9(RtibP3M{7ciQ>X(87ZAhUNittjaO%o?}>N=mM`ILnP zF|aT(Au%u@76t|e!~hZ!EHEJkrcMm7Ft8wV--|P#bYMZXe9t-ey!)>2dy-GF^BBM} zSnNA1uXx#PsdaNHq{#Ax>1&HuLK$s%L=V+0uTnMbP$la*R>`yhCSFb?7#7fv6YzI= z`Z0z5RCE9bspce3BaA^&8N~#x&0>zS6qX1xFkm7pRxK3a3g!D%!42HT9a493PvrOU z01xpfsCgXl6XK_Ven$K}(7yiyFYy|0@D3mF37_#5JNSklwEh#n@EiMBAL|_82peF> z1HH?U{4=z6mPMG(#z|dfX_g^2dv+9r;}E*6%&Nq7il%UT`?h=hS3OSeuK(k_W$*Xw z+y8c=k9#=Z7q-JB;}-gG7?KgT!mbit9Sgf^c-13A%Mm0c<0{b{1?Rttl44(y>`66d z({CX}p6DW^6p^OegbNfY93_l71PTY8SH-!~MC#DbD;YxaEvj%;oeUacP$p|$^w+i_ zrDrI3Q&r*Fb&4Ali{vOVattLda8zJ|qbdt6Btd$XJe_AF9QdX*jhvpQWKyxE3Bh@3 z9MUC{;$HX%g-CS;jnQ$Yx?;X7cz;n$T|0tWuRt1w6z7*lJ(4(tNMvXz8XX>%<>h75 zTwBZK@_EZD6pBULcAQdaecg38HaxFfu2ibkT5WT)Uf<ekG@8v;tKHtFvCqwPZb#)8 VW2oXxT4GF3@T=6s2wdrb`U6T0>Q?{& literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/s/screen-w b/openwrt/target/default/target_skeleton/usr/share/terminfo/s/screen-w new file mode 100644 index 0000000000000000000000000000000000000000..965601433d1e6a82be5936d800c9f6198b3aa8c9 GIT binary patch literal 1334 zcmc&zJ8Tm{5Pb`X1ds?FpOfH(bP|zcb3ey1QN9FZNQ@zgki|8z9LGNU&UXBdKcS&P z6f{&+NE8%^hJu0uQGkR54OEDNDisAZ6g23VUE2k63K|s4^WK}cv$L}+-6?hfBRB?| zeP`ulDV56m>+PGXvZku%=dP_>k>f^S+>~o}sZvciawS!A?L3LPUCGFrq07mFQwEs$ zb0WcT2g5i4Z<pUNX0e}&4&WfwoWyA;7!{R%Ow-x|7AcEjl`swq38ciTjU0+Xd0tg; z6SwIc&%29zBEOFZc!)>6n#VnULj1I+pAkRrY0rCsmw1ggc!v-8gwObj9el$NTK|b( z_>FyRh;=V;gpIJ{J-y47yfd_Rmid^;rbu08F%~CI4D84X$0aPXGOH3dC|bfD?Asae zUkx~eyZ(>!mc8Gzv;XZzANO#+FKmZN)-4R-FeFQ{m7=DsPbx)SSuc@cqzNLDb(Lt5 zg7aTR5wR~q_KY5M=(7+aLv#^Rl*lk0!s`@K93>381R4jESB1DTMC#JVELlSGExK@Z zlMEVSR3&Rk^f$I4#pWq^Q(fcP4T@!o6>_v7IhGa@I3Y01QCEc)k|4G~p2@Ru4t!IL zMvl!<GNU=twBU?11?dt=@h<#8A)<XjV|1O_zF6uD-d_|`*RG(}Nk|irLj2LFM+Ar9 z^No%9{egh0uB{~!8yo3#CS%*#Y%b?GuA9#n3dQ2)W~o#zS1Q$NtyZr$8e3b<W~<e1 hcRJfN_PP1)>*)MpEM45m2v3?}{*;Cofh)78{s5B@@1g(z literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/s/sun b/openwrt/target/default/target_skeleton/usr/share/terminfo/s/sun new file mode 100644 index 0000000000000000000000000000000000000000..47c0d66faa75dd398d28cce7e313fbd4d1edcb8c GIT binary patch literal 1019 zcmb_aJx>Bb5S>-ySB%EkK_O^1YD~nvLq0-?qL_$6z!)oR3{aqQhujfALPBR}XJ=<& zXJ=tyYinz3Vf-67J9`j7sPvLI@6F8H$xL!C7J?}lge8_{R@JB>gbZ5kplWzh#azX- zt}MGyvOEbRx8k`lE2oxyY!^+#lQRv=JSzY&pidEl3^W>Z2!H{Mjm8iR!#Jr)m?id7 zoX5C;SOy>E(%bpz5OO+Ehhx8-+mOIo%BiQ3_gkJrID#CUz&Tt(9d6(j?%<xf4;UZe z37#GAOY2SN2JP7^yrJtI@zK})+1B|&{Z08aYo9aIk+pYvX;%-ox2v{Dxv#6*Yg+$W zfJOiGzW?O^=)_rqjo@E20q*P`Vi&=SyexP=!pj=Z?_hHji(7~oB7;aFf~97VLSh4v zL~k8=6QODTYe~9Jq^&6mC<-bHDGC$mtBQmojY!axI1O|vG@`i>?JBn-Ay*?Iw;_>4 zVc`+(>?&X9<p8%Mf=8s(Q2Lb=ysYyY=0P4Q!5Eq~;jBhGi7;&;!gPxWt6OyEK+1%T HuLQ;)GgMaY literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/v/vt100 b/openwrt/target/default/target_skeleton/usr/share/terminfo/v/vt100 new file mode 100644 index 0000000000000000000000000000000000000000..5cc9a88bb0ec76c6aa649b8d936b91bf7e73f0ed GIT binary patch literal 1143 zcmdT?J#W)c6uplR6&R8Uf$Akg9%>~%;(U;zghWj{M3mA}*uqe&&PQ82aT3Q#TDKA_ zYXxFJhyfu6gcukY7#J8B7#J8BkYE4_2_}S?kj(LWPTGk60iJyBJ@?%6uHLgf&Q8;D z8lw>Nm}9H4m@DEL&2;thN<<WqiS9W~ceMISS&ulYdbu%4#Kc2#p}=CaNJr=-d14(z zCOSZeFn^p*(OIFV=`vjbTN2fE#2bRiJvvpWv8VRD9^Ir{P<H5cpx>uQBM!OK^PcWe zp9TCmy`Y!$ieA$jdQ0!<J$;~$LGN>rzXbUk{h(g~AI#h@{|P*Y8Qz(90vKHpp=1&B ztiWd39NPiEGxXhM_t*pWkUbX4lcD~JeHHxsP}!aPb02ND`~R`uY>bYPQsS%JQn{Yt zR-EfC2#G2}Q7K)DW>c{o_*^ub@bgd@*;0fpCngo~=P9L`Xg2P<r$r8drOZH52PFLu zNlGOQyBQAb1Cz{{y-)!9z#`BCt^!NIHNXZsfCCsn7nlWRfN6})tA^sAE3ej+i^$^E z7$^yxlE5wr_T=DB7zjx}r2LSsAxzasnIa|a-+EqLUn#|S-k)fl=PtK1D$n?J95g8@ zS_#og%Q}fxif2sUc7fX=UJmmNDMdPp^EQDtfX}gD0d-nl*0f5cT3uUPUpEZXtk)Y2 x%W5`Tt#;eCI~~XAc6+^ke`8~F({;DDwzqK)oK{4<j){UY8N;M`2&(*`e*w3}N7n!V literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/v/vt220 b/openwrt/target/default/target_skeleton/usr/share/terminfo/v/vt220 new file mode 100644 index 0000000000000000000000000000000000000000..cefb7b358764526779e91a851e6a5a113adbf729 GIT binary patch literal 975 zcmbVKzi-n(6n+;fwIBwTRtR^9qMV2r8vA^%Q`t(@HlR=lZ2=)fmKw!vlG=&mIBC<S z87d(mvA_re3u0nqVPfJx;4eUo42Xq+0rT$SR6?Q)Cx74j-VZ;&d-4^s0JAU+Z{cdH zA2Fs5kyUkAy1tfva3B42qm}MQnyRK<zvnqoquomT?V1Zf<OA}c7Kgwl#PMZ>IOos; zq+kl|EM(xCjO%a{DzF6)(R&0AvWsYdFS8vOz=>3G{7l;C@Dg65dIRsI{~kWT$D|^T zKcV`J_=fnNM1P?DndmtF1;1g6%#e%Z5}70OBtvp!f#@WT3kaL6kQ->lSx@ZP`+vTJ zeVXJ1`3ZSSUXWL^@0T;We?5)QrRG!r{%R&Q4HrPE(gqDQTC-@tXf4D*S*f!1tZk@8 zbZ%vBUD(sWU*+Yjt;w=g@g8EC86M1xMIFr=Vg<2@sDP4Fvo;g$3_lUtL~v1VPCU~` zk0a$)vo;rROfuX<hsit>1y#*rJj4*Uv@+y--7w#+JE5D8oX1@^%FF)@%WliD^btxN zc0&xrmeAYSLfl2%6TM84*9wwFw#rn=nv6&(sDxM)!Vr{PvWVB$JtQv35M<Vo3iY$c zDu7~wQo?1Z`64J4+$R^Js?uc|EYir*s3jyr$;XnTG{#b+fli0$o7D0}*%FO#$<)QY zQ47w)_O|2f?CkC~n|phn=liWzyB!3bP8fE(QPk`8`}_L`2ZO=k;nC4>cziq(_rb9x Ji%s(p`~h@Wg6jYP literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/v/vt52 b/openwrt/target/default/target_skeleton/usr/share/terminfo/v/vt52 new file mode 100644 index 0000000000000000000000000000000000000000..d55932876a44f3f076fc94bdfe1a6903af666286 GIT binary patch literal 461 zcmb1Q<YQo9U}l)i(7{kvVro>AlA5dlVlV_Sa4<+P{Qu9uzyu`!|7T&~WZ(g__!%@9 zw1F%=FwYQ3nt)j#Rsa8+Be5YOFwzRA3`~VBk_vkyHcTF!c7m#Lh0-1b^mr4HM>ikD z_XCCmL_8RW?obAH1}+9^4{0w3X>SG)8L3)esH(1@uBxq?tXg0MV=_oP0hKXGyD&&Q zGe|o!NV_pey90w6Bn%Vd0vY8A4C{o1#Kg3;^z^K(?ChMJ+}ymp{QQD~!os4W;^LB$ Z($ccB^74v`%F3#$>gt-B+S<B01^}vJBG3Q; literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/x/xterm b/openwrt/target/default/target_skeleton/usr/share/terminfo/x/xterm new file mode 100644 index 0000000000000000000000000000000000000000..89da67d089b6cd88a5fef65886cf45e308861ae3 GIT binary patch literal 1366 zcmc&zO=}ZT6uob(XuGI__(8`-P@+~{WZsNTB*suHTH1zGgIJtRLz5<HXOeW1G)bHE z2Ph~~P=AUGapS^;xadMbL=Xf)5ClOG1jqAk(uExmTs7pLd+vGXechQE5fM5-dnhL^ zX{~zRb32S7MN8$Z6Uw^{CtI(0p)+%#+of`@(hOzVwR+wiB@+Bs2}IB=?Wbep`$QTI z&|w;(6Lbo-@1LbOCBVkHngCu$OjDZc4Dc4+VZOjvB$qs}Cbg-He3u^3CXcAq9{1T( z<Y#^U9Qj3``~FLMMO*ZS-q8p8L|^C|{h(hsqwnuU42ofK2wDA(3SFG+^PUpKbHWk{ z_FNNbF$b0n%vfUO9`L?+C^q}!j{?5l>Q4gt>wvPw%G-b*Jl{^`{eR8*C_am?;=A}M zev1KZNIR$<(RQx5JN0qxw02&zcI7lNZ66JhZih?Zsu9k`!&Mp1c@WG3U{bf`6!J7e z<-c5$JaG~qgKkeC#u2lK6b%Cnm-MJ^C#`4^m8BpGsRx#ek5RW(EvMMz=rI(Q(^q?w zJy<XrEdq?V8MoqNjxy;n{W6R*ytTPOdin}N?JW&e-9X$#WS|%qpx8!~F~)dNp^PwR z3P@jtHl`}&Pvbsmb)Tf+@K#Bqs3%Z!lhj5`QriUE_mr7!qLyQi>I@SshkpF~O6WmU zbu~qUG(VrsE-n@drP9*U^0MQ&Zn<2kRI4j1o>!~Y>y5_hYO~pDwcBfJ>+79Px4VIp zk4CVcrS73R(PL7z$d;^1ZinQXN^Xbbc9?88rE;3=H`$LTj+Y{bZrWpI0G@+fKvt2W EKW-D*_5c6? literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/terminfo/x/xterm-xfree86 b/openwrt/target/default/target_skeleton/usr/share/terminfo/x/xterm-xfree86 new file mode 100644 index 0000000000000000000000000000000000000000..eeac9d8d35fdaf374dd11590cfaabc6f45a69c64 GIT binary patch literal 1840 zcmcIkONbn05U%PGlc;3zAh<RwlS9WuNSJ=iiy?N5QO9JL$phIWqp(9}c6XAV$IkR- zcCwF);MI$Wf(YtGg<K*mf(m=lLr@QT(Tf4`6bOWXo&ue(s(WSy17Sg%sjt4OzpDEG ztNxy6c$%hYf|`6IwGuXZtwSsGy+)&uTZ^rBV-T~nEH>M<Al+y!2eq)%OCLD*iiW1W z!<qDKvt92D(r1VLu+ch5#QGBjq9{Zx;3?WoPgC@OXEz;1#3S@5A|~ls+E35ZVMG?` z1WhAv7W_QT0qe9#9qMb90S#$`-ctT9eE|IteM+CvHQJ=F=v&x7(J%BH-PDLEx|QgA z(8TdJ4Cq}6kD|wUf}i3^p5lG{93Ntri|q4ptiQ%He1>QFjU;xC>l}>p9&jYMLSE;$ z`5i>P&mZ#_&|fAQ-|!ZH2Y!QpRL@QRgKzU4zRQ1c*@&W(kocJ~P8+Wq=Z!bjQycr= zGd@)QiQ?yDe-vFauEW~=hi6plVfyPG<!l+>8$TF78^0RA8-E(Nj625PJIa69ZnoF& z?XWJVo=82JnoLclMm6@Qf-xWY{vUlkdCz8QD`i$M&@Ot6%&OJ2y0%p>SzX7f_uz0B z0A;i4oPa(F5uHT6x=rJRveqcW?K{~3pNNu0sFxrwZkwk-XJ{`l+XC1EzMb(3i?Pm2 zjweu%rTiE?VY<b0_*XEiEdj~Q2T6qh4o|?*EJri^tQ5wU%<8@_m|OA?4|xHeY2B#1 zL1yI`ME2&`Vx5MZft-cM&cai*^NIz<qM(yet`tx?4xcAhPC$|>ID19UZpZKQ?M3ql z7WEkNHYGD7f<45Zqa!jsB2rv~rJYKoZWH1OWC0hU|8>LyoXO1UWaec`^16)WOObBQ zTC>8EZI#4!K)sk^$<?KNY<pPB#xxIFuu3h-C|coOt1)4f$Sl(y9CiR%h72J~kUq`L z)oSze3k%KWrAwDD2SKaVZg)D}?$T1P*YAhn^754{gTczmaCr6V>gw9s`uc{n&)0k4 z=P|bf$IOEn)Os0i>2F02AXAFF?a275j&|PBQ8_vQM@Qx8s9X(q9f@=`-qm<pt~J_& zTVKbxtGPD7w@Z%nQp7EmyrNt@H*VOfy>1<`LeFYQ`&M1Ga*5@sWhYinEjPC6Xc($^ S|49`&zpHm3t|^~wi|zx05Hhj= literal 0 HcmV?d00001 diff --git a/openwrt/target/default/target_skeleton/usr/share/udhcpc/default.script b/openwrt/target/default/target_skeleton/usr/share/udhcpc/default.script new file mode 100755 index 0000000000..a52a7f8122 --- /dev/null +++ b/openwrt/target/default/target_skeleton/usr/share/udhcpc/default.script @@ -0,0 +1,39 @@ +#!/bin/sh + +# udhcpc script edited by Tim Riker <Tim@Rikers.org> + +[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1 + +RESOLV_CONF="/etc/resolv.conf" +[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast" +[ -n "$subnet" ] && NETMASK="netmask $subnet" + +case "$1" in + deconfig) + /sbin/ifconfig $interface 0.0.0.0 + ;; + + renew|bound) + /sbin/ifconfig $interface $ip $BROADCAST $NETMASK + + if [ -n "$router" ] ; then + echo "deleting routers" + while route del default gw 0.0.0.0 dev $interface ; do + : + done + + for i in $router ; do + route add default gw $i dev $interface + done + fi + + echo -n > $RESOLV_CONF + [ -n "$domain" ] && echo search $domain >> $RESOLV_CONF + for i in $dns ; do + echo adding dns $i + echo nameserver $i >> $RESOLV_CONF + done + ;; +esac + +exit 0 diff --git a/openwrt/target/jffs2/Config.in b/openwrt/target/jffs2/Config.in new file mode 100644 index 0000000000..0d79dd1ffa --- /dev/null +++ b/openwrt/target/jffs2/Config.in @@ -0,0 +1,6 @@ +config BR2_TARGET_ROOTFS_JFFS2 + bool "jffs2 root filesystem for the target device" + default n + help + Build a jffs2 root filesystem + diff --git a/openwrt/target/jffs2/Makefile.in b/openwrt/target/jffs2/Makefile.in new file mode 100644 index 0000000000..31452eba8d --- /dev/null +++ b/openwrt/target/jffs2/Makefile.in @@ -0,0 +1,3 @@ +ifeq ($(strip $(BR2_TARGET_ROOTFS_JFFS2)),y) +TARGETS+=jffs2root +endif diff --git a/openwrt/target/jffs2/jffs2root.mk b/openwrt/target/jffs2/jffs2root.mk new file mode 100644 index 0000000000..5dd79032fd --- /dev/null +++ b/openwrt/target/jffs2/jffs2root.mk @@ -0,0 +1,50 @@ +############################################################# +# +# mtd provides us with mkfs.jffs2, to target JFFS2 filesystems +# +############################################################# + +MTD_DIR:=$(BUILD_DIR)/mtd-20011217 +MTD_SOURCE=mtd_20011217.orig.tar.gz +MTD_SITE=http://ftp.debian.org/debian/pool/main/m/mtd +MKFS_JFFS2=$(shell which mkfs.jffs2 2>/dev/null || echo $(MTD_DIR)/util/mkfs.jffs2) + +$(DL_DIR)/$(MTD_SOURCE): + $(WGET) -P $(DL_DIR) $(MTD_SITE)/$(MTD_SOURCE) + +$(MTD_DIR)/.unpacked: $(DL_DIR)/$(MTD_SOURCE) + zcat $(DL_DIR)/$(MTD_SOURCE) | tar -C $(BUILD_DIR) -xvf - + touch $(MTD_DIR)/.unpacked + +$(MTD_DIR)/util/mkfs.jffs2: $(MTD_DIR)/.unpacked +# CFLAGS=-I$(LINUX_HEADERS_DIR)/include $(MAKE) LINUXDIR=$(LINUX_DIR) -C $(MTD_DIR)/util + $(MAKE) LINUXDIR=$(LINUX_DIR) -C $(MTD_DIR)/util + +mtd: $(MKFS_JFFS2) + + +############################################################# +# +# Build the jffs2 root filesystem image +# +############################################################# + +jffs2root: mtd + #-@find $(TARGET_DIR)/lib -type f -name \*.so\* | xargs $(STRIP) --strip-unneeded 2>/dev/null || true; + -@find $(TARGET_DIR) -type f -perm +111 | xargs $(STRIP) 2>/dev/null || true; + @rm -rf $(TARGET_DIR)/usr/man + @rm -rf $(TARGET_DIR)/usr/info + $(MKFS_JFFS2) --pad --little-endian --squash -e 0x20000 \ + -D target/default/device_table.txt -d $(TARGET_DIR) \ + -o $(IMAGE).jffs2 + +jffs2root-source: $(DL_DIR)/$(MTD_SOURCE) + +jffs2root-clean: + -$(MAKE) -C $(MTD_DIR) clean + +jffs2root-dirclean: + rm -rf $(MTD_DIR) + + + diff --git a/openwrt/toolchain/Config.in b/openwrt/toolchain/Config.in new file mode 100644 index 0000000000..22a11e7d65 --- /dev/null +++ b/openwrt/toolchain/Config.in @@ -0,0 +1,57 @@ +# + +menu "Toolchain Options" + + +source "toolchain/uClibc/Config.in" +source "toolchain/binutils/Config.in" +source "toolchain/gcc/Config.in" +source "toolchain/ccache/Config.in" +source "toolchain/gdb/Config.in" + + +comment "Common Toolchain Options" + +config BR2_ENABLE_MULTILIB + bool "Enable multilib support?" + default y + help + If you want multilib enabled, enable this... + +config BR2_LARGEFILE + bool "Enable large file (files > 2 GB) support?" + depends on !BR2_cris + default y + help + Enable large file (files > 2 GB) support + +config BR2_SOFT_FLOAT + bool "Use software floating point by default" + default n + depends on BR2_arm || BR2_mips || BR2_powerpc + help + If your target CPU does not have a Floating Point Unit (FPU) or a + kernel FPU emulator, but you still wish to support floating point + functions, then everything will need to be compiled with soft floating + point support (-msoft-float). + + Most people will answer N. + +config BR2_TARGET_OPTIMIZATION + string "Target Optimizations" + default "-Os -pipe" + help + Optimizations to use when building for the target host. + +# Might be worth experimenting with for gcc 3.4.x. +#GCC_WITH_CPU:= +#GCC_WITH_ARCH:= +#GCC_WITH_TUNE:= + +#GCC_WITH_CPU:=--with-cpu= +#GCC_WITH_ARCH:=--with-arch= +#GCC_WITH_TUNE:=--with-tune= + + +endmenu + diff --git a/openwrt/toolchain/Makefile.in b/openwrt/toolchain/Makefile.in new file mode 100644 index 0000000000..5b2d7f213d --- /dev/null +++ b/openwrt/toolchain/Makefile.in @@ -0,0 +1,7 @@ +ifeq ($(BR2_ENABLE_MULTILIB),y) +MULTILIB:=--enable-multilib +endif + + +# FIXME -- this is temporary +OPTIMIZE_FOR_CPU=$(ARCH) diff --git a/openwrt/toolchain/binutils/2.14.90.0.6/001-debian.patch b/openwrt/toolchain/binutils/2.14.90.0.6/001-debian.patch new file mode 100644 index 0000000000..97b8e7fde7 --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.6/001-debian.patch @@ -0,0 +1,185 @@ +--- binutils-2.11.90.0.19.orig/ld/Makefile.am ++++ binutils-2.11.90.0.19/ld/Makefile.am +@@ -19,7 +19,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +--- binutils-2.11.90.0.19.orig/ld/Makefile.in ++++ binutils-2.11.90.0.19/ld/Makefile.in +@@ -123,7 +123,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff -urN binutils-2.11.90.0.27/gprof/gprof.texi binutils-2.11.90.0.27.new/gprof/gprof.texi +--- binutils-2.11.90.0.27/gprof/gprof.texi Tue Jun 19 14:57:58 2001 ++++ binutils-2.11.90.0.27.new/gprof/gprof.texi Mon Aug 27 10:27:23 2001 +@@ -137,6 +137,10 @@ + If more than one profile file is specified, the @code{gprof} + output shows the sum of the profile information in the given profile files. + ++If you use gcc 2.95.x or 3.0 to compile your binaries, you may need ++to add the @samp{-fprofile-arcs} to the compile command line in order ++for the call graphs to be properly stored in gmon.out. ++ + @code{Gprof} calculates the amount of time spent in each routine. + Next, these times are propagated along the edges of the call graph. + Cycles are discovered, and calls into a cycle are made to share the time +@@ -266,6 +270,11 @@ + to do the linking, simply specify @samp{-pg} in addition to your usual + options. The same option, @samp{-pg}, alters either compilation or linking + to do what is necessary for profiling. Here are examples: ++ ++If you use gcc 2.95.x or 3.0.x, you may need to add the ++@samp{-fprofile-arcs} option to the compile line along with @samp{-pg} ++in order to allow the call-graphs to be properly included in the gmon.out ++file. + + @example + cc -g -c myprog.c utils.c -pg +diff -urN binutils-2.11.92.0.5/bfd/opncls.c binutils-2.11.92.0.5.new/bfd/opncls.c +--- binutils-2.11.92.0.5/bfd/opncls.c Mon Oct 1 18:25:21 2001 ++++ binutils-2.11.92.0.5.new/bfd/opncls.c Sat Oct 13 11:26:59 2001 +@@ -127,6 +127,13 @@ + { + bfd *nbfd; + const bfd_target *target_vec; ++ struct stat s; ++ ++ if (stat (filename, &s) == 0) ++ if (S_ISDIR(s.st_mode)) { ++ bfd_set_error (bfd_error_file_not_recognized); ++ return NULL; ++ } + + nbfd = _bfd_new_bfd (); + if (nbfd == NULL) +diff -urN binutils-2.11.92.0.12.3/opcodes/i386-dis.c binutils-2.11.92.0.12.3.new/opcodes/i386-dis.c +--- binutils-2.11.92.0.12.3/opcodes/i386-dis.c Fri Nov 16 17:05:55 2001 ++++ binutils-2.11.92.0.12.3.new/opcodes/i386-dis.c Mon Dec 31 15:55:04 2001 +@@ -1830,7 +1830,7 @@ + * The function returns the length of this instruction in bytes. + */ + +-static char intel_syntax; ++static signed char intel_syntax; + static char open_char; + static char close_char; + static char separator_char; +diff -urN binutils-2.12.90.0.12/ld/emultempl/elf32.em binutils-2.12.90.0.12.new/ld/emultempl/elf32.em +--- binutils-2.12.90.0.12/ld/emultempl/elf32.em Wed Jun 19 00:41:59 2002 ++++ binutils-2.12.90.0.12.new/ld/emultempl/elf32.em Wed Jun 26 10:00:26 2002 +@@ -672,6 +672,8 @@ + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, + force)) + break; +@@ -867,6 +869,8 @@ + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf${ELFSIZE}_size_dynamic_sections + (output_bfd, command_line.soname, rpath, + command_line.filter_shlib, +diff -urN binutils-2.13.90.0.18/gprof/gprof.texi binutils-2.13.90.0.18.new/gprof/gprof.texi +--- binutils-2.13.90.0.18/gprof/gprof.texi 2003-02-02 18:29:09.000000000 -0500 ++++ binutils-2.13.90.0.18.new/gprof/gprof.texi 2003-02-02 18:28:37.000000000 -0500 +@@ -185,7 +185,7 @@ + @c man end + + @c man begin SEEALSO +-monitor(3), profil(2), cc(1), prof(1), and the Info entry for @file{gprof}. ++profil(2), cc(1), prof(1), and the Info entry for @file{gprof}. + + ``An Execution Profiler for Modular Programs'', + by S. Graham, P. Kessler, M. McKusick; +diff -urN binutils-2.13.90.0.10/opcodes/alpha-opc.c binutils-2.13.90.0.10.new/opcodes/alpha-opc.c +--- binutils-2.13.90.0.10/opcodes/alpha-opc.c 2002-03-07 14:52:40.000000000 -0500 ++++ binutils-2.13.90.0.10.new/opcodes/alpha-opc.c 2002-10-12 20:16:08.000000000 -0400 +@@ -1101,7 +1101,8 @@ + { "wmb", MFC(0x18,0x4400), BASE, ARG_NONE }, + { "fetch", MFC(0x18,0x8000), BASE, { ZA, PRB } }, + { "fetch_m", MFC(0x18,0xA000), BASE, { ZA, PRB } }, +- { "rpcc", MFC(0x18,0xC000), BASE, { RA } }, ++ { "rpcc", MFC(0x18,0xC000), BASE, { RA, ZB } }, ++ { "rpcc", MFC(0x18,0xC000), BASE, { RA, RB } }, /* ev6 una */ + { "rc", MFC(0x18,0xE000), BASE, { RA } }, + { "ecb", MFC(0x18,0xE800), BASE, { ZA, PRB } }, /* ev56 una */ + { "rs", MFC(0x18,0xF000), BASE, { RA } }, +--- binutils-2.13.90.0.18/bfd/elf64-alpha.c 2003-01-21 19:21:32.000000000 +0100 ++++ binutils-2.13.90.0.18-modif/bfd/elf64-alpha.c 2003-04-11 01:24:26.000000000 +0200 +@@ -4184,9 +4184,12 @@ + + loc = srel->contents; + loc += srel->reloc_count++ * sizeof (Elf64_External_Rela); +- bfd_elf64_swap_reloca_out (abfd, &outrel, loc); +- BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count +- <= srel->_cooked_size); ++ if (loc) ++ { ++ bfd_elf64_swap_reloca_out (abfd, &outrel, loc); ++ BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count ++ <= srel->_cooked_size); ++ } + } + + /* Relocate an Alpha ELF section for a relocatable link. +2003-05-23 H.J. Lu <hongjiu.lu@intel.com> + + * ltmain.sh: Make symlink for shared library if needed. + +opcodes/ + +2003-07-14 H.J. Lu <hongjiu.lu@intel.com> + + * Makefile.in: Regenerated. + +2003-06-11 H.J. Lu <hongjiu.lu@intel.com> + + * Makefile.in: Regenerated. + +2003-05-23 H.J. Lu <hongjiu.lu@intel.com> + + * Makefile.am (libopcodes_la_LIBADD): Use "-L../bfd -lbfd" + instead of "../bfd/libbfd.la". + * Makefile.in: Regenerated. + +--- binutils/ltmain.sh.dso 2002-03-22 00:16:20.000000000 -0800 ++++ binutils/ltmain.sh 2003-07-14 12:50:17.000000000 -0700 +@@ -4413,6 +4413,10 @@ relink_command=\"$relink_command\"" + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ++ if test -n "$linkname"; then ++ $show "(cd $output_objdir && $rm ../$linkname && $LN_S $output_objdir/$linkname ../$linkname)" ++ $run eval '(cd $output_objdir && $rm ../$linkname && $LN_S $output_objdir/$linkname ../$linkname)' || exit $? ++ fi + ;; + esac + exit 0 +--- binutils/opcodes/Makefile.am.dso 2003-06-11 07:18:04.000000000 -0700 ++++ binutils/opcodes/Makefile.am 2003-07-14 12:50:18.000000000 -0700 +@@ -283,7 +283,7 @@ disassemble.lo: disassemble.c $(INCDIR)/ + + libopcodes_la_SOURCES = dis-buf.c disassemble.c + libopcodes_la_DEPENDENCIES = $(OFILES) ../bfd/libbfd.la +-libopcodes_la_LIBADD = $(OFILES) @WIN32LIBADD@ ../bfd/libbfd.la ++libopcodes_la_LIBADD = $(OFILES) @WIN32LIBADD@ -L../bfd -lbfd + libopcodes_la_LDFLAGS = -release $(VERSION) @WIN32LDFLAGS@ + + # libtool will build .libs/libopcodes.a. We create libopcodes.a in diff --git a/openwrt/toolchain/binutils/2.14.90.0.6/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.14.90.0.6/100-uclibc-conf.patch new file mode 100644 index 0000000000..87db23fb01 --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.6/100-uclibc-conf.patch @@ -0,0 +1,646 @@ +diff -urN binutils-2.14.90.0.6/bfd/config.bfd binutils-2.14.90.0.6-uClibc/bfd/config.bfd +--- binutils-2.14.90.0.6/bfd/config.bfd 2003-08-21 10:28:47.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/bfd/config.bfd 2004-01-06 23:20:32.000000000 -0600 +@@ -121,7 +121,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -131,7 +131,8 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf*) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | \ ++ ia64*-*-linux-uclibc* | ia64*-*-elf*) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -214,7 +215,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -222,7 +223,8 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | arm*-*-uclinux*) ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | \ ++ arm*-*-conix* | arm*-*-uclinux*) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +@@ -355,7 +357,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -366,7 +368,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -488,7 +490,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -502,7 +504,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -662,7 +664,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -929,7 +931,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -961,8 +964,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1110,7 +1113,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1157,7 +1160,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +diff -urN binutils-2.14.90.0.6/bfd/configure binutils-2.14.90.0.6-uClibc/bfd/configure +--- binutils-2.14.90.0.6/bfd/configure 2003-08-21 10:28:47.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/bfd/configure 2004-01-06 20:26:51.000000000 -0600 +@@ -1698,6 +1698,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5102,7 +5107,7 @@ + alpha*-*-freebsd*) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5161,7 +5166,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5211,7 +5216,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +diff -urN binutils-2.14.90.0.6/bfd/configure.in binutils-2.14.90.0.6-uClibc/bfd/configure.in +--- binutils-2.14.90.0.6/bfd/configure.in 2003-08-21 10:28:47.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/bfd/configure.in 2004-01-06 20:33:02.000000000 -0600 +@@ -153,7 +153,7 @@ + alpha*-*-freebsd*) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -233,7 +233,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -286,7 +286,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +diff -urN binutils-2.14.90.0.6/config.sub binutils-2.14.90.0.6-uClibc/config.sub +--- binutils-2.14.90.0.6/config.sub 2003-08-21 10:28:47.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/config.sub 2004-01-06 22:56:56.000000000 -0600 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1131,7 +1131,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN binutils-2.14.90.0.6/configure binutils-2.14.90.0.6-uClibc/configure +--- binutils-2.14.90.0.6/configure 2003-08-21 10:29:32.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/configure 2004-01-07 05:43:40.000000000 -0600 +@@ -1257,6 +1262,18 @@ + i[3456789]86-*-freebsd*) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.14.90.0.6/configure.in binutils-2.14.90.0.6-uClibc/configure.in +--- binutils-2.14.90.0.6/configure.in 2003-08-21 10:29:30.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/configure.in 2004-01-07 05:44:02.000000000 -0600 +@@ -508,6 +513,19 @@ + i[[3456789]]86-*-freebsd*) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ build_modules= ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.14.90.0.6/demangler/configure binutils-2.14.90.0.6-uClibc/demangler/configure +--- binutils-2.14.90.0.6/demangler/configure 2003-08-21 10:29:31.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/demangler/configure 2004-01-06 21:45:51.000000000 -0600 +@@ -1363,6 +1363,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.14.90.0.6/gas/configure binutils-2.14.90.0.6-uClibc/gas/configure +--- binutils-2.14.90.0.6/gas/configure 2003-07-23 10:08:10.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/gas/configure 2004-01-06 21:57:25.000000000 -0600 +@@ -1576,6 +1576,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -2370,6 +2375,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -2386,6 +2392,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -2400,6 +2407,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -2455,7 +2463,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -2512,6 +2522,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -2538,6 +2549,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; + m68k-*-netbsdelf*) fmt=elf em=nbsd ;; +@@ -2592,6 +2604,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf + case "$endian" in + big) ;; +@@ -2616,7 +2629,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -2649,6 +2664,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.14.90.0.6/gas/configure.in binutils-2.14.90.0.6-uClibc/gas/configure.in +--- binutils-2.14.90.0.6/gas/configure.in 2003-07-23 10:08:10.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/gas/configure.in 2004-01-06 21:57:26.000000000 -0600 +@@ -184,6 +184,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -200,6 +201,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -214,6 +216,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -269,7 +272,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -322,6 +327,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -348,6 +354,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; + m68k-*-netbsdelf*) fmt=elf em=nbsd ;; +@@ -402,6 +409,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf + case "$endian" in + big) ;; +@@ -424,7 +432,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -457,6 +467,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.14.90.0.6/ld/configure binutils-2.14.90.0.6-uClibc/ld/configure +--- binutils-2.14.90.0.6/ld/configure 2003-05-05 16:46:49.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/ld/configure 2004-01-06 21:59:31.000000000 -0600 +@@ -1578,6 +1578,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.14.90.0.6/ld/configure.tgt binutils-2.14.90.0.6-uClibc/ld/configure.tgt +--- binutils-2.14.90.0.6/ld/configure.tgt 2003-08-21 10:28:48.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/ld/configure.tgt 2004-01-06 22:09:40.000000000 -0600 +@@ -30,6 +30,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -59,14 +60,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -124,7 +127,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -148,14 +151,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -250,10 +255,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -354,7 +362,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -370,9 +379,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -416,16 +425,20 @@ + mips*-*-rtems*) targ_emul=elf32ebmip ;; + mips*el-*-vxworks*) targ_emul=elf32elmip ;; + mips*-*-vxworks*) targ_emul=elf32ebmip ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) \ ++ targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) \ ++ targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) \ ++ targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) \ ++ targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -447,6 +460,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.14.90.0.6/libtool.m4 binutils-2.14.90.0.6-uClibc/libtool.m4 +--- binutils-2.14.90.0.6/libtool.m4 2003-05-05 16:46:46.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/libtool.m4 2004-01-06 20:30:39.000000000 -0600 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.14.90.0.6/ltconfig binutils-2.14.90.0.6-uClibc/ltconfig +--- binutils-2.14.90.0.6/ltconfig 2003-07-23 10:08:08.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/ltconfig 2004-01-06 21:05:11.000000000 -0600 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/binutils/2.14.90.0.6/200-build_modules.patch b/openwrt/toolchain/binutils/2.14.90.0.6/200-build_modules.patch new file mode 100644 index 0000000000..e9f8e75a89 --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.6/200-build_modules.patch @@ -0,0 +1,31 @@ +Get around an odd build failure. +diff -urN binutils-2.14.90.0.6/configure binutils-2.14.90.0.6-uClibc/configure +--- binutils-2.14.90.0.6/configure 2003-08-21 10:29:32.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/configure 2004-01-07 05:43:40.000000000 -0600 +@@ -906,6 +906,11 @@ + fi + + ++case "$target" in ++ *-*-*-uclibc*) ++ build_modules= ++ ;; ++esac + ################################################################################ + + srcname="gnu development package" +diff -urN binutils-2.14.90.0.6/configure.in binutils-2.14.90.0.6-uClibc/configure.in +--- binutils-2.14.90.0.6/configure.in 2003-08-21 10:29:30.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/configure.in 2004-01-07 05:44:02.000000000 -0600 +@@ -178,6 +178,11 @@ + fi + + ++case "$target" in ++ *-*-*-uclibc*) ++ build_modules= ++ ;; ++esac + ################################################################################ + + srcname="gnu development package" diff --git a/openwrt/toolchain/binutils/2.14.90.0.6/210-cflags.patch b/openwrt/toolchain/binutils/2.14.90.0.6/210-cflags.patch new file mode 100644 index 0000000000..dc67d3c4e3 --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.6/210-cflags.patch @@ -0,0 +1,32 @@ +diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.am binutils-2.14.90.0.6.new/bfd/doc/Makefile.am +--- binutils-2.14.90.0.6/bfd/doc/Makefile.am 2003-07-23 10:08:09.000000000 -0500 ++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.am 2004-03-01 16:05:16.000000000 -0600 +@@ -55,10 +55,10 @@ + MKDOC = chew$(EXEEXT_FOR_BUILD) + + $(MKDOC): chew.o +- $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS) ++ $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS) + + chew.o: chew.c +- $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c ++ $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c + + protos: libbfd.h libcoff.h bfd.h + +diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.in binutils-2.14.90.0.6.new/bfd/doc/Makefile.in +--- binutils-2.14.90.0.6/bfd/doc/Makefile.in 2003-07-23 10:08:09.000000000 -0500 ++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.in 2004-03-01 16:05:03.000000000 -0600 +@@ -469,10 +469,10 @@ + + + $(MKDOC): chew.o +- $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS) ++ $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS) + + chew.o: chew.c +- $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c ++ $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c + + protos: libbfd.h libcoff.h bfd.h + diff --git a/openwrt/toolchain/binutils/2.14.90.0.7/001-debian.patch b/openwrt/toolchain/binutils/2.14.90.0.7/001-debian.patch new file mode 100644 index 0000000000..1dd39a933d --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.7/001-debian.patch @@ -0,0 +1,2394 @@ +diff -urN binutils-2.14.90.0.7.orig/bfd/ChangeLog binutils-2.14.90.0.7/bfd/ChangeLog +--- binutils-2.14.90.0.7.orig/bfd/ChangeLog 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/ChangeLog 2004-04-20 01:26:12.000000000 -0600 +@@ -1,3 +1,34 @@ ++2003-10-29 Daniel Jacobowitz <drow@mvista.com> ++ ++ * elf32-arm.h (elf32_arm_final_link_relocate): Move check for ++ SEC_ALLOC. ++ ++2003-10-29 Philip Blundell <philb@gnu.org> ++ ++ * elf32-arm.h (elf32_arm_plt0_entry, elf32_arm_plt_entry): New ++ code sequence. ++ (PLT_HEADER_SIZE): New. ++ (struct elf32_arm_pcrel_relocs_copied): Rename to ... ++ (struct elf32_arm_relocs_copied): ... this. Count both ++ pcrel and non-pcrel relocs. All uses updated. ++ (struct elf32_arm_link_hash_table): Add pointers to dynamic linker ++ sections and symbol/section mapping cache. ++ (create_got_section): New. ++ (elf32_arm_create_dynamic_sections): New. ++ (elf_backend_create_dynamic_sections): Use it. ++ (elf32_arm_final_link_relocate): Support garbage collection of relocs. ++ (elf32_arm_check_relocs): Likewise. ++ (elf32_arm_adjust_dynamic_symbol): Likewise. ++ (elf32_arm_copy_indirect_symbol): New. ++ (elf32_arm_link_hash_table_create): Initialise new fields. ++ (elf32_arm_gc_sweep_hook): Implement. ++ (elf32_arm_discard_copies): Delete. ++ (elf32_arm_finish_dynamic_symbol): Use new PLT code. ++ (elf32_arm_finish_dynamic_sections): Likewise. ++ (elf_backend_can_refcount): Define. ++ (elf_backend_copy_indirect_symbol): Likewise. ++ (elf_backend_plt_header_size): Set to PLT_HEADER_SIZE. ++ + 2003-10-29 Alan Modra <amodra@bigpond.net.au> + + * elf64-ppc.c (elf_backend_grok_prstatus): Define. +diff -urN binutils-2.14.90.0.7.orig/bfd/elf-bfd.h binutils-2.14.90.0.7/bfd/elf-bfd.h +--- binutils-2.14.90.0.7.orig/bfd/elf-bfd.h 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf-bfd.h 2004-04-20 01:26:12.000000000 -0600 +@@ -1303,7 +1303,7 @@ + extern enum elf_reloc_type_class _bfd_elf_reloc_type_class + (const Elf_Internal_Rela *); + extern bfd_vma _bfd_elf_rela_local_sym +- (bfd *, Elf_Internal_Sym *, asection *, Elf_Internal_Rela *); ++ (bfd *, Elf_Internal_Sym *, asection **, Elf_Internal_Rela *); + extern bfd_vma _bfd_elf_rel_local_sym + (bfd *, Elf_Internal_Sym *, asection **, bfd_vma); + extern bfd_vma _bfd_elf_section_offset +diff -urN binutils-2.14.90.0.7.orig/bfd/elf-hppa.h binutils-2.14.90.0.7/bfd/elf-hppa.h +--- binutils-2.14.90.0.7.orig/bfd/elf-hppa.h 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf-hppa.h 2004-04-20 01:26:12.000000000 -0600 +@@ -1346,11 +1346,11 @@ + /* This is a local symbol. */ + sym = local_syms + r_symndx; + sym_sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sym_sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rel); + + /* If this symbol has an entry in the PA64 dynamic hash + table, then get it. */ +- dyn_name = get_dyn_name (input_section, h, rel, ++ dyn_name = get_dyn_name (input_bfd, h, rel, + &dynh_buf, &dynh_buflen); + dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table, + dyn_name, FALSE, FALSE); +@@ -1373,7 +1373,7 @@ + + /* If this symbol has an entry in the PA64 dynamic hash + table, then get it. */ +- dyn_name = get_dyn_name (input_section, h, rel, ++ dyn_name = get_dyn_name (input_bfd, h, rel, + &dynh_buf, &dynh_buflen); + dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table, + dyn_name, FALSE, FALSE); +@@ -1410,7 +1410,7 @@ + + /* If this symbol has an entry in the PA64 dynamic hash + table, then get it. */ +- dyn_name = get_dyn_name (input_section, h, rel, ++ dyn_name = get_dyn_name (input_bfd, h, rel, + &dynh_buf, &dynh_buflen); + dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table, + dyn_name, FALSE, FALSE); +@@ -1426,7 +1426,7 @@ + } + else if (h->root.type == bfd_link_hash_undefweak) + { +- dyn_name = get_dyn_name (input_section, h, rel, ++ dyn_name = get_dyn_name (input_bfd, h, rel, + &dynh_buf, &dynh_buflen); + dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table, + dyn_name, FALSE, FALSE); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf-m10200.c binutils-2.14.90.0.7/bfd/elf-m10200.c +--- binutils-2.14.90.0.7.orig/bfd/elf-m10200.c 2003-07-23 09:08:08.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf-m10200.c 2004-04-20 01:26:12.000000000 -0600 +@@ -373,7 +373,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf-m10300.c binutils-2.14.90.0.7/bfd/elf-m10300.c +--- binutils-2.14.90.0.7.orig/bfd/elf-m10300.c 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf-m10300.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1574,7 +1574,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf.c binutils-2.14.90.0.7/bfd/elf.c +--- binutils-2.14.90.0.7.orig/bfd/elf.c 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf.c 2004-04-20 01:26:12.000000000 -0600 +@@ -7367,9 +7367,10 @@ + bfd_vma + _bfd_elf_rela_local_sym (bfd *abfd, + Elf_Internal_Sym *sym, +- asection *sec, ++ asection **psec, + Elf_Internal_Rela *rel) + { ++ asection *sec = *psec; + bfd_vma relocation; + + relocation = (sec->output_section->vma +@@ -7379,16 +7380,14 @@ + && ELF_ST_TYPE (sym->st_info) == STT_SECTION + && sec->sec_info_type == ELF_INFO_TYPE_MERGE) + { +- asection *msec; +- +- msec = sec; + rel->r_addend = +- _bfd_merged_section_offset (abfd, &msec, ++ _bfd_merged_section_offset (abfd, psec, + elf_section_data (sec)->sec_info, + sym->st_value + rel->r_addend, +- 0) +- - relocation; +- rel->r_addend += msec->output_section->vma + msec->output_offset; ++ 0); ++ sec = *psec; ++ rel->r_addend -= relocation; ++ rel->r_addend += sec->output_section->vma + sec->output_offset; + } + return relocation; + } +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-arm.h binutils-2.14.90.0.7/bfd/elf32-arm.h +--- binutils-2.14.90.0.7.orig/bfd/elf32-arm.h 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-arm.h 2004-04-20 01:26:12.000000000 -0600 +@@ -84,6 +84,12 @@ + static void arm_add_to_rel + PARAMS ((bfd *, bfd_byte *, reloc_howto_type *, bfd_signed_vma)); + #endif ++static bfd_boolean allocate_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean create_got_section ++ PARAMS ((bfd * dynobj, struct bfd_link_info * info)); ++static bfd_boolean elf32_arm_create_dynamic_sections ++ PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static enum elf_reloc_type_class elf32_arm_reloc_type_class + PARAMS ((const Elf_Internal_Rela *)); + static bfd_boolean elf32_arm_object_p +@@ -119,6 +125,12 @@ + section. */ + #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" + ++#ifdef FOUR_WORD_PLT ++ ++/* The size in bytes of the special first entry in the procedure ++ linkage table. */ ++#define PLT_HEADER_SIZE 16 ++ + /* The size in bytes of an entry in the procedure linkage table. */ + #define PLT_ENTRY_SIZE 16 + +@@ -126,23 +138,56 @@ + this. It is set up so that any shared library function that is + called before the relocation has been set up calls the dynamic + linker first. */ +-static const bfd_vma elf32_arm_plt0_entry [PLT_ENTRY_SIZE / 4] = ++static const bfd_vma elf32_arm_plt0_entry [PLT_HEADER_SIZE / 4] = + { +- 0xe52de004, /* str lr, [sp, #-4]! */ +- 0xe59fe010, /* ldr lr, [pc, #16] */ +- 0xe08fe00e, /* add lr, pc, lr */ +- 0xe5bef008 /* ldr pc, [lr, #8]! */ ++ 0xe52de004, /* str lr, [sp, #-4]! */ ++ 0xe59fe010, /* ldr lr, [pc, #16] */ ++ 0xe08fe00e, /* add lr, pc, lr */ ++ 0xe5bef008, /* ldr pc, [lr, #8]! */ + }; + + /* Subsequent entries in a procedure linkage table look like + this. */ + static const bfd_vma elf32_arm_plt_entry [PLT_ENTRY_SIZE / 4] = +- { +- 0xe59fc004, /* ldr ip, [pc, #4] */ +- 0xe08fc00c, /* add ip, pc, ip */ +- 0xe59cf000, /* ldr pc, [ip] */ +- 0x00000000 /* offset to symbol in got */ +- }; ++ { ++ 0xe28fc600, /* add ip, pc, #NN */ ++ 0xe28cca00, /* add ip, ip, #NN */ ++ 0xe5bcf000, /* ldr pc, [ip, #NN]! */ ++ 0x00000000, /* unused */ ++ }; ++ ++#else ++ ++/* The size in bytes of the special first entry in the procedure ++ linkage table. */ ++#define PLT_HEADER_SIZE 20 ++ ++/* The size in bytes of an entry in the procedure linkage table. */ ++#define PLT_ENTRY_SIZE 12 ++ ++/* The first entry in a procedure linkage table looks like ++ this. It is set up so that any shared library function that is ++ called before the relocation has been set up calls the dynamic ++ linker first. */ ++static const bfd_vma elf32_arm_plt0_entry [PLT_HEADER_SIZE / 4] = ++ { ++ 0xe52de004, /* str lr, [sp, #-4]! */ ++ 0xe59fe004, /* ldr lr, [pc, #4] */ ++ 0xe08fe00e, /* add lr, pc, lr */ ++ 0xe5bef008, /* ldr pc, [lr, #8]! */ ++ 0x00000000, /* &GOT[0] - . */ ++ }; ++ ++/* Subsequent entries in a procedure linkage table look like ++ this. */ ++static const bfd_vma elf32_arm_plt_entry [PLT_ENTRY_SIZE / 4] = ++ { ++ 0xe28fc600, /* add ip, pc, #0xNN00000 */ ++ 0xe28cca00, /* add ip, ip, #0xNN000 */ ++ 0xe5bcf000, /* ldr pc, [ip, #0xNNN]! */ ++ }; ++ ++#endif + + /* The ARM linker needs to keep track of the number of relocs that it + decides to copy in check_relocs for each symbol. This is so that +@@ -152,14 +197,16 @@ + + /* This structure keeps track of the number of PC relative relocs we + have copied for a given symbol. */ +-struct elf32_arm_pcrel_relocs_copied ++struct elf32_arm_relocs_copied + { + /* Next section. */ +- struct elf32_arm_pcrel_relocs_copied * next; ++ struct elf32_arm_relocs_copied * next; + /* A section in dynobj. */ + asection * section; + /* Number of relocs copied in this section. */ + bfd_size_type count; ++ /* Number of relocs copied in this section. */ ++ bfd_size_type pc_count; + }; + + /* Arm ELF linker hash entry. */ +@@ -168,13 +215,9 @@ + struct elf_link_hash_entry root; + + /* Number of PC relative relocs copied for this symbol. */ +- struct elf32_arm_pcrel_relocs_copied * pcrel_relocs_copied; ++ struct elf32_arm_relocs_copied * relocs_copied; + }; + +-/* Declare this now that the above structures are defined. */ +-static bfd_boolean elf32_arm_discard_copies +- PARAMS ((struct elf32_arm_link_hash_entry *, PTR)); +- + /* Traverse an arm ELF linker hash table. */ + #define elf32_arm_link_hash_traverse(table, func, info) \ + (elf_link_hash_traverse \ +@@ -204,6 +247,18 @@ + /* A boolean indicating whether knowledge of the ARM's pipeline + length should be applied by the linker. */ + int no_pipeline_knowledge; ++ ++ /* Short-cuts to get to dynamic linker sections. */ ++ asection *sgot; ++ asection *sgotplt; ++ asection *srelgot; ++ asection *splt; ++ asection *srelplt; ++ asection *sdynbss; ++ asection *srelbss; ++ ++ /* Small local sym to section mapping cache. */ ++ struct sym_sec_cache sym_sec; + }; + + /* Create an entry in an ARM ELF linker hash table. */ +@@ -231,11 +286,121 @@ + _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret, + table, string)); + if (ret != (struct elf32_arm_link_hash_entry *) NULL) +- ret->pcrel_relocs_copied = NULL; ++ ret->relocs_copied = NULL; + + return (struct bfd_hash_entry *) ret; + } + ++/* Create .got, .gotplt, and .rel.got sections in DYNOBJ, and set up ++ shortcuts to them in our hash table. */ ++ ++static bfd_boolean ++create_got_section (dynobj, info) ++ bfd *dynobj; ++ struct bfd_link_info *info; ++{ ++ struct elf32_arm_link_hash_table *htab; ++ ++ if (! _bfd_elf_create_got_section (dynobj, info)) ++ return FALSE; ++ ++ htab = elf32_arm_hash_table (info); ++ htab->sgot = bfd_get_section_by_name (dynobj, ".got"); ++ htab->sgotplt = bfd_get_section_by_name (dynobj, ".got.plt"); ++ if (!htab->sgot || !htab->sgotplt) ++ abort (); ++ ++ htab->srelgot = bfd_make_section (dynobj, ".rel.got"); ++ if (htab->srelgot == NULL ++ || ! bfd_set_section_flags (dynobj, htab->srelgot, ++ (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS ++ | SEC_IN_MEMORY | SEC_LINKER_CREATED ++ | SEC_READONLY)) ++ || ! bfd_set_section_alignment (dynobj, htab->srelgot, 2)) ++ return FALSE; ++ return TRUE; ++} ++ ++/* Create .plt, .rel.plt, .got, .got.plt, .rel.got, .dynbss, and ++ .rel.bss sections in DYNOBJ, and set up shortcuts to them in our ++ hash table. */ ++ ++static bfd_boolean ++elf32_arm_create_dynamic_sections (dynobj, info) ++ bfd *dynobj; ++ struct bfd_link_info *info; ++{ ++ struct elf32_arm_link_hash_table *htab; ++ ++ htab = elf32_arm_hash_table (info); ++ if (!htab->sgot && !create_got_section (dynobj, info)) ++ return FALSE; ++ ++ if (!_bfd_elf_create_dynamic_sections (dynobj, info)) ++ return FALSE; ++ ++ htab->splt = bfd_get_section_by_name (dynobj, ".plt"); ++ htab->srelplt = bfd_get_section_by_name (dynobj, ".rel.plt"); ++ htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss"); ++ if (!info->shared) ++ htab->srelbss = bfd_get_section_by_name (dynobj, ".rel.bss"); ++ ++ if (!htab->splt || !htab->srelplt || !htab->sdynbss ++ || (!info->shared && !htab->srelbss)) ++ abort (); ++ ++ return TRUE; ++} ++ ++/* Copy the extra info we tack onto an elf_link_hash_entry. */ ++ ++static void ++elf32_arm_copy_indirect_symbol (const struct elf_backend_data *bed, ++ struct elf_link_hash_entry *dir, ++ struct elf_link_hash_entry *ind) ++{ ++ struct elf32_arm_link_hash_entry *edir, *eind; ++ ++ edir = (struct elf32_arm_link_hash_entry *) dir; ++ eind = (struct elf32_arm_link_hash_entry *) ind; ++ ++ if (eind->relocs_copied != NULL) ++ { ++ if (edir->relocs_copied != NULL) ++ { ++ struct elf32_arm_relocs_copied **pp; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (ind->root.type == bfd_link_hash_indirect) ++ abort (); ++ ++ /* Add reloc counts against the weak sym to the strong sym ++ list. Merge any entries against the same section. */ ++ for (pp = &eind->relocs_copied; (p = *pp) != NULL; ) ++ { ++ struct elf32_arm_relocs_copied *q; ++ ++ for (q = edir->relocs_copied; q != NULL; q = q->next) ++ if (q->section == p->section) ++ { ++ q->pc_count += p->pc_count; ++ q->count += p->count; ++ *pp = p->next; ++ break; ++ } ++ if (q == NULL) ++ pp = &p->next; ++ } ++ *pp = edir->relocs_copied; ++ } ++ ++ edir->relocs_copied = eind->relocs_copied; ++ eind->relocs_copied = NULL; ++ } ++ ++ _bfd_elf_link_hash_copy_indirect (bed, dir, ind); ++} ++ + /* Create an ARM elf linker hash table. */ + + static struct bfd_link_hash_table * +@@ -256,10 +421,18 @@ + return NULL; + } + ++ ret->sgot = NULL; ++ ret->sgotplt = NULL; ++ ret->srelgot = NULL; ++ ret->splt = NULL; ++ ret->srelplt = NULL; ++ ret->sdynbss = NULL; ++ ret->srelbss = NULL; + ret->thumb_glue_size = 0; + ret->arm_glue_size = 0; + ret->bfd_of_glue_owner = NULL; + ret->no_pipeline_knowledge = 0; ++ ret->sym_sec.abfd = NULL; + + return &ret->root.root; + } +@@ -1134,16 +1307,21 @@ + #ifndef OLD_ARM_ABI + case R_ARM_XPC25: + #endif ++ /* r_symndx will be zero only for relocs against symbols ++ from removed linkonce sections, or sections discarded by ++ a linker script. */ ++ if (r_symndx == 0) ++ return bfd_reloc_ok; ++ + /* When generating a shared object, these relocations are copied + into the output file to be resolved at run time. */ +- if (info->shared +- && r_symndx != 0 +- && (r_type != R_ARM_PC24 +- || (h != NULL +- && h->dynindx != -1 +- && (! info->symbolic +- || (h->elf_link_hash_flags +- & ELF_LINK_HASH_DEF_REGULAR) == 0)))) ++ if ((info->shared ++ && (input_section->flags & SEC_ALLOC) ++ && (h == NULL ++ || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT ++ || h->root.type != bfd_link_hash_undefweak) ++ && (r_type != R_ARM_PC24 ++ || !SYMBOL_CALLS_LOCAL (info, h)))) + { + Elf_Internal_Rela outrel; + bfd_byte *loc; +@@ -1184,30 +1362,19 @@ + + if (skip) + memset (&outrel, 0, sizeof outrel); +- else if (r_type == R_ARM_PC24) +- { +- BFD_ASSERT (h != NULL && h->dynindx != -1); +- if ((input_section->flags & SEC_ALLOC) == 0) +- relocate = TRUE; +- outrel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_PC24); +- } ++ else if (h != NULL ++ && h->dynindx != -1 ++ && (r_type == R_ARM_PC24 ++ || !info->shared ++ || !info->symbolic ++ || (h->elf_link_hash_flags ++ & ELF_LINK_HASH_DEF_REGULAR) == 0)) ++ outrel.r_info = ELF32_R_INFO (h->dynindx, r_type); + else + { +- if (h == NULL +- || ((info->symbolic || h->dynindx == -1) +- && (h->elf_link_hash_flags +- & ELF_LINK_HASH_DEF_REGULAR) != 0)) +- { +- relocate = TRUE; +- outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE); +- } +- else +- { +- BFD_ASSERT (h->dynindx != -1); +- if ((input_section->flags & SEC_ALLOC) == 0) +- relocate = TRUE; +- outrel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_ABS32); +- } ++ /* This symbol is local, or marked to become local. */ ++ relocate = TRUE; ++ outrel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE); + } + + loc = sreloc->contents; +@@ -1617,16 +1784,17 @@ + if (h != NULL) + { + bfd_vma off; +- bfd_boolean dyn = elf_hash_table (info)->dynamic_sections_created; ++ bfd_boolean dyn; + + off = h->got.offset; + BFD_ASSERT (off != (bfd_vma) -1); ++ dyn = globals->root.dynamic_sections_created; + +- if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) ++ if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h) + || (info->shared +- && (info->symbolic || h->dynindx == -1 +- || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL)) +- && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))) ++ && SYMBOL_REFERENCES_LOCAL (info, h)) ++ || (ELF_ST_VISIBILITY (h->other) ++ && h->root.type == bfd_link_hash_undefweak)) + { + /* This is actually a static link, or it is a -Bsymbolic link + and the symbol is defined locally. We must initialize this +@@ -1712,7 +1880,8 @@ + contents, rel->r_offset, value, + (bfd_vma) 0); + +- if (h->plt.offset == (bfd_vma) -1) ++ if (h->plt.offset == (bfd_vma) -1 ++ || globals->splt == NULL) + /* We didn't make a PLT entry for this symbol. This + happens when statically linking PIC code, or when + using -Bsymbolic. */ +@@ -1958,7 +2127,7 @@ + bfd_put_32 (input_bfd, value, contents + rel->r_offset); + } + #else +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + #endif + } + else +@@ -1983,9 +2152,10 @@ + case R_ARM_THM_PC22: + if (info->shared + && ( +- (!info->symbolic && h->dynindx != -1) ++ (!info->symbolic && h->dynindx != -1) + || (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0 + ) ++ && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT + && ((input_section->flags & SEC_ALLOC) != 0 + /* DWARF will emit R_ARM_ABS32 relocations in its + sections against symbols defined externally +@@ -2603,7 +2773,82 @@ + asection *sec ATTRIBUTE_UNUSED; + const Elf_Internal_Rela *relocs ATTRIBUTE_UNUSED; + { +- /* We don't support garbage collection of GOT and PLT relocs yet. */ ++ Elf_Internal_Shdr *symtab_hdr; ++ struct elf_link_hash_entry **sym_hashes; ++ bfd_signed_vma *local_got_refcounts; ++ const Elf_Internal_Rela *rel, *relend; ++ unsigned long r_symndx; ++ struct elf_link_hash_entry *h; ++ ++ elf_section_data (sec)->local_dynrel = NULL; ++ ++ symtab_hdr = &elf_tdata (abfd)->symtab_hdr; ++ sym_hashes = elf_sym_hashes (abfd); ++ local_got_refcounts = elf_local_got_refcounts (abfd); ++ ++ relend = relocs + sec->reloc_count; ++ for (rel = relocs; rel < relend; rel++) ++ switch (ELF32_R_TYPE (rel->r_info)) ++ { ++ case R_ARM_GOT32: ++ r_symndx = ELF32_R_SYM (rel->r_info); ++ if (r_symndx >= symtab_hdr->sh_info) ++ { ++ h = sym_hashes[r_symndx - symtab_hdr->sh_info]; ++ if (h->got.refcount > 0) ++ h->got.refcount -= 1; ++ } ++ else if (local_got_refcounts != NULL) ++ { ++ if (local_got_refcounts[r_symndx] > 0) ++ local_got_refcounts[r_symndx] -= 1; ++ } ++ break; ++ ++ case R_ARM_ABS32: ++ case R_ARM_REL32: ++ case R_ARM_PC24: ++ r_symndx = ELF32_R_SYM (rel->r_info); ++ if (r_symndx >= symtab_hdr->sh_info) ++ { ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied **pp; ++ struct elf32_arm_relocs_copied *p; ++ ++ h = sym_hashes[r_symndx - symtab_hdr->sh_info]; ++ ++ if (!info->shared && h->plt.refcount > 0) ++ h->plt.refcount -= 1; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ ++ for (pp = &eh->relocs_copied; (p = *pp) != NULL; pp = &p->next) ++ if (p->section == sec) ++ { ++ if (ELF32_R_TYPE (rel->r_info) == R_ARM_PC24) ++ p->pc_count -= 1; ++ p->count -= 1; ++ if (p->count == 0) ++ *pp = p->next; ++ break; ++ } ++ } ++ break; ++ ++ case R_ARM_PLT32: ++ r_symndx = ELF32_R_SYM (rel->r_info); ++ if (r_symndx >= symtab_hdr->sh_info) ++ { ++ h = sym_hashes[r_symndx - symtab_hdr->sh_info]; ++ if (h->plt.refcount > 0) ++ h->plt.refcount -= 1; ++ } ++ break; ++ ++ default: ++ break; ++ } ++ + return TRUE; + } + +@@ -2622,13 +2867,15 @@ + const Elf_Internal_Rela *rel; + const Elf_Internal_Rela *rel_end; + bfd *dynobj; +- asection *sgot, *srelgot, *sreloc; ++ asection *sreloc; + bfd_vma *local_got_offsets; ++ struct elf32_arm_link_hash_table *htab; + + if (info->relocatable) + return TRUE; + +- sgot = srelgot = sreloc = NULL; ++ htab = elf32_arm_hash_table (info); ++ sreloc = NULL; + + dynobj = elf_hash_table (info)->dynobj; + local_got_offsets = elf_local_got_offsets (abfd); +@@ -2653,126 +2900,82 @@ + else + h = sym_hashes[r_symndx - symtab_hdr->sh_info]; + +- /* Some relocs require a global offset table. */ +- if (dynobj == NULL) +- { +- switch (ELF32_R_TYPE (rel->r_info)) +- { +- case R_ARM_GOT32: +- case R_ARM_GOTOFF: +- case R_ARM_GOTPC: +- elf_hash_table (info)->dynobj = dynobj = abfd; +- if (! _bfd_elf_create_got_section (dynobj, info)) +- return FALSE; +- break; +- +- default: +- break; +- } +- } +- + switch (ELF32_R_TYPE (rel->r_info)) + { +- case R_ARM_GOT32: +- /* This symbol requires a global offset table entry. */ +- if (sgot == NULL) +- { +- sgot = bfd_get_section_by_name (dynobj, ".got"); +- BFD_ASSERT (sgot != NULL); +- } ++ case R_ARM_PLT32: ++ /* This symbol requires a procedure linkage table entry. We ++ actually build the entry in adjust_dynamic_symbol, ++ because this might be a case of linking PIC code which is ++ never referenced by a dynamic object, in which case we ++ don't need to generate a procedure linkage table entry ++ after all. */ + +- /* Get the got relocation section if necessary. */ +- if (srelgot == NULL +- && (h != NULL || info->shared)) +- { +- srelgot = bfd_get_section_by_name (dynobj, ".rel.got"); ++ /* If this is a local symbol, we resolve it directly without ++ creating a procedure linkage table entry. */ ++ if (h == NULL) ++ continue; + +- /* If no got relocation section, make one and initialize. */ +- if (srelgot == NULL) +- { +- srelgot = bfd_make_section (dynobj, ".rel.got"); +- if (srelgot == NULL +- || ! bfd_set_section_flags (dynobj, srelgot, +- (SEC_ALLOC +- | SEC_LOAD +- | SEC_HAS_CONTENTS +- | SEC_IN_MEMORY +- | SEC_LINKER_CREATED +- | SEC_READONLY)) +- || ! bfd_set_section_alignment (dynobj, srelgot, 2)) +- return FALSE; +- } +- } ++ h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; ++ h->plt.refcount++; ++ break; + ++ case R_ARM_GOT32: ++ /* This symbol requires a global offset table entry. */ + if (h != NULL) + { +- if (h->got.offset != (bfd_vma) -1) +- /* We have already allocated space in the .got. */ +- break; +- +- h->got.offset = sgot->_raw_size; +- +- /* Make sure this symbol is output as a dynamic symbol. */ +- if (h->dynindx == -1) +- if (! bfd_elf32_link_record_dynamic_symbol (info, h)) +- return FALSE; +- +- srelgot->_raw_size += sizeof (Elf32_External_Rel); ++ h->got.refcount++; + } + else + { +- /* This is a global offset table entry for a local +- symbol. */ +- if (local_got_offsets == NULL) ++ bfd_signed_vma *local_got_refcounts; ++ ++ /* This is a global offset table entry for a local symbol. */ ++ local_got_refcounts = elf_local_got_refcounts (abfd); ++ if (local_got_refcounts == NULL) + { + bfd_size_type size; +- unsigned int i; + + size = symtab_hdr->sh_info; +- size *= sizeof (bfd_vma); +- local_got_offsets = (bfd_vma *) bfd_alloc (abfd, size); +- if (local_got_offsets == NULL) ++ size *= (sizeof (bfd_signed_vma) + sizeof(char)); ++ local_got_refcounts = ((bfd_signed_vma *) ++ bfd_zalloc (abfd, size)); ++ if (local_got_refcounts == NULL) + return FALSE; +- elf_local_got_offsets (abfd) = local_got_offsets; +- for (i = 0; i < symtab_hdr->sh_info; i++) +- local_got_offsets[i] = (bfd_vma) -1; ++ elf_local_got_refcounts (abfd) = local_got_refcounts; + } +- +- if (local_got_offsets[r_symndx] != (bfd_vma) -1) +- /* We have already allocated space in the .got. */ +- break; +- +- local_got_offsets[r_symndx] = sgot->_raw_size; +- +- if (info->shared) +- /* If we are generating a shared object, we need to +- output a R_ARM_RELATIVE reloc so that the dynamic +- linker can adjust this GOT entry. */ +- srelgot->_raw_size += sizeof (Elf32_External_Rel); ++ local_got_refcounts[r_symndx] += 1; + } +- +- sgot->_raw_size += 4; + break; + +- case R_ARM_PLT32: +- /* This symbol requires a procedure linkage table entry. We +- actually build the entry in adjust_dynamic_symbol, +- because this might be a case of linking PIC code which is +- never referenced by a dynamic object, in which case we +- don't need to generate a procedure linkage table entry +- after all. */ +- +- /* If this is a local symbol, we resolve it directly without +- creating a procedure linkage table entry. */ +- if (h == NULL) +- continue; +- +- h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT; ++ case R_ARM_GOTOFF: ++ case R_ARM_GOTPC: ++ if (htab->sgot == NULL) ++ { ++ if (htab->root.dynobj == NULL) ++ htab->root.dynobj = abfd; ++ if (!create_got_section (htab->root.dynobj, info)) ++ return FALSE; ++ } + break; + + case R_ARM_ABS32: + case R_ARM_REL32: + case R_ARM_PC24: ++ if (h != NULL && !info->shared) ++ { ++ /* If this reloc is in a read-only section, we might ++ need a copy reloc. We can't check reliably at this ++ stage whether the section is read-only, as input ++ sections have not yet been mapped to output sections. ++ Tentatively set the flag for now, and correct in ++ adjust_dynamic_symbol. */ ++ h->elf_link_hash_flags |= ELF_LINK_NON_GOT_REF; ++ ++ /* We may need a .plt entry if the function this reloc ++ refers to is in a shared lib. */ ++ h->plt.refcount += 1; ++ } ++ + /* If we are creating a shared library, and this is a reloc + against a global symbol, or a non PC relative reloc + against a local symbol, then we need to copy the reloc +@@ -2784,14 +2987,17 @@ + possible that DEF_REGULAR is not set now but will be set + later (it is never cleared). We account for that + possibility below by storing information in the +- pcrel_relocs_copied field of the hash table entry. */ ++ relocs_copied field of the hash table entry. */ + if (info->shared +- && (ELF32_R_TYPE (rel->r_info) != R_ARM_PC24 +- || (h != NULL +- && (! info->symbolic +- || (h->elf_link_hash_flags +- & ELF_LINK_HASH_DEF_REGULAR) == 0)))) ++ && (sec->flags & SEC_ALLOC) != 0 ++ && (ELF32_R_TYPE (rel->r_info) != R_ARM_PC24 ++ || (h != NULL ++ && (! info->symbolic ++ || (h->elf_link_hash_flags ++ & ELF_LINK_HASH_DEF_REGULAR) == 0)))) + { ++ struct elf32_arm_relocs_copied *p, **head; ++ + /* When creating a shared object, we must copy these + reloc types into the output file. We create a reloc + section in dynobj and make room for this reloc. */ +@@ -2825,45 +3031,49 @@ + || ! bfd_set_section_alignment (dynobj, sreloc, 2)) + return FALSE; + } +- if (sec->flags & SEC_READONLY) +- info->flags |= DF_TEXTREL; ++ ++ elf_section_data (sec)->sreloc = sreloc; + } + +- sreloc->_raw_size += sizeof (Elf32_External_Rel); +- /* If we are linking with -Bsymbolic, and this is a +- global symbol, we count the number of PC relative +- relocations we have entered for this symbol, so that +- we can discard them again if the symbol is later +- defined by a regular object. Note that this function +- is only called if we are using an elf_i386 linker +- hash table, which means that h is really a pointer to +- an elf_i386_link_hash_entry. */ +- if (h != NULL && info->symbolic +- && ELF32_R_TYPE (rel->r_info) == R_ARM_PC24) ++ /* If this is a global symbol, we count the number of ++ relocations we need for this symbol. */ ++ if (h != NULL) + { +- struct elf32_arm_link_hash_entry * eh; +- struct elf32_arm_pcrel_relocs_copied * p; +- +- eh = (struct elf32_arm_link_hash_entry *) h; +- +- for (p = eh->pcrel_relocs_copied; p != NULL; p = p->next) +- if (p->section == sreloc) +- break; +- ++ head = &((struct elf32_arm_link_hash_entry *) h)->relocs_copied; ++ } ++ else ++ { ++ /* Track dynamic relocs needed for local syms too. ++ We really need local syms available to do this ++ easily. Oh well. */ ++ ++ asection *s; ++ s = bfd_section_from_r_symndx (abfd, &htab->sym_sec, ++ sec, r_symndx); ++ if (s == NULL) ++ return FALSE; ++ ++ head = ((struct elf32_arm_relocs_copied **) ++ &elf_section_data (s)->local_dynrel); ++ } ++ ++ p = *head; ++ if (p == NULL || p->section != sec) ++ { ++ bfd_size_type amt = sizeof *p; ++ p = bfd_alloc (htab->root.dynobj, amt); + if (p == NULL) +- { +- p = ((struct elf32_arm_pcrel_relocs_copied *) +- bfd_alloc (dynobj, (bfd_size_type) sizeof * p)); +- if (p == NULL) +- return FALSE; +- p->next = eh->pcrel_relocs_copied; +- eh->pcrel_relocs_copied = p; +- p->section = sreloc; +- p->count = 0; +- } +- +- ++p->count; ++ return FALSE; ++ p->next = *head; ++ *head = p; ++ p->section = sec; ++ p->count = 0; ++ p->pc_count = 0; + } ++ ++ p->count += 1; ++ if (ELF32_R_TYPE (rel->r_info) == R_ARM_PC24) ++ p->pc_count += 1; + } + break; + +@@ -3003,71 +3213,29 @@ + if (h->type == STT_FUNC + || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0) + { +- /* If we link a program (not a DSO), we'll get rid of unnecessary +- PLT entries; we point to the actual symbols -- even for pic +- relocs, because a program built with -fpic should have the same +- result as one built without -fpic, specifically considering weak +- symbols. +- FIXME: m68k and i386 differ here, for unclear reasons. */ +- if (! info->shared +- && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0) ++ if (h->plt.refcount <= 0 ++ || SYMBOL_CALLS_LOCAL (info, h) ++ || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT ++ && h->root.type == bfd_link_hash_undefweak)) + { + /* This case can occur if we saw a PLT32 reloc in an input +- file, but the symbol was not defined by a dynamic object. +- In such a case, we don't actually need to build a +- procedure linkage table, and we can just do a PC32 reloc +- instead. */ +- BFD_ASSERT ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0); ++ file, but the symbol was never referred to by a dynamic ++ object, or if all references were garbage collected. In ++ such a case, we don't actually need to build a procedure ++ linkage table, and we can just do a PC24 reloc instead. */ ++ h->plt.offset = (bfd_vma) -1; + h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; +- return TRUE; +- } +- +- /* Make sure this symbol is output as a dynamic symbol. */ +- if (h->dynindx == -1) +- { +- if (! bfd_elf32_link_record_dynamic_symbol (info, h)) +- return FALSE; + } + +- s = bfd_get_section_by_name (dynobj, ".plt"); +- BFD_ASSERT (s != NULL); +- +- /* If this is the first .plt entry, make room for the special +- first entry. */ +- if (s->_raw_size == 0) +- s->_raw_size += PLT_ENTRY_SIZE; +- +- /* If this symbol is not defined in a regular file, and we are +- not generating a shared library, then set the symbol to this +- location in the .plt. This is required to make function +- pointers compare as equal between the normal executable and +- the shared library. */ +- if (! info->shared +- && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) +- { +- h->root.u.def.section = s; +- h->root.u.def.value = s->_raw_size; +- } +- +- h->plt.offset = s->_raw_size; +- +- /* Make room for this entry. */ +- s->_raw_size += PLT_ENTRY_SIZE; +- +- /* We also need to make an entry in the .got.plt section, which +- will be placed in the .got section by the linker script. */ +- s = bfd_get_section_by_name (dynobj, ".got.plt"); +- BFD_ASSERT (s != NULL); +- s->_raw_size += 4; +- +- /* We also need to make an entry in the .rel.plt section. */ +- +- s = bfd_get_section_by_name (dynobj, ".rel.plt"); +- BFD_ASSERT (s != NULL); +- s->_raw_size += sizeof (Elf32_External_Rel); +- + return TRUE; + } ++ else ++ /* It's possible that we incorrectly decided a .plt reloc was ++ needed for an R_ARM_PC24 reloc to a non-function sym in ++ check_relocs. We can't decide accurately between function and ++ non-function syms in check-relocs; Objects loaded later in ++ the link may change h->type. So fix it now. */ ++ h->plt.offset = (bfd_vma) -1; + + /* If this is a weak symbol, and there is a real definition, the + processor independent code will have arranged for us to see the +@@ -3142,6 +3310,198 @@ + return TRUE; + } + ++/* Allocate space in .plt, .got and associated reloc sections for ++ dynamic relocs. */ ++ ++static bfd_boolean ++allocate_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct bfd_link_info *info; ++ struct elf32_arm_link_hash_table *htab; ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_indirect) ++ return TRUE; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ /* When warning symbols are created, they **replace** the "real" ++ entry in the hash table, thus we never get to see the real ++ symbol in a hash traversal. So look at it now. */ ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ info = (struct bfd_link_info *) inf; ++ htab = elf32_arm_hash_table (info); ++ ++ if (htab->root.dynamic_sections_created ++ && h->plt.refcount > 0) ++ { ++ /* Make sure this symbol is output as a dynamic symbol. ++ Undefined weak syms won't yet be marked as dynamic. */ ++ if (h->dynindx == -1 ++ && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) ++ { ++ if (! bfd_elf32_link_record_dynamic_symbol (info, h)) ++ return FALSE; ++ } ++ ++ if (info->shared ++ || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h)) ++ { ++ asection *s = htab->splt; ++ ++ /* If this is the first .plt entry, make room for the special ++ first entry. */ ++ if (s->_raw_size == 0) ++ s->_raw_size += PLT_HEADER_SIZE; ++ ++ h->plt.offset = s->_raw_size; ++ ++ /* If this symbol is not defined in a regular file, and we are ++ not generating a shared library, then set the symbol to this ++ location in the .plt. This is required to make function ++ pointers compare as equal between the normal executable and ++ the shared library. */ ++ if (! info->shared ++ && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) ++ { ++ h->root.u.def.section = s; ++ h->root.u.def.value = h->plt.offset; ++ } ++ ++ /* Make room for this entry. */ ++ s->_raw_size += PLT_ENTRY_SIZE; ++ ++ /* We also need to make an entry in the .got.plt section, which ++ will be placed in the .got section by the linker script. */ ++ htab->sgotplt->_raw_size += 4; ++ ++ /* We also need to make an entry in the .rel.plt section. */ ++ htab->srelplt->_raw_size += sizeof (Elf32_External_Rel); ++ } ++ else ++ { ++ h->plt.offset = (bfd_vma) -1; ++ h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; ++ } ++ } ++ else ++ { ++ h->plt.offset = (bfd_vma) -1; ++ h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT; ++ } ++ ++ if (h->got.refcount > 0) ++ { ++ asection *s; ++ bfd_boolean dyn; ++ ++ /* Make sure this symbol is output as a dynamic symbol. ++ Undefined weak syms won't yet be marked as dynamic. */ ++ if (h->dynindx == -1 ++ && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) ++ { ++ if (! bfd_elf32_link_record_dynamic_symbol (info, h)) ++ return FALSE; ++ } ++ ++ s = htab->sgot; ++ h->got.offset = s->_raw_size; ++ s->_raw_size += 4; ++ dyn = htab->root.dynamic_sections_created; ++ if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT ++ || h->root.type != bfd_link_hash_undefweak) ++ && (info->shared ++ || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))) ++ htab->srelgot->_raw_size += sizeof (Elf32_External_Rel); ++ } ++ else ++ h->got.offset = (bfd_vma) -1; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ if (eh->relocs_copied == NULL) ++ return TRUE; ++ ++ /* In the shared -Bsymbolic case, discard space allocated for ++ dynamic pc-relative relocs against symbols which turn out to be ++ defined in regular objects. For the normal shared case, discard ++ space for pc-relative relocs that have become local due to symbol ++ visibility changes. */ ++ ++ if (info->shared) ++ { ++ /* The only reloc that uses pc_count is R_ARM_PC24, which will ++ appear on a call or on something like ".long foo - .". We ++ want calls to protected symbols to resolve directly to the ++ function rather than going via the plt. If people want ++ function pointer comparisons to work as expected then they ++ should avoid writing assembly like ".long foo - .". */ ++ if (SYMBOL_CALLS_LOCAL (info, h)) ++ { ++ struct elf32_arm_relocs_copied **pp; ++ ++ for (pp = &eh->relocs_copied; (p = *pp) != NULL; ) ++ { ++ p->count -= p->pc_count; ++ p->pc_count = 0; ++ if (p->count == 0) ++ *pp = p->next; ++ else ++ pp = &p->next; ++ } ++ } ++ ++ /* Also discard relocs on undefined weak syms with non-default ++ visibility. */ ++ if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT ++ && h->root.type == bfd_link_hash_undefweak) ++ eh->relocs_copied = NULL; ++ } ++ else ++ { ++ /* For the non-shared case, discard space for relocs against ++ symbols which turn out to need copy relocs or are not ++ dynamic. */ ++ ++ if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0 ++ && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0 ++ && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) ++ || (htab->root.dynamic_sections_created ++ && (h->root.type == bfd_link_hash_undefweak ++ || h->root.type == bfd_link_hash_undefined)))) ++ { ++ /* Make sure this symbol is output as a dynamic symbol. ++ Undefined weak syms won't yet be marked as dynamic. */ ++ if (h->dynindx == -1 ++ && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) ++ { ++ if (! bfd_elf32_link_record_dynamic_symbol (info, h)) ++ return FALSE; ++ } ++ ++ /* If that succeeded, we know we'll be keeping all the ++ relocs. */ ++ if (h->dynindx != -1) ++ goto keep; ++ } ++ ++ eh->relocs_copied = NULL; ++ ++ keep: ; ++ } ++ ++ /* Finally, allocate space. */ ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *sreloc = elf_section_data (p->section)->sreloc; ++ sreloc->_raw_size += p->count * sizeof (Elf32_External_Rel); ++ } ++ ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3153,7 +3513,10 @@ + asection * s; + bfd_boolean plt; + bfd_boolean relocs; ++ bfd *ibfd; ++ struct elf32_arm_link_hash_table *htab; + ++ htab = elf32_arm_hash_table (info); + dynobj = elf_hash_table (info)->dynobj; + BFD_ASSERT (dynobj != NULL); + +@@ -3168,26 +3531,74 @@ + s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER; + } + } +- else +- { +- /* We may have created entries in the .rel.got section. +- However, if we are not creating the dynamic sections, we will +- not actually use these entries. Reset the size of .rel.got, +- which will cause it to get stripped from the output file +- below. */ +- s = bfd_get_section_by_name (dynobj, ".rel.got"); +- if (s != NULL) +- s->_raw_size = 0; +- } +- +- /* If this is a -Bsymbolic shared link, then we need to discard all +- PC relative relocs against symbols defined in a regular object. +- We allocated space for them in the check_relocs routine, but we +- will not fill them in in the relocate_section routine. */ +- if (info->shared && info->symbolic) +- elf32_arm_link_hash_traverse (elf32_arm_hash_table (info), +- elf32_arm_discard_copies, +- (PTR) NULL); ++ ++ /* Set up .got offsets for local syms, and space for local dynamic ++ relocs. */ ++ for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next) ++ { ++ bfd_signed_vma *local_got; ++ bfd_signed_vma *end_local_got; ++ char *local_tls_type; ++ bfd_size_type locsymcount; ++ Elf_Internal_Shdr *symtab_hdr; ++ asection *srel; ++ ++ if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour) ++ continue; ++ ++ for (s = ibfd->sections; s != NULL; s = s->next) ++ { ++ struct elf32_arm_relocs_copied *p; ++ ++ for (p = *((struct elf32_arm_relocs_copied **) ++ &elf_section_data (s)->local_dynrel); ++ p != NULL; ++ p = p->next) ++ { ++ if (!bfd_is_abs_section (p->section) ++ && bfd_is_abs_section (p->section->output_section)) ++ { ++ /* Input section has been discarded, either because ++ it is a copy of a linkonce section or due to ++ linker script /DISCARD/, so we'll be discarding ++ the relocs too. */ ++ } ++ else if (p->count != 0) ++ { ++ srel = elf_section_data (p->section)->sreloc; ++ srel->_raw_size += p->count * sizeof (Elf32_External_Rel); ++ if ((p->section->output_section->flags & SEC_READONLY) != 0) ++ info->flags |= DF_TEXTREL; ++ } ++ } ++ } ++ ++ local_got = elf_local_got_refcounts (ibfd); ++ if (!local_got) ++ continue; ++ ++ symtab_hdr = &elf_tdata (ibfd)->symtab_hdr; ++ locsymcount = symtab_hdr->sh_info; ++ end_local_got = local_got + locsymcount; ++ s = htab->sgot; ++ srel = htab->srelgot; ++ for (; local_got < end_local_got; ++local_got, ++local_tls_type) ++ { ++ if (*local_got > 0) ++ { ++ *local_got = s->_raw_size; ++ s->_raw_size += 4; ++ if (info->shared) ++ srel->_raw_size += sizeof (Elf32_External_Rel); ++ } ++ else ++ *local_got = (bfd_vma) -1; ++ } ++ } ++ ++ /* Allocate global sym .plt and .got entries, and space for global ++ sym dynamic relocs. */ ++ elf_link_hash_traverse (&htab->root, allocate_dynrelocs, (PTR) info); + + /* The check_relocs and adjust_dynamic_symbol entry points have + determined the sizes of the various dynamic sections. Allocate +@@ -3312,33 +3723,6 @@ + return TRUE; + } + +-/* This function is called via elf32_arm_link_hash_traverse if we are +- creating a shared object with -Bsymbolic. It discards the space +- allocated to copy PC relative relocs against symbols which are +- defined in regular objects. We allocated space for them in the +- check_relocs routine, but we won't fill them in in the +- relocate_section routine. */ +- +-static bfd_boolean +-elf32_arm_discard_copies (h, ignore) +- struct elf32_arm_link_hash_entry * h; +- PTR ignore ATTRIBUTE_UNUSED; +-{ +- struct elf32_arm_pcrel_relocs_copied * s; +- +- if (h->root.root.type == bfd_link_hash_warning) +- h = (struct elf32_arm_link_hash_entry *) h->root.root.u.i.link; +- +- /* We only discard relocs for symbols defined in a regular object. */ +- if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0) +- return TRUE; +- +- for (s = h->pcrel_relocs_copied; s != NULL; s = s->next) +- s->section->_raw_size -= s->count * sizeof (Elf32_External_Rel); +- +- return TRUE; +-} +- + /* Finish up dynamic symbol handling. We set the contents of various + dynamic sections here. */ + +@@ -3362,6 +3746,7 @@ + bfd_vma got_offset; + Elf_Internal_Rela rel; + bfd_byte *loc; ++ bfd_vma got_displacement; + + /* This symbol has an entry in the procedure linkage table. Set + it up. */ +@@ -3377,35 +3762,43 @@ + corresponds to this symbol. This is the index of this symbol + in all the symbols for which we are making plt entries. The + first entry in the procedure linkage table is reserved. */ +- plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1; ++ plt_index = (h->plt.offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE; + + /* Get the offset into the .got table of the entry that + corresponds to this function. Each .got entry is 4 bytes. + The first three are reserved. */ + got_offset = (plt_index + 3) * 4; + ++ /* Calculate the displacement between the PLT slot and the ++ entry in the GOT. */ ++ got_displacement = (sgot->output_section->vma ++ + sgot->output_offset ++ + got_offset ++ - splt->output_section->vma ++ - splt->output_offset ++ - h->plt.offset ++ - 8); ++ ++ BFD_ASSERT ((got_displacement & 0xf0000000) == 0); ++ + /* Fill in the entry in the procedure linkage table. */ +- bfd_put_32 (output_bfd, elf32_arm_plt_entry[0], ++ bfd_put_32 (output_bfd, elf32_arm_plt_entry[0] | ((got_displacement & 0x0ff00000) >> 20), + splt->contents + h->plt.offset + 0); +- bfd_put_32 (output_bfd, elf32_arm_plt_entry[1], ++ bfd_put_32 (output_bfd, elf32_arm_plt_entry[1] | ((got_displacement & 0x000ff000) >> 12), + splt->contents + h->plt.offset + 4); +- bfd_put_32 (output_bfd, elf32_arm_plt_entry[2], ++ bfd_put_32 (output_bfd, elf32_arm_plt_entry[2] | (got_displacement & 0x00000fff), + splt->contents + h->plt.offset + 8); +- bfd_put_32 (output_bfd, +- (sgot->output_section->vma +- + sgot->output_offset +- + got_offset +- - splt->output_section->vma +- - splt->output_offset +- - h->plt.offset - 12), +- splt->contents + h->plt.offset + 12); ++#ifdef FOUR_WORD_PLT ++ bfd_put_32 (output_bfd, elf32_arm_plt_entry[3], ++ splt->contents + h->plt.offset + 12); ++#endif + + /* Fill in the entry in the global offset table. */ + bfd_put_32 (output_bfd, + (splt->output_section->vma + + splt->output_offset), + sgot->contents + got_offset); +- ++ + /* Fill in the entry in the .rel.plt section. */ + rel.r_offset = (sgot->output_section->vma + + sgot->output_offset +@@ -3446,16 +3839,20 @@ + + sgot->output_offset + + (h->got.offset &~ (bfd_vma) 1)); + +- /* If this is a -Bsymbolic link, and the symbol is defined +- locally, we just want to emit a RELATIVE reloc. The entry in +- the global offset table will already have been initialized in +- the relocate_section function. */ ++ /* If this is a static link, or it is a -Bsymbolic link and the ++ symbol is defined locally or was forced to be local because ++ of a version file, we just want to emit a RELATIVE reloc. ++ The entry in the global offset table will already have been ++ initialized in the relocate_section function. */ + if (info->shared +- && (info->symbolic || h->dynindx == -1) +- && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)) +- rel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE); ++ && SYMBOL_REFERENCES_LOCAL (info, h)) ++ { ++ BFD_ASSERT((h->got.offset & 1) != 0); ++ rel.r_info = ELF32_R_INFO (0, R_ARM_RELATIVE); ++ } + else + { ++ BFD_ASSERT((h->got.offset & 1) == 0); + bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset); + rel.r_info = ELF32_R_INFO (h->dynindx, R_ARM_GLOB_DAT); + } +@@ -3609,10 +4006,26 @@ + /* Fill in the first entry in the procedure linkage table. */ + if (splt->_raw_size > 0) + { ++ bfd_vma got_displacement; ++ ++ /* Calculate the displacement between the PLT slot and &GOT[0]. */ ++ got_displacement = (sgot->output_section->vma ++ + sgot->output_offset ++ - splt->output_section->vma ++ - splt->output_offset ++ - 16); ++ + bfd_put_32 (output_bfd, elf32_arm_plt0_entry[0], splt->contents + 0); + bfd_put_32 (output_bfd, elf32_arm_plt0_entry[1], splt->contents + 4); + bfd_put_32 (output_bfd, elf32_arm_plt0_entry[2], splt->contents + 8); + bfd_put_32 (output_bfd, elf32_arm_plt0_entry[3], splt->contents + 12); ++#ifdef FOUR_WORD_PLT ++ /* The displacement value goes in the otherwise-unused last word of ++ the second entry. */ ++ bfd_put_32 (output_bfd, got_displacement, splt->contents + 28); ++#else ++ bfd_put_32 (output_bfd, got_displacement, splt->contents + 16); ++#endif + } + + /* UnixWare sets the entsize of .plt to 4, although that doesn't +@@ -3714,7 +4127,7 @@ + #define elf_backend_check_relocs elf32_arm_check_relocs + #define elf_backend_relocate_section elf32_arm_relocate_section + #define elf_backend_adjust_dynamic_symbol elf32_arm_adjust_dynamic_symbol +-#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections ++#define elf_backend_create_dynamic_sections elf32_arm_create_dynamic_sections + #define elf_backend_finish_dynamic_symbol elf32_arm_finish_dynamic_symbol + #define elf_backend_finish_dynamic_sections elf32_arm_finish_dynamic_sections + #define elf_backend_size_dynamic_sections elf32_arm_size_dynamic_sections +@@ -3723,7 +4136,9 @@ + #define elf_backend_object_p elf32_arm_object_p + #define elf_backend_section_flags elf32_arm_section_flags + #define elf_backend_final_write_processing elf32_arm_final_write_processing ++#define elf_backend_copy_indirect_symbol elf32_arm_copy_indirect_symbol + ++#define elf_backend_can_refcount 1 + #define elf_backend_can_gc_sections 1 + #define elf_backend_plt_readonly 1 + #define elf_backend_want_got_plt 1 +@@ -3733,7 +4148,7 @@ + #endif + + #define elf_backend_got_header_size 12 +-#define elf_backend_plt_header_size PLT_ENTRY_SIZE ++#define elf_backend_plt_header_size PLT_HEADER_SIZE + + #include "elf32-target.h" + +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-avr.c binutils-2.14.90.0.7/bfd/elf32-avr.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-avr.c 2003-07-23 09:08:08.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-avr.c 2004-04-20 01:26:12.000000000 -0600 +@@ -750,7 +750,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-cris.c binutils-2.14.90.0.7/bfd/elf32-cris.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-cris.c 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-cris.c 2004-04-20 01:26:12.000000000 -0600 +@@ -847,7 +847,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + symname = (bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name)); +@@ -1292,16 +1292,7 @@ + { + long indx; + +- if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ if (bfd_is_abs_section (sec)) + indx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-fr30.c binutils-2.14.90.0.7/bfd/elf32-fr30.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-fr30.c 2003-07-23 09:08:08.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-fr30.c 2004-04-20 01:26:12.000000000 -0600 +@@ -552,7 +552,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-frv.c binutils-2.14.90.0.7/bfd/elf32-frv.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-frv.c 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-frv.c 2004-04-20 01:26:12.000000000 -0600 +@@ -724,7 +724,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-h8300.c binutils-2.14.90.0.7/bfd/elf32-h8300.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-h8300.c 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-h8300.c 2004-04-20 01:26:12.000000000 -0600 +@@ -435,7 +435,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-hppa.c binutils-2.14.90.0.7/bfd/elf32-hppa.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-hppa.c 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-hppa.c 2004-04-20 01:26:12.000000000 -0600 +@@ -3408,7 +3408,7 @@ + /* This is a local symbol, h defaults to NULL. */ + sym = local_syms + r_symndx; + sym_sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sym_sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sym_sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-i370.c binutils-2.14.90.0.7/bfd/elf32-i370.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-i370.c 2003-07-23 09:08:08.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-i370.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1210,7 +1210,7 @@ + sec = local_sections[r_symndx]; + sym_name = "<local symbol>"; + +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + addend = rel->r_addend; + } + else +@@ -1363,16 +1363,7 @@ + { + long indx; + +- if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ if (bfd_is_abs_section (sec)) + indx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-i860.c binutils-2.14.90.0.7/bfd/elf32-i860.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-i860.c 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-i860.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1104,7 +1104,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-m32r.c binutils-2.14.90.0.7/bfd/elf32-m32r.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-m32r.c 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-m32r.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1107,7 +1107,7 @@ + sec = local_sections[r_symndx]; + sym_name = "<local symbol>"; + #if !USE_REL +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + addend = rel->r_addend; + #else + /* FIXME: This won't handle local relocations against SEC_MERGE +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-m68k.c binutils-2.14.90.0.7/bfd/elf32-m68k.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-m68k.c 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-m68k.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1403,7 +1403,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +@@ -1657,16 +1657,7 @@ + { + long indx; + +- if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ if (bfd_is_abs_section (sec)) + indx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-mcore.c binutils-2.14.90.0.7/bfd/elf32-mcore.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-mcore.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-mcore.c 2004-04-20 01:26:12.000000000 -0600 +@@ -467,7 +467,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + addend = rel->r_addend; + } + else +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-msp430.c binutils-2.14.90.0.7/bfd/elf32-msp430.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-msp430.c 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-msp430.c 2004-04-20 01:26:12.000000000 -0600 +@@ -449,7 +449,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-openrisc.c binutils-2.14.90.0.7/bfd/elf32-openrisc.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-openrisc.c 2003-07-23 09:08:08.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-openrisc.c 2004-04-20 01:26:12.000000000 -0600 +@@ -375,7 +375,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-ppc.c binutils-2.14.90.0.7/bfd/elf32-ppc.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-ppc.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-ppc.c 2004-04-20 01:26:12.000000000 -0600 +@@ -4727,7 +4727,7 @@ + sec = local_sections[r_symndx]; + sym_name = bfd_elf_local_sym_name (input_bfd, sym); + +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +@@ -5455,44 +5455,9 @@ + break; + + case R_PPC_RELAX32: +- { +- unsigned long r_symndx; +- Elf_Internal_Sym *sym; +- asection *sym_sec; +- bfd_byte *hit_addr = 0; +- bfd_vma value = 0; +- +- r_symndx = ELF32_R_SYM (rel->r_info); +- +- if (r_symndx < symtab_hdr->sh_info) +- { +- sym = local_syms + r_symndx; +- sym_sec = local_sections[r_symndx]; +- +- value = _bfd_elf_rela_local_sym (output_bfd, sym, sym_sec, rel); +- } +- else +- { +- bfd_boolean warned; +- bfd_boolean unresolved_reloc; +- +- RELOC_FOR_GLOBAL_SYMBOL (h, elf_sym_hashes (input_bfd), +- r_symndx, symtab_hdr, +- value, sym_sec, +- unresolved_reloc, info, +- warned); +- if (warned) +- continue; +- } +- hit_addr = contents + rel->r_offset; +- value += rel->r_addend; +- +- r = ppc_elf_install_value (output_bfd, hit_addr, value, r_type); +- if (r != bfd_reloc_ok) +- break; +- else +- continue; +- } ++ ppc_elf_install_value (output_bfd, contents + rel->r_offset, ++ relocation + addend, r_type); ++ continue; + + /* Indirect .sdata relocation. */ + case R_PPC_EMB_SDAI16: +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-s390.c binutils-2.14.90.0.7/bfd/elf32-s390.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-s390.c 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-s390.c 2004-04-20 01:26:12.000000000 -0600 +@@ -2327,7 +2327,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-sh.c binutils-2.14.90.0.7/bfd/elf32-sh.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-sh.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-sh.c 2004-04-20 01:26:12.000000000 -0600 +@@ -4805,7 +4805,7 @@ + } + else if (! howto->partial_inplace) + { +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + addend = rel->r_addend; + } + else if ((sec->flags & SEC_MERGE) +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-sparc.c binutils-2.14.90.0.7/bfd/elf32-sparc.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-sparc.c 2003-08-21 09:28:48.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-sparc.c 2004-04-20 01:26:12.000000000 -0600 +@@ -2182,7 +2182,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +@@ -2459,16 +2459,8 @@ + + if (is_plt) + sec = htab->splt; +- else if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ ++ if (bfd_is_abs_section (sec)) + indx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-v850.c binutils-2.14.90.0.7/bfd/elf32-v850.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-v850.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-v850.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1681,7 +1681,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + #if 0 + { + char * name; +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-vax.c binutils-2.14.90.0.7/bfd/elf32-vax.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-vax.c 2003-08-21 09:28:48.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-vax.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1483,7 +1483,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +@@ -1737,16 +1737,7 @@ + { + long indx; + +- if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ if (bfd_is_abs_section (sec)) + indx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-xstormy16.c binutils-2.14.90.0.7/bfd/elf32-xstormy16.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-xstormy16.c 2003-07-23 09:08:09.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf32-xstormy16.c 2004-04-20 01:26:12.000000000 -0600 +@@ -845,7 +845,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf32-xtensa.c binutils-2.14.90.0.7/bfd/elf32-xtensa.c +--- binutils-2.14.90.0.7.orig/bfd/elf32-xtensa.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf32-xtensa.c 2004-04-20 01:26:12.000000000 -0600 +@@ -2004,7 +2004,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-alpha.c binutils-2.14.90.0.7/bfd/elf64-alpha.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-alpha.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf64-alpha.c 2004-04-20 01:26:12.000000000 -0600 +@@ -4394,9 +4394,11 @@ + + if (r_symndx < symtab_hdr->sh_info) + { ++ asection *msec; + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- value = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ msec = sec; ++ value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel); + + /* If this is a tp-relative relocation against sym 0, + this is hackery from relax_section. Force the value to +@@ -4424,7 +4426,6 @@ + && !gotent->reloc_xlated) + { + struct alpha_elf_got_entry *ent; +- asection *msec; + + for (ent = gotent; ent; ent = ent->next) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-hppa.c binutils-2.14.90.0.7/bfd/elf64-hppa.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-hppa.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf64-hppa.c 2004-04-20 01:26:12.000000000 -0600 +@@ -173,7 +173,7 @@ + PTR info)); + + static const char *get_dyn_name +- PARAMS ((asection *, struct elf_link_hash_entry *, ++ PARAMS ((bfd *, struct elf_link_hash_entry *, + const Elf_Internal_Rela *, char **, size_t *)); + + /* This must follow the definitions of the various derived linker +@@ -446,13 +446,14 @@ + allocate memory as necessary, possibly reusing PBUF/PLEN. */ + + static const char * +-get_dyn_name (sec, h, rel, pbuf, plen) +- asection *sec; ++get_dyn_name (abfd, h, rel, pbuf, plen) ++ bfd *abfd; + struct elf_link_hash_entry *h; + const Elf_Internal_Rela *rel; + char **pbuf; + size_t *plen; + { ++ asection *sec = abfd->sections; + size_t nlen, tlen; + char *buf; + size_t len; +@@ -858,7 +859,7 @@ + continue; + + /* Collect a canonical name for this address. */ +- addr_name = get_dyn_name (sec, h, rel, &buf, &buf_len); ++ addr_name = get_dyn_name (abfd, h, rel, &buf, &buf_len); + + /* Collect the canonical entry data for this address. */ + dyn_h = elf64_hppa_dyn_hash_lookup (&hppa_info->dyn_hash_table, +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-mmix.c binutils-2.14.90.0.7/bfd/elf64-mmix.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-mmix.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf64-mmix.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1472,7 +1472,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections [r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + + name = bfd_elf_string_from_elf_section + (input_bfd, symtab_hdr->sh_link, sym->st_name); +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-ppc.c binutils-2.14.90.0.7/bfd/elf64-ppc.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-ppc.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf64-ppc.c 2004-04-20 01:26:12.000000000 -0600 +@@ -7385,7 +7385,7 @@ + sec = local_sections[r_symndx]; + sym_name = bfd_elf_local_sym_name (input_bfd, sym); + sym_type = ELF64_ST_TYPE (sym->st_info); +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + if (elf_section_data (sec) != NULL) + { + long *opd_sym_adjust; +@@ -8178,7 +8178,9 @@ + relocation = TOCstart; + if (r_symndx == 0) + relocation += htab->stub_group[input_section->id].toc_off; +- else if (sec != NULL && !unresolved_reloc) ++ else if (unresolved_reloc) ++ ; ++ else if (sec != NULL && sec->id <= htab->top_id) + relocation += htab->stub_group[sec->id].toc_off; + else + unresolved_reloc = TRUE; +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-s390.c binutils-2.14.90.0.7/bfd/elf64-s390.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-s390.c 2003-08-21 09:28:48.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf64-s390.c 2004-04-20 01:26:12.000000000 -0600 +@@ -2297,7 +2297,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-sh64.c binutils-2.14.90.0.7/bfd/elf64-sh64.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-sh64.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elf64-sh64.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1582,7 +1582,7 @@ + } + else if (! howto->partial_inplace) + { +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + relocation |= ((sym->st_other & STO_SH5_ISA32) != 0); + } + else if ((sec->flags & SEC_MERGE) +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-sparc.c binutils-2.14.90.0.7/bfd/elf64-sparc.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-sparc.c 2003-08-21 09:28:48.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf64-sparc.c 2004-04-20 01:26:12.000000000 -0600 +@@ -2070,7 +2070,7 @@ + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +@@ -2247,16 +2247,8 @@ + + if (is_plt) + sec = splt; +- else if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ ++ if (bfd_is_abs_section (sec)) + indx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elf64-x86-64.c binutils-2.14.90.0.7/bfd/elf64-x86-64.c +--- binutils-2.14.90.0.7.orig/bfd/elf64-x86-64.c 2003-08-21 09:28:48.000000000 -0600 ++++ binutils-2.14.90.0.7/bfd/elf64-x86-64.c 2004-04-20 01:26:12.000000000 -0600 +@@ -1823,7 +1823,7 @@ + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; + +- relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); ++ relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel); + } + else + { +@@ -2048,16 +2048,7 @@ + { + long sindx; + +- if (h == NULL) +- sec = local_sections[r_symndx]; +- else +- { +- BFD_ASSERT (h->root.type == bfd_link_hash_defined +- || (h->root.type +- == bfd_link_hash_defweak)); +- sec = h->root.u.def.section; +- } +- if (sec != NULL && bfd_is_abs_section (sec)) ++ if (bfd_is_abs_section (sec)) + sindx = 0; + else if (sec == NULL || sec->owner == NULL) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/elfxx-ia64.c binutils-2.14.90.0.7/bfd/elfxx-ia64.c +--- binutils-2.14.90.0.7.orig/bfd/elfxx-ia64.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/elfxx-ia64.c 2004-04-20 01:26:12.000000000 -0600 +@@ -3849,9 +3849,11 @@ + if (r_symndx < symtab_hdr->sh_info) + { + /* Reloc against local symbol. */ ++ asection *msec; + sym = local_syms + r_symndx; + sym_sec = local_sections[r_symndx]; +- value = _bfd_elf_rela_local_sym (output_bfd, sym, sym_sec, rel); ++ msec = sym_sec; ++ value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel); + if ((sym_sec->flags & SEC_MERGE) + && ELF_ST_TYPE (sym->st_info) == STT_SECTION + && sym_sec->sec_info_type == ELF_INFO_TYPE_MERGE) +@@ -3862,7 +3864,6 @@ + if (loc_h && ! loc_h->sec_merge_done) + { + struct elfNN_ia64_dyn_sym_info *dynent; +- asection *msec; + + for (dynent = loc_h->info; dynent; dynent = dynent->next) + { +diff -urN binutils-2.14.90.0.7.orig/bfd/opncls.c binutils-2.14.90.0.7/bfd/opncls.c +--- binutils-2.14.90.0.7.orig/bfd/opncls.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/opncls.c 2004-04-20 01:26:11.000000000 -0600 +@@ -150,6 +150,13 @@ + { + bfd *nbfd; + const bfd_target *target_vec; ++ struct stat s; ++ ++ if (stat (filename, &s) == 0) ++ if (S_ISDIR(s.st_mode)) { ++ bfd_set_error (bfd_error_file_not_recognized); ++ return NULL; ++ } + + nbfd = _bfd_new_bfd (); + if (nbfd == NULL) +diff -urN binutils-2.14.90.0.7.orig/binutils/objcopy.c binutils-2.14.90.0.7/binutils/objcopy.c +--- binutils-2.14.90.0.7.orig/binutils/objcopy.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/binutils/objcopy.c 2004-04-20 01:26:12.000000000 -0600 +@@ -27,6 +27,7 @@ + #include "libiberty.h" + #include "budbg.h" + #include "filenames.h" ++#include "elf-bfd.h" + #include <sys/stat.h> + + /* A list of symbols to explicitly strip out, or to keep. A linked +@@ -385,6 +386,7 @@ + -g --strip-debug Remove all debugging symbols & sections\n\ + --strip-unneeded Remove all symbols not needed by relocations\n\ + -N --strip-symbol <name> Do not copy symbol <name>\n\ ++ --only-keep-debug Strip everything but the debug information\n\ + -K --keep-symbol <name> Only copy symbol <name>\n\ + -L --localize-symbol <name> Force symbol <name> to be marked as a local\n\ + -G --keep-global-symbol <name> Localize all symbols except <name>\n\ +@@ -457,6 +459,7 @@ + -s --strip-all Remove all symbol and relocation information\n\ + -g -S -d --strip-debug Remove all debugging symbols & sections\n\ + --strip-unneeded Remove all symbols not needed by relocations\n\ ++ --only-keep-debug Strip everything but the debug information\n\ + -N --strip-symbol=<name> Do not copy symbol <name>\n\ + -K --keep-symbol=<name> Only copy symbol <name>\n\ + -x --discard-all Remove all non-global symbols\n\ +@@ -734,7 +737,7 @@ + return FALSE; + } + +- return strip_symbols == STRIP_NONDEBUG ? TRUE : FALSE; ++ return FALSE; + } + + /* Choose which symbol entries to copy; put the result in OSYMS. +@@ -1806,6 +1809,13 @@ + + if (p != NULL && p->set_flags) + flags = p->flags | (flags & (SEC_HAS_CONTENTS | SEC_RELOC)); ++ else if (strip_symbols == STRIP_NONDEBUG && (flags & SEC_ALLOC) != 0) ++ { ++ flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD); ++ if (obfd->xvec->flavour == bfd_target_elf_flavour) ++ elf_section_type (osection) = SHT_NOBITS; ++ } ++ + if (!bfd_set_section_flags (obfd, osection, flags)) + { + err = _("flags"); +@@ -1926,6 +1936,8 @@ + } + + bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount); ++ if (relcount == 0) ++ free (relpp); + } + + isection->_cooked_size = isection->_raw_size; +diff -urN binutils-2.14.90.0.7.orig/binutils/readelf.c binutils-2.14.90.0.7/binutils/readelf.c +--- binutils-2.14.90.0.7.orig/binutils/readelf.c 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/binutils/readelf.c 2004-04-20 01:26:12.000000000 -0600 +@@ -6055,7 +6055,7 @@ + + bytes = section->sh_size; + +- if (bytes == 0) ++ if (bytes == 0 || section->sh_type == SHT_NOBITS) + { + printf (_("\nSection '%s' has no data to dump.\n"), + SECTION_NAME (section)); +diff -urN binutils-2.14.90.0.7.orig/gprof/gprof.texi binutils-2.14.90.0.7/gprof/gprof.texi +--- binutils-2.14.90.0.7.orig/gprof/gprof.texi 2002-08-01 18:49:32.000000000 -0600 ++++ binutils-2.14.90.0.7/gprof/gprof.texi 2004-04-20 01:26:11.000000000 -0600 +@@ -137,6 +137,10 @@ + If more than one profile file is specified, the @code{gprof} + output shows the sum of the profile information in the given profile files. + ++If you use gcc 2.95.x or 3.0 to compile your binaries, you may need ++to add the @samp{-fprofile-arcs} to the compile command line in order ++for the call graphs to be properly stored in gmon.out. ++ + @code{Gprof} calculates the amount of time spent in each routine. + Next, these times are propagated along the edges of the call graph. + Cycles are discovered, and calls into a cycle are made to share the time +@@ -181,7 +185,7 @@ + @c man end + + @c man begin SEEALSO +-monitor(3), profil(2), cc(1), prof(1), and the Info entry for @file{gprof}. ++profil(2), cc(1), prof(1), and the Info entry for @file{gprof}. + + ``An Execution Profiler for Modular Programs'', + by S. Graham, P. Kessler, M. McKusick; +@@ -267,6 +271,11 @@ + options. The same option, @samp{-pg}, alters either compilation or linking + to do what is necessary for profiling. Here are examples: + ++If you use gcc 2.95.x or 3.0.x, you may need to add the ++@samp{-fprofile-arcs} option to the compile line along with @samp{-pg} ++in order to allow the call-graphs to be properly included in the gmon.out ++file. ++ + @example + cc -g -c myprog.c utils.c -pg + cc -o myprog myprog.o utils.o -pg +diff -urN binutils-2.14.90.0.7.orig/ld/Makefile.am binutils-2.14.90.0.7/ld/Makefile.am +--- binutils-2.14.90.0.7.orig/ld/Makefile.am 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/ld/Makefile.am 2004-04-20 01:26:11.000000000 -0600 +@@ -19,7 +19,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff -urN binutils-2.14.90.0.7.orig/ld/Makefile.in binutils-2.14.90.0.7/ld/Makefile.in +--- binutils-2.14.90.0.7.orig/ld/Makefile.in 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/ld/Makefile.in 2004-04-20 01:26:11.000000000 -0600 +@@ -128,7 +128,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff -urN binutils-2.14.90.0.7.orig/ld/emultempl/elf32.em binutils-2.14.90.0.7/ld/emultempl/elf32.em +--- binutils-2.14.90.0.7.orig/ld/emultempl/elf32.em 2003-08-21 09:28:48.000000000 -0600 ++++ binutils-2.14.90.0.7/ld/emultempl/elf32.em 2004-04-20 01:26:11.000000000 -0600 +@@ -679,6 +679,8 @@ + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, + force)) + break; +@@ -855,6 +857,8 @@ + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf${ELFSIZE}_size_dynamic_sections + (output_bfd, command_line.soname, rpath, + command_line.filter_shlib, +diff -urN binutils-2.14.90.0.7.orig/ltmain.sh binutils-2.14.90.0.7/ltmain.sh +--- binutils-2.14.90.0.7.orig/ltmain.sh 2002-03-22 15:06:16.000000000 -0700 ++++ binutils-2.14.90.0.7/ltmain.sh 2004-04-20 01:26:12.000000000 -0600 +@@ -4413,6 +4413,10 @@ + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ++ if test -n "$linkname"; then ++ $show "(cd $output_objdir && $rm ../$linkname && $LN_S $output_objdir/$linkname ../$linkname)" ++ $run eval '(cd $output_objdir && $rm ../$linkname && $LN_S $output_objdir/$linkname ../$linkname)' || exit $? ++ fi + ;; + esac + exit 0 +diff -urN binutils-2.14.90.0.7.orig/opcodes/Makefile.am binutils-2.14.90.0.7/opcodes/Makefile.am +--- binutils-2.14.90.0.7.orig/opcodes/Makefile.am 2003-10-29 10:37:49.000000000 -0700 ++++ binutils-2.14.90.0.7/opcodes/Makefile.am 2004-04-20 01:26:12.000000000 -0600 +@@ -284,7 +284,7 @@ + + libopcodes_la_SOURCES = dis-buf.c disassemble.c dis-init.c + libopcodes_la_DEPENDENCIES = $(OFILES) ../bfd/libbfd.la +-libopcodes_la_LIBADD = $(OFILES) @WIN32LIBADD@ ../bfd/libbfd.la ++libopcodes_la_LIBADD = $(OFILES) @WIN32LIBADD@ -L../bfd -lbfd + libopcodes_la_LDFLAGS = -release $(VERSION) @WIN32LDFLAGS@ + + # libtool will build .libs/libopcodes.a. We create libopcodes.a in +diff -urN binutils-2.14.90.0.7.orig/opcodes/Makefile.in binutils-2.14.90.0.7/opcodes/Makefile.in +--- binutils-2.14.90.0.7.orig/opcodes/Makefile.in 2003-10-29 10:37:49.000000000 -0700 ++++ binutils-2.14.90.0.7/opcodes/Makefile.in 2004-04-20 01:26:12.000000000 -0600 +@@ -394,7 +394,7 @@ + + libopcodes_la_SOURCES = dis-buf.c disassemble.c dis-init.c + libopcodes_la_DEPENDENCIES = $(OFILES) ../bfd/libbfd.la +-libopcodes_la_LIBADD = $(OFILES) @WIN32LIBADD@ ../bfd/libbfd.la ++libopcodes_la_LIBADD = $(OFILES) @WIN32LIBADD@ -L../bfd -lbfd + libopcodes_la_LDFLAGS = -release $(VERSION) @WIN32LDFLAGS@ + + # libtool will build .libs/libopcodes.a. We create libopcodes.a in +@@ -593,7 +593,7 @@ + all-recursive install-data-recursive install-exec-recursive \ + installdirs-recursive install-recursive uninstall-recursive install-info-recursive \ + check-recursive installcheck-recursive info-recursive dvi-recursive: +- @set fnord $(MAKEFLAGS); amf=$$2; \ ++ @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ +@@ -613,7 +613,7 @@ + + mostlyclean-recursive clean-recursive distclean-recursive \ + maintainer-clean-recursive: +- @set fnord $(MAKEFLAGS); amf=$$2; \ ++ @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ + rev="$$subdir $$rev"; \ +diff -urN binutils-2.14.90.0.7.orig/opcodes/alpha-opc.c binutils-2.14.90.0.7/opcodes/alpha-opc.c +--- binutils-2.14.90.0.7.orig/opcodes/alpha-opc.c 2003-01-21 11:21:34.000000000 -0700 ++++ binutils-2.14.90.0.7/opcodes/alpha-opc.c 2004-04-20 01:26:11.000000000 -0600 +@@ -1105,7 +1105,8 @@ + { "wmb", MFC(0x18,0x4400), BASE, ARG_NONE }, + { "fetch", MFC(0x18,0x8000), BASE, { ZA, PRB } }, + { "fetch_m", MFC(0x18,0xA000), BASE, { ZA, PRB } }, +- { "rpcc", MFC(0x18,0xC000), BASE, { RA } }, ++ { "rpcc", MFC(0x18,0xC000), BASE, { RA, ZB } }, ++ { "rpcc", MFC(0x18,0xC000), BASE, { RA, RB } }, /* ev6 una */ + { "rc", MFC(0x18,0xE000), BASE, { RA } }, + { "ecb", MFC(0x18,0xE800), BASE, { ZA, PRB } }, /* ev56 una */ + { "rs", MFC(0x18,0xF000), BASE, { RA } }, +diff -urN binutils-2.14.90.0.7.orig/opcodes/m68k-opc.c binutils-2.14.90.0.7/opcodes/m68k-opc.c +--- binutils-2.14.90.0.7.orig/opcodes/m68k-opc.c 2003-10-29 10:37:49.000000000 -0700 ++++ binutils-2.14.90.0.7/opcodes/m68k-opc.c 2004-04-20 01:26:12.000000000 -0600 +@@ -847,15 +847,15 @@ + {"fmoved", two(0xF000, 0x7400), two(0xF1C0, 0xFC7F), "IiF7ws", cfloat }, + {"fmovel", two(0xF000, 0x4000), two(0xF1C0, 0xFC7F), "Ii;lF7", mfloat }, + {"fmovel", two(0xF000, 0x6000), two(0xF1C0, 0xFC7F), "IiF7$l", mfloat }, ++/* FIXME: the next two variants should not permit moving an address ++ register to anything but the floating point instruction register. */ ++{"fmovel", two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8%s", mfloat }, ++{"fmovel", two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Ii*ls8", mfloat }, + {"fmovel", two(0xF000, 0x4000), two(0xF1C0, 0xFC7F), "IibsF7", cfloat }, + {"fmovel", two(0xF000, 0x6000), two(0xF1C0, 0xFC7F), "IiF7bs", cfloat }, + /* Move the FP control registers */ + {"fmovel", two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8ps", cfloat }, + {"fmovel", two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Iibss8", cfloat }, +-/* FIXME: the next two variants should not permit moving an address +- register to anything but the floating point instruction register. */ +-{"fmovel", two(0xF000, 0xA000), two(0xF1C0, 0xE3FF), "Iis8%s", mfloat }, +-{"fmovel", two(0xF000, 0x8000), two(0xF1C0, 0xE3FF), "Ii*ls8", mfloat }, + {"fmovep", two(0xF000, 0x4C00), two(0xF1C0, 0xFC7F), "Ii;pF7", mfloat }, + {"fmovep", two(0xF000, 0x6C00), two(0xF1C0, 0xFC00), "IiF7~pkC", mfloat }, + {"fmovep", two(0xF000, 0x7C00), two(0xF1C0, 0xFC0F), "IiF7~pDk", mfloat }, diff --git a/openwrt/toolchain/binutils/2.14.90.0.7/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.14.90.0.7/100-uclibc-conf.patch new file mode 100644 index 0000000000..6e36af2298 --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.7/100-uclibc-conf.patch @@ -0,0 +1,646 @@ +diff -urN binutils-2.14.90.0.7.orig/bfd/config.bfd binutils-2.14.90.0.7/bfd/config.bfd +--- binutils-2.14.90.0.7.orig/bfd/config.bfd 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/config.bfd 2004-04-20 01:37:12.000000000 -0600 +@@ -121,7 +121,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -131,7 +131,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-linux-uclibc* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -214,7 +214,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -222,7 +222,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | arm*-*-uclinux* | arm-*-kfreebsd*-gnu) ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | arm*-*-uclinux* | arm*-*-linux-uclibc* | arm-*-kfreebsd*-gnu) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +@@ -355,7 +355,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -366,7 +366,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-netbsd* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -488,7 +488,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -502,7 +502,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -662,7 +662,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -929,7 +929,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -961,8 +962,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1110,7 +1111,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1157,7 +1158,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +diff -urN binutils-2.14.90.0.7.orig/bfd/configure binutils-2.14.90.0.7/bfd/configure +--- binutils-2.14.90.0.7.orig/bfd/configure 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/configure 2004-04-20 01:32:29.000000000 -0600 +@@ -1699,6 +1699,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5278,7 +5283,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5338,7 +5343,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5388,7 +5393,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +diff -urN binutils-2.14.90.0.7.orig/bfd/configure.in binutils-2.14.90.0.7/bfd/configure.in +--- binutils-2.14.90.0.7.orig/bfd/configure.in 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/bfd/configure.in 2004-04-20 01:32:29.000000000 -0600 +@@ -178,7 +178,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -259,7 +259,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -312,7 +312,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +diff -urN binutils-2.14.90.0.7.orig/config.sub binutils-2.14.90.0.7/config.sub +--- binutils-2.14.90.0.7.orig/config.sub 2003-08-21 09:28:47.000000000 -0600 ++++ binutils-2.14.90.0.7/config.sub 2004-04-20 01:32:29.000000000 -0600 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1131,7 +1131,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN binutils-2.14.90.0.7.orig/configure binutils-2.14.90.0.7/configure +--- binutils-2.14.90.0.7.orig/configure 2003-10-29 10:38:23.000000000 -0700 ++++ binutils-2.14.90.0.7/configure 2004-04-20 01:32:29.000000000 -0600 +@@ -1276,6 +1276,18 @@ + i[3456789]86-*-freebsd* | i[3456789]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.14.90.0.7.orig/configure.in binutils-2.14.90.0.7/configure.in +--- binutils-2.14.90.0.7.orig/configure.in 2003-10-29 10:38:20.000000000 -0700 ++++ binutils-2.14.90.0.7/configure.in 2004-04-20 01:32:29.000000000 -0600 +@@ -515,6 +515,19 @@ + i[[3456789]]86-*-freebsd* | i[[3456789]]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ build_modules= ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.14.90.0.7.orig/demangler/configure binutils-2.14.90.0.7/demangler/configure +--- binutils-2.14.90.0.7.orig/demangler/configure 2003-10-29 10:38:20.000000000 -0700 ++++ binutils-2.14.90.0.7/demangler/configure 2004-04-20 01:32:29.000000000 -0600 +@@ -1380,6 +1380,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.14.90.0.7.orig/gas/configure binutils-2.14.90.0.7/gas/configure +--- binutils-2.14.90.0.7.orig/gas/configure 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/gas/configure 2004-04-20 01:37:58.000000000 -0600 +@@ -3215,6 +3215,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4028,6 +4033,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4044,6 +4050,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4058,6 +4065,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -4114,7 +4122,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4175,6 +4185,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4201,6 +4212,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; + m68k-*-netbsdelf*) fmt=elf em=nbsd ;; +@@ -4257,7 +4269,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; +- ppc-*-linux-gnu*) fmt=elf em=linux ++ ppc-*-linux-uclibc* | ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; + *) { { echo "$as_me:$LINENO: error: GNU/Linux must be configured big endian" >&5 +@@ -4286,7 +4298,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4319,6 +4333,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.14.90.0.7.orig/gas/configure.in binutils-2.14.90.0.7/gas/configure.in +--- binutils-2.14.90.0.7.orig/gas/configure.in 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/gas/configure.in 2004-04-20 01:38:23.000000000 -0600 +@@ -192,6 +192,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -208,6 +209,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -222,6 +224,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -278,7 +281,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -332,6 +337,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -358,6 +364,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; + m68k-*-netbsdelf*) fmt=elf em=nbsd ;; +@@ -412,7 +419,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; +- ppc-*-linux-gnu*) fmt=elf em=linux ++ ppc-*-linux-uclibc* | ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; + *) AC_MSG_ERROR(GNU/Linux must be configured big endian) ;; +@@ -434,7 +441,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -467,6 +476,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.14.90.0.7.orig/ld/configure binutils-2.14.90.0.7/ld/configure +--- binutils-2.14.90.0.7.orig/ld/configure 2003-05-05 15:46:49.000000000 -0600 ++++ binutils-2.14.90.0.7/ld/configure 2004-04-20 01:32:29.000000000 -0600 +@@ -1578,6 +1578,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.14.90.0.7.orig/ld/configure.tgt binutils-2.14.90.0.7/ld/configure.tgt +--- binutils-2.14.90.0.7.orig/ld/configure.tgt 2003-10-29 10:37:48.000000000 -0700 ++++ binutils-2.14.90.0.7/ld/configure.tgt 2004-04-20 01:32:29.000000000 -0600 +@@ -30,6 +30,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -59,14 +60,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -125,7 +128,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -149,14 +152,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -256,10 +261,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -360,7 +368,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -376,9 +385,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -422,16 +431,20 @@ + mips*-*-rtems*) targ_emul=elf32ebmip ;; + mips*el-*-vxworks*) targ_emul=elf32elmip ;; + mips*-*-vxworks*) targ_emul=elf32ebmip ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) \ ++ targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) \ ++ targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) \ ++ targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) \ ++ targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -454,6 +467,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.14.90.0.7.orig/libtool.m4 binutils-2.14.90.0.7/libtool.m4 +--- binutils-2.14.90.0.7.orig/libtool.m4 2003-05-05 15:46:46.000000000 -0600 ++++ binutils-2.14.90.0.7/libtool.m4 2004-04-20 01:32:29.000000000 -0600 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.14.90.0.7.orig/ltconfig binutils-2.14.90.0.7/ltconfig +--- binutils-2.14.90.0.7.orig/ltconfig 2003-10-29 10:37:47.000000000 -0700 ++++ binutils-2.14.90.0.7/ltconfig 2004-04-20 01:32:29.000000000 -0600 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/binutils/2.14.90.0.7/200-build_modules.patch b/openwrt/toolchain/binutils/2.14.90.0.7/200-build_modules.patch new file mode 100644 index 0000000000..e9f8e75a89 --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.7/200-build_modules.patch @@ -0,0 +1,31 @@ +Get around an odd build failure. +diff -urN binutils-2.14.90.0.6/configure binutils-2.14.90.0.6-uClibc/configure +--- binutils-2.14.90.0.6/configure 2003-08-21 10:29:32.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/configure 2004-01-07 05:43:40.000000000 -0600 +@@ -906,6 +906,11 @@ + fi + + ++case "$target" in ++ *-*-*-uclibc*) ++ build_modules= ++ ;; ++esac + ################################################################################ + + srcname="gnu development package" +diff -urN binutils-2.14.90.0.6/configure.in binutils-2.14.90.0.6-uClibc/configure.in +--- binutils-2.14.90.0.6/configure.in 2003-08-21 10:29:30.000000000 -0500 ++++ binutils-2.14.90.0.6-uClibc/configure.in 2004-01-07 05:44:02.000000000 -0600 +@@ -178,6 +178,11 @@ + fi + + ++case "$target" in ++ *-*-*-uclibc*) ++ build_modules= ++ ;; ++esac + ################################################################################ + + srcname="gnu development package" diff --git a/openwrt/toolchain/binutils/2.14.90.0.7/210-cflags.patch b/openwrt/toolchain/binutils/2.14.90.0.7/210-cflags.patch new file mode 100644 index 0000000000..dc67d3c4e3 --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.7/210-cflags.patch @@ -0,0 +1,32 @@ +diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.am binutils-2.14.90.0.6.new/bfd/doc/Makefile.am +--- binutils-2.14.90.0.6/bfd/doc/Makefile.am 2003-07-23 10:08:09.000000000 -0500 ++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.am 2004-03-01 16:05:16.000000000 -0600 +@@ -55,10 +55,10 @@ + MKDOC = chew$(EXEEXT_FOR_BUILD) + + $(MKDOC): chew.o +- $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS) ++ $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS) + + chew.o: chew.c +- $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c ++ $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c + + protos: libbfd.h libcoff.h bfd.h + +diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.in binutils-2.14.90.0.6.new/bfd/doc/Makefile.in +--- binutils-2.14.90.0.6/bfd/doc/Makefile.in 2003-07-23 10:08:09.000000000 -0500 ++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.in 2004-03-01 16:05:03.000000000 -0600 +@@ -469,10 +469,10 @@ + + + $(MKDOC): chew.o +- $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS) ++ $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS) + + chew.o: chew.c +- $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c ++ $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c + + protos: libbfd.h libcoff.h bfd.h + diff --git a/openwrt/toolchain/binutils/2.14.90.0.7/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.14.90.0.7/600-arm-textrel.patch new file mode 100644 index 0000000000..73d5b9df8e --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.7/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/2.14.90.0.8/001-debian.patch b/openwrt/toolchain/binutils/2.14.90.0.8/001-debian.patch new file mode 100644 index 0000000000..780823542a --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.8/001-debian.patch @@ -0,0 +1,142 @@ +diff -urN binutils-2.14.90.0.8-dist/bfd/elf64-alpha.c binutils-2.14.90.0.8/bfd/elf64-alpha.c +--- binutils-2.14.90.0.8-dist/bfd/elf64-alpha.c 2004-01-14 15:07:43.000000000 -0600 ++++ binutils-2.14.90.0.8/bfd/elf64-alpha.c 2004-02-11 03:42:05.000000000 -0600 +@@ -4144,9 +4144,12 @@ + + loc = srel->contents; + loc += srel->reloc_count++ * sizeof (Elf64_External_Rela); +- bfd_elf64_swap_reloca_out (abfd, &outrel, loc); +- BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count +- <= srel->_cooked_size); ++ if (loc) ++ { ++ bfd_elf64_swap_reloca_out (abfd, &outrel, loc); ++ BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count ++ <= srel->_cooked_size); ++ } + } + + /* Relocate an Alpha ELF section for a relocatable link. +diff -urN binutils-2.14.90.0.8-dist/bfd/opncls.c binutils-2.14.90.0.8/bfd/opncls.c +--- binutils-2.14.90.0.8-dist/bfd/opncls.c 2004-01-14 15:07:43.000000000 -0600 ++++ binutils-2.14.90.0.8/bfd/opncls.c 2004-02-11 03:42:01.000000000 -0600 +@@ -150,6 +150,13 @@ + { + bfd *nbfd; + const bfd_target *target_vec; ++ struct stat s; ++ ++ if (stat (filename, &s) == 0) ++ if (S_ISDIR(s.st_mode)) { ++ bfd_set_error (bfd_error_file_not_recognized); ++ return NULL; ++ } + + nbfd = _bfd_new_bfd (); + if (nbfd == NULL) +diff -urN binutils-2.14.90.0.8-dist/gprof/gprof.texi binutils-2.14.90.0.8/gprof/gprof.texi +--- binutils-2.14.90.0.8-dist/gprof/gprof.texi 2004-01-14 15:07:51.000000000 -0600 ++++ binutils-2.14.90.0.8/gprof/gprof.texi 2004-02-11 03:42:01.000000000 -0600 +@@ -138,6 +138,10 @@ + If more than one profile file is specified, the @code{gprof} + output shows the sum of the profile information in the given profile files. + ++If you use gcc 2.95.x or 3.0 to compile your binaries, you may need ++to add the @samp{-fprofile-arcs} to the compile command line in order ++for the call graphs to be properly stored in gmon.out. ++ + @code{Gprof} calculates the amount of time spent in each routine. + Next, these times are propagated along the edges of the call graph. + Cycles are discovered, and calls into a cycle are made to share the time +@@ -182,7 +186,7 @@ + @c man end + + @c man begin SEEALSO +-monitor(3), profil(2), cc(1), prof(1), and the Info entry for @file{gprof}. ++profil(2), cc(1), prof(1), and the Info entry for @file{gprof}. + + ``An Execution Profiler for Modular Programs'', + by S. Graham, P. Kessler, M. McKusick; +@@ -268,6 +272,11 @@ + options. The same option, @samp{-pg}, alters either compilation or linking + to do what is necessary for profiling. Here are examples: + ++If you use gcc 2.95.x or 3.0.x, you may need to add the ++@samp{-fprofile-arcs} option to the compile line along with @samp{-pg} ++in order to allow the call-graphs to be properly included in the gmon.out ++file. ++ + @example + cc -g -c myprog.c utils.c -pg + cc -o myprog myprog.o utils.o -pg +diff -urN binutils-2.14.90.0.8-dist/ld/Makefile.am binutils-2.14.90.0.8/ld/Makefile.am +--- binutils-2.14.90.0.8-dist/ld/Makefile.am 2004-01-14 15:07:52.000000000 -0600 ++++ binutils-2.14.90.0.8/ld/Makefile.am 2004-02-11 03:42:01.000000000 -0600 +@@ -19,7 +19,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff -urN binutils-2.14.90.0.8-dist/ld/Makefile.in binutils-2.14.90.0.8/ld/Makefile.in +--- binutils-2.14.90.0.8-dist/ld/Makefile.in 2004-01-14 15:07:52.000000000 -0600 ++++ binutils-2.14.90.0.8/ld/Makefile.in 2004-02-11 03:42:01.000000000 -0600 +@@ -128,7 +128,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff -urN binutils-2.14.90.0.8-dist/ld/emultempl/elf32.em binutils-2.14.90.0.8/ld/emultempl/elf32.em +--- binutils-2.14.90.0.8-dist/ld/emultempl/elf32.em 2004-01-14 15:07:53.000000000 -0600 ++++ binutils-2.14.90.0.8/ld/emultempl/elf32.em 2004-02-11 03:42:01.000000000 -0600 +@@ -671,6 +671,8 @@ + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, l->name, + force)) + break; +@@ -850,6 +852,8 @@ + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf${ELFSIZE}_size_dynamic_sections + (output_bfd, command_line.soname, rpath, + command_line.filter_shlib, +diff -urN binutils-2.14.90.0.8-dist/ltmain.sh binutils-2.14.90.0.8/ltmain.sh +--- binutils-2.14.90.0.8-dist/ltmain.sh 2002-03-22 16:06:16.000000000 -0600 ++++ binutils-2.14.90.0.8/ltmain.sh 2004-02-11 03:42:05.000000000 -0600 +@@ -4413,6 +4413,10 @@ + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ++ if test -n "$linkname"; then ++ $show "(cd $output_objdir && $rm ../$linkname && $LN_S $output_objdir/$linkname ../$linkname)" ++ $run eval '(cd $output_objdir && $rm ../$linkname && $LN_S $output_objdir/$linkname ../$linkname)' || exit $? ++ fi + ;; + esac + exit 0 +diff -urN binutils-2.14.90.0.8-dist/opcodes/i386-dis.c binutils-2.14.90.0.8/opcodes/i386-dis.c +--- binutils-2.14.90.0.8-dist/opcodes/i386-dis.c 2004-01-14 15:07:55.000000000 -0600 ++++ binutils-2.14.90.0.8/opcodes/i386-dis.c 2004-02-11 03:42:01.000000000 -0600 +@@ -1879,7 +1879,7 @@ + * The function returns the length of this instruction in bytes. + */ + +-static char intel_syntax; ++static signed char intel_syntax; + static char open_char; + static char close_char; + static char separator_char; diff --git a/openwrt/toolchain/binutils/2.14.90.0.8/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.14.90.0.8/100-uclibc-conf.patch new file mode 100644 index 0000000000..5cb516cd21 --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.8/100-uclibc-conf.patch @@ -0,0 +1,630 @@ +diff -urN binutils-2.14.90.0.8-001-debian/bfd/config.bfd binutils-2.14.90.0.8/bfd/config.bfd +--- binutils-2.14.90.0.8-001-debian/bfd/config.bfd 2004-01-14 15:07:43.000000000 -0600 ++++ binutils-2.14.90.0.8/bfd/config.bfd 2004-02-12 14:18:14.000000000 -0600 +@@ -121,7 +121,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -131,7 +131,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -208,7 +208,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -216,8 +216,8 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ +- arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | \ ++ arm*-*-conix* | arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +@@ -350,7 +350,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -361,7 +361,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc* | hppa*-*-netbsd*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -483,7 +483,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -497,7 +497,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -672,7 +672,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -952,7 +952,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -984,8 +985,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1141,7 +1142,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1188,7 +1189,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +diff -urN binutils-2.14.90.0.8-001-debian/bfd/configure binutils-2.14.90.0.8/bfd/configure +--- binutils-2.14.90.0.8-001-debian/bfd/configure 2004-01-14 15:07:43.000000000 -0600 ++++ binutils-2.14.90.0.8/bfd/configure 2004-02-12 14:09:10.000000000 -0600 +@@ -1699,6 +1699,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5278,7 +5283,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5338,7 +5343,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5388,7 +5393,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +diff -urN binutils-2.14.90.0.8-001-debian/bfd/configure.in binutils-2.14.90.0.8/bfd/configure.in +--- binutils-2.14.90.0.8-001-debian/bfd/configure.in 2004-01-14 15:07:43.000000000 -0600 ++++ binutils-2.14.90.0.8/bfd/configure.in 2004-02-12 14:09:10.000000000 -0600 +@@ -178,7 +178,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -259,7 +259,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -312,7 +312,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +diff -urN binutils-2.14.90.0.8-001-debian/config.sub binutils-2.14.90.0.8/config.sub +--- binutils-2.14.90.0.8-001-debian/config.sub 2004-01-14 15:07:42.000000000 -0600 ++++ binutils-2.14.90.0.8/config.sub 2004-02-12 14:09:10.000000000 -0600 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1131,7 +1131,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN binutils-2.14.90.0.8-001-debian/configure binutils-2.14.90.0.8/configure +--- binutils-2.14.90.0.8-001-debian/configure 2004-01-14 15:07:42.000000000 -0600 ++++ binutils-2.14.90.0.8/configure 2004-02-12 14:09:10.000000000 -0600 +@@ -1273,6 +1273,18 @@ + i[3456789]86-*-freebsd* | i[3456789]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.14.90.0.8-001-debian/configure.in binutils-2.14.90.0.8/configure.in +--- binutils-2.14.90.0.8-001-debian/configure.in 2004-01-14 15:07:42.000000000 -0600 ++++ binutils-2.14.90.0.8/configure.in 2004-02-12 14:50:56.000000000 -0600 +@@ -512,6 +512,18 @@ + i[[3456789]]86-*-freebsd* | i[[3456789]]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[[3456789]]86-*-linux-uclibc) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.14.90.0.8-001-debian/gas/configure binutils-2.14.90.0.8/gas/configure +--- binutils-2.14.90.0.8-001-debian/gas/configure 2004-01-14 15:07:45.000000000 -0600 ++++ binutils-2.14.90.0.8/gas/configure 2004-02-12 14:57:43.000000000 -0600 +@@ -3215,6 +3215,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4030,6 +4035,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4046,6 +4052,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4059,6 +4066,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -4115,7 +4123,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4175,6 +4185,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4202,6 +4213,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4265,6 +4277,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4292,7 +4305,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4325,6 +4340,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.14.90.0.8-001-debian/gas/configure.in binutils-2.14.90.0.8/gas/configure.in +--- binutils-2.14.90.0.8-001-debian/gas/configure.in 2004-01-14 15:07:45.000000000 -0600 ++++ binutils-2.14.90.0.8/gas/configure.in 2004-02-12 14:21:06.000000000 -0600 +@@ -194,6 +194,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -210,6 +211,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -223,6 +225,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -279,7 +282,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -332,6 +337,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -359,6 +365,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -419,6 +426,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -439,7 +447,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -472,6 +482,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.14.90.0.8-001-debian/ld/configure binutils-2.14.90.0.8/ld/configure +--- binutils-2.14.90.0.8-001-debian/ld/configure 2003-05-05 16:46:49.000000000 -0500 ++++ binutils-2.14.90.0.8/ld/configure 2004-02-12 14:09:10.000000000 -0600 +@@ -1578,6 +1578,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.14.90.0.8-001-debian/ld/configure.tgt binutils-2.14.90.0.8/ld/configure.tgt +--- binutils-2.14.90.0.8-001-debian/ld/configure.tgt 2004-01-14 15:07:52.000000000 -0600 ++++ binutils-2.14.90.0.8/ld/configure.tgt 2004-02-12 14:14:12.000000000 -0600 +@@ -30,6 +30,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -59,14 +60,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -128,7 +131,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -152,14 +155,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -259,10 +264,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -363,7 +371,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -380,9 +389,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -429,16 +438,20 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) \ ++ targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) \ ++ targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) \ ++ targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) \ ++ targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -461,6 +474,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.14.90.0.8-001-debian/libtool.m4 binutils-2.14.90.0.8/libtool.m4 +--- binutils-2.14.90.0.8-001-debian/libtool.m4 2003-05-05 16:46:46.000000000 -0500 ++++ binutils-2.14.90.0.8/libtool.m4 2004-02-12 14:09:10.000000000 -0600 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.14.90.0.8-001-debian/ltconfig binutils-2.14.90.0.8/ltconfig +--- binutils-2.14.90.0.8-001-debian/ltconfig 2004-01-14 15:07:42.000000000 -0600 ++++ binutils-2.14.90.0.8/ltconfig 2004-02-12 14:09:10.000000000 -0600 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/binutils/2.14.90.0.8/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.14.90.0.8/600-arm-textrel.patch new file mode 100644 index 0000000000..73d5b9df8e --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.8/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/2.15.90.0.1.1/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15.90.0.1.1/100-uclibc-conf.patch new file mode 100644 index 0000000000..d47b6f0942 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.1.1/100-uclibc-conf.patch @@ -0,0 +1,692 @@ +diff -urN binutils-2.15.90.0.1.1-dist/bfd/config.bfd binutils-2.15.90.0.1.1/bfd/config.bfd +--- binutils-2.15.90.0.1.1-dist/bfd/config.bfd 2004-01-14 15:07:43.000000000 -0600 ++++ binutils-2.15.90.0.1.1/bfd/config.bfd 2004-08-06 17:29:55.000000000 -0500 +@@ -121,7 +121,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -131,7 +131,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -208,7 +208,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -216,7 +216,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -350,7 +350,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -361,7 +361,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc* | hppa*-*-netbsd*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -483,7 +483,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -497,7 +497,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -672,7 +672,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -952,7 +952,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -984,8 +985,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1141,7 +1142,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1188,7 +1189,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1257,7 +1258,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN binutils-2.15.90.0.1.1-dist/bfd/configure binutils-2.15.90.0.1.1/bfd/configure +--- binutils-2.15.90.0.1.1-dist/bfd/configure 2004-03-05 19:18:21.000000000 -0600 ++++ binutils-2.15.90.0.1.1/bfd/configure 2004-08-06 17:29:55.000000000 -0500 +@@ -1699,6 +1699,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5278,7 +5283,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5338,7 +5343,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5388,7 +5393,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5489,7 +5494,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.90.0.1.1-dist/bfd/configure.in binutils-2.15.90.0.1.1/bfd/configure.in +--- binutils-2.15.90.0.1.1-dist/bfd/configure.in 2004-03-05 19:18:21.000000000 -0600 ++++ binutils-2.15.90.0.1.1/bfd/configure.in 2004-08-06 17:29:55.000000000 -0500 +@@ -178,7 +178,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -259,7 +259,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -312,7 +312,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -397,7 +397,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.90.0.1.1-dist/binutils/configure binutils-2.15.90.0.1.1/binutils/configure +--- binutils-2.15.90.0.1.1-dist/binutils/configure 2004-01-14 15:07:44.000000000 -0600 ++++ binutils-2.15.90.0.1.1/binutils/configure 2004-08-06 17:29:55.000000000 -0500 +@@ -1574,6 +1574,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.1.1-dist/configure binutils-2.15.90.0.1.1/configure +--- binutils-2.15.90.0.1.1-dist/configure 2004-03-03 14:24:33.000000000 -0600 ++++ binutils-2.15.90.0.1.1/configure 2004-08-06 17:29:55.000000000 -0500 +@@ -1288,6 +1288,18 @@ + i[3456789]86-*-freebsd* | i[3456789]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.90.0.1.1-dist/configure.in binutils-2.15.90.0.1.1/configure.in +--- binutils-2.15.90.0.1.1-dist/configure.in 2004-03-03 14:24:33.000000000 -0600 ++++ binutils-2.15.90.0.1.1/configure.in 2004-08-06 17:29:55.000000000 -0500 +@@ -521,6 +521,18 @@ + i[[3456789]]86-*-freebsd* | i[[3456789]]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.90.0.1.1-dist/gas/configure binutils-2.15.90.0.1.1/gas/configure +--- binutils-2.15.90.0.1.1-dist/gas/configure 2004-03-05 19:18:21.000000000 -0600 ++++ binutils-2.15.90.0.1.1/gas/configure 2004-08-06 17:29:55.000000000 -0500 +@@ -3401,6 +3401,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4226,6 +4231,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4242,6 +4248,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4255,6 +4262,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -4311,7 +4319,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4371,6 +4381,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4398,6 +4409,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4461,6 +4473,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4488,7 +4501,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4521,6 +4536,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.90.0.1.1-dist/gas/configure.in binutils-2.15.90.0.1.1/gas/configure.in +--- binutils-2.15.90.0.1.1-dist/gas/configure.in 2004-01-14 15:07:45.000000000 -0600 ++++ binutils-2.15.90.0.1.1/gas/configure.in 2004-08-06 17:29:55.000000000 -0500 +@@ -194,6 +194,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -210,6 +211,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -223,6 +225,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -279,7 +282,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -332,6 +337,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -359,6 +365,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -419,6 +426,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -439,7 +447,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -472,6 +482,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.90.0.1.1-dist/gprof/configure binutils-2.15.90.0.1.1/gprof/configure +--- binutils-2.15.90.0.1.1-dist/gprof/configure 2004-01-14 15:07:51.000000000 -0600 ++++ binutils-2.15.90.0.1.1/gprof/configure 2004-08-06 17:29:55.000000000 -0500 +@@ -1570,6 +1570,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.1.1-dist/ld/configure binutils-2.15.90.0.1.1/ld/configure +--- binutils-2.15.90.0.1.1-dist/ld/configure 2003-05-05 16:46:49.000000000 -0500 ++++ binutils-2.15.90.0.1.1/ld/configure 2004-08-06 17:29:55.000000000 -0500 +@@ -1578,6 +1578,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.1.1-dist/ld/configure.tgt binutils-2.15.90.0.1.1/ld/configure.tgt +--- binutils-2.15.90.0.1.1-dist/ld/configure.tgt 2004-01-14 15:07:52.000000000 -0600 ++++ binutils-2.15.90.0.1.1/ld/configure.tgt 2004-08-06 17:29:55.000000000 -0500 +@@ -30,6 +30,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -59,14 +60,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -118,7 +121,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -128,7 +133,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -152,14 +157,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -259,10 +266,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -363,7 +373,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -380,9 +391,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -395,6 +406,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -429,16 +441,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -461,6 +473,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.15.90.0.1.1-dist/libtool.m4 binutils-2.15.90.0.1.1/libtool.m4 +--- binutils-2.15.90.0.1.1-dist/libtool.m4 2003-05-05 16:46:46.000000000 -0500 ++++ binutils-2.15.90.0.1.1/libtool.m4 2004-08-06 17:29:55.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.15.90.0.1.1-dist/ltconfig binutils-2.15.90.0.1.1/ltconfig +--- binutils-2.15.90.0.1.1-dist/ltconfig 2004-01-14 15:07:42.000000000 -0600 ++++ binutils-2.15.90.0.1.1/ltconfig 2004-08-06 17:29:55.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN binutils-2.15.90.0.1.1-dist/opcodes/configure binutils-2.15.90.0.1.1/opcodes/configure +--- binutils-2.15.90.0.1.1-dist/opcodes/configure 2004-01-14 15:07:54.000000000 -0600 ++++ binutils-2.15.90.0.1.1/opcodes/configure 2004-08-06 17:29:55.000000000 -0500 +@@ -1689,6 +1689,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15.90.0.1.1/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.15.90.0.1.1/600-arm-textrel.patch new file mode 100644 index 0000000000..73d5b9df8e --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.1.1/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/2.15.90.0.1/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15.90.0.1/100-uclibc-conf.patch new file mode 100644 index 0000000000..64aef4986e --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.1/100-uclibc-conf.patch @@ -0,0 +1,692 @@ +diff -urN binutils-2.15.90.0.1-dist/bfd/config.bfd binutils-2.15.90.0.1/bfd/config.bfd +--- binutils-2.15.90.0.1-dist/bfd/config.bfd 2004-01-14 15:07:43.000000000 -0600 ++++ binutils-2.15.90.0.1/bfd/config.bfd 2004-08-06 17:39:55.000000000 -0500 +@@ -121,7 +121,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -131,7 +131,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -208,7 +208,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -216,7 +216,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -350,7 +350,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -361,7 +361,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc* | hppa*-*-netbsd*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -483,7 +483,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -497,7 +497,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -672,7 +672,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -952,7 +952,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -984,8 +985,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1141,7 +1142,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1188,7 +1189,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1257,7 +1258,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN binutils-2.15.90.0.1-dist/bfd/configure binutils-2.15.90.0.1/bfd/configure +--- binutils-2.15.90.0.1-dist/bfd/configure 2004-03-03 14:24:33.000000000 -0600 ++++ binutils-2.15.90.0.1/bfd/configure 2004-08-06 17:39:55.000000000 -0500 +@@ -1699,6 +1699,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5278,7 +5283,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5338,7 +5343,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5388,7 +5393,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5489,7 +5494,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.90.0.1-dist/bfd/configure.in binutils-2.15.90.0.1/bfd/configure.in +--- binutils-2.15.90.0.1-dist/bfd/configure.in 2004-03-03 14:24:33.000000000 -0600 ++++ binutils-2.15.90.0.1/bfd/configure.in 2004-08-06 17:39:55.000000000 -0500 +@@ -178,7 +178,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -259,7 +259,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -312,7 +312,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -397,7 +397,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.90.0.1-dist/binutils/configure binutils-2.15.90.0.1/binutils/configure +--- binutils-2.15.90.0.1-dist/binutils/configure 2004-01-14 15:07:44.000000000 -0600 ++++ binutils-2.15.90.0.1/binutils/configure 2004-08-06 17:39:55.000000000 -0500 +@@ -1574,6 +1574,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.1-dist/configure binutils-2.15.90.0.1/configure +--- binutils-2.15.90.0.1-dist/configure 2004-03-03 14:24:33.000000000 -0600 ++++ binutils-2.15.90.0.1/configure 2004-08-06 17:39:55.000000000 -0500 +@@ -1288,6 +1288,18 @@ + i[3456789]86-*-freebsd* | i[3456789]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.90.0.1-dist/configure.in binutils-2.15.90.0.1/configure.in +--- binutils-2.15.90.0.1-dist/configure.in 2004-03-03 14:24:33.000000000 -0600 ++++ binutils-2.15.90.0.1/configure.in 2004-08-06 17:39:55.000000000 -0500 +@@ -521,6 +521,18 @@ + i[[3456789]]86-*-freebsd* | i[[3456789]]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.90.0.1-dist/gas/configure binutils-2.15.90.0.1/gas/configure +--- binutils-2.15.90.0.1-dist/gas/configure 2004-01-14 15:07:45.000000000 -0600 ++++ binutils-2.15.90.0.1/gas/configure 2004-08-06 17:39:55.000000000 -0500 +@@ -3215,6 +3215,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4030,6 +4035,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4046,6 +4052,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4059,6 +4066,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -4115,7 +4123,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4175,6 +4185,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4202,6 +4213,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4265,6 +4277,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4292,7 +4305,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4325,6 +4340,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.90.0.1-dist/gas/configure.in binutils-2.15.90.0.1/gas/configure.in +--- binutils-2.15.90.0.1-dist/gas/configure.in 2004-01-14 15:07:45.000000000 -0600 ++++ binutils-2.15.90.0.1/gas/configure.in 2004-08-06 17:39:55.000000000 -0500 +@@ -194,6 +194,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -210,6 +211,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -223,6 +225,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -279,7 +282,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -332,6 +337,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -359,6 +365,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -419,6 +426,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -439,7 +447,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -472,6 +482,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.90.0.1-dist/gprof/configure binutils-2.15.90.0.1/gprof/configure +--- binutils-2.15.90.0.1-dist/gprof/configure 2004-01-14 15:07:51.000000000 -0600 ++++ binutils-2.15.90.0.1/gprof/configure 2004-08-06 17:39:55.000000000 -0500 +@@ -1570,6 +1570,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.1-dist/ld/configure binutils-2.15.90.0.1/ld/configure +--- binutils-2.15.90.0.1-dist/ld/configure 2003-05-05 16:46:49.000000000 -0500 ++++ binutils-2.15.90.0.1/ld/configure 2004-08-06 17:39:55.000000000 -0500 +@@ -1578,6 +1578,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.1-dist/ld/configure.tgt binutils-2.15.90.0.1/ld/configure.tgt +--- binutils-2.15.90.0.1-dist/ld/configure.tgt 2004-01-14 15:07:52.000000000 -0600 ++++ binutils-2.15.90.0.1/ld/configure.tgt 2004-08-06 17:39:55.000000000 -0500 +@@ -30,6 +30,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -59,14 +60,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -118,7 +121,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -128,7 +133,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -152,14 +157,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -259,10 +266,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -363,7 +373,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -380,9 +391,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -395,6 +406,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -429,16 +441,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -461,6 +473,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.15.90.0.1-dist/libtool.m4 binutils-2.15.90.0.1/libtool.m4 +--- binutils-2.15.90.0.1-dist/libtool.m4 2003-05-05 16:46:46.000000000 -0500 ++++ binutils-2.15.90.0.1/libtool.m4 2004-08-06 17:39:55.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.15.90.0.1-dist/ltconfig binutils-2.15.90.0.1/ltconfig +--- binutils-2.15.90.0.1-dist/ltconfig 2004-01-14 15:07:42.000000000 -0600 ++++ binutils-2.15.90.0.1/ltconfig 2004-08-06 17:39:55.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN binutils-2.15.90.0.1-dist/opcodes/configure binutils-2.15.90.0.1/opcodes/configure +--- binutils-2.15.90.0.1-dist/opcodes/configure 2004-01-14 15:07:54.000000000 -0600 ++++ binutils-2.15.90.0.1/opcodes/configure 2004-08-06 17:39:55.000000000 -0500 +@@ -1689,6 +1689,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15.90.0.1/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.15.90.0.1/600-arm-textrel.patch new file mode 100644 index 0000000000..73d5b9df8e --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.1/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/2.15.90.0.2/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15.90.0.2/100-uclibc-conf.patch new file mode 100644 index 0000000000..28c5017ed2 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.2/100-uclibc-conf.patch @@ -0,0 +1,692 @@ +diff -urN binutils-2.15.90.0.3-dist/bfd/config.bfd binutils-2.15.90.0.3/bfd/config.bfd +--- binutils-2.15.90.0.3-dist/bfd/config.bfd 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/config.bfd 2004-08-06 17:02:17.000000000 -0500 +@@ -126,7 +126,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -136,7 +136,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -213,7 +213,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -221,7 +221,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -360,7 +360,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -371,7 +371,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc* | hppa*-*-netbsd*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -494,7 +494,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -508,7 +508,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -683,7 +683,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -955,7 +955,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -987,8 +988,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1149,7 +1150,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1196,7 +1197,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1265,7 +1266,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN binutils-2.15.90.0.3-dist/bfd/configure binutils-2.15.90.0.3/bfd/configure +--- binutils-2.15.90.0.3-dist/bfd/configure 2004-04-14 23:26:05.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1699,6 +1699,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5278,7 +5283,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5338,7 +5343,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5376,7 +5381,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5477,7 +5482,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.90.0.3-dist/bfd/configure.in binutils-2.15.90.0.3/bfd/configure.in +--- binutils-2.15.90.0.3-dist/bfd/configure.in 2004-04-14 23:26:05.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/configure.in 2004-08-06 17:02:17.000000000 -0500 +@@ -178,7 +178,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -259,7 +259,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -300,7 +300,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -385,7 +385,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.90.0.3-dist/binutils/configure binutils-2.15.90.0.3/binutils/configure +--- binutils-2.15.90.0.3-dist/binutils/configure 2004-04-12 14:56:34.000000000 -0500 ++++ binutils-2.15.90.0.3/binutils/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1575,6 +1575,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.3-dist/configure binutils-2.15.90.0.3/configure +--- binutils-2.15.90.0.3-dist/configure 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1298,6 +1298,18 @@ + i[3456789]86-*-freebsd* | i[3456789]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.90.0.3-dist/configure.in binutils-2.15.90.0.3/configure.in +--- binutils-2.15.90.0.3-dist/configure.in 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/configure.in 2004-08-06 17:02:17.000000000 -0500 +@@ -521,6 +521,18 @@ + i[[3456789]]86-*-freebsd* | i[[3456789]]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.90.0.3-dist/gas/configure binutils-2.15.90.0.3/gas/configure +--- binutils-2.15.90.0.3-dist/gas/configure 2004-04-12 14:56:34.000000000 -0500 ++++ binutils-2.15.90.0.3/gas/configure 2004-08-06 17:04:29.000000000 -0500 +@@ -3401,6 +3401,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4226,6 +4231,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4242,6 +4248,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4255,6 +4262,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -4311,7 +4319,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4371,6 +4381,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4398,6 +4409,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4460,6 +4472,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4487,7 +4500,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4520,6 +4535,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.90.0.3-dist/gas/configure.in binutils-2.15.90.0.3/gas/configure.in +--- binutils-2.15.90.0.3-dist/gas/configure.in 2004-04-12 14:56:34.000000000 -0500 ++++ binutils-2.15.90.0.3/gas/configure.in 2004-08-06 17:04:27.000000000 -0500 +@@ -194,6 +194,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -210,6 +211,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -223,6 +225,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -279,7 +282,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -332,6 +337,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -359,6 +365,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -418,6 +425,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -438,7 +446,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -471,6 +481,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.90.0.3-dist/gprof/configure binutils-2.15.90.0.3/gprof/configure +--- binutils-2.15.90.0.3-dist/gprof/configure 2004-01-14 15:07:51.000000000 -0600 ++++ binutils-2.15.90.0.3/gprof/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1570,6 +1570,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.3-dist/ld/configure binutils-2.15.90.0.3/ld/configure +--- binutils-2.15.90.0.3-dist/ld/configure 2003-05-05 16:46:49.000000000 -0500 ++++ binutils-2.15.90.0.3/ld/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1578,6 +1578,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.3-dist/ld/configure.tgt binutils-2.15.90.0.3/ld/configure.tgt +--- binutils-2.15.90.0.3-dist/ld/configure.tgt 2004-04-12 14:56:35.000000000 -0500 ++++ binutils-2.15.90.0.3/ld/configure.tgt 2004-08-06 17:02:17.000000000 -0500 +@@ -31,6 +31,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -60,14 +61,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -119,7 +122,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -129,7 +134,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -153,14 +158,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -260,10 +267,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -365,7 +375,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -382,9 +393,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -397,6 +408,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -430,16 +442,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -462,6 +474,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.15.90.0.3-dist/libtool.m4 binutils-2.15.90.0.3/libtool.m4 +--- binutils-2.15.90.0.3-dist/libtool.m4 2003-05-05 16:46:46.000000000 -0500 ++++ binutils-2.15.90.0.3/libtool.m4 2004-08-06 17:02:17.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.15.90.0.3-dist/ltconfig binutils-2.15.90.0.3/ltconfig +--- binutils-2.15.90.0.3-dist/ltconfig 2004-01-14 15:07:42.000000000 -0600 ++++ binutils-2.15.90.0.3/ltconfig 2004-08-06 17:02:17.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN binutils-2.15.90.0.3-dist/opcodes/configure binutils-2.15.90.0.3/opcodes/configure +--- binutils-2.15.90.0.3-dist/opcodes/configure 2004-04-12 14:56:38.000000000 -0500 ++++ binutils-2.15.90.0.3/opcodes/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1690,6 +1690,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15.90.0.2/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.15.90.0.2/600-arm-textrel.patch new file mode 100644 index 0000000000..73d5b9df8e --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.2/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/2.15.90.0.3/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15.90.0.3/100-uclibc-conf.patch new file mode 100644 index 0000000000..28c5017ed2 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.3/100-uclibc-conf.patch @@ -0,0 +1,692 @@ +diff -urN binutils-2.15.90.0.3-dist/bfd/config.bfd binutils-2.15.90.0.3/bfd/config.bfd +--- binutils-2.15.90.0.3-dist/bfd/config.bfd 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/config.bfd 2004-08-06 17:02:17.000000000 -0500 +@@ -126,7 +126,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -136,7 +136,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -213,7 +213,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -221,7 +221,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -360,7 +360,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -371,7 +371,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc* | hppa*-*-netbsd*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -494,7 +494,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -508,7 +508,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -683,7 +683,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -955,7 +955,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -987,8 +988,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1149,7 +1150,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1196,7 +1197,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1265,7 +1266,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN binutils-2.15.90.0.3-dist/bfd/configure binutils-2.15.90.0.3/bfd/configure +--- binutils-2.15.90.0.3-dist/bfd/configure 2004-04-14 23:26:05.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1699,6 +1699,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5278,7 +5283,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5338,7 +5343,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5376,7 +5381,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5477,7 +5482,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.90.0.3-dist/bfd/configure.in binutils-2.15.90.0.3/bfd/configure.in +--- binutils-2.15.90.0.3-dist/bfd/configure.in 2004-04-14 23:26:05.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/configure.in 2004-08-06 17:02:17.000000000 -0500 +@@ -178,7 +178,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -259,7 +259,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -300,7 +300,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -385,7 +385,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.90.0.3-dist/binutils/configure binutils-2.15.90.0.3/binutils/configure +--- binutils-2.15.90.0.3-dist/binutils/configure 2004-04-12 14:56:34.000000000 -0500 ++++ binutils-2.15.90.0.3/binutils/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1575,6 +1575,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.3-dist/configure binutils-2.15.90.0.3/configure +--- binutils-2.15.90.0.3-dist/configure 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1298,6 +1298,18 @@ + i[3456789]86-*-freebsd* | i[3456789]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.90.0.3-dist/configure.in binutils-2.15.90.0.3/configure.in +--- binutils-2.15.90.0.3-dist/configure.in 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/configure.in 2004-08-06 17:02:17.000000000 -0500 +@@ -521,6 +521,18 @@ + i[[3456789]]86-*-freebsd* | i[[3456789]]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.90.0.3-dist/gas/configure binutils-2.15.90.0.3/gas/configure +--- binutils-2.15.90.0.3-dist/gas/configure 2004-04-12 14:56:34.000000000 -0500 ++++ binutils-2.15.90.0.3/gas/configure 2004-08-06 17:04:29.000000000 -0500 +@@ -3401,6 +3401,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4226,6 +4231,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4242,6 +4248,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4255,6 +4262,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -4311,7 +4319,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4371,6 +4381,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4398,6 +4409,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4460,6 +4472,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4487,7 +4500,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4520,6 +4535,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.90.0.3-dist/gas/configure.in binutils-2.15.90.0.3/gas/configure.in +--- binutils-2.15.90.0.3-dist/gas/configure.in 2004-04-12 14:56:34.000000000 -0500 ++++ binutils-2.15.90.0.3/gas/configure.in 2004-08-06 17:04:27.000000000 -0500 +@@ -194,6 +194,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -210,6 +211,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -223,6 +225,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -279,7 +282,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -332,6 +337,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -359,6 +365,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -418,6 +425,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -438,7 +446,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -471,6 +481,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.90.0.3-dist/gprof/configure binutils-2.15.90.0.3/gprof/configure +--- binutils-2.15.90.0.3-dist/gprof/configure 2004-01-14 15:07:51.000000000 -0600 ++++ binutils-2.15.90.0.3/gprof/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1570,6 +1570,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.3-dist/ld/configure binutils-2.15.90.0.3/ld/configure +--- binutils-2.15.90.0.3-dist/ld/configure 2003-05-05 16:46:49.000000000 -0500 ++++ binutils-2.15.90.0.3/ld/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1578,6 +1578,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.90.0.3-dist/ld/configure.tgt binutils-2.15.90.0.3/ld/configure.tgt +--- binutils-2.15.90.0.3-dist/ld/configure.tgt 2004-04-12 14:56:35.000000000 -0500 ++++ binutils-2.15.90.0.3/ld/configure.tgt 2004-08-06 17:02:17.000000000 -0500 +@@ -31,6 +31,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -60,14 +61,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -119,7 +122,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -129,7 +134,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -153,14 +158,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -260,10 +267,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -365,7 +375,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -382,9 +393,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -397,6 +408,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -430,16 +442,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -462,6 +474,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.15.90.0.3-dist/libtool.m4 binutils-2.15.90.0.3/libtool.m4 +--- binutils-2.15.90.0.3-dist/libtool.m4 2003-05-05 16:46:46.000000000 -0500 ++++ binutils-2.15.90.0.3/libtool.m4 2004-08-06 17:02:17.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.15.90.0.3-dist/ltconfig binutils-2.15.90.0.3/ltconfig +--- binutils-2.15.90.0.3-dist/ltconfig 2004-01-14 15:07:42.000000000 -0600 ++++ binutils-2.15.90.0.3/ltconfig 2004-08-06 17:02:17.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN binutils-2.15.90.0.3-dist/opcodes/configure binutils-2.15.90.0.3/opcodes/configure +--- binutils-2.15.90.0.3-dist/opcodes/configure 2004-04-12 14:56:38.000000000 -0500 ++++ binutils-2.15.90.0.3/opcodes/configure 2004-08-06 17:02:17.000000000 -0500 +@@ -1690,6 +1690,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15.90.0.3/210-cflags.patch b/openwrt/toolchain/binutils/2.15.90.0.3/210-cflags.patch new file mode 100644 index 0000000000..29bb5c18db --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.3/210-cflags.patch @@ -0,0 +1,32 @@ +diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.am binutils-2.14.90.0.6.new/bfd/doc/Makefile.am +--- binutils-2.14.90.0.6/bfd/doc/Makefile.am 2003-07-23 10:08:09.000000000 -0500 ++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.am 2004-03-01 16:05:16.000000000 -0600 +@@ -55,10 +55,10 @@ + MKDOC = chew$(EXEEXT_FOR_BUILD) + + $(MKDOC): chew.o +- $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS) ++ $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS) + + chew.o: chew.c +- $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c ++ $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c + + protos: libbfd.h libcoff.h bfd.h + +diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.in binutils-2.14.90.0.6.new/bfd/doc/Makefile.in +--- binutils-2.14.90.0.6/bfd/doc/Makefile.in 2003-07-23 10:08:09.000000000 -0500 ++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.in 2004-03-01 16:05:03.000000000 -0600 +@@ -472,10 +472,10 @@ + + + $(MKDOC): chew.o +- $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS) ++ $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS) + + chew.o: chew.c +- $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c ++ $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c + + protos: libbfd.h libcoff.h bfd.h + diff --git a/openwrt/toolchain/binutils/2.15.90.0.3/500-branch-likely.patch b/openwrt/toolchain/binutils/2.15.90.0.3/500-branch-likely.patch new file mode 100644 index 0000000000..0bb1a4b4f6 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.3/500-branch-likely.patch @@ -0,0 +1,10 @@ +--- binutils-2.15.90.0.3/gas/config/tc-mips.c-dist 2004-08-19 12:56:20.000000000 -0500 ++++ binutils-2.15.90.0.3/gas/config/tc-mips.c 2004-08-19 12:57:30.000000000 -0500 +@@ -2708,6 +2708,7 @@ + prev_insn_reloc_type[1] = BFD_RELOC_UNUSED; + prev_insn_reloc_type[2] = BFD_RELOC_UNUSED; + prev_insn_extended = 0; ++ prev_insn_is_delay_slot = 1; + } + else + { diff --git a/openwrt/toolchain/binutils/2.15.90.0.3/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.15.90.0.3/600-arm-textrel.patch new file mode 100644 index 0000000000..73d5b9df8e --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.90.0.3/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/2.15.91.0.1/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15.91.0.1/100-uclibc-conf.patch new file mode 100644 index 0000000000..57b86abca1 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.91.0.1/100-uclibc-conf.patch @@ -0,0 +1,692 @@ +diff -urN binutils-2.15.91.0.1-dist/bfd/config.bfd binutils-2.15.91.0.1/bfd/config.bfd +--- binutils-2.15.91.0.1-dist/bfd/config.bfd 2004-05-27 13:26:01.000000000 -0500 ++++ binutils-2.15.91.0.1/bfd/config.bfd 2004-07-16 14:57:21.000000000 -0500 +@@ -128,7 +128,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -138,7 +138,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -215,7 +215,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -223,7 +223,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -367,7 +367,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -378,7 +378,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc* | hppa*-*-netbsd*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -501,7 +501,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -515,7 +515,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -690,7 +690,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -966,7 +966,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -1003,8 +1004,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1165,7 +1166,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1212,7 +1213,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1281,7 +1282,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN binutils-2.15.91.0.1-dist/bfd/configure binutils-2.15.91.0.1/bfd/configure +--- binutils-2.15.91.0.1-dist/bfd/configure 2004-05-27 13:26:02.000000000 -0500 ++++ binutils-2.15.91.0.1/bfd/configure 2004-07-16 14:57:21.000000000 -0500 +@@ -1687,6 +1687,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5266,7 +5271,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5326,7 +5331,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5364,7 +5369,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5468,7 +5473,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.91.0.1-dist/bfd/configure.in binutils-2.15.91.0.1/bfd/configure.in +--- binutils-2.15.91.0.1-dist/bfd/configure.in 2004-05-27 13:26:02.000000000 -0500 ++++ binutils-2.15.91.0.1/bfd/configure.in 2004-07-16 14:57:21.000000000 -0500 +@@ -164,7 +164,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -245,7 +245,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -286,7 +286,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -374,7 +374,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.91.0.1-dist/binutils/configure binutils-2.15.91.0.1/binutils/configure +--- binutils-2.15.91.0.1-dist/binutils/configure 2004-04-12 14:56:34.000000000 -0500 ++++ binutils-2.15.91.0.1/binutils/configure 2004-07-27 21:50:54.000000000 -0500 +@@ -1575,6 +1575,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.91.0.1-dist/configure binutils-2.15.91.0.1/configure +--- binutils-2.15.91.0.1-dist/configure 2004-05-27 13:26:01.000000000 -0500 ++++ binutils-2.15.91.0.1/configure 2004-07-16 14:57:21.000000000 -0500 +@@ -1365,6 +1365,18 @@ + i[3456789]86-*-coff | i[3456789]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.91.0.1-dist/configure.in binutils-2.15.91.0.1/configure.in +--- binutils-2.15.91.0.1-dist/configure.in 2004-05-27 13:26:01.000000000 -0500 ++++ binutils-2.15.91.0.1/configure.in 2004-07-16 14:57:21.000000000 -0500 +@@ -551,6 +551,18 @@ + i[[3456789]]86-*-coff | i[[3456789]]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.91.0.1-dist/gas/configure binutils-2.15.91.0.1/gas/configure +--- binutils-2.15.91.0.1-dist/gas/configure 2004-05-27 13:26:03.000000000 -0500 ++++ binutils-2.15.91.0.1/gas/configure 2004-07-16 14:57:21.000000000 -0500 +@@ -3408,6 +3408,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4233,6 +4238,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4249,6 +4255,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4262,6 +4269,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -4319,7 +4327,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4379,6 +4389,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4406,6 +4417,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4468,6 +4480,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4496,7 +4509,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4529,6 +4544,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.91.0.1-dist/gas/configure.in binutils-2.15.91.0.1/gas/configure.in +--- binutils-2.15.91.0.1-dist/gas/configure.in 2004-05-27 13:26:03.000000000 -0500 ++++ binutils-2.15.91.0.1/gas/configure.in 2004-07-16 14:57:21.000000000 -0500 +@@ -194,6 +194,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -210,6 +211,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -223,6 +225,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -280,7 +283,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -333,6 +338,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -360,6 +366,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -419,6 +426,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -440,7 +448,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -473,6 +483,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.91.0.1-dist/gprof/configure binutils-2.15.91.0.1/gprof/configure +--- binutils-2.15.91.0.1-dist/gprof/configure 2004-01-14 15:07:51.000000000 -0600 ++++ binutils-2.15.91.0.1/gprof/configure 2004-07-27 21:53:11.000000000 -0500 +@@ -1570,6 +1570,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.91.0.1-dist/ld/configure binutils-2.15.91.0.1/ld/configure +--- binutils-2.15.91.0.1-dist/ld/configure 2003-05-05 16:46:49.000000000 -0500 ++++ binutils-2.15.91.0.1/ld/configure 2004-07-16 14:57:21.000000000 -0500 +@@ -1578,6 +1578,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.91.0.1-dist/ld/configure.tgt binutils-2.15.91.0.1/ld/configure.tgt +--- binutils-2.15.91.0.1-dist/ld/configure.tgt 2004-05-27 13:26:04.000000000 -0500 ++++ binutils-2.15.91.0.1/ld/configure.tgt 2004-07-16 14:57:21.000000000 -0500 +@@ -31,6 +31,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -60,14 +61,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -119,7 +122,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -129,7 +134,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -153,14 +158,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -260,10 +267,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -365,7 +375,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -382,9 +393,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -397,6 +408,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -430,16 +442,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -462,6 +474,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.15.91.0.1-dist/libtool.m4 binutils-2.15.91.0.1/libtool.m4 +--- binutils-2.15.91.0.1-dist/libtool.m4 2003-05-05 16:46:46.000000000 -0500 ++++ binutils-2.15.91.0.1/libtool.m4 2004-07-16 14:57:21.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.15.91.0.1-dist/ltconfig binutils-2.15.91.0.1/ltconfig +--- binutils-2.15.91.0.1-dist/ltconfig 2004-01-14 15:07:42.000000000 -0600 ++++ binutils-2.15.91.0.1/ltconfig 2004-07-16 14:57:21.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN binutils-2.15.91.0.1-dist/opcodes/configure binutils-2.15.91.0.1/opcodes/configure +--- binutils-2.15.91.0.1-dist/opcodes/configure 2004-04-12 14:56:38.000000000 -0500 ++++ binutils-2.15.91.0.1/opcodes/configure 2004-07-27 21:55:25.000000000 -0500 +@@ -1690,6 +1690,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15.91.0.1/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.15.91.0.1/600-arm-textrel.patch new file mode 100644 index 0000000000..73d5b9df8e --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.91.0.1/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/2.15.91.0.2/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15.91.0.2/100-uclibc-conf.patch new file mode 100644 index 0000000000..911bef4ff1 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.91.0.2/100-uclibc-conf.patch @@ -0,0 +1,722 @@ +diff -urN binutils-2.15.91.0.2-dist/bfd/config.bfd binutils-2.15.91.0.2/bfd/config.bfd +--- binutils-2.15.91.0.2-dist/bfd/config.bfd 2004-07-27 23:36:07.000000000 -0500 ++++ binutils-2.15.91.0.2/bfd/config.bfd 2004-09-28 14:33:13.000000000 -0500 +@@ -129,7 +129,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -139,7 +139,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -216,7 +216,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -224,7 +224,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -373,7 +373,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -384,7 +384,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc* | hppa*-*-netbsd*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -507,7 +507,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -521,7 +521,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -696,7 +696,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -972,7 +972,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -1009,8 +1010,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1177,7 +1178,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1224,7 +1225,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1293,7 +1294,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN binutils-2.15.91.0.2-dist/bfd/configure binutils-2.15.91.0.2/bfd/configure +--- binutils-2.15.91.0.2-dist/bfd/configure 2004-07-27 23:36:07.000000000 -0500 ++++ binutils-2.15.91.0.2/bfd/configure 2004-09-28 14:33:13.000000000 -0500 +@@ -1687,6 +1687,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5266,7 +5271,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5330,7 +5335,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5368,7 +5373,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5472,7 +5477,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.91.0.2-dist/bfd/configure.in binutils-2.15.91.0.2/bfd/configure.in +--- binutils-2.15.91.0.2-dist/bfd/configure.in 2004-07-27 23:36:07.000000000 -0500 ++++ binutils-2.15.91.0.2/bfd/configure.in 2004-09-28 14:33:13.000000000 -0500 +@@ -164,7 +164,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -249,7 +249,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -290,7 +290,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -378,7 +378,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.91.0.2-dist/binutils/configure binutils-2.15.91.0.2/binutils/configure +--- binutils-2.15.91.0.2-dist/binutils/configure 2004-04-12 14:56:34.000000000 -0500 ++++ binutils-2.15.91.0.2/binutils/configure 2004-09-28 14:33:13.000000000 -0500 +@@ -1575,6 +1575,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.91.0.2-dist/configure binutils-2.15.91.0.2/configure +--- binutils-2.15.91.0.2-dist/configure 2004-07-27 23:36:06.000000000 -0500 ++++ binutils-2.15.91.0.2/configure 2004-09-28 14:33:13.000000000 -0500 +@@ -1349,6 +1349,18 @@ + i[3456789]86-*-coff | i[3456789]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.91.0.2-dist/configure.in binutils-2.15.91.0.2/configure.in +--- binutils-2.15.91.0.2-dist/configure.in 2004-07-27 23:36:06.000000000 -0500 ++++ binutils-2.15.91.0.2/configure.in 2004-09-28 14:33:13.000000000 -0500 +@@ -569,6 +569,18 @@ + i[[3456789]]86-*-coff | i[[3456789]]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.91.0.2-dist/gas/configure binutils-2.15.91.0.2/gas/configure +--- binutils-2.15.91.0.2-dist/gas/configure 2004-07-27 23:36:09.000000000 -0500 ++++ binutils-2.15.91.0.2/gas/configure 2004-09-28 14:33:13.000000000 -0500 +@@ -3408,6 +3408,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4234,6 +4239,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4250,6 +4256,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4263,6 +4270,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + crx-*-elf*) fmt=elf ;; +@@ -4322,7 +4330,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4382,6 +4392,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4409,6 +4420,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4471,6 +4483,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4498,7 +4511,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4538,6 +4553,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.91.0.2-dist/gas/configure.in binutils-2.15.91.0.2/gas/configure.in +--- binutils-2.15.91.0.2-dist/gas/configure.in 2004-07-27 23:36:09.000000000 -0500 ++++ binutils-2.15.91.0.2/gas/configure.in 2004-09-28 14:33:13.000000000 -0500 +@@ -195,6 +195,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -211,6 +212,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -224,6 +226,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + crx-*-elf*) fmt=elf ;; +@@ -283,7 +286,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -336,6 +341,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -363,6 +369,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -422,6 +429,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -442,7 +450,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -478,6 +488,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.91.0.2-dist/gprof/configure binutils-2.15.91.0.2/gprof/configure +--- binutils-2.15.91.0.2-dist/gprof/configure 2004-07-27 23:36:10.000000000 -0500 ++++ binutils-2.15.91.0.2/gprof/configure 2004-09-28 14:33:13.000000000 -0500 +@@ -3401,6 +3401,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.91.0.2-dist/ld/configure binutils-2.15.91.0.2/ld/configure +--- binutils-2.15.91.0.2-dist/ld/configure 2004-07-27 23:36:11.000000000 -0500 ++++ binutils-2.15.91.0.2/ld/configure 2004-09-28 14:33:13.000000000 -0500 +@@ -1578,6 +1578,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.91.0.2-dist/ld/configure.tgt binutils-2.15.91.0.2/ld/configure.tgt +--- binutils-2.15.91.0.2-dist/ld/configure.tgt 2004-07-27 23:36:11.000000000 -0500 ++++ binutils-2.15.91.0.2/ld/configure.tgt 2004-09-28 14:33:13.000000000 -0500 +@@ -31,6 +31,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -61,14 +62,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -120,7 +123,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -130,7 +135,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -154,14 +159,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -261,10 +268,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -369,7 +379,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -386,9 +397,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -401,6 +412,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -434,16 +446,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -466,6 +478,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.15.91.0.2-dist/ld/emultempl/elf32.em binutils-2.15.91.0.2/ld/emultempl/elf32.em +--- binutils-2.15.91.0.2-dist/ld/emultempl/elf32.em 2004-07-27 23:36:11.000000000 -0500 ++++ binutils-2.15.91.0.2/ld/emultempl/elf32.em 2004-09-28 14:33:54.000000000 -0500 +@@ -327,7 +327,7 @@ + + EOF + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c <<EOF + { + struct bfd_link_needed_list *l; +@@ -500,7 +500,7 @@ + + EOF + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c <<EOF + /* For a native linker, check the file /etc/ld.so.conf for directories + in which we may find shared libraries. /etc/ld.so.conf is really +@@ -784,7 +784,7 @@ + EOF + if [ "x${USE_LIBPATH}" = xyes ] ; then + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c <<EOF + if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force)) + break; +diff -urN binutils-2.15.91.0.2-dist/libtool.m4 binutils-2.15.91.0.2/libtool.m4 +--- binutils-2.15.91.0.2-dist/libtool.m4 2004-07-27 23:36:06.000000000 -0500 ++++ binutils-2.15.91.0.2/libtool.m4 2004-09-28 14:33:13.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.15.91.0.2-dist/ltconfig binutils-2.15.91.0.2/ltconfig +--- binutils-2.15.91.0.2-dist/ltconfig 2004-07-27 23:36:06.000000000 -0500 ++++ binutils-2.15.91.0.2/ltconfig 2004-09-28 14:33:13.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1270,6 +1271,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN binutils-2.15.91.0.2-dist/opcodes/configure binutils-2.15.91.0.2/opcodes/configure +--- binutils-2.15.91.0.2-dist/opcodes/configure 2004-07-27 23:36:11.000000000 -0500 ++++ binutils-2.15.91.0.2/opcodes/configure 2004-09-28 14:33:13.000000000 -0500 +@@ -1690,6 +1690,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15.91.0.2/500-branch-likely.patch b/openwrt/toolchain/binutils/2.15.91.0.2/500-branch-likely.patch new file mode 100644 index 0000000000..0bb1a4b4f6 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.91.0.2/500-branch-likely.patch @@ -0,0 +1,10 @@ +--- binutils-2.15.90.0.3/gas/config/tc-mips.c-dist 2004-08-19 12:56:20.000000000 -0500 ++++ binutils-2.15.90.0.3/gas/config/tc-mips.c 2004-08-19 12:57:30.000000000 -0500 +@@ -2708,6 +2708,7 @@ + prev_insn_reloc_type[1] = BFD_RELOC_UNUSED; + prev_insn_reloc_type[2] = BFD_RELOC_UNUSED; + prev_insn_extended = 0; ++ prev_insn_is_delay_slot = 1; + } + else + { diff --git a/openwrt/toolchain/binutils/2.15.91.0.2/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.15.91.0.2/600-arm-textrel.patch new file mode 100644 index 0000000000..73d5b9df8e --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.91.0.2/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/2.15.91.0.2/700-binutils-20040817-linkonce.patch b/openwrt/toolchain/binutils/2.15.91.0.2/700-binutils-20040817-linkonce.patch new file mode 100644 index 0000000000..97fa6eed60 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.91.0.2/700-binutils-20040817-linkonce.patch @@ -0,0 +1,118 @@ +From http://sources.redhat.com/ml/binutils/2004-08/msg00190.html + +Date: Tue, 17 Aug 2004 12:04:29 +0200 +From: Jakub Jelinek <jakub at redhat dot com> +To: binutils at sources dot redhat dot com +Subject: [PATCH] Fix `defined in discarded section' errors when building ia64 gcc +Message-ID: <20040817100429.GL30497@sunsite.ms.mff.cuni.cz> +Reply-To: Jakub Jelinek <jakub at redhat dot com> +References: <20040817090201.GK30497@sunsite.ms.mff.cuni.cz> +In-Reply-To: <20040817090201 dot GK30497 at sunsite dot ms dot mff dot cuni dot cz> + +On Tue, Aug 17, 2004 at 11:02:01AM +0200, Jakub Jelinek wrote: +> Current gcc 3.4.x (at least gcc-3_4-rhl-branch) doesn't build with CVS +> binutils (nor 2.15.91.0.2). +> The problem is that libstdc++.so linking fails with: +> `.gnu.linkonce.t._ZNSdD2Ev' referenced in section `.gnu.linkonce.ia64unw._ZNSdD2Ev' of .libs/sstream-inst.o: defined in discarded section `.gnu.linkonce.t._ZNSdD2Ev' of .libs/sstream-inst.o +> The problem is that both io-inst.s and sstream-inst.s have +> .gnu.linkonce.t._ZNSdD2Ev definition, but because io-inst.cc +> also instantiates some templates sstream-inst.cc doesn't instantiate, +> the inliner can do a better job in io-inst.cc. +> The result is that _ZNSdD2Ev in io-inst.cc is a leaf routine, while +> it is not in sstream-inst.cc (in assembly, +> _ZNSdD2Ev in io-inst.s starts with .prologue and no .save directives, +> while _ZNSdD2Ev] in sstream-inst.s has .prologue 12, 35 and some +> .save directives. +> IA-64 ABI allows leaf routines to have no unwind section at all, +> which means .gnu.linkonce.ia64unw._ZNSdD2Ev is not created in +> io-inst.o at all and as .gnu.linkonce.t._ZNSdD2Ev comes first +> and wins, .gnu.linkonce.ia64unw._ZNSdD2Ev in sstream.o suddenly +> references a discarded section. +> +> Not sure what should be done here, but certainly the compiler +> isn't at fault here, it is a binutils problem. +> One fix could be to create empty .gnu.linkonce.ia64unw.* section +> in assembler, another special case ia64 unwind sections in the linker. + +Here is a patch for the first possibility. +It certainly makes libstdc++.so to link and even the unwind info looks +good on brief skimming. + +2004-08-17 Jakub Jelinek <jakub@redhat.com> + + * config/tc-ia64.c (start_unwind_section): Add linkonce_empty + argument, don't do anything if current section is not + .gnu.linkonce.t.* and linkonce_empty is set. + (generate_unwind_image, dot_endp): Adjust callers, call + start_unwind_section (*, 1) if nothing will be put into the + section. + +--- binutils/gas/config/tc-ia64.c.jj 2004-07-30 11:42:24.000000000 +0200 ++++ binutils/gas/config/tc-ia64.c 2004-08-17 13:45:04.288173205 +0200 +@@ -1,5 +1,6 @@ + /* tc-ia64.c -- Assembler for the HP/Intel IA-64 architecture. +- Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 ++ Free Software Foundation, Inc. + Contributed by David Mosberger-Tang <davidm@hpl.hp.com> + + This file is part of GAS, the GNU Assembler. +@@ -3297,7 +3298,7 @@ static char *special_linkonce_name[] = + }; + + static void +-start_unwind_section (const segT text_seg, int sec_index) ++start_unwind_section (const segT text_seg, int sec_index, int linkonce_empty) + { + /* + Use a slightly ugly scheme to derive the unwind section names from +@@ -3359,6 +3360,8 @@ start_unwind_section (const segT text_se + prefix = special_linkonce_name [sec_index - SPECIAL_SECTION_UNWIND]; + suffix += sizeof (".gnu.linkonce.t.") - 1; + } ++ else if (linkonce_empty) ++ return; + + prefix_len = strlen (prefix); + suffix_len = strlen (suffix); +@@ -3444,7 +3447,7 @@ generate_unwind_image (const segT text_s + expressionS exp; + bfd_reloc_code_real_type reloc; + +- start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO); ++ start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 0); + + /* Make sure the section has 4 byte alignment for ILP32 and + 8 byte alignment for LP64. */ +@@ -3485,6 +3488,8 @@ generate_unwind_image (const segT text_s + unwind.personality_routine = 0; + } + } ++ else ++ start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 1); + + free_saved_prologue_counts (); + unwind.list = unwind.tail = unwind.current_entry = NULL; +@@ -4164,7 +4169,7 @@ dot_endp (dummy) + subseg_set (md.last_text_seg, 0); + unwind.proc_end = expr_build_dot (); + +- start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND); ++ start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 0); + + /* Make sure that section has 4 byte alignment for ILP32 and + 8 byte alignment for LP64. */ +@@ -4204,6 +4209,9 @@ dot_endp (dummy) + bytes_per_address); + + } ++ else ++ start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 1); ++ + subseg_set (saved_seg, saved_subseg); + + /* Parse names of main and alternate entry points and set symbol sizes. */ + + + Jakub + diff --git a/openwrt/toolchain/binutils/2.15.91.0.2/701-binutils-dup-sections.patch b/openwrt/toolchain/binutils/2.15.91.0.2/701-binutils-dup-sections.patch new file mode 100644 index 0000000000..4e4934d8cf --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.91.0.2/701-binutils-dup-sections.patch @@ -0,0 +1,68 @@ +See http://sources.redhat.com/ml/binutils/2004-08/msg00256.html + +Date: Fri, 20 Aug 2004 21:13:43 -0400 +From: Daniel Jacobowitz <drow at false dot org> +To: binutils at sources dot redhat dot com +Subject: Re: Handle SEC_LINK_DUPLICATES_SAME_CONTENTS for arm-linux +Message-ID: <20040821011342.GA30319@nevyn.them.org> +Mail-Followup-To: binutils at sources dot redhat dot com +References: <20040818145518.GA9774@nevyn.them.org> <20040819055040.GA11820@lucon.org> <20040819080034.GE21716@bubble.modra.org> <20040820173240.GA17678@nevyn.them.org> <20040821003737.GB16016@bubble.modra.org> +In-Reply-To: <20040821003737 dot GB16016 at bubble dot modra dot org> + +On Sat, Aug 21, 2004 at 10:07:38AM +0930, Alan Modra wrote: +> On Fri, Aug 20, 2004 at 01:32:40PM -0400, Daniel Jacobowitz wrote: +> > Thanks. How's this? +> +> As you might have guessed from my rather slack review of your previous +> patch, I trust you enough to give the OK without proper review. But +> since you asked... :) + +Checked in as so. + +-- +Daniel Jacobowitz + +[ rediffed against binutils-2.15.91.0.2, with some elbow grease ] + +2004-08-20 Daniel Jacobowitz <dan@debian.org> + + * elflink.c (_bfd_elf_section_already_linked): Handle + SEC_LINK_DUPLICATES_SAME_CONTENTS. +--- binutils-2.15.91.0.2/bfd/elflink.c.old 2004-07-27 21:36:08.000000000 -0700 ++++ binutils-2.15.91.0.2/bfd/elflink.c 2004-08-26 06:38:07.000000000 -0700 +@@ -9359,6 +9359,35 @@ + (_("%s: %s: warning: duplicate section `%s' has different size\n"), + bfd_archive_filename (abfd), name); + break; ++ case SEC_LINK_DUPLICATES_SAME_CONTENTS: ++ if (sec->size != l->sec->size) ++ (*_bfd_error_handler) ++ (_("%B: duplicate section `%A' has different size\n"), ++ bfd_archive_filename (abfd), sec); ++ else if (sec->size != 0) ++ { ++ bfd_byte *sec_contents, *l_sec_contents; ++ ++ if (!bfd_malloc_and_get_section (abfd, sec, &sec_contents)) ++ (*_bfd_error_handler) ++ (_("%B: warning: could not read contents of section `%A'\n"), ++ bfd_archive_filename (abfd), sec); ++ else if (!bfd_malloc_and_get_section (l->sec->owner, l->sec, ++ &l_sec_contents)) ++ (*_bfd_error_handler) ++ (_("%B: warning: could not read contents of section `%A'\n"), ++ bfd_archive_filename(l->sec->owner), l->sec); ++ else if (memcmp (sec_contents, l_sec_contents, sec->size) != 0) ++ (*_bfd_error_handler) ++ (_("%B: warning: duplicate section `%A' has different contents\n"), ++ bfd_archive_filename (abfd), sec); ++ ++ if (sec_contents) ++ free (sec_contents); ++ if (l_sec_contents) ++ free (l_sec_contents); ++ } ++ break; + } + + /* Set the output_section field so that lang_add_section diff --git a/openwrt/toolchain/binutils/2.15.91.0.2/702-binutils-skip-comments.patch b/openwrt/toolchain/binutils/2.15.91.0.2/702-binutils-skip-comments.patch new file mode 100644 index 0000000000..804a17e006 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.91.0.2/702-binutils-skip-comments.patch @@ -0,0 +1,101 @@ +Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html +Fixes +localealias.s:544: Error: junk at end of line, first unrecognized character is `,' +when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3 + +Paths adjusted to match crosstool's patcher. + +Message-Id: m3n052qw2g.fsf@whitebox.m5r.de +From: Andreas Schwab <schwab at suse dot de> +To: Nathan Sidwell <nathan at codesourcery dot com> +Cc: Ian Lance Taylor <ian at wasabisystems dot com>, binutils at sources dot redhat dot com +Date: Fri, 23 Apr 2004 22:27:19 +0200 +Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line + +Nathan Sidwell <nathan@codesourcery.com> writes: + +> Index: read.c +> =================================================================== +> RCS file: /cvs/src/src/gas/read.c,v +> retrieving revision 1.76 +> diff -c -3 -p -r1.76 read.c +> *** read.c 12 Mar 2004 17:48:12 -0000 1.76 +> --- read.c 18 Mar 2004 09:56:05 -0000 +> *************** read_a_source_file (char *name) +> *** 1053,1059 **** +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! ignore_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook +> --- 1053,1059 ---- +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! demand_empty_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook + +This means that the unknown character is no longer ignored, despite the +comment. As a side effect a line starting with a line comment character +not followed by APP in NO_APP mode now triggers an error instead of just a +warning, breaking builds of glibc on m68k-linux. Earlier in +read_a_source_file where #APP is handled there is another comment that +claims that unknown comments are ignored, when in fact they aren't (only +the initial line comment character is skipped). + +Note that the presence of #APP will mess up the line counters, but +that appears to be difficult to fix. + +Andreas. + +2004-04-23 Andreas Schwab <schwab@suse.de> + + * read.c (read_a_source_file): Ignore unknown text after line + comment character. Fix misleading comment. + +--- binutils/gas/read.c.~1.78.~ 2004-04-23 08:58:23.000000000 +0200 ++++ binutils/gas/read.c 2004-04-23 21:49:01.000000000 +0200 +@@ -1,6 +1,6 @@ + /* read.c - read a source file - + Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +- 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + +@@ -950,10 +950,14 @@ read_a_source_file (char *name) + unsigned int new_length; + char *tmp_buf = 0; + +- bump_line_counters (); + s = input_line_pointer; + if (strncmp (s, "APP\n", 4)) +- continue; /* We ignore it */ ++ { ++ /* We ignore it */ ++ ignore_rest_of_line (); ++ continue; ++ } ++ bump_line_counters (); + s += 4; + + sb_new (&sbuf); +@@ -1052,7 +1056,7 @@ read_a_source_file (char *name) + continue; + #endif + input_line_pointer--; +- /* Report unknown char as ignored. */ ++ /* Report unknown char as error. */ + demand_empty_rest_of_line (); + } + + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, MaxfeldstraÃe 5, 90409 NÃrnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." diff --git a/openwrt/toolchain/binutils/2.15.92.0.2/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15.92.0.2/100-uclibc-conf.patch new file mode 100644 index 0000000000..7fcbd6227a --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.92.0.2/100-uclibc-conf.patch @@ -0,0 +1,724 @@ +diff -urN binutils-2.15.92.0.2-dist/bfd/config.bfd binutils-2.15.92.0.2/bfd/config.bfd +--- binutils-2.15.92.0.2-dist/bfd/config.bfd 2004-09-15 14:05:02.000000000 -0500 ++++ binutils-2.15.92.0.2/bfd/config.bfd 2004-09-28 14:11:57.000000000 -0500 +@@ -129,7 +129,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -139,7 +139,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -216,7 +216,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -224,8 +224,8 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ +- arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | \ ++ arm*-*-conix* | arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks | \ + arm*-*-eabi* ) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -378,7 +378,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -389,7 +389,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -516,7 +516,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -530,7 +530,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -705,7 +705,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -981,7 +981,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -1018,8 +1019,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1186,7 +1187,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1233,7 +1234,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1302,7 +1303,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN binutils-2.15.92.0.2-dist/bfd/configure binutils-2.15.92.0.2/bfd/configure +--- binutils-2.15.92.0.2-dist/bfd/configure 2004-09-27 15:46:06.000000000 -0500 ++++ binutils-2.15.92.0.2/bfd/configure 2004-09-28 14:09:03.000000000 -0500 +@@ -3583,6 +3583,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -9914,7 +9919,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -9978,7 +9983,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -10016,7 +10021,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -10150,7 +10155,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.92.0.2-dist/bfd/configure.in binutils-2.15.92.0.2/bfd/configure.in +--- binutils-2.15.92.0.2-dist/bfd/configure.in 2004-09-27 15:46:06.000000000 -0500 ++++ binutils-2.15.92.0.2/bfd/configure.in 2004-09-28 14:09:03.000000000 -0500 +@@ -163,7 +163,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -248,7 +248,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -289,7 +289,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -375,7 +375,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15.92.0.2-dist/binutils/configure binutils-2.15.92.0.2/binutils/configure +--- binutils-2.15.92.0.2-dist/binutils/configure 2004-09-15 14:05:03.000000000 -0500 ++++ binutils-2.15.92.0.2/binutils/configure 2004-09-28 14:09:03.000000000 -0500 +@@ -1575,6 +1575,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.92.0.2-dist/configure binutils-2.15.92.0.2/configure +--- binutils-2.15.92.0.2-dist/configure 2004-09-27 15:46:06.000000000 -0500 ++++ binutils-2.15.92.0.2/configure 2004-09-28 14:09:03.000000000 -0500 +@@ -1334,6 +1334,18 @@ + i[3456789]86-*-coff | i[3456789]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.92.0.2-dist/configure.in binutils-2.15.92.0.2/configure.in +--- binutils-2.15.92.0.2-dist/configure.in 2004-09-27 15:46:06.000000000 -0500 ++++ binutils-2.15.92.0.2/configure.in 2004-09-28 14:09:03.000000000 -0500 +@@ -556,6 +556,18 @@ + i[[3456789]]86-*-coff | i[[3456789]]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15.92.0.2-dist/gas/configure binutils-2.15.92.0.2/gas/configure +--- binutils-2.15.92.0.2-dist/gas/configure 2004-09-27 15:46:07.000000000 -0500 ++++ binutils-2.15.92.0.2/gas/configure 2004-09-28 14:09:03.000000000 -0500 +@@ -3420,6 +3420,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4248,6 +4253,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4263,6 +4269,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4276,6 +4283,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + crx-*-elf*) fmt=elf ;; +@@ -4335,7 +4343,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4395,6 +4405,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4422,6 +4433,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4494,6 +4506,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4521,7 +4534,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4556,6 +4571,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.92.0.2-dist/gas/configure.in binutils-2.15.92.0.2/gas/configure.in +--- binutils-2.15.92.0.2-dist/gas/configure.in 2004-09-15 14:05:03.000000000 -0500 ++++ binutils-2.15.92.0.2/gas/configure.in 2004-09-28 14:09:03.000000000 -0500 +@@ -197,6 +197,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -212,6 +213,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -225,6 +227,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + crx-*-elf*) fmt=elf ;; +@@ -284,7 +287,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -337,6 +342,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -364,6 +370,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -433,6 +440,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -453,7 +461,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -484,6 +494,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15.92.0.2-dist/gprof/configure binutils-2.15.92.0.2/gprof/configure +--- binutils-2.15.92.0.2-dist/gprof/configure 2004-09-27 15:46:07.000000000 -0500 ++++ binutils-2.15.92.0.2/gprof/configure 2004-09-28 14:09:03.000000000 -0500 +@@ -3418,6 +3418,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.92.0.2-dist/ld/configure binutils-2.15.92.0.2/ld/configure +--- binutils-2.15.92.0.2-dist/ld/configure 2004-09-27 15:46:07.000000000 -0500 ++++ binutils-2.15.92.0.2/ld/configure 2004-09-28 14:09:03.000000000 -0500 +@@ -1579,6 +1579,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15.92.0.2-dist/ld/configure.tgt binutils-2.15.92.0.2/ld/configure.tgt +--- binutils-2.15.92.0.2-dist/ld/configure.tgt 2004-09-15 14:05:04.000000000 -0500 ++++ binutils-2.15.92.0.2/ld/configure.tgt 2004-09-28 14:09:03.000000000 -0500 +@@ -31,6 +31,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -61,14 +62,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -120,7 +123,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -130,7 +135,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -154,14 +159,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -262,10 +269,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -370,7 +380,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -387,9 +398,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -402,6 +413,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -435,16 +447,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -467,6 +479,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.15.92.0.2-dist/ld/emultempl/elf32.em binutils-2.15.92.0.2/ld/emultempl/elf32.em +--- binutils-2.15.92.0.2-dist/ld/emultempl/elf32.em 2004-07-27 23:36:11.000000000 -0500 ++++ binutils-2.15.92.0.2/ld/emultempl/elf32.em 2004-09-28 14:13:04.000000000 -0500 +@@ -327,7 +327,7 @@ + + EOF + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c <<EOF + { + struct bfd_link_needed_list *l; +@@ -500,7 +500,7 @@ + + EOF + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c <<EOF + /* For a native linker, check the file /etc/ld.so.conf for directories + in which we may find shared libraries. /etc/ld.so.conf is really +@@ -784,7 +784,7 @@ + EOF + if [ "x${USE_LIBPATH}" = xyes ] ; then + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c <<EOF + if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force)) + break; +diff -urN binutils-2.15.92.0.2-dist/libtool.m4 binutils-2.15.92.0.2/libtool.m4 +--- binutils-2.15.92.0.2-dist/libtool.m4 2004-07-27 23:36:06.000000000 -0500 ++++ binutils-2.15.92.0.2/libtool.m4 2004-09-28 14:09:03.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.15.92.0.2-dist/ltconfig binutils-2.15.92.0.2/ltconfig +--- binutils-2.15.92.0.2-dist/ltconfig 2004-07-27 23:36:06.000000000 -0500 ++++ binutils-2.15.92.0.2/ltconfig 2004-09-28 14:09:03.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1270,6 +1271,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN binutils-2.15.92.0.2-dist/opcodes/configure binutils-2.15.92.0.2/opcodes/configure +--- binutils-2.15.92.0.2-dist/opcodes/configure 2004-09-27 15:46:08.000000000 -0500 ++++ binutils-2.15.92.0.2/opcodes/configure 2004-09-28 14:09:03.000000000 -0500 +@@ -3587,6 +3587,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15.92.0.2/300-001_ld_makefile_patch.patch b/openwrt/toolchain/binutils/2.15.92.0.2/300-001_ld_makefile_patch.patch new file mode 100644 index 0000000000..b25d5b7e21 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.92.0.2/300-001_ld_makefile_patch.patch @@ -0,0 +1,52 @@ +#!/bin/sh -e +## 001_ld_makefile_patch.dpatch +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: correct where ld scripts are installed +## DP: Author: Chris Chimelis <chris@debian.org> +## DP: Upstream status: N/A +## DP: Date: ?? + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.am binutils-2.14.90.0.6/ld/Makefile.am +--- /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.am 2003-08-21 16:28:48.000000000 +0100 ++++ binutils-2.14.90.0.6/ld/Makefile.am 2003-09-10 23:12:09.000000000 +0100 +@@ -19,7 +19,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.in binutils-2.14.90.0.6/ld/Makefile.in +--- /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.in 2003-08-21 16:28:48.000000000 +0100 ++++ binutils-2.14.90.0.6/ld/Makefile.in 2003-09-10 23:12:09.000000000 +0100 +@@ -128,7 +128,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ diff --git a/openwrt/toolchain/binutils/2.15.92.0.2/300-006_better_file_error.patch b/openwrt/toolchain/binutils/2.15.92.0.2/300-006_better_file_error.patch new file mode 100644 index 0000000000..f337611edf --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.92.0.2/300-006_better_file_error.patch @@ -0,0 +1,43 @@ +#!/bin/sh -e +## 006_better_file_error.dpatch by David Kimdon <dwhedon@gordian.com> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Specify which filename is causing an error if the filename is a +## DP: directory. (#45832) + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.14.90.0.6/bfd/opncls.c binutils-2.14.90.0.6/bfd/opncls.c +--- /home/james/debian/packages/binutils/binutils-2.14.90.0.6/bfd/opncls.c 2003-07-23 16:08:09.000000000 +0100 ++++ binutils-2.14.90.0.6/bfd/opncls.c 2003-09-10 22:35:00.000000000 +0100 +@@ -150,6 +150,13 @@ + { + bfd *nbfd; + const bfd_target *target_vec; ++ struct stat s; ++ ++ if (stat (filename, &s) == 0) ++ if (S_ISDIR(s.st_mode)) { ++ bfd_set_error (bfd_error_file_not_recognized); ++ return NULL; ++ } + + nbfd = _bfd_new_bfd (); + if (nbfd == NULL) diff --git a/openwrt/toolchain/binutils/2.15.92.0.2/300-012_check_ldrunpath_length.patch b/openwrt/toolchain/binutils/2.15.92.0.2/300-012_check_ldrunpath_length.patch new file mode 100644 index 0000000000..498651a90c --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.92.0.2/300-012_check_ldrunpath_length.patch @@ -0,0 +1,47 @@ +#!/bin/sh -e +## 012_check_ldrunpath_length.dpatch by Chris Chimelis <chris@debian.org> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Only generate an RPATH entry if LD_RUN_PATH is not empty, for +## DP: cases where -rpath isn't specified. (#151024) + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em binutils-2.15/ld/emultempl/elf32.em +--- /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:58.000000000 +0100 ++++ binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:59.000000000 +0100 +@@ -692,6 +692,8 @@ + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, &n, + force)) + break; +@@ -871,6 +873,8 @@ + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf_size_dynamic_sections + (output_bfd, command_line.soname, rpath, + command_line.filter_shlib, diff --git a/openwrt/toolchain/binutils/2.15.92.0.2/300-117_mips_symbolic_link.patch b/openwrt/toolchain/binutils/2.15.92.0.2/300-117_mips_symbolic_link.patch new file mode 100644 index 0000000000..f5a3199168 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.92.0.2/300-117_mips_symbolic_link.patch @@ -0,0 +1,42 @@ +#! /bin/sh -e +## 117_mips_symbolic_link.dpatch +## +## DP: Description: Handle symbolic multigot links. (#270619) +## DP: Author: Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de> +## DP: Upstream status: Not submitted +## DP: Date: 2004-09-08 + +if [ $# -lt 1 ]; then + echo "`basename $0`: script expects -patch|-unpatch as argument" >&2 + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch} ${2:+-d $2}" + +case "$1" in + -patch) patch -p1 ${patch_opts} < $0;; + -unpatch) patch -R -p1 ${patch_opts} < $0;; + *) + echo "`basename $0`: script expects -patch|-unpatch as argument" >&2 + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urpN binutils-2.15.orig/bfd/elfxx-mips.c binutils-2.15/bfd/elfxx-mips.c +--- binutils-2.15.orig/bfd/elfxx-mips.c 2004-05-17 21:36:03.000000000 +0200 ++++ binutils-2.15/bfd/elfxx-mips.c 2004-08-29 08:48:22.000000000 +0200 +@@ -3909,10 +3910,7 @@ mips_elf_create_dynamic_relocation (bfd + /* We must now calculate the dynamic symbol table index to use + in the relocation. */ + if (h != NULL +- && (! info->symbolic || !h->root.def_regular) +- /* h->root.dynindx may be -1 if this symbol was marked to +- become local. */ +- && h->root.dynindx != -1) ++ && (!h->root.def_regular || !h->root.forced_local)) + { + indx = h->root.dynindx; + if (SGI_COMPAT (output_bfd)) diff --git a/openwrt/toolchain/binutils/2.15.92.0.2/300-120_mips_xgot_multigot_workaround.patch b/openwrt/toolchain/binutils/2.15.92.0.2/300-120_mips_xgot_multigot_workaround.patch new file mode 100644 index 0000000000..ae2033d069 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.92.0.2/300-120_mips_xgot_multigot_workaround.patch @@ -0,0 +1,39 @@ +#! /bin/sh -e +## 120_mips_xgot_multigot_workaround.dpatch +## +## DP: Description: Make multigot/xgot handling mutually exclusive. +## DP: Author: Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de> +## DP: Upstream status: Not submitted +## DP: Date: 2004-09-17 + +if [ $# -lt 1 ]; then + echo "`basename $0`: script expects -patch|-unpatch as argument" >&2 + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch} ${2:+-d $2}" + +case "$1" in + -patch) patch -p1 ${patch_opts} < $0;; + -unpatch) patch -R -p1 ${patch_opts} < $0;; + *) + echo "`basename $0`: script expects -patch|-unpatch as argument" >&2 + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.15/bfd/elfxx-mips.c binutils-2.15/bfd/elfxx-mips.c +--- /home/james/debian/packages/binutils/binutils-2.15/bfd/elfxx-mips.c 2004-09-23 22:41:37.156466673 +0100 ++++ binutils-2.15/bfd/elfxx-mips.c 2004-09-23 22:42:15.998362861 +0100 +@@ -5883,6 +5883,8 @@ + s->size += i * MIPS_ELF_GOT_SIZE (output_bfd); + + if (s->size > MIPS_ELF_GOT_MAX_SIZE (output_bfd) ++ && g->global_gotno <= (MIPS_ELF_GOT_MAX_SIZE (output_bfd) ++ / MIPS_ELF_GOT_SIZE (output_bfd)) + && ! mips_elf_multi_got (output_bfd, info, g, s, local_gotno)) + return FALSE; + diff --git a/openwrt/toolchain/binutils/2.15.92.0.2/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.15.92.0.2/600-arm-textrel.patch new file mode 100644 index 0000000000..d234181608 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.92.0.2/600-arm-textrel.patch @@ -0,0 +1,54 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/2.15.92.0.2/702-binutils-skip-comments.patch b/openwrt/toolchain/binutils/2.15.92.0.2/702-binutils-skip-comments.patch new file mode 100644 index 0000000000..804a17e006 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.92.0.2/702-binutils-skip-comments.patch @@ -0,0 +1,101 @@ +Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html +Fixes +localealias.s:544: Error: junk at end of line, first unrecognized character is `,' +when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3 + +Paths adjusted to match crosstool's patcher. + +Message-Id: m3n052qw2g.fsf@whitebox.m5r.de +From: Andreas Schwab <schwab at suse dot de> +To: Nathan Sidwell <nathan at codesourcery dot com> +Cc: Ian Lance Taylor <ian at wasabisystems dot com>, binutils at sources dot redhat dot com +Date: Fri, 23 Apr 2004 22:27:19 +0200 +Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line + +Nathan Sidwell <nathan@codesourcery.com> writes: + +> Index: read.c +> =================================================================== +> RCS file: /cvs/src/src/gas/read.c,v +> retrieving revision 1.76 +> diff -c -3 -p -r1.76 read.c +> *** read.c 12 Mar 2004 17:48:12 -0000 1.76 +> --- read.c 18 Mar 2004 09:56:05 -0000 +> *************** read_a_source_file (char *name) +> *** 1053,1059 **** +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! ignore_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook +> --- 1053,1059 ---- +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! demand_empty_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook + +This means that the unknown character is no longer ignored, despite the +comment. As a side effect a line starting with a line comment character +not followed by APP in NO_APP mode now triggers an error instead of just a +warning, breaking builds of glibc on m68k-linux. Earlier in +read_a_source_file where #APP is handled there is another comment that +claims that unknown comments are ignored, when in fact they aren't (only +the initial line comment character is skipped). + +Note that the presence of #APP will mess up the line counters, but +that appears to be difficult to fix. + +Andreas. + +2004-04-23 Andreas Schwab <schwab@suse.de> + + * read.c (read_a_source_file): Ignore unknown text after line + comment character. Fix misleading comment. + +--- binutils/gas/read.c.~1.78.~ 2004-04-23 08:58:23.000000000 +0200 ++++ binutils/gas/read.c 2004-04-23 21:49:01.000000000 +0200 +@@ -1,6 +1,6 @@ + /* read.c - read a source file - + Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +- 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + +@@ -950,10 +950,14 @@ read_a_source_file (char *name) + unsigned int new_length; + char *tmp_buf = 0; + +- bump_line_counters (); + s = input_line_pointer; + if (strncmp (s, "APP\n", 4)) +- continue; /* We ignore it */ ++ { ++ /* We ignore it */ ++ ignore_rest_of_line (); ++ continue; ++ } ++ bump_line_counters (); + s += 4; + + sb_new (&sbuf); +@@ -1052,7 +1056,7 @@ read_a_source_file (char *name) + continue; + #endif + input_line_pointer--; +- /* Report unknown char as ignored. */ ++ /* Report unknown char as error. */ + demand_empty_rest_of_line (); + } + + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, MaxfeldstraÃe 5, 90409 NÃrnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." diff --git a/openwrt/toolchain/binutils/2.15.94.0.1/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15.94.0.1/100-uclibc-conf.patch new file mode 100644 index 0000000000..dda2b4ffa2 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.1/100-uclibc-conf.patch @@ -0,0 +1,734 @@ +diff -ur binutils-2.15.94.0.1.orig/bfd/config.bfd binutils-2.15.94.0.1/bfd/config.bfd +--- binutils-2.15.94.0.1.orig/bfd/config.bfd 2004-11-22 21:29:57.791886144 -0500 ++++ binutils-2.15.94.0.1/bfd/config.bfd 2004-11-22 21:30:53.195463520 -0500 +@@ -140,7 +140,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -150,7 +150,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -227,7 +227,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -235,8 +235,8 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ +- arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | \ ++ arm*-*-conix* | arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks | \ + arm*-*-eabi* ) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -381,7 +381,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -392,7 +392,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -525,7 +525,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -539,7 +539,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -715,7 +715,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -1001,7 +1001,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -1038,8 +1039,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1206,7 +1207,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1253,7 +1254,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1322,7 +1323,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -ur binutils-2.15.94.0.1.orig/bfd/configure binutils-2.15.94.0.1/bfd/configure +--- binutils-2.15.94.0.1.orig/bfd/configure 2004-11-22 21:29:57.794885688 -0500 ++++ binutils-2.15.94.0.1/bfd/configure 2004-11-22 21:31:10.011907032 -0500 +@@ -3583,6 +3583,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -9914,7 +9919,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -9978,7 +9983,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -10016,7 +10021,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -10150,7 +10155,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -ur binutils-2.15.94.0.1.orig/bfd/configure.in binutils-2.15.94.0.1/bfd/configure.in +--- binutils-2.15.94.0.1.orig/bfd/configure.in 2004-11-22 21:29:57.794885688 -0500 ++++ binutils-2.15.94.0.1/bfd/configure.in 2004-11-22 21:31:23.225898200 -0500 +@@ -163,7 +163,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -248,7 +248,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -289,7 +289,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -375,7 +375,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -ur binutils-2.15.94.0.1.orig/binutils/configure binutils-2.15.94.0.1/binutils/configure +--- binutils-2.15.94.0.1.orig/binutils/configure 2004-11-22 21:29:57.923866080 -0500 ++++ binutils-2.15.94.0.1/binutils/configure 2004-11-22 21:31:47.597193200 -0500 +@@ -1575,6 +1575,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -ur binutils-2.15.94.0.1.orig/configure binutils-2.15.94.0.1/configure +--- binutils-2.15.94.0.1.orig/configure 2004-11-22 21:29:57.902869272 -0500 ++++ binutils-2.15.94.0.1/configure 2004-11-22 21:31:47.601192592 -0500 +@@ -1341,6 +1341,18 @@ + i[3456789]86-*-coff | i[3456789]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -ur binutils-2.15.94.0.1.orig/configure.in binutils-2.15.94.0.1/configure.in +--- binutils-2.15.94.0.1.orig/configure.in 2004-11-22 21:29:57.902869272 -0500 ++++ binutils-2.15.94.0.1/configure.in 2004-11-22 21:31:47.606191832 -0500 +@@ -563,6 +563,18 @@ + i[[3456789]]86-*-coff | i[[3456789]]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -ur binutils-2.15.94.0.1.orig/gas/configure binutils-2.15.94.0.1/gas/configure +--- binutils-2.15.94.0.1.orig/gas/configure 2004-11-22 21:29:58.078842520 -0500 ++++ binutils-2.15.94.0.1/gas/configure 2004-11-22 21:34:12.759125232 -0500 +@@ -3420,6 +3420,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4256,6 +4261,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4271,6 +4277,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4284,6 +4291,7 @@ + + cris-*-linux-gnu* | crisv32-*-linux-gnu*) + fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-* | crisv32-*-*) fmt=multi bfd_gas=yes ;; + + crx-*-elf*) fmt=elf ;; +@@ -4343,7 +4351,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4403,6 +4413,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4430,6 +4441,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4504,6 +4516,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4531,7 +4544,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4566,6 +4581,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -ur binutils-2.15.94.0.1.orig/gas/configure.in binutils-2.15.94.0.1/gas/configure.in +--- binutils-2.15.94.0.1.orig/gas/configure.in 2004-11-22 21:29:58.079842368 -0500 ++++ binutils-2.15.94.0.1/gas/configure.in 2004-11-22 21:34:12.763124624 -0500 +@@ -202,6 +202,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -217,6 +218,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -230,6 +232,7 @@ + + cris-*-linux-gnu* | crisv32-*-linux-gnu*) + fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-* | crisv32-*-*) fmt=multi bfd_gas=yes ;; + + crx-*-elf*) fmt=elf ;; +@@ -289,7 +292,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -342,6 +347,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -369,6 +375,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -440,6 +447,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -460,7 +468,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -491,6 +501,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -ur binutils-2.15.94.0.1.orig/gprof/configure binutils-2.15.94.0.1/gprof/configure +--- binutils-2.15.94.0.1.orig/gprof/configure 2004-11-22 21:29:58.628758920 -0500 ++++ binutils-2.15.94.0.1/gprof/configure 2004-11-22 21:34:12.777122496 -0500 +@@ -3418,6 +3418,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -ur binutils-2.15.94.0.1.orig/ld/configure binutils-2.15.94.0.1/ld/configure +--- binutils-2.15.94.0.1.orig/ld/configure 2004-11-22 21:29:58.752740072 -0500 ++++ binutils-2.15.94.0.1/ld/configure 2004-11-22 21:34:12.784121432 -0500 +@@ -1579,6 +1579,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -ur binutils-2.15.94.0.1.orig/ld/configure.tgt binutils-2.15.94.0.1/ld/configure.tgt +--- binutils-2.15.94.0.1.orig/ld/configure.tgt 2004-11-22 21:29:58.753739920 -0500 ++++ binutils-2.15.94.0.1/ld/configure.tgt 2004-11-22 21:38:50.336926992 -0500 +@@ -32,6 +32,7 @@ + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu* | cris-*-linux-gnu*) + targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-* | crisv32-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -62,14 +63,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -121,7 +124,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -132,7 +137,7 @@ + m68*-apple-aux*) targ_emul=m68kaux ;; + maxq-*-coff) targ_emul=maxqcoff;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -156,14 +161,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -263,11 +270,14 @@ + arm-*-kaos*) targ_emul=armelf ;; + arm9e-*-elf) targ_emul=armelf ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnueabi) targ_emul=armelf_linux_eabi ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -371,7 +381,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -388,9 +399,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -403,6 +414,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -436,16 +448,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -468,6 +480,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -ur binutils-2.15.94.0.1.orig/ld/emultempl/elf32.em binutils-2.15.94.0.1/ld/emultempl/elf32.em +--- binutils-2.15.94.0.1.orig/ld/emultempl/elf32.em 2004-11-22 21:29:58.763738400 -0500 ++++ binutils-2.15.94.0.1/ld/emultempl/elf32.em 2004-11-22 21:38:50.338926688 -0500 +@@ -65,7 +65,7 @@ + + if [ "x${USE_LIBPATH}" = xyes ] ; then + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c <<EOF + #include <glob.h> + EOF +@@ -337,7 +337,7 @@ + + EOF + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c <<EOF + { + struct bfd_link_needed_list *l; +@@ -510,7 +510,7 @@ + + EOF + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c <<EOF + /* For a native linker, check the file /etc/ld.so.conf for directories + in which we may find shared libraries. /etc/ld.so.conf is really +@@ -894,7 +894,7 @@ + EOF + if [ "x${USE_LIBPATH}" = xyes ] ; then + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c <<EOF + if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force)) + break; +diff -ur binutils-2.15.94.0.1.orig/libtool.m4 binutils-2.15.94.0.1/libtool.m4 +--- binutils-2.15.94.0.1.orig/libtool.m4 2004-11-22 21:29:57.000000000 -0500 ++++ binutils-2.15.94.0.1/libtool.m4 2004-11-22 21:38:50.339926536 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -ur binutils-2.15.94.0.1.orig/ltconfig binutils-2.15.94.0.1/ltconfig +--- binutils-2.15.94.0.1.orig/ltconfig 2004-11-22 21:29:57.000000000 -0500 ++++ binutils-2.15.94.0.1/ltconfig 2004-11-22 21:38:50.341926232 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1270,6 +1271,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -ur binutils-2.15.94.0.1.orig/opcodes/configure binutils-2.15.94.0.1/opcodes/configure +--- binutils-2.15.94.0.1.orig/opcodes/configure 2004-11-22 21:29:59.114685048 -0500 ++++ binutils-2.15.94.0.1/opcodes/configure 2004-11-22 21:38:50.354924256 -0500 +@@ -3587,6 +3587,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15.94.0.1/300-001_ld_makefile_patch.patch b/openwrt/toolchain/binutils/2.15.94.0.1/300-001_ld_makefile_patch.patch new file mode 100644 index 0000000000..b25d5b7e21 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.1/300-001_ld_makefile_patch.patch @@ -0,0 +1,52 @@ +#!/bin/sh -e +## 001_ld_makefile_patch.dpatch +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: correct where ld scripts are installed +## DP: Author: Chris Chimelis <chris@debian.org> +## DP: Upstream status: N/A +## DP: Date: ?? + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.am binutils-2.14.90.0.6/ld/Makefile.am +--- /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.am 2003-08-21 16:28:48.000000000 +0100 ++++ binutils-2.14.90.0.6/ld/Makefile.am 2003-09-10 23:12:09.000000000 +0100 +@@ -19,7 +19,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.in binutils-2.14.90.0.6/ld/Makefile.in +--- /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.in 2003-08-21 16:28:48.000000000 +0100 ++++ binutils-2.14.90.0.6/ld/Makefile.in 2003-09-10 23:12:09.000000000 +0100 +@@ -128,7 +128,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ diff --git a/openwrt/toolchain/binutils/2.15.94.0.1/300-006_better_file_error.patch b/openwrt/toolchain/binutils/2.15.94.0.1/300-006_better_file_error.patch new file mode 100644 index 0000000000..f337611edf --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.1/300-006_better_file_error.patch @@ -0,0 +1,43 @@ +#!/bin/sh -e +## 006_better_file_error.dpatch by David Kimdon <dwhedon@gordian.com> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Specify which filename is causing an error if the filename is a +## DP: directory. (#45832) + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.14.90.0.6/bfd/opncls.c binutils-2.14.90.0.6/bfd/opncls.c +--- /home/james/debian/packages/binutils/binutils-2.14.90.0.6/bfd/opncls.c 2003-07-23 16:08:09.000000000 +0100 ++++ binutils-2.14.90.0.6/bfd/opncls.c 2003-09-10 22:35:00.000000000 +0100 +@@ -150,6 +150,13 @@ + { + bfd *nbfd; + const bfd_target *target_vec; ++ struct stat s; ++ ++ if (stat (filename, &s) == 0) ++ if (S_ISDIR(s.st_mode)) { ++ bfd_set_error (bfd_error_file_not_recognized); ++ return NULL; ++ } + + nbfd = _bfd_new_bfd (); + if (nbfd == NULL) diff --git a/openwrt/toolchain/binutils/2.15.94.0.1/300-012_check_ldrunpath_length.patch b/openwrt/toolchain/binutils/2.15.94.0.1/300-012_check_ldrunpath_length.patch new file mode 100644 index 0000000000..498651a90c --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.1/300-012_check_ldrunpath_length.patch @@ -0,0 +1,47 @@ +#!/bin/sh -e +## 012_check_ldrunpath_length.dpatch by Chris Chimelis <chris@debian.org> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Only generate an RPATH entry if LD_RUN_PATH is not empty, for +## DP: cases where -rpath isn't specified. (#151024) + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em binutils-2.15/ld/emultempl/elf32.em +--- /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:58.000000000 +0100 ++++ binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:59.000000000 +0100 +@@ -692,6 +692,8 @@ + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, &n, + force)) + break; +@@ -871,6 +873,8 @@ + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf_size_dynamic_sections + (output_bfd, command_line.soname, rpath, + command_line.filter_shlib, diff --git a/openwrt/toolchain/binutils/2.15.94.0.1/300-120_mips_xgot_multigot_workaround.patch b/openwrt/toolchain/binutils/2.15.94.0.1/300-120_mips_xgot_multigot_workaround.patch new file mode 100644 index 0000000000..ae2033d069 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.1/300-120_mips_xgot_multigot_workaround.patch @@ -0,0 +1,39 @@ +#! /bin/sh -e +## 120_mips_xgot_multigot_workaround.dpatch +## +## DP: Description: Make multigot/xgot handling mutually exclusive. +## DP: Author: Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de> +## DP: Upstream status: Not submitted +## DP: Date: 2004-09-17 + +if [ $# -lt 1 ]; then + echo "`basename $0`: script expects -patch|-unpatch as argument" >&2 + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch} ${2:+-d $2}" + +case "$1" in + -patch) patch -p1 ${patch_opts} < $0;; + -unpatch) patch -R -p1 ${patch_opts} < $0;; + *) + echo "`basename $0`: script expects -patch|-unpatch as argument" >&2 + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.15/bfd/elfxx-mips.c binutils-2.15/bfd/elfxx-mips.c +--- /home/james/debian/packages/binutils/binutils-2.15/bfd/elfxx-mips.c 2004-09-23 22:41:37.156466673 +0100 ++++ binutils-2.15/bfd/elfxx-mips.c 2004-09-23 22:42:15.998362861 +0100 +@@ -5883,6 +5883,8 @@ + s->size += i * MIPS_ELF_GOT_SIZE (output_bfd); + + if (s->size > MIPS_ELF_GOT_MAX_SIZE (output_bfd) ++ && g->global_gotno <= (MIPS_ELF_GOT_MAX_SIZE (output_bfd) ++ / MIPS_ELF_GOT_SIZE (output_bfd)) + && ! mips_elf_multi_got (output_bfd, info, g, s, local_gotno)) + return FALSE; + diff --git a/openwrt/toolchain/binutils/2.15.94.0.1/702-binutils-skip-comments.patch b/openwrt/toolchain/binutils/2.15.94.0.1/702-binutils-skip-comments.patch new file mode 100644 index 0000000000..804a17e006 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.1/702-binutils-skip-comments.patch @@ -0,0 +1,101 @@ +Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html +Fixes +localealias.s:544: Error: junk at end of line, first unrecognized character is `,' +when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3 + +Paths adjusted to match crosstool's patcher. + +Message-Id: m3n052qw2g.fsf@whitebox.m5r.de +From: Andreas Schwab <schwab at suse dot de> +To: Nathan Sidwell <nathan at codesourcery dot com> +Cc: Ian Lance Taylor <ian at wasabisystems dot com>, binutils at sources dot redhat dot com +Date: Fri, 23 Apr 2004 22:27:19 +0200 +Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line + +Nathan Sidwell <nathan@codesourcery.com> writes: + +> Index: read.c +> =================================================================== +> RCS file: /cvs/src/src/gas/read.c,v +> retrieving revision 1.76 +> diff -c -3 -p -r1.76 read.c +> *** read.c 12 Mar 2004 17:48:12 -0000 1.76 +> --- read.c 18 Mar 2004 09:56:05 -0000 +> *************** read_a_source_file (char *name) +> *** 1053,1059 **** +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! ignore_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook +> --- 1053,1059 ---- +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! demand_empty_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook + +This means that the unknown character is no longer ignored, despite the +comment. As a side effect a line starting with a line comment character +not followed by APP in NO_APP mode now triggers an error instead of just a +warning, breaking builds of glibc on m68k-linux. Earlier in +read_a_source_file where #APP is handled there is another comment that +claims that unknown comments are ignored, when in fact they aren't (only +the initial line comment character is skipped). + +Note that the presence of #APP will mess up the line counters, but +that appears to be difficult to fix. + +Andreas. + +2004-04-23 Andreas Schwab <schwab@suse.de> + + * read.c (read_a_source_file): Ignore unknown text after line + comment character. Fix misleading comment. + +--- binutils/gas/read.c.~1.78.~ 2004-04-23 08:58:23.000000000 +0200 ++++ binutils/gas/read.c 2004-04-23 21:49:01.000000000 +0200 +@@ -1,6 +1,6 @@ + /* read.c - read a source file - + Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +- 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + +@@ -950,10 +950,14 @@ read_a_source_file (char *name) + unsigned int new_length; + char *tmp_buf = 0; + +- bump_line_counters (); + s = input_line_pointer; + if (strncmp (s, "APP\n", 4)) +- continue; /* We ignore it */ ++ { ++ /* We ignore it */ ++ ignore_rest_of_line (); ++ continue; ++ } ++ bump_line_counters (); + s += 4; + + sb_new (&sbuf); +@@ -1052,7 +1056,7 @@ read_a_source_file (char *name) + continue; + #endif + input_line_pointer--; +- /* Report unknown char as ignored. */ ++ /* Report unknown char as error. */ + demand_empty_rest_of_line (); + } + + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, MaxfeldstraÃe 5, 90409 NÃrnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." diff --git a/openwrt/toolchain/binutils/2.15.94.0.2/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15.94.0.2/100-uclibc-conf.patch new file mode 100644 index 0000000000..dc21386f42 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.2/100-uclibc-conf.patch @@ -0,0 +1,749 @@ +diff -ur binutils-2.15.94.0.2.orig/bfd/config.bfd binutils-2.15.94.0.2/bfd/config.bfd +--- binutils-2.15.94.0.2.orig/bfd/config.bfd 2004-12-22 15:00:57.219024360 -0500 ++++ binutils-2.15.94.0.2/bfd/config.bfd 2004-12-22 15:01:18.982715776 -0500 +@@ -140,7 +140,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -150,7 +150,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -227,7 +227,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -235,8 +235,8 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ +- arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | \ ++ arm*-*-conix* | arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks | \ + arm*-*-eabi* ) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -381,7 +381,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -392,7 +392,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -525,7 +525,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -539,7 +539,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -715,7 +715,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -1001,7 +1001,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -1038,8 +1039,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1209,7 +1210,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1256,7 +1257,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1325,7 +1326,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -ur binutils-2.15.94.0.2.orig/bfd/configure binutils-2.15.94.0.2/bfd/configure +--- binutils-2.15.94.0.2.orig/bfd/configure 2004-12-22 15:00:57.221024056 -0500 ++++ binutils-2.15.94.0.2/bfd/configure 2004-12-22 15:01:18.996713648 -0500 +@@ -3583,6 +3583,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -9914,7 +9919,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -9978,7 +9983,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -10016,7 +10021,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -10150,7 +10155,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -ur binutils-2.15.94.0.2.orig/bfd/configure.in binutils-2.15.94.0.2/bfd/configure.in +--- binutils-2.15.94.0.2.orig/bfd/configure.in 2004-12-22 15:00:57.223023752 -0500 ++++ binutils-2.15.94.0.2/bfd/configure.in 2004-12-22 15:01:18.998713344 -0500 +@@ -163,7 +163,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -248,7 +248,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -289,7 +289,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -375,7 +375,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -ur binutils-2.15.94.0.2.orig/binutils/configure binutils-2.15.94.0.2/binutils/configure +--- binutils-2.15.94.0.2.orig/binutils/configure 2004-12-22 15:00:57.351004296 -0500 ++++ binutils-2.15.94.0.2/binutils/configure 2004-12-22 15:01:19.002712736 -0500 +@@ -1575,6 +1575,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -ur binutils-2.15.94.0.2.orig/configure binutils-2.15.94.0.2/configure +--- binutils-2.15.94.0.2.orig/configure 2004-12-22 15:00:57.321008856 -0500 ++++ binutils-2.15.94.0.2/configure 2004-12-22 15:01:19.007711976 -0500 +@@ -1352,6 +1352,18 @@ + i[3456789]86-*-coff | i[3456789]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -ur binutils-2.15.94.0.2.orig/configure.in binutils-2.15.94.0.2/configure.in +--- binutils-2.15.94.0.2.orig/configure.in 2004-12-22 15:00:57.321008856 -0500 ++++ binutils-2.15.94.0.2/configure.in 2004-12-22 15:01:19.010711520 -0500 +@@ -561,6 +561,18 @@ + i[[3456789]]86-*-coff | i[[3456789]]86-*-elf) + noconfigdirs="$noconfigdirs ${libgcj}" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -ur binutils-2.15.94.0.2.orig/gas/configure binutils-2.15.94.0.2/gas/configure +--- binutils-2.15.94.0.2.orig/gas/configure 2004-12-22 15:00:57.461987424 -0500 ++++ binutils-2.15.94.0.2/gas/configure 2004-12-22 15:01:19.019710152 -0500 +@@ -3420,6 +3420,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4256,6 +4261,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4272,6 +4278,7 @@ + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnueabi*) fmt=elf em=armlinuxeabi ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4285,6 +4292,7 @@ + + cris-*-linux-gnu* | crisv32-*-linux-gnu*) + fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-* | crisv32-*-*) fmt=multi bfd_gas=yes ;; + + crx-*-elf*) fmt=elf ;; +@@ -4344,7 +4352,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4404,6 +4414,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4431,6 +4442,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4505,6 +4517,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4532,7 +4545,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-tpf*) fmt=elf ;; + + sh*-*-linux*) fmt=elf em=linux +@@ -4568,6 +4583,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -ur binutils-2.15.94.0.2.orig/gas/configure.in binutils-2.15.94.0.2/gas/configure.in +--- binutils-2.15.94.0.2.orig/gas/configure.in 2004-12-22 15:00:57.461987424 -0500 ++++ binutils-2.15.94.0.2/gas/configure.in 2004-12-22 15:01:19.022709696 -0500 +@@ -202,6 +202,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -218,6 +219,7 @@ + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnueabi*) fmt=elf em=armlinuxeabi ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -231,6 +233,7 @@ + + cris-*-linux-gnu* | crisv32-*-linux-gnu*) + fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-* | crisv32-*-*) fmt=multi bfd_gas=yes ;; + + crx-*-elf*) fmt=elf ;; +@@ -290,7 +293,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -343,6 +348,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -370,6 +376,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -441,6 +448,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -461,7 +469,9 @@ + ppc-*-lynxos*) fmt=elf em=lynx bfd_gas=yes ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-tpf*) fmt=elf ;; + + sh*-*-linux*) fmt=elf em=linux +@@ -493,6 +503,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -ur binutils-2.15.94.0.2.orig/gprof/configure binutils-2.15.94.0.2/gprof/configure +--- binutils-2.15.94.0.2.orig/gprof/configure 2004-12-22 15:00:57.949913248 -0500 ++++ binutils-2.15.94.0.2/gprof/configure 2004-12-22 15:01:19.030708480 -0500 +@@ -3418,6 +3418,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -ur binutils-2.15.94.0.2.orig/ld/configure binutils-2.15.94.0.2/ld/configure +--- binutils-2.15.94.0.2.orig/ld/configure 2004-12-22 15:00:58.032900632 -0500 ++++ binutils-2.15.94.0.2/ld/configure 2004-12-22 15:01:19.035707720 -0500 +@@ -1579,6 +1579,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -ur binutils-2.15.94.0.2.orig/ld/configure.tgt binutils-2.15.94.0.2/ld/configure.tgt +--- binutils-2.15.94.0.2.orig/ld/configure.tgt 2004-12-22 15:00:58.033900480 -0500 ++++ binutils-2.15.94.0.2/ld/configure.tgt 2004-12-22 15:01:19.036707568 -0500 +@@ -32,6 +32,7 @@ + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu* | cris-*-linux-gnu*) + targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-* | crisv32-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -62,14 +63,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -121,7 +124,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -132,7 +137,7 @@ + m68*-apple-aux*) targ_emul=m68kaux ;; + maxq-*-coff) targ_emul=maxqcoff;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -156,14 +161,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -263,11 +270,14 @@ + arm-*-kaos*) targ_emul=armelf ;; + arm9e-*-elf) targ_emul=armelf ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnueabi) targ_emul=armelf_linux_eabi ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -371,7 +381,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -388,9 +399,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -403,6 +414,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -436,16 +448,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -468,6 +480,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -ur binutils-2.15.94.0.2.orig/ld/emultempl/elf32.em binutils-2.15.94.0.2/ld/emultempl/elf32.em +--- binutils-2.15.94.0.2.orig/ld/emultempl/elf32.em 2004-12-22 15:00:58.044898808 -0500 ++++ binutils-2.15.94.0.2/ld/emultempl/elf32.em 2004-12-22 15:01:19.038707264 -0500 +@@ -65,7 +65,7 @@ + + if [ "x${USE_LIBPATH}" = xyes ] ; then + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c <<EOF + #include <glob.h> + EOF +@@ -337,7 +337,7 @@ + + EOF + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c <<EOF + { + struct bfd_link_needed_list *l; +@@ -510,7 +510,7 @@ + + EOF + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c <<EOF + /* For a native linker, check the file /etc/ld.so.conf for directories + in which we may find shared libraries. /etc/ld.so.conf is really +@@ -894,7 +894,7 @@ + EOF + if [ "x${USE_LIBPATH}" = xyes ] ; then + case ${target} in +- *-*-linux-gnu*) ++ *-*-linux-gnu* | *-*-linux-uclibc*) + cat >>e${EMULATION_NAME}.c <<EOF + if (gld${EMULATION_NAME}_check_ld_so_conf (l->name, force)) + break; +diff -ur binutils-2.15.94.0.2.orig/libiberty/configure binutils-2.15.94.0.2/libiberty/configure +--- binutils-2.15.94.0.2.orig/libiberty/configure 2004-12-22 15:00:59.263713520 -0500 ++++ binutils-2.15.94.0.2/libiberty/configure 2004-12-22 15:03:55.744884304 -0500 +@@ -3682,6 +3682,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -ur binutils-2.15.94.0.2.orig/libtool.m4 binutils-2.15.94.0.2/libtool.m4 +--- binutils-2.15.94.0.2.orig/libtool.m4 2004-12-22 15:00:57.329007640 -0500 ++++ binutils-2.15.94.0.2/libtool.m4 2004-12-22 15:01:19.039707112 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -ur binutils-2.15.94.0.2.orig/ltconfig binutils-2.15.94.0.2/ltconfig +--- binutils-2.15.94.0.2.orig/ltconfig 2004-12-22 15:00:57.330007488 -0500 ++++ binutils-2.15.94.0.2/ltconfig 2004-12-22 15:01:19.041706808 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1270,6 +1271,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -ur binutils-2.15.94.0.2.orig/opcodes/configure binutils-2.15.94.0.2/opcodes/configure +--- binutils-2.15.94.0.2.orig/opcodes/configure 2004-12-22 15:00:59.334702728 -0500 ++++ binutils-2.15.94.0.2/opcodes/configure 2004-12-22 15:01:19.053704984 -0500 +@@ -3587,6 +3587,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15.94.0.2/300-001_ld_makefile_patch.patch b/openwrt/toolchain/binutils/2.15.94.0.2/300-001_ld_makefile_patch.patch new file mode 100644 index 0000000000..b25d5b7e21 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.2/300-001_ld_makefile_patch.patch @@ -0,0 +1,52 @@ +#!/bin/sh -e +## 001_ld_makefile_patch.dpatch +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: correct where ld scripts are installed +## DP: Author: Chris Chimelis <chris@debian.org> +## DP: Upstream status: N/A +## DP: Date: ?? + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.am binutils-2.14.90.0.6/ld/Makefile.am +--- /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.am 2003-08-21 16:28:48.000000000 +0100 ++++ binutils-2.14.90.0.6/ld/Makefile.am 2003-09-10 23:12:09.000000000 +0100 +@@ -19,7 +19,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.in binutils-2.14.90.0.6/ld/Makefile.in +--- /home/james/debian/packages/binutils/binutils-2.14.90.0.6/ld/Makefile.in 2003-08-21 16:28:48.000000000 +0100 ++++ binutils-2.14.90.0.6/ld/Makefile.in 2003-09-10 23:12:09.000000000 +0100 +@@ -128,7 +128,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ diff --git a/openwrt/toolchain/binutils/2.15.94.0.2/300-006_better_file_error.patch b/openwrt/toolchain/binutils/2.15.94.0.2/300-006_better_file_error.patch new file mode 100644 index 0000000000..f337611edf --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.2/300-006_better_file_error.patch @@ -0,0 +1,43 @@ +#!/bin/sh -e +## 006_better_file_error.dpatch by David Kimdon <dwhedon@gordian.com> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Specify which filename is causing an error if the filename is a +## DP: directory. (#45832) + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.14.90.0.6/bfd/opncls.c binutils-2.14.90.0.6/bfd/opncls.c +--- /home/james/debian/packages/binutils/binutils-2.14.90.0.6/bfd/opncls.c 2003-07-23 16:08:09.000000000 +0100 ++++ binutils-2.14.90.0.6/bfd/opncls.c 2003-09-10 22:35:00.000000000 +0100 +@@ -150,6 +150,13 @@ + { + bfd *nbfd; + const bfd_target *target_vec; ++ struct stat s; ++ ++ if (stat (filename, &s) == 0) ++ if (S_ISDIR(s.st_mode)) { ++ bfd_set_error (bfd_error_file_not_recognized); ++ return NULL; ++ } + + nbfd = _bfd_new_bfd (); + if (nbfd == NULL) diff --git a/openwrt/toolchain/binutils/2.15.94.0.2/300-012_check_ldrunpath_length.patch b/openwrt/toolchain/binutils/2.15.94.0.2/300-012_check_ldrunpath_length.patch new file mode 100644 index 0000000000..498651a90c --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.2/300-012_check_ldrunpath_length.patch @@ -0,0 +1,47 @@ +#!/bin/sh -e +## 012_check_ldrunpath_length.dpatch by Chris Chimelis <chris@debian.org> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Only generate an RPATH entry if LD_RUN_PATH is not empty, for +## DP: cases where -rpath isn't specified. (#151024) + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em binutils-2.15/ld/emultempl/elf32.em +--- /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:58.000000000 +0100 ++++ binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:59.000000000 +0100 +@@ -692,6 +692,8 @@ + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, &n, + force)) + break; +@@ -871,6 +873,8 @@ + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf_size_dynamic_sections + (output_bfd, command_line.soname, rpath, + command_line.filter_shlib, diff --git a/openwrt/toolchain/binutils/2.15.94.0.2/300-120_mips_xgot_multigot_workaround.patch b/openwrt/toolchain/binutils/2.15.94.0.2/300-120_mips_xgot_multigot_workaround.patch new file mode 100644 index 0000000000..ae2033d069 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.2/300-120_mips_xgot_multigot_workaround.patch @@ -0,0 +1,39 @@ +#! /bin/sh -e +## 120_mips_xgot_multigot_workaround.dpatch +## +## DP: Description: Make multigot/xgot handling mutually exclusive. +## DP: Author: Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de> +## DP: Upstream status: Not submitted +## DP: Date: 2004-09-17 + +if [ $# -lt 1 ]; then + echo "`basename $0`: script expects -patch|-unpatch as argument" >&2 + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch} ${2:+-d $2}" + +case "$1" in + -patch) patch -p1 ${patch_opts} < $0;; + -unpatch) patch -R -p1 ${patch_opts} < $0;; + *) + echo "`basename $0`: script expects -patch|-unpatch as argument" >&2 + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/binutils-2.15/bfd/elfxx-mips.c binutils-2.15/bfd/elfxx-mips.c +--- /home/james/debian/packages/binutils/binutils-2.15/bfd/elfxx-mips.c 2004-09-23 22:41:37.156466673 +0100 ++++ binutils-2.15/bfd/elfxx-mips.c 2004-09-23 22:42:15.998362861 +0100 +@@ -5883,6 +5883,8 @@ + s->size += i * MIPS_ELF_GOT_SIZE (output_bfd); + + if (s->size > MIPS_ELF_GOT_MAX_SIZE (output_bfd) ++ && g->global_gotno <= (MIPS_ELF_GOT_MAX_SIZE (output_bfd) ++ / MIPS_ELF_GOT_SIZE (output_bfd)) + && ! mips_elf_multi_got (output_bfd, info, g, s, local_gotno)) + return FALSE; + diff --git a/openwrt/toolchain/binutils/2.15.94.0.2/702-binutils-skip-comments.patch b/openwrt/toolchain/binutils/2.15.94.0.2/702-binutils-skip-comments.patch new file mode 100644 index 0000000000..804a17e006 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15.94.0.2/702-binutils-skip-comments.patch @@ -0,0 +1,101 @@ +Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html +Fixes +localealias.s:544: Error: junk at end of line, first unrecognized character is `,' +when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3 + +Paths adjusted to match crosstool's patcher. + +Message-Id: m3n052qw2g.fsf@whitebox.m5r.de +From: Andreas Schwab <schwab at suse dot de> +To: Nathan Sidwell <nathan at codesourcery dot com> +Cc: Ian Lance Taylor <ian at wasabisystems dot com>, binutils at sources dot redhat dot com +Date: Fri, 23 Apr 2004 22:27:19 +0200 +Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line + +Nathan Sidwell <nathan@codesourcery.com> writes: + +> Index: read.c +> =================================================================== +> RCS file: /cvs/src/src/gas/read.c,v +> retrieving revision 1.76 +> diff -c -3 -p -r1.76 read.c +> *** read.c 12 Mar 2004 17:48:12 -0000 1.76 +> --- read.c 18 Mar 2004 09:56:05 -0000 +> *************** read_a_source_file (char *name) +> *** 1053,1059 **** +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! ignore_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook +> --- 1053,1059 ---- +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! demand_empty_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook + +This means that the unknown character is no longer ignored, despite the +comment. As a side effect a line starting with a line comment character +not followed by APP in NO_APP mode now triggers an error instead of just a +warning, breaking builds of glibc on m68k-linux. Earlier in +read_a_source_file where #APP is handled there is another comment that +claims that unknown comments are ignored, when in fact they aren't (only +the initial line comment character is skipped). + +Note that the presence of #APP will mess up the line counters, but +that appears to be difficult to fix. + +Andreas. + +2004-04-23 Andreas Schwab <schwab@suse.de> + + * read.c (read_a_source_file): Ignore unknown text after line + comment character. Fix misleading comment. + +--- binutils/gas/read.c.~1.78.~ 2004-04-23 08:58:23.000000000 +0200 ++++ binutils/gas/read.c 2004-04-23 21:49:01.000000000 +0200 +@@ -1,6 +1,6 @@ + /* read.c - read a source file - + Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +- 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + +@@ -950,10 +950,14 @@ read_a_source_file (char *name) + unsigned int new_length; + char *tmp_buf = 0; + +- bump_line_counters (); + s = input_line_pointer; + if (strncmp (s, "APP\n", 4)) +- continue; /* We ignore it */ ++ { ++ /* We ignore it */ ++ ignore_rest_of_line (); ++ continue; ++ } ++ bump_line_counters (); + s += 4; + + sb_new (&sbuf); +@@ -1052,7 +1056,7 @@ read_a_source_file (char *name) + continue; + #endif + input_line_pointer--; +- /* Report unknown char as ignored. */ ++ /* Report unknown char as error. */ + demand_empty_rest_of_line (); + } + + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, MaxfeldstraÃe 5, 90409 NÃrnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." diff --git a/openwrt/toolchain/binutils/2.15/100-uclibc-conf.patch b/openwrt/toolchain/binutils/2.15/100-uclibc-conf.patch new file mode 100644 index 0000000000..1c7fa4a400 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15/100-uclibc-conf.patch @@ -0,0 +1,692 @@ +diff -urN binutils-2.15-dist/bfd/config.bfd binutils-2.15/bfd/config.bfd +--- binutils-2.15-dist/bfd/config.bfd 2004-05-17 14:35:56.000000000 -0500 ++++ binutils-2.15/bfd/config.bfd 2004-08-04 12:01:44.000000000 -0500 +@@ -126,7 +126,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -136,7 +136,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -213,7 +213,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -221,7 +221,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -360,7 +360,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -371,7 +371,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc* | hppa*-*-netbsd*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -494,7 +494,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -508,7 +508,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -683,7 +683,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -955,7 +955,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -987,8 +988,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1149,7 +1150,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1196,7 +1197,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1265,7 +1266,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN binutils-2.15-dist/bfd/configure binutils-2.15/bfd/configure +--- binutils-2.15-dist/bfd/configure 2004-05-17 14:35:57.000000000 -0500 ++++ binutils-2.15/bfd/configure 2004-08-04 12:01:44.000000000 -0500 +@@ -1699,6 +1699,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5278,7 +5283,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5338,7 +5343,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5376,7 +5381,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5477,7 +5482,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15-dist/bfd/configure.in binutils-2.15/bfd/configure.in +--- binutils-2.15-dist/bfd/configure.in 2004-05-17 14:35:57.000000000 -0500 ++++ binutils-2.15/bfd/configure.in 2004-08-04 12:01:44.000000000 -0500 +@@ -178,7 +178,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -259,7 +259,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -300,7 +300,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -385,7 +385,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15-dist/binutils/configure binutils-2.15/binutils/configure +--- binutils-2.15-dist/binutils/configure 2004-01-02 11:08:04.000000000 -0600 ++++ binutils-2.15/binutils/configure 2004-08-04 12:01:44.000000000 -0500 +@@ -1585,6 +1585,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15-dist/configure binutils-2.15/configure +--- binutils-2.15-dist/configure 2004-05-17 14:36:20.000000000 -0500 ++++ binutils-2.15/configure 2004-08-04 12:01:44.000000000 -0500 +@@ -1288,6 +1288,18 @@ + i[3456789]86-*-freebsd* | i[3456789]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15-dist/configure.in binutils-2.15/configure.in +--- binutils-2.15-dist/configure.in 2004-05-17 14:40:54.000000000 -0500 ++++ binutils-2.15/configure.in 2004-08-04 12:01:44.000000000 -0500 +@@ -521,6 +521,18 @@ + i[[3456789]]86-*-freebsd* | i[[3456789]]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15-dist/gas/configure binutils-2.15/gas/configure +--- binutils-2.15-dist/gas/configure 2004-05-17 14:36:07.000000000 -0500 ++++ binutils-2.15/gas/configure 2004-08-04 12:07:50.000000000 -0500 +@@ -3400,6 +3400,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4224,6 +4229,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4240,6 +4246,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4253,6 +4260,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -4310,7 +4318,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4370,6 +4380,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4397,6 +4408,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4459,6 +4471,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4486,7 +4499,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4519,6 +4534,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15-dist/gas/configure.in binutils-2.15/gas/configure.in +--- binutils-2.15-dist/gas/configure.in 2004-05-17 14:36:07.000000000 -0500 ++++ binutils-2.15/gas/configure.in 2004-08-04 12:07:21.000000000 -0500 +@@ -194,6 +194,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -210,6 +211,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -223,6 +225,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -280,7 +283,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -333,6 +338,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -360,6 +366,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -419,6 +426,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -439,7 +447,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -472,6 +482,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15-dist/gprof/configure binutils-2.15/gprof/configure +--- binutils-2.15-dist/gprof/configure 2003-08-26 12:19:19.000000000 -0500 ++++ binutils-2.15/gprof/configure 2004-08-04 12:01:45.000000000 -0500 +@@ -1581,6 +1581,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15-dist/ld/configure binutils-2.15/ld/configure +--- binutils-2.15-dist/ld/configure 2003-04-24 07:36:07.000000000 -0500 ++++ binutils-2.15/ld/configure 2004-08-04 12:01:45.000000000 -0500 +@@ -1589,6 +1589,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15-dist/ld/configure.tgt binutils-2.15/ld/configure.tgt +--- binutils-2.15-dist/ld/configure.tgt 2004-05-17 14:36:15.000000000 -0500 ++++ binutils-2.15/ld/configure.tgt 2004-08-04 12:01:45.000000000 -0500 +@@ -30,6 +30,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -59,14 +60,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -118,7 +121,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -128,7 +133,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -152,14 +157,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -259,10 +266,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -364,7 +374,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -381,9 +392,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -396,6 +407,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -429,16 +441,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -461,6 +473,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.15-dist/libtool.m4 binutils-2.15/libtool.m4 +--- binutils-2.15-dist/libtool.m4 2003-04-10 22:58:39.000000000 -0500 ++++ binutils-2.15/libtool.m4 2004-08-04 12:01:45.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.15-dist/ltconfig binutils-2.15/ltconfig +--- binutils-2.15-dist/ltconfig 2003-10-03 23:54:47.000000000 -0500 ++++ binutils-2.15/ltconfig 2004-08-04 12:01:45.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN binutils-2.15-dist/opcodes/configure binutils-2.15/opcodes/configure +--- binutils-2.15-dist/opcodes/configure 2003-08-05 04:39:31.000000000 -0500 ++++ binutils-2.15/opcodes/configure 2004-08-04 12:01:45.000000000 -0500 +@@ -1700,6 +1700,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/binutils/2.15/600-arm-textrel.patch b/openwrt/toolchain/binutils/2.15/600-arm-textrel.patch new file mode 100644 index 0000000000..73d5b9df8e --- /dev/null +++ b/openwrt/toolchain/binutils/2.15/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/openwrt/toolchain/binutils/Config.in b/openwrt/toolchain/binutils/Config.in new file mode 100644 index 0000000000..d1d62955d8 --- /dev/null +++ b/openwrt/toolchain/binutils/Config.in @@ -0,0 +1,66 @@ +# Choose binutils version. + +comment "Binutils Options" + +choice + prompt "Binutils Version" + default BR2_BINUTILS_VERSION_2_15_91_0_2 + help + Select the version of binutils you wish to use. + + config BR2_BINUTILS_VERSION_2_14_90_0_6 + bool "binutils 2.14.90.0.6" + + config BR2_BINUTILS_VERSION_2_14_90_0_7 + bool "binutils 2.14.90.0.7" + + config BR2_BINUTILS_VERSION_2_14_90_0_8 + bool "binutils 2.14.90.0.8" + + config BR2_BINUTILS_VERSION_2_15 + bool "binutils 2.15" + + config BR2_BINUTILS_VERSION_2_15_90_0_1 + bool "binutils 2.15.90.0.1" + + config BR2_BINUTILS_VERSION_2_15_90_0_1_1 + bool "binutils 2.15.90.0.1.1" + + config BR2_BINUTILS_VERSION_2_15_90_0_2 + bool "binutils 2.15.90.0.2" + + config BR2_BINUTILS_VERSION_2_15_90_0_3 + bool "binutils 2.15.90.0.3" + + config BR2_BINUTILS_VERSION_2_15_91_0_1 + bool "binutils 2.15.91.0.1" + + config BR2_BINUTILS_VERSION_2_15_91_0_2 + bool "binutils 2.15.91.0.2" + + config BR2_BINUTILS_VERSION_2_15_92_0_2 + bool "binutils 2.15.92.0.2" + + config BR2_BINUTILS_VERSION_2_15_94_0_1 + bool "binutils 2.15.94.0.1" + + config BR2_BINUTILS_VERSION_2_15_94_0_2 + bool "binutils 2.15.94.0.2" + +endchoice + +config BR2_BINUTILS_VERSION + string + default "2.14.90.0.6" if BR2_BINUTILS_VERSION_2_14_90_0_6 + default "2.14.90.0.7" if BR2_BINUTILS_VERSION_2_14_90_0_7 + default "2.14.90.0.8" if BR2_BINUTILS_VERSION_2_14_90_0_8 + default "2.15" if BR2_BINUTILS_VERSION_2_15 + default "2.15.90.0.1" if BR2_BINUTILS_VERSION_2_15_90_0_1 + default "2.15.90.0.0.1.1" if BR2_BINUTILS_VERSION_2_15_90_0_1_1 + default "2.15.90.0.2" if BR2_BINUTILS_VERSION_2_15_90_0_2 + default "2.15.90.0.3" if BR2_BINUTILS_VERSION_2_15_90_0_3 + default "2.15.91.0.1" if BR2_BINUTILS_VERSION_2_15_91_0_1 + default "2.15.91.0.2" if BR2_BINUTILS_VERSION_2_15_91_0_2 + default "2.15.92.0.2" if BR2_BINUTILS_VERSION_2_15_92_0_2 + default "2.15.94.0.1" if BR2_BINUTILS_VERSION_2_15_94_0_1 + default "2.15.94.0.2" if BR2_BINUTILS_VERSION_2_15_94_0_2 diff --git a/openwrt/toolchain/binutils/Makefile.in b/openwrt/toolchain/binutils/Makefile.in new file mode 100644 index 0000000000..c6838bb053 --- /dev/null +++ b/openwrt/toolchain/binutils/Makefile.in @@ -0,0 +1 @@ +BINUTILS_VERSION:=$(strip $(subst ",, $(BR2_BINUTILS_VERSION))) diff --git a/openwrt/toolchain/binutils/binutils.mk b/openwrt/toolchain/binutils/binutils.mk new file mode 100644 index 0000000000..afbb63ac3e --- /dev/null +++ b/openwrt/toolchain/binutils/binutils.mk @@ -0,0 +1,134 @@ +############################################################# +# +# build binutils for use on the host system +# +############################################################# +BINUTILS_VERSION:=$(strip $(BINUTILS_VERSION)) + +BINUTILS_SITE:=http://ftp.kernel.org/pub/linux/devel/binutils +ifeq ($(BINUTILS_VERSION),2.15) +BINUTILS_SITE:=http://ftp.gnu.org/gnu/binutils/ +endif +ifeq ($(BINUTILS_VERSION),2.14) +BINUTILS_SITE:=http://ftp.gnu.org/gnu/binutils/ +endif +ifeq ($(BINUTILS_VERSION),2.13) +BINUTILS_SITE:=http://ftp.gnu.org/gnu/binutils/ +endif + +BINUTILS_SOURCE:=binutils-$(BINUTILS_VERSION).tar.bz2 +BINUTILS_DIR:=$(TOOL_BUILD_DIR)/binutils-$(BINUTILS_VERSION) +BINUTILS_CAT:=bzcat + +BINUTILS_DIR1:=$(TOOL_BUILD_DIR)/binutils-$(BINUTILS_VERSION)-build + +$(DL_DIR)/$(BINUTILS_SOURCE): + mkdir -p $(DL_DIR) + $(WGET) -P $(DL_DIR) $(BINUTILS_SITE)/$(BINUTILS_SOURCE) + +$(BINUTILS_DIR)/.unpacked: $(DL_DIR)/$(BINUTILS_SOURCE) + mkdir -p $(TOOL_BUILD_DIR) + $(BINUTILS_CAT) $(DL_DIR)/$(BINUTILS_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) - + touch $(BINUTILS_DIR)/.unpacked + +$(BINUTILS_DIR)/.patched: $(BINUTILS_DIR)/.unpacked + # Apply appropriate binutils patches. + toolchain/patch-kernel.sh $(BINUTILS_DIR) toolchain/binutils/$(BINUTILS_VERSION) \*.patch + touch $(BINUTILS_DIR)/.patched + +$(BINUTILS_DIR1)/.configured: $(BINUTILS_DIR)/.patched + mkdir -p $(BINUTILS_DIR1) + (cd $(BINUTILS_DIR1); \ + $(BINUTILS_DIR)/configure \ + --prefix=$(STAGING_DIR) \ + --build=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) ); + touch $(BINUTILS_DIR1)/.configured + +$(BINUTILS_DIR1)/binutils/objdump: $(BINUTILS_DIR1)/.configured + $(MAKE) -C $(BINUTILS_DIR1) all + +# Make install will put gettext data in staging_dir/share/locale. +# Unfortunatey, it isn't configureable. +$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/bin/ld: $(BINUTILS_DIR1)/binutils/objdump + $(MAKE) -C $(BINUTILS_DIR1) install + +binutils-dependancies: + @if ! which bison > /dev/null ; then \ + echo -e "\n\nYou must install 'bison' on your build machine\n"; \ + exit 1; \ + fi; + @if ! which flex > /dev/null ; then \ + echo -e "\n\nYou must install 'flex' on your build machine\n"; \ + exit 1; \ + fi; + @if ! which msgfmt > /dev/null ; then \ + echo -e "\n\nYou must install 'gettext' on your build machine\n"; \ + exit 1; \ + fi; + +binutils: binutils-dependancies $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/bin/ld + +binutils-source: $(DL_DIR)/$(BINUTILS_SOURCE) + +binutils-clean: + rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + -$(MAKE) -C $(BINUTILS_DIR1) clean + +binutils-dirclean: + rm -rf $(BINUTILS_DIR1) + + + +############################################################# +# +# build binutils for use on the target system +# +############################################################# +BINUTILS_DIR2:=$(BUILD_DIR)/binutils-$(BINUTILS_VERSION)-target +$(BINUTILS_DIR2)/.configured: $(BINUTILS_DIR)/.patched + mkdir -p $(BINUTILS_DIR2) + (cd $(BINUTILS_DIR2); \ + PATH=$(TARGET_PATH) \ + CFLAGS="$(TARGET_CFLAGS)" \ + CFLAGS_FOR_BUILD="-O2 -g" \ + $(BINUTILS_DIR)/configure \ + --prefix=/usr \ + --exec-prefix=/usr \ + --build=$(GNU_HOST_NAME) \ + --host=$(REAL_GNU_TARGET_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) ); + touch $(BINUTILS_DIR2)/.configured + +$(BINUTILS_DIR2)/binutils/objdump: $(BINUTILS_DIR2)/.configured + PATH=$(TARGET_PATH) \ + $(MAKE) -C $(BINUTILS_DIR2) all + +$(TARGET_DIR)/usr/bin/ld: $(BINUTILS_DIR2)/binutils/objdump + PATH=$(TARGET_PATH) \ + $(MAKE) DESTDIR=$(TARGET_DIR) \ + tooldir=/usr build_tooldir=/usr \ + -C $(BINUTILS_DIR2) install + #rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + # $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + -$(STRIP) $(TARGET_DIR)/usr/$(REAL_GNU_TARGET_NAME)/bin/* > /dev/null 2>&1 + -$(STRIP) $(TARGET_DIR)/usr/bin/* > /dev/null 2>&1 + +binutils_target: $(GCC_DEPENDANCY) $(TARGET_DIR)/usr/bin/ld + +binutils_target-clean: + (cd $(TARGET_DIR)/usr/bin; \ + rm -f addr2line ar as gprof ld nm objcopy \ + objdump ranlib readelf size strings strip) + rm -f $(TARGET_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + -$(MAKE) -C $(BINUTILS_DIR2) clean + +binutils_target-dirclean: + rm -rf $(BINUTILS_DIR2) diff --git a/openwrt/toolchain/ccache/Config.in b/openwrt/toolchain/ccache/Config.in new file mode 100644 index 0000000000..a265375c40 --- /dev/null +++ b/openwrt/toolchain/ccache/Config.in @@ -0,0 +1,10 @@ +# + +comment "Ccache Options" + +config BR2_CCACHE + bool "Enable ccache support?" + default y + help + Enable ccache support? + diff --git a/openwrt/toolchain/ccache/Config.in.2 b/openwrt/toolchain/ccache/Config.in.2 new file mode 100644 index 0000000000..7130374610 --- /dev/null +++ b/openwrt/toolchain/ccache/Config.in.2 @@ -0,0 +1,8 @@ +# + +config BR2_PACKAGE_CCACHE_TARGET + bool"ccache support in the target filesystem" + default n + help + Add help text here. + diff --git a/openwrt/toolchain/ccache/Makefile.in b/openwrt/toolchain/ccache/Makefile.in new file mode 100644 index 0000000000..fe859da303 --- /dev/null +++ b/openwrt/toolchain/ccache/Makefile.in @@ -0,0 +1,6 @@ +ifeq ($(strip $(BR2_CCACHE)),y) +TARGETS+=ccache +endif +ifeq ($(strip $(BR2_PACKAGE_CCACHE_TARGET)),y) +TARGETS+=ccache_target +endif diff --git a/openwrt/toolchain/ccache/ccache.mk b/openwrt/toolchain/ccache/ccache.mk new file mode 100644 index 0000000000..e2fdd71cc1 --- /dev/null +++ b/openwrt/toolchain/ccache/ccache.mk @@ -0,0 +1,151 @@ +############################################################# +# +# build ccache to make recompiles faster on the build system +# +############################################################# +CCACHE_VER:=2.3 +CCACHE_SITE:=http://ccache.samba.org/ftp/ccache +CCACHE_SOURCE:=ccache-$(CCACHE_VER).tar.gz +CCACHE_DIR1:=$(TOOL_BUILD_DIR)/ccache-$(CCACHE_VER) +CCACHE_DIR2:=$(BUILD_DIR)/ccache-$(CCACHE_VER) +CCACHE_CAT:=zcat +CCACHE_BINARY:=ccache +CCACHE_TARGET_BINARY:=usr/bin/ccache + +$(DL_DIR)/$(CCACHE_SOURCE): + $(WGET) -P $(DL_DIR) $(CCACHE_SITE)/$(CCACHE_SOURCE) + +$(CCACHE_DIR1)/.unpacked: $(DL_DIR)/$(CCACHE_SOURCE) + $(CCACHE_CAT) $(DL_DIR)/$(CCACHE_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) - + touch $(CCACHE_DIR1)/.unpacked + +$(CCACHE_DIR1)/.patched: $(CCACHE_DIR1)/.unpacked + # WARNING - this will break if the toolchain is moved. + # Should probably patch things to use a relative path. + $(SED) "s,getenv(\"CCACHE_PATH\"),\"$(STAGING_DIR)/bin-ccache\",g" \ + $(CCACHE_DIR1)/execute.c + # WARNING - this will break if the toolchain build dir is deleted. + $(SED) "s,getenv(\"CCACHE_DIR\"),\"$(CCACHE_DIR1)/cache\",g" \ + $(CCACHE_DIR1)/ccache.c + mkdir -p $(CCACHE_DIR1)/cache + touch $(CCACHE_DIR1)/.patched + +$(CCACHE_DIR1)/.configured: $(CCACHE_DIR1)/.patched + mkdir -p $(CCACHE_DIR1) + (cd $(CCACHE_DIR1); rm -rf config.cache; \ + CC=$(HOSTCC) \ + $(CCACHE_DIR1)/configure \ + --target=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + ); + touch $(CCACHE_DIR1)/.configured + +$(CCACHE_DIR1)/$(CCACHE_BINARY): $(CCACHE_DIR1)/.configured + $(MAKE) CC=$(HOSTCC) -C $(CCACHE_DIR1) + +$(STAGING_DIR)/$(CCACHE_TARGET_BINARY): $(CCACHE_DIR1)/$(CCACHE_BINARY) + mkdir -p $(STAGING_DIR)/usr/bin; + cp $(CCACHE_DIR1)/ccache $(STAGING_DIR)/usr/bin + # Keep the actual toolchain binaries in a directory at the same level. + # Otherwise, relative paths for include dirs break. + mkdir -p $(STAGING_DIR)/bin-ccache; + (cd $(STAGING_DIR)/bin-ccache; \ + ln -fs $(REAL_GNU_TARGET_NAME)-gcc $(GNU_TARGET_NAME)-gcc; \ + ln -fs $(REAL_GNU_TARGET_NAME)-gcc $(GNU_TARGET_NAME)-cc; \ + ln -fs $(REAL_GNU_TARGET_NAME)-gcc $(REAL_GNU_TARGET_NAME)-cc); + [ -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc ] && \ + mv $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc $(STAGING_DIR)/bin-ccache/ + (cd $(STAGING_DIR)/bin; \ + ln -fs ../usr/bin/ccache $(GNU_TARGET_NAME)-cc; \ + ln -fs ../usr/bin/ccache $(GNU_TARGET_NAME)-gcc; \ + ln -fs ../usr/bin/ccache $(REAL_GNU_TARGET_NAME)-cc; \ + ln -fs ../usr/bin/ccache $(REAL_GNU_TARGET_NAME)-gcc); +ifeq ($(BR2_INSTALL_LIBSTDCPP),y) + [ -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-c++ ] && \ + mv $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-c++ $(STAGING_DIR)/bin-ccache/ + [ -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-g++ ] && \ + mv $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-g++ $(STAGING_DIR)/bin-ccache/ + (cd $(STAGING_DIR)/bin; \ + ln -fs ../usr/bin/ccache $(GNU_TARGET_NAME)-c++; \ + ln -fs ../usr/bin/ccache $(GNU_TARGET_NAME)-g++;\ + ln -fs ../usr/bin/ccache $(REAL_GNU_TARGET_NAME)-c++; \ + ln -fs ../usr/bin/ccache $(REAL_GNU_TARGET_NAME)-g++); + (cd $(STAGING_DIR)/bin-ccache; \ + ln -fs $(REAL_GNU_TARGET_NAME)-c++ $(GNU_TARGET_NAME)-c++; \ + ln -fs $(REAL_GNU_TARGET_NAME)-g++ $(GNU_TARGET_NAME)-g++); +endif + +ccache: gcc $(STAGING_DIR)/$(CCACHE_TARGET_BINARY) + +ccache-clean: + $(MAKE) -C $(CCACHE_DIR1) uninstall + -$(MAKE) -C $(CCACHE_DIR1) clean + +ccache-dirclean: + rm -rf $(CCACHE_DIR1) + + + + +############################################################# +# +# build ccache for use on the target system +# +############################################################# + +$(CCACHE_DIR2)/.unpacked: $(DL_DIR)/$(CCACHE_SOURCE) + $(CCACHE_CAT) $(DL_DIR)/$(CCACHE_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + touch $(CCACHE_DIR2)/.unpacked + +$(CCACHE_DIR2)/.patched: $(CCACHE_DIR2)/.unpacked + touch $(CCACHE_DIR2)/.patched + +$(CCACHE_DIR2)/.configured: $(CCACHE_DIR2)/.patched + mkdir -p $(CCACHE_DIR2) + (cd $(CCACHE_DIR2); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + $(CCACHE_DIR2)/configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + $(DISABLE_NLS) \ + ); + touch $(CCACHE_DIR2)/.configured + +$(CCACHE_DIR2)/$(CCACHE_BINARY): $(CCACHE_DIR2)/.configured + $(MAKE) -C $(CCACHE_DIR2) CFLAGS="$(TARGET_CFLAGS)" + +$(TARGET_DIR)/$(CCACHE_TARGET_BINARY): $(CCACHE_DIR2)/$(CCACHE_BINARY) + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(CCACHE_DIR2) install + rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + # put a bunch of symlinks into /bin, since that is earlier + # in the default PATH than /usr/bin where gcc lives + (cd $(TARGET_DIR)/bin; \ + ln -fs /usr/bin/ccache cc; \ + ln -fs /usr/bin/ccache gcc; \ + ln -fs /usr/bin/ccache c++; \ + ln -fs /usr/bin/ccache g++;) + +ccache_target: uclibc $(TARGET_DIR)/$(CCACHE_TARGET_BINARY) + +ccache_target-sources: $(DL_DIR)/$(CCACHE_SOURCE) + +ccache_target-clean: + rm -f $(TARGET_DIR)/$(CCACHE_TARGET_BINARY) + -$(MAKE) -C $(CCACHE_DIR2) clean + +ccache_target-dirclean: + rm -rf $(CCACHE_DIR2) diff --git a/openwrt/toolchain/gcc/2.95/050-debian-subset.patch.bz2 b/openwrt/toolchain/gcc/2.95/050-debian-subset.patch.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..6c2d518273b201e21e3dccc36e42e9aba09ab877 GIT binary patch literal 125295 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 UNB!fukN^0)k}1N3fu_0tsCBsZH~;_u literal 0 HcmV?d00001 diff --git a/openwrt/toolchain/gcc/2.95/100-uclibc-conf.patch b/openwrt/toolchain/gcc/2.95/100-uclibc-conf.patch new file mode 100644 index 0000000000..f244387cc9 --- /dev/null +++ b/openwrt/toolchain/gcc/2.95/100-uclibc-conf.patch @@ -0,0 +1,291 @@ +Warning! The powerpc patch (rs6000/linux.h) is hack-ish and would +definitely need to be improved to be acceptable upstream. Also, +this patch isn't complete as it only supports i386, arm, mips, and +powerpc (rs6000). +diff -urN gcc-20011006/config.sub gcc-20011006-new/config.sub +--- gcc-20011006/config.sub 2004-01-13 06:15:28.000000000 -0600 ++++ gcc-20011006-new/config.sub 2004-01-10 11:09:35.000000000 -0600 +@@ -68,7 +68,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- linux-gnu*) ++ linux-gnu* | linux-uclibc*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -936,7 +936,8 @@ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* ) + # Remember, each alternative MUST END IN *, to match a version number. + ;; +diff -urN gcc-20011006/gcc/config/arm/linux-elf.h gcc-20011006-new/gcc/config/arm/linux-elf.h +--- gcc-20011006/gcc/config/arm/linux-elf.h 2004-01-13 06:15:28.000000000 -0600 ++++ gcc-20011006-new/gcc/config/arm/linux-elf.h 2004-01-10 11:12:11.000000000 -0600 +@@ -90,6 +90,18 @@ + #define ENDFILE_SPEC \ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + ++#ifdef USE_UCLIBC ++#define LINK_SPEC "%{h*} %{version:-v} \ ++ %{b} %{Wl,*:%*} \ ++ %{static:-Bstatic} \ ++ %{shared:-shared} \ ++ %{symbolic:-Bsymbolic} \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ ++ -X \ ++ %{mbig-endian:-EB}" \ ++ SUBTARGET_EXTRA_LINK_SPEC ++#else + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ +@@ -100,6 +112,7 @@ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC ++#endif + + #undef CPP_PREDEFINES + #define CPP_PREDEFINES \ +diff -urN gcc-20011006/gcc/config/i386/linux.h gcc-20011006-new/gcc/config/i386/linux.h +--- gcc-20011006/gcc/config/i386/linux.h 2001-04-03 17:38:59.000000000 -0500 ++++ gcc-20011006-new/gcc/config/i386/linux.h 2004-01-10 11:15:38.000000000 -0600 +@@ -199,6 +199,15 @@ + %{static:-static}}}" + #endif + #else ++#if defined USE_UCLIBC ++#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ +@@ -207,6 +216,7 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}}}" + #endif ++#endif + + /* Get perform_* macros to build libgcc.a. */ + #include "i386/perform.h" +diff -urN gcc-20011006/gcc/config/mips/linux.h gcc-20011006-new/gcc/config/mips/linux.h +--- gcc-20011006/gcc/config/mips/linux.h 2004-01-13 06:15:28.000000000 -0600 ++++ gcc-20011006-new/gcc/config/mips/linux.h 2004-01-10 11:16:39.000000000 -0600 +@@ -154,6 +154,17 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC \ ++ "%(endian_spec) \ ++ %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ +@@ -163,6 +174,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ + %{static:-static}}}" ++#endif + + + #undef SUBTARGET_ASM_SPEC +diff -urN old/gcc-20011006/gcc/config/mips/t-linux-uclibc gcc-20011006/gcc/config/mips/t-linux-uclibc +--- old/gcc-20011006/gcc/config/mips/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-20011006/gcc/config/mips/t-linux-uclibc 2004-01-14 02:51:10.000000000 -0600 +@@ -0,0 +1 @@ ++T_CFLAGS = -DUSE_UCLIBC +diff -urN gcc-20011006/gcc/config/rs6000/linux.h gcc-20011006-new/gcc/config/rs6000/linux.h +--- gcc-20011006/gcc/config/rs6000/linux.h 2001-04-03 17:38:59.000000000 -0500 ++++ gcc-20011006-new/gcc/config/rs6000/linux.h 2004-01-10 11:15:38.000000000 -0600 +@@ -36,12 +36,21 @@ + #define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux)" + + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC "-m elf32ppclinux %{G*} %{shared:-shared} \ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}" ++#else + #define LINK_SPEC "-m elf32ppclinux %{G*} %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ + %{static:-static}}" ++#endif + + #undef LIB_DEFAULT_SPEC + #define LIB_DEFAULT_SPEC "%(lib_linux)" +diff -urN gcc-20011006/gcc/config/t-linux-uclibc gcc-20011006-new/gcc/config/t-linux-uclibc +--- gcc-20011006/gcc/config/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-20011006-new/gcc/config/t-linux-uclibc 2004-01-10 11:18:46.000000000 -0600 +@@ -0,0 +1,18 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++# Don't install "assert.h" in gcc. We use the one in glibc. ++INSTALL_ASSERT_H = ++ ++# Compile crtbeginS.o and crtendS.o with pic. ++CRTSTUFF_T_CFLAGS_S = -fPIC ++# Compile libgcc2.a with pic. ++TARGET_LIBGCC2_CFLAGS = -fPIC ++ ++# Do not build libgcc1. Let gcc generate those functions. The GNU/Linux ++# C library can handle them. ++LIBGCC1 = ++CROSS_LIBGCC1 = ++LIBGCC1_TEST = +diff -urN gcc-20011006/gcc/configure gcc-20011006-new/gcc/configure +--- gcc-20011006/gcc/configure 2004-01-13 06:15:28.000000000 -0600 ++++ gcc-20011006-new/gcc/configure 2004-01-10 11:28:54.000000000 -0600 +@@ -3219,6 +3219,24 @@ + ;; + esac + ;; ++ arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc ++ xm_file=arm/xm-linux.h ++ xmake_file=x-linux ++ tm_file="arm/linux-elf.h" ++ case $machine in ++ armv2*-*-*) ++ tm_file="arm/linux-elf26.h $tm_file" ++ ;; ++ esac ++ tmake_file="t-linux-uclibc arm/t-linux" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ case x${enable_threads} in ++ x | xyes | xpthreads | xposix) ++ thread_file='posix' ++ ;; ++ esac ++ ;; + arm*-*-aout) + tm_file=arm/aout.h + tmake_file=arm/t-bare +@@ -3631,6 +3649,18 @@ + thread_file='single' + fi + ;; ++ i[34567]86-*-linux*uclibc*) # Intel 80386's running GNU/Linux ++ # with ELF format using uClibc ++ xmake_file=x-linux ++ tm_file=i386/linux.h ++ tmake_file="t-linux-uclibc i386/t-crtstuff" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ float_format=i386 ++ if test x$enable_threads = xyes; then ++ thread_file='posix' ++ fi ++ ;; + i[34567]86-*-linux-gnu*) # Intel 80386's running GNU/Linux + # aka GNU/Linux C library 6 + xmake_file=x-linux +@@ -4696,7 +4726,19 @@ + # On NetBSD, the headers are already okay, except for math.h. + tmake_file=t-netbsd + ;; +- mips*-*-linux*) # Linux MIPS, either endian. ++ mips*-*-linux-uclibc*) # Linux (uclibc) MIPS, either endian. ++ tmake_file=mips/t-linux-uclibc ++ xmake_file=x-linux ++ xm_file="xm-siglist.h ${xm_file}" ++ case $machine in ++ mipsel-*) tm_file="mips/elfl.h mips/linux.h" ;; ++ *) tm_file="mips/elf.h mips/linux.h" ;; ++ esac ++ extra_parts="crtbegin.o crtend.o" ++ gnu_ld=yes ++ gas=yes ++ ;; ++ mips*-*-linux*) # Linux MIPS, either endian. + xmake_file=x-linux + xm_file="xm-siglist.h ${xm_file}" + case $machine in +@@ -5159,6 +5201,24 @@ + thread_file='posix' + fi + ;; ++ powerpc-*-linux-uclibc*) ++ tm_file=rs6000/linux.h ++ xm_file="xm-siglist.h rs6000/xm-sysv4.h" ++ xm_defines="USG ${xm_defines}" ++ out_file=rs6000/rs6000.c ++ if test x$gas = xyes ++ then ++ tmake_file="rs6000/t-ppcos t-linux-uclibc rs6000/t-ppccomm" ++ else ++ tmake_file="rs6000/t-ppc t-linux-uclibc rs6000/t-ppccomm" ++ fi ++ xmake_file=x-linux ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ extra_headers=ppc-asm.h ++ if test x$enable_threads = xyes; then ++ thread_file='posix' ++ fi ++ ;; + powerpc-wrs-vxworks*) + cpu_type=rs6000 + xm_file="xm-siglist.h rs6000/xm-sysv4.h" +diff -urN gcc-20011006/ltconfig gcc-20011006-new/ltconfig +--- gcc-20011006/ltconfig 1999-06-21 21:35:12.000000000 -0500 ++++ gcc-20011006-new/ltconfig 2004-01-10 11:34:23.000000000 -0600 +@@ -436,6 +436,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case "$host_os" in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1773,6 +1774,22 @@ + fi + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ++ file_magic_cmd=/usr/bin/file ++ file_magic_test_file=`echo /lib/libuClibc-*.so` ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + version_type=sunos + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then diff --git a/openwrt/toolchain/gcc/2.95/STLport-4.5.3.patch b/openwrt/toolchain/gcc/2.95/STLport-4.5.3.patch new file mode 100644 index 0000000000..fee65f9200 --- /dev/null +++ b/openwrt/toolchain/gcc/2.95/STLport-4.5.3.patch @@ -0,0 +1,407 @@ +diff -urN STLport-4.5.3/Makefile STLport-4.5.3-devel/Makefile +--- STLport-4.5.3/Makefile Wed Dec 31 17:00:00 1969 ++++ STLport-4.5.3-devel/Makefile Tue Jan 7 15:28:08 2003 +@@ -0,0 +1,44 @@ ++# Makefile to compile stlport with uClibc ++# ++# Copyright (C) 2002 Erik Andersen <andersen@codepoet.org> ++# ++# This program 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 2 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++# General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program; if not, write to the Free Software ++# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ ++ARCH:=i386 ++PREFIX:=/usr/$(ARCH)-linux-uclibc ++CROSS:= $(PREFIX)/../bin/$(ARCH)-linux-uclibc- ++CC=$(CROSS)gcc ++CXX=$(CROSS)g++ ++AR = $(CROSS)ar ++STRIP = $(CROSS)strip --remove-section=.comment --remove-section=.note --strip-unneeded ++.EXPORT_ALL_VARIABLES: ++ ++all: ++ rm -f lib/lib* ++ make -C src -f gcc-uClibc.mak all ++ (cd lib; rm -f libstdc++_debug.so; \ ++ ln -fs libstdc++.so.4.5 libstdc++.so; \ ++ ln -fs libstdc++.so.4.5 libstdc++.so.0;) ++ $(STRIP) lib/libstdc++.so.4.5; ++ ++clean: ++ make -C src -f gcc-uClibc.mak clean ++ rm -rf lib/* ++ ++install: ++ (cd lib; \ ++ cp -a libstdc++.a $(PREFIX)/lib; \ ++ cp -a libstdc++.so libstdc++.so.0 libstdc++.so.4.5 $(PREFIX)/lib;) ++ cp -a stlport $(PREFIX)/include/c++ +diff -urN STLport-4.5.3/src/dll_main.cpp STLport-4.5.3-devel/src/dll_main.cpp +--- STLport-4.5.3/src/dll_main.cpp Sat Feb 2 16:11:56 2002 ++++ STLport-4.5.3-devel/src/dll_main.cpp Tue Jan 7 15:28:08 2003 +@@ -52,7 +52,7 @@ + # include <locale> + # endif + +-# if defined (_STLP_UNIX) ++# if defined (_STLP_UNIX) && defined (_STLP_PTHREADS) && ! defined (_STLP_USE_UCLIBC) + # define _STLP_HAS_PERTHREAD_ALLOCATOR + # include <stl/_pthread_alloc.h> + # endif +diff -urN STLport-4.5.3/src/gcc-uClibc.mak STLport-4.5.3-devel/src/gcc-uClibc.mak +--- STLport-4.5.3/src/gcc-uClibc.mak Wed Dec 31 17:00:00 1969 ++++ STLport-4.5.3-devel/src/gcc-uClibc.mak Tue Jan 7 15:28:08 2003 +@@ -0,0 +1,61 @@ ++# ++# Basename for libraries ++# ++LIB_BASENAME:=libstdc++ ++LIB_SHAREDNAME:=$(LIB_BASENAME).so ++LIB_SHAREDNAME_FULL:=$(LIB_SHAREDNAME).0 ++ ++# ++# guts for common stuff ++# ++# ++LINK:=$(AR) -cr ++#DYN_LINK:=$(CC) -fno-exceptions -lpthread -lm -shared -Wl,-soname=$(LIB_SHAREDNAME_FULL) -o ++DYN_LINK:=$(CC) -fno-exceptions -shared -Wl,-soname=$(LIB_SHAREDNAME_FULL) -o ++ ++OBJEXT=o ++DYNEXT=so ++STEXT=a ++RM=rm -rf ++PATH_SEP=/ ++MKDIR=mkdir -p ++COMP=GCC$(ARCH) ++INSTALL_STEP = install_unix ++ ++all: release_dynamic release_static ++#all: all_dynamic all_static symbolic_links ++ ++include common_macros.mak ++STLDEBUG_NAME:=$(LIB_BASENAME).debug ++ ++# Lets disable exception support, since this saves over 200k... ++DEFINE_FLAGS:= -fno-exceptions ++#DEFINE_FLAGS:= -D_STLP_NO_EXCEPTIONS -fno-exceptions -DSTL_NO_EXCEPTIONS ++ ++#DEFINE_FLAGS+= -D_STLP_USE_UCLIBC -D_STLP_NO_WCHAR_T \ ++# -DUSE_SPRINTF_INSTEAD -D_ISOC99_SOURCE ++ ++WARNING_FLAGS:= -W -Wno-sign-compare -Wno-unused -Wno-uninitialized ++INCLUDE_FLAGS = -I${STLPORT_DIR} ++CXXFLAGS_COMMON = $(WARNING_FLAGS) $(DEFINE_FLAGS) $(INCLUDE_FLAGS) ++ ++CXXFLAGS_RELEASE_static = $(CXXFLAGS_COMMON) -Os ++CXXFLAGS_RELEASE_dynamic = $(CXXFLAGS_COMMON) -Os -fPIC ++ ++CXXFLAGS_DEBUG_static = $(CXXFLAGS_COMMON) -O -g ++CXXFLAGS_DEBUG_dynamic = $(CXXFLAGS_COMMON) -O -g -fPIC ++ ++CXXFLAGS_STLDEBUG_static = $(CXXFLAGS_DEBUG_static) -D_STLP_DEBUG ++CXXFLAGS_STLDEBUG_dynamic = $(CXXFLAGS_DEBUG_dynamic) -D_STLP_DEBUG -fPIC ++ ++include common_percent_rules.mak ++include common_rules.mak ++ ++ ++#install: all ++# cp -p $(LIB_TARGET) ${D_LIB_TARGET} ../lib ++ ++#%.s: %.cpp ++# $(CXX) $(CXXFLAGS) -O4 -S -pto $< -o $@ ++ ++ +diff -urN STLport-4.5.3/src/num_put_float.cpp STLport-4.5.3-devel/src/num_put_float.cpp +--- STLport-4.5.3/src/num_put_float.cpp Fri Jan 18 15:06:52 2002 ++++ STLport-4.5.3-devel/src/num_put_float.cpp Tue Jan 7 15:28:08 2003 +@@ -65,6 +65,12 @@ + + # endif + ++# if defined(_STLP_USE_UCLIBC) ++# define __USE_ISOC99 1 ++# include <math.h> ++# include <float.h> ++# endif ++ + # include <cstdlib> + + #if defined (_MSC_VER) || defined (__MINGW32__) || defined (__BORLANDC__) || defined (__DJGPP) || defined (_STLP_SCO_OPENSERVER) || defined (__NCR_SVR) +@@ -209,7 +215,7 @@ + + #ifdef USE_SPRINTF_INSTEAD + +-#elif defined (__hpux) || defined (__DJGPP) || ( defined(_STLP_USE_GLIBC) && ! defined (__MSL__) ) ++#elif defined (__hpux) || defined (__DJGPP) || ( defined(_STLP_USE_GLIBC) && ! defined (__MSL__) ) || defined (_STLP_USE_UCLIBC) + # if defined (isfinite) + inline bool _Stl_is_nan_or_inf(double x) { return !isfinite(x); } + # else +@@ -238,7 +244,7 @@ + } + inline bool _Stl_is_neg_inf(double x) { return _fpclass(x) == _FPCLASS_NINF; } + inline bool _Stl_is_neg_nan(double x) { return _isnan(x) && _copysign(1., x) < 0 ; } +-#elif defined(__MRC__) || defined(__SC__) //*TY 02/24/2000 - added support for MPW ++#elif defined(__MRC__) || defined(__SC__) + bool _Stl_is_nan_or_inf(double x) { return isnan(x) || !isfinite(x); } + bool _Stl_is_inf(double x) { return !isfinite(x); } + bool _Stl_is_neg_inf(double x) { return !isfinite(x) && signbit(x); } +@@ -280,7 +286,7 @@ + inline char* _Stl_qfcvtR(long double x, int n, int* pt, int* sign, char* buf) + { return fcvtbuf(x, n, pt, sign, buf); } + # endif +-#elif defined (_STLP_USE_GLIBC) ++#elif defined (_STLP_USE_GLIBC) || defined(_STLP_USE_UCLIBC) + inline char* _Stl_ecvtR(double x, int n, int* pt, int* sign, char* buf) + { return buf + ecvt_r(x, n, pt, sign, buf, NDIG+2); } + inline char* _Stl_fcvtR(double x, int n, int* pt, int* sign, char* buf) +diff -urN STLport-4.5.3/src/stdio_streambuf.cpp STLport-4.5.3-devel/src/stdio_streambuf.cpp +--- STLport-4.5.3/src/stdio_streambuf.cpp Thu Jan 10 11:41:52 2002 ++++ STLport-4.5.3-devel/src/stdio_streambuf.cpp Tue Jan 7 15:28:08 2003 +@@ -82,7 +82,7 @@ + _STLP_VENDOR_CSTD::fgetpos(_M_file, &pos); + // added 21 june 00 mdb,rjf,wjs: glibc 2.2 changed fpos_t to be a struct instead + // of a primitive type +-#if (defined(__GLIBC__) && ( (__GLIBC__ > 2) || ( (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2) ) ) ) ++#if defined(_STLP_USE_UCLIBC) || (defined(__GLIBC__) && defined(_STLP_USE_GLIBC) && ( (__GLIBC__ > 2) || ( (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2) ) ) ) + return pos_type((streamoff)pos.__pos); + #elif defined(__ISCPP__) || defined(__MVS__) || (__OS400__) + return pos_type(pos.__fpos_elem[ 0 ]); +@@ -101,13 +101,16 @@ + + // added 21 june 00 mdb,rjf,wjs: glibc 2.2 changed fpos_t to be a struct instead + // of a primitive type +-#if (defined(__GLIBC__) && ( (__GLIBC__ > 2) || ( (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2) ) ) ) ++#if (defined(__GLIBC__) && defined(_STLP_USE_GLIBC) && ( (__GLIBC__ > 2) || ( (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2) ) ) ) + fpos_t p; + p.__pos = pos; + memset( &(p.__state), 0, sizeof(p.__state) ); + #elif defined(__MVS__) || (__OS400__) + fpos_t p; + p.__fpos_elem[0] = pos; ++#elif defined(_STLP_USE_UCLIBC) ++ fpos_t p; ++ p.__pos = pos; + #else + fpos_t p(pos); + #endif +diff -urN STLport-4.5.3/stlport/config/_prolog.h STLport-4.5.3-devel/stlport/config/_prolog.h +--- STLport-4.5.3/stlport/config/_prolog.h Sun Oct 28 13:26:44 2001 ++++ STLport-4.5.3-devel/stlport/config/_prolog.h Tue Jan 7 15:28:08 2003 +@@ -1,3 +1,8 @@ ++/* Evil hack to make sure everything behaves itself */ ++#define _STLP_USE_UCLIBC ++//#define _STLP_NO_WCHAR_T ++//#define _ISOC99_SOURCE ++//#define USE_SPRINTF_INSTEAD + + #if defined (_STLP_MSVC) || defined (__ICL) || defined (__BORLANDC__) + +diff -urN STLport-4.5.3/stlport/config/stl_gcc.h STLport-4.5.3-devel/stlport/config/stl_gcc.h +--- STLport-4.5.3/stlport/config/stl_gcc.h Thu Jan 10 11:41:58 2002 ++++ STLport-4.5.3-devel/stlport/config/stl_gcc.h Tue Jan 7 15:28:08 2003 +@@ -3,7 +3,7 @@ + */ + + /* Systems having GLIBC installed have different traits */ +-#if ! defined (_STLP_USE_GLIBC) && ( defined (__linux__) || defined (__CYGWIN__) ) ++#if ! defined (_STLP_USE_GLIBC) && ! defined (_STLP_USE_UCLIBC) && ( defined (__linux__) || defined (__CYGWIN__) ) + # define _STLP_USE_GLIBC + #endif + +diff -urN STLport-4.5.3/stlport/cstdlib STLport-4.5.3-devel/stlport/cstdlib +--- STLport-4.5.3/stlport/cstdlib Thu Aug 23 15:51:54 2001 ++++ STLport-4.5.3-devel/stlport/cstdlib Tue Jan 7 15:28:08 2003 +@@ -55,9 +55,11 @@ + using _STLP_VENDOR_CSTD::atof; + using _STLP_VENDOR_CSTD::atoi; + using _STLP_VENDOR_CSTD::atol; ++# ifndef _STLP_USE_UCLIBC + using _STLP_VENDOR_CSTD::mblen; + using _STLP_VENDOR_CSTD::mbstowcs; + using _STLP_VENDOR_CSTD::mbtowc; ++# endif + using _STLP_VENDOR_CSTD::strtod; + using _STLP_VENDOR_CSTD::strtol; + using _STLP_VENDOR_CSTD::strtoul; +diff -urN STLport-4.5.3/stlport/stl/_config.h STLport-4.5.3-devel/stlport/stl/_config.h +--- STLport-4.5.3/stlport/stl/_config.h Fri Jan 18 15:08:36 2002 ++++ STLport-4.5.3-devel/stlport/stl/_config.h Tue Jan 7 15:28:08 2003 +@@ -26,6 +26,16 @@ + #ifndef _STLP_CONFIG_H + # define _STLP_CONFIG_H + ++/* Make the STLport headers provide uClibc support by default */ ++#define _STLP_NO_EXCEPTIONS 1 ++#define STL_NO_EXCEPTIONS 1 ++#define _STLP_USE_UCLIBC 1 ++//#define _STLP_NO_WCHAR_T 1 ++#define _STLP_NO_LONG_DOUBLE 1 ++#define USE_SPRINTF_INSTEAD 1 ++#define _ISOC99_SOURCE 1 ++#define _STLP_NO_ANACHRONISMS 1 ++ + /* + * Purpose of this file : + * +@@ -164,7 +174,7 @@ + /* Operating system recognition (basic) */ + # if defined (__unix) || defined (__linux__) || defined (__QNX__) || defined (_AIX) || defined (__NetBSD__) || defined (__Lynx__) + # define _STLP_UNIX 1 +-# if defined (__linux__) && ! defined (_STLP_USE_GLIBC) ++# if defined (__linux__) && ! defined (_STLP_USE_GLIBC) && ! defined (_STLP_USE_UCLIBC) + # define _STLP_USE_GLIBC 1 + # endif + # elif defined(macintosh) || defined (_MAC) +diff -urN STLport-4.5.3/stlport/stl/_stdio_file.h STLport-4.5.3-devel/stlport/stl/_stdio_file.h +--- STLport-4.5.3/stlport/stl/_stdio_file.h Fri Jan 18 15:07:00 2002 ++++ STLport-4.5.3-devel/stlport/stl/_stdio_file.h Tue Jan 7 15:28:08 2003 +@@ -634,6 +634,112 @@ + } + # define _STLP_FILE_I_O_IDENTICAL + ++#elif defined(_STLP_USE_UCLIBC) ++ ++#if defined(__MASK_READING) ++ ++inline int _FILE_fd(const FILE *__f) { return __f->__filedes; } ++ ++// Returns a pointer to the beginning of the buffer. ++inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->__bufstart; } ++ ++// Returns the current read/write position within the buffer. ++inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->__bufpos; } ++ ++// Returns a pointer immediately past the end of the buffer. ++inline char* _FILE_I_end(const FILE *__f) { return (char*)__f->__bufend; } ++ ++// Returns the number of characters remaining in the buffer, i.e. ++// _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f). ++inline ptrdiff_t _FILE_I_avail(const FILE *__f) ++ { return __f->__bufgetc_u - __f->__bufpos; } ++ ++// Increments the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_preincr(FILE *__f) { return *(char*)(++__f->__bufpos); } ++ ++// Increments the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_postincr(FILE *__f) { return *(char*)(__f->__bufpos++); } ++ ++// Decrements the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_predecr(FILE *__f) { return *(char*)(--__f->__bufpos); } ++ ++// Decrements the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_postdecr(FILE *__f) { return *(char*)(__f->__bufpos--); } ++ ++// Increments the current read/write position by __n. ++inline void _FILE_I_bump(FILE *__f, int __n) { __f->__bufpos += __n; } ++ ++// Sets the beginning of the bufer to __begin, the current read/write ++// position to __next, and the buffer's past-the-end pointer to __end. ++// If any of those pointers is null, then all of them must be null. ++inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) ++{ ++ __f->__bufstart = (unsigned char*)__begin; ++ __f->__bufpos = (unsigned char*)__next; ++ __f->__bufend = (unsigned char*)__end; ++ __f->__bufgetc_u = (unsigned char*)__begin; ++ __f->__bufputc_u = (unsigned char*)__end; ++} ++ ++# define _STLP_FILE_I_O_IDENTICAL ++ ++#else // Support old stdio for a little while. ++ ++inline int _FILE_fd(const FILE *__f) { return __f->filedes; } ++ ++// Returns a pointer to the beginning of the buffer. ++inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->bufstart; } ++ ++// Returns the current read/write position within the buffer. ++inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->bufpos; } ++ ++// Returns a pointer immediately past the end of the buffer. ++inline char* _FILE_I_end(const FILE *__f) { return (char*)__f->bufend; } ++ ++// Returns the number of characters remaining in the buffer, i.e. ++// _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f). ++inline ptrdiff_t _FILE_I_avail(const FILE *__f) ++ { return __f->bufgetc - __f->bufpos; } ++ ++// Increments the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_preincr(FILE *__f) { return *(char*)(++__f->bufpos); } ++ ++// Increments the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_postincr(FILE *__f) { return *(char*)(__f->bufpos++); } ++ ++// Decrements the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_predecr(FILE *__f) { return *(char*)(--__f->bufpos); } ++ ++// Decrements the current read/write position by 1, returning the ++// character at the old position. ++inline char& _FILE_I_postdecr(FILE *__f) { return *(char*)(__f->bufpos--); } ++ ++// Increments the current read/write position by __n. ++inline void _FILE_I_bump(FILE *__f, int __n) { __f->bufpos += __n; } ++ ++// Sets the beginning of the bufer to __begin, the current read/write ++// position to __next, and the buffer's past-the-end pointer to __end. ++// If any of those pointers is null, then all of them must be null. ++inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) ++{ ++ __f->bufstart = (unsigned char*)__begin; ++ __f->bufpos = (unsigned char*)__next; ++ __f->bufend = (unsigned char*)__end; ++ __f->bufgetc = (unsigned char*)__begin; ++ __f->bufputc = (unsigned char*)__end; ++} ++ ++# define _STLP_FILE_I_O_IDENTICAL ++ ++#endif ++ + #else /* A C library that we don't have an implementation for. */ + + # error The C++ I/O library is not configured for this compiler +diff -urN STLport-4.5.3/stlport/stl/c_locale.h STLport-4.5.3-devel/stlport/stl/c_locale.h +--- STLport-4.5.3/stlport/stl/c_locale.h Fri Jan 18 15:07:00 2002 ++++ STLport-4.5.3-devel/stlport/stl/c_locale.h Wed Jan 8 10:58:10 2003 +@@ -401,6 +401,21 @@ + # define _Locale_SPACE _S + # define _Locale_PRINT (_P | _U | _L | _N | _B) + # define _Locale_ALPHA (_U | _L) ++ ++# elif defined(_STLP_USE_UCLIBC) /* linux, using the gnu compiler */ ++ ++# define _Locale_CNTRL _IScntrl ++# define _Locale_UPPER _ISupper ++# define _Locale_LOWER _ISlower ++# define _Locale_DIGIT _ISdigit ++# define _Locale_XDIGIT _ISxdigit ++# define _Locale_PUNCT _ISpunct ++# define _Locale_SPACE _ISspace ++# define _Locale_PRINT _ISprint ++# define _Locale_ALPHA _ISalpha ++ ++#else ++# error Unknown Locale + #endif + + # endif /* _STLP_C_LOCALE_H */ diff --git a/openwrt/toolchain/gcc/3.3.3/100-uclibc-conf.patch b/openwrt/toolchain/gcc/3.3.3/100-uclibc-conf.patch new file mode 100644 index 0000000000..4bbe21b7aa --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.3/100-uclibc-conf.patch @@ -0,0 +1,1635 @@ +diff -urN gcc-3.3.3-dist/boehm-gc/config.sub gcc-3.3.3/boehm-gc/config.sub +--- gcc-3.3.3-dist/boehm-gc/config.sub 2002-02-11 22:37:53.000000000 -0600 ++++ gcc-3.3.3/boehm-gc/config.sub 2004-08-12 04:47:51.000000000 -0500 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | storm-chaos* | os2-emx* | windows32-*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1089,7 +1089,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN gcc-3.3.3-dist/boehm-gc/configure gcc-3.3.3/boehm-gc/configure +--- gcc-3.3.3-dist/boehm-gc/configure 2004-02-14 14:34:20.000000000 -0600 ++++ gcc-3.3.3/boehm-gc/configure 2004-08-12 04:47:51.000000000 -0500 +@@ -1940,6 +1940,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN gcc-3.3.3-dist/config.sub gcc-3.3.3/config.sub +--- gcc-3.3.3-dist/config.sub 2003-01-30 17:25:36.000000000 -0600 ++++ gcc-3.3.3/config.sub 2004-08-12 04:47:51.000000000 -0500 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1112,7 +1112,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN gcc-3.3.3-dist/gcc/config/arm/linux-elf.h gcc-3.3.3/gcc/config/arm/linux-elf.h +--- gcc-3.3.3-dist/gcc/config/arm/linux-elf.h 2003-09-16 10:39:23.000000000 -0500 ++++ gcc-3.3.3/gcc/config/arm/linux-elf.h 2004-08-12 04:47:51.000000000 -0500 +@@ -78,6 +78,18 @@ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC "%{h*} %{version:-v} \ ++ %{b} %{Wl,*:%*} \ ++ %{static:-Bstatic} \ ++ %{shared:-shared} \ ++ %{symbolic:-Bsymbolic} \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ ++ -X \ ++ %{mbig-endian:-EB}" \ ++ SUBTARGET_EXTRA_LINK_SPEC ++#else + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ +@@ -88,6 +100,7 @@ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC ++#endif + + #define TARGET_OS_CPP_BUILTINS() \ + do { \ +diff -urN gcc-3.3.3-dist/gcc/config/cris/linux.h gcc-3.3.3/gcc/config/cris/linux.h +--- gcc-3.3.3-dist/gcc/config/cris/linux.h 2003-03-10 21:01:35.000000000 -0600 ++++ gcc-3.3.3/gcc/config/cris/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -81,6 +81,25 @@ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -95,6 +114,8 @@ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +diff -urN gcc-3.3.3-dist/gcc/config/cris/t-linux-uclibc gcc-3.3.3/gcc/config/cris/t-linux-uclibc +--- gcc-3.3.3-dist/gcc/config/cris/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/cris/t-linux-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,3 @@ ++T_CFLAGS = -DUSE_UCLIBC ++TARGET_LIBGCC2_CFLAGS += -fPIC ++CRTSTUFF_T_CFLAGS_S = $(TARGET_LIBGCC2_CFLAGS) +diff -urN gcc-3.3.3-dist/gcc/config/i386/linux.h gcc-3.3.3/gcc/config/i386/linux.h +--- gcc-3.3.3-dist/gcc/config/i386/linux.h 2003-11-14 00:46:12.000000000 -0600 ++++ gcc-3.3.3/gcc/config/i386/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -136,6 +136,15 @@ + %{static:-static}}}" + #endif + #else ++#if defined USE_UCLIBC ++#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ +@@ -144,6 +153,7 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}}}" + #endif ++#endif + + /* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named +diff -urN gcc-3.3.3-dist/gcc/config/mips/linux.h gcc-3.3.3/gcc/config/mips/linux.h +--- gcc-3.3.3-dist/gcc/config/mips/linux.h 2003-12-23 02:58:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/mips/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -175,6 +175,17 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC \ ++ "%(endian_spec) \ ++ %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ +@@ -184,6 +195,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ + %{static:-static}}}" ++#endif + + #undef SUBTARGET_ASM_SPEC + #define SUBTARGET_ASM_SPEC "\ +diff -urN gcc-3.3.3-dist/gcc/config/sh/linux.h gcc-3.3.3/gcc/config/sh/linux.h +--- gcc-3.3.3-dist/gcc/config/sh/linux.h 2003-11-06 17:13:33.000000000 -0600 ++++ gcc-3.3.3/gcc/config/sh/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -44,12 +44,21 @@ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define SUBTARGET_LINK_SPEC \ ++ "%{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}" ++#else + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}" ++#endif + + /* The GNU C++ standard library requires that these macros be defined. */ + #undef CPLUSPLUS_CPP_SPEC +diff -urN gcc-3.3.3-dist/gcc/config/sh/t-linux-uclibc gcc-3.3.3/gcc/config/sh/t-linux-uclibc +--- gcc-3.3.3-dist/gcc/config/sh/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/sh/t-linux-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,16 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++TARGET_LIBGCC2_CFLAGS = -fpic ++LIB1ASMFUNCS_CACHE = _ic_invalidate ++ ++LIB2FUNCS_EXTRA= ++ ++MULTILIB_OPTIONS= $(MULTILIB_ENDIAN) m3e/m4 ++MULTILIB_DIRNAMES= ++MULTILIB_MATCHES = ++MULTILIB_EXCEPTIONS= ++ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o +diff -urN gcc-3.3.3-dist/gcc/config/sh/t-sh64-uclibc gcc-3.3.3/gcc/config/sh/t-sh64-uclibc +--- gcc-3.3.3-dist/gcc/config/sh/t-sh64-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/sh/t-sh64-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,13 @@ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o ++ ++LIB1ASMFUNCS = \ ++ _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ ++ _shcompact_call_trampoline _shcompact_return_trampoline \ ++ _shcompact_incoming_args _ic_invalidate _nested_trampoline \ ++ _push_pop_shmedia_regs \ ++ _udivdi3 _divdi3 _umoddi3 _moddi3 ++ ++MULTILIB_OPTIONS = $(MULTILIB_ENDIAN) m5-32media-nofpu/m5-compact/m5-compact-nofpu/m5-64media/m5-64media-nofpu ++MULTILIB_DIRNAMES= $(MULTILIB_ENDIAN) nofpu compact nofpu/compact media64 nofpu/media64 ++MULTILIB_MATCHES= ++MULTILIB_EXCEPTIONS= +diff -urN gcc-3.3.3-dist/gcc/config/t-linux-uclibc gcc-3.3.3/gcc/config/t-linux-uclibc +--- gcc-3.3.3-dist/gcc/config/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/t-linux-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,23 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++# Compile crtbeginS.o and crtendS.o with pic. ++CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC ++# Compile libgcc2.a with pic. ++TARGET_LIBGCC2_CFLAGS = -fPIC ++ ++# Override t-slibgcc-elf-ver to export some libgcc symbols with ++# the symbol versions that glibc used. ++SHLIB_MAPFILES += $(srcdir)/config/libgcc-glibc.ver ++ ++# Use unwind-dw2-fde-glibc ++#LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde-glibc.c \ ++# $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c ++#LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h unwind-dw2-fde.c ++ ++# Use unwind-dw2-fde ++LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ ++ $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c ++LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h +diff -urN gcc-3.3.3-dist/gcc/config.gcc gcc-3.3.3/gcc/config.gcc +--- gcc-3.3.3-dist/gcc/config.gcc 2004-01-21 00:06:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config.gcc 2004-08-12 04:47:51.000000000 -0500 +@@ -697,6 +697,17 @@ + extra_parts="" + use_collect2=yes + ;; ++arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc ++ tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ case x${enable_threads} in ++ x | xyes | xpthreads | xposix) ++ thread_file='posix' ++ ;; ++ esac ++ ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h" + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" +@@ -772,6 +783,10 @@ + tmake_file="cris/t-cris cris/t-elfmulti" + gas=yes + ;; ++cris-*-linux-uclibc*) ++ tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" ++ tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux-uclibc" ++ ;; + cris-*-linux*) + tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" + tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux" +@@ -1173,6 +1188,11 @@ + thread_file='single' + fi + ;; ++i[34567]86-*-linux*uclibc*) # Intel 80386's running GNU/Linux ++ # with ELF format using uClibc ++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc i386/t-crtstuff" ++ ;; + i[34567]86-*-linux*) # Intel 80386's running GNU/Linux + # with ELF format using glibc 2 + # aka GNU/Linux C library 6 +@@ -1883,6 +1903,16 @@ + tm_file="elfos.h ${tm_file} mips/netbsd.h" + tmake_file="${tmake_file} mips/t-netbsd" + ;; ++mips*-*-linux-uclibc*) # Linux MIPS, either endian. uClibc ++ tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" ++ case $machine in ++ mipsisa32*-*) ++ target_cpu_default="MASK_SOFT_FLOAT" ++ tm_defines="MIPS_ISA_DEFAULT=32" ++ ;; ++ esac ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc mips/t-linux" ++ ;; + mips*-*-linux*) # Linux MIPS, either endian. + tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" + case $machine in +@@ -2129,6 +2159,11 @@ + out_file=rs6000/rs6000.c + tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" + ;; ++powerpc-*-linux-uclibc*) ++ tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" ++ out_file=rs6000/rs6000.c ++ tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-linux-uclibc rs6000/t-ppccomm" ++ ;; + powerpc-*-linux*) + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" + out_file=rs6000/rs6000.c +@@ -2313,10 +2348,18 @@ + tmake_file="${tmake_file} sh/t-le" + ;; + esac +- tmake_file="${tmake_file} sh/t-linux" ++ case $machine in ++ *-*-linux-uclibc*) tmake_file="${tmake_file} sh/t-linux-uclibc" ;; ++ *) tmake_file="${tmake_file} sh/t-linux" ;; ++ esac + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/linux.h" + gas=yes gnu_ld=yes + case $machine in ++ sh64*-*-linux-uclibc*) ++ tmake_file="${tmake_file} sh/t-sh64-uclibc" ++ tm_file="${tm_file} sh/sh64.h" ++ extra_headers="shmedia.h ushmedia.h sshmedia.h" ++ ;; + sh64*) + tmake_file="${tmake_file} sh/t-sh64" + tm_file="${tm_file} sh/sh64.h" +diff -urN gcc-3.3.3-dist/libstdc++-v3/aclocal.m4 gcc-3.3.3/libstdc++-v3/aclocal.m4 +--- gcc-3.3.3-dist/libstdc++-v3/aclocal.m4 2004-01-12 10:18:44.000000000 -0600 ++++ gcc-3.3.3/libstdc++-v3/aclocal.m4 2004-08-12 04:47:51.000000000 -0500 +@@ -1216,6 +1216,9 @@ + dnl Default to "generic" + if test x$enable_clocale_flag = xno; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu*) + AC_EGREP_CPP([_GLIBCPP_ok], [ + #include <features.h> +@@ -1339,6 +1342,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ xuclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcpp_MOFILES="$glibcpp_MOFILES $ling.mo"; \ ++ glibcpp_POFILES="$glibcpp_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcpp_MOFILES) ++ AC_SUBST(glibcpp_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/uclibc/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + *) + echo "$enable_clocale is an unknown locale package" 1>&2 + exit 1 +diff -urN gcc-3.3.3-dist/libstdc++-v3/configure gcc-3.3.3/libstdc++-v3/configure +--- gcc-3.3.3-dist/libstdc++-v3/configure 2004-01-12 10:18:45.000000000 -0600 ++++ gcc-3.3.3/libstdc++-v3/configure 2004-08-12 04:49:13.000000000 -0500 +@@ -2010,6 +2010,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -2996,6 +3001,9 @@ + + if test x$enable_clocale_flag = xno; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu*) + cat > conftest.$ac_ext <<EOF + #line 3002 "configure" +@@ -3182,6 +3190,70 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ xuclibc) ++ echo "$ac_t""uclibc" 1>&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++echo "configure:3117: checking for $ac_word" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_check_msgfmt'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ++ ac_dummy="$PATH" ++ for ac_dir in $ac_dummy; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ ac_cv_prog_check_msgfmt="yes" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt="$ac_cv_prog_check_msgfmt" ++if test -n "$check_msgfmt"; then ++ echo "$ac_t""$check_msgfmt" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcpp_MOFILES="$glibcpp_MOFILES $ling.mo"; \ ++ glibcpp_POFILES="$glibcpp_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/uclibc/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + *) + echo "$enable_clocale is an unknown locale package" 1>&2 + exit 1 +@@ -4212,6 +4284,968 @@ + # GLIBCPP_CHECK_MATH_SUPPORT + + case "$target" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h locale.h float.h inttypes.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4224: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4229 "configure" ++#include "confdefs.h" ++#include <$ac_hdr> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4234: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_hdr 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++fi ++done ++ ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ ++ ++ # If we're not using GNU ld, then there's no point in even trying these ++ # tests. Check for that first. We should have already tested for gld ++ # by now (in libtool), but require it now just to be safe... ++ test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS='' ++ test -z "$OPT_LDFLAGS" && OPT_LDFLAGS='' ++ ++ ++ # The name set by libtool depends on the version of libtool. Shame on us ++ # for depending on an impl detail, but c'est la vie. Older versions used ++ # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on ++ # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually ++ # makes sense). We'll test with_gnu_ld everywhere else, so if that isn't ++ # set (hence we're using an older libtool), then set it. ++ if test x${with_gnu_ld+set} != xset; then ++ if test x${ac_cv_prog_gnu_ld+set} != xset; then ++ # We got through "ac_require(ac_prog_ld)" and still not set? Huh? ++ with_gnu_ld=no ++ else ++ with_gnu_ld=$ac_cv_prog_gnu_ld ++ fi ++ fi ++ ++ # Start by getting the version number. I think the libtool test already ++ # does some of this, but throws away the result. ++ ++ ldver=`$LD --version 2>/dev/null | head -1 | \ ++ sed -e 's/GNU ld version \([0-9.][0-9.]*\).*/\1/'` ++ ++ glibcpp_gnu_ld_version=`echo $ldver | \ ++ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` ++ ++ # Set --gc-sections. ++ if test "$with_gnu_ld" = "notbroken"; then ++ # GNU ld it is! Joy and bunny rabbits! ++ ++ # All these tests are for C++; save the language and the compiler flags. ++ # Need to do this so that g++ won't try to link in libstdc++ ++ ac_test_CFLAGS="${CFLAGS+set}" ++ ac_save_CFLAGS="$CFLAGS" ++ CFLAGS='-x c++ -Wl,--gc-sections' ++ ++ # Check for -Wl,--gc-sections ++ # XXX This test is broken at the moment, as symbols required for ++ # linking are now in libsupc++ (not built yet.....). In addition, ++ # this test has cored on solaris in the past. In addition, ++ # --gc-sections doesn't really work at the moment (keeps on discarding ++ # used sections, first .eh_frame and now some of the glibc sections for ++ # iconv). Bzzzzt. Thanks for playing, maybe next time. ++ echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6 ++echo "configure:4312: checking for ld that supports -Wl,--gc-sections" >&5 ++ if test "$cross_compiling" = yes; then ++ ac_sectionLDflags=yes ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4317 "configure" ++#include "confdefs.h" ++ ++ int main(void) ++ { ++ try { throw 1; } ++ catch (...) { }; ++ return 0; ++ } ++ ++EOF ++if { (eval echo configure:4328: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ++then ++ ac_sectionLDflags=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -fr conftest* ++ ac_sectionLDflags=no ++fi ++rm -fr conftest* ++fi ++ ++ if test "$ac_test_CFLAGS" = set; then ++ CFLAGS="$ac_save_CFLAGS" ++ else ++ # this is the suspicious part ++ CFLAGS='' ++ fi ++ if test "$ac_sectionLDflags" = "yes"; then ++ SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" ++ fi ++ echo "$ac_t""$ac_sectionLDflags" 1>&6 ++ fi ++ ++ # Set linker optimization flags. ++ if test x"$with_gnu_ld" = x"yes"; then ++ OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS" ++ fi ++ ++ ++ ++ ++ ++ echo $ac_n "checking for main in -lm""... $ac_c" 1>&6 ++echo "configure:4362: checking for main in -lm" >&5 ++ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ ac_save_LIBS="$LIBS" ++LIBS="-lm $LIBS" ++cat > conftest.$ac_ext <<EOF ++#line 4370 "configure" ++#include "confdefs.h" ++ ++int main() { ++main() ++; return 0; } ++EOF ++if { (eval echo configure:4377: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \ ++ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_lib 1 ++EOF ++ ++ LIBS="-lm $LIBS" ++ ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ for ac_func in nan copysignf ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4407: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4412 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4435: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo" ++fi ++done ++ ++ ++ for ac_func in __signbit ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4464: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4469 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4492: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++LIBMATHOBJS="$LIBMATHOBJS signbit.lo" ++fi ++done ++ ++ for ac_func in __signbitf ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4520: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4525 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4548: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++LIBMATHOBJS="$LIBMATHOBJS signbitf.lo" ++fi ++done ++ ++ ++ if test x$ac_cv_func_copysignl = x"yes"; then ++ for ac_func in __signbitl ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4578: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4583 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4606: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++LIBMATHOBJS="$LIBMATHOBJS signbitl.lo" ++fi ++done ++ ++ fi ++ ++ if test -n "$LIBMATHOBJS"; then ++ need_libmath=yes ++ fi ++ ++ ++ ++if test "$need_libmath" = yes; then ++ GLIBCPP_BUILD_LIBMATH_TRUE= ++ GLIBCPP_BUILD_LIBMATH_FALSE='#' ++else ++ GLIBCPP_BUILD_LIBMATH_TRUE='#' ++ GLIBCPP_BUILD_LIBMATH_FALSE= ++fi ++ ++ ++ enable_wchar_t=no ++ ++ echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6 ++echo "configure:4651: checking for mbstate_t" >&5 ++ cat > conftest.$ac_ext <<EOF ++#line 4653 "configure" ++#include "confdefs.h" ++#include <wchar.h> ++int main() { ++mbstate_t teststate; ++; return 0; } ++EOF ++if { (eval echo configure:4660: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ have_mbstate_t=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ have_mbstate_t=no ++fi ++rm -f conftest* ++ echo "$ac_t""$have_mbstate_t" 1>&6 ++ if test x"$have_mbstate_t" = xyes; then ++ cat >> confdefs.h <<\EOF ++#define HAVE_MBSTATE_T 1 ++EOF ++ ++ fi ++ ++ for ac_hdr in wchar.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4682: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4687 "configure" ++#include "confdefs.h" ++#include <$ac_hdr> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4692: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_hdr 1 ++EOF ++ ac_has_wchar_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_wchar_h=no ++fi ++done ++ ++ for ac_hdr in wctype.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4723: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4728 "configure" ++#include "confdefs.h" ++#include <$ac_hdr> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4733: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_hdr 1 ++EOF ++ ac_has_wctype_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_wctype_h=no ++fi ++done ++ ++ ++ if test x"$ac_has_wchar_h" = xyes && ++ test x"$ac_has_wctype_h" = xyes && ++ test x"$enable_c_mbchar" != xno; then ++ ++ echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6 ++echo "configure:4766: checking for WCHAR_MIN and WCHAR_MAX" >&5 ++ cat > conftest.$ac_ext <<EOF ++#line 4768 "configure" ++#include "confdefs.h" ++#include <wchar.h> ++int main() { ++int i = WCHAR_MIN; int j = WCHAR_MAX; ++; return 0; } ++EOF ++if { (eval echo configure:4775: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ has_wchar_minmax=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ has_wchar_minmax=no ++fi ++rm -f conftest* ++ echo "$ac_t""$has_wchar_minmax" 1>&6 ++ ++ echo $ac_n "checking for WEOF""... $ac_c" 1>&6 ++echo "configure:4788: checking for WEOF" >&5 ++ cat > conftest.$ac_ext <<EOF ++#line 4790 "configure" ++#include "confdefs.h" ++ ++ #include <wchar.h> ++ #include <stddef.h> ++int main() { ++wint_t i = WEOF; ++; return 0; } ++EOF ++if { (eval echo configure:4799: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ has_weof=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ has_weof=no ++fi ++rm -f conftest* ++ echo "$ac_t""$has_weof" 1>&6 ++ ++ ac_wfuncs=yes ++ for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4815: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4820 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4843: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++\ ++ ac_wfuncs=no ++fi ++done ++ ++ ++ for ac_func in btowc wctob fgetwc fgetws fputwc fputws fwide \ ++ fwprintf fwscanf swprintf swscanf vfwprintf vfwscanf vswprintf vswscanf \ ++ vwprintf vwscanf wprintf wscanf getwc getwchar mbsinit mbrlen mbrtowc \ ++ mbsrtowcs wcsrtombs putwc putwchar ungetwc wcrtomb wcstod wcstof wcstol \ ++ wcstoul wcscpy wcsncpy wcscat wcsncat wcscmp wcscoll wcsncmp wcsxfrm \ ++ wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4878: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4883 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4906: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++\ ++ ac_wfuncs=no ++fi ++done ++ ++ ++ echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6 ++echo "configure:4934: checking for ISO C99 wchar_t support" >&5 ++ if test x"$has_weof" = xyes && ++ test x"$has_wchar_minmax" = xyes && ++ test x"$ac_wfuncs" = xyes; then ++ ac_isoC99_wchar_t=yes ++ else ++ ac_isoC99_wchar_t=no ++ fi ++ echo "$ac_t""$ac_isoC99_wchar_t" 1>&6 ++ ++ ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for iconv.h""... $ac_c" 1>&6 ++echo "configure:4946: checking for iconv.h" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4951 "configure" ++#include "confdefs.h" ++#include <iconv.h> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4956: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_has_iconv_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_iconv_h=no ++fi ++ ++ ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6 ++echo "configure:4980: checking for langinfo.h" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4985 "configure" ++#include "confdefs.h" ++#include <langinfo.h> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4990: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_has_langinfo_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_langinfo_h=no ++fi ++ ++ ++ echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6 ++echo "configure:5014: checking for iconv in -liconv" >&5 ++ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ ac_save_LIBS="$LIBS" ++LIBS="-liconv $LIBS" ++cat > conftest.$ac_ext <<EOF ++#line 5022 "configure" ++#include "confdefs.h" ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char iconv(); ++ ++int main() { ++iconv() ++; return 0; } ++EOF ++if { (eval echo configure:5033: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ libiconv="-liconv" ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ ac_save_LIBS="$LIBS" ++ LIBS="$LIBS $libiconv" ++ ++ for ac_func in iconv_open iconv_close iconv nl_langinfo ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:5059: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 5064 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:5087: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ \ ++ ac_XPG2funcs=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_XPG2funcs=no ++fi ++done ++ ++ ++ LIBS="$ac_save_LIBS" ++ ++ echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6 ++echo "configure:5117: checking for XPG2 wchar_t support" >&5 ++ if test x"$ac_has_iconv_h" = xyes && ++ test x"$ac_has_langinfo_h" = xyes && ++ test x"$ac_XPG2funcs" = xyes; then ++ ac_XPG2_wchar_t=yes ++ else ++ ac_XPG2_wchar_t=no ++ fi ++ echo "$ac_t""$ac_XPG2_wchar_t" 1>&6 ++ ++ if test x"$ac_isoC99_wchar_t" = xyes && ++ test x"$ac_XPG2_wchar_t" = xyes; then ++ cat >> confdefs.h <<\EOF ++#define _GLIBCPP_USE_WCHAR_T 1 ++EOF ++ ++ enable_wchar_t=yes ++ fi ++ fi ++ echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6 ++echo "configure:5137: checking for enabled wchar_t specializations" >&5 ++ echo "$ac_t""$enable_wchar_t" 1>&6 ++ ++ ++if test "$enable_wchar_t" = yes; then ++ GLIBCPP_TEST_WCHAR_T_TRUE= ++ GLIBCPP_TEST_WCHAR_T_FALSE='#' ++else ++ GLIBCPP_TEST_WCHAR_T_TRUE='#' ++ GLIBCPP_TEST_WCHAR_T_FALSE= ++fi ++ ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_COPYSIGN 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_FINITE 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_FINITEF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISINF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISINFF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISNAN 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISNANF 1 ++EOF ++ ;; + *-linux*) + os_include_dir="os/gnu-linux" + for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \ +diff -urN gcc-3.3.3-dist/libstdc++-v3/configure.in gcc-3.3.3/libstdc++-v3/configure.in +--- gcc-3.3.3-dist/libstdc++-v3/configure.in 2004-01-12 10:19:22.000000000 -0600 ++++ gcc-3.3.3/libstdc++-v3/configure.in 2004-08-12 04:47:51.000000000 -0500 +@@ -117,6 +117,36 @@ + # GLIBCPP_CHECK_MATH_SUPPORT + + case "$target" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h locale.h float.h inttypes.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCPP_CHECK_LINKER_FEATURES ++ GLIBCPP_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCPP_CHECK_WCHAR_T_SUPPORT ++ ++ AC_DEFINE(HAVE_COPYSIGN) ++ #AC_DEFINE(HAVE_COPYSIGNF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ #AC_DEFINE(HAVE_FREXPF) ++ #AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++ #AC_DEFINE(HAVE_SINCOS) ++ #AC_DEFINE(HAVE_SINCOSF) ++ #if test x"long_double_math_on_this_cpu" = x"yes"; then ++ #AC_DEFINE(HAVE_FINITEL) ++ #AC_DEFINE(HAVE_HYPOTL) ++ #AC_DEFINE(HAVE_ISINFL) ++ #AC_DEFINE(HAVE_ISNANL) ++ #fi ++ ;; + *-linux*) + os_include_dir="os/gnu-linux" + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ +diff -urN gcc-3.3.3-dist/libstdc++-v3/configure.target gcc-3.3.3/libstdc++-v3/configure.target +--- gcc-3.3.3-dist/libstdc++-v3/configure.target 2003-10-01 14:07:07.000000000 -0500 ++++ gcc-3.3.3/libstdc++-v3/configure.target 2004-08-12 04:47:51.000000000 -0500 +@@ -133,6 +133,9 @@ + freebsd*) + os_include_dir="os/bsd/freebsd" + ;; ++ linux-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; + gnu* | linux*) + os_include_dir="os/gnu-linux" + ;; +diff -urN gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cstdlib.h gcc-3.3.3/libstdc++-v3/include/c_std/std_cstdlib.h +--- gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cstdlib.h 2003-04-18 05:08:05.000000000 -0500 ++++ gcc-3.3.3/libstdc++-v3/include/c_std/std_cstdlib.h 2004-08-12 04:47:51.000000000 -0500 +@@ -101,9 +101,11 @@ + using ::labs; + using ::ldiv; + using ::malloc; ++#if _GLIBCPP_USE_WCHAR_T + using ::mblen; + using ::mbstowcs; + using ::mbtowc; ++#endif + using ::qsort; + using ::rand; + using ::realloc; +@@ -112,8 +114,10 @@ + using ::strtol; + using ::strtoul; + using ::system; ++#if _GLIBCPP_USE_WCHAR_T + using ::wcstombs; + using ::wctomb; ++#endif + + inline long + abs(long __i) { return labs(__i); } +diff -urN gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cwchar.h gcc-3.3.3/libstdc++-v3/include/c_std/std_cwchar.h +--- gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cwchar.h 2003-04-18 05:08:05.000000000 -0500 ++++ gcc-3.3.3/libstdc++-v3/include/c_std/std_cwchar.h 2004-08-12 04:47:51.000000000 -0500 +@@ -165,7 +165,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#ifdef HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; +diff -urN gcc-3.3.3-dist/libtool.m4 gcc-3.3.3/libtool.m4 +--- gcc-3.3.3-dist/libtool.m4 2003-09-09 03:04:17.000000000 -0500 ++++ gcc-3.3.3/libtool.m4 2004-08-12 04:47:51.000000000 -0500 +@@ -687,6 +687,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gcc-3.3.3-dist/ltconfig gcc-3.3.3/ltconfig +--- gcc-3.3.3-dist/ltconfig 2003-02-19 20:10:02.000000000 -0600 ++++ gcc-3.3.3/ltconfig 2004-08-12 04:47:51.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1247,6 +1248,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/gcc/3.3.3/110-uclibc-conf.patch b/openwrt/toolchain/gcc/3.3.3/110-uclibc-conf.patch new file mode 100644 index 0000000000..f297c3283f --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.3/110-uclibc-conf.patch @@ -0,0 +1,55 @@ +Use the patch by Carl Miller <chaz@energoncube.net> for powerpc, with +some minor modifications. Changed *os_uclibc to *os_linux_uclibc since +at some point we might support other platforms. Also updated to 3.3.3. +diff -urN gcc-3.3.3/gcc/config/rs6000/linux.h gcc-3.3.3-new/gcc/config/rs6000/linux.h +--- gcc-3.3.3/gcc/config/rs6000/linux.h 2003-11-14 00:46:10.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/rs6000/linux.h 2004-02-16 21:13:40.000000000 -0600 +@@ -64,7 +64,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #undef TARGET_VERSION + #define TARGET_VERSION fprintf (stderr, " (PowerPC GNU/Linux)"); +diff -urN gcc-3.3.3/gcc/config/rs6000/sysv4.h gcc-3.3.3-new/gcc/config/rs6000/sysv4.h +--- gcc-3.3.3/gcc/config/rs6000/sysv4.h 2003-10-28 13:55:41.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/rs6000/sysv4.h 2004-02-16 21:13:40.000000000 -0600 +@@ -968,9 +968,11 @@ + %{mcall-linux: %(link_os_linux) } \ + %{mcall-gnu: %(link_os_gnu) } \ + %{mcall-netbsd: %(link_os_netbsd) } \ ++%{mcall-uclibc: %(link_os_linux_uclibc) } \ + %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: \ + %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: \ +- %{!mcall-netbsd: %(link_os_default) }}}}}}}}}" ++ %{!mcall-netbsd: %{!mcall-uclibc: \ ++ %(link_os_default) }}}}}}}}}}" + + #define LINK_OS_DEFAULT_SPEC "" + +@@ -1307,6 +1309,12 @@ + + #define LINK_OS_WINDISS_SPEC "" + ++/* uClibc support for Linux. */ ++ ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + /* Define any extra SPECS that the compiler needs to generate. */ + /* Override rs6000.h definition. */ + #undef SUBTARGET_EXTRA_SPECS +@@ -1372,6 +1380,7 @@ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_vxworks", LINK_OS_VXWORKS_SPEC }, \ + { "link_os_windiss", LINK_OS_WINDISS_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_default", LINK_OS_DEFAULT_SPEC }, \ + { "cc1_endian_big", CC1_ENDIAN_BIG_SPEC }, \ + { "cc1_endian_little", CC1_ENDIAN_LITTLE_SPEC }, \ diff --git a/openwrt/toolchain/gcc/3.3.3/120-softfloat.patch b/openwrt/toolchain/gcc/3.3.3/120-softfloat.patch new file mode 100644 index 0000000000..f2431896cf --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.3/120-softfloat.patch @@ -0,0 +1,14 @@ +--- gcc-3.3.2-old/configure.in 2003-08-09 01:57:21.000000000 -0500 ++++ gcc-3.3.2/configure.in 2004-01-15 12:46:29.000000000 -0600 +@@ -1418,6 +1418,11 @@ + fi + + FLAGS_FOR_TARGET= ++case " $targargs " in ++ *" --nfp "* | *" --without-float "*) ++ FLAGS_FOR_TARGET=$FLAGS_FOR_TARGET' -msoft-float' ++ ;; ++esac + case " $target_configdirs " in + *" newlib "*) + case " $targargs " in diff --git a/openwrt/toolchain/gcc/3.3.3/200-uclibc-locale.patch b/openwrt/toolchain/gcc/3.3.3/200-uclibc-locale.patch new file mode 100644 index 0000000000..5880d834b4 --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.3/200-uclibc-locale.patch @@ -0,0 +1,3021 @@ +Warning! This patch is not finished. The wide char time-related stuff +is broken or non-functional. But it serves as a starting point to get +things building while I continue to work on the uClibc locale internals. +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2004-01-09 07:55:02.000000000 -0600 +@@ -0,0 +1,63 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek <jakub@redhat.com> ++ ++#include <clocale> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strtol_l) __strtol_l; ++extern "C" __typeof(strtoll_l) __strtoll_l; ++extern "C" __typeof(strtoul_l) __strtoul_l; ++extern "C" __typeof(strtoull_l) __strtoull_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#endif // GLIBC 2.3 and later +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.cc 2004-01-09 08:37:55.000000000 -0600 +@@ -0,0 +1,231 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <stdexcept> ++#include <langinfo.h> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, long& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long __l = __strtol_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __l; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, unsigned long& __v, ++ ios_base::iostate& __err, const __c_locale& __cloc, ++ int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ unsigned long __ul = __strtoul_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ul; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++#ifdef _GLIBCPP_USE_LONG_LONG ++ template<> ++ void ++ __convert_to_v(const char* __s, long long& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long long __ll = __strtoll_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ll; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, unsigned long long& __v, ++ ios_base::iostate& __err, const __c_locale& __cloc, ++ int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ unsigned long long __ull = __strtoull_l(__s, &__sanity, __base, ++ __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ull; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++#endif ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error("attempt to create locale from unknown name"); ++ } ++#else ++ __cloc = NULL; ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_locale != __cloc) ++ __freelocale(__cloc); ++#else ++ __cloc = NULL; ++#endif ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ { return __duplocale(__cloc); } ++#else ++ { return __c_locale(); } ++#endif ++ ++ const char* locale::_S_categories[_S_categories_size ++ + _S_extra_categories_size] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES" ++#if _GLIBCPP_NUM_CATEGORIES != 0 ++ , ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} // namespace std +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.h 2004-01-09 07:51:06.000000000 -0600 +@@ -0,0 +1,118 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifndef _CPP_BITS_C_LOCALE_H ++#define _CPP_BITS_C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include <clocale> ++#include <langinfo.h> // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include <iconv.h> // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include <libintl.h> // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCPP_C_LOCALE_GNU for ++#endif ++#define _GLIBCPP_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCPP_NUM_CATEGORIES 6 ++#define _GLIBCPP_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template<typename _Tv> ++ int ++ __convert_from_v(char* __out, const int __size, const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec = -1) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec = -1) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = setlocale(LC_ALL, NULL); ++ char* __sav = static_cast<char*>(malloc(strlen(__old) + 1)); ++ if (__sav) ++ strcpy(__sav, __old); ++ setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ int __ret; ++ if (__prec >= 0) ++ __ret = snprintf(__out, __size, __fmt, __prec, __v); ++ else ++ __ret = snprintf(__out, __size, __fmt, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ setlocale(LC_ALL, __sav); ++ free(__sav); ++#endif ++ return __ret; ++ } ++} ++ ++#endif +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2004-01-09 04:04:34.000000000 -0600 +@@ -0,0 +1,113 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCPP_USE_WCHAR_T ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = error; ++ size_t __len = min(__from_end - __from, __to_end - __to); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_c_locale); ++#endif ++ size_t __conv = wcsrtombs(__to, &__from, __len, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ if (__conv == __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = ok; ++ } ++ else if (__conv > 0 && __conv < __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = partial; ++ } ++ else ++ __ret = error; ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = error; ++ size_t __len = min(__from_end - __from, __to_end - __to); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_c_locale); ++#endif ++ size_t __conv = mbsrtowcs(__to, &__from, __len, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ if (__conv == __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = ok; ++ } ++ else if (__conv > 0 && __conv < __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = partial; ++ } ++ else ++ __ret = error; ++ ++ return __ret; ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h 2004-01-09 01:53:51.000000000 -0600 +@@ -0,0 +1,461 @@ ++// Locale support (codecvt) -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 Template class codecvt ++// ++ ++// Warning: this file is not meant for user inclusion. Use <locale>. ++ ++// Written by Benjamin Kosnik <bkoz@cygnus.com> ++ ++ // XXX ++ // Define this here to codecvt.cc can have _S_max_size definition. ++#define _GLIBCPP_USE___ENC_TRAITS 1 ++ ++ // Extension to use icov for dealing with character encodings, ++ // including conversions and comparisons between various character ++ // sets. This object encapsulates data that may need to be shared between ++ // char_traits, codecvt and ctype. ++ class __enc_traits ++ { ++ public: ++ // Types: ++ // NB: A conversion descriptor subsumes and enhances the ++ // functionality of a simple state type such as mbstate_t. ++ typedef iconv_t __desc_type; ++ ++ protected: ++ // Data Members: ++ // Max size of charset encoding name ++ static const int _S_max_size = 32; ++ // Name of internal character set encoding. ++ char _M_int_enc[_S_max_size]; ++ // Name of external character set encoding. ++ char _M_ext_enc[_S_max_size]; ++ ++ // Conversion descriptor between external encoding to internal encoding. ++ __desc_type _M_in_desc; ++ // Conversion descriptor between internal encoding to external encoding. ++ __desc_type _M_out_desc; ++ ++ // Details the byte-order marker for the external encoding, if necessary. ++ int _M_ext_bom; ++ ++ // Details the byte-order marker for the internal encoding, if necessary. ++ int _M_int_bom; ++ ++ public: ++ explicit __enc_traits() ++ : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0) ++ { ++ memset(_M_int_enc, 0, _S_max_size); ++ memset(_M_ext_enc, 0, _S_max_size); ++ } ++ ++ explicit __enc_traits(const char* __int, const char* __ext, ++ int __ibom = 0, int __ebom = 0) ++ : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0) ++ { ++ strncpy(_M_int_enc, __int, _S_max_size); ++ strncpy(_M_ext_enc, __ext, _S_max_size); ++ } ++ ++ // 21.1.2 traits typedefs ++ // p4 ++ // typedef STATE_T state_type ++ // requires: state_type shall meet the requirements of ++ // CopyConstructible types (20.1.3) ++ __enc_traits(const __enc_traits& __obj): _M_in_desc(0), _M_out_desc(0) ++ { ++ strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size); ++ strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size); ++ _M_ext_bom = __obj._M_ext_bom; ++ _M_int_bom = __obj._M_int_bom; ++ } ++ ++ // Need assignment operator as well. ++ __enc_traits& ++ operator=(const __enc_traits& __obj) ++ { ++ strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size); ++ strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size); ++ _M_in_desc = 0; ++ _M_out_desc = 0; ++ _M_ext_bom = __obj._M_ext_bom; ++ _M_int_bom = __obj._M_int_bom; ++ return *this; ++ } ++ ++ ~__enc_traits() ++ { ++ __desc_type __err = reinterpret_cast<iconv_t>(-1); ++ if (_M_in_desc && _M_in_desc != __err) ++ iconv_close(_M_in_desc); ++ if (_M_out_desc && _M_out_desc != __err) ++ iconv_close(_M_out_desc); ++ } ++ ++ void ++ _M_init() ++ { ++ const __desc_type __err = reinterpret_cast<iconv_t>(-1); ++ if (!_M_in_desc) ++ { ++ _M_in_desc = iconv_open(_M_int_enc, _M_ext_enc); ++ if (_M_in_desc == __err) ++ __throw_runtime_error("creating iconv input descriptor failed."); ++ } ++ if (!_M_out_desc) ++ { ++ _M_out_desc = iconv_open(_M_ext_enc, _M_int_enc); ++ if (_M_out_desc == __err) ++ __throw_runtime_error("creating iconv output descriptor failed."); ++ } ++ } ++ ++ bool ++ _M_good() ++ { ++ const __desc_type __err = reinterpret_cast<iconv_t>(-1); ++ bool __test = _M_in_desc && _M_in_desc != __err; ++ __test &= _M_out_desc && _M_out_desc != __err; ++ return __test; ++ } ++ ++ const __desc_type* ++ _M_get_in_descriptor() ++ { return &_M_in_desc; } ++ ++ const __desc_type* ++ _M_get_out_descriptor() ++ { return &_M_out_desc; } ++ ++ int ++ _M_get_external_bom() ++ { return _M_ext_bom; } ++ ++ int ++ _M_get_internal_bom() ++ { return _M_int_bom; } ++ ++ const char* ++ _M_get_internal_enc() ++ { return _M_int_enc; } ++ ++ const char* ++ _M_get_external_enc() ++ { return _M_ext_enc; } ++ }; ++ ++ // Partial specialization ++ // This specialization takes advantage of iconv to provide code ++ // conversions between a large number of character encodings. ++ template<typename _InternT, typename _ExternT> ++ class codecvt<_InternT, _ExternT, __enc_traits> ++ : public __codecvt_abstract_base<_InternT, _ExternT, __enc_traits> ++ { ++ public: ++ // Types: ++ typedef codecvt_base::result result; ++ typedef _InternT intern_type; ++ typedef _ExternT extern_type; ++ typedef __enc_traits state_type; ++ typedef __enc_traits::__desc_type __desc_type; ++ typedef __enc_traits __enc_type; ++ ++ // Data Members: ++ static locale::id id; ++ ++ explicit ++ codecvt(size_t __refs = 0) ++ : __codecvt_abstract_base<intern_type, extern_type, state_type>(__refs) ++ { } ++ ++ explicit ++ codecvt(__enc_type* __enc, size_t __refs = 0) ++ : __codecvt_abstract_base<intern_type, extern_type, state_type>(__refs) ++ { } ++ ++ protected: ++ virtual ++ ~codecvt() { } ++ ++ virtual result ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const; ++ ++ virtual result ++ do_unshift(state_type& __state, extern_type* __to, ++ extern_type* __to_end, extern_type*& __to_next) const; ++ ++ virtual result ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const; ++ ++ virtual int ++ do_encoding() const throw(); ++ ++ virtual bool ++ do_always_noconv() const throw(); ++ ++ virtual int ++ do_length(const state_type&, const extern_type* __from, ++ const extern_type* __end, size_t __max) const; ++ ++ virtual int ++ do_max_length() const throw(); ++ }; ++ ++ template<typename _InternT, typename _ExternT> ++ locale::id ++ codecvt<_InternT, _ExternT, __enc_traits>::id; ++ ++ // This adaptor works around the signature problems of the second ++ // argument to iconv(): SUSv2 and others use 'const char**', but glibc 2.2 ++ // uses 'char**', which matches the POSIX 1003.1-2001 standard. ++ // Using this adaptor, g++ will do the work for us. ++ template<typename _T> ++ inline size_t ++ __iconv_adaptor(size_t(*__func)(iconv_t, _T, size_t*, char**, size_t*), ++ iconv_t __cd, char** __inbuf, size_t* __inbytes, ++ char** __outbuf, size_t* __outbytes) ++ { return __func(__cd, (_T)__inbuf, __inbytes, __outbuf, __outbytes); } ++ ++ template<typename _InternT, typename _ExternT> ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_out_descriptor(); ++ const size_t __fmultiple = sizeof(intern_type); ++ size_t __fbytes = __fmultiple * (__from_end - __from); ++ const size_t __tmultiple = sizeof(extern_type); ++ size_t __tbytes = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast<char*>(__to); ++ char* __cfrom; ++ size_t __conv; ++ ++ // Some encodings need a byte order marker as the first item ++ // in the byte stream, to designate endian-ness. The default ++ // value for the byte order marker is NULL, so if this is ++ // the case, it's not necessary and we can just go on our ++ // merry way. ++ int __int_bom = __state._M_get_internal_bom(); ++ if (__int_bom) ++ { ++ size_t __size = __from_end - __from; ++ intern_type* __cfixed = static_cast<intern_type*>(__builtin_alloca(sizeof(intern_type) * (__size + 1))); ++ __cfixed[0] = static_cast<intern_type>(__int_bom); ++ char_traits<intern_type>::copy(__cfixed + 1, __from, __size); ++ __cfrom = reinterpret_cast<char*>(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__fbytes, &__cto, &__tbytes); ++ } ++ else ++ { ++ intern_type* __cfixed = const_cast<intern_type*>(__from); ++ __cfrom = reinterpret_cast<char*>(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, &__fbytes, ++ &__cto, &__tbytes); ++ } ++ ++ if (__conv != size_t(-1)) ++ { ++ __from_next = reinterpret_cast<const intern_type*>(__cfrom); ++ __to_next = reinterpret_cast<extern_type*>(__cto); ++ __ret = codecvt_base::ok; ++ } ++ else ++ { ++ if (__fbytes < __fmultiple * (__from_end - __from)) ++ { ++ __from_next = reinterpret_cast<const intern_type*>(__cfrom); ++ __to_next = reinterpret_cast<extern_type*>(__cto); ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ } ++ return __ret; ++ } ++ ++ template<typename _InternT, typename _ExternT> ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_unshift(state_type& __state, extern_type* __to, ++ extern_type* __to_end, extern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_in_descriptor(); ++ const size_t __tmultiple = sizeof(intern_type); ++ size_t __tlen = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast<char*>(__to); ++ size_t __conv = __iconv_adaptor(iconv,*__desc, NULL, NULL, ++ &__cto, &__tlen); ++ ++ if (__conv != size_t(-1)) ++ { ++ __to_next = reinterpret_cast<extern_type*>(__cto); ++ if (__tlen == __tmultiple * (__to_end - __to)) ++ __ret = codecvt_base::noconv; ++ else if (__tlen == 0) ++ __ret = codecvt_base::ok; ++ else ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ return __ret; ++ } ++ ++ template<typename _InternT, typename _ExternT> ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_in_descriptor(); ++ const size_t __fmultiple = sizeof(extern_type); ++ size_t __flen = __fmultiple * (__from_end - __from); ++ const size_t __tmultiple = sizeof(intern_type); ++ size_t __tlen = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast<char*>(__to); ++ char* __cfrom; ++ size_t __conv; ++ ++ // Some encodings need a byte order marker as the first item ++ // in the byte stream, to designate endian-ness. The default ++ // value for the byte order marker is NULL, so if this is ++ // the case, it's not necessary and we can just go on our ++ // merry way. ++ int __ext_bom = __state._M_get_external_bom(); ++ if (__ext_bom) ++ { ++ size_t __size = __from_end - __from; ++ extern_type* __cfixed = static_cast<extern_type*>(__builtin_alloca(sizeof(extern_type) * (__size + 1))); ++ __cfixed[0] = static_cast<extern_type>(__ext_bom); ++ char_traits<extern_type>::copy(__cfixed + 1, __from, __size); ++ __cfrom = reinterpret_cast<char*>(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__flen, &__cto, &__tlen); ++ } ++ else ++ { ++ extern_type* __cfixed = const_cast<extern_type*>(__from); ++ __cfrom = reinterpret_cast<char*>(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__flen, &__cto, &__tlen); ++ } ++ ++ ++ if (__conv != size_t(-1)) ++ { ++ __from_next = reinterpret_cast<const extern_type*>(__cfrom); ++ __to_next = reinterpret_cast<intern_type*>(__cto); ++ __ret = codecvt_base::ok; ++ } ++ else ++ { ++ if (__flen < static_cast<size_t>(__from_end - __from)) ++ { ++ __from_next = reinterpret_cast<const extern_type*>(__cfrom); ++ __to_next = reinterpret_cast<intern_type*>(__cto); ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ } ++ return __ret; ++ } ++ ++ template<typename _InternT, typename _ExternT> ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_encoding() const throw() ++ { ++ int __ret = 0; ++ if (sizeof(_ExternT) <= sizeof(_InternT)) ++ __ret = sizeof(_InternT)/sizeof(_ExternT); ++ return __ret; ++ } ++ ++ template<typename _InternT, typename _ExternT> ++ bool ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_always_noconv() const throw() ++ { return false; } ++ ++ template<typename _InternT, typename _ExternT> ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_length(const state_type&, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { return min(__max, static_cast<size_t>(__end - __from)); } ++ ++#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS ++// 74. Garbled text for codecvt::do_max_length ++ template<typename _InternT, typename _ExternT> ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_max_length() const throw() ++ { return 1; } ++#endif +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/collate_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/collate_members.cc 2004-01-09 08:06:24.000000000 -0600 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate<char>::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<char>::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ int ++ collate<wchar_t>::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/ctype_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2004-01-09 08:15:41.000000000 -0600 +@@ -0,0 +1,274 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype<char> specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname<char>::ctype_byname(const char* __s, size_t __refs) ++ : ctype<char>(0, false, __refs) ++ { ++ _S_destroy_c_locale(_M_c_locale_ctype); ++ _S_create_c_locale(_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_toupper = _M_c_locale_ctype->__ctype_toupper; ++ _M_tolower = _M_c_locale_ctype->__ctype_tolower; ++ _M_table = _M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ ctype<wchar_t>::__wmask_type ++ ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = 0; ++ } ++ return __ret; ++ }; ++ ++ wchar_t ++ ctype<wchar_t>::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype<wchar_t>:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ { ++ const mask __bit = static_cast<mask>(_ISbit(__bitcur)); ++ if (__m & __bit) ++ __ret |= __iswctype_l(__c, _M_convert_to_wmask(__bit), ++ _M_c_locale_ctype); ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (;__lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ { ++ const mask __bit = static_cast<mask>(_ISbit(__bitcur)); ++ if (__iswctype_l(*__lo, _M_convert_to_wmask(__bit), ++ _M_c_locale_ctype)) ++ __m |= __bit; ++ } ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype<wchar_t>:: ++ do_widen(char __c) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wchar_t __ret = btowc(__c); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ const char* ++ ctype<wchar_t>:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ mbstate_t __state; ++ memset(static_cast<void*>(&__state), 0, sizeof(mbstate_t)); ++ mbsrtowcs(__dest, &__lo, __hi - __lo, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ char ++ ctype<wchar_t>:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ size_t __offset = 0; ++ while (true) ++ { ++ const wchar_t* __start = __lo + __offset; ++ size_t __len = __hi - __start; ++ ++ mbstate_t __state; ++ memset(static_cast<void*>(&__state), 0, sizeof(mbstate_t)); ++ size_t __con = wcsrtombs(__dest + __offset, &__start, __len, &__state); ++ if (__con != __len && __start != 0) ++ { ++ __offset = __start - __lo; ++ __dest[__offset++] = __dfault; ++ } ++ else ++ break; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++#endif // _GLIBCPP_USE_WCHAR_T ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.cc 2004-01-09 08:46:16.000000000 -0600 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages<char>::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast<const char*>(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ wstring ++ messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.h 2004-01-09 08:52:48.000000000 -0600 +@@ -0,0 +1,122 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::messages(size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_messages = _S_c_name; ++#endif ++ _M_c_locale_messages = _S_c_locale; ++ } ++ ++ template<typename _CharT> ++ messages<_CharT>::messages(__c_locale __cloc, ++ const char* __s, size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_messages = new char[strlen(__s) + 1]; ++ strcpy(_M_name_messages, __s); ++#endif ++ _M_c_locale_messages = _S_clone_c_locale(__cloc); ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::~messages() ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_messages) ++ delete [] _M_name_messages; ++#endif ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string<char>& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template<typename _CharT> ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template<typename _CharT> ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_messages) ++ delete [] _M_name_messages; ++ _M_name_messages = new char[strlen(__s) + 1]; ++ strcpy(_M_name_messages, __s); ++#endif ++ _S_destroy_c_locale(_M_c_locale_messages); ++ _S_create_c_locale(_M_c_locale_messages, __s); ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/monetary_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2004-01-09 18:20:23.000000000 -0600 +@@ -0,0 +1,578 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = space; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[0] = sign; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[0] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = space; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__space) ++ { ++ // Have space. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ } ++ else ++ { ++ // Have none. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__space) ++ { ++ // Have space. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ } ++ else ++ { ++ // Have none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ default: ++ ; ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ _M_curr_symbol = ""; ++ _M_positive_sign = ""; ++ _M_negative_sign = ""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc)); ++ _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_negative_sign = "()"; ++ else ++ _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ ++ // _Intl == true ++ _M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ _M_curr_symbol = ""; ++ _M_positive_sign = ""; ++ _M_negative_sign = ""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc)); ++ _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_negative_sign = "()"; ++ else ++ _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ ++ // _Intl == false ++ _M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct<char, true>::~moneypunct() ++ { } ++ ++ template<> ++ moneypunct<char, false>::~moneypunct() ++ { } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ _M_curr_symbol = L""; ++ _M_positive_sign = L""; ++ _M_negative_sign = L""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ ++ _M_thousands_sep = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cpossign, __len, &__state); ++ _M_positive_sign = __wcs; ++ } ++ else ++ _M_positive_sign = L""; ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cnegsign, __len, &__state); ++ _M_negative_sign = __wcs; ++ } ++ else ++ _M_negative_sign = L""; ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_curr_symbol = __wcs; ++ } ++ else ++ _M_curr_symbol = L""; ++ ++ _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ _M_curr_symbol = L""; ++ _M_positive_sign = L""; ++ _M_negative_sign = L""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ _M_thousands_sep = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cpossign, __len, &__state); ++ _M_positive_sign = __wcs; ++ } ++ else ++ _M_positive_sign = L""; ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cnegsign, __len, &__state); ++ _M_negative_sign = __wcs; ++ } ++ else ++ _M_negative_sign = L""; ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_curr_symbol = __wcs; ++ } ++ else ++ _M_curr_symbol = L""; ++ ++ _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct<wchar_t, true>::~moneypunct() ++ { ++ if (wcslen(_M_positive_sign)) ++ delete [] _M_positive_sign; ++ if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0)) ++ delete [] _M_negative_sign; ++ if (wcslen(_M_curr_symbol)) ++ delete [] _M_curr_symbol; ++ } ++ ++ template<> ++ moneypunct<wchar_t, false>::~moneypunct() ++ { ++ if (wcslen(_M_positive_sign)) ++ delete [] _M_positive_sign; ++ if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0)) ++ delete [] _M_negative_sign; ++ if (wcslen(_M_curr_symbol)) ++ delete [] _M_curr_symbol; ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/numeric_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2004-01-09 18:20:59.000000000 -0600 +@@ -0,0 +1,129 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct<char>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(RADIXCHAR, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(THOUSEP, __cloc)); ++ // Check for NUL, which implies no grouping. ++ if (_M_thousands_sep == '\0') ++ _M_grouping = ""; ++ else ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ } ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_truename = "true"; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_falsename = "false"; ++ } ++ ++ template<> ++ numpunct<char>::~numpunct() ++ { } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ _M_thousands_sep = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ if (_M_thousands_sep == L'\0') ++ _M_grouping = ""; ++ else ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ } ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_truename = L"true"; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_falsename = L"false"; ++ } ++ ++ template<> ++ numpunct<wchar_t>::~numpunct() ++ { } ++ #endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.cc 2004-01-09 08:25:03.000000000 -0600 +@@ -0,0 +1,341 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct<char>:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __strftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_c_locale; ++ ++ _M_date_format = "%m/%d/%y"; ++ _M_date_era_format = "%m/%d/%y"; ++ _M_time_format = "%H:%M:%S"; ++ _M_time_era_format = "%H:%M:%S"; ++ _M_date_time_format = ""; ++ _M_date_time_era_format = ""; ++ _M_am = "AM"; ++ _M_pm = "PM"; ++ _M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = "Sunday"; ++ _M_day2 = "Monday"; ++ _M_day3 = "Tuesday"; ++ _M_day4 = "Wednesday"; ++ _M_day5 = "Thursday"; ++ _M_day6 = "Friday"; ++ _M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = "Sun"; ++ _M_day_a2 = "Mon"; ++ _M_day_a3 = "Tue"; ++ _M_day_a4 = "Wed"; ++ _M_day_a5 = "Thu"; ++ _M_day_a6 = "Fri"; ++ _M_day_a7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = "January"; ++ _M_month02 = "February"; ++ _M_month03 = "March"; ++ _M_month04 = "April"; ++ _M_month05 = "May"; ++ _M_month06 = "June"; ++ _M_month07 = "July"; ++ _M_month08 = "August"; ++ _M_month09 = "September"; ++ _M_month10 = "October"; ++ _M_month11 = "November"; ++ _M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = "Jan"; ++ _M_month_a02 = "Feb"; ++ _M_month_a03 = "Mar"; ++ _M_month_a04 = "Apr"; ++ _M_month_a05 = "May"; ++ _M_month_a06 = "Jun"; ++ _M_month_a07 = "July"; ++ _M_month_a08 = "Aug"; ++ _M_month_a09 = "Sep"; ++ _M_month_a10 = "Oct"; ++ _M_month_a11 = "Nov"; ++ _M_month_a12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc); ++ _M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_day_a2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_day_a3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_day_a4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_day_a5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_day_a6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_day_a7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_month_a02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_month_a03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_month_a04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_month_a05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_month_a06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_month_a07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_month_a08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_month_a09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_month_a10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_month_a11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_month_a12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ __timepunct<wchar_t>:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_c_locale; ++ ++ _M_date_format = L"%m/%d/%y"; ++ _M_date_era_format = L"%m/%d/%y"; ++ _M_time_format = L"%H:%M:%S"; ++ _M_time_era_format = L"%H:%M:%S"; ++ _M_date_time_format = L""; ++ _M_date_time_era_format = L""; ++ _M_am = L"AM"; ++ _M_pm = L"PM"; ++ _M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = L"Sunday"; ++ _M_day2 = L"Monday"; ++ _M_day3 = L"Tuesday"; ++ _M_day4 = L"Wednesday"; ++ _M_day5 = L"Thursday"; ++ _M_day6 = L"Friday"; ++ _M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = L"Sun"; ++ _M_day_a2 = L"Mon"; ++ _M_day_a3 = L"Tue"; ++ _M_day_a4 = L"Wed"; ++ _M_day_a5 = L"Thu"; ++ _M_day_a6 = L"Fri"; ++ _M_day_a7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = L"January"; ++ _M_month02 = L"February"; ++ _M_month03 = L"March"; ++ _M_month04 = L"April"; ++ _M_month05 = L"May"; ++ _M_month06 = L"June"; ++ _M_month07 = L"July"; ++ _M_month08 = L"August"; ++ _M_month09 = L"September"; ++ _M_month10 = L"October"; ++ _M_month11 = L"November"; ++ _M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = L"Jan"; ++ _M_month_a02 = L"Feb"; ++ _M_month_a03 = L"Mar"; ++ _M_month_a04 = L"Apr"; ++ _M_month_a05 = L"May"; ++ _M_month_a06 = L"Jun"; ++ _M_month_a07 = L"July"; ++ _M_month_a08 = L"Aug"; ++ _M_month_a09 = L"Sep"; ++ _M_month_a10 = L"Oct"; ++ _M_month_a11 = L"Nov"; ++ _M_month_a12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_date_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_FMT, __cloc)); ++ _M_date_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc)); ++ _M_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT, __cloc)); ++ _M_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc)); ++ _M_date_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_T_FMT, __cloc)); ++ _M_date_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc)); ++ _M_am = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WAM_STR, __cloc)); ++ _M_pm = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WPM_STR, __cloc)); ++ _M_am_pm_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc)); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_1, __cloc)); ++ _M_day2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_2, __cloc)); ++ _M_day3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_3, __cloc)); ++ _M_day4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_4, __cloc)); ++ _M_day5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_5, __cloc)); ++ _M_day6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_6, __cloc)); ++ _M_day7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_7, __cloc)); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_1, __cloc)); ++ _M_day_a2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_2, __cloc)); ++ _M_day_a3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_3, __cloc)); ++ _M_day_a4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_4, __cloc)); ++ _M_day_a5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_5, __cloc)); ++ _M_day_a6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_6, __cloc)); ++ _M_day_a7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_7, __cloc)); ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_1, __cloc)); ++ _M_month02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_2, __cloc)); ++ _M_month03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_3, __cloc)); ++ _M_month04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_4, __cloc)); ++ _M_month05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_5, __cloc)); ++ _M_month06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_6, __cloc)); ++ _M_month07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_7, __cloc)); ++ _M_month08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_8, __cloc)); ++ _M_month09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_9, __cloc)); ++ _M_month10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_10, __cloc)); ++ _M_month11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_11, __cloc)); ++ _M_month12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_12, __cloc)); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_1, __cloc)); ++ _M_month_a02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_2, __cloc)); ++ _M_month_a03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_3, __cloc)); ++ _M_month_a04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_4, __cloc)); ++ _M_month_a05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_5, __cloc)); ++ _M_month_a06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_6, __cloc)); ++ _M_month_a07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_7, __cloc)); ++ _M_month_a08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_8, __cloc)); ++ _M_month_a09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_9, __cloc)); ++ _M_month_a10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_10, __cloc)); ++ _M_month_a11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_11, __cloc)); ++ _M_month_a12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_12, __cloc)); ++ } ++#endif // 0 ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.h 2004-01-09 04:26:21.000000000 -0600 +@@ -0,0 +1,68 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_timepunct = _S_c_name; ++#endif ++ _M_initialize_timepunct(); ++ } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, ++ const char* __s, ++ size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_timepunct = new char[strlen(__s) + 1]; ++ strcpy(_M_name_timepunct, __s); ++#endif ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::~__timepunct() ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_timepunct) ++ delete [] _M_name_timepunct; ++#endif ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_base.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_base.h 2004-01-09 02:54:54.000000000 -0600 +@@ -0,0 +1,57 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ // NB: Offsets into ctype<char>::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISgraph; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalnum; ++ }; +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_inline.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_inline.h 2002-06-24 00:49:19.000000000 -0500 +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype<char>:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast<unsigned char>(__c)] & __m; } ++ ++ const char* ++ ctype<char>:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast<unsigned char>(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_noninline.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2004-01-09 03:34:53.000000000 -0600 +@@ -0,0 +1,90 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype<char>::classic_table() throw() ++ { ++ return __C_ctype_b; ++ } ++ ++ ctype<char>::ctype(__c_locale, const mask* __table, bool __del, ++ size_t __refs) ++ : __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ _M_c_locale_ctype = _S_c_locale; ++ } ++ ++ ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) : ++ __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ _M_c_locale_ctype = _S_c_locale; ++ } ++ ++ char ++ ctype<char>::do_toupper(char __c) const ++ { return _M_toupper[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype<char>::do_tolower(char __c) const ++ { return _M_tolower[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/os_defines.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/os_defines.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/os_defines.h 2004-01-09 04:56:13.000000000 -0600 +@@ -0,0 +1,56 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCPP_OS_DEFINES ++#define _GLIBCPP_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include <features.h> ++ ++// These systems have declarations mismatching those in libio.h by ++// omitting throw qualifiers. Cleanest way out is to not provide ++// throw-qualifiers at all. Defining it as empty here will make libio.h ++// not define it. ++#undef __THROW ++#define __THROW ++ ++// Tell Glibc not to try to provide its own inline versions of ++// some math functions. Those cause assembly-time clashes with ++// our definitions. ++#define __NO_MATH_INLINES ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif diff --git a/openwrt/toolchain/gcc/3.3.3/500-loop.patch b/openwrt/toolchain/gcc/3.3.3/500-loop.patch new file mode 100644 index 0000000000..476f84b377 --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.3/500-loop.patch @@ -0,0 +1,10 @@ +--- gcc/gcc/loop.c 14 Feb 2004 14:46:03 -0000 1.488.2.3 ++++ gcc/gcc/loop.c 28 Apr 2004 22:02:53 -0000 +@@ -929,6 +929,7 @@ + || (! (GET_CODE (SET_SRC (set)) == REG + && (REGNO (SET_SRC (set)) + < FIRST_PSEUDO_REGISTER)))) ++ && regno >= FIRST_PSEUDO_REGISTER + /* This test is not redundant; SET_SRC (set) might be + a call-clobbered register and the life of REGNO + might span a call. */ diff --git a/openwrt/toolchain/gcc/3.3.4/100-uclibc-conf.patch b/openwrt/toolchain/gcc/3.3.4/100-uclibc-conf.patch new file mode 100644 index 0000000000..4bbe21b7aa --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.4/100-uclibc-conf.patch @@ -0,0 +1,1635 @@ +diff -urN gcc-3.3.3-dist/boehm-gc/config.sub gcc-3.3.3/boehm-gc/config.sub +--- gcc-3.3.3-dist/boehm-gc/config.sub 2002-02-11 22:37:53.000000000 -0600 ++++ gcc-3.3.3/boehm-gc/config.sub 2004-08-12 04:47:51.000000000 -0500 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | storm-chaos* | os2-emx* | windows32-*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1089,7 +1089,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN gcc-3.3.3-dist/boehm-gc/configure gcc-3.3.3/boehm-gc/configure +--- gcc-3.3.3-dist/boehm-gc/configure 2004-02-14 14:34:20.000000000 -0600 ++++ gcc-3.3.3/boehm-gc/configure 2004-08-12 04:47:51.000000000 -0500 +@@ -1940,6 +1940,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN gcc-3.3.3-dist/config.sub gcc-3.3.3/config.sub +--- gcc-3.3.3-dist/config.sub 2003-01-30 17:25:36.000000000 -0600 ++++ gcc-3.3.3/config.sub 2004-08-12 04:47:51.000000000 -0500 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1112,7 +1112,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN gcc-3.3.3-dist/gcc/config/arm/linux-elf.h gcc-3.3.3/gcc/config/arm/linux-elf.h +--- gcc-3.3.3-dist/gcc/config/arm/linux-elf.h 2003-09-16 10:39:23.000000000 -0500 ++++ gcc-3.3.3/gcc/config/arm/linux-elf.h 2004-08-12 04:47:51.000000000 -0500 +@@ -78,6 +78,18 @@ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC "%{h*} %{version:-v} \ ++ %{b} %{Wl,*:%*} \ ++ %{static:-Bstatic} \ ++ %{shared:-shared} \ ++ %{symbolic:-Bsymbolic} \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ ++ -X \ ++ %{mbig-endian:-EB}" \ ++ SUBTARGET_EXTRA_LINK_SPEC ++#else + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ +@@ -88,6 +100,7 @@ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC ++#endif + + #define TARGET_OS_CPP_BUILTINS() \ + do { \ +diff -urN gcc-3.3.3-dist/gcc/config/cris/linux.h gcc-3.3.3/gcc/config/cris/linux.h +--- gcc-3.3.3-dist/gcc/config/cris/linux.h 2003-03-10 21:01:35.000000000 -0600 ++++ gcc-3.3.3/gcc/config/cris/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -81,6 +81,25 @@ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -95,6 +114,8 @@ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +diff -urN gcc-3.3.3-dist/gcc/config/cris/t-linux-uclibc gcc-3.3.3/gcc/config/cris/t-linux-uclibc +--- gcc-3.3.3-dist/gcc/config/cris/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/cris/t-linux-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,3 @@ ++T_CFLAGS = -DUSE_UCLIBC ++TARGET_LIBGCC2_CFLAGS += -fPIC ++CRTSTUFF_T_CFLAGS_S = $(TARGET_LIBGCC2_CFLAGS) +diff -urN gcc-3.3.3-dist/gcc/config/i386/linux.h gcc-3.3.3/gcc/config/i386/linux.h +--- gcc-3.3.3-dist/gcc/config/i386/linux.h 2003-11-14 00:46:12.000000000 -0600 ++++ gcc-3.3.3/gcc/config/i386/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -136,6 +136,15 @@ + %{static:-static}}}" + #endif + #else ++#if defined USE_UCLIBC ++#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ +@@ -144,6 +153,7 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}}}" + #endif ++#endif + + /* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named +diff -urN gcc-3.3.3-dist/gcc/config/mips/linux.h gcc-3.3.3/gcc/config/mips/linux.h +--- gcc-3.3.3-dist/gcc/config/mips/linux.h 2003-12-23 02:58:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/mips/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -175,6 +175,17 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC \ ++ "%(endian_spec) \ ++ %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ +@@ -184,6 +195,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ + %{static:-static}}}" ++#endif + + #undef SUBTARGET_ASM_SPEC + #define SUBTARGET_ASM_SPEC "\ +diff -urN gcc-3.3.3-dist/gcc/config/sh/linux.h gcc-3.3.3/gcc/config/sh/linux.h +--- gcc-3.3.3-dist/gcc/config/sh/linux.h 2003-11-06 17:13:33.000000000 -0600 ++++ gcc-3.3.3/gcc/config/sh/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -44,12 +44,21 @@ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define SUBTARGET_LINK_SPEC \ ++ "%{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}" ++#else + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}" ++#endif + + /* The GNU C++ standard library requires that these macros be defined. */ + #undef CPLUSPLUS_CPP_SPEC +diff -urN gcc-3.3.3-dist/gcc/config/sh/t-linux-uclibc gcc-3.3.3/gcc/config/sh/t-linux-uclibc +--- gcc-3.3.3-dist/gcc/config/sh/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/sh/t-linux-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,16 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++TARGET_LIBGCC2_CFLAGS = -fpic ++LIB1ASMFUNCS_CACHE = _ic_invalidate ++ ++LIB2FUNCS_EXTRA= ++ ++MULTILIB_OPTIONS= $(MULTILIB_ENDIAN) m3e/m4 ++MULTILIB_DIRNAMES= ++MULTILIB_MATCHES = ++MULTILIB_EXCEPTIONS= ++ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o +diff -urN gcc-3.3.3-dist/gcc/config/sh/t-sh64-uclibc gcc-3.3.3/gcc/config/sh/t-sh64-uclibc +--- gcc-3.3.3-dist/gcc/config/sh/t-sh64-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/sh/t-sh64-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,13 @@ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o ++ ++LIB1ASMFUNCS = \ ++ _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ ++ _shcompact_call_trampoline _shcompact_return_trampoline \ ++ _shcompact_incoming_args _ic_invalidate _nested_trampoline \ ++ _push_pop_shmedia_regs \ ++ _udivdi3 _divdi3 _umoddi3 _moddi3 ++ ++MULTILIB_OPTIONS = $(MULTILIB_ENDIAN) m5-32media-nofpu/m5-compact/m5-compact-nofpu/m5-64media/m5-64media-nofpu ++MULTILIB_DIRNAMES= $(MULTILIB_ENDIAN) nofpu compact nofpu/compact media64 nofpu/media64 ++MULTILIB_MATCHES= ++MULTILIB_EXCEPTIONS= +diff -urN gcc-3.3.3-dist/gcc/config/t-linux-uclibc gcc-3.3.3/gcc/config/t-linux-uclibc +--- gcc-3.3.3-dist/gcc/config/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/t-linux-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,23 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++# Compile crtbeginS.o and crtendS.o with pic. ++CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC ++# Compile libgcc2.a with pic. ++TARGET_LIBGCC2_CFLAGS = -fPIC ++ ++# Override t-slibgcc-elf-ver to export some libgcc symbols with ++# the symbol versions that glibc used. ++SHLIB_MAPFILES += $(srcdir)/config/libgcc-glibc.ver ++ ++# Use unwind-dw2-fde-glibc ++#LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde-glibc.c \ ++# $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c ++#LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h unwind-dw2-fde.c ++ ++# Use unwind-dw2-fde ++LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ ++ $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c ++LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h +diff -urN gcc-3.3.3-dist/gcc/config.gcc gcc-3.3.3/gcc/config.gcc +--- gcc-3.3.3-dist/gcc/config.gcc 2004-01-21 00:06:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config.gcc 2004-08-12 04:47:51.000000000 -0500 +@@ -697,6 +697,17 @@ + extra_parts="" + use_collect2=yes + ;; ++arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc ++ tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ case x${enable_threads} in ++ x | xyes | xpthreads | xposix) ++ thread_file='posix' ++ ;; ++ esac ++ ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h" + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" +@@ -772,6 +783,10 @@ + tmake_file="cris/t-cris cris/t-elfmulti" + gas=yes + ;; ++cris-*-linux-uclibc*) ++ tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" ++ tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux-uclibc" ++ ;; + cris-*-linux*) + tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" + tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux" +@@ -1173,6 +1188,11 @@ + thread_file='single' + fi + ;; ++i[34567]86-*-linux*uclibc*) # Intel 80386's running GNU/Linux ++ # with ELF format using uClibc ++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc i386/t-crtstuff" ++ ;; + i[34567]86-*-linux*) # Intel 80386's running GNU/Linux + # with ELF format using glibc 2 + # aka GNU/Linux C library 6 +@@ -1883,6 +1903,16 @@ + tm_file="elfos.h ${tm_file} mips/netbsd.h" + tmake_file="${tmake_file} mips/t-netbsd" + ;; ++mips*-*-linux-uclibc*) # Linux MIPS, either endian. uClibc ++ tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" ++ case $machine in ++ mipsisa32*-*) ++ target_cpu_default="MASK_SOFT_FLOAT" ++ tm_defines="MIPS_ISA_DEFAULT=32" ++ ;; ++ esac ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc mips/t-linux" ++ ;; + mips*-*-linux*) # Linux MIPS, either endian. + tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" + case $machine in +@@ -2129,6 +2159,11 @@ + out_file=rs6000/rs6000.c + tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" + ;; ++powerpc-*-linux-uclibc*) ++ tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" ++ out_file=rs6000/rs6000.c ++ tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-linux-uclibc rs6000/t-ppccomm" ++ ;; + powerpc-*-linux*) + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" + out_file=rs6000/rs6000.c +@@ -2313,10 +2348,18 @@ + tmake_file="${tmake_file} sh/t-le" + ;; + esac +- tmake_file="${tmake_file} sh/t-linux" ++ case $machine in ++ *-*-linux-uclibc*) tmake_file="${tmake_file} sh/t-linux-uclibc" ;; ++ *) tmake_file="${tmake_file} sh/t-linux" ;; ++ esac + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/linux.h" + gas=yes gnu_ld=yes + case $machine in ++ sh64*-*-linux-uclibc*) ++ tmake_file="${tmake_file} sh/t-sh64-uclibc" ++ tm_file="${tm_file} sh/sh64.h" ++ extra_headers="shmedia.h ushmedia.h sshmedia.h" ++ ;; + sh64*) + tmake_file="${tmake_file} sh/t-sh64" + tm_file="${tm_file} sh/sh64.h" +diff -urN gcc-3.3.3-dist/libstdc++-v3/aclocal.m4 gcc-3.3.3/libstdc++-v3/aclocal.m4 +--- gcc-3.3.3-dist/libstdc++-v3/aclocal.m4 2004-01-12 10:18:44.000000000 -0600 ++++ gcc-3.3.3/libstdc++-v3/aclocal.m4 2004-08-12 04:47:51.000000000 -0500 +@@ -1216,6 +1216,9 @@ + dnl Default to "generic" + if test x$enable_clocale_flag = xno; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu*) + AC_EGREP_CPP([_GLIBCPP_ok], [ + #include <features.h> +@@ -1339,6 +1342,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ xuclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcpp_MOFILES="$glibcpp_MOFILES $ling.mo"; \ ++ glibcpp_POFILES="$glibcpp_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcpp_MOFILES) ++ AC_SUBST(glibcpp_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/uclibc/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + *) + echo "$enable_clocale is an unknown locale package" 1>&2 + exit 1 +diff -urN gcc-3.3.3-dist/libstdc++-v3/configure gcc-3.3.3/libstdc++-v3/configure +--- gcc-3.3.3-dist/libstdc++-v3/configure 2004-01-12 10:18:45.000000000 -0600 ++++ gcc-3.3.3/libstdc++-v3/configure 2004-08-12 04:49:13.000000000 -0500 +@@ -2010,6 +2010,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -2996,6 +3001,9 @@ + + if test x$enable_clocale_flag = xno; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu*) + cat > conftest.$ac_ext <<EOF + #line 3002 "configure" +@@ -3182,6 +3190,70 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ xuclibc) ++ echo "$ac_t""uclibc" 1>&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++echo "configure:3117: checking for $ac_word" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_check_msgfmt'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ++ ac_dummy="$PATH" ++ for ac_dir in $ac_dummy; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ ac_cv_prog_check_msgfmt="yes" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt="$ac_cv_prog_check_msgfmt" ++if test -n "$check_msgfmt"; then ++ echo "$ac_t""$check_msgfmt" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcpp_MOFILES="$glibcpp_MOFILES $ling.mo"; \ ++ glibcpp_POFILES="$glibcpp_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/uclibc/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + *) + echo "$enable_clocale is an unknown locale package" 1>&2 + exit 1 +@@ -4212,6 +4284,968 @@ + # GLIBCPP_CHECK_MATH_SUPPORT + + case "$target" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h locale.h float.h inttypes.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4224: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4229 "configure" ++#include "confdefs.h" ++#include <$ac_hdr> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4234: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_hdr 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++fi ++done ++ ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ ++ ++ # If we're not using GNU ld, then there's no point in even trying these ++ # tests. Check for that first. We should have already tested for gld ++ # by now (in libtool), but require it now just to be safe... ++ test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS='' ++ test -z "$OPT_LDFLAGS" && OPT_LDFLAGS='' ++ ++ ++ # The name set by libtool depends on the version of libtool. Shame on us ++ # for depending on an impl detail, but c'est la vie. Older versions used ++ # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on ++ # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually ++ # makes sense). We'll test with_gnu_ld everywhere else, so if that isn't ++ # set (hence we're using an older libtool), then set it. ++ if test x${with_gnu_ld+set} != xset; then ++ if test x${ac_cv_prog_gnu_ld+set} != xset; then ++ # We got through "ac_require(ac_prog_ld)" and still not set? Huh? ++ with_gnu_ld=no ++ else ++ with_gnu_ld=$ac_cv_prog_gnu_ld ++ fi ++ fi ++ ++ # Start by getting the version number. I think the libtool test already ++ # does some of this, but throws away the result. ++ ++ ldver=`$LD --version 2>/dev/null | head -1 | \ ++ sed -e 's/GNU ld version \([0-9.][0-9.]*\).*/\1/'` ++ ++ glibcpp_gnu_ld_version=`echo $ldver | \ ++ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` ++ ++ # Set --gc-sections. ++ if test "$with_gnu_ld" = "notbroken"; then ++ # GNU ld it is! Joy and bunny rabbits! ++ ++ # All these tests are for C++; save the language and the compiler flags. ++ # Need to do this so that g++ won't try to link in libstdc++ ++ ac_test_CFLAGS="${CFLAGS+set}" ++ ac_save_CFLAGS="$CFLAGS" ++ CFLAGS='-x c++ -Wl,--gc-sections' ++ ++ # Check for -Wl,--gc-sections ++ # XXX This test is broken at the moment, as symbols required for ++ # linking are now in libsupc++ (not built yet.....). In addition, ++ # this test has cored on solaris in the past. In addition, ++ # --gc-sections doesn't really work at the moment (keeps on discarding ++ # used sections, first .eh_frame and now some of the glibc sections for ++ # iconv). Bzzzzt. Thanks for playing, maybe next time. ++ echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6 ++echo "configure:4312: checking for ld that supports -Wl,--gc-sections" >&5 ++ if test "$cross_compiling" = yes; then ++ ac_sectionLDflags=yes ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4317 "configure" ++#include "confdefs.h" ++ ++ int main(void) ++ { ++ try { throw 1; } ++ catch (...) { }; ++ return 0; ++ } ++ ++EOF ++if { (eval echo configure:4328: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ++then ++ ac_sectionLDflags=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -fr conftest* ++ ac_sectionLDflags=no ++fi ++rm -fr conftest* ++fi ++ ++ if test "$ac_test_CFLAGS" = set; then ++ CFLAGS="$ac_save_CFLAGS" ++ else ++ # this is the suspicious part ++ CFLAGS='' ++ fi ++ if test "$ac_sectionLDflags" = "yes"; then ++ SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" ++ fi ++ echo "$ac_t""$ac_sectionLDflags" 1>&6 ++ fi ++ ++ # Set linker optimization flags. ++ if test x"$with_gnu_ld" = x"yes"; then ++ OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS" ++ fi ++ ++ ++ ++ ++ ++ echo $ac_n "checking for main in -lm""... $ac_c" 1>&6 ++echo "configure:4362: checking for main in -lm" >&5 ++ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ ac_save_LIBS="$LIBS" ++LIBS="-lm $LIBS" ++cat > conftest.$ac_ext <<EOF ++#line 4370 "configure" ++#include "confdefs.h" ++ ++int main() { ++main() ++; return 0; } ++EOF ++if { (eval echo configure:4377: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \ ++ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_lib 1 ++EOF ++ ++ LIBS="-lm $LIBS" ++ ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ for ac_func in nan copysignf ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4407: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4412 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4435: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo" ++fi ++done ++ ++ ++ for ac_func in __signbit ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4464: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4469 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4492: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++LIBMATHOBJS="$LIBMATHOBJS signbit.lo" ++fi ++done ++ ++ for ac_func in __signbitf ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4520: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4525 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4548: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++LIBMATHOBJS="$LIBMATHOBJS signbitf.lo" ++fi ++done ++ ++ ++ if test x$ac_cv_func_copysignl = x"yes"; then ++ for ac_func in __signbitl ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4578: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4583 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4606: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++LIBMATHOBJS="$LIBMATHOBJS signbitl.lo" ++fi ++done ++ ++ fi ++ ++ if test -n "$LIBMATHOBJS"; then ++ need_libmath=yes ++ fi ++ ++ ++ ++if test "$need_libmath" = yes; then ++ GLIBCPP_BUILD_LIBMATH_TRUE= ++ GLIBCPP_BUILD_LIBMATH_FALSE='#' ++else ++ GLIBCPP_BUILD_LIBMATH_TRUE='#' ++ GLIBCPP_BUILD_LIBMATH_FALSE= ++fi ++ ++ ++ enable_wchar_t=no ++ ++ echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6 ++echo "configure:4651: checking for mbstate_t" >&5 ++ cat > conftest.$ac_ext <<EOF ++#line 4653 "configure" ++#include "confdefs.h" ++#include <wchar.h> ++int main() { ++mbstate_t teststate; ++; return 0; } ++EOF ++if { (eval echo configure:4660: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ have_mbstate_t=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ have_mbstate_t=no ++fi ++rm -f conftest* ++ echo "$ac_t""$have_mbstate_t" 1>&6 ++ if test x"$have_mbstate_t" = xyes; then ++ cat >> confdefs.h <<\EOF ++#define HAVE_MBSTATE_T 1 ++EOF ++ ++ fi ++ ++ for ac_hdr in wchar.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4682: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4687 "configure" ++#include "confdefs.h" ++#include <$ac_hdr> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4692: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_hdr 1 ++EOF ++ ac_has_wchar_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_wchar_h=no ++fi ++done ++ ++ for ac_hdr in wctype.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4723: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4728 "configure" ++#include "confdefs.h" ++#include <$ac_hdr> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4733: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_hdr 1 ++EOF ++ ac_has_wctype_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_wctype_h=no ++fi ++done ++ ++ ++ if test x"$ac_has_wchar_h" = xyes && ++ test x"$ac_has_wctype_h" = xyes && ++ test x"$enable_c_mbchar" != xno; then ++ ++ echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6 ++echo "configure:4766: checking for WCHAR_MIN and WCHAR_MAX" >&5 ++ cat > conftest.$ac_ext <<EOF ++#line 4768 "configure" ++#include "confdefs.h" ++#include <wchar.h> ++int main() { ++int i = WCHAR_MIN; int j = WCHAR_MAX; ++; return 0; } ++EOF ++if { (eval echo configure:4775: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ has_wchar_minmax=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ has_wchar_minmax=no ++fi ++rm -f conftest* ++ echo "$ac_t""$has_wchar_minmax" 1>&6 ++ ++ echo $ac_n "checking for WEOF""... $ac_c" 1>&6 ++echo "configure:4788: checking for WEOF" >&5 ++ cat > conftest.$ac_ext <<EOF ++#line 4790 "configure" ++#include "confdefs.h" ++ ++ #include <wchar.h> ++ #include <stddef.h> ++int main() { ++wint_t i = WEOF; ++; return 0; } ++EOF ++if { (eval echo configure:4799: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ has_weof=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ has_weof=no ++fi ++rm -f conftest* ++ echo "$ac_t""$has_weof" 1>&6 ++ ++ ac_wfuncs=yes ++ for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4815: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4820 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4843: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++\ ++ ac_wfuncs=no ++fi ++done ++ ++ ++ for ac_func in btowc wctob fgetwc fgetws fputwc fputws fwide \ ++ fwprintf fwscanf swprintf swscanf vfwprintf vfwscanf vswprintf vswscanf \ ++ vwprintf vwscanf wprintf wscanf getwc getwchar mbsinit mbrlen mbrtowc \ ++ mbsrtowcs wcsrtombs putwc putwchar ungetwc wcrtomb wcstod wcstof wcstol \ ++ wcstoul wcscpy wcsncpy wcscat wcsncat wcscmp wcscoll wcsncmp wcsxfrm \ ++ wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4878: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4883 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4906: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++\ ++ ac_wfuncs=no ++fi ++done ++ ++ ++ echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6 ++echo "configure:4934: checking for ISO C99 wchar_t support" >&5 ++ if test x"$has_weof" = xyes && ++ test x"$has_wchar_minmax" = xyes && ++ test x"$ac_wfuncs" = xyes; then ++ ac_isoC99_wchar_t=yes ++ else ++ ac_isoC99_wchar_t=no ++ fi ++ echo "$ac_t""$ac_isoC99_wchar_t" 1>&6 ++ ++ ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for iconv.h""... $ac_c" 1>&6 ++echo "configure:4946: checking for iconv.h" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4951 "configure" ++#include "confdefs.h" ++#include <iconv.h> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4956: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_has_iconv_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_iconv_h=no ++fi ++ ++ ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6 ++echo "configure:4980: checking for langinfo.h" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4985 "configure" ++#include "confdefs.h" ++#include <langinfo.h> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4990: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_has_langinfo_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_langinfo_h=no ++fi ++ ++ ++ echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6 ++echo "configure:5014: checking for iconv in -liconv" >&5 ++ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ ac_save_LIBS="$LIBS" ++LIBS="-liconv $LIBS" ++cat > conftest.$ac_ext <<EOF ++#line 5022 "configure" ++#include "confdefs.h" ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char iconv(); ++ ++int main() { ++iconv() ++; return 0; } ++EOF ++if { (eval echo configure:5033: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ libiconv="-liconv" ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ ac_save_LIBS="$LIBS" ++ LIBS="$LIBS $libiconv" ++ ++ for ac_func in iconv_open iconv_close iconv nl_langinfo ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:5059: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 5064 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:5087: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ \ ++ ac_XPG2funcs=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_XPG2funcs=no ++fi ++done ++ ++ ++ LIBS="$ac_save_LIBS" ++ ++ echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6 ++echo "configure:5117: checking for XPG2 wchar_t support" >&5 ++ if test x"$ac_has_iconv_h" = xyes && ++ test x"$ac_has_langinfo_h" = xyes && ++ test x"$ac_XPG2funcs" = xyes; then ++ ac_XPG2_wchar_t=yes ++ else ++ ac_XPG2_wchar_t=no ++ fi ++ echo "$ac_t""$ac_XPG2_wchar_t" 1>&6 ++ ++ if test x"$ac_isoC99_wchar_t" = xyes && ++ test x"$ac_XPG2_wchar_t" = xyes; then ++ cat >> confdefs.h <<\EOF ++#define _GLIBCPP_USE_WCHAR_T 1 ++EOF ++ ++ enable_wchar_t=yes ++ fi ++ fi ++ echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6 ++echo "configure:5137: checking for enabled wchar_t specializations" >&5 ++ echo "$ac_t""$enable_wchar_t" 1>&6 ++ ++ ++if test "$enable_wchar_t" = yes; then ++ GLIBCPP_TEST_WCHAR_T_TRUE= ++ GLIBCPP_TEST_WCHAR_T_FALSE='#' ++else ++ GLIBCPP_TEST_WCHAR_T_TRUE='#' ++ GLIBCPP_TEST_WCHAR_T_FALSE= ++fi ++ ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_COPYSIGN 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_FINITE 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_FINITEF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISINF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISINFF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISNAN 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISNANF 1 ++EOF ++ ;; + *-linux*) + os_include_dir="os/gnu-linux" + for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \ +diff -urN gcc-3.3.3-dist/libstdc++-v3/configure.in gcc-3.3.3/libstdc++-v3/configure.in +--- gcc-3.3.3-dist/libstdc++-v3/configure.in 2004-01-12 10:19:22.000000000 -0600 ++++ gcc-3.3.3/libstdc++-v3/configure.in 2004-08-12 04:47:51.000000000 -0500 +@@ -117,6 +117,36 @@ + # GLIBCPP_CHECK_MATH_SUPPORT + + case "$target" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h locale.h float.h inttypes.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCPP_CHECK_LINKER_FEATURES ++ GLIBCPP_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCPP_CHECK_WCHAR_T_SUPPORT ++ ++ AC_DEFINE(HAVE_COPYSIGN) ++ #AC_DEFINE(HAVE_COPYSIGNF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ #AC_DEFINE(HAVE_FREXPF) ++ #AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++ #AC_DEFINE(HAVE_SINCOS) ++ #AC_DEFINE(HAVE_SINCOSF) ++ #if test x"long_double_math_on_this_cpu" = x"yes"; then ++ #AC_DEFINE(HAVE_FINITEL) ++ #AC_DEFINE(HAVE_HYPOTL) ++ #AC_DEFINE(HAVE_ISINFL) ++ #AC_DEFINE(HAVE_ISNANL) ++ #fi ++ ;; + *-linux*) + os_include_dir="os/gnu-linux" + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ +diff -urN gcc-3.3.3-dist/libstdc++-v3/configure.target gcc-3.3.3/libstdc++-v3/configure.target +--- gcc-3.3.3-dist/libstdc++-v3/configure.target 2003-10-01 14:07:07.000000000 -0500 ++++ gcc-3.3.3/libstdc++-v3/configure.target 2004-08-12 04:47:51.000000000 -0500 +@@ -133,6 +133,9 @@ + freebsd*) + os_include_dir="os/bsd/freebsd" + ;; ++ linux-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; + gnu* | linux*) + os_include_dir="os/gnu-linux" + ;; +diff -urN gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cstdlib.h gcc-3.3.3/libstdc++-v3/include/c_std/std_cstdlib.h +--- gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cstdlib.h 2003-04-18 05:08:05.000000000 -0500 ++++ gcc-3.3.3/libstdc++-v3/include/c_std/std_cstdlib.h 2004-08-12 04:47:51.000000000 -0500 +@@ -101,9 +101,11 @@ + using ::labs; + using ::ldiv; + using ::malloc; ++#if _GLIBCPP_USE_WCHAR_T + using ::mblen; + using ::mbstowcs; + using ::mbtowc; ++#endif + using ::qsort; + using ::rand; + using ::realloc; +@@ -112,8 +114,10 @@ + using ::strtol; + using ::strtoul; + using ::system; ++#if _GLIBCPP_USE_WCHAR_T + using ::wcstombs; + using ::wctomb; ++#endif + + inline long + abs(long __i) { return labs(__i); } +diff -urN gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cwchar.h gcc-3.3.3/libstdc++-v3/include/c_std/std_cwchar.h +--- gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cwchar.h 2003-04-18 05:08:05.000000000 -0500 ++++ gcc-3.3.3/libstdc++-v3/include/c_std/std_cwchar.h 2004-08-12 04:47:51.000000000 -0500 +@@ -165,7 +165,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#ifdef HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; +diff -urN gcc-3.3.3-dist/libtool.m4 gcc-3.3.3/libtool.m4 +--- gcc-3.3.3-dist/libtool.m4 2003-09-09 03:04:17.000000000 -0500 ++++ gcc-3.3.3/libtool.m4 2004-08-12 04:47:51.000000000 -0500 +@@ -687,6 +687,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gcc-3.3.3-dist/ltconfig gcc-3.3.3/ltconfig +--- gcc-3.3.3-dist/ltconfig 2003-02-19 20:10:02.000000000 -0600 ++++ gcc-3.3.3/ltconfig 2004-08-12 04:47:51.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1247,6 +1248,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/gcc/3.3.4/110-uclibc-conf.patch b/openwrt/toolchain/gcc/3.3.4/110-uclibc-conf.patch new file mode 100644 index 0000000000..f297c3283f --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.4/110-uclibc-conf.patch @@ -0,0 +1,55 @@ +Use the patch by Carl Miller <chaz@energoncube.net> for powerpc, with +some minor modifications. Changed *os_uclibc to *os_linux_uclibc since +at some point we might support other platforms. Also updated to 3.3.3. +diff -urN gcc-3.3.3/gcc/config/rs6000/linux.h gcc-3.3.3-new/gcc/config/rs6000/linux.h +--- gcc-3.3.3/gcc/config/rs6000/linux.h 2003-11-14 00:46:10.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/rs6000/linux.h 2004-02-16 21:13:40.000000000 -0600 +@@ -64,7 +64,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #undef TARGET_VERSION + #define TARGET_VERSION fprintf (stderr, " (PowerPC GNU/Linux)"); +diff -urN gcc-3.3.3/gcc/config/rs6000/sysv4.h gcc-3.3.3-new/gcc/config/rs6000/sysv4.h +--- gcc-3.3.3/gcc/config/rs6000/sysv4.h 2003-10-28 13:55:41.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/rs6000/sysv4.h 2004-02-16 21:13:40.000000000 -0600 +@@ -968,9 +968,11 @@ + %{mcall-linux: %(link_os_linux) } \ + %{mcall-gnu: %(link_os_gnu) } \ + %{mcall-netbsd: %(link_os_netbsd) } \ ++%{mcall-uclibc: %(link_os_linux_uclibc) } \ + %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: \ + %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: \ +- %{!mcall-netbsd: %(link_os_default) }}}}}}}}}" ++ %{!mcall-netbsd: %{!mcall-uclibc: \ ++ %(link_os_default) }}}}}}}}}}" + + #define LINK_OS_DEFAULT_SPEC "" + +@@ -1307,6 +1309,12 @@ + + #define LINK_OS_WINDISS_SPEC "" + ++/* uClibc support for Linux. */ ++ ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + /* Define any extra SPECS that the compiler needs to generate. */ + /* Override rs6000.h definition. */ + #undef SUBTARGET_EXTRA_SPECS +@@ -1372,6 +1380,7 @@ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_vxworks", LINK_OS_VXWORKS_SPEC }, \ + { "link_os_windiss", LINK_OS_WINDISS_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_default", LINK_OS_DEFAULT_SPEC }, \ + { "cc1_endian_big", CC1_ENDIAN_BIG_SPEC }, \ + { "cc1_endian_little", CC1_ENDIAN_LITTLE_SPEC }, \ diff --git a/openwrt/toolchain/gcc/3.3.4/120-softfloat.patch b/openwrt/toolchain/gcc/3.3.4/120-softfloat.patch new file mode 100644 index 0000000000..f2431896cf --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.4/120-softfloat.patch @@ -0,0 +1,14 @@ +--- gcc-3.3.2-old/configure.in 2003-08-09 01:57:21.000000000 -0500 ++++ gcc-3.3.2/configure.in 2004-01-15 12:46:29.000000000 -0600 +@@ -1418,6 +1418,11 @@ + fi + + FLAGS_FOR_TARGET= ++case " $targargs " in ++ *" --nfp "* | *" --without-float "*) ++ FLAGS_FOR_TARGET=$FLAGS_FOR_TARGET' -msoft-float' ++ ;; ++esac + case " $target_configdirs " in + *" newlib "*) + case " $targargs " in diff --git a/openwrt/toolchain/gcc/3.3.4/200-uclibc-locale.patch b/openwrt/toolchain/gcc/3.3.4/200-uclibc-locale.patch new file mode 100644 index 0000000000..5880d834b4 --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.4/200-uclibc-locale.patch @@ -0,0 +1,3021 @@ +Warning! This patch is not finished. The wide char time-related stuff +is broken or non-functional. But it serves as a starting point to get +things building while I continue to work on the uClibc locale internals. +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2004-01-09 07:55:02.000000000 -0600 +@@ -0,0 +1,63 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek <jakub@redhat.com> ++ ++#include <clocale> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strtol_l) __strtol_l; ++extern "C" __typeof(strtoll_l) __strtoll_l; ++extern "C" __typeof(strtoul_l) __strtoul_l; ++extern "C" __typeof(strtoull_l) __strtoull_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#endif // GLIBC 2.3 and later +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.cc 2004-01-09 08:37:55.000000000 -0600 +@@ -0,0 +1,231 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <stdexcept> ++#include <langinfo.h> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, long& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long __l = __strtol_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __l; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, unsigned long& __v, ++ ios_base::iostate& __err, const __c_locale& __cloc, ++ int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ unsigned long __ul = __strtoul_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ul; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++#ifdef _GLIBCPP_USE_LONG_LONG ++ template<> ++ void ++ __convert_to_v(const char* __s, long long& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long long __ll = __strtoll_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ll; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, unsigned long long& __v, ++ ios_base::iostate& __err, const __c_locale& __cloc, ++ int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ unsigned long long __ull = __strtoull_l(__s, &__sanity, __base, ++ __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ull; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++#endif ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error("attempt to create locale from unknown name"); ++ } ++#else ++ __cloc = NULL; ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_locale != __cloc) ++ __freelocale(__cloc); ++#else ++ __cloc = NULL; ++#endif ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ { return __duplocale(__cloc); } ++#else ++ { return __c_locale(); } ++#endif ++ ++ const char* locale::_S_categories[_S_categories_size ++ + _S_extra_categories_size] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES" ++#if _GLIBCPP_NUM_CATEGORIES != 0 ++ , ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} // namespace std +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.h 2004-01-09 07:51:06.000000000 -0600 +@@ -0,0 +1,118 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifndef _CPP_BITS_C_LOCALE_H ++#define _CPP_BITS_C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include <clocale> ++#include <langinfo.h> // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include <iconv.h> // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include <libintl.h> // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCPP_C_LOCALE_GNU for ++#endif ++#define _GLIBCPP_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCPP_NUM_CATEGORIES 6 ++#define _GLIBCPP_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template<typename _Tv> ++ int ++ __convert_from_v(char* __out, const int __size, const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec = -1) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec = -1) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = setlocale(LC_ALL, NULL); ++ char* __sav = static_cast<char*>(malloc(strlen(__old) + 1)); ++ if (__sav) ++ strcpy(__sav, __old); ++ setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ int __ret; ++ if (__prec >= 0) ++ __ret = snprintf(__out, __size, __fmt, __prec, __v); ++ else ++ __ret = snprintf(__out, __size, __fmt, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ setlocale(LC_ALL, __sav); ++ free(__sav); ++#endif ++ return __ret; ++ } ++} ++ ++#endif +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2004-01-09 04:04:34.000000000 -0600 +@@ -0,0 +1,113 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCPP_USE_WCHAR_T ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = error; ++ size_t __len = min(__from_end - __from, __to_end - __to); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_c_locale); ++#endif ++ size_t __conv = wcsrtombs(__to, &__from, __len, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ if (__conv == __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = ok; ++ } ++ else if (__conv > 0 && __conv < __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = partial; ++ } ++ else ++ __ret = error; ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = error; ++ size_t __len = min(__from_end - __from, __to_end - __to); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_c_locale); ++#endif ++ size_t __conv = mbsrtowcs(__to, &__from, __len, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ if (__conv == __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = ok; ++ } ++ else if (__conv > 0 && __conv < __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = partial; ++ } ++ else ++ __ret = error; ++ ++ return __ret; ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h 2004-01-09 01:53:51.000000000 -0600 +@@ -0,0 +1,461 @@ ++// Locale support (codecvt) -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 Template class codecvt ++// ++ ++// Warning: this file is not meant for user inclusion. Use <locale>. ++ ++// Written by Benjamin Kosnik <bkoz@cygnus.com> ++ ++ // XXX ++ // Define this here to codecvt.cc can have _S_max_size definition. ++#define _GLIBCPP_USE___ENC_TRAITS 1 ++ ++ // Extension to use icov for dealing with character encodings, ++ // including conversions and comparisons between various character ++ // sets. This object encapsulates data that may need to be shared between ++ // char_traits, codecvt and ctype. ++ class __enc_traits ++ { ++ public: ++ // Types: ++ // NB: A conversion descriptor subsumes and enhances the ++ // functionality of a simple state type such as mbstate_t. ++ typedef iconv_t __desc_type; ++ ++ protected: ++ // Data Members: ++ // Max size of charset encoding name ++ static const int _S_max_size = 32; ++ // Name of internal character set encoding. ++ char _M_int_enc[_S_max_size]; ++ // Name of external character set encoding. ++ char _M_ext_enc[_S_max_size]; ++ ++ // Conversion descriptor between external encoding to internal encoding. ++ __desc_type _M_in_desc; ++ // Conversion descriptor between internal encoding to external encoding. ++ __desc_type _M_out_desc; ++ ++ // Details the byte-order marker for the external encoding, if necessary. ++ int _M_ext_bom; ++ ++ // Details the byte-order marker for the internal encoding, if necessary. ++ int _M_int_bom; ++ ++ public: ++ explicit __enc_traits() ++ : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0) ++ { ++ memset(_M_int_enc, 0, _S_max_size); ++ memset(_M_ext_enc, 0, _S_max_size); ++ } ++ ++ explicit __enc_traits(const char* __int, const char* __ext, ++ int __ibom = 0, int __ebom = 0) ++ : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0) ++ { ++ strncpy(_M_int_enc, __int, _S_max_size); ++ strncpy(_M_ext_enc, __ext, _S_max_size); ++ } ++ ++ // 21.1.2 traits typedefs ++ // p4 ++ // typedef STATE_T state_type ++ // requires: state_type shall meet the requirements of ++ // CopyConstructible types (20.1.3) ++ __enc_traits(const __enc_traits& __obj): _M_in_desc(0), _M_out_desc(0) ++ { ++ strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size); ++ strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size); ++ _M_ext_bom = __obj._M_ext_bom; ++ _M_int_bom = __obj._M_int_bom; ++ } ++ ++ // Need assignment operator as well. ++ __enc_traits& ++ operator=(const __enc_traits& __obj) ++ { ++ strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size); ++ strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size); ++ _M_in_desc = 0; ++ _M_out_desc = 0; ++ _M_ext_bom = __obj._M_ext_bom; ++ _M_int_bom = __obj._M_int_bom; ++ return *this; ++ } ++ ++ ~__enc_traits() ++ { ++ __desc_type __err = reinterpret_cast<iconv_t>(-1); ++ if (_M_in_desc && _M_in_desc != __err) ++ iconv_close(_M_in_desc); ++ if (_M_out_desc && _M_out_desc != __err) ++ iconv_close(_M_out_desc); ++ } ++ ++ void ++ _M_init() ++ { ++ const __desc_type __err = reinterpret_cast<iconv_t>(-1); ++ if (!_M_in_desc) ++ { ++ _M_in_desc = iconv_open(_M_int_enc, _M_ext_enc); ++ if (_M_in_desc == __err) ++ __throw_runtime_error("creating iconv input descriptor failed."); ++ } ++ if (!_M_out_desc) ++ { ++ _M_out_desc = iconv_open(_M_ext_enc, _M_int_enc); ++ if (_M_out_desc == __err) ++ __throw_runtime_error("creating iconv output descriptor failed."); ++ } ++ } ++ ++ bool ++ _M_good() ++ { ++ const __desc_type __err = reinterpret_cast<iconv_t>(-1); ++ bool __test = _M_in_desc && _M_in_desc != __err; ++ __test &= _M_out_desc && _M_out_desc != __err; ++ return __test; ++ } ++ ++ const __desc_type* ++ _M_get_in_descriptor() ++ { return &_M_in_desc; } ++ ++ const __desc_type* ++ _M_get_out_descriptor() ++ { return &_M_out_desc; } ++ ++ int ++ _M_get_external_bom() ++ { return _M_ext_bom; } ++ ++ int ++ _M_get_internal_bom() ++ { return _M_int_bom; } ++ ++ const char* ++ _M_get_internal_enc() ++ { return _M_int_enc; } ++ ++ const char* ++ _M_get_external_enc() ++ { return _M_ext_enc; } ++ }; ++ ++ // Partial specialization ++ // This specialization takes advantage of iconv to provide code ++ // conversions between a large number of character encodings. ++ template<typename _InternT, typename _ExternT> ++ class codecvt<_InternT, _ExternT, __enc_traits> ++ : public __codecvt_abstract_base<_InternT, _ExternT, __enc_traits> ++ { ++ public: ++ // Types: ++ typedef codecvt_base::result result; ++ typedef _InternT intern_type; ++ typedef _ExternT extern_type; ++ typedef __enc_traits state_type; ++ typedef __enc_traits::__desc_type __desc_type; ++ typedef __enc_traits __enc_type; ++ ++ // Data Members: ++ static locale::id id; ++ ++ explicit ++ codecvt(size_t __refs = 0) ++ : __codecvt_abstract_base<intern_type, extern_type, state_type>(__refs) ++ { } ++ ++ explicit ++ codecvt(__enc_type* __enc, size_t __refs = 0) ++ : __codecvt_abstract_base<intern_type, extern_type, state_type>(__refs) ++ { } ++ ++ protected: ++ virtual ++ ~codecvt() { } ++ ++ virtual result ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const; ++ ++ virtual result ++ do_unshift(state_type& __state, extern_type* __to, ++ extern_type* __to_end, extern_type*& __to_next) const; ++ ++ virtual result ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const; ++ ++ virtual int ++ do_encoding() const throw(); ++ ++ virtual bool ++ do_always_noconv() const throw(); ++ ++ virtual int ++ do_length(const state_type&, const extern_type* __from, ++ const extern_type* __end, size_t __max) const; ++ ++ virtual int ++ do_max_length() const throw(); ++ }; ++ ++ template<typename _InternT, typename _ExternT> ++ locale::id ++ codecvt<_InternT, _ExternT, __enc_traits>::id; ++ ++ // This adaptor works around the signature problems of the second ++ // argument to iconv(): SUSv2 and others use 'const char**', but glibc 2.2 ++ // uses 'char**', which matches the POSIX 1003.1-2001 standard. ++ // Using this adaptor, g++ will do the work for us. ++ template<typename _T> ++ inline size_t ++ __iconv_adaptor(size_t(*__func)(iconv_t, _T, size_t*, char**, size_t*), ++ iconv_t __cd, char** __inbuf, size_t* __inbytes, ++ char** __outbuf, size_t* __outbytes) ++ { return __func(__cd, (_T)__inbuf, __inbytes, __outbuf, __outbytes); } ++ ++ template<typename _InternT, typename _ExternT> ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_out_descriptor(); ++ const size_t __fmultiple = sizeof(intern_type); ++ size_t __fbytes = __fmultiple * (__from_end - __from); ++ const size_t __tmultiple = sizeof(extern_type); ++ size_t __tbytes = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast<char*>(__to); ++ char* __cfrom; ++ size_t __conv; ++ ++ // Some encodings need a byte order marker as the first item ++ // in the byte stream, to designate endian-ness. The default ++ // value for the byte order marker is NULL, so if this is ++ // the case, it's not necessary and we can just go on our ++ // merry way. ++ int __int_bom = __state._M_get_internal_bom(); ++ if (__int_bom) ++ { ++ size_t __size = __from_end - __from; ++ intern_type* __cfixed = static_cast<intern_type*>(__builtin_alloca(sizeof(intern_type) * (__size + 1))); ++ __cfixed[0] = static_cast<intern_type>(__int_bom); ++ char_traits<intern_type>::copy(__cfixed + 1, __from, __size); ++ __cfrom = reinterpret_cast<char*>(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__fbytes, &__cto, &__tbytes); ++ } ++ else ++ { ++ intern_type* __cfixed = const_cast<intern_type*>(__from); ++ __cfrom = reinterpret_cast<char*>(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, &__fbytes, ++ &__cto, &__tbytes); ++ } ++ ++ if (__conv != size_t(-1)) ++ { ++ __from_next = reinterpret_cast<const intern_type*>(__cfrom); ++ __to_next = reinterpret_cast<extern_type*>(__cto); ++ __ret = codecvt_base::ok; ++ } ++ else ++ { ++ if (__fbytes < __fmultiple * (__from_end - __from)) ++ { ++ __from_next = reinterpret_cast<const intern_type*>(__cfrom); ++ __to_next = reinterpret_cast<extern_type*>(__cto); ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ } ++ return __ret; ++ } ++ ++ template<typename _InternT, typename _ExternT> ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_unshift(state_type& __state, extern_type* __to, ++ extern_type* __to_end, extern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_in_descriptor(); ++ const size_t __tmultiple = sizeof(intern_type); ++ size_t __tlen = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast<char*>(__to); ++ size_t __conv = __iconv_adaptor(iconv,*__desc, NULL, NULL, ++ &__cto, &__tlen); ++ ++ if (__conv != size_t(-1)) ++ { ++ __to_next = reinterpret_cast<extern_type*>(__cto); ++ if (__tlen == __tmultiple * (__to_end - __to)) ++ __ret = codecvt_base::noconv; ++ else if (__tlen == 0) ++ __ret = codecvt_base::ok; ++ else ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ return __ret; ++ } ++ ++ template<typename _InternT, typename _ExternT> ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_in_descriptor(); ++ const size_t __fmultiple = sizeof(extern_type); ++ size_t __flen = __fmultiple * (__from_end - __from); ++ const size_t __tmultiple = sizeof(intern_type); ++ size_t __tlen = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast<char*>(__to); ++ char* __cfrom; ++ size_t __conv; ++ ++ // Some encodings need a byte order marker as the first item ++ // in the byte stream, to designate endian-ness. The default ++ // value for the byte order marker is NULL, so if this is ++ // the case, it's not necessary and we can just go on our ++ // merry way. ++ int __ext_bom = __state._M_get_external_bom(); ++ if (__ext_bom) ++ { ++ size_t __size = __from_end - __from; ++ extern_type* __cfixed = static_cast<extern_type*>(__builtin_alloca(sizeof(extern_type) * (__size + 1))); ++ __cfixed[0] = static_cast<extern_type>(__ext_bom); ++ char_traits<extern_type>::copy(__cfixed + 1, __from, __size); ++ __cfrom = reinterpret_cast<char*>(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__flen, &__cto, &__tlen); ++ } ++ else ++ { ++ extern_type* __cfixed = const_cast<extern_type*>(__from); ++ __cfrom = reinterpret_cast<char*>(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__flen, &__cto, &__tlen); ++ } ++ ++ ++ if (__conv != size_t(-1)) ++ { ++ __from_next = reinterpret_cast<const extern_type*>(__cfrom); ++ __to_next = reinterpret_cast<intern_type*>(__cto); ++ __ret = codecvt_base::ok; ++ } ++ else ++ { ++ if (__flen < static_cast<size_t>(__from_end - __from)) ++ { ++ __from_next = reinterpret_cast<const extern_type*>(__cfrom); ++ __to_next = reinterpret_cast<intern_type*>(__cto); ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ } ++ return __ret; ++ } ++ ++ template<typename _InternT, typename _ExternT> ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_encoding() const throw() ++ { ++ int __ret = 0; ++ if (sizeof(_ExternT) <= sizeof(_InternT)) ++ __ret = sizeof(_InternT)/sizeof(_ExternT); ++ return __ret; ++ } ++ ++ template<typename _InternT, typename _ExternT> ++ bool ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_always_noconv() const throw() ++ { return false; } ++ ++ template<typename _InternT, typename _ExternT> ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_length(const state_type&, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { return min(__max, static_cast<size_t>(__end - __from)); } ++ ++#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS ++// 74. Garbled text for codecvt::do_max_length ++ template<typename _InternT, typename _ExternT> ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_max_length() const throw() ++ { return 1; } ++#endif +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/collate_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/collate_members.cc 2004-01-09 08:06:24.000000000 -0600 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate<char>::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<char>::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ int ++ collate<wchar_t>::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/ctype_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2004-01-09 08:15:41.000000000 -0600 +@@ -0,0 +1,274 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype<char> specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname<char>::ctype_byname(const char* __s, size_t __refs) ++ : ctype<char>(0, false, __refs) ++ { ++ _S_destroy_c_locale(_M_c_locale_ctype); ++ _S_create_c_locale(_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_toupper = _M_c_locale_ctype->__ctype_toupper; ++ _M_tolower = _M_c_locale_ctype->__ctype_tolower; ++ _M_table = _M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ ctype<wchar_t>::__wmask_type ++ ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = 0; ++ } ++ return __ret; ++ }; ++ ++ wchar_t ++ ctype<wchar_t>::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype<wchar_t>:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ { ++ const mask __bit = static_cast<mask>(_ISbit(__bitcur)); ++ if (__m & __bit) ++ __ret |= __iswctype_l(__c, _M_convert_to_wmask(__bit), ++ _M_c_locale_ctype); ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (;__lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ { ++ const mask __bit = static_cast<mask>(_ISbit(__bitcur)); ++ if (__iswctype_l(*__lo, _M_convert_to_wmask(__bit), ++ _M_c_locale_ctype)) ++ __m |= __bit; ++ } ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype<wchar_t>:: ++ do_widen(char __c) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wchar_t __ret = btowc(__c); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ const char* ++ ctype<wchar_t>:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ mbstate_t __state; ++ memset(static_cast<void*>(&__state), 0, sizeof(mbstate_t)); ++ mbsrtowcs(__dest, &__lo, __hi - __lo, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ char ++ ctype<wchar_t>:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ size_t __offset = 0; ++ while (true) ++ { ++ const wchar_t* __start = __lo + __offset; ++ size_t __len = __hi - __start; ++ ++ mbstate_t __state; ++ memset(static_cast<void*>(&__state), 0, sizeof(mbstate_t)); ++ size_t __con = wcsrtombs(__dest + __offset, &__start, __len, &__state); ++ if (__con != __len && __start != 0) ++ { ++ __offset = __start - __lo; ++ __dest[__offset++] = __dfault; ++ } ++ else ++ break; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++#endif // _GLIBCPP_USE_WCHAR_T ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.cc 2004-01-09 08:46:16.000000000 -0600 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages<char>::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast<const char*>(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ wstring ++ messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.h 2004-01-09 08:52:48.000000000 -0600 +@@ -0,0 +1,122 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::messages(size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_messages = _S_c_name; ++#endif ++ _M_c_locale_messages = _S_c_locale; ++ } ++ ++ template<typename _CharT> ++ messages<_CharT>::messages(__c_locale __cloc, ++ const char* __s, size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_messages = new char[strlen(__s) + 1]; ++ strcpy(_M_name_messages, __s); ++#endif ++ _M_c_locale_messages = _S_clone_c_locale(__cloc); ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::~messages() ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_messages) ++ delete [] _M_name_messages; ++#endif ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string<char>& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template<typename _CharT> ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template<typename _CharT> ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_messages) ++ delete [] _M_name_messages; ++ _M_name_messages = new char[strlen(__s) + 1]; ++ strcpy(_M_name_messages, __s); ++#endif ++ _S_destroy_c_locale(_M_c_locale_messages); ++ _S_create_c_locale(_M_c_locale_messages, __s); ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/monetary_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2004-01-09 18:20:23.000000000 -0600 +@@ -0,0 +1,578 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = space; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[0] = sign; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[0] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = space; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__space) ++ { ++ // Have space. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ } ++ else ++ { ++ // Have none. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__space) ++ { ++ // Have space. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ } ++ else ++ { ++ // Have none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ default: ++ ; ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ _M_curr_symbol = ""; ++ _M_positive_sign = ""; ++ _M_negative_sign = ""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc)); ++ _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_negative_sign = "()"; ++ else ++ _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ ++ // _Intl == true ++ _M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ _M_curr_symbol = ""; ++ _M_positive_sign = ""; ++ _M_negative_sign = ""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc)); ++ _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_negative_sign = "()"; ++ else ++ _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ ++ // _Intl == false ++ _M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct<char, true>::~moneypunct() ++ { } ++ ++ template<> ++ moneypunct<char, false>::~moneypunct() ++ { } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ _M_curr_symbol = L""; ++ _M_positive_sign = L""; ++ _M_negative_sign = L""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ ++ _M_thousands_sep = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cpossign, __len, &__state); ++ _M_positive_sign = __wcs; ++ } ++ else ++ _M_positive_sign = L""; ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cnegsign, __len, &__state); ++ _M_negative_sign = __wcs; ++ } ++ else ++ _M_negative_sign = L""; ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_curr_symbol = __wcs; ++ } ++ else ++ _M_curr_symbol = L""; ++ ++ _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ _M_curr_symbol = L""; ++ _M_positive_sign = L""; ++ _M_negative_sign = L""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ _M_thousands_sep = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cpossign, __len, &__state); ++ _M_positive_sign = __wcs; ++ } ++ else ++ _M_positive_sign = L""; ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cnegsign, __len, &__state); ++ _M_negative_sign = __wcs; ++ } ++ else ++ _M_negative_sign = L""; ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_curr_symbol = __wcs; ++ } ++ else ++ _M_curr_symbol = L""; ++ ++ _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct<wchar_t, true>::~moneypunct() ++ { ++ if (wcslen(_M_positive_sign)) ++ delete [] _M_positive_sign; ++ if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0)) ++ delete [] _M_negative_sign; ++ if (wcslen(_M_curr_symbol)) ++ delete [] _M_curr_symbol; ++ } ++ ++ template<> ++ moneypunct<wchar_t, false>::~moneypunct() ++ { ++ if (wcslen(_M_positive_sign)) ++ delete [] _M_positive_sign; ++ if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0)) ++ delete [] _M_negative_sign; ++ if (wcslen(_M_curr_symbol)) ++ delete [] _M_curr_symbol; ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/numeric_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2004-01-09 18:20:59.000000000 -0600 +@@ -0,0 +1,129 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct<char>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(RADIXCHAR, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(THOUSEP, __cloc)); ++ // Check for NUL, which implies no grouping. ++ if (_M_thousands_sep == '\0') ++ _M_grouping = ""; ++ else ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ } ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_truename = "true"; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_falsename = "false"; ++ } ++ ++ template<> ++ numpunct<char>::~numpunct() ++ { } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ _M_thousands_sep = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ if (_M_thousands_sep == L'\0') ++ _M_grouping = ""; ++ else ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ } ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_truename = L"true"; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_falsename = L"false"; ++ } ++ ++ template<> ++ numpunct<wchar_t>::~numpunct() ++ { } ++ #endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.cc 2004-01-09 08:25:03.000000000 -0600 +@@ -0,0 +1,341 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct<char>:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __strftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_c_locale; ++ ++ _M_date_format = "%m/%d/%y"; ++ _M_date_era_format = "%m/%d/%y"; ++ _M_time_format = "%H:%M:%S"; ++ _M_time_era_format = "%H:%M:%S"; ++ _M_date_time_format = ""; ++ _M_date_time_era_format = ""; ++ _M_am = "AM"; ++ _M_pm = "PM"; ++ _M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = "Sunday"; ++ _M_day2 = "Monday"; ++ _M_day3 = "Tuesday"; ++ _M_day4 = "Wednesday"; ++ _M_day5 = "Thursday"; ++ _M_day6 = "Friday"; ++ _M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = "Sun"; ++ _M_day_a2 = "Mon"; ++ _M_day_a3 = "Tue"; ++ _M_day_a4 = "Wed"; ++ _M_day_a5 = "Thu"; ++ _M_day_a6 = "Fri"; ++ _M_day_a7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = "January"; ++ _M_month02 = "February"; ++ _M_month03 = "March"; ++ _M_month04 = "April"; ++ _M_month05 = "May"; ++ _M_month06 = "June"; ++ _M_month07 = "July"; ++ _M_month08 = "August"; ++ _M_month09 = "September"; ++ _M_month10 = "October"; ++ _M_month11 = "November"; ++ _M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = "Jan"; ++ _M_month_a02 = "Feb"; ++ _M_month_a03 = "Mar"; ++ _M_month_a04 = "Apr"; ++ _M_month_a05 = "May"; ++ _M_month_a06 = "Jun"; ++ _M_month_a07 = "July"; ++ _M_month_a08 = "Aug"; ++ _M_month_a09 = "Sep"; ++ _M_month_a10 = "Oct"; ++ _M_month_a11 = "Nov"; ++ _M_month_a12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc); ++ _M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_day_a2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_day_a3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_day_a4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_day_a5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_day_a6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_day_a7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_month_a02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_month_a03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_month_a04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_month_a05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_month_a06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_month_a07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_month_a08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_month_a09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_month_a10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_month_a11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_month_a12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ __timepunct<wchar_t>:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_c_locale; ++ ++ _M_date_format = L"%m/%d/%y"; ++ _M_date_era_format = L"%m/%d/%y"; ++ _M_time_format = L"%H:%M:%S"; ++ _M_time_era_format = L"%H:%M:%S"; ++ _M_date_time_format = L""; ++ _M_date_time_era_format = L""; ++ _M_am = L"AM"; ++ _M_pm = L"PM"; ++ _M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = L"Sunday"; ++ _M_day2 = L"Monday"; ++ _M_day3 = L"Tuesday"; ++ _M_day4 = L"Wednesday"; ++ _M_day5 = L"Thursday"; ++ _M_day6 = L"Friday"; ++ _M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = L"Sun"; ++ _M_day_a2 = L"Mon"; ++ _M_day_a3 = L"Tue"; ++ _M_day_a4 = L"Wed"; ++ _M_day_a5 = L"Thu"; ++ _M_day_a6 = L"Fri"; ++ _M_day_a7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = L"January"; ++ _M_month02 = L"February"; ++ _M_month03 = L"March"; ++ _M_month04 = L"April"; ++ _M_month05 = L"May"; ++ _M_month06 = L"June"; ++ _M_month07 = L"July"; ++ _M_month08 = L"August"; ++ _M_month09 = L"September"; ++ _M_month10 = L"October"; ++ _M_month11 = L"November"; ++ _M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = L"Jan"; ++ _M_month_a02 = L"Feb"; ++ _M_month_a03 = L"Mar"; ++ _M_month_a04 = L"Apr"; ++ _M_month_a05 = L"May"; ++ _M_month_a06 = L"Jun"; ++ _M_month_a07 = L"July"; ++ _M_month_a08 = L"Aug"; ++ _M_month_a09 = L"Sep"; ++ _M_month_a10 = L"Oct"; ++ _M_month_a11 = L"Nov"; ++ _M_month_a12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_date_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_FMT, __cloc)); ++ _M_date_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc)); ++ _M_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT, __cloc)); ++ _M_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc)); ++ _M_date_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_T_FMT, __cloc)); ++ _M_date_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc)); ++ _M_am = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WAM_STR, __cloc)); ++ _M_pm = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WPM_STR, __cloc)); ++ _M_am_pm_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc)); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_1, __cloc)); ++ _M_day2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_2, __cloc)); ++ _M_day3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_3, __cloc)); ++ _M_day4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_4, __cloc)); ++ _M_day5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_5, __cloc)); ++ _M_day6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_6, __cloc)); ++ _M_day7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_7, __cloc)); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_1, __cloc)); ++ _M_day_a2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_2, __cloc)); ++ _M_day_a3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_3, __cloc)); ++ _M_day_a4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_4, __cloc)); ++ _M_day_a5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_5, __cloc)); ++ _M_day_a6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_6, __cloc)); ++ _M_day_a7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_7, __cloc)); ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_1, __cloc)); ++ _M_month02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_2, __cloc)); ++ _M_month03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_3, __cloc)); ++ _M_month04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_4, __cloc)); ++ _M_month05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_5, __cloc)); ++ _M_month06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_6, __cloc)); ++ _M_month07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_7, __cloc)); ++ _M_month08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_8, __cloc)); ++ _M_month09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_9, __cloc)); ++ _M_month10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_10, __cloc)); ++ _M_month11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_11, __cloc)); ++ _M_month12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_12, __cloc)); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_1, __cloc)); ++ _M_month_a02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_2, __cloc)); ++ _M_month_a03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_3, __cloc)); ++ _M_month_a04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_4, __cloc)); ++ _M_month_a05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_5, __cloc)); ++ _M_month_a06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_6, __cloc)); ++ _M_month_a07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_7, __cloc)); ++ _M_month_a08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_8, __cloc)); ++ _M_month_a09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_9, __cloc)); ++ _M_month_a10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_10, __cloc)); ++ _M_month_a11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_11, __cloc)); ++ _M_month_a12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_12, __cloc)); ++ } ++#endif // 0 ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.h 2004-01-09 04:26:21.000000000 -0600 +@@ -0,0 +1,68 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_timepunct = _S_c_name; ++#endif ++ _M_initialize_timepunct(); ++ } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, ++ const char* __s, ++ size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_timepunct = new char[strlen(__s) + 1]; ++ strcpy(_M_name_timepunct, __s); ++#endif ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::~__timepunct() ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_timepunct) ++ delete [] _M_name_timepunct; ++#endif ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_base.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_base.h 2004-01-09 02:54:54.000000000 -0600 +@@ -0,0 +1,57 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ // NB: Offsets into ctype<char>::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISgraph; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalnum; ++ }; +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_inline.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_inline.h 2002-06-24 00:49:19.000000000 -0500 +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype<char>:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast<unsigned char>(__c)] & __m; } ++ ++ const char* ++ ctype<char>:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast<unsigned char>(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_noninline.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2004-01-09 03:34:53.000000000 -0600 +@@ -0,0 +1,90 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype<char>::classic_table() throw() ++ { ++ return __C_ctype_b; ++ } ++ ++ ctype<char>::ctype(__c_locale, const mask* __table, bool __del, ++ size_t __refs) ++ : __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ _M_c_locale_ctype = _S_c_locale; ++ } ++ ++ ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) : ++ __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ _M_c_locale_ctype = _S_c_locale; ++ } ++ ++ char ++ ctype<char>::do_toupper(char __c) const ++ { return _M_toupper[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype<char>::do_tolower(char __c) const ++ { return _M_tolower[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/os_defines.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/os_defines.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/os_defines.h 2004-01-09 04:56:13.000000000 -0600 +@@ -0,0 +1,56 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCPP_OS_DEFINES ++#define _GLIBCPP_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include <features.h> ++ ++// These systems have declarations mismatching those in libio.h by ++// omitting throw qualifiers. Cleanest way out is to not provide ++// throw-qualifiers at all. Defining it as empty here will make libio.h ++// not define it. ++#undef __THROW ++#define __THROW ++ ++// Tell Glibc not to try to provide its own inline versions of ++// some math functions. Those cause assembly-time clashes with ++// our definitions. ++#define __NO_MATH_INLINES ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif diff --git a/openwrt/toolchain/gcc/3.3.4/500-loop.patch b/openwrt/toolchain/gcc/3.3.4/500-loop.patch new file mode 100644 index 0000000000..476f84b377 --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.4/500-loop.patch @@ -0,0 +1,10 @@ +--- gcc/gcc/loop.c 14 Feb 2004 14:46:03 -0000 1.488.2.3 ++++ gcc/gcc/loop.c 28 Apr 2004 22:02:53 -0000 +@@ -929,6 +929,7 @@ + || (! (GET_CODE (SET_SRC (set)) == REG + && (REGNO (SET_SRC (set)) + < FIRST_PSEUDO_REGISTER)))) ++ && regno >= FIRST_PSEUDO_REGISTER + /* This test is not redundant; SET_SRC (set) might be + a call-clobbered register and the life of REGNO + might span a call. */ diff --git a/openwrt/toolchain/gcc/3.3.4/specs-arm-soft-float b/openwrt/toolchain/gcc/3.3.4/specs-arm-soft-float new file mode 100644 index 0000000000..d692174aab --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.4/specs-arm-soft-float @@ -0,0 +1,124 @@ +*asm: +%{mbig-endian:-EB} %{mlittle-endian:-EL} %{mcpu=*:-mcpu=%*} %{march=*:-march=%*} %{mapcs-*:-mapcs-%*} %(subtarget_asm_float_spec) %{mthumb-interwork:-mthumb-interwork} %(subtarget_extra_asm_spec) + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: + + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%(cpp_cpu_arch) %(subtarget_cpp_spec) %{mapcs-32:%{mapcs-26: %e-mapcs-26 and -mapcs-32 may not be used together}} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{mbig-endian:%{mlittle-endian: %e-mbig-endian and -mlittle-endian may not be used together}} + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{profile:-p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*link: +%{h*} %{version:-v} %{b} %{Wl,*:%*} %{static:-Bstatic} %{shared:-shared} %{symbolic:-Bsymbolic} %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} -X %{mbig-endian:-EB} -m armelf_linux -p + +*lib: +%{pthread:-lpthread} %{shared:-lc} %{!shared:%{profile:-lc_p}%{!profile:-lc}} + +*libgcc: +%{!mhard-float:-lfloat} %{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:-lgcc_s%M}}} + +*startfile: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.4 + +*multilib: +. ; + +*multilib_defaults: +marm mlittle-endian msoft-float mapcs-32 mno-thumb-interwork + +*multilib_extra: + + +*multilib_matches: + + +*multilib_exclusions: + + +*multilib_options: + + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*cpp_cpu_arch: +%{march=arm2:-D__ARM_ARCH_2__} %{march=arm250:-D__ARM_ARCH_2__} %{march=arm3:-D__ARM_ARCH_2__} %{march=arm6:-D__ARM_ARCH_3__} %{march=arm600:-D__ARM_ARCH_3__} %{march=arm610:-D__ARM_ARCH_3__} %{march=arm7:-D__ARM_ARCH_3__} %{march=arm700:-D__ARM_ARCH_3__} %{march=arm710:-D__ARM_ARCH_3__} %{march=arm720:-D__ARM_ARCH_3__} %{march=arm7100:-D__ARM_ARCH_3__} %{march=arm7500:-D__ARM_ARCH_3__} %{march=arm7500fe:-D__ARM_ARCH_3__} %{march=arm7m:-D__ARM_ARCH_3M__} %{march=arm7dm:-D__ARM_ARCH_3M__} %{march=arm7dmi:-D__ARM_ARCH_3M__} %{march=arm7tdmi:-D__ARM_ARCH_4T__} %{march=arm8:-D__ARM_ARCH_4__} %{march=arm810:-D__ARM_ARCH_4__} %{march=arm9:-D__ARM_ARCH_4T__} %{march=arm920:-D__ARM_ARCH_4__} %{march=arm920t:-D__ARM_ARCH_4T__} %{march=arm9tdmi:-D__ARM_ARCH_4T__} %{march=strongarm:-D__ARM_ARCH_4__} %{march=strongarm110:-D__ARM_ARCH_4__} %{march=strongarm1100:-D__ARM_ARCH_4__} %{march=xscale:-D__ARM_ARCH_5TE__} %{march=xscale:-D__XSCALE__} %{march=armv2:-D__ARM_ARCH_2__} %{march=armv2a:-D__ARM_ARCH_2__} %{march=armv3:-D__ARM_ARCH_3__} %{march=armv3m:-D__ARM_ARCH_3M__} %{march=armv4:-D__ARM_ARCH_4__} %{march=armv4t:-D__ARM_ARCH_4T__} %{march=armv5:-D__ARM_ARCH_5__} %{march=armv5t:-D__ARM_ARCH_5T__} %{march=armv5e:-D__ARM_ARCH_5E__} %{march=armv5te:-D__ARM_ARCH_5TE__} %{!march=*: %{mcpu=arm2:-D__ARM_ARCH_2__} %{mcpu=arm250:-D__ARM_ARCH_2__} %{mcpu=arm3:-D__ARM_ARCH_2__} %{mcpu=arm6:-D__ARM_ARCH_3__} %{mcpu=arm600:-D__ARM_ARCH_3__} %{mcpu=arm610:-D__ARM_ARCH_3__} %{mcpu=arm7:-D__ARM_ARCH_3__} %{mcpu=arm700:-D__ARM_ARCH_3__} %{mcpu=arm710:-D__ARM_ARCH_3__} %{mcpu=arm720:-D__ARM_ARCH_3__} %{mcpu=arm7100:-D__ARM_ARCH_3__} %{mcpu=arm7500:-D__ARM_ARCH_3__} %{mcpu=arm7500fe:-D__ARM_ARCH_3__} %{mcpu=arm7m:-D__ARM_ARCH_3M__} %{mcpu=arm7dm:-D__ARM_ARCH_3M__} %{mcpu=arm7dmi:-D__ARM_ARCH_3M__} %{mcpu=arm7tdmi:-D__ARM_ARCH_4T__} %{mcpu=arm8:-D__ARM_ARCH_4__} %{mcpu=arm810:-D__ARM_ARCH_4__} %{mcpu=arm9:-D__ARM_ARCH_4T__} %{mcpu=arm920:-D__ARM_ARCH_4__} %{mcpu=arm920t:-D__ARM_ARCH_4T__} %{mcpu=arm9tdmi:-D__ARM_ARCH_4T__} %{mcpu=strongarm:-D__ARM_ARCH_4__} %{mcpu=strongarm110:-D__ARM_ARCH_4__} %{mcpu=strongarm1100:-D__ARM_ARCH_4__} %{mcpu=xscale:-D__ARM_ARCH_5TE__} %{mcpu=xscale:-D__XSCALE__} %{!mcpu*:%(cpp_cpu_arch_default)}} + +*cpp_cpu_arch_default: +-D__ARM_ARCH_4T__ + +*subtarget_cpp_spec: +%{posix:-D_POSIX_SOURCE} %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} + +*subtarget_extra_asm_spec: + + +*subtarget_asm_float_spec: +%{mapcs-float:-mfloat} %{!mhard-float:-mno-fpu} + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/openwrt/toolchain/gcc/3.3.4/specs-mips-soft-float b/openwrt/toolchain/gcc/3.3.4/specs-mips-soft-float new file mode 100644 index 0000000000..2a4240012b --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.4/specs-mips-soft-float @@ -0,0 +1,145 @@ +*asm: +%{G*} %(endian_spec) %{mips1} %{mips2} %{mips3} %{mips4} %{mips32} %{mips64}%{mips16:%{!mno-mips16:-mips16}} %{mno-mips16:-no-mips16} %(subtarget_asm_optimizing_spec) %(subtarget_asm_debugging_spec) %{membedded-pic} %{mabi=32:-32}%{mabi=n32:-n32}%{mabi=64:-64}%{mabi=n64:-64} %{mabi=eabi} %{mabi=o64} %{!mabi*: %(asm_abi_default_spec)} %{mgp32} %{mgp64} %{march=*} %(target_asm_spec) %(subtarget_asm_spec) + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: +%| + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%(subtarget_cpp_spec) + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{profile:-p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*link: +%{!static:--eh-frame-hdr} %(endian_spec) %{shared:-shared} %{!shared: %{!ibcs: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} %{static:-static}}} + +*lib: +%{shared: -lc} %{!static:-rpath-link %R/lib:%R/usr/lib} %{!shared: %{pthread:-lpthread} %{profile:-lc_p} %{!profile: -lc}} + +*libgcc: +%{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:%{shared-libgcc:-lgcc_s%M}%{!shared-libgcc:-lgcc}}}} + +*startfile: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{static:crtbeginT.o%s} %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.4 + +*multilib: +. ; + +*multilib_defaults: +EB mips1 mabi=32 + +*multilib_extra: + + +*multilib_matches: + + +*multilib_exclusions: + + +*multilib_options: + + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*subtarget_cc1_spec: + + +*subtarget_cpp_spec: +%{fno-PIC:-U__PIC__ -U__pic__} %{fno-pic:-U__PIC__ -U__pic__} %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{pthread:-D_REENTRANT} + +*mips_as_asm_spec: +%{!.s:-nocpp} %{.s: %{cpp} %{nocpp}} %{pipe: %e-pipe is not supported} %{K} %(subtarget_mips_as_asm_spec) + +*gas_asm_spec: +%{mtune=*} %{v} + +*target_asm_spec: +%{mmips-as: %(mips_as_asm_spec)} %{!mmips-as: %(gas_asm_spec)} + +*subtarget_mips_as_asm_spec: +%{v} + +*subtarget_asm_optimizing_spec: +%{noasmopt:-O0} %{!noasmopt:%{O:-O2} %{O1:-O2} %{O2:-O2} %{O3:-O3}} + +*subtarget_asm_debugging_spec: +-g0 + +*mdebug_asm_spec: +%{!gdwarf*:-mdebug} %{gdwarf*:-no-mdebug} + +*subtarget_asm_spec: +%{mabi=64: -64} %{!fno-PIC:%{!fno-pic:-KPIC}} %{fno-PIC:-non_shared} %{fno-pic:-non_shared} + +*asm_abi_default_spec: +-32 + +*endian_spec: +%{!EL:%{!mel:-EB}} %{EL|mel:-EL} + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/openwrt/toolchain/gcc/3.3.4/specs-mipsel-soft-float b/openwrt/toolchain/gcc/3.3.4/specs-mipsel-soft-float new file mode 100644 index 0000000000..481bf5a395 --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.4/specs-mipsel-soft-float @@ -0,0 +1,145 @@ +*asm: +%{G*} %(endian_spec) %{mips1} %{mips2} %{mips3} %{mips4} %{mips32} %{mips64}%{mips16:%{!mno-mips16:-mips16}} %{mno-mips16:-no-mips16} %(subtarget_asm_optimizing_spec) %(subtarget_asm_debugging_spec) %{membedded-pic} %{mabi=32:-32}%{mabi=n32:-n32}%{mabi=64:-64}%{mabi=n64:-64} %{mabi=eabi} %{mabi=o64} %{!mabi*: %(asm_abi_default_spec)} %{mgp32} %{mgp64} %{march=*} %(target_asm_spec) %(subtarget_asm_spec) + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: +%| + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%(subtarget_cpp_spec) + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{profile:-p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*link: +%{!static:--eh-frame-hdr} %(endian_spec) %{shared:-shared} %{!shared: %{!ibcs: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} %{static:-static}}} + +*lib: +%{shared: -lc} %{!static:-rpath-link %R/lib:%R/usr/lib} %{!shared: %{pthread:-lpthread} %{profile:-lc_p} %{!profile: -lc}} + +*libgcc: +%{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:%{shared-libgcc:-lgcc_s%M}%{!shared-libgcc:-lgcc}}}} + +*startfile: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{static:crtbeginT.o%s} %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.4 + +*multilib: +. ; + +*multilib_defaults: +EL mips1 mabi=32 + +*multilib_extra: + + +*multilib_matches: + + +*multilib_exclusions: + + +*multilib_options: + + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*subtarget_cc1_spec: + + +*subtarget_cpp_spec: +%{fno-PIC:-U__PIC__ -U__pic__} %{fno-pic:-U__PIC__ -U__pic__} %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{pthread:-D_REENTRANT} + +*mips_as_asm_spec: +%{!.s:-nocpp} %{.s: %{cpp} %{nocpp}} %{pipe: %e-pipe is not supported} %{K} %(subtarget_mips_as_asm_spec) + +*gas_asm_spec: +%{mtune=*} %{v} + +*target_asm_spec: +%{mmips-as: %(mips_as_asm_spec)} %{!mmips-as: %(gas_asm_spec)} + +*subtarget_mips_as_asm_spec: +%{v} + +*subtarget_asm_optimizing_spec: +%{noasmopt:-O0} %{!noasmopt:%{O:-O2} %{O1:-O2} %{O2:-O2} %{O3:-O3}} + +*subtarget_asm_debugging_spec: +-g0 + +*mdebug_asm_spec: +%{!gdwarf*:-mdebug} %{gdwarf*:-no-mdebug} + +*subtarget_asm_spec: +%{mabi=64: -64} %{!fno-PIC:%{!fno-pic:-KPIC}} %{fno-PIC:-non_shared} %{fno-pic:-non_shared} + +*asm_abi_default_spec: +-32 + +*endian_spec: +%{!EB:%{!meb:-EL}} %{EB|meb:-EB} + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/openwrt/toolchain/gcc/3.3.4/specs-powerpc-soft-float b/openwrt/toolchain/gcc/3.3.4/specs-powerpc-soft-float new file mode 100644 index 0000000000..8a546ac8ec --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.4/specs-powerpc-soft-float @@ -0,0 +1,352 @@ +*asm: +%(asm_cpu) %{.s: %{mregnames} %{mno-regnames}} %{.S: %{mregnames} %{mno-regnames}} %{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} %{mrelocatable} %{mrelocatable-lib} %{fpic:-K PIC} %{fPIC:-K PIC} %{memb} %{!memb: %{msdata: -memb} %{msdata=eabi: -memb}} %{mlittle} %{mlittle-endian} %{mbig} %{mbig-endian} %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: %{mcall-freebsd: -mbig} %{mcall-i960-old: -mlittle} %{mcall-linux: -mbig} %{mcall-gnu: -mbig} %{mcall-netbsd: -mbig} }}}} + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: +%| + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%{posix: -D_POSIX_SOURCE} %(cpp_sysv) %{mads: %(cpp_os_ads) } %{myellowknife: %(cpp_os_yellowknife) } %{mmvme: %(cpp_os_mvme) } %{msim: %(cpp_os_sim) } %{mwindiss: %(cpp_os_windiss) } %{mcall-freebsd: %(cpp_os_freebsd) } %{mcall-linux: %(cpp_os_linux) } %{mcall-gnu: %(cpp_os_gnu) } %{mcall-netbsd: %(cpp_os_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(cpp_os_default) }}}}}}}}} + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{G*} %{mlittle: %(cc1_endian_little)} %{!mlittle: %{mlittle-endian: %(cc1_endian_little)}} %{mbig: %(cc1_endian_big)} %{!mbig: %{mbig-endian: %(cc1_endian_big)}} %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: %{mcall-aixdesc: -mbig %(cc1_endian_big) } %{mcall-freebsd: -mbig %(cc1_endian_big) } %{mcall-i960-old: -mlittle %(cc1_endian_little) } %{mcall-linux: -mbig %(cc1_endian_big) } %{mcall-gnu: -mbig %(cc1_endian_big) } %{mcall-netbsd: -mbig %(cc1_endian_big) } %{!mcall-aixdesc: %{!mcall-freebsd: %{!mcall-i960-old: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(cc1_endian_default) }}}}}} }}}} %{mno-sdata: -msdata=none } %{meabi: %{!mcall-*: -mcall-sysv }} %{!meabi: %{!mno-eabi: %{mrelocatable: -meabi } %{mcall-freebsd: -mno-eabi } %{mcall-i960-old: -meabi } %{mcall-linux: -mno-eabi } %{mcall-gnu: -mno-eabi } %{mcall-netbsd: -mno-eabi }}} %{msdata: -msdata=default} %{mno-sdata: -msdata=none} %{profile: -p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{mads: crtsavres.o%s %(endfile_ads)} %{myellowknife: crtsavres.o%s %(endfile_yellowknife)} %{mmvme: crtsavres.o%s %(endfile_mvme)} %{msim: crtsavres.o%s %(endfile_sim)} %{mwindiss: %(endfile_windiss)} %{mcall-freebsd: crtsavres.o%s %(endfile_freebsd) } %{mcall-linux: crtsavres.o%s %(endfile_linux) } %{mcall-gnu: crtsavres.o%s %(endfile_gnu) } %{mcall-netbsd: crtsavres.o%s %(endfile_netbsd) } %{mvxworks: crtsavres.o%s %(endfile_vxworks) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %{!mvxworks: %(crtsavres_default) %(endfile_default) }}}}}}}}}} + +*link: +%{!static:--eh-frame-hdr} %{h*} %{v:-V} %{!msdata=none:%{G*}} %{msdata=none:-G0} %{YP,*} %{R*} %{Qy:} %{!Qn:-Qy} %(link_shlib) %{!Wl,-T*: %{!T*: %(link_start) }} %(link_target) %(link_os) + +*lib: +%{mads: %(lib_ads) } %{myellowknife: %(lib_yellowknife) } %{mmvme: %(lib_mvme) } %{msim: %(lib_sim) } %{mwindiss: %(lib_windiss) } %{mcall-freebsd: %(lib_freebsd) } %{mcall-linux: %(lib_linux) } %{mcall-gnu: %(lib_gnu) } %{mcall-netbsd: %(lib_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(lib_default) }}}}}}}}} + +*libgcc: +%{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:%{shared-libgcc:-lgcc_s%M}%{!shared-libgcc:-lgcc}}}} + +*startfile: +%{mads: %(startfile_ads) } %{myellowknife: %(startfile_yellowknife) } %{mmvme: %(startfile_mvme) } %{msim: %(startfile_sim) } %{mwindiss: %(startfile_windiss) } %{mcall-freebsd: %(startfile_freebsd) } %{mcall-linux: %(startfile_linux) } %{mcall-gnu: %(startfile_gnu) } %{mcall-netbsd: %(startfile_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(startfile_default) }}}}}}}}} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.4 + +*multilib: +. mhard-float;nof !mhard-float; + +*multilib_defaults: +mbig mcall-sysv + +*multilib_extra: +fPIC mstrict-align + +*multilib_matches: +mcpu=401 msoft-float;mcpu=403 msoft-float;mcpu=405 msoft-float;mcpu=ec603e msoft-float;mcpu=801 msoft-float;mcpu=821 msoft-float;mcpu=823 msoft-float;mcpu=860 msoft-float;msoft-float msoft-float; + +*multilib_exclusions: + + +*multilib_options: +msoft-float + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*cpp_default: + + +*asm_cpu: +%{!mcpu*: %{mpower: %{!mpower2: -mpwr}} %{mpower2: -mpwrx} %{mpowerpc*: -mppc} %{mno-power: %{!mpowerpc*: -mcom}} %{!mno-power: %{!mpower2: %(asm_default)}}} %{mcpu=common: -mcom} %{mcpu=power: -mpwr} %{mcpu=power2: -mpwrx} %{mcpu=power3: -m604} %{mcpu=power4: -mpower4} %{mcpu=powerpc: -mppc} %{mcpu=rios: -mpwr} %{mcpu=rios1: -mpwr} %{mcpu=rios2: -mpwrx} %{mcpu=rsc: -mpwr} %{mcpu=rsc1: -mpwr} %{mcpu=401: -mppc} %{mcpu=403: -m403} %{mcpu=405: -m405} %{mcpu=505: -mppc} %{mcpu=601: -m601} %{mcpu=602: -mppc} %{mcpu=603: -mppc} %{mcpu=603e: -mppc} %{mcpu=ec603e: -mppc} %{mcpu=604: -mppc} %{mcpu=604e: -mppc} %{mcpu=620: -mppc} %{mcpu=630: -m604} %{mcpu=740: -mppc} %{mcpu=7400: -mppc} %{mcpu=7450: -mppc} %{mcpu=750: -mppc} %{mcpu=801: -mppc} %{mcpu=821: -mppc} %{mcpu=823: -mppc} %{mcpu=860: -mppc} %{mcpu=8540: -me500} %{maltivec: -maltivec} + +*asm_default: +-mppc + +*cpp_sysv: +%{mrelocatable*: -D_RELOCATABLE} %{fpic: -D__PIC__=1 -D__pic__=1} %{!fpic: %{fPIC: -D__PIC__=2 -D__pic__=2}} + +*crtsavres_default: +crtsavres.o%s + +*lib_ads: +--start-group -lads -lc --end-group + +*lib_yellowknife: +--start-group -lyk -lc --end-group + +*lib_mvme: +--start-group -lmvme -lc --end-group + +*lib_sim: +--start-group -lsim -lc --end-group + +*lib_freebsd: + %{!shared: %{!pg: %{!pthread:-lc} %{pthread:-lc_r}} %{pg: %{!pthread:-lc_p} %{pthread:-lc_r_p}} } + +*lib_gnu: +%{mnewlib: --start-group -lgnu -lc --end-group } %{!mnewlib: %{shared:-lc} %{!shared: %{pthread:-lpthread } %{profile:-lc_p} %{!profile:-lc}}} + +*lib_linux: +%{mnewlib: --start-group -llinux -lc --end-group } %{!mnewlib: %{pthread:-lpthread} %{shared:-lc} %{!shared: %{profile:-lc_p} %{!profile:-lc}}} + +*lib_netbsd: +%{profile:-lgmon -lc_p} %{!profile:-lc} + +*lib_vxworks: + + +*lib_windiss: +--start-group -li -lcfp -lwindiss -lram -limpl -limpfp --end-group + +*lib_default: +%(lib_linux) + +*startfile_ads: +ecrti.o%s crt0.o%s crtbegin.o%s + +*startfile_yellowknife: +ecrti.o%s crt0.o%s crtbegin.o%s + +*startfile_mvme: +ecrti.o%s crt0.o%s crtbegin.o%s + +*startfile_sim: +ecrti.o%s sim-crt0.o%s crtbegin.o%s + +*startfile_freebsd: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*startfile_gnu: +%{!shared: %{!static: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}} %{static: %{pg:gcrt0.o%s} %{!pg:%{p:gcrt0.o%s} %{!p:crt0.o%s}}} %{mnewlib: ecrti.o%s} %{!mnewlib: crti.o%s} %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*startfile_linux: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} %{mnewlib: ecrti.o%s} %{!mnewlib: crti.o%s} %{static:crtbeginT.o%s} %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}} + +*startfile_netbsd: +ncrti.o%s crt0.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*startfile_vxworks: + + +*startfile_windiss: +crt0.o%s crtbegin.o%s + +*startfile_default: +%(startfile_linux) + +*endfile_ads: +crtend.o%s ecrtn.o%s + +*endfile_yellowknife: +crtend.o%s ecrtn.o%s + +*endfile_mvme: +crtend.o%s ecrtn.o%s + +*endfile_sim: +crtend.o%s ecrtn.o%s + +*endfile_freebsd: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*endfile_gnu: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} %{mnewlib: ecrtn.o%s} %{!mnewlib: crtn.o%s} + +*endfile_linux: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} %{mnewlib: ecrtn.o%s} %{!mnewlib: crtn.o%s} + +*endfile_netbsd: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} ncrtn.o%s + +*endfile_vxworks: + + +*endfile_windiss: +crtend.o%s + +*endfile_default: +%(endfile_linux) + +*link_path: + + +*link_shlib: +%{shared:-shared} %{!shared: %{static:-static}} + +*link_target: +%{mlittle: --oformat elf32-powerpcle } %{mlittle-endian: --oformat elf32-powerpcle } %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: %{mcall-i960-old: --oformat elf32-powerpcle} }}}} + +*link_start: +%{mads: %(link_start_ads) } %{myellowknife: %(link_start_yellowknife) } %{mmvme: %(link_start_mvme) } %{msim: %(link_start_sim) } %{mwindiss: %(link_start_windiss) } %{mcall-freebsd: %(link_start_freebsd) } %{mcall-linux: %(link_start_linux) } %{mcall-gnu: %(link_start_gnu) } %{mcall-netbsd: %(link_start_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %{!mcall-freebsd: %(link_start_default) }}}}}}}}} + +*link_start_ads: +-T ads.ld%s + +*link_start_yellowknife: +-T yellowknife.ld%s + +*link_start_mvme: +-Ttext 0x40000 + +*link_start_sim: + + +*link_start_freebsd: + + +*link_start_gnu: + + +*link_start_linux: + + +*link_start_netbsd: + + +*link_start_vxworks: + + +*link_start_windiss: + + +*link_start_default: +%(link_start_linux) + +*link_os: +%{mads: %(link_os_ads) } %{myellowknife: %(link_os_yellowknife) } %{mmvme: %(link_os_mvme) } %{msim: %(link_os_sim) } %{mwindiss: %(link_os_windiss) } %{mcall-freebsd: %(link_os_freebsd) } %{mcall-linux: %(link_os_linux) } %{mcall-gnu: %(link_os_gnu) } %{mcall-netbsd: %(link_os_netbsd) } %{mcall-uclibc: %(link_os_linux_uclibc) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %{!mcall-uclibc: %(link_os_default) }}}}}}}}}} + +*link_os_ads: + + +*link_os_yellowknife: + + +*link_os_mvme: + + +*link_os_sim: +-m elf32ppcsim + +*link_os_freebsd: + %{p:%e`-p' not supported; use `-pg' and gprof(1)} %{Wl,*:%*} %{v:-V} %{assert*} %{R*} %{rpath*} %{defsym*} %{shared:-Bshareable %{h*} %{soname*}} %{!shared: %{!static: %{rdynamic: -export-dynamic} %{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} %{static:-Bstatic}} %{symbolic:-Bsymbolic} + +*link_os_linux: +-m elf32ppclinux %{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}} + +*link_os_gnu: +-m elf32ppclinux %{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}} + +*link_os_netbsd: +%{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}}} + +*link_os_vxworks: +-r + +*link_os_windiss: + + +*link_os_linux_uclibc: +-m elf32ppclinux %{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} + +*link_os_default: +%(link_os_linux_uclibc) + +*cc1_endian_big: + + +*cc1_endian_little: +%{!mstrict-align: %{!mno-strict-align: %{!mcall-i960-old: -mstrict-align } }} + +*cc1_endian_default: +%(cc1_endian_big) + +*cpp_os_ads: + + +*cpp_os_yellowknife: + + +*cpp_os_mvme: + + +*cpp_os_sim: + + +*cpp_os_freebsd: + -D__ELF__ -D__PPC__ -D__ppc__ -D__PowerPC__ -D__powerpc__ -Acpu=powerpc -Amachine=powerpc + +*cpp_os_gnu: +-D__unix__ -D__gnu_hurd__ -D__GNU__ %{!undef: %{!ansi: -Dunix -D__unix}} -Asystem=gnu -Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT} + +*cpp_os_linux: +-D__unix__ -D__gnu_linux__ -D__linux__ %{!undef: %{!ansi: %{!std=*:-Dunix -D__unix -Dlinux -D__linux} %{std=gnu*:-Dunix -D__unix -Dlinux -D__linux}}} -Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT} + +*cpp_os_netbsd: +-D__powerpc__ -D__NetBSD__ -D__ELF__ -D__KPRINTF_ATTRIBUTE__ + +*cpp_os_rtems: +%{!mcpu*: %{!Dppc*: %{!Dmpc*: -Dmpc750} } }%{mcpu=403: %{!Dppc*: %{!Dmpc*: -Dppc403} } } %{mcpu=505: %{!Dppc*: %{!Dmpc*: -Dmpc505} } } %{mcpu=601: %{!Dppc*: %{!Dmpc*: -Dppc601} } } %{mcpu=602: %{!Dppc*: %{!Dmpc*: -Dppc602} } } %{mcpu=603: %{!Dppc*: %{!Dmpc*: -Dppc603} } } %{mcpu=603e: %{!Dppc*: %{!Dmpc*: -Dppc603e} } } %{mcpu=604: %{!Dppc*: %{!Dmpc*: -Dmpc604} } } %{mcpu=750: %{!Dppc*: %{!Dmpc*: -Dmpc750} } } %{mcpu=821: %{!Dppc*: %{!Dmpc*: -Dmpc821} } } %{mcpu=860: %{!Dppc*: %{!Dmpc*: -Dmpc860} } } + +*cpp_os_vxworks: +-DCPU_FAMILY=PPC %{!mcpu*: %{mpowerpc*: -DCPU=PPC603} %{!mno-powerpc: -DCPU=PPC603}} %{mcpu=powerpc: -DCPU=PPC603} %{mcpu=401: -DCPU=PPC403} %{mcpu=403: -DCPU=PPC403} %{mcpu=405: -DCPU=PPC405} %{mcpu=601: -DCPU=PPC601} %{mcpu=602: -DCPU=PPC603} %{mcpu=603: -DCPU=PPC603} %{mcpu=603e: -DCPU=PPC603} %{mcpu=ec603e: -DCPU=PPC603} %{mcpu=604: -DCPU=PPC604} %{mcpu=604e: -DCPU=PPC604} %{mcpu=620: -DCPU=PPC604} %{mcpu=740: -DCPU=PPC603} %{mcpu=7450: -DCPU=PPC603} %{mcpu=750: -DCPU=PPC603} %{mcpu=801: -DCPU=PPC603} %{mcpu=821: -DCPU=PPC603} %{mcpu=823: -DCPU=PPC603} %{mcpu=860: -DCPU=PPC603} + +*cpp_os_windiss: +-D__rtasim -D__EABI__ -D__ppc %{!msoft-float: -D__hardfp} + +*cpp_os_default: +%(cpp_os_linux) + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/openwrt/toolchain/gcc/3.3.5/100-uclibc-conf.patch b/openwrt/toolchain/gcc/3.3.5/100-uclibc-conf.patch new file mode 100644 index 0000000000..4bbe21b7aa --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.5/100-uclibc-conf.patch @@ -0,0 +1,1635 @@ +diff -urN gcc-3.3.3-dist/boehm-gc/config.sub gcc-3.3.3/boehm-gc/config.sub +--- gcc-3.3.3-dist/boehm-gc/config.sub 2002-02-11 22:37:53.000000000 -0600 ++++ gcc-3.3.3/boehm-gc/config.sub 2004-08-12 04:47:51.000000000 -0500 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | storm-chaos* | os2-emx* | windows32-*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1089,7 +1089,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN gcc-3.3.3-dist/boehm-gc/configure gcc-3.3.3/boehm-gc/configure +--- gcc-3.3.3-dist/boehm-gc/configure 2004-02-14 14:34:20.000000000 -0600 ++++ gcc-3.3.3/boehm-gc/configure 2004-08-12 04:47:51.000000000 -0500 +@@ -1940,6 +1940,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN gcc-3.3.3-dist/config.sub gcc-3.3.3/config.sub +--- gcc-3.3.3-dist/config.sub 2003-01-30 17:25:36.000000000 -0600 ++++ gcc-3.3.3/config.sub 2004-08-12 04:47:51.000000000 -0500 +@@ -118,7 +118,7 @@ + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) ++ nto-qnx* | linux-gnu* | linux-uclibc* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -1112,7 +1112,8 @@ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -mingw32* | -linux-gnu* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ +diff -urN gcc-3.3.3-dist/gcc/config/arm/linux-elf.h gcc-3.3.3/gcc/config/arm/linux-elf.h +--- gcc-3.3.3-dist/gcc/config/arm/linux-elf.h 2003-09-16 10:39:23.000000000 -0500 ++++ gcc-3.3.3/gcc/config/arm/linux-elf.h 2004-08-12 04:47:51.000000000 -0500 +@@ -78,6 +78,18 @@ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC "%{h*} %{version:-v} \ ++ %{b} %{Wl,*:%*} \ ++ %{static:-Bstatic} \ ++ %{shared:-shared} \ ++ %{symbolic:-Bsymbolic} \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ ++ -X \ ++ %{mbig-endian:-EB}" \ ++ SUBTARGET_EXTRA_LINK_SPEC ++#else + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ +@@ -88,6 +100,7 @@ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC ++#endif + + #define TARGET_OS_CPP_BUILTINS() \ + do { \ +diff -urN gcc-3.3.3-dist/gcc/config/cris/linux.h gcc-3.3.3/gcc/config/cris/linux.h +--- gcc-3.3.3-dist/gcc/config/cris/linux.h 2003-03-10 21:01:35.000000000 -0600 ++++ gcc-3.3.3/gcc/config/cris/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -81,6 +81,25 @@ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -95,6 +114,8 @@ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +diff -urN gcc-3.3.3-dist/gcc/config/cris/t-linux-uclibc gcc-3.3.3/gcc/config/cris/t-linux-uclibc +--- gcc-3.3.3-dist/gcc/config/cris/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/cris/t-linux-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,3 @@ ++T_CFLAGS = -DUSE_UCLIBC ++TARGET_LIBGCC2_CFLAGS += -fPIC ++CRTSTUFF_T_CFLAGS_S = $(TARGET_LIBGCC2_CFLAGS) +diff -urN gcc-3.3.3-dist/gcc/config/i386/linux.h gcc-3.3.3/gcc/config/i386/linux.h +--- gcc-3.3.3-dist/gcc/config/i386/linux.h 2003-11-14 00:46:12.000000000 -0600 ++++ gcc-3.3.3/gcc/config/i386/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -136,6 +136,15 @@ + %{static:-static}}}" + #endif + #else ++#if defined USE_UCLIBC ++#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ +@@ -144,6 +153,7 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}}}" + #endif ++#endif + + /* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named +diff -urN gcc-3.3.3-dist/gcc/config/mips/linux.h gcc-3.3.3/gcc/config/mips/linux.h +--- gcc-3.3.3-dist/gcc/config/mips/linux.h 2003-12-23 02:58:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/mips/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -175,6 +175,17 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC \ ++ "%(endian_spec) \ ++ %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ +@@ -184,6 +195,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ + %{static:-static}}}" ++#endif + + #undef SUBTARGET_ASM_SPEC + #define SUBTARGET_ASM_SPEC "\ +diff -urN gcc-3.3.3-dist/gcc/config/sh/linux.h gcc-3.3.3/gcc/config/sh/linux.h +--- gcc-3.3.3-dist/gcc/config/sh/linux.h 2003-11-06 17:13:33.000000000 -0600 ++++ gcc-3.3.3/gcc/config/sh/linux.h 2004-08-12 04:47:51.000000000 -0500 +@@ -44,12 +44,21 @@ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define SUBTARGET_LINK_SPEC \ ++ "%{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}" ++#else + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}" ++#endif + + /* The GNU C++ standard library requires that these macros be defined. */ + #undef CPLUSPLUS_CPP_SPEC +diff -urN gcc-3.3.3-dist/gcc/config/sh/t-linux-uclibc gcc-3.3.3/gcc/config/sh/t-linux-uclibc +--- gcc-3.3.3-dist/gcc/config/sh/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/sh/t-linux-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,16 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++TARGET_LIBGCC2_CFLAGS = -fpic ++LIB1ASMFUNCS_CACHE = _ic_invalidate ++ ++LIB2FUNCS_EXTRA= ++ ++MULTILIB_OPTIONS= $(MULTILIB_ENDIAN) m3e/m4 ++MULTILIB_DIRNAMES= ++MULTILIB_MATCHES = ++MULTILIB_EXCEPTIONS= ++ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o +diff -urN gcc-3.3.3-dist/gcc/config/sh/t-sh64-uclibc gcc-3.3.3/gcc/config/sh/t-sh64-uclibc +--- gcc-3.3.3-dist/gcc/config/sh/t-sh64-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/sh/t-sh64-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,13 @@ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o ++ ++LIB1ASMFUNCS = \ ++ _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ ++ _shcompact_call_trampoline _shcompact_return_trampoline \ ++ _shcompact_incoming_args _ic_invalidate _nested_trampoline \ ++ _push_pop_shmedia_regs \ ++ _udivdi3 _divdi3 _umoddi3 _moddi3 ++ ++MULTILIB_OPTIONS = $(MULTILIB_ENDIAN) m5-32media-nofpu/m5-compact/m5-compact-nofpu/m5-64media/m5-64media-nofpu ++MULTILIB_DIRNAMES= $(MULTILIB_ENDIAN) nofpu compact nofpu/compact media64 nofpu/media64 ++MULTILIB_MATCHES= ++MULTILIB_EXCEPTIONS= +diff -urN gcc-3.3.3-dist/gcc/config/t-linux-uclibc gcc-3.3.3/gcc/config/t-linux-uclibc +--- gcc-3.3.3-dist/gcc/config/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config/t-linux-uclibc 2004-08-12 04:47:51.000000000 -0500 +@@ -0,0 +1,23 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Don't run fixproto ++STMP_FIXPROTO = ++ ++# Compile crtbeginS.o and crtendS.o with pic. ++CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC ++# Compile libgcc2.a with pic. ++TARGET_LIBGCC2_CFLAGS = -fPIC ++ ++# Override t-slibgcc-elf-ver to export some libgcc symbols with ++# the symbol versions that glibc used. ++SHLIB_MAPFILES += $(srcdir)/config/libgcc-glibc.ver ++ ++# Use unwind-dw2-fde-glibc ++#LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde-glibc.c \ ++# $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c ++#LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h unwind-dw2-fde.c ++ ++# Use unwind-dw2-fde ++LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ ++ $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c ++LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h +diff -urN gcc-3.3.3-dist/gcc/config.gcc gcc-3.3.3/gcc/config.gcc +--- gcc-3.3.3-dist/gcc/config.gcc 2004-01-21 00:06:00.000000000 -0600 ++++ gcc-3.3.3/gcc/config.gcc 2004-08-12 04:47:51.000000000 -0500 +@@ -697,6 +697,17 @@ + extra_parts="" + use_collect2=yes + ;; ++arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc ++ tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ case x${enable_threads} in ++ x | xyes | xpthreads | xposix) ++ thread_file='posix' ++ ;; ++ esac ++ ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h" + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" +@@ -772,6 +783,10 @@ + tmake_file="cris/t-cris cris/t-elfmulti" + gas=yes + ;; ++cris-*-linux-uclibc*) ++ tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" ++ tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux-uclibc" ++ ;; + cris-*-linux*) + tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" + tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux" +@@ -1173,6 +1188,11 @@ + thread_file='single' + fi + ;; ++i[34567]86-*-linux*uclibc*) # Intel 80386's running GNU/Linux ++ # with ELF format using uClibc ++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc i386/t-crtstuff" ++ ;; + i[34567]86-*-linux*) # Intel 80386's running GNU/Linux + # with ELF format using glibc 2 + # aka GNU/Linux C library 6 +@@ -1883,6 +1903,16 @@ + tm_file="elfos.h ${tm_file} mips/netbsd.h" + tmake_file="${tmake_file} mips/t-netbsd" + ;; ++mips*-*-linux-uclibc*) # Linux MIPS, either endian. uClibc ++ tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" ++ case $machine in ++ mipsisa32*-*) ++ target_cpu_default="MASK_SOFT_FLOAT" ++ tm_defines="MIPS_ISA_DEFAULT=32" ++ ;; ++ esac ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc mips/t-linux" ++ ;; + mips*-*-linux*) # Linux MIPS, either endian. + tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" + case $machine in +@@ -2129,6 +2159,11 @@ + out_file=rs6000/rs6000.c + tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" + ;; ++powerpc-*-linux-uclibc*) ++ tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" ++ out_file=rs6000/rs6000.c ++ tmake_file="rs6000/t-ppcos t-slibgcc-elf-ver t-linux-uclibc rs6000/t-ppccomm" ++ ;; + powerpc-*-linux*) + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" + out_file=rs6000/rs6000.c +@@ -2313,10 +2348,18 @@ + tmake_file="${tmake_file} sh/t-le" + ;; + esac +- tmake_file="${tmake_file} sh/t-linux" ++ case $machine in ++ *-*-linux-uclibc*) tmake_file="${tmake_file} sh/t-linux-uclibc" ;; ++ *) tmake_file="${tmake_file} sh/t-linux" ;; ++ esac + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/linux.h" + gas=yes gnu_ld=yes + case $machine in ++ sh64*-*-linux-uclibc*) ++ tmake_file="${tmake_file} sh/t-sh64-uclibc" ++ tm_file="${tm_file} sh/sh64.h" ++ extra_headers="shmedia.h ushmedia.h sshmedia.h" ++ ;; + sh64*) + tmake_file="${tmake_file} sh/t-sh64" + tm_file="${tm_file} sh/sh64.h" +diff -urN gcc-3.3.3-dist/libstdc++-v3/aclocal.m4 gcc-3.3.3/libstdc++-v3/aclocal.m4 +--- gcc-3.3.3-dist/libstdc++-v3/aclocal.m4 2004-01-12 10:18:44.000000000 -0600 ++++ gcc-3.3.3/libstdc++-v3/aclocal.m4 2004-08-12 04:47:51.000000000 -0500 +@@ -1216,6 +1216,9 @@ + dnl Default to "generic" + if test x$enable_clocale_flag = xno; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu*) + AC_EGREP_CPP([_GLIBCPP_ok], [ + #include <features.h> +@@ -1339,6 +1342,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ xuclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcpp_MOFILES="$glibcpp_MOFILES $ling.mo"; \ ++ glibcpp_POFILES="$glibcpp_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcpp_MOFILES) ++ AC_SUBST(glibcpp_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/uclibc/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + *) + echo "$enable_clocale is an unknown locale package" 1>&2 + exit 1 +diff -urN gcc-3.3.3-dist/libstdc++-v3/configure gcc-3.3.3/libstdc++-v3/configure +--- gcc-3.3.3-dist/libstdc++-v3/configure 2004-01-12 10:18:45.000000000 -0600 ++++ gcc-3.3.3/libstdc++-v3/configure 2004-08-12 04:49:13.000000000 -0500 +@@ -2010,6 +2010,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -2996,6 +3001,9 @@ + + if test x$enable_clocale_flag = xno; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu*) + cat > conftest.$ac_ext <<EOF + #line 3002 "configure" +@@ -3182,6 +3190,70 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ xuclibc) ++ echo "$ac_t""uclibc" 1>&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; ac_word=$2 ++echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 ++echo "configure:3117: checking for $ac_word" >&5 ++if eval "test \"`echo '$''{'ac_cv_prog_check_msgfmt'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. ++else ++ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" ++ ac_dummy="$PATH" ++ for ac_dir in $ac_dummy; do ++ test -z "$ac_dir" && ac_dir=. ++ if test -f $ac_dir/$ac_word; then ++ ac_cv_prog_check_msgfmt="yes" ++ break ++ fi ++ done ++ IFS="$ac_save_ifs" ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt="$ac_cv_prog_check_msgfmt" ++if test -n "$check_msgfmt"; then ++ echo "$ac_t""$check_msgfmt" 1>&6 ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcpp_MOFILES="$glibcpp_MOFILES $ling.mo"; \ ++ glibcpp_POFILES="$glibcpp_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/uclibc/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + *) + echo "$enable_clocale is an unknown locale package" 1>&2 + exit 1 +@@ -4212,6 +4284,968 @@ + # GLIBCPP_CHECK_MATH_SUPPORT + + case "$target" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h locale.h float.h inttypes.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4224: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4229 "configure" ++#include "confdefs.h" ++#include <$ac_hdr> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4234: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_hdr 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++fi ++done ++ ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ ++ ++ # If we're not using GNU ld, then there's no point in even trying these ++ # tests. Check for that first. We should have already tested for gld ++ # by now (in libtool), but require it now just to be safe... ++ test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS='' ++ test -z "$OPT_LDFLAGS" && OPT_LDFLAGS='' ++ ++ ++ # The name set by libtool depends on the version of libtool. Shame on us ++ # for depending on an impl detail, but c'est la vie. Older versions used ++ # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on ++ # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually ++ # makes sense). We'll test with_gnu_ld everywhere else, so if that isn't ++ # set (hence we're using an older libtool), then set it. ++ if test x${with_gnu_ld+set} != xset; then ++ if test x${ac_cv_prog_gnu_ld+set} != xset; then ++ # We got through "ac_require(ac_prog_ld)" and still not set? Huh? ++ with_gnu_ld=no ++ else ++ with_gnu_ld=$ac_cv_prog_gnu_ld ++ fi ++ fi ++ ++ # Start by getting the version number. I think the libtool test already ++ # does some of this, but throws away the result. ++ ++ ldver=`$LD --version 2>/dev/null | head -1 | \ ++ sed -e 's/GNU ld version \([0-9.][0-9.]*\).*/\1/'` ++ ++ glibcpp_gnu_ld_version=`echo $ldver | \ ++ $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'` ++ ++ # Set --gc-sections. ++ if test "$with_gnu_ld" = "notbroken"; then ++ # GNU ld it is! Joy and bunny rabbits! ++ ++ # All these tests are for C++; save the language and the compiler flags. ++ # Need to do this so that g++ won't try to link in libstdc++ ++ ac_test_CFLAGS="${CFLAGS+set}" ++ ac_save_CFLAGS="$CFLAGS" ++ CFLAGS='-x c++ -Wl,--gc-sections' ++ ++ # Check for -Wl,--gc-sections ++ # XXX This test is broken at the moment, as symbols required for ++ # linking are now in libsupc++ (not built yet.....). In addition, ++ # this test has cored on solaris in the past. In addition, ++ # --gc-sections doesn't really work at the moment (keeps on discarding ++ # used sections, first .eh_frame and now some of the glibc sections for ++ # iconv). Bzzzzt. Thanks for playing, maybe next time. ++ echo $ac_n "checking for ld that supports -Wl,--gc-sections""... $ac_c" 1>&6 ++echo "configure:4312: checking for ld that supports -Wl,--gc-sections" >&5 ++ if test "$cross_compiling" = yes; then ++ ac_sectionLDflags=yes ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4317 "configure" ++#include "confdefs.h" ++ ++ int main(void) ++ { ++ try { throw 1; } ++ catch (...) { }; ++ return 0; ++ } ++ ++EOF ++if { (eval echo configure:4328: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ++then ++ ac_sectionLDflags=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -fr conftest* ++ ac_sectionLDflags=no ++fi ++rm -fr conftest* ++fi ++ ++ if test "$ac_test_CFLAGS" = set; then ++ CFLAGS="$ac_save_CFLAGS" ++ else ++ # this is the suspicious part ++ CFLAGS='' ++ fi ++ if test "$ac_sectionLDflags" = "yes"; then ++ SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" ++ fi ++ echo "$ac_t""$ac_sectionLDflags" 1>&6 ++ fi ++ ++ # Set linker optimization flags. ++ if test x"$with_gnu_ld" = x"yes"; then ++ OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS" ++ fi ++ ++ ++ ++ ++ ++ echo $ac_n "checking for main in -lm""... $ac_c" 1>&6 ++echo "configure:4362: checking for main in -lm" >&5 ++ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ ac_save_LIBS="$LIBS" ++LIBS="-lm $LIBS" ++cat > conftest.$ac_ext <<EOF ++#line 4370 "configure" ++#include "confdefs.h" ++ ++int main() { ++main() ++; return 0; } ++EOF ++if { (eval echo configure:4377: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \ ++ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_lib 1 ++EOF ++ ++ LIBS="-lm $LIBS" ++ ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ for ac_func in nan copysignf ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4407: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4412 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4435: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++LIBMATHOBJS="$LIBMATHOBJS ${ac_func}.lo" ++fi ++done ++ ++ ++ for ac_func in __signbit ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4464: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4469 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4492: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++LIBMATHOBJS="$LIBMATHOBJS signbit.lo" ++fi ++done ++ ++ for ac_func in __signbitf ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4520: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4525 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4548: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++LIBMATHOBJS="$LIBMATHOBJS signbitf.lo" ++fi ++done ++ ++ ++ if test x$ac_cv_func_copysignl = x"yes"; then ++ for ac_func in __signbitl ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4578: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4583 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4606: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++LIBMATHOBJS="$LIBMATHOBJS signbitl.lo" ++fi ++done ++ ++ fi ++ ++ if test -n "$LIBMATHOBJS"; then ++ need_libmath=yes ++ fi ++ ++ ++ ++if test "$need_libmath" = yes; then ++ GLIBCPP_BUILD_LIBMATH_TRUE= ++ GLIBCPP_BUILD_LIBMATH_FALSE='#' ++else ++ GLIBCPP_BUILD_LIBMATH_TRUE='#' ++ GLIBCPP_BUILD_LIBMATH_FALSE= ++fi ++ ++ ++ enable_wchar_t=no ++ ++ echo $ac_n "checking for mbstate_t""... $ac_c" 1>&6 ++echo "configure:4651: checking for mbstate_t" >&5 ++ cat > conftest.$ac_ext <<EOF ++#line 4653 "configure" ++#include "confdefs.h" ++#include <wchar.h> ++int main() { ++mbstate_t teststate; ++; return 0; } ++EOF ++if { (eval echo configure:4660: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ have_mbstate_t=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ have_mbstate_t=no ++fi ++rm -f conftest* ++ echo "$ac_t""$have_mbstate_t" 1>&6 ++ if test x"$have_mbstate_t" = xyes; then ++ cat >> confdefs.h <<\EOF ++#define HAVE_MBSTATE_T 1 ++EOF ++ ++ fi ++ ++ for ac_hdr in wchar.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4682: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4687 "configure" ++#include "confdefs.h" ++#include <$ac_hdr> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4692: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_hdr 1 ++EOF ++ ac_has_wchar_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_wchar_h=no ++fi ++done ++ ++ for ac_hdr in wctype.h ++do ++ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 ++echo "configure:4723: checking for $ac_hdr" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4728 "configure" ++#include "confdefs.h" ++#include <$ac_hdr> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4733: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_hdr 1 ++EOF ++ ac_has_wctype_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_wctype_h=no ++fi ++done ++ ++ ++ if test x"$ac_has_wchar_h" = xyes && ++ test x"$ac_has_wctype_h" = xyes && ++ test x"$enable_c_mbchar" != xno; then ++ ++ echo $ac_n "checking for WCHAR_MIN and WCHAR_MAX""... $ac_c" 1>&6 ++echo "configure:4766: checking for WCHAR_MIN and WCHAR_MAX" >&5 ++ cat > conftest.$ac_ext <<EOF ++#line 4768 "configure" ++#include "confdefs.h" ++#include <wchar.h> ++int main() { ++int i = WCHAR_MIN; int j = WCHAR_MAX; ++; return 0; } ++EOF ++if { (eval echo configure:4775: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ has_wchar_minmax=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ has_wchar_minmax=no ++fi ++rm -f conftest* ++ echo "$ac_t""$has_wchar_minmax" 1>&6 ++ ++ echo $ac_n "checking for WEOF""... $ac_c" 1>&6 ++echo "configure:4788: checking for WEOF" >&5 ++ cat > conftest.$ac_ext <<EOF ++#line 4790 "configure" ++#include "confdefs.h" ++ ++ #include <wchar.h> ++ #include <stddef.h> ++int main() { ++wint_t i = WEOF; ++; return 0; } ++EOF ++if { (eval echo configure:4799: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ rm -rf conftest* ++ has_weof=yes ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ has_weof=no ++fi ++rm -f conftest* ++ echo "$ac_t""$has_weof" 1>&6 ++ ++ ac_wfuncs=yes ++ for ac_func in wcslen wmemchr wmemcmp wmemcpy wmemmove wmemset ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4815: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4820 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4843: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++\ ++ ac_wfuncs=no ++fi ++done ++ ++ ++ for ac_func in btowc wctob fgetwc fgetws fputwc fputws fwide \ ++ fwprintf fwscanf swprintf swscanf vfwprintf vfwscanf vswprintf vswscanf \ ++ vwprintf vwscanf wprintf wscanf getwc getwchar mbsinit mbrlen mbrtowc \ ++ mbsrtowcs wcsrtombs putwc putwchar ungetwc wcrtomb wcstod wcstof wcstol \ ++ wcstoul wcscpy wcsncpy wcscat wcsncat wcscmp wcscoll wcsncmp wcsxfrm \ ++ wcscspn wcsspn wcstok wcsftime wcschr wcspbrk wcsrchr wcsstr ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:4878: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4883 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:4906: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&6 ++\ ++ ac_wfuncs=no ++fi ++done ++ ++ ++ echo $ac_n "checking for ISO C99 wchar_t support""... $ac_c" 1>&6 ++echo "configure:4934: checking for ISO C99 wchar_t support" >&5 ++ if test x"$has_weof" = xyes && ++ test x"$has_wchar_minmax" = xyes && ++ test x"$ac_wfuncs" = xyes; then ++ ac_isoC99_wchar_t=yes ++ else ++ ac_isoC99_wchar_t=no ++ fi ++ echo "$ac_t""$ac_isoC99_wchar_t" 1>&6 ++ ++ ac_safe=`echo "iconv.h" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for iconv.h""... $ac_c" 1>&6 ++echo "configure:4946: checking for iconv.h" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4951 "configure" ++#include "confdefs.h" ++#include <iconv.h> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4956: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_has_iconv_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_iconv_h=no ++fi ++ ++ ac_safe=`echo "langinfo.h" | sed 'y%./+-%__p_%'` ++echo $ac_n "checking for langinfo.h""... $ac_c" 1>&6 ++echo "configure:4980: checking for langinfo.h" >&5 ++if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 4985 "configure" ++#include "confdefs.h" ++#include <langinfo.h> ++EOF ++ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ++{ (eval echo configure:4990: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` ++if test -z "$ac_err"; then ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=yes" ++else ++ echo "$ac_err" >&5 ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_header_$ac_safe=no" ++fi ++rm -f conftest* ++fi ++if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_has_langinfo_h=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_has_langinfo_h=no ++fi ++ ++ ++ echo $ac_n "checking for iconv in -liconv""... $ac_c" 1>&6 ++echo "configure:5014: checking for iconv in -liconv" >&5 ++ac_lib_var=`echo iconv'_'iconv | sed 'y%./+-%__p_%'` ++if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ ac_save_LIBS="$LIBS" ++LIBS="-liconv $LIBS" ++cat > conftest.$ac_ext <<EOF ++#line 5022 "configure" ++#include "confdefs.h" ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char iconv(); ++ ++int main() { ++iconv() ++; return 0; } ++EOF ++if { (eval echo configure:5033: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_lib_$ac_lib_var=no" ++fi ++rm -f conftest* ++LIBS="$ac_save_LIBS" ++ ++fi ++if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ libiconv="-liconv" ++else ++ echo "$ac_t""no" 1>&6 ++fi ++ ++ ac_save_LIBS="$LIBS" ++ LIBS="$LIBS $libiconv" ++ ++ for ac_func in iconv_open iconv_close iconv nl_langinfo ++do ++echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 ++echo "configure:5059: checking for $ac_func" >&5 ++if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then ++ echo $ac_n "(cached) $ac_c" 1>&6 ++else ++ cat > conftest.$ac_ext <<EOF ++#line 5064 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* Override any gcc2 internal prototype to avoid an error. */ ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func(); ++ ++int main() { ++ ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++$ac_func(); ++#endif ++ ++; return 0; } ++EOF ++if { (eval echo configure:5087: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=yes" ++else ++ echo "configure: failed program was:" >&5 ++ cat conftest.$ac_ext >&5 ++ rm -rf conftest* ++ eval "ac_cv_func_$ac_func=no" ++fi ++rm -f conftest* ++fi ++ ++if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then ++ echo "$ac_t""yes" 1>&6 ++ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` ++ cat >> confdefs.h <<EOF ++#define $ac_tr_func 1 ++EOF ++ \ ++ ac_XPG2funcs=yes ++else ++ echo "$ac_t""no" 1>&6 ++ac_XPG2funcs=no ++fi ++done ++ ++ ++ LIBS="$ac_save_LIBS" ++ ++ echo $ac_n "checking for XPG2 wchar_t support""... $ac_c" 1>&6 ++echo "configure:5117: checking for XPG2 wchar_t support" >&5 ++ if test x"$ac_has_iconv_h" = xyes && ++ test x"$ac_has_langinfo_h" = xyes && ++ test x"$ac_XPG2funcs" = xyes; then ++ ac_XPG2_wchar_t=yes ++ else ++ ac_XPG2_wchar_t=no ++ fi ++ echo "$ac_t""$ac_XPG2_wchar_t" 1>&6 ++ ++ if test x"$ac_isoC99_wchar_t" = xyes && ++ test x"$ac_XPG2_wchar_t" = xyes; then ++ cat >> confdefs.h <<\EOF ++#define _GLIBCPP_USE_WCHAR_T 1 ++EOF ++ ++ enable_wchar_t=yes ++ fi ++ fi ++ echo $ac_n "checking for enabled wchar_t specializations""... $ac_c" 1>&6 ++echo "configure:5137: checking for enabled wchar_t specializations" >&5 ++ echo "$ac_t""$enable_wchar_t" 1>&6 ++ ++ ++if test "$enable_wchar_t" = yes; then ++ GLIBCPP_TEST_WCHAR_T_TRUE= ++ GLIBCPP_TEST_WCHAR_T_FALSE='#' ++else ++ GLIBCPP_TEST_WCHAR_T_TRUE='#' ++ GLIBCPP_TEST_WCHAR_T_FALSE= ++fi ++ ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_COPYSIGN 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_FINITE 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_FINITEF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISINF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISINFF 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISNAN 1 ++EOF ++ ++ cat >> confdefs.h <<\EOF ++#define HAVE_ISNANF 1 ++EOF ++ ;; + *-linux*) + os_include_dir="os/gnu-linux" + for ac_hdr in nan.h ieeefp.h endian.h sys/isa_defs.h \ +diff -urN gcc-3.3.3-dist/libstdc++-v3/configure.in gcc-3.3.3/libstdc++-v3/configure.in +--- gcc-3.3.3-dist/libstdc++-v3/configure.in 2004-01-12 10:19:22.000000000 -0600 ++++ gcc-3.3.3/libstdc++-v3/configure.in 2004-08-12 04:47:51.000000000 -0500 +@@ -117,6 +117,36 @@ + # GLIBCPP_CHECK_MATH_SUPPORT + + case "$target" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h locale.h float.h inttypes.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCPP_CHECK_LINKER_FEATURES ++ GLIBCPP_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCPP_CHECK_WCHAR_T_SUPPORT ++ ++ AC_DEFINE(HAVE_COPYSIGN) ++ #AC_DEFINE(HAVE_COPYSIGNF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ #AC_DEFINE(HAVE_FREXPF) ++ #AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++ #AC_DEFINE(HAVE_SINCOS) ++ #AC_DEFINE(HAVE_SINCOSF) ++ #if test x"long_double_math_on_this_cpu" = x"yes"; then ++ #AC_DEFINE(HAVE_FINITEL) ++ #AC_DEFINE(HAVE_HYPOTL) ++ #AC_DEFINE(HAVE_ISINFL) ++ #AC_DEFINE(HAVE_ISNANL) ++ #fi ++ ;; + *-linux*) + os_include_dir="os/gnu-linux" + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ +diff -urN gcc-3.3.3-dist/libstdc++-v3/configure.target gcc-3.3.3/libstdc++-v3/configure.target +--- gcc-3.3.3-dist/libstdc++-v3/configure.target 2003-10-01 14:07:07.000000000 -0500 ++++ gcc-3.3.3/libstdc++-v3/configure.target 2004-08-12 04:47:51.000000000 -0500 +@@ -133,6 +133,9 @@ + freebsd*) + os_include_dir="os/bsd/freebsd" + ;; ++ linux-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; + gnu* | linux*) + os_include_dir="os/gnu-linux" + ;; +diff -urN gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cstdlib.h gcc-3.3.3/libstdc++-v3/include/c_std/std_cstdlib.h +--- gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cstdlib.h 2003-04-18 05:08:05.000000000 -0500 ++++ gcc-3.3.3/libstdc++-v3/include/c_std/std_cstdlib.h 2004-08-12 04:47:51.000000000 -0500 +@@ -101,9 +101,11 @@ + using ::labs; + using ::ldiv; + using ::malloc; ++#if _GLIBCPP_USE_WCHAR_T + using ::mblen; + using ::mbstowcs; + using ::mbtowc; ++#endif + using ::qsort; + using ::rand; + using ::realloc; +@@ -112,8 +114,10 @@ + using ::strtol; + using ::strtoul; + using ::system; ++#if _GLIBCPP_USE_WCHAR_T + using ::wcstombs; + using ::wctomb; ++#endif + + inline long + abs(long __i) { return labs(__i); } +diff -urN gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cwchar.h gcc-3.3.3/libstdc++-v3/include/c_std/std_cwchar.h +--- gcc-3.3.3-dist/libstdc++-v3/include/c_std/std_cwchar.h 2003-04-18 05:08:05.000000000 -0500 ++++ gcc-3.3.3/libstdc++-v3/include/c_std/std_cwchar.h 2004-08-12 04:47:51.000000000 -0500 +@@ -165,7 +165,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#ifdef HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; +diff -urN gcc-3.3.3-dist/libtool.m4 gcc-3.3.3/libtool.m4 +--- gcc-3.3.3-dist/libtool.m4 2003-09-09 03:04:17.000000000 -0500 ++++ gcc-3.3.3/libtool.m4 2004-08-12 04:47:51.000000000 -0500 +@@ -687,6 +687,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gcc-3.3.3-dist/ltconfig gcc-3.3.3/ltconfig +--- gcc-3.3.3-dist/ltconfig 2003-02-19 20:10:02.000000000 -0600 ++++ gcc-3.3.3/ltconfig 2004-08-12 04:47:51.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1247,6 +1248,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/gcc/3.3.5/110-uclibc-conf.patch b/openwrt/toolchain/gcc/3.3.5/110-uclibc-conf.patch new file mode 100644 index 0000000000..f297c3283f --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.5/110-uclibc-conf.patch @@ -0,0 +1,55 @@ +Use the patch by Carl Miller <chaz@energoncube.net> for powerpc, with +some minor modifications. Changed *os_uclibc to *os_linux_uclibc since +at some point we might support other platforms. Also updated to 3.3.3. +diff -urN gcc-3.3.3/gcc/config/rs6000/linux.h gcc-3.3.3-new/gcc/config/rs6000/linux.h +--- gcc-3.3.3/gcc/config/rs6000/linux.h 2003-11-14 00:46:10.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/rs6000/linux.h 2004-02-16 21:13:40.000000000 -0600 +@@ -64,7 +64,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #undef TARGET_VERSION + #define TARGET_VERSION fprintf (stderr, " (PowerPC GNU/Linux)"); +diff -urN gcc-3.3.3/gcc/config/rs6000/sysv4.h gcc-3.3.3-new/gcc/config/rs6000/sysv4.h +--- gcc-3.3.3/gcc/config/rs6000/sysv4.h 2003-10-28 13:55:41.000000000 -0600 ++++ gcc-3.3.3-new/gcc/config/rs6000/sysv4.h 2004-02-16 21:13:40.000000000 -0600 +@@ -968,9 +968,11 @@ + %{mcall-linux: %(link_os_linux) } \ + %{mcall-gnu: %(link_os_gnu) } \ + %{mcall-netbsd: %(link_os_netbsd) } \ ++%{mcall-uclibc: %(link_os_linux_uclibc) } \ + %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: \ + %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: \ +- %{!mcall-netbsd: %(link_os_default) }}}}}}}}}" ++ %{!mcall-netbsd: %{!mcall-uclibc: \ ++ %(link_os_default) }}}}}}}}}}" + + #define LINK_OS_DEFAULT_SPEC "" + +@@ -1307,6 +1309,12 @@ + + #define LINK_OS_WINDISS_SPEC "" + ++/* uClibc support for Linux. */ ++ ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + /* Define any extra SPECS that the compiler needs to generate. */ + /* Override rs6000.h definition. */ + #undef SUBTARGET_EXTRA_SPECS +@@ -1372,6 +1380,7 @@ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_vxworks", LINK_OS_VXWORKS_SPEC }, \ + { "link_os_windiss", LINK_OS_WINDISS_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_default", LINK_OS_DEFAULT_SPEC }, \ + { "cc1_endian_big", CC1_ENDIAN_BIG_SPEC }, \ + { "cc1_endian_little", CC1_ENDIAN_LITTLE_SPEC }, \ diff --git a/openwrt/toolchain/gcc/3.3.5/120-softfloat.patch b/openwrt/toolchain/gcc/3.3.5/120-softfloat.patch new file mode 100644 index 0000000000..f2431896cf --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.5/120-softfloat.patch @@ -0,0 +1,14 @@ +--- gcc-3.3.2-old/configure.in 2003-08-09 01:57:21.000000000 -0500 ++++ gcc-3.3.2/configure.in 2004-01-15 12:46:29.000000000 -0600 +@@ -1418,6 +1418,11 @@ + fi + + FLAGS_FOR_TARGET= ++case " $targargs " in ++ *" --nfp "* | *" --without-float "*) ++ FLAGS_FOR_TARGET=$FLAGS_FOR_TARGET' -msoft-float' ++ ;; ++esac + case " $target_configdirs " in + *" newlib "*) + case " $targargs " in diff --git a/openwrt/toolchain/gcc/3.3.5/200-uclibc-locale.patch b/openwrt/toolchain/gcc/3.3.5/200-uclibc-locale.patch new file mode 100644 index 0000000000..5880d834b4 --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.5/200-uclibc-locale.patch @@ -0,0 +1,3021 @@ +Warning! This patch is not finished. The wide char time-related stuff +is broken or non-functional. But it serves as a starting point to get +things building while I continue to work on the uClibc locale internals. +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2004-01-09 07:55:02.000000000 -0600 +@@ -0,0 +1,63 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek <jakub@redhat.com> ++ ++#include <clocale> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strtol_l) __strtol_l; ++extern "C" __typeof(strtoll_l) __strtoll_l; ++extern "C" __typeof(strtoul_l) __strtoul_l; ++extern "C" __typeof(strtoull_l) __strtoull_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#endif // GLIBC 2.3 and later +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.cc 2004-01-09 08:37:55.000000000 -0600 +@@ -0,0 +1,231 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <stdexcept> ++#include <langinfo.h> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, long& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long __l = __strtol_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __l; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, unsigned long& __v, ++ ios_base::iostate& __err, const __c_locale& __cloc, ++ int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ unsigned long __ul = __strtoul_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ul; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++#ifdef _GLIBCPP_USE_LONG_LONG ++ template<> ++ void ++ __convert_to_v(const char* __s, long long& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long long __ll = __strtoll_l(__s, &__sanity, __base, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ll; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, unsigned long long& __v, ++ ios_base::iostate& __err, const __c_locale& __cloc, ++ int __base) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ unsigned long long __ull = __strtoull_l(__s, &__sanity, __base, ++ __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ull; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++#endif ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc, int) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && *__sanity == '\0' && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error("attempt to create locale from unknown name"); ++ } ++#else ++ __cloc = NULL; ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_locale != __cloc) ++ __freelocale(__cloc); ++#else ++ __cloc = NULL; ++#endif ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ { return __duplocale(__cloc); } ++#else ++ { return __c_locale(); } ++#endif ++ ++ const char* locale::_S_categories[_S_categories_size ++ + _S_extra_categories_size] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES" ++#if _GLIBCPP_NUM_CATEGORIES != 0 ++ , ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} // namespace std +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/c_locale.h 2004-01-09 07:51:06.000000000 -0600 +@@ -0,0 +1,118 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifndef _CPP_BITS_C_LOCALE_H ++#define _CPP_BITS_C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include <clocale> ++#include <langinfo.h> // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include <iconv.h> // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include <libintl.h> // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCPP_C_LOCALE_GNU for ++#endif ++#define _GLIBCPP_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCPP_NUM_CATEGORIES 6 ++#define _GLIBCPP_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template<typename _Tv> ++ int ++ __convert_from_v(char* __out, const int __size, const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec = -1) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec = -1) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = setlocale(LC_ALL, NULL); ++ char* __sav = static_cast<char*>(malloc(strlen(__old) + 1)); ++ if (__sav) ++ strcpy(__sav, __old); ++ setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ int __ret; ++ if (__prec >= 0) ++ __ret = snprintf(__out, __size, __fmt, __prec, __v); ++ else ++ __ret = snprintf(__out, __size, __fmt, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ setlocale(LC_ALL, __sav); ++ free(__sav); ++#endif ++ return __ret; ++ } ++} ++ ++#endif +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2004-01-09 04:04:34.000000000 -0600 +@@ -0,0 +1,113 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCPP_USE_WCHAR_T ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = error; ++ size_t __len = min(__from_end - __from, __to_end - __to); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_c_locale); ++#endif ++ size_t __conv = wcsrtombs(__to, &__from, __len, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ if (__conv == __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = ok; ++ } ++ else if (__conv > 0 && __conv < __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = partial; ++ } ++ else ++ __ret = error; ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = error; ++ size_t __len = min(__from_end - __from, __to_end - __to); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_c_locale); ++#endif ++ size_t __conv = mbsrtowcs(__to, &__from, __len, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ if (__conv == __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = ok; ++ } ++ else if (__conv > 0 && __conv < __len) ++ { ++ __from_next = __from; ++ __to_next = __to + __conv; ++ __ret = partial; ++ } ++ else ++ __ret = error; ++ ++ return __ret; ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/codecvt_specializations.h 2004-01-09 01:53:51.000000000 -0600 +@@ -0,0 +1,461 @@ ++// Locale support (codecvt) -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 Template class codecvt ++// ++ ++// Warning: this file is not meant for user inclusion. Use <locale>. ++ ++// Written by Benjamin Kosnik <bkoz@cygnus.com> ++ ++ // XXX ++ // Define this here to codecvt.cc can have _S_max_size definition. ++#define _GLIBCPP_USE___ENC_TRAITS 1 ++ ++ // Extension to use icov for dealing with character encodings, ++ // including conversions and comparisons between various character ++ // sets. This object encapsulates data that may need to be shared between ++ // char_traits, codecvt and ctype. ++ class __enc_traits ++ { ++ public: ++ // Types: ++ // NB: A conversion descriptor subsumes and enhances the ++ // functionality of a simple state type such as mbstate_t. ++ typedef iconv_t __desc_type; ++ ++ protected: ++ // Data Members: ++ // Max size of charset encoding name ++ static const int _S_max_size = 32; ++ // Name of internal character set encoding. ++ char _M_int_enc[_S_max_size]; ++ // Name of external character set encoding. ++ char _M_ext_enc[_S_max_size]; ++ ++ // Conversion descriptor between external encoding to internal encoding. ++ __desc_type _M_in_desc; ++ // Conversion descriptor between internal encoding to external encoding. ++ __desc_type _M_out_desc; ++ ++ // Details the byte-order marker for the external encoding, if necessary. ++ int _M_ext_bom; ++ ++ // Details the byte-order marker for the internal encoding, if necessary. ++ int _M_int_bom; ++ ++ public: ++ explicit __enc_traits() ++ : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0) ++ { ++ memset(_M_int_enc, 0, _S_max_size); ++ memset(_M_ext_enc, 0, _S_max_size); ++ } ++ ++ explicit __enc_traits(const char* __int, const char* __ext, ++ int __ibom = 0, int __ebom = 0) ++ : _M_in_desc(0), _M_out_desc(0), _M_ext_bom(0), _M_int_bom(0) ++ { ++ strncpy(_M_int_enc, __int, _S_max_size); ++ strncpy(_M_ext_enc, __ext, _S_max_size); ++ } ++ ++ // 21.1.2 traits typedefs ++ // p4 ++ // typedef STATE_T state_type ++ // requires: state_type shall meet the requirements of ++ // CopyConstructible types (20.1.3) ++ __enc_traits(const __enc_traits& __obj): _M_in_desc(0), _M_out_desc(0) ++ { ++ strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size); ++ strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size); ++ _M_ext_bom = __obj._M_ext_bom; ++ _M_int_bom = __obj._M_int_bom; ++ } ++ ++ // Need assignment operator as well. ++ __enc_traits& ++ operator=(const __enc_traits& __obj) ++ { ++ strncpy(_M_int_enc, __obj._M_int_enc, _S_max_size); ++ strncpy(_M_ext_enc, __obj._M_ext_enc, _S_max_size); ++ _M_in_desc = 0; ++ _M_out_desc = 0; ++ _M_ext_bom = __obj._M_ext_bom; ++ _M_int_bom = __obj._M_int_bom; ++ return *this; ++ } ++ ++ ~__enc_traits() ++ { ++ __desc_type __err = reinterpret_cast<iconv_t>(-1); ++ if (_M_in_desc && _M_in_desc != __err) ++ iconv_close(_M_in_desc); ++ if (_M_out_desc && _M_out_desc != __err) ++ iconv_close(_M_out_desc); ++ } ++ ++ void ++ _M_init() ++ { ++ const __desc_type __err = reinterpret_cast<iconv_t>(-1); ++ if (!_M_in_desc) ++ { ++ _M_in_desc = iconv_open(_M_int_enc, _M_ext_enc); ++ if (_M_in_desc == __err) ++ __throw_runtime_error("creating iconv input descriptor failed."); ++ } ++ if (!_M_out_desc) ++ { ++ _M_out_desc = iconv_open(_M_ext_enc, _M_int_enc); ++ if (_M_out_desc == __err) ++ __throw_runtime_error("creating iconv output descriptor failed."); ++ } ++ } ++ ++ bool ++ _M_good() ++ { ++ const __desc_type __err = reinterpret_cast<iconv_t>(-1); ++ bool __test = _M_in_desc && _M_in_desc != __err; ++ __test &= _M_out_desc && _M_out_desc != __err; ++ return __test; ++ } ++ ++ const __desc_type* ++ _M_get_in_descriptor() ++ { return &_M_in_desc; } ++ ++ const __desc_type* ++ _M_get_out_descriptor() ++ { return &_M_out_desc; } ++ ++ int ++ _M_get_external_bom() ++ { return _M_ext_bom; } ++ ++ int ++ _M_get_internal_bom() ++ { return _M_int_bom; } ++ ++ const char* ++ _M_get_internal_enc() ++ { return _M_int_enc; } ++ ++ const char* ++ _M_get_external_enc() ++ { return _M_ext_enc; } ++ }; ++ ++ // Partial specialization ++ // This specialization takes advantage of iconv to provide code ++ // conversions between a large number of character encodings. ++ template<typename _InternT, typename _ExternT> ++ class codecvt<_InternT, _ExternT, __enc_traits> ++ : public __codecvt_abstract_base<_InternT, _ExternT, __enc_traits> ++ { ++ public: ++ // Types: ++ typedef codecvt_base::result result; ++ typedef _InternT intern_type; ++ typedef _ExternT extern_type; ++ typedef __enc_traits state_type; ++ typedef __enc_traits::__desc_type __desc_type; ++ typedef __enc_traits __enc_type; ++ ++ // Data Members: ++ static locale::id id; ++ ++ explicit ++ codecvt(size_t __refs = 0) ++ : __codecvt_abstract_base<intern_type, extern_type, state_type>(__refs) ++ { } ++ ++ explicit ++ codecvt(__enc_type* __enc, size_t __refs = 0) ++ : __codecvt_abstract_base<intern_type, extern_type, state_type>(__refs) ++ { } ++ ++ protected: ++ virtual ++ ~codecvt() { } ++ ++ virtual result ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const; ++ ++ virtual result ++ do_unshift(state_type& __state, extern_type* __to, ++ extern_type* __to_end, extern_type*& __to_next) const; ++ ++ virtual result ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const; ++ ++ virtual int ++ do_encoding() const throw(); ++ ++ virtual bool ++ do_always_noconv() const throw(); ++ ++ virtual int ++ do_length(const state_type&, const extern_type* __from, ++ const extern_type* __end, size_t __max) const; ++ ++ virtual int ++ do_max_length() const throw(); ++ }; ++ ++ template<typename _InternT, typename _ExternT> ++ locale::id ++ codecvt<_InternT, _ExternT, __enc_traits>::id; ++ ++ // This adaptor works around the signature problems of the second ++ // argument to iconv(): SUSv2 and others use 'const char**', but glibc 2.2 ++ // uses 'char**', which matches the POSIX 1003.1-2001 standard. ++ // Using this adaptor, g++ will do the work for us. ++ template<typename _T> ++ inline size_t ++ __iconv_adaptor(size_t(*__func)(iconv_t, _T, size_t*, char**, size_t*), ++ iconv_t __cd, char** __inbuf, size_t* __inbytes, ++ char** __outbuf, size_t* __outbytes) ++ { return __func(__cd, (_T)__inbuf, __inbytes, __outbuf, __outbytes); } ++ ++ template<typename _InternT, typename _ExternT> ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_out_descriptor(); ++ const size_t __fmultiple = sizeof(intern_type); ++ size_t __fbytes = __fmultiple * (__from_end - __from); ++ const size_t __tmultiple = sizeof(extern_type); ++ size_t __tbytes = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast<char*>(__to); ++ char* __cfrom; ++ size_t __conv; ++ ++ // Some encodings need a byte order marker as the first item ++ // in the byte stream, to designate endian-ness. The default ++ // value for the byte order marker is NULL, so if this is ++ // the case, it's not necessary and we can just go on our ++ // merry way. ++ int __int_bom = __state._M_get_internal_bom(); ++ if (__int_bom) ++ { ++ size_t __size = __from_end - __from; ++ intern_type* __cfixed = static_cast<intern_type*>(__builtin_alloca(sizeof(intern_type) * (__size + 1))); ++ __cfixed[0] = static_cast<intern_type>(__int_bom); ++ char_traits<intern_type>::copy(__cfixed + 1, __from, __size); ++ __cfrom = reinterpret_cast<char*>(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__fbytes, &__cto, &__tbytes); ++ } ++ else ++ { ++ intern_type* __cfixed = const_cast<intern_type*>(__from); ++ __cfrom = reinterpret_cast<char*>(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, &__fbytes, ++ &__cto, &__tbytes); ++ } ++ ++ if (__conv != size_t(-1)) ++ { ++ __from_next = reinterpret_cast<const intern_type*>(__cfrom); ++ __to_next = reinterpret_cast<extern_type*>(__cto); ++ __ret = codecvt_base::ok; ++ } ++ else ++ { ++ if (__fbytes < __fmultiple * (__from_end - __from)) ++ { ++ __from_next = reinterpret_cast<const intern_type*>(__cfrom); ++ __to_next = reinterpret_cast<extern_type*>(__cto); ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ } ++ return __ret; ++ } ++ ++ template<typename _InternT, typename _ExternT> ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_unshift(state_type& __state, extern_type* __to, ++ extern_type* __to_end, extern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_in_descriptor(); ++ const size_t __tmultiple = sizeof(intern_type); ++ size_t __tlen = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast<char*>(__to); ++ size_t __conv = __iconv_adaptor(iconv,*__desc, NULL, NULL, ++ &__cto, &__tlen); ++ ++ if (__conv != size_t(-1)) ++ { ++ __to_next = reinterpret_cast<extern_type*>(__cto); ++ if (__tlen == __tmultiple * (__to_end - __to)) ++ __ret = codecvt_base::noconv; ++ else if (__tlen == 0) ++ __ret = codecvt_base::ok; ++ else ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ return __ret; ++ } ++ ++ template<typename _InternT, typename _ExternT> ++ codecvt_base::result ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = codecvt_base::error; ++ if (__state._M_good()) ++ { ++ typedef state_type::__desc_type __desc_type; ++ const __desc_type* __desc = __state._M_get_in_descriptor(); ++ const size_t __fmultiple = sizeof(extern_type); ++ size_t __flen = __fmultiple * (__from_end - __from); ++ const size_t __tmultiple = sizeof(intern_type); ++ size_t __tlen = __tmultiple * (__to_end - __to); ++ ++ // Argument list for iconv specifies a byte sequence. Thus, ++ // all to/from arrays must be brutally casted to char*. ++ char* __cto = reinterpret_cast<char*>(__to); ++ char* __cfrom; ++ size_t __conv; ++ ++ // Some encodings need a byte order marker as the first item ++ // in the byte stream, to designate endian-ness. The default ++ // value for the byte order marker is NULL, so if this is ++ // the case, it's not necessary and we can just go on our ++ // merry way. ++ int __ext_bom = __state._M_get_external_bom(); ++ if (__ext_bom) ++ { ++ size_t __size = __from_end - __from; ++ extern_type* __cfixed = static_cast<extern_type*>(__builtin_alloca(sizeof(extern_type) * (__size + 1))); ++ __cfixed[0] = static_cast<extern_type>(__ext_bom); ++ char_traits<extern_type>::copy(__cfixed + 1, __from, __size); ++ __cfrom = reinterpret_cast<char*>(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__flen, &__cto, &__tlen); ++ } ++ else ++ { ++ extern_type* __cfixed = const_cast<extern_type*>(__from); ++ __cfrom = reinterpret_cast<char*>(__cfixed); ++ __conv = __iconv_adaptor(iconv, *__desc, &__cfrom, ++ &__flen, &__cto, &__tlen); ++ } ++ ++ ++ if (__conv != size_t(-1)) ++ { ++ __from_next = reinterpret_cast<const extern_type*>(__cfrom); ++ __to_next = reinterpret_cast<intern_type*>(__cto); ++ __ret = codecvt_base::ok; ++ } ++ else ++ { ++ if (__flen < static_cast<size_t>(__from_end - __from)) ++ { ++ __from_next = reinterpret_cast<const extern_type*>(__cfrom); ++ __to_next = reinterpret_cast<intern_type*>(__cto); ++ __ret = codecvt_base::partial; ++ } ++ else ++ __ret = codecvt_base::error; ++ } ++ } ++ return __ret; ++ } ++ ++ template<typename _InternT, typename _ExternT> ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_encoding() const throw() ++ { ++ int __ret = 0; ++ if (sizeof(_ExternT) <= sizeof(_InternT)) ++ __ret = sizeof(_InternT)/sizeof(_ExternT); ++ return __ret; ++ } ++ ++ template<typename _InternT, typename _ExternT> ++ bool ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_always_noconv() const throw() ++ { return false; } ++ ++ template<typename _InternT, typename _ExternT> ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_length(const state_type&, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { return min(__max, static_cast<size_t>(__end - __from)); } ++ ++#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS ++// 74. Garbled text for codecvt::do_max_length ++ template<typename _InternT, typename _ExternT> ++ int ++ codecvt<_InternT, _ExternT, __enc_traits>:: ++ do_max_length() const throw() ++ { return 1; } ++#endif +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/collate_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/collate_members.cc 2004-01-09 08:06:24.000000000 -0600 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate<char>::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<char>::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ int ++ collate<wchar_t>::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/ctype_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2004-01-09 08:15:41.000000000 -0600 +@@ -0,0 +1,274 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype<char> specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname<char>::ctype_byname(const char* __s, size_t __refs) ++ : ctype<char>(0, false, __refs) ++ { ++ _S_destroy_c_locale(_M_c_locale_ctype); ++ _S_create_c_locale(_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_toupper = _M_c_locale_ctype->__ctype_toupper; ++ _M_tolower = _M_c_locale_ctype->__ctype_tolower; ++ _M_table = _M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ ctype<wchar_t>::__wmask_type ++ ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = 0; ++ } ++ return __ret; ++ }; ++ ++ wchar_t ++ ctype<wchar_t>::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype<wchar_t>:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ { ++ const mask __bit = static_cast<mask>(_ISbit(__bitcur)); ++ if (__m & __bit) ++ __ret |= __iswctype_l(__c, _M_convert_to_wmask(__bit), ++ _M_c_locale_ctype); ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (;__lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ { ++ const mask __bit = static_cast<mask>(_ISbit(__bitcur)); ++ if (__iswctype_l(*__lo, _M_convert_to_wmask(__bit), ++ _M_c_locale_ctype)) ++ __m |= __bit; ++ } ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype<wchar_t>:: ++ do_widen(char __c) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wchar_t __ret = btowc(__c); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ const char* ++ ctype<wchar_t>:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ mbstate_t __state; ++ memset(static_cast<void*>(&__state), 0, sizeof(mbstate_t)); ++ mbsrtowcs(__dest, &__lo, __hi - __lo, &__state); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ char ++ ctype<wchar_t>:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ size_t __offset = 0; ++ while (true) ++ { ++ const wchar_t* __start = __lo + __offset; ++ size_t __len = __hi - __start; ++ ++ mbstate_t __state; ++ memset(static_cast<void*>(&__state), 0, sizeof(mbstate_t)); ++ size_t __con = wcsrtombs(__dest + __offset, &__start, __len, &__state); ++ if (__con != __len && __start != 0) ++ { ++ __offset = __start - __lo; ++ __dest[__offset++] = __dfault; ++ } ++ else ++ break; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++#endif // _GLIBCPP_USE_WCHAR_T ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.cc 2004-01-09 08:46:16.000000000 -0600 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages<char>::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast<const char*>(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ wstring ++ messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/messages_members.h 2004-01-09 08:52:48.000000000 -0600 +@@ -0,0 +1,122 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::messages(size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_messages = _S_c_name; ++#endif ++ _M_c_locale_messages = _S_c_locale; ++ } ++ ++ template<typename _CharT> ++ messages<_CharT>::messages(__c_locale __cloc, ++ const char* __s, size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_messages = new char[strlen(__s) + 1]; ++ strcpy(_M_name_messages, __s); ++#endif ++ _M_c_locale_messages = _S_clone_c_locale(__cloc); ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::~messages() ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_messages) ++ delete [] _M_name_messages; ++#endif ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string<char>& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template<typename _CharT> ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template<typename _CharT> ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_messages) ++ delete [] _M_name_messages; ++ _M_name_messages = new char[strlen(__s) + 1]; ++ strcpy(_M_name_messages, __s); ++#endif ++ _S_destroy_c_locale(_M_c_locale_messages); ++ _S_create_c_locale(_M_c_locale_messages, __s); ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/monetary_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2004-01-09 18:20:23.000000000 -0600 +@@ -0,0 +1,578 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = space; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[0] = sign; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[0] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = space; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__space) ++ { ++ // Have space. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ } ++ else ++ { ++ // Have none. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__space) ++ { ++ // Have space. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ } ++ else ++ { ++ // Have none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ default: ++ ; ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ _M_curr_symbol = ""; ++ _M_positive_sign = ""; ++ _M_negative_sign = ""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc)); ++ _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_negative_sign = "()"; ++ else ++ _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ ++ // _Intl == true ++ _M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ _M_curr_symbol = ""; ++ _M_positive_sign = ""; ++ _M_negative_sign = ""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, __cloc)); ++ _M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_negative_sign = "()"; ++ else ++ _M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ ++ // _Intl == false ++ _M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct<char, true>::~moneypunct() ++ { } ++ ++ template<> ++ moneypunct<char, false>::~moneypunct() ++ { } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ _M_curr_symbol = L""; ++ _M_positive_sign = L""; ++ _M_negative_sign = L""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ ++ _M_thousands_sep = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cpossign, __len, &__state); ++ _M_positive_sign = __wcs; ++ } ++ else ++ _M_positive_sign = L""; ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cnegsign, __len, &__state); ++ _M_negative_sign = __wcs; ++ } ++ else ++ _M_negative_sign = L""; ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_curr_symbol = __wcs; ++ } ++ else ++ _M_curr_symbol = L""; ++ ++ _M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ _M_curr_symbol = L""; ++ _M_positive_sign = L""; ++ _M_negative_sign = L""; ++ _M_frac_digits = 0; ++ _M_pos_format = money_base::_S_default_pattern; ++ _M_neg_format = money_base::_S_default_pattern; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ _M_thousands_sep = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cpossign, __len, &__state); ++ _M_positive_sign = __wcs; ++ } ++ else ++ _M_positive_sign = L""; ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__cnegsign, __len, &__state); ++ _M_negative_sign = __wcs; ++ } ++ else ++ _M_negative_sign = L""; ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_curr_symbol = __wcs; ++ } ++ else ++ _M_curr_symbol = L""; ++ ++ _M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_pos_format = _S_construct_pattern(__pprecedes, __pspace, __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_neg_format = _S_construct_pattern(__nprecedes, __nspace, __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct<wchar_t, true>::~moneypunct() ++ { ++ if (wcslen(_M_positive_sign)) ++ delete [] _M_positive_sign; ++ if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0)) ++ delete [] _M_negative_sign; ++ if (wcslen(_M_curr_symbol)) ++ delete [] _M_curr_symbol; ++ } ++ ++ template<> ++ moneypunct<wchar_t, false>::~moneypunct() ++ { ++ if (wcslen(_M_positive_sign)) ++ delete [] _M_positive_sign; ++ if (wcslen(_M_negative_sign) && (wcscmp(_M_negative_sign, L"()") != 0)) ++ delete [] _M_negative_sign; ++ if (wcslen(_M_curr_symbol)) ++ delete [] _M_curr_symbol; ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/numeric_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2004-01-09 18:20:59.000000000 -0600 +@@ -0,0 +1,129 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct<char>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = '.'; ++ _M_thousands_sep = ','; ++ _M_grouping = ""; ++ } ++ else ++ { ++ // Named locale. ++ _M_decimal_point = *(__nl_langinfo_l(RADIXCHAR, __cloc)); ++ _M_thousands_sep = *(__nl_langinfo_l(THOUSEP, __cloc)); ++ // Check for NUL, which implies no grouping. ++ if (_M_thousands_sep == '\0') ++ _M_grouping = ""; ++ else ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ } ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_truename = "true"; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_falsename = "false"; ++ } ++ ++ template<> ++ numpunct<char>::~numpunct() ++ { } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_decimal_point = L'.'; ++ _M_thousands_sep = L','; ++ _M_grouping = ""; ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_decimal_point = __cloc->decimal_point_wc; ++ _M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_decimal_point = __global_locale->decimal_point_wc; ++ _M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ _M_decimal_point = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc)}).__w); ++ _M_thousands_sep = static_cast<wchar_t>(((union { const char *__s; unsigned int __w; }){ __s: __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc)}).__w); ++#endif ++ if (_M_thousands_sep == L'\0') ++ _M_grouping = ""; ++ else ++ _M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ } ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_truename = L"true"; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_falsename = L"false"; ++ } ++ ++ template<> ++ numpunct<wchar_t>::~numpunct() ++ { } ++ #endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.cc +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.cc 2004-01-09 08:25:03.000000000 -0600 +@@ -0,0 +1,341 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct<char>:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __strftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_c_locale; ++ ++ _M_date_format = "%m/%d/%y"; ++ _M_date_era_format = "%m/%d/%y"; ++ _M_time_format = "%H:%M:%S"; ++ _M_time_era_format = "%H:%M:%S"; ++ _M_date_time_format = ""; ++ _M_date_time_era_format = ""; ++ _M_am = "AM"; ++ _M_pm = "PM"; ++ _M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = "Sunday"; ++ _M_day2 = "Monday"; ++ _M_day3 = "Tuesday"; ++ _M_day4 = "Wednesday"; ++ _M_day5 = "Thursday"; ++ _M_day6 = "Friday"; ++ _M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = "Sun"; ++ _M_day_a2 = "Mon"; ++ _M_day_a3 = "Tue"; ++ _M_day_a4 = "Wed"; ++ _M_day_a5 = "Thu"; ++ _M_day_a6 = "Fri"; ++ _M_day_a7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = "January"; ++ _M_month02 = "February"; ++ _M_month03 = "March"; ++ _M_month04 = "April"; ++ _M_month05 = "May"; ++ _M_month06 = "June"; ++ _M_month07 = "July"; ++ _M_month08 = "August"; ++ _M_month09 = "September"; ++ _M_month10 = "October"; ++ _M_month11 = "November"; ++ _M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = "Jan"; ++ _M_month_a02 = "Feb"; ++ _M_month_a03 = "Mar"; ++ _M_month_a04 = "Apr"; ++ _M_month_a05 = "May"; ++ _M_month_a06 = "Jun"; ++ _M_month_a07 = "July"; ++ _M_month_a08 = "Aug"; ++ _M_month_a09 = "Sep"; ++ _M_month_a10 = "Oct"; ++ _M_month_a11 = "Nov"; ++ _M_month_a12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc); ++ _M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_day_a2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_day_a3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_day_a4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_day_a5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_day_a6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_day_a7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_month_a02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_month_a03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_month_a04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_month_a05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_month_a06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_month_a07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_month_a08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_month_a09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_month_a10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_month_a11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_month_a12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCPP_USE_WCHAR_T ++ template<> ++ void ++ __timepunct<wchar_t>:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_c_locale; ++ ++ _M_date_format = L"%m/%d/%y"; ++ _M_date_era_format = L"%m/%d/%y"; ++ _M_time_format = L"%H:%M:%S"; ++ _M_time_era_format = L"%H:%M:%S"; ++ _M_date_time_format = L""; ++ _M_date_time_era_format = L""; ++ _M_am = L"AM"; ++ _M_pm = L"PM"; ++ _M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = L"Sunday"; ++ _M_day2 = L"Monday"; ++ _M_day3 = L"Tuesday"; ++ _M_day4 = L"Wednesday"; ++ _M_day5 = L"Thursday"; ++ _M_day6 = L"Friday"; ++ _M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = L"Sun"; ++ _M_day_a2 = L"Mon"; ++ _M_day_a3 = L"Tue"; ++ _M_day_a4 = L"Wed"; ++ _M_day_a5 = L"Thu"; ++ _M_day_a6 = L"Fri"; ++ _M_day_a7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = L"January"; ++ _M_month02 = L"February"; ++ _M_month03 = L"March"; ++ _M_month04 = L"April"; ++ _M_month05 = L"May"; ++ _M_month06 = L"June"; ++ _M_month07 = L"July"; ++ _M_month08 = L"August"; ++ _M_month09 = L"September"; ++ _M_month10 = L"October"; ++ _M_month11 = L"November"; ++ _M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = L"Jan"; ++ _M_month_a02 = L"Feb"; ++ _M_month_a03 = L"Mar"; ++ _M_month_a04 = L"Apr"; ++ _M_month_a05 = L"May"; ++ _M_month_a06 = L"Jun"; ++ _M_month_a07 = L"July"; ++ _M_month_a08 = L"Aug"; ++ _M_month_a09 = L"Sep"; ++ _M_month_a10 = L"Oct"; ++ _M_month_a11 = L"Nov"; ++ _M_month_a12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_date_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_FMT, __cloc)); ++ _M_date_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc)); ++ _M_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT, __cloc)); ++ _M_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc)); ++ _M_date_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_T_FMT, __cloc)); ++ _M_date_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc)); ++ _M_am = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WAM_STR, __cloc)); ++ _M_pm = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WPM_STR, __cloc)); ++ _M_am_pm_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc)); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_day1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_1, __cloc)); ++ _M_day2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_2, __cloc)); ++ _M_day3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_3, __cloc)); ++ _M_day4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_4, __cloc)); ++ _M_day5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_5, __cloc)); ++ _M_day6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_6, __cloc)); ++ _M_day7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_7, __cloc)); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_day_a1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_1, __cloc)); ++ _M_day_a2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_2, __cloc)); ++ _M_day_a3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_3, __cloc)); ++ _M_day_a4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_4, __cloc)); ++ _M_day_a5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_5, __cloc)); ++ _M_day_a6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_6, __cloc)); ++ _M_day_a7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_7, __cloc)); ++ ++ // Month names, starting with "C"'s January. ++ _M_month01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_1, __cloc)); ++ _M_month02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_2, __cloc)); ++ _M_month03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_3, __cloc)); ++ _M_month04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_4, __cloc)); ++ _M_month05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_5, __cloc)); ++ _M_month06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_6, __cloc)); ++ _M_month07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_7, __cloc)); ++ _M_month08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_8, __cloc)); ++ _M_month09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_9, __cloc)); ++ _M_month10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_10, __cloc)); ++ _M_month11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_11, __cloc)); ++ _M_month12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_12, __cloc)); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_month_a01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_1, __cloc)); ++ _M_month_a02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_2, __cloc)); ++ _M_month_a03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_3, __cloc)); ++ _M_month_a04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_4, __cloc)); ++ _M_month_a05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_5, __cloc)); ++ _M_month_a06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_6, __cloc)); ++ _M_month_a07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_7, __cloc)); ++ _M_month_a08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_8, __cloc)); ++ _M_month_a09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_9, __cloc)); ++ _M_month_a10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_10, __cloc)); ++ _M_month_a11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_11, __cloc)); ++ _M_month_a12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_12, __cloc)); ++ } ++#endif // 0 ++ } ++#endif ++} +diff -urN gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.h gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-3.3.2/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/locale/uclibc/time_members.h 2004-01-09 04:26:21.000000000 -0600 +@@ -0,0 +1,68 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_timepunct = _S_c_name; ++#endif ++ _M_initialize_timepunct(); ++ } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, ++ const char* __s, ++ size_t __refs) ++ : locale::facet(__refs) ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ _M_name_timepunct = new char[strlen(__s) + 1]; ++ strcpy(_M_name_timepunct, __s); ++#endif ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::~__timepunct() ++ { ++#ifndef __UCLIBC_HAS_XLOCALE__ ++ if (_S_c_name != _M_name_timepunct) ++ delete [] _M_name_timepunct; ++#endif ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_base.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_base.h 2004-01-09 02:54:54.000000000 -0600 +@@ -0,0 +1,57 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ // NB: Offsets into ctype<char>::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISgraph; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalnum; ++ }; +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_inline.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_inline.h 2002-06-24 00:49:19.000000000 -0500 +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype<char>:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast<unsigned char>(__c)] & __m; } ++ ++ const char* ++ ctype<char>:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast<unsigned char>(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_noninline.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2004-01-09 03:34:53.000000000 -0600 +@@ -0,0 +1,90 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype<char>::classic_table() throw() ++ { ++ return __C_ctype_b; ++ } ++ ++ ctype<char>::ctype(__c_locale, const mask* __table, bool __del, ++ size_t __refs) ++ : __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ _M_c_locale_ctype = _S_c_locale; ++ } ++ ++ ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) : ++ __ctype_abstract_base<char>(__refs), _M_del(__table != 0 && __del) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ _M_c_locale_ctype = _S_c_locale; ++ } ++ ++ char ++ ctype<char>::do_toupper(char __c) const ++ { return _M_toupper[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype<char>::do_tolower(char __c) const ++ { return _M_tolower[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +diff -urN gcc-3.3.2/libstdc++-v3/config/os/uclibc/os_defines.h gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/os_defines.h +--- gcc-3.3.2/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.3.2-uClibc/libstdc++-v3/config/os/uclibc/os_defines.h 2004-01-09 04:56:13.000000000 -0600 +@@ -0,0 +1,56 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCPP_OS_DEFINES ++#define _GLIBCPP_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include <features.h> ++ ++// These systems have declarations mismatching those in libio.h by ++// omitting throw qualifiers. Cleanest way out is to not provide ++// throw-qualifiers at all. Defining it as empty here will make libio.h ++// not define it. ++#undef __THROW ++#define __THROW ++ ++// Tell Glibc not to try to provide its own inline versions of ++// some math functions. Those cause assembly-time clashes with ++// our definitions. ++#define __NO_MATH_INLINES ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif diff --git a/openwrt/toolchain/gcc/3.3.5/500-loop.patch b/openwrt/toolchain/gcc/3.3.5/500-loop.patch new file mode 100644 index 0000000000..476f84b377 --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.5/500-loop.patch @@ -0,0 +1,10 @@ +--- gcc/gcc/loop.c 14 Feb 2004 14:46:03 -0000 1.488.2.3 ++++ gcc/gcc/loop.c 28 Apr 2004 22:02:53 -0000 +@@ -929,6 +929,7 @@ + || (! (GET_CODE (SET_SRC (set)) == REG + && (REGNO (SET_SRC (set)) + < FIRST_PSEUDO_REGISTER)))) ++ && regno >= FIRST_PSEUDO_REGISTER + /* This test is not redundant; SET_SRC (set) might be + a call-clobbered register and the life of REGNO + might span a call. */ diff --git a/openwrt/toolchain/gcc/3.3.5/specs-arm-soft-float b/openwrt/toolchain/gcc/3.3.5/specs-arm-soft-float new file mode 100644 index 0000000000..d692174aab --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.5/specs-arm-soft-float @@ -0,0 +1,124 @@ +*asm: +%{mbig-endian:-EB} %{mlittle-endian:-EL} %{mcpu=*:-mcpu=%*} %{march=*:-march=%*} %{mapcs-*:-mapcs-%*} %(subtarget_asm_float_spec) %{mthumb-interwork:-mthumb-interwork} %(subtarget_extra_asm_spec) + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: + + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%(cpp_cpu_arch) %(subtarget_cpp_spec) %{mapcs-32:%{mapcs-26: %e-mapcs-26 and -mapcs-32 may not be used together}} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{mbig-endian:%{mlittle-endian: %e-mbig-endian and -mlittle-endian may not be used together}} + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{profile:-p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*link: +%{h*} %{version:-v} %{b} %{Wl,*:%*} %{static:-Bstatic} %{shared:-shared} %{symbolic:-Bsymbolic} %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} -X %{mbig-endian:-EB} -m armelf_linux -p + +*lib: +%{pthread:-lpthread} %{shared:-lc} %{!shared:%{profile:-lc_p}%{!profile:-lc}} + +*libgcc: +%{!mhard-float:-lfloat} %{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:-lgcc_s%M}}} + +*startfile: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.4 + +*multilib: +. ; + +*multilib_defaults: +marm mlittle-endian msoft-float mapcs-32 mno-thumb-interwork + +*multilib_extra: + + +*multilib_matches: + + +*multilib_exclusions: + + +*multilib_options: + + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*cpp_cpu_arch: +%{march=arm2:-D__ARM_ARCH_2__} %{march=arm250:-D__ARM_ARCH_2__} %{march=arm3:-D__ARM_ARCH_2__} %{march=arm6:-D__ARM_ARCH_3__} %{march=arm600:-D__ARM_ARCH_3__} %{march=arm610:-D__ARM_ARCH_3__} %{march=arm7:-D__ARM_ARCH_3__} %{march=arm700:-D__ARM_ARCH_3__} %{march=arm710:-D__ARM_ARCH_3__} %{march=arm720:-D__ARM_ARCH_3__} %{march=arm7100:-D__ARM_ARCH_3__} %{march=arm7500:-D__ARM_ARCH_3__} %{march=arm7500fe:-D__ARM_ARCH_3__} %{march=arm7m:-D__ARM_ARCH_3M__} %{march=arm7dm:-D__ARM_ARCH_3M__} %{march=arm7dmi:-D__ARM_ARCH_3M__} %{march=arm7tdmi:-D__ARM_ARCH_4T__} %{march=arm8:-D__ARM_ARCH_4__} %{march=arm810:-D__ARM_ARCH_4__} %{march=arm9:-D__ARM_ARCH_4T__} %{march=arm920:-D__ARM_ARCH_4__} %{march=arm920t:-D__ARM_ARCH_4T__} %{march=arm9tdmi:-D__ARM_ARCH_4T__} %{march=strongarm:-D__ARM_ARCH_4__} %{march=strongarm110:-D__ARM_ARCH_4__} %{march=strongarm1100:-D__ARM_ARCH_4__} %{march=xscale:-D__ARM_ARCH_5TE__} %{march=xscale:-D__XSCALE__} %{march=armv2:-D__ARM_ARCH_2__} %{march=armv2a:-D__ARM_ARCH_2__} %{march=armv3:-D__ARM_ARCH_3__} %{march=armv3m:-D__ARM_ARCH_3M__} %{march=armv4:-D__ARM_ARCH_4__} %{march=armv4t:-D__ARM_ARCH_4T__} %{march=armv5:-D__ARM_ARCH_5__} %{march=armv5t:-D__ARM_ARCH_5T__} %{march=armv5e:-D__ARM_ARCH_5E__} %{march=armv5te:-D__ARM_ARCH_5TE__} %{!march=*: %{mcpu=arm2:-D__ARM_ARCH_2__} %{mcpu=arm250:-D__ARM_ARCH_2__} %{mcpu=arm3:-D__ARM_ARCH_2__} %{mcpu=arm6:-D__ARM_ARCH_3__} %{mcpu=arm600:-D__ARM_ARCH_3__} %{mcpu=arm610:-D__ARM_ARCH_3__} %{mcpu=arm7:-D__ARM_ARCH_3__} %{mcpu=arm700:-D__ARM_ARCH_3__} %{mcpu=arm710:-D__ARM_ARCH_3__} %{mcpu=arm720:-D__ARM_ARCH_3__} %{mcpu=arm7100:-D__ARM_ARCH_3__} %{mcpu=arm7500:-D__ARM_ARCH_3__} %{mcpu=arm7500fe:-D__ARM_ARCH_3__} %{mcpu=arm7m:-D__ARM_ARCH_3M__} %{mcpu=arm7dm:-D__ARM_ARCH_3M__} %{mcpu=arm7dmi:-D__ARM_ARCH_3M__} %{mcpu=arm7tdmi:-D__ARM_ARCH_4T__} %{mcpu=arm8:-D__ARM_ARCH_4__} %{mcpu=arm810:-D__ARM_ARCH_4__} %{mcpu=arm9:-D__ARM_ARCH_4T__} %{mcpu=arm920:-D__ARM_ARCH_4__} %{mcpu=arm920t:-D__ARM_ARCH_4T__} %{mcpu=arm9tdmi:-D__ARM_ARCH_4T__} %{mcpu=strongarm:-D__ARM_ARCH_4__} %{mcpu=strongarm110:-D__ARM_ARCH_4__} %{mcpu=strongarm1100:-D__ARM_ARCH_4__} %{mcpu=xscale:-D__ARM_ARCH_5TE__} %{mcpu=xscale:-D__XSCALE__} %{!mcpu*:%(cpp_cpu_arch_default)}} + +*cpp_cpu_arch_default: +-D__ARM_ARCH_4T__ + +*subtarget_cpp_spec: +%{posix:-D_POSIX_SOURCE} %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} + +*subtarget_extra_asm_spec: + + +*subtarget_asm_float_spec: +%{mapcs-float:-mfloat} %{!mhard-float:-mno-fpu} + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/openwrt/toolchain/gcc/3.3.5/specs-mips-soft-float b/openwrt/toolchain/gcc/3.3.5/specs-mips-soft-float new file mode 100644 index 0000000000..2a4240012b --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.5/specs-mips-soft-float @@ -0,0 +1,145 @@ +*asm: +%{G*} %(endian_spec) %{mips1} %{mips2} %{mips3} %{mips4} %{mips32} %{mips64}%{mips16:%{!mno-mips16:-mips16}} %{mno-mips16:-no-mips16} %(subtarget_asm_optimizing_spec) %(subtarget_asm_debugging_spec) %{membedded-pic} %{mabi=32:-32}%{mabi=n32:-n32}%{mabi=64:-64}%{mabi=n64:-64} %{mabi=eabi} %{mabi=o64} %{!mabi*: %(asm_abi_default_spec)} %{mgp32} %{mgp64} %{march=*} %(target_asm_spec) %(subtarget_asm_spec) + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: +%| + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%(subtarget_cpp_spec) + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{profile:-p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*link: +%{!static:--eh-frame-hdr} %(endian_spec) %{shared:-shared} %{!shared: %{!ibcs: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} %{static:-static}}} + +*lib: +%{shared: -lc} %{!static:-rpath-link %R/lib:%R/usr/lib} %{!shared: %{pthread:-lpthread} %{profile:-lc_p} %{!profile: -lc}} + +*libgcc: +%{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:%{shared-libgcc:-lgcc_s%M}%{!shared-libgcc:-lgcc}}}} + +*startfile: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{static:crtbeginT.o%s} %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.4 + +*multilib: +. ; + +*multilib_defaults: +EB mips1 mabi=32 + +*multilib_extra: + + +*multilib_matches: + + +*multilib_exclusions: + + +*multilib_options: + + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*subtarget_cc1_spec: + + +*subtarget_cpp_spec: +%{fno-PIC:-U__PIC__ -U__pic__} %{fno-pic:-U__PIC__ -U__pic__} %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{pthread:-D_REENTRANT} + +*mips_as_asm_spec: +%{!.s:-nocpp} %{.s: %{cpp} %{nocpp}} %{pipe: %e-pipe is not supported} %{K} %(subtarget_mips_as_asm_spec) + +*gas_asm_spec: +%{mtune=*} %{v} + +*target_asm_spec: +%{mmips-as: %(mips_as_asm_spec)} %{!mmips-as: %(gas_asm_spec)} + +*subtarget_mips_as_asm_spec: +%{v} + +*subtarget_asm_optimizing_spec: +%{noasmopt:-O0} %{!noasmopt:%{O:-O2} %{O1:-O2} %{O2:-O2} %{O3:-O3}} + +*subtarget_asm_debugging_spec: +-g0 + +*mdebug_asm_spec: +%{!gdwarf*:-mdebug} %{gdwarf*:-no-mdebug} + +*subtarget_asm_spec: +%{mabi=64: -64} %{!fno-PIC:%{!fno-pic:-KPIC}} %{fno-PIC:-non_shared} %{fno-pic:-non_shared} + +*asm_abi_default_spec: +-32 + +*endian_spec: +%{!EL:%{!mel:-EB}} %{EL|mel:-EL} + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/openwrt/toolchain/gcc/3.3.5/specs-mipsel-soft-float b/openwrt/toolchain/gcc/3.3.5/specs-mipsel-soft-float new file mode 100644 index 0000000000..481bf5a395 --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.5/specs-mipsel-soft-float @@ -0,0 +1,145 @@ +*asm: +%{G*} %(endian_spec) %{mips1} %{mips2} %{mips3} %{mips4} %{mips32} %{mips64}%{mips16:%{!mno-mips16:-mips16}} %{mno-mips16:-no-mips16} %(subtarget_asm_optimizing_spec) %(subtarget_asm_debugging_spec) %{membedded-pic} %{mabi=32:-32}%{mabi=n32:-n32}%{mabi=64:-64}%{mabi=n64:-64} %{mabi=eabi} %{mabi=o64} %{!mabi*: %(asm_abi_default_spec)} %{mgp32} %{mgp64} %{march=*} %(target_asm_spec) %(subtarget_asm_spec) + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: +%| + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%(subtarget_cpp_spec) + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{profile:-p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*link: +%{!static:--eh-frame-hdr} %(endian_spec) %{shared:-shared} %{!shared: %{!ibcs: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} %{static:-static}}} + +*lib: +%{shared: -lc} %{!static:-rpath-link %R/lib:%R/usr/lib} %{!shared: %{pthread:-lpthread} %{profile:-lc_p} %{!profile: -lc}} + +*libgcc: +%{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:%{shared-libgcc:-lgcc_s%M}%{!shared-libgcc:-lgcc}}}} + +*startfile: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{static:crtbeginT.o%s} %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.4 + +*multilib: +. ; + +*multilib_defaults: +EL mips1 mabi=32 + +*multilib_extra: + + +*multilib_matches: + + +*multilib_exclusions: + + +*multilib_options: + + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*subtarget_cc1_spec: + + +*subtarget_cpp_spec: +%{fno-PIC:-U__PIC__ -U__pic__} %{fno-pic:-U__PIC__ -U__pic__} %{fPIC:-D__PIC__ -D__pic__} %{fpic:-D__PIC__ -D__pic__} %{pthread:-D_REENTRANT} + +*mips_as_asm_spec: +%{!.s:-nocpp} %{.s: %{cpp} %{nocpp}} %{pipe: %e-pipe is not supported} %{K} %(subtarget_mips_as_asm_spec) + +*gas_asm_spec: +%{mtune=*} %{v} + +*target_asm_spec: +%{mmips-as: %(mips_as_asm_spec)} %{!mmips-as: %(gas_asm_spec)} + +*subtarget_mips_as_asm_spec: +%{v} + +*subtarget_asm_optimizing_spec: +%{noasmopt:-O0} %{!noasmopt:%{O:-O2} %{O1:-O2} %{O2:-O2} %{O3:-O3}} + +*subtarget_asm_debugging_spec: +-g0 + +*mdebug_asm_spec: +%{!gdwarf*:-mdebug} %{gdwarf*:-no-mdebug} + +*subtarget_asm_spec: +%{mabi=64: -64} %{!fno-PIC:%{!fno-pic:-KPIC}} %{fno-PIC:-non_shared} %{fno-pic:-non_shared} + +*asm_abi_default_spec: +-32 + +*endian_spec: +%{!EB:%{!meb:-EL}} %{EB|meb:-EB} + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/openwrt/toolchain/gcc/3.3.5/specs-powerpc-soft-float b/openwrt/toolchain/gcc/3.3.5/specs-powerpc-soft-float new file mode 100644 index 0000000000..8a546ac8ec --- /dev/null +++ b/openwrt/toolchain/gcc/3.3.5/specs-powerpc-soft-float @@ -0,0 +1,352 @@ +*asm: +%(asm_cpu) %{.s: %{mregnames} %{mno-regnames}} %{.S: %{mregnames} %{mno-regnames}} %{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Yd,*} %{Wa,*:%*} %{mrelocatable} %{mrelocatable-lib} %{fpic:-K PIC} %{fPIC:-K PIC} %{memb} %{!memb: %{msdata: -memb} %{msdata=eabi: -memb}} %{mlittle} %{mlittle-endian} %{mbig} %{mbig-endian} %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: %{mcall-freebsd: -mbig} %{mcall-i960-old: -mlittle} %{mcall-linux: -mbig} %{mcall-gnu: -mbig} %{mcall-netbsd: -mbig} }}}} + +*asm_debug: +%{gstabs*:--gstabs}%{!gstabs*:%{g*:--gdwarf2}} + +*asm_final: +%| + +*asm_options: +%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O} + +*invoke_as: +%{!S:-o %{|!pipe:%g.s} | + as %(asm_options) %{!pipe:%g.s} %A } + +*cpp: +%{posix: -D_POSIX_SOURCE} %(cpp_sysv) %{mads: %(cpp_os_ads) } %{myellowknife: %(cpp_os_yellowknife) } %{mmvme: %(cpp_os_mvme) } %{msim: %(cpp_os_sim) } %{mwindiss: %(cpp_os_windiss) } %{mcall-freebsd: %(cpp_os_freebsd) } %{mcall-linux: %(cpp_os_linux) } %{mcall-gnu: %(cpp_os_gnu) } %{mcall-netbsd: %(cpp_os_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(cpp_os_default) }}}}}}}}} + +*cpp_options: +%(cpp_unique_options) %1 %{m*} %{std*} %{ansi} %{W*&pedantic*} %{w} %{f*} %{O*} %{undef} + +*cpp_debug_options: +%{d*} + +*cpp_unique_options: +%{C:%{!E:%eGNU C does not support -C without using -E}} %{CC:%{!E:%eGNU C does not support -CC without using -E}} %{!Q:-quiet} %{nostdinc*} %{C} %{CC} %{v} %{I*} %{P} %I %{MD:-MD %{!o:%b.d}%{o*:%.d%*}} %{MMD:-MMD %{!o:%b.d}%{o*:%.d%*}} %{M} %{MM} %{MF*} %{MG} %{MP} %{MQ*} %{MT*} %{!E:%{!M:%{!MM:%{MD|MMD:%{o*:-MQ %*}}}}} %{!no-gcc:-D__GNUC__=%v1 -D__GNUC_MINOR__=%v2 -D__GNUC_PATCHLEVEL__=%v3} %{!undef:%{!ansi:%{!std=*:%p}%{std=gnu*:%p}} %P} %{trigraphs} %{remap} %{g3:-dD} %{H} %C %{D*&U*&A*} %{i*} %Z %i %{E|M|MM:%W{o*}} + +*trad_capable_cpp: +cc1 -E %{traditional|ftraditional|traditional-cpp:-traditional-cpp} + +*cc1: +%{G*} %{mlittle: %(cc1_endian_little)} %{!mlittle: %{mlittle-endian: %(cc1_endian_little)}} %{mbig: %(cc1_endian_big)} %{!mbig: %{mbig-endian: %(cc1_endian_big)}} %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: %{mcall-aixdesc: -mbig %(cc1_endian_big) } %{mcall-freebsd: -mbig %(cc1_endian_big) } %{mcall-i960-old: -mlittle %(cc1_endian_little) } %{mcall-linux: -mbig %(cc1_endian_big) } %{mcall-gnu: -mbig %(cc1_endian_big) } %{mcall-netbsd: -mbig %(cc1_endian_big) } %{!mcall-aixdesc: %{!mcall-freebsd: %{!mcall-i960-old: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(cc1_endian_default) }}}}}} }}}} %{mno-sdata: -msdata=none } %{meabi: %{!mcall-*: -mcall-sysv }} %{!meabi: %{!mno-eabi: %{mrelocatable: -meabi } %{mcall-freebsd: -mno-eabi } %{mcall-i960-old: -meabi } %{mcall-linux: -mno-eabi } %{mcall-gnu: -mno-eabi } %{mcall-netbsd: -mno-eabi }}} %{msdata: -msdata=default} %{mno-sdata: -msdata=none} %{profile: -p} + +*cc1_options: +%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}} %1 %{!Q:-quiet} -dumpbase %B %{d*} %{m*} %{a*} %{c|S:%{o*:-auxbase-strip %*}%{!o*:-auxbase %b}}%{!c:%{!S:-auxbase %b}} %{g*} %{O*} %{W*&pedantic*} %{w} %{std*} %{ansi} %{v:-version} %{pg:-p} %{p} %{f*} %{undef} %{Qn:-fno-ident} %{--help:--help} %{--target-help:--target-help} %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}} %{fsyntax-only:-o %j} %{-param*} %{msoft-float:%{mhard-float: %e-msoft-float and -mhard_float may not be used together}} %{!mhard-float:%{!msoft-float:-msoft-float}} + +*cc1plus: + + +*link_gcc_c_sequence: +%{static:--start-group} %G %L %{static:--end-group}%{!static:%G} + +*endfile: +%{mads: crtsavres.o%s %(endfile_ads)} %{myellowknife: crtsavres.o%s %(endfile_yellowknife)} %{mmvme: crtsavres.o%s %(endfile_mvme)} %{msim: crtsavres.o%s %(endfile_sim)} %{mwindiss: %(endfile_windiss)} %{mcall-freebsd: crtsavres.o%s %(endfile_freebsd) } %{mcall-linux: crtsavres.o%s %(endfile_linux) } %{mcall-gnu: crtsavres.o%s %(endfile_gnu) } %{mcall-netbsd: crtsavres.o%s %(endfile_netbsd) } %{mvxworks: crtsavres.o%s %(endfile_vxworks) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %{!mvxworks: %(crtsavres_default) %(endfile_default) }}}}}}}}}} + +*link: +%{!static:--eh-frame-hdr} %{h*} %{v:-V} %{!msdata=none:%{G*}} %{msdata=none:-G0} %{YP,*} %{R*} %{Qy:} %{!Qn:-Qy} %(link_shlib) %{!Wl,-T*: %{!T*: %(link_start) }} %(link_target) %(link_os) + +*lib: +%{mads: %(lib_ads) } %{myellowknife: %(lib_yellowknife) } %{mmvme: %(lib_mvme) } %{msim: %(lib_sim) } %{mwindiss: %(lib_windiss) } %{mcall-freebsd: %(lib_freebsd) } %{mcall-linux: %(lib_linux) } %{mcall-gnu: %(lib_gnu) } %{mcall-netbsd: %(lib_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(lib_default) }}}}}}}}} + +*libgcc: +%{static|static-libgcc:-lgcc -lgcc_eh}%{!static:%{!static-libgcc:%{!shared:%{!shared-libgcc:-lgcc -lgcc_eh}%{shared-libgcc:-lgcc_s%M -lgcc}}%{shared:%{shared-libgcc:-lgcc_s%M}%{!shared-libgcc:-lgcc}}}} + +*startfile: +%{mads: %(startfile_ads) } %{myellowknife: %(startfile_yellowknife) } %{mmvme: %(startfile_mvme) } %{msim: %(startfile_sim) } %{mwindiss: %(startfile_windiss) } %{mcall-freebsd: %(startfile_freebsd) } %{mcall-linux: %(startfile_linux) } %{mcall-gnu: %(startfile_gnu) } %{mcall-netbsd: %(startfile_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %(startfile_default) }}}}}}}}} + +*switches_need_spaces: + + +*predefines: + + +*cross_compile: +1 + +*version: +3.3.4 + +*multilib: +. mhard-float;nof !mhard-float; + +*multilib_defaults: +mbig mcall-sysv + +*multilib_extra: +fPIC mstrict-align + +*multilib_matches: +mcpu=401 msoft-float;mcpu=403 msoft-float;mcpu=405 msoft-float;mcpu=ec603e msoft-float;mcpu=801 msoft-float;mcpu=821 msoft-float;mcpu=823 msoft-float;mcpu=860 msoft-float;msoft-float msoft-float; + +*multilib_exclusions: + + +*multilib_options: +msoft-float + +*linker: +collect2 + +*link_libgcc: +%D + +*md_exec_prefix: + + +*md_startfile_prefix: + + +*md_startfile_prefix_1: + + +*startfile_prefix_spec: + + +*cpp_default: + + +*asm_cpu: +%{!mcpu*: %{mpower: %{!mpower2: -mpwr}} %{mpower2: -mpwrx} %{mpowerpc*: -mppc} %{mno-power: %{!mpowerpc*: -mcom}} %{!mno-power: %{!mpower2: %(asm_default)}}} %{mcpu=common: -mcom} %{mcpu=power: -mpwr} %{mcpu=power2: -mpwrx} %{mcpu=power3: -m604} %{mcpu=power4: -mpower4} %{mcpu=powerpc: -mppc} %{mcpu=rios: -mpwr} %{mcpu=rios1: -mpwr} %{mcpu=rios2: -mpwrx} %{mcpu=rsc: -mpwr} %{mcpu=rsc1: -mpwr} %{mcpu=401: -mppc} %{mcpu=403: -m403} %{mcpu=405: -m405} %{mcpu=505: -mppc} %{mcpu=601: -m601} %{mcpu=602: -mppc} %{mcpu=603: -mppc} %{mcpu=603e: -mppc} %{mcpu=ec603e: -mppc} %{mcpu=604: -mppc} %{mcpu=604e: -mppc} %{mcpu=620: -mppc} %{mcpu=630: -m604} %{mcpu=740: -mppc} %{mcpu=7400: -mppc} %{mcpu=7450: -mppc} %{mcpu=750: -mppc} %{mcpu=801: -mppc} %{mcpu=821: -mppc} %{mcpu=823: -mppc} %{mcpu=860: -mppc} %{mcpu=8540: -me500} %{maltivec: -maltivec} + +*asm_default: +-mppc + +*cpp_sysv: +%{mrelocatable*: -D_RELOCATABLE} %{fpic: -D__PIC__=1 -D__pic__=1} %{!fpic: %{fPIC: -D__PIC__=2 -D__pic__=2}} + +*crtsavres_default: +crtsavres.o%s + +*lib_ads: +--start-group -lads -lc --end-group + +*lib_yellowknife: +--start-group -lyk -lc --end-group + +*lib_mvme: +--start-group -lmvme -lc --end-group + +*lib_sim: +--start-group -lsim -lc --end-group + +*lib_freebsd: + %{!shared: %{!pg: %{!pthread:-lc} %{pthread:-lc_r}} %{pg: %{!pthread:-lc_p} %{pthread:-lc_r_p}} } + +*lib_gnu: +%{mnewlib: --start-group -lgnu -lc --end-group } %{!mnewlib: %{shared:-lc} %{!shared: %{pthread:-lpthread } %{profile:-lc_p} %{!profile:-lc}}} + +*lib_linux: +%{mnewlib: --start-group -llinux -lc --end-group } %{!mnewlib: %{pthread:-lpthread} %{shared:-lc} %{!shared: %{profile:-lc_p} %{!profile:-lc}}} + +*lib_netbsd: +%{profile:-lgmon -lc_p} %{!profile:-lc} + +*lib_vxworks: + + +*lib_windiss: +--start-group -li -lcfp -lwindiss -lram -limpl -limpfp --end-group + +*lib_default: +%(lib_linux) + +*startfile_ads: +ecrti.o%s crt0.o%s crtbegin.o%s + +*startfile_yellowknife: +ecrti.o%s crt0.o%s crtbegin.o%s + +*startfile_mvme: +ecrti.o%s crt0.o%s crtbegin.o%s + +*startfile_sim: +ecrti.o%s sim-crt0.o%s crtbegin.o%s + +*startfile_freebsd: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:%{profile:gcrt1.o%s} %{!profile:crt1.o%s}}}} crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*startfile_gnu: +%{!shared: %{!static: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}}} %{static: %{pg:gcrt0.o%s} %{!pg:%{p:gcrt0.o%s} %{!p:crt0.o%s}}} %{mnewlib: ecrti.o%s} %{!mnewlib: crti.o%s} %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*startfile_linux: +%{!shared: %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} %{!p:crt1.o%s}}} %{mnewlib: ecrti.o%s} %{!mnewlib: crti.o%s} %{static:crtbeginT.o%s} %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}} + +*startfile_netbsd: +ncrti.o%s crt0.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s} + +*startfile_vxworks: + + +*startfile_windiss: +crt0.o%s crtbegin.o%s + +*startfile_default: +%(startfile_linux) + +*endfile_ads: +crtend.o%s ecrtn.o%s + +*endfile_yellowknife: +crtend.o%s ecrtn.o%s + +*endfile_mvme: +crtend.o%s ecrtn.o%s + +*endfile_sim: +crtend.o%s ecrtn.o%s + +*endfile_freebsd: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s + +*endfile_gnu: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} %{mnewlib: ecrtn.o%s} %{!mnewlib: crtn.o%s} + +*endfile_linux: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} %{mnewlib: ecrtn.o%s} %{!mnewlib: crtn.o%s} + +*endfile_netbsd: +%{!shared:crtend.o%s} %{shared:crtendS.o%s} ncrtn.o%s + +*endfile_vxworks: + + +*endfile_windiss: +crtend.o%s + +*endfile_default: +%(endfile_linux) + +*link_path: + + +*link_shlib: +%{shared:-shared} %{!shared: %{static:-static}} + +*link_target: +%{mlittle: --oformat elf32-powerpcle } %{mlittle-endian: --oformat elf32-powerpcle } %{!mlittle: %{!mlittle-endian: %{!mbig: %{!mbig-endian: %{mcall-i960-old: --oformat elf32-powerpcle} }}}} + +*link_start: +%{mads: %(link_start_ads) } %{myellowknife: %(link_start_yellowknife) } %{mmvme: %(link_start_mvme) } %{msim: %(link_start_sim) } %{mwindiss: %(link_start_windiss) } %{mcall-freebsd: %(link_start_freebsd) } %{mcall-linux: %(link_start_linux) } %{mcall-gnu: %(link_start_gnu) } %{mcall-netbsd: %(link_start_netbsd) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %{!mcall-freebsd: %(link_start_default) }}}}}}}}} + +*link_start_ads: +-T ads.ld%s + +*link_start_yellowknife: +-T yellowknife.ld%s + +*link_start_mvme: +-Ttext 0x40000 + +*link_start_sim: + + +*link_start_freebsd: + + +*link_start_gnu: + + +*link_start_linux: + + +*link_start_netbsd: + + +*link_start_vxworks: + + +*link_start_windiss: + + +*link_start_default: +%(link_start_linux) + +*link_os: +%{mads: %(link_os_ads) } %{myellowknife: %(link_os_yellowknife) } %{mmvme: %(link_os_mvme) } %{msim: %(link_os_sim) } %{mwindiss: %(link_os_windiss) } %{mcall-freebsd: %(link_os_freebsd) } %{mcall-linux: %(link_os_linux) } %{mcall-gnu: %(link_os_gnu) } %{mcall-netbsd: %(link_os_netbsd) } %{mcall-uclibc: %(link_os_linux_uclibc) } %{!mads: %{!myellowknife: %{!mmvme: %{!msim: %{!mwindiss: %{!mcall-freebsd: %{!mcall-linux: %{!mcall-gnu: %{!mcall-netbsd: %{!mcall-uclibc: %(link_os_default) }}}}}}}}}} + +*link_os_ads: + + +*link_os_yellowknife: + + +*link_os_mvme: + + +*link_os_sim: +-m elf32ppcsim + +*link_os_freebsd: + %{p:%e`-p' not supported; use `-pg' and gprof(1)} %{Wl,*:%*} %{v:-V} %{assert*} %{R*} %{rpath*} %{defsym*} %{shared:-Bshareable %{h*} %{soname*}} %{!shared: %{!static: %{rdynamic: -export-dynamic} %{!dynamic-linker: -dynamic-linker /usr/libexec/ld-elf.so.1}} %{static:-Bstatic}} %{symbolic:-Bsymbolic} + +*link_os_linux: +-m elf32ppclinux %{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}} + +*link_os_gnu: +-m elf32ppclinux %{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}} + +*link_os_netbsd: +%{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /usr/libexec/ld.elf_so}}} + +*link_os_vxworks: +-r + +*link_os_windiss: + + +*link_os_linux_uclibc: +-m elf32ppclinux %{!shared: %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} + +*link_os_default: +%(link_os_linux_uclibc) + +*cc1_endian_big: + + +*cc1_endian_little: +%{!mstrict-align: %{!mno-strict-align: %{!mcall-i960-old: -mstrict-align } }} + +*cc1_endian_default: +%(cc1_endian_big) + +*cpp_os_ads: + + +*cpp_os_yellowknife: + + +*cpp_os_mvme: + + +*cpp_os_sim: + + +*cpp_os_freebsd: + -D__ELF__ -D__PPC__ -D__ppc__ -D__PowerPC__ -D__powerpc__ -Acpu=powerpc -Amachine=powerpc + +*cpp_os_gnu: +-D__unix__ -D__gnu_hurd__ -D__GNU__ %{!undef: %{!ansi: -Dunix -D__unix}} -Asystem=gnu -Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT} + +*cpp_os_linux: +-D__unix__ -D__gnu_linux__ -D__linux__ %{!undef: %{!ansi: %{!std=*:-Dunix -D__unix -Dlinux -D__linux} %{std=gnu*:-Dunix -D__unix -Dlinux -D__linux}}} -Asystem=unix -Asystem=posix %{pthread:-D_REENTRANT} + +*cpp_os_netbsd: +-D__powerpc__ -D__NetBSD__ -D__ELF__ -D__KPRINTF_ATTRIBUTE__ + +*cpp_os_rtems: +%{!mcpu*: %{!Dppc*: %{!Dmpc*: -Dmpc750} } }%{mcpu=403: %{!Dppc*: %{!Dmpc*: -Dppc403} } } %{mcpu=505: %{!Dppc*: %{!Dmpc*: -Dmpc505} } } %{mcpu=601: %{!Dppc*: %{!Dmpc*: -Dppc601} } } %{mcpu=602: %{!Dppc*: %{!Dmpc*: -Dppc602} } } %{mcpu=603: %{!Dppc*: %{!Dmpc*: -Dppc603} } } %{mcpu=603e: %{!Dppc*: %{!Dmpc*: -Dppc603e} } } %{mcpu=604: %{!Dppc*: %{!Dmpc*: -Dmpc604} } } %{mcpu=750: %{!Dppc*: %{!Dmpc*: -Dmpc750} } } %{mcpu=821: %{!Dppc*: %{!Dmpc*: -Dmpc821} } } %{mcpu=860: %{!Dppc*: %{!Dmpc*: -Dmpc860} } } + +*cpp_os_vxworks: +-DCPU_FAMILY=PPC %{!mcpu*: %{mpowerpc*: -DCPU=PPC603} %{!mno-powerpc: -DCPU=PPC603}} %{mcpu=powerpc: -DCPU=PPC603} %{mcpu=401: -DCPU=PPC403} %{mcpu=403: -DCPU=PPC403} %{mcpu=405: -DCPU=PPC405} %{mcpu=601: -DCPU=PPC601} %{mcpu=602: -DCPU=PPC603} %{mcpu=603: -DCPU=PPC603} %{mcpu=603e: -DCPU=PPC603} %{mcpu=ec603e: -DCPU=PPC603} %{mcpu=604: -DCPU=PPC604} %{mcpu=604e: -DCPU=PPC604} %{mcpu=620: -DCPU=PPC604} %{mcpu=740: -DCPU=PPC603} %{mcpu=7450: -DCPU=PPC603} %{mcpu=750: -DCPU=PPC603} %{mcpu=801: -DCPU=PPC603} %{mcpu=821: -DCPU=PPC603} %{mcpu=823: -DCPU=PPC603} %{mcpu=860: -DCPU=PPC603} + +*cpp_os_windiss: +-D__rtasim -D__EABI__ -D__ppc %{!msoft-float: -D__hardfp} + +*cpp_os_default: +%(cpp_os_linux) + +*link_command: +%{!fsyntax-only:%{!c:%{!M:%{!MM:%{!E:%{!S: %(linker) %l %X %{o*} %{A} %{d} %{e*} %{m} %{N} %{n} %{r} %{s} %{t} %{u*} %{x} %{z} %{Z} %{!A:%{!nostdlib:%{!nostartfiles:%S}}} %{static:} %{L*} %(link_libgcc) %o %{!nostdlib:%{!nodefaultlibs:%(link_gcc_c_sequence)}} %{!A:%{!nostdlib:%{!nostartfiles:%E}}} %{T*} }}}}}} + diff --git a/openwrt/toolchain/gcc/3.4.0/100-uclibc-conf.patch b/openwrt/toolchain/gcc/3.4.0/100-uclibc-conf.patch new file mode 100644 index 0000000000..ad03345bd1 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.0/100-uclibc-conf.patch @@ -0,0 +1,442 @@ +diff -urN gcc-3.4.0-dist/boehm-gc/configure gcc-3.4.0/boehm-gc/configure +--- gcc-3.4.0-dist/boehm-gc/configure 2004-04-18 21:23:04.000000000 -0500 ++++ gcc-3.4.0/boehm-gc/configure 2004-08-12 16:51:15.000000000 -0500 +@@ -1947,6 +1947,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN gcc-3.4.0-dist/boehm-gc/ltconfig gcc-3.4.0/boehm-gc/ltconfig +--- gcc-3.4.0-dist/boehm-gc/ltconfig 2002-11-20 09:59:06.000000000 -0600 ++++ gcc-3.4.0/boehm-gc/ltconfig 2004-08-12 16:51:15.000000000 -0500 +@@ -1981,6 +1981,23 @@ + fi + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ++ file_magic_cmd=/usr/bin/file ++ file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + version_type=sunos + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then +diff -urN gcc-3.4.0-dist/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h +--- gcc-3.4.0-dist/gcc/config/arm/linux-elf.h 2004-01-31 00:18:11.000000000 -0600 ++++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-08-12 16:51:15.000000000 -0500 +@@ -81,6 +81,18 @@ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC "%{h*} %{version:-v} \ ++ %{b} %{Wl,*:%*} \ ++ %{static:-Bstatic} \ ++ %{shared:-shared} \ ++ %{symbolic:-Bsymbolic} \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ ++ -X \ ++ %{mbig-endian:-EB}" \ ++ SUBTARGET_EXTRA_LINK_SPEC ++#else + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ +@@ -91,6 +103,7 @@ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC ++#endif + + #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS() + +diff -urN gcc-3.4.0-dist/gcc/config/cris/linux.h gcc-3.4.0/gcc/config/cris/linux.h +--- gcc-3.4.0-dist/gcc/config/cris/linux.h 2003-11-28 21:08:09.000000000 -0600 ++++ gcc-3.4.0/gcc/config/cris/linux.h 2004-08-12 16:51:15.000000000 -0500 +@@ -79,6 +79,25 @@ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -93,6 +112,8 @@ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +diff -urN gcc-3.4.0-dist/gcc/config/cris/t-linux-uclibc gcc-3.4.0/gcc/config/cris/t-linux-uclibc +--- gcc-3.4.0-dist/gcc/config/cris/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/gcc/config/cris/t-linux-uclibc 2004-08-12 16:51:15.000000000 -0500 +@@ -0,0 +1,3 @@ ++T_CFLAGS = -DUSE_UCLIBC ++TARGET_LIBGCC2_CFLAGS += -fPIC ++CRTSTUFF_T_CFLAGS_S = $(TARGET_LIBGCC2_CFLAGS) +diff -urN gcc-3.4.0-dist/gcc/config/i386/linux.h gcc-3.4.0/gcc/config/i386/linux.h +--- gcc-3.4.0-dist/gcc/config/i386/linux.h 2003-11-28 21:08:10.000000000 -0600 ++++ gcc-3.4.0/gcc/config/i386/linux.h 2004-08-12 16:51:15.000000000 -0500 +@@ -118,6 +118,15 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.1}} \ + %{static:-static}}}" + #else ++#if defined USE_UCLIBC ++#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ +@@ -126,6 +135,7 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}}}" + #endif ++#endif + + /* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named +diff -urN gcc-3.4.0-dist/gcc/config/mips/linux.h gcc-3.4.0/gcc/config/mips/linux.h +--- gcc-3.4.0-dist/gcc/config/mips/linux.h 2004-02-19 15:45:21.000000000 -0600 ++++ gcc-3.4.0/gcc/config/mips/linux.h 2004-08-12 16:51:15.000000000 -0500 +@@ -109,6 +109,17 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC \ ++ "%(endian_spec) \ ++ %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ +@@ -118,6 +129,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ + %{static:-static}}}" ++#endif + + #undef SUBTARGET_ASM_SPEC + #define SUBTARGET_ASM_SPEC "\ +diff -urN gcc-3.4.0-dist/gcc/config/rs6000/linux.h gcc-3.4.0/gcc/config/rs6000/linux.h +--- gcc-3.4.0-dist/gcc/config/rs6000/linux.h 2004-02-25 09:11:19.000000000 -0600 ++++ gcc-3.4.0/gcc/config/rs6000/linux.h 2004-08-12 16:51:15.000000000 -0500 +@@ -61,7 +61,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #define LINK_GCC_C_SEQUENCE_SPEC \ + "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" +diff -urN gcc-3.4.0-dist/gcc/config/rs6000/sysv4.h gcc-3.4.0/gcc/config/rs6000/sysv4.h +--- gcc-3.4.0-dist/gcc/config/rs6000/sysv4.h 2004-03-02 16:34:58.000000000 -0600 ++++ gcc-3.4.0/gcc/config/rs6000/sysv4.h 2004-08-12 16:51:15.000000000 -0500 +@@ -952,6 +952,7 @@ + mcall-linux : %(link_os_linux) ; \ + mcall-gnu : %(link_os_gnu) ; \ + mcall-netbsd : %(link_os_netbsd) ; \ ++ mcall-linux-uclibc : %(link_os_linux_uclibc); \ + mcall-openbsd: %(link_os_openbsd) ; \ + : %(link_os_default) }" + +@@ -1129,6 +1130,10 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}" + ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + #if defined(HAVE_LD_EH_FRAME_HDR) + # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " + #endif +@@ -1295,6 +1300,7 @@ + { "link_os_sim", LINK_OS_SIM_SPEC }, \ + { "link_os_freebsd", LINK_OS_FREEBSD_SPEC }, \ + { "link_os_linux", LINK_OS_LINUX_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_gnu", LINK_OS_GNU_SPEC }, \ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_openbsd", LINK_OS_OPENBSD_SPEC }, \ +diff -urN gcc-3.4.0-dist/gcc/config/sh/linux.h gcc-3.4.0/gcc/config/sh/linux.h +--- gcc-3.4.0-dist/gcc/config/sh/linux.h 2004-01-11 20:29:13.000000000 -0600 ++++ gcc-3.4.0/gcc/config/sh/linux.h 2004-08-12 16:51:15.000000000 -0500 +@@ -73,12 +73,21 @@ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define SUBTARGET_LINK_SPEC \ ++ "%{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}" ++#else + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}" ++#endif + + #undef LIB_SPEC + #define LIB_SPEC \ +diff -urN gcc-3.4.0-dist/gcc/config/sh/t-linux-uclibc gcc-3.4.0/gcc/config/sh/t-linux-uclibc +--- gcc-3.4.0-dist/gcc/config/sh/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/gcc/config/sh/t-linux-uclibc 2004-08-12 16:51:15.000000000 -0500 +@@ -0,0 +1,13 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++TARGET_LIBGCC2_CFLAGS = -fpic -DNO_FPSCR_VALUES ++LIB1ASMFUNCS_CACHE = _ic_invalidate ++ ++LIB2FUNCS_EXTRA= ++ ++MULTILIB_OPTIONS= $(MULTILIB_ENDIAN) m3e/m4 ++MULTILIB_DIRNAMES= ++MULTILIB_MATCHES = ++MULTILIB_EXCEPTIONS= ++ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o +diff -urN gcc-3.4.0-dist/gcc/config/sh/t-sh64-uclibc gcc-3.4.0/gcc/config/sh/t-sh64-uclibc +--- gcc-3.4.0-dist/gcc/config/sh/t-sh64-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/gcc/config/sh/t-sh64-uclibc 2004-08-12 16:51:15.000000000 -0500 +@@ -0,0 +1,13 @@ ++EXTRA_MULTILIB_PARTS= crt1.o crti.o crtn.o crtbegin.o crtend.o ++ ++LIB1ASMFUNCS = \ ++ _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ ++ _shcompact_call_trampoline _shcompact_return_trampoline \ ++ _shcompact_incoming_args _ic_invalidate _nested_trampoline \ ++ _push_pop_shmedia_regs \ ++ _udivdi3 _divdi3 _umoddi3 _moddi3 ++ ++MULTILIB_OPTIONS = $(MULTILIB_ENDIAN) m5-32media-nofpu/m5-compact/m5-compact-nofpu/m5-64media/m5-64media-nofpu ++MULTILIB_DIRNAMES= $(MULTILIB_ENDIAN) nofpu compact nofpu/compact media64 nofpu/media64 ++MULTILIB_MATCHES= ++MULTILIB_EXCEPTIONS= +diff -urN gcc-3.4.0-dist/gcc/config/t-linux-uclibc gcc-3.4.0/gcc/config/t-linux-uclibc +--- gcc-3.4.0-dist/gcc/config/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/gcc/config/t-linux-uclibc 2004-08-12 16:51:15.000000000 -0500 +@@ -0,0 +1,15 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Compile crtbeginS.o and crtendS.o with pic. ++CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC ++# Compile libgcc2.a with pic. ++TARGET_LIBGCC2_CFLAGS = -fPIC ++ ++# Override t-slibgcc-elf-ver to export some libgcc symbols with ++# the symbol versions that glibc used. ++SHLIB_MAPFILES += $(srcdir)/config/libgcc-glibc.ver ++ ++# Use unwind-dw2-fde ++LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ ++ $(srcdir)/unwind-sjlj.c $(srcdir)/gthr-gnat.c $(srcdir)/unwind-c.c ++LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h +diff -urN gcc-3.4.0-dist/gcc/config.gcc gcc-3.4.0/gcc/config.gcc +--- gcc-3.4.0-dist/gcc/config.gcc 2004-04-16 21:28:24.000000000 -0500 ++++ gcc-3.4.0/gcc/config.gcc 2004-08-12 16:51:15.000000000 -0500 +@@ -664,6 +664,12 @@ + extra_parts="" + use_collect2=yes + ;; ++arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc ++ tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" +@@ -725,6 +731,10 @@ + tmake_file="cris/t-cris cris/t-elfmulti" + gas=yes + ;; ++cris-*-linux-uclibc*) ++ tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" ++ tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux-uclibc" ++ ;; + cris-*-linux*) + tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" + tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux" +@@ -988,6 +998,11 @@ + thread_file='single' + fi + ;; ++i[34567]86-*-linux*uclibc*) # Intel 80386's running GNU/Linux ++ # with ELF format using uClibc ++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc i386/t-crtstuff" ++ ;; + i[34567]86-*-linux*) # Intel 80386's running GNU/Linux + # with ELF format using glibc 2 + # aka GNU/Linux C library 6 +@@ -1547,6 +1562,16 @@ + gnu_ld=yes + gas=yes + ;; ++mips*-*-linux-uclibc*) # Linux MIPS, either endian. uClibc ++ tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" ++ case ${target} in ++ mipsisa32*-*) ++ target_cpu_default="MASK_SOFT_FLOAT" ++ tm_defines="MIPS_ISA_DEFAULT=32" ++ ;; ++ esac ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc" ++ ;; + mips*-*-linux*) # Linux MIPS, either endian. + tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" + case ${target} in +@@ -1764,6 +1789,10 @@ + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h rs6000/linuxspe.h" + tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" + ;; ++powerpc-*-linux-uclibc*) ++ tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" ++ tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux-uclibc rs6000/t-ppccomm" ++ ;; + powerpc-*-linux*) + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" + tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" +@@ -1916,7 +1945,7 @@ + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/embed-elf.h sh/rtemself.h rtems.h" + ;; + sh-*-linux* | sh[2346lbe]*-*-linux*) +- tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver t-linux" ++ tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver" + case ${target} in + sh*be-*-* | sh*eb-*-*) ;; + *) +@@ -1924,9 +1953,17 @@ + tmake_file="${tmake_file} sh/t-le" + ;; + esac +- tmake_file="${tmake_file} sh/t-linux" ++ case ${target} in ++ *-*-linux-uclibc*) tmake_file="${tmake_file} t-linux-uclibc sh/t-linux-uclibc" ;; ++ *) tmake_file="${tmake_file} t-linux sh/t-linux" ;; ++ esac + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/linux.h" + case ${target} in ++ sh64*-*-linux-uclibc*) ++ tmake_file="${tmake_file} sh/t-sh64-uclibc" ++ tm_file="${tm_file} sh/sh64.h" ++ extra_headers="shmedia.h ushmedia.h sshmedia.h" ++ ;; + sh64*) + tmake_file="${tmake_file} sh/t-sh64" + tm_file="${tm_file} sh/sh64.h" +diff -urN gcc-3.4.0-dist/libtool.m4 gcc-3.4.0/libtool.m4 +--- gcc-3.4.0-dist/libtool.m4 2003-11-18 23:29:32.000000000 -0600 ++++ gcc-3.4.0/libtool.m4 2004-08-12 16:51:15.000000000 -0500 +@@ -689,6 +689,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gcc-3.4.0-dist/ltconfig gcc-3.4.0/ltconfig +--- gcc-3.4.0-dist/ltconfig 2004-03-05 15:05:41.000000000 -0600 ++++ gcc-3.4.0/ltconfig 2004-08-12 16:51:15.000000000 -0500 +@@ -602,6 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in ++linux-uclibc*) ;; + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +@@ -1262,6 +1263,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/gcc/3.4.0/200-uclibc-locale.patch b/openwrt/toolchain/gcc/3.4.0/200-uclibc-locale.patch new file mode 100644 index 0000000000..27e047eb73 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.0/200-uclibc-locale.patch @@ -0,0 +1,3246 @@ +diff -urN gcc-3.4.0-dist/libstdc++-v3/acinclude.m4 gcc-3.4.0/libstdc++-v3/acinclude.m4 +--- gcc-3.4.0-dist/libstdc++-v3/acinclude.m4 2004-03-18 11:35:22.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/acinclude.m4 2004-08-12 17:08:19.000000000 -0500 +@@ -995,7 +995,7 @@ + AC_MSG_CHECKING([for C locale to use]) + GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@], + [use MODEL for target locale package], +- [permit generic|gnu|ieee_1003.1-2001|yes|no|auto]) ++ [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto]) + + # If they didn't use this option switch, or if they specified --enable + # with no specific model, we'll have to look for one. If they +@@ -1011,6 +1011,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ x*-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include <features.h> +@@ -1137,6 +1140,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.0-dist/libstdc++-v3/aclocal.m4 gcc-3.4.0/libstdc++-v3/aclocal.m4 +--- gcc-3.4.0-dist/libstdc++-v3/aclocal.m4 2004-03-18 11:35:23.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/aclocal.m4 2004-08-12 17:13:42.000000000 -0500 +@@ -1024,6 +1024,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ x*-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include <features.h> +@@ -1150,6 +1153,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-3.4.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,59 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek <jakub@redhat.com> ++ ++#include <clocale> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#endif // GLIBC 2.3 and later +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-3.4.0/libstdc++-v3/config/locale/uclibc/c_locale.cc +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/c_locale.cc 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,160 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <cerrno> // For errno ++#include <locale> ++#include <stdexcept> ++#include <langinfo.h> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#warning should dummy __newlocale check for C|POSIX ? ++#define __newlocale(a, b, c) NULL ++#define __freelocale(a) ((void)0) ++#define __duplocale(a) __c_locale() ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error(__N("locale::facet::_S_create_c_locale " ++ "name not valid")); ++ } ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++ if (_S_get_c_locale() != __cloc) ++ __freelocale(__cloc); ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++ { return __duplocale(__cloc); } ++} // namespace std ++ ++namespace __gnu_cxx ++{ ++ const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES", ++#if _GLIBCXX_NUM_CATEGORIES != 0 ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} ++ ++namespace std ++{ ++ const char* const* const locale::_S_categories = __gnu_cxx::category_names; ++} // namespace std +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-3.4.0/libstdc++-v3/config/locale/uclibc/c_locale.h +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/c_locale.h 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,119 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include <cstring> // get std::strlen ++#include <cstdio> // get std::snprintf or std::sprintf ++#include <clocale> ++#include <langinfo.h> // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include <iconv.h> // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include <libintl.h> // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCXX_C_LOCALE_GNU for ++#endif ++#define _GLIBCXX_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCXX_NUM_CATEGORIES 6 ++#define _GLIBCXX_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template<typename _Tv> ++ int ++ __convert_from_v(char* __out, const int __size, const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec = -1) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec = -1) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = std::setlocale(LC_ALL, NULL); ++ char* __sav = new char[std::strlen(__old) + 1]; ++ std::strcpy(__sav, __old); ++ std::setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ int __ret; ++ if (__prec >= 0) ++ __ret = std::snprintf(__out, __size, __fmt, __prec, __v); ++ else ++ __ret = std::snprintf(__out, __size, __fmt, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ std::setlocale(LC_ALL, __sav); ++ delete [] __sav; ++#endif ++ return __ret; ++ } ++} ++ ++#endif +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-3.4.0/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,306 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // wcsnrtombs is *very* fast but stops if encounters NUL characters: ++ // in case we fall back to wcrtomb and then continue, in a loop. ++ // NB: wcsnrtombs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0', ++ __from_end - __from_next); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ const size_t __conv = wcsnrtombs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // wcrtomb. ++ for (; __from < __from_next; ++__from) ++ __to_next += wcrtomb(__to_next, *__from, &__tmp_state); ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ extern_type __buf[MB_LEN_MAX]; ++ __tmp_state = __state; ++ const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state); ++ if (__conv > static_cast<size_t>(__to_end - __to_next)) ++ __ret = partial; ++ else ++ { ++ memcpy(__to_next, __buf, __conv); ++ __state = __tmp_state; ++ __to_next += __conv; ++ ++__from_next; ++ } ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we store a L'\0' and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from_next, '\0', ++ __from_end ++ - __from_next)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ size_t __conv = mbsnrtowcs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (;; ++__to_next, __from += __conv) ++ { ++ __conv = mbrtowc(__to_next, __from, __from_end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __from_next = __from; ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ // It is unclear what to return in this case (see DR 382). ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ if (__to_next < __to_end) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from_next; ++ *__to_next++ = L'\0'; ++ } ++ else ++ __ret = partial; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_encoding() const throw() ++ { ++ // XXX This implementation assumes that the encoding is ++ // stateless and is either single-byte or variable-width. ++ int __ret = 0; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ if (MB_CUR_MAX == 1) ++ __ret = 1; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_max_length() const throw() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ // XXX Probably wrong for stateful encodings. ++ int __ret = MB_CUR_MAX; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_length(state_type& __state, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { ++ int __ret = 0; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we advance past it and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ ++ // A dummy internal buffer is needed in order for mbsnrtocws to consider ++ // its fourth parameter (it wouldn't with NULL as first parameter). ++ wchar_t* __to = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from, '\0', ++ __end ++ - __from)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __end; ++ ++ const extern_type* __tmp_from = __from; ++ size_t __conv = mbsnrtowcs(__to, &__from, ++ __from_chunk_end - __from, ++ __max, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (__from = __tmp_from;; __from += __conv) ++ { ++ __conv = mbrtowc(NULL, __from, __end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __state = __tmp_state; ++ __ret += __from - __tmp_from; ++ break; ++ } ++ if (!__from) ++ __from = __from_chunk_end; ++ ++ __ret += __from - __tmp_from; ++ __max -= __conv; ++ ++ if (__from < __end && __max) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from; ++ ++__ret; ++ --__max; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++#endif ++} +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-3.4.0/libstdc++-v3/config/locale/uclibc/collate_members.cc +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/collate_members.cc 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate<char>::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<char>::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ int ++ collate<wchar_t>::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-3.4.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,300 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype<char> specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname<char>::ctype_byname(const char* __s, size_t __refs) ++ : ctype<char>(0, false, __refs) ++ { ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ _S_destroy_c_locale(_M_c_locale_ctype); ++ _S_create_c_locale(_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_toupper = _M_c_locale_ctype->__ctype_toupper; ++ _M_tolower = _M_c_locale_ctype->__ctype_tolower; ++ _M_table = _M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ ctype<wchar_t>::__wmask_type ++ ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = 0; ++ } ++ return __ret; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype<wchar_t>:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__m & _M_bit[__bitcur] ++ && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ { ++ __ret = true; ++ break; ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (; __lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ __m |= _M_bit[__bitcur]; ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype<wchar_t>:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<wchar_t>:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast<unsigned char>(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype<wchar_t>:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++ if (__wc >= 0 && __wc < 128 && _M_narrow_ok) ++ return _M_narrow[__wc]; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ const int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ if (_M_narrow_ok) ++ while (__lo < __hi) ++ { ++ if (*__lo >= 0 && *__lo < 128) ++ *__dest = _M_narrow[*__lo]; ++ else ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype<wchar_t>::_M_initialize_ctype() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wint_t __i; ++ for (__i = 0; __i < 128; ++__i) ++ { ++ const int __c = wctob(__i); ++ if (__c == EOF) ++ break; ++ else ++ _M_narrow[__i] = static_cast<char>(__c); ++ } ++ if (__i == 128) ++ _M_narrow_ok = true; ++ else ++ _M_narrow_ok = false; ++ for (size_t __i = 0; ++ __i < sizeof(_M_widen) / sizeof(wint_t); ++__i) ++ _M_widen[__i] = btowc(__i); ++ ++ for (size_t __i = 0; __i <= 11; ++__i) ++ { ++ _M_bit[__i] = static_cast<mask>(_ISbit(__i)); ++ _M_wmask[__i] = _M_convert_to_wmask(_M_bit[__i]); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++#endif // _GLIBCXX_USE_WCHAR_T ++} +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-3.4.0/libstdc++-v3/config/locale/uclibc/messages_members.cc +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/messages_members.cc 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages<char>::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast<const char*>(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ wstring ++ messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++# elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-3.4.0/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/messages_members.h 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,109 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs) ++ { ++ _M_c_locale_messages = _S_get_c_locale(); ++ } ++ ++ template<typename _CharT> ++ messages<_CharT>::messages(__c_locale __cloc, ++ const char* __s __attribute__ ((__unused__)), ++ size_t __refs) ++ : facet(__refs) ++ { ++ _M_c_locale_messages = _S_clone_c_locale(__cloc); ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::~messages() ++ { ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string<char>& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template<typename _CharT> ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template<typename _CharT> ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ _S_destroy_c_locale(this->_M_c_locale_messages); ++ _S_create_c_locale(this->_M_c_locale_messages, __s); ++ } ++ } +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-3.4.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,698 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ __ret.field[0] = sign; ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[2] = space; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[1] = space; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ else ++ { ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ default: ++ ; ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == true ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == false ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct<char, true>::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct<char, false>::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ { ++ uc = static_cast<unsigned char>(money_base::_S_atoms[__i]); ++ _M_data->_M_atoms[__i] = btowc(uc); ++ } ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ { ++ uc = static_cast<unsigned char>(money_base::_S_atoms[__i]); ++ _M_data->_M_atoms[__i] = btowc(uc); ++ } ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct<wchar_t, true>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++ ++ template<> ++ moneypunct<wchar_t, false>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++#endif ++} +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-3.4.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2004-08-12 17:15:14.000000000 -0500 +@@ -0,0 +1,181 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct<char>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; ++ ++ for (size_t __i = 0; __i < __num_base::_S_iend; ++__i) ++ _M_data->_M_atoms_in[__i] = __num_base::_S_atoms_in[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(RADIXCHAR, __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSEP, __cloc)); ++ ++ // Check for NULL, which implies no grouping. ++ if (_M_data->_M_thousands_sep == '\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = "true"; ++ _M_data->_M_truename_size = strlen(_M_data->_M_truename); ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = "false"; ++ _M_data->_M_falsename_size = strlen(_M_data->_M_falsename); ++ } ++ ++ template<> ++ numpunct<char>::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<wchar_t>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_get_c_locale()); ++#endif ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ { ++ uc = static_cast<unsigned char>(__num_base::_S_atoms_out[__i]); ++ _M_data->_M_atoms_out[__i] = btowc(uc); ++ } ++ ++ for (size_t __i = 0; __i < __num_base::_S_iend; ++__i) ++ { ++ uc = static_cast<unsigned char>(__num_base::_S_atoms_in[__i]); ++ _M_data->_M_atoms_in[__i] = btowc(uc); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); ++#endif ++ ++ if (_M_data->_M_thousands_sep == L'\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = L"true"; ++ _M_data->_M_truename_size = wcslen(_M_data->_M_truename); ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = L"false"; ++ _M_data->_M_falsename_size = wcslen(_M_data->_M_falsename); ++ } ++ ++ template<> ++ numpunct<wchar_t>::~numpunct() ++ { delete _M_data; } ++ #endif ++} +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-3.4.0/libstdc++-v3/config/locale/uclibc/time_members.cc +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/time_members.cc 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,347 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct<char>:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __strftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = "%m/%d/%y"; ++ _M_data->_M_date_era_format = "%m/%d/%y"; ++ _M_data->_M_time_format = "%H:%M:%S"; ++ _M_data->_M_time_era_format = "%H:%M:%S"; ++ _M_data->_M_date_time_format = ""; ++ _M_data->_M_date_time_era_format = ""; ++ _M_data->_M_am = "AM"; ++ _M_data->_M_pm = "PM"; ++ _M_data->_M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = "Sunday"; ++ _M_data->_M_day2 = "Monday"; ++ _M_data->_M_day3 = "Tuesday"; ++ _M_data->_M_day4 = "Wednesday"; ++ _M_data->_M_day5 = "Thursday"; ++ _M_data->_M_day6 = "Friday"; ++ _M_data->_M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = "Sun"; ++ _M_data->_M_aday2 = "Mon"; ++ _M_data->_M_aday3 = "Tue"; ++ _M_data->_M_aday4 = "Wed"; ++ _M_data->_M_aday5 = "Thu"; ++ _M_data->_M_aday6 = "Fri"; ++ _M_data->_M_aday7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = "January"; ++ _M_data->_M_month02 = "February"; ++ _M_data->_M_month03 = "March"; ++ _M_data->_M_month04 = "April"; ++ _M_data->_M_month05 = "May"; ++ _M_data->_M_month06 = "June"; ++ _M_data->_M_month07 = "July"; ++ _M_data->_M_month08 = "August"; ++ _M_data->_M_month09 = "September"; ++ _M_data->_M_month10 = "October"; ++ _M_data->_M_month11 = "November"; ++ _M_data->_M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = "Jan"; ++ _M_data->_M_amonth02 = "Feb"; ++ _M_data->_M_amonth03 = "Mar"; ++ _M_data->_M_amonth04 = "Apr"; ++ _M_data->_M_amonth05 = "May"; ++ _M_data->_M_amonth06 = "Jun"; ++ _M_data->_M_amonth07 = "July"; ++ _M_data->_M_amonth08 = "Aug"; ++ _M_data->_M_amonth09 = "Sep"; ++ _M_data->_M_amonth10 = "Oct"; ++ _M_data->_M_amonth11 = "Nov"; ++ _M_data->_M_amonth12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc); ++ _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ __timepunct<wchar_t>:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<wchar_t>; ++ ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = L"%m/%d/%y"; ++ _M_data->_M_date_era_format = L"%m/%d/%y"; ++ _M_data->_M_time_format = L"%H:%M:%S"; ++ _M_data->_M_time_era_format = L"%H:%M:%S"; ++ _M_data->_M_date_time_format = L""; ++ _M_data->_M_date_time_era_format = L""; ++ _M_data->_M_am = L"AM"; ++ _M_data->_M_pm = L"PM"; ++ _M_data->_M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = L"Sunday"; ++ _M_data->_M_day2 = L"Monday"; ++ _M_data->_M_day3 = L"Tuesday"; ++ _M_data->_M_day4 = L"Wednesday"; ++ _M_data->_M_day5 = L"Thursday"; ++ _M_data->_M_day6 = L"Friday"; ++ _M_data->_M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = L"Sun"; ++ _M_data->_M_aday2 = L"Mon"; ++ _M_data->_M_aday3 = L"Tue"; ++ _M_data->_M_aday4 = L"Wed"; ++ _M_data->_M_aday5 = L"Thu"; ++ _M_data->_M_aday6 = L"Fri"; ++ _M_data->_M_aday7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = L"January"; ++ _M_data->_M_month02 = L"February"; ++ _M_data->_M_month03 = L"March"; ++ _M_data->_M_month04 = L"April"; ++ _M_data->_M_month05 = L"May"; ++ _M_data->_M_month06 = L"June"; ++ _M_data->_M_month07 = L"July"; ++ _M_data->_M_month08 = L"August"; ++ _M_data->_M_month09 = L"September"; ++ _M_data->_M_month10 = L"October"; ++ _M_data->_M_month11 = L"November"; ++ _M_data->_M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = L"Jan"; ++ _M_data->_M_amonth02 = L"Feb"; ++ _M_data->_M_amonth03 = L"Mar"; ++ _M_data->_M_amonth04 = L"Apr"; ++ _M_data->_M_amonth05 = L"May"; ++ _M_data->_M_amonth06 = L"Jun"; ++ _M_data->_M_amonth07 = L"July"; ++ _M_data->_M_amonth08 = L"Aug"; ++ _M_data->_M_amonth09 = L"Sep"; ++ _M_data->_M_amonth10 = L"Oct"; ++ _M_data->_M_amonth11 = L"Nov"; ++ _M_data->_M_amonth12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_FMT, __cloc)); ++ _M_data->_M_date_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc)); ++ _M_data->_M_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT, __cloc)); ++ _M_data->_M_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc)); ++ _M_data->_M_date_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_T_FMT, __cloc)); ++ _M_data->_M_date_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc)); ++ _M_data->_M_am = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WAM_STR, __cloc)); ++ _M_data->_M_pm = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WPM_STR, __cloc)); ++ _M_data->_M_am_pm_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc)); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_1, __cloc)); ++ _M_data->_M_day2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_2, __cloc)); ++ _M_data->_M_day3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_3, __cloc)); ++ _M_data->_M_day4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_4, __cloc)); ++ _M_data->_M_day5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_5, __cloc)); ++ _M_data->_M_day6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_6, __cloc)); ++ _M_data->_M_day7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_7, __cloc)); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_1, __cloc)); ++ _M_data->_M_aday2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_2, __cloc)); ++ _M_data->_M_aday3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_3, __cloc)); ++ _M_data->_M_aday4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_4, __cloc)); ++ _M_data->_M_aday5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_5, __cloc)); ++ _M_data->_M_aday6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_6, __cloc)); ++ _M_data->_M_aday7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_7, __cloc)); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_1, __cloc)); ++ _M_data->_M_month02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_2, __cloc)); ++ _M_data->_M_month03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_3, __cloc)); ++ _M_data->_M_month04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_4, __cloc)); ++ _M_data->_M_month05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_5, __cloc)); ++ _M_data->_M_month06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_6, __cloc)); ++ _M_data->_M_month07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_7, __cloc)); ++ _M_data->_M_month08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_8, __cloc)); ++ _M_data->_M_month09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_9, __cloc)); ++ _M_data->_M_month10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_10, __cloc)); ++ _M_data->_M_month11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_11, __cloc)); ++ _M_data->_M_month12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_12, __cloc)); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_1, __cloc)); ++ _M_data->_M_amonth02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_2, __cloc)); ++ _M_data->_M_amonth03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_3, __cloc)); ++ _M_data->_M_amonth04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_4, __cloc)); ++ _M_data->_M_amonth05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_5, __cloc)); ++ _M_data->_M_amonth06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_6, __cloc)); ++ _M_data->_M_amonth07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_7, __cloc)); ++ _M_data->_M_amonth08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_8, __cloc)); ++ _M_data->_M_amonth09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_9, __cloc)); ++ _M_data->_M_amonth10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_10, __cloc)); ++ _M_data->_M_amonth11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_11, __cloc)); ++ _M_data->_M_amonth12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_12, __cloc)); ++ } ++#endif // 0 ++ } ++#endif ++} +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/time_members.h gcc-3.4.0/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-3.4.0-dist/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/locale/uclibc/time_members.h 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,80 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : facet(__refs), _M_data(NULL) ++ { ++#if !(__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)) ++ _M_name_timepunct = _S_get_c_name(); ++#endif ++ _M_initialize_timepunct(); ++ } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) ++ : facet(__refs), _M_data(__cache) ++ { ++#if !(__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)) ++ _M_name_timepunct = _S_get_c_name(); ++#endif ++ _M_initialize_timepunct(); ++ } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, ++ const char* __s __attribute__ ((__unused__)), ++ size_t __refs) ++ : facet(__refs), _M_data(NULL) ++ { ++#if !(__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)) ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_timepunct = __tmp; ++#endif ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::~__timepunct() ++ { ++#if !(__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)) ++ if (_M_name_timepunct != _S_get_c_name()) ++ delete [] _M_name_timepunct; ++#endif ++ delete _M_data; ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-3.4.0/libstdc++-v3/config/os/uclibc/ctype_base.h +--- gcc-3.4.0-dist/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/os/uclibc/ctype_base.h 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,58 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ ++ // NB: Offsets into ctype<char>::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISalpha | _ISdigit | _ISpunct; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalpha | _ISdigit; ++ }; +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-3.4.0/libstdc++-v3/config/os/uclibc/ctype_inline.h +--- gcc-3.4.0-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/os/uclibc/ctype_inline.h 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype<char>:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast<unsigned char>(__c)] & __m; } ++ ++ const char* ++ ctype<char>:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast<unsigned char>(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-3.4.0/libstdc++-v3/config/os/uclibc/ctype_noninline.h +--- gcc-3.4.0-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,96 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype<char>::classic_table() throw() ++ { return __C_ctype_b; } ++ ++ ctype<char>::ctype(__c_locale __cloc, const mask* __table, bool __del, ++ size_t __refs) ++ : facet(__refs), _M_del(__table != 0 && __del) ++ { ++ _M_c_locale_ctype = _S_clone_c_locale(__cloc); ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ _M_widen_ok = 0; ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ _M_narrow_ok = 0; ++ } ++ ++ ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) ++ : facet(__refs), _M_del(__table != 0 && __del) ++ { ++ _M_c_locale_ctype = _S_get_c_locale(); ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ _M_widen_ok = 0; ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ _M_narrow_ok = 0; ++ } ++ ++ char ++ ctype<char>::do_toupper(char __c) const ++ { return _M_toupper[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype<char>::do_tolower(char __c) const ++ { return _M_tolower[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +diff -urN gcc-3.4.0-dist/libstdc++-v3/config/os/uclibc/os_defines.h gcc-3.4.0/libstdc++-v3/config/os/uclibc/os_defines.h +--- gcc-3.4.0-dist/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/config/os/uclibc/os_defines.h 2004-08-12 17:08:19.000000000 -0500 +@@ -0,0 +1,44 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCXX_OS_DEFINES ++#define _GLIBCXX_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include <features.h> ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif +diff -urN gcc-3.4.0-dist/libstdc++-v3/configure gcc-3.4.0/libstdc++-v3/configure +--- gcc-3.4.0-dist/libstdc++-v3/configure 2004-03-18 11:35:25.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/configure 2004-08-12 17:08:58.000000000 -0500 +@@ -3878,6 +3878,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5545,6 +5550,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + cat >conftest.$ac_ext <<_ACEOF + #line $LINENO "configure" +@@ -5759,6 +5767,77 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ echo "$as_me:$LINENO: result: uclibc" >&5 ++echo "${ECHO_T}uclibc" >&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_check_msgfmt+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_check_msgfmt="yes" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt=$ac_cv_prog_check_msgfmt ++if test -n "$check_msgfmt"; then ++ echo "$as_me:$LINENO: result: $check_msgfmt" >&5 ++echo "${ECHO_T}$check_msgfmt" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.0-dist/libstdc++-v3/configure.host gcc-3.4.0/libstdc++-v3/configure.host +--- gcc-3.4.0-dist/libstdc++-v3/configure.host 2004-03-18 11:36:12.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/configure.host 2004-08-12 17:08:19.000000000 -0500 +@@ -217,6 +217,12 @@ + ;; + esac + ++# Override for uClibc since linux-uclibc gets mishandled above. ++case "${host_os}" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; ++esac + + # Set any OS-dependent and CPU-dependent bits. + # THIS TABLE IS SORTED. KEEP IT THAT WAY. +diff -urN gcc-3.4.0-dist/libstdc++-v3/crossconfig.m4 gcc-3.4.0/libstdc++-v3/crossconfig.m4 +--- gcc-3.4.0-dist/libstdc++-v3/crossconfig.m4 2004-02-09 01:17:55.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/crossconfig.m4 2004-08-12 17:08:19.000000000 -0500 +@@ -122,6 +122,99 @@ + ;; + esac + ;; ++ *-uclibc*) ++# Temporary hack until we implement the float versions of the libm funcs ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h float.h endian.h inttypes.h locale.h float.h stdint.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCXX_CHECK_LINKER_FEATURES ++ GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCXX_CHECK_WCHAR_T_SUPPORT ++ ++ # For LFS. ++ AC_DEFINE(HAVE_INT64_T) ++ case "$target" in ++ *-uclinux*) ++ # Don't enable LFS with uClinux ++ ;; ++ *) ++ AC_DEFINE(_GLIBCXX_USE_LFS) ++ esac ++ ++ # For showmanyc_helper(). ++ AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h) ++ GLIBCXX_CHECK_POLL ++ GLIBCXX_CHECK_S_ISREG_OR_S_IFREG ++ ++ # For xsputn_2(). ++ AC_CHECK_HEADERS(sys/uio.h) ++ GLIBCXX_CHECK_WRITEV ++ ++# AC_DEFINE(HAVE_ACOSF) ++# AC_DEFINE(HAVE_ASINF) ++# AC_DEFINE(HAVE_ATANF) ++# AC_DEFINE(HAVE_ATAN2F) ++ AC_DEFINE(HAVE_CEILF) ++ AC_DEFINE(HAVE_COPYSIGN) ++# AC_DEFINE(HAVE_COPYSIGNF) ++# AC_DEFINE(HAVE_COSF) ++# AC_DEFINE(HAVE_COSHF) ++# AC_DEFINE(HAVE_EXPF) ++# AC_DEFINE(HAVE_FABSF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ AC_DEFINE(HAVE_FLOORF) ++# AC_DEFINE(HAVE_FMODF) ++# AC_DEFINE(HAVE_FREXPF) ++ AC_DEFINE(HAVE_HYPOT) ++# AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++# AC_DEFINE(HAVE_LOGF) ++# AC_DEFINE(HAVE_LOG10F) ++# AC_DEFINE(HAVE_MODFF) ++# AC_DEFINE(HAVE_SINF) ++# AC_DEFINE(HAVE_SINHF) ++# AC_DEFINE(HAVE_SINCOS) ++# AC_DEFINE(HAVE_SINCOSF) ++ AC_DEFINE(HAVE_SQRTF) ++# AC_DEFINE(HAVE_TANF) ++# AC_DEFINE(HAVE_TANHF) ++ if test x"long_double_math_on_this_cpu" = x"yes"; then ++ AC_MSG_ERROR([long_double_math_on_this_cpu is yes!]) ++# AC_DEFINE(HAVE_ACOSL) ++# AC_DEFINE(HAVE_ASINL) ++# AC_DEFINE(HAVE_ATANL) ++# AC_DEFINE(HAVE_ATAN2L) ++# AC_DEFINE(HAVE_CEILL) ++# AC_DEFINE(HAVE_COPYSIGNL) ++# AC_DEFINE(HAVE_COSL) ++# AC_DEFINE(HAVE_COSHL) ++# AC_DEFINE(HAVE_EXPL) ++# AC_DEFINE(HAVE_FABSL) ++# AC_DEFINE(HAVE_FINITEL) ++# AC_DEFINE(HAVE_FLOORL) ++# AC_DEFINE(HAVE_FMODL) ++# AC_DEFINE(HAVE_FREXPL) ++# AC_DEFINE(HAVE_HYPOTL) ++# AC_DEFINE(HAVE_ISINFL) ++# AC_DEFINE(HAVE_ISNANL) ++# AC_DEFINE(HAVE_LOGL) ++# AC_DEFINE(HAVE_LOG10L) ++# AC_DEFINE(HAVE_MODFL) ++# AC_DEFINE(HAVE_POWL) ++# AC_DEFINE(HAVE_SINL) ++# AC_DEFINE(HAVE_SINHL) ++# AC_DEFINE(HAVE_SINCOSL) ++# AC_DEFINE(HAVE_SQRTL) ++# AC_DEFINE(HAVE_TANL) ++# AC_DEFINE(HAVE_TANHL) ++ fi ++ ;; + *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu) + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ + machine/endian.h machine/param.h sys/machine.h sys/types.h \ +@@ -136,7 +229,7 @@ + AC_DEFINE(HAVE_INT64_T) + case "$target" in + *-uclinux*) +- # Don't enable LFS with uClibc ++ # Don't enable LFS with uClinux + ;; + *) + AC_DEFINE(_GLIBCXX_USE_LFS) +diff -urN gcc-3.4.0-dist/libstdc++-v3/include/c_compatibility/wchar.h gcc-3.4.0/libstdc++-v3/include/c_compatibility/wchar.h +--- gcc-3.4.0-dist/libstdc++-v3/include/c_compatibility/wchar.h 2003-12-08 21:51:45.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/include/c_compatibility/wchar.h 2004-08-12 17:14:36.000000000 -0500 +@@ -101,7 +101,9 @@ + using std::wmemcpy; + using std::wmemmove; + using std::wmemset; ++#if __GLIBCXX_HAVE_WCSFTIME + using std::wcsftime; ++#endif + + #if _GLIBCXX_USE_C99 + using std::wcstold; +diff -urN gcc-3.4.0-dist/libstdc++-v3/include/c_std/std_cwchar.h gcc-3.4.0/libstdc++-v3/include/c_std/std_cwchar.h +--- gcc-3.4.0-dist/libstdc++-v3/include/c_std/std_cwchar.h 2003-12-08 21:44:35.000000000 -0600 ++++ gcc-3.4.0/libstdc++-v3/include/c_std/std_cwchar.h 2004-08-12 17:08:19.000000000 -0500 +@@ -179,7 +179,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#if _GLIBCXX_HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; diff --git a/openwrt/toolchain/gcc/3.4.0/arm-softfloat.patch.conditional b/openwrt/toolchain/gcc/3.4.0/arm-softfloat.patch.conditional new file mode 100644 index 0000000000..f53d64b374 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.0/arm-softfloat.patch.conditional @@ -0,0 +1,256 @@ +# +# Submitted: +# +# Dimitry Andric <dimitry@andric.com>, 2004-05-01 +# +# Description: +# +# Nicholas Pitre released this patch for gcc soft-float support here: +# http://lists.arm.linux.org.uk/pipermail/linux-arm/2003-October/006436.html +# +# This version has been adapted to work with gcc 3.4.0. +# +# The original patch doesn't distinguish between softfpa and softvfp modes +# in the way Nicholas Pitre probably meant. His description is: +# +# "Default is to use APCS-32 mode with soft-vfp. The old Linux default for +# floats can be achieved with -mhard-float or with the configure +# --with-float=hard option. If -msoft-float or --with-float=soft is used then +# software float support will be used just like the default but with the legacy +# big endian word ordering for double float representation instead." +# +# Which means the following: +# +# * If you compile without -mhard-float or -msoft-float, you should get +# software floating point, using the VFP format. The produced object file +# should have these flags in its header: +# +# private flags = 600: [APCS-32] [VFP float format] [software FP] +# +# * If you compile with -mhard-float, you should get hardware floating point, +# which always uses the FPA format. Object file header flags should be: +# +# private flags = 0: [APCS-32] [FPA float format] +# +# * If you compile with -msoft-float, you should get software floating point, +# using the FPA format. This is done for compatibility reasons with many +# existing distributions. Object file header flags should be: +# +# private flags = 200: [APCS-32] [FPA float format] [software FP] +# +# The original patch from Nicholas Pitre contained the following constructs: +# +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +# %{mhard-float:-mfpu=fpa} \ +# %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" +# +# However, gcc doesn't accept this ";:" notation, used in the 3rd line. This +# is probably the reason Robert Schwebel modified it to: +# +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +# %{mhard-float:-mfpu=fpa} \ +# %{!mhard-float: %{msoft-float:-mfpu=softfpa -mfpu=softvfp}}" +# +# But this causes the following behaviour: +# +# * If you compile without -mhard-float or -msoft-float, the compiler generates +# software floating point instructions, but *nothing* is passed to the +# assembler, which results in an object file which has flags: +# +# private flags = 0: [APCS-32] [FPA float format] +# +# This is not correct! +# +# * If you compile with -mhard-float, the compiler generates hardware floating +# point instructions, and passes "-mfpu=fpa" to the assembler, which results +# in an object file which has the same flags as in the previous item, but now +# those *are* correct. +# +# * If you compile with -msoft-float, the compiler generates software floating +# point instructions, and passes "-mfpu=softfpa -mfpu=softvfp" (in that +# order) to the assembler, which results in an object file with flags: +# +# private flags = 600: [APCS-32] [VFP float format] [software FP] +# +# This is not correct, because the last "-mfpu=" option on the assembler +# command line determines the actual FPU convention used (which should be FPA +# in this case). +# +# Therefore, I modified this patch to get the desired behaviour. Every +# instance of the notation: +# +# %{msoft-float:-mfpu=softfpa -mfpu=softvfp} +# +# was changed to: +# +# %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp} +# +# I also did the following: +# +# * Modified all TARGET_DEFAULT macros I could find to include ARM_FLAG_VFP, to +# be consistent with Nicholas' original patch. +# * Removed any "msoft-float" or "mhard-float" from all MULTILIB_DEFAULTS +# macros I could find. I think that if you compile without any options, you +# would like to get the defaults. :) +# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed +# anymore. (The required functions are now in libgcc.) + +diff -urNd gcc-3.4.0-orig/gcc/config/arm/coff.h gcc-3.4.0/gcc/config/arm/coff.h +--- gcc-3.4.0-orig/gcc/config/arm/coff.h 2004-02-24 15:25:22.000000000 +0100 ++++ gcc-3.4.0/gcc/config/arm/coff.h 2004-05-01 19:07:06.059409600 +0200 +@@ -31,11 +31,16 @@ + #define TARGET_VERSION fputs (" (ARM/coff)", stderr) + + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" } + #endif + + /* This is COFF, but prefer stabs. */ +diff -urNd gcc-3.4.0-orig/gcc/config/arm/elf.h gcc-3.4.0/gcc/config/arm/elf.h +--- gcc-3.4.0-orig/gcc/config/arm/elf.h 2004-02-24 15:25:22.000000000 +0100 ++++ gcc-3.4.0/gcc/config/arm/elf.h 2004-05-01 19:12:16.976486400 +0200 +@@ -46,7 +46,9 @@ + + #ifndef SUBTARGET_ASM_FLOAT_SPEC + #define SUBTARGET_ASM_FLOAT_SPEC "\ +-%{mapcs-float:-mfloat} %{msoft-float:-mfpu=softfpa}" ++%{mapcs-float:-mfloat} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + #endif + + #ifndef ASM_SPEC +@@ -106,12 +108,17 @@ + #endif + + #ifndef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + #endif + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } + #endif + + #define TARGET_ASM_FILE_START_APP_OFF true +diff -urNd gcc-3.4.0-orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h +--- gcc-3.4.0-orig/gcc/config/arm/linux-elf.h 2004-01-31 07:18:11.000000000 +0100 ++++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-05-01 19:19:06.935979200 +0200 +@@ -30,9 +30,27 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + +-/* Default is to use APCS-32 mode. */ ++/* ++ * Default is to use APCS-32 mode with soft-vfp. ++ * The old Linux default for floats can be achieved with -mhard-float ++ * or with the configure --with-float=hard option. ++ * If -msoft-float or --with-float=soft is used then software float ++ * support will be used just like the default but with the legacy ++ * big endian word ordering for double float representation instead. ++ */ ++ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_MMU_TRAPS ) ++ ++#undef SUBTARGET_EXTRA_ASM_SPEC ++#define SUBTARGET_EXTRA_ASM_SPEC "\ ++%{!mcpu=*:-mcpu=xscale} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +@@ -40,7 +58,7 @@ + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -55,7 +73,7 @@ + %{shared:-lc} \ + %{!shared:%{profile:-lc_p}%{!profile:-lc}}" + +-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc" ++#define LIBGCC_SPEC "-lgcc" + + /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add + the GNU/Linux magical crtbegin.o file (see crtstuff.c) which +diff -urNd gcc-3.4.0-orig/gcc/config/arm/t-linux gcc-3.4.0/gcc/config/arm/t-linux +--- gcc-3.4.0-orig/gcc/config/arm/t-linux 2003-09-20 23:09:07.000000000 +0200 ++++ gcc-3.4.0/gcc/config/arm/t-linux 2004-05-01 20:31:59.102846400 +0200 +@@ -4,7 +4,10 @@ + LIBGCC2_DEBUG_CFLAGS = -g0 + + LIB1ASMSRC = arm/lib1funcs.asm +-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx ++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ ++ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ ++ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ ++ _fixsfsi _fixunssfsi + + # MULTILIB_OPTIONS = mhard-float/msoft-float + # MULTILIB_DIRNAMES = hard-float soft-float +diff -urNd gcc-3.4.0-orig/gcc/config/arm/unknown-elf.h gcc-3.4.0/gcc/config/arm/unknown-elf.h +--- gcc-3.4.0-orig/gcc/config/arm/unknown-elf.h 2004-02-24 15:25:22.000000000 +0100 ++++ gcc-3.4.0/gcc/config/arm/unknown-elf.h 2004-05-01 19:09:09.016212800 +0200 +@@ -30,7 +30,12 @@ + + /* Default to using APCS-32 and software floating point. */ + #ifndef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + #endif + + /* Now we define the strings used to build the spec file. */ +diff -urNd gcc-3.4.0-orig/gcc/config/arm/xscale-elf.h gcc-3.4.0/gcc/config/arm/xscale-elf.h +--- gcc-3.4.0-orig/gcc/config/arm/xscale-elf.h 2003-07-02 01:26:43.000000000 +0200 ++++ gcc-3.4.0/gcc/config/arm/xscale-elf.h 2004-05-01 20:15:36.620105600 +0200 +@@ -49,11 +49,12 @@ + endian, regardless of the endian-ness of the memory + system. */ + +-#define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +- %{mhard-float:-mfpu=fpa} \ +- %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" ++#define SUBTARGET_EXTRA_ASM_SPEC "\ ++%{!mcpu=*:-mcpu=xscale} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "mlittle-endian", "mno-thumb-interwork", "marm", "msoft-float" } ++ { "mlittle-endian", "mno-thumb-interwork", "marm" } + #endif diff --git a/openwrt/toolchain/gcc/3.4.1/100-uclibc-conf.patch b/openwrt/toolchain/gcc/3.4.1/100-uclibc-conf.patch new file mode 100644 index 0000000000..28449e7c82 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.1/100-uclibc-conf.patch @@ -0,0 +1,442 @@ +diff -urN gcc-3.4.1-dist/boehm-gc/configure gcc-3.4.1/boehm-gc/configure +--- gcc-3.4.1-dist/boehm-gc/configure 2004-07-01 14:14:03.000000000 -0500 ++++ gcc-3.4.1/boehm-gc/configure 2004-08-12 16:22:57.000000000 -0500 +@@ -1947,6 +1947,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN gcc-3.4.1-dist/boehm-gc/ltconfig gcc-3.4.1/boehm-gc/ltconfig +--- gcc-3.4.1-dist/boehm-gc/ltconfig 2002-11-20 09:59:06.000000000 -0600 ++++ gcc-3.4.1/boehm-gc/ltconfig 2004-08-12 15:54:42.000000000 -0500 +@@ -1981,6 +1981,23 @@ + fi + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ++ file_magic_cmd=/usr/bin/file ++ file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + version_type=sunos + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then +diff -urN gcc-3.4.1-dist/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-01-31 00:18:11.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-12 15:54:42.000000000 -0500 +@@ -81,6 +81,18 @@ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC "%{h*} %{version:-v} \ ++ %{b} %{Wl,*:%*} \ ++ %{static:-Bstatic} \ ++ %{shared:-shared} \ ++ %{symbolic:-Bsymbolic} \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ ++ -X \ ++ %{mbig-endian:-EB}" \ ++ SUBTARGET_EXTRA_LINK_SPEC ++#else + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ +@@ -91,6 +103,7 @@ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC ++#endif + + #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS() + +diff -urN gcc-3.4.1-dist/gcc/config/cris/linux.h gcc-3.4.1/gcc/config/cris/linux.h +--- gcc-3.4.1-dist/gcc/config/cris/linux.h 2003-11-28 21:08:09.000000000 -0600 ++++ gcc-3.4.1/gcc/config/cris/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -79,6 +79,25 @@ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -93,6 +112,8 @@ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +diff -urN gcc-3.4.1-dist/gcc/config/cris/t-linux-uclibc gcc-3.4.1/gcc/config/cris/t-linux-uclibc +--- gcc-3.4.1-dist/gcc/config/cris/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/cris/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,3 @@ ++T_CFLAGS = -DUSE_UCLIBC ++TARGET_LIBGCC2_CFLAGS += -fPIC ++CRTSTUFF_T_CFLAGS_S = $(TARGET_LIBGCC2_CFLAGS) +diff -urN gcc-3.4.1-dist/gcc/config/i386/linux.h gcc-3.4.1/gcc/config/i386/linux.h +--- gcc-3.4.1-dist/gcc/config/i386/linux.h 2003-11-28 21:08:10.000000000 -0600 ++++ gcc-3.4.1/gcc/config/i386/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -118,6 +118,15 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.1}} \ + %{static:-static}}}" + #else ++#if defined USE_UCLIBC ++#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ +@@ -126,6 +135,7 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}}}" + #endif ++#endif + + /* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named +diff -urN gcc-3.4.1-dist/gcc/config/mips/linux.h gcc-3.4.1/gcc/config/mips/linux.h +--- gcc-3.4.1-dist/gcc/config/mips/linux.h 2004-06-15 20:42:24.000000000 -0500 ++++ gcc-3.4.1/gcc/config/mips/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -109,6 +109,17 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC \ ++ "%(endian_spec) \ ++ %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ +@@ -118,6 +129,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ + %{static:-static}}}" ++#endif + + #undef SUBTARGET_ASM_SPEC + #define SUBTARGET_ASM_SPEC "\ +diff -urN gcc-3.4.1-dist/gcc/config/rs6000/linux.h gcc-3.4.1/gcc/config/rs6000/linux.h +--- gcc-3.4.1-dist/gcc/config/rs6000/linux.h 2004-02-25 09:11:19.000000000 -0600 ++++ gcc-3.4.1/gcc/config/rs6000/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -61,7 +61,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #define LINK_GCC_C_SEQUENCE_SPEC \ + "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" +diff -urN gcc-3.4.1-dist/gcc/config/rs6000/sysv4.h gcc-3.4.1/gcc/config/rs6000/sysv4.h +--- gcc-3.4.1-dist/gcc/config/rs6000/sysv4.h 2004-06-10 01:39:50.000000000 -0500 ++++ gcc-3.4.1/gcc/config/rs6000/sysv4.h 2004-08-12 15:54:43.000000000 -0500 +@@ -947,6 +947,7 @@ + mcall-linux : %(link_os_linux) ; \ + mcall-gnu : %(link_os_gnu) ; \ + mcall-netbsd : %(link_os_netbsd) ; \ ++ mcall-linux-uclibc : %(link_os_linux_uclibc); \ + mcall-openbsd: %(link_os_openbsd) ; \ + : %(link_os_default) }" + +@@ -1124,6 +1125,10 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}" + ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + #if defined(HAVE_LD_EH_FRAME_HDR) + # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " + #endif +@@ -1290,6 +1295,7 @@ + { "link_os_sim", LINK_OS_SIM_SPEC }, \ + { "link_os_freebsd", LINK_OS_FREEBSD_SPEC }, \ + { "link_os_linux", LINK_OS_LINUX_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_gnu", LINK_OS_GNU_SPEC }, \ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_openbsd", LINK_OS_OPENBSD_SPEC }, \ +diff -urN gcc-3.4.1-dist/gcc/config/sh/linux.h gcc-3.4.1/gcc/config/sh/linux.h +--- gcc-3.4.1-dist/gcc/config/sh/linux.h 2004-01-11 20:29:13.000000000 -0600 ++++ gcc-3.4.1/gcc/config/sh/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -73,12 +73,21 @@ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define SUBTARGET_LINK_SPEC \ ++ "%{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}" ++#else + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}" ++#endif + + #undef LIB_SPEC + #define LIB_SPEC \ +diff -urN gcc-3.4.1-dist/gcc/config/sh/t-linux-uclibc gcc-3.4.1/gcc/config/sh/t-linux-uclibc +--- gcc-3.4.1-dist/gcc/config/sh/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/sh/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,13 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++TARGET_LIBGCC2_CFLAGS = -fpic -DNO_FPSCR_VALUES ++LIB1ASMFUNCS_CACHE = _ic_invalidate ++ ++LIB2FUNCS_EXTRA= ++ ++MULTILIB_OPTIONS= $(MULTILIB_ENDIAN) m3e/m4 ++MULTILIB_DIRNAMES= ++MULTILIB_MATCHES = ++MULTILIB_EXCEPTIONS= ++ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o +diff -urN gcc-3.4.1-dist/gcc/config/sh/t-sh64-uclibc gcc-3.4.1/gcc/config/sh/t-sh64-uclibc +--- gcc-3.4.1-dist/gcc/config/sh/t-sh64-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/sh/t-sh64-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,13 @@ ++EXTRA_MULTILIB_PARTS= crt1.o crti.o crtn.o crtbegin.o crtend.o ++ ++LIB1ASMFUNCS = \ ++ _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ ++ _shcompact_call_trampoline _shcompact_return_trampoline \ ++ _shcompact_incoming_args _ic_invalidate _nested_trampoline \ ++ _push_pop_shmedia_regs \ ++ _udivdi3 _divdi3 _umoddi3 _moddi3 ++ ++MULTILIB_OPTIONS = $(MULTILIB_ENDIAN) m5-32media-nofpu/m5-compact/m5-compact-nofpu/m5-64media/m5-64media-nofpu ++MULTILIB_DIRNAMES= $(MULTILIB_ENDIAN) nofpu compact nofpu/compact media64 nofpu/media64 ++MULTILIB_MATCHES= ++MULTILIB_EXCEPTIONS= +diff -urN gcc-3.4.1-dist/gcc/config/t-linux-uclibc gcc-3.4.1/gcc/config/t-linux-uclibc +--- gcc-3.4.1-dist/gcc/config/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,15 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Compile crtbeginS.o and crtendS.o with pic. ++CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC ++# Compile libgcc2.a with pic. ++TARGET_LIBGCC2_CFLAGS = -fPIC ++ ++# Override t-slibgcc-elf-ver to export some libgcc symbols with ++# the symbol versions that glibc used. ++SHLIB_MAPFILES += $(srcdir)/config/libgcc-glibc.ver ++ ++# Use unwind-dw2-fde ++LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ ++ $(srcdir)/unwind-sjlj.c $(srcdir)/gthr-gnat.c $(srcdir)/unwind-c.c ++LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h +diff -urN gcc-3.4.1-dist/gcc/config.gcc gcc-3.4.1/gcc/config.gcc +--- gcc-3.4.1-dist/gcc/config.gcc 2004-04-21 10:12:35.000000000 -0500 ++++ gcc-3.4.1/gcc/config.gcc 2004-08-12 15:59:46.000000000 -0500 +@@ -664,6 +664,12 @@ + extra_parts="" + use_collect2=yes + ;; ++arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc ++ tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" +@@ -725,6 +731,10 @@ + tmake_file="cris/t-cris cris/t-elfmulti" + gas=yes + ;; ++cris-*-linux-uclibc*) ++ tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" ++ tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux-uclibc" ++ ;; + cris-*-linux*) + tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" + tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux" +@@ -988,6 +998,11 @@ + thread_file='single' + fi + ;; ++i[34567]86-*-linux*uclibc*) # Intel 80386's running GNU/Linux ++ # with ELF format using uClibc ++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc i386/t-crtstuff" ++ ;; + i[34567]86-*-linux*) # Intel 80386's running GNU/Linux + # with ELF format using glibc 2 + # aka GNU/Linux C library 6 +@@ -1547,6 +1562,16 @@ + gnu_ld=yes + gas=yes + ;; ++mips*-*-linux-uclibc*) # Linux MIPS, either endian. uClibc ++ tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" ++ case ${target} in ++ mipsisa32*-*) ++ target_cpu_default="MASK_SOFT_FLOAT" ++ tm_defines="MIPS_ISA_DEFAULT=32" ++ ;; ++ esac ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc" ++ ;; + mips*-*-linux*) # Linux MIPS, either endian. + tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" + case ${target} in +@@ -1764,6 +1789,10 @@ + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h rs6000/linuxspe.h" + tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" + ;; ++powerpc-*-linux-uclibc*) ++ tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" ++ tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux-uclibc rs6000/t-ppccomm" ++ ;; + powerpc-*-linux*) + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" + tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" +@@ -1916,7 +1945,7 @@ + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/embed-elf.h sh/rtemself.h rtems.h" + ;; + sh-*-linux* | sh[2346lbe]*-*-linux*) +- tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver t-linux" ++ tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver" + case ${target} in + sh*be-*-* | sh*eb-*-*) ;; + *) +@@ -1924,9 +1953,17 @@ + tmake_file="${tmake_file} sh/t-le" + ;; + esac +- tmake_file="${tmake_file} sh/t-linux" ++ case ${target} in ++ *-*-linux-uclibc*) tmake_file="${tmake_file} t-linux-uclibc sh/t-linux-uclibc" ;; ++ *) tmake_file="${tmake_file} t-linux sh/t-linux" ;; ++ esac + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/linux.h" + case ${target} in ++ sh64*-*-linux-uclibc*) ++ tmake_file="${tmake_file} sh/t-sh64-uclibc" ++ tm_file="${tm_file} sh/sh64.h" ++ extra_headers="shmedia.h ushmedia.h sshmedia.h" ++ ;; + sh64*) + tmake_file="${tmake_file} sh/t-sh64" + tm_file="${tm_file} sh/sh64.h" +diff -urN gcc-3.4.1-dist/libtool.m4 gcc-3.4.1/libtool.m4 +--- gcc-3.4.1-dist/libtool.m4 2004-05-18 04:08:37.000000000 -0500 ++++ gcc-3.4.1/libtool.m4 2004-08-12 15:54:43.000000000 -0500 +@@ -689,6 +689,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gcc-3.4.1-dist/ltconfig gcc-3.4.1/ltconfig +--- gcc-3.4.1-dist/ltconfig 2004-03-05 15:05:41.000000000 -0600 ++++ gcc-3.4.1/ltconfig 2004-08-12 15:55:48.000000000 -0500 +@@ -602,6 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in ++linux-uclibc*) ;; + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +@@ -1262,6 +1263,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/gcc/3.4.1/200-uclibc-locale.patch b/openwrt/toolchain/gcc/3.4.1/200-uclibc-locale.patch new file mode 100644 index 0000000000..51cd7fc2e1 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.1/200-uclibc-locale.patch @@ -0,0 +1,3241 @@ +diff -urN gcc-3.4.1-dist/libstdc++-v3/acinclude.m4 gcc-3.4.1/libstdc++-v3/acinclude.m4 +--- gcc-3.4.1-dist/libstdc++-v3/acinclude.m4 2004-05-14 05:53:11.000000000 -0500 ++++ gcc-3.4.1/libstdc++-v3/acinclude.m4 2004-08-12 15:54:48.000000000 -0500 +@@ -996,7 +996,7 @@ + AC_MSG_CHECKING([for C locale to use]) + GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@], + [use MODEL for target locale package], +- [permit generic|gnu|ieee_1003.1-2001|yes|no|auto]) ++ [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto]) + + # If they didn't use this option switch, or if they specified --enable + # with no specific model, we'll have to look for one. If they +@@ -1012,6 +1012,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ x*-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include <features.h> +@@ -1138,6 +1141,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.1-dist/libstdc++-v3/aclocal.m4 gcc-3.4.1/libstdc++-v3/aclocal.m4 +--- gcc-3.4.1-dist/libstdc++-v3/aclocal.m4 2004-05-15 15:43:59.000000000 -0500 ++++ gcc-3.4.1/libstdc++-v3/aclocal.m4 2004-08-12 16:14:37.000000000 -0500 +@@ -1025,6 +1025,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ x*-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include <features.h> +@@ -1151,6 +1154,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-3.4.1/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,59 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek <jakub@redhat.com> ++ ++#include <clocale> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#endif // GLIBC 2.3 and later +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-3.4.1/libstdc++-v3/config/locale/uclibc/c_locale.cc +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/c_locale.cc 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,160 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <cerrno> // For errno ++#include <locale> ++#include <stdexcept> ++#include <langinfo.h> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#warning should dummy __newlocale check for C|POSIX ? ++#define __newlocale(a, b, c) NULL ++#define __freelocale(a) ((void)0) ++#define __duplocale(a) __c_locale() ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error(__N("locale::facet::_S_create_c_locale " ++ "name not valid")); ++ } ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++ if (_S_get_c_locale() != __cloc) ++ __freelocale(__cloc); ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++ { return __duplocale(__cloc); } ++} // namespace std ++ ++namespace __gnu_cxx ++{ ++ const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES", ++#if _GLIBCXX_NUM_CATEGORIES != 0 ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} ++ ++namespace std ++{ ++ const char* const* const locale::_S_categories = __gnu_cxx::category_names; ++} // namespace std +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-3.4.1/libstdc++-v3/config/locale/uclibc/c_locale.h +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/c_locale.h 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,119 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include <cstring> // get std::strlen ++#include <cstdio> // get std::snprintf or std::sprintf ++#include <clocale> ++#include <langinfo.h> // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include <iconv.h> // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include <libintl.h> // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCXX_C_LOCALE_GNU for ++#endif ++#define _GLIBCXX_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCXX_NUM_CATEGORIES 6 ++#define _GLIBCXX_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template<typename _Tv> ++ int ++ __convert_from_v(char* __out, const int __size, const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec = -1) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec = -1) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = std::setlocale(LC_ALL, NULL); ++ char* __sav = new char[std::strlen(__old) + 1]; ++ std::strcpy(__sav, __old); ++ std::setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ int __ret; ++ if (__prec >= 0) ++ __ret = std::snprintf(__out, __size, __fmt, __prec, __v); ++ else ++ __ret = std::snprintf(__out, __size, __fmt, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ std::setlocale(LC_ALL, __sav); ++ delete [] __sav; ++#endif ++ return __ret; ++ } ++} ++ ++#endif +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-3.4.1/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,306 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // wcsnrtombs is *very* fast but stops if encounters NUL characters: ++ // in case we fall back to wcrtomb and then continue, in a loop. ++ // NB: wcsnrtombs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0', ++ __from_end - __from_next); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ const size_t __conv = wcsnrtombs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // wcrtomb. ++ for (; __from < __from_next; ++__from) ++ __to_next += wcrtomb(__to_next, *__from, &__tmp_state); ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ extern_type __buf[MB_LEN_MAX]; ++ __tmp_state = __state; ++ const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state); ++ if (__conv > static_cast<size_t>(__to_end - __to_next)) ++ __ret = partial; ++ else ++ { ++ memcpy(__to_next, __buf, __conv); ++ __state = __tmp_state; ++ __to_next += __conv; ++ ++__from_next; ++ } ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we store a L'\0' and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from_next, '\0', ++ __from_end ++ - __from_next)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ size_t __conv = mbsnrtowcs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (;; ++__to_next, __from += __conv) ++ { ++ __conv = mbrtowc(__to_next, __from, __from_end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __from_next = __from; ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ // It is unclear what to return in this case (see DR 382). ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ if (__to_next < __to_end) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from_next; ++ *__to_next++ = L'\0'; ++ } ++ else ++ __ret = partial; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_encoding() const throw() ++ { ++ // XXX This implementation assumes that the encoding is ++ // stateless and is either single-byte or variable-width. ++ int __ret = 0; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ if (MB_CUR_MAX == 1) ++ __ret = 1; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_max_length() const throw() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ // XXX Probably wrong for stateful encodings. ++ int __ret = MB_CUR_MAX; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_length(state_type& __state, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { ++ int __ret = 0; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we advance past it and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ ++ // A dummy internal buffer is needed in order for mbsnrtocws to consider ++ // its fourth parameter (it wouldn't with NULL as first parameter). ++ wchar_t* __to = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from, '\0', ++ __end ++ - __from)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __end; ++ ++ const extern_type* __tmp_from = __from; ++ size_t __conv = mbsnrtowcs(__to, &__from, ++ __from_chunk_end - __from, ++ __max, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (__from = __tmp_from;; __from += __conv) ++ { ++ __conv = mbrtowc(NULL, __from, __end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __state = __tmp_state; ++ __ret += __from - __tmp_from; ++ break; ++ } ++ if (!__from) ++ __from = __from_chunk_end; ++ ++ __ret += __from - __tmp_from; ++ __max -= __conv; ++ ++ if (__from < __end && __max) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from; ++ ++__ret; ++ --__max; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++#endif ++} +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-3.4.1/libstdc++-v3/config/locale/uclibc/collate_members.cc +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/collate_members.cc 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate<char>::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<char>::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ int ++ collate<wchar_t>::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-3.4.1/libstdc++-v3/config/locale/uclibc/ctype_members.cc +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,300 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype<char> specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname<char>::ctype_byname(const char* __s, size_t __refs) ++ : ctype<char>(0, false, __refs) ++ { ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_ctype); ++ this->_S_create_c_locale(this->_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper; ++ this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower; ++ this->_M_table = this->_M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ ctype<wchar_t>::__wmask_type ++ ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = 0; ++ } ++ return __ret; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype<wchar_t>:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__m & _M_bit[__bitcur] ++ && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ { ++ __ret = true; ++ break; ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (; __lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ __m |= _M_bit[__bitcur]; ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype<wchar_t>:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<wchar_t>:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast<unsigned char>(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype<wchar_t>:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++ if (__wc >= 0 && __wc < 128 && _M_narrow_ok) ++ return _M_narrow[__wc]; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ const int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ if (_M_narrow_ok) ++ while (__lo < __hi) ++ { ++ if (*__lo >= 0 && *__lo < 128) ++ *__dest = _M_narrow[*__lo]; ++ else ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype<wchar_t>::_M_initialize_ctype() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wint_t __i; ++ for (__i = 0; __i < 128; ++__i) ++ { ++ const int __c = wctob(__i); ++ if (__c == EOF) ++ break; ++ else ++ _M_narrow[__i] = static_cast<char>(__c); ++ } ++ if (__i == 128) ++ _M_narrow_ok = true; ++ else ++ _M_narrow_ok = false; ++ for (size_t __j = 0; ++ __j < sizeof(_M_widen) / sizeof(wint_t); ++__j) ++ _M_widen[__j] = btowc(__j); ++ ++ for (size_t __k = 0; __k <= 11; ++__k) ++ { ++ _M_bit[__k] = static_cast<mask>(_ISbit(__k)); ++ _M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++#endif // _GLIBCXX_USE_WCHAR_T ++} +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-3.4.1/libstdc++-v3/config/locale/uclibc/messages_members.cc +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/messages_members.cc 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages<char>::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast<const char*>(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ wstring ++ messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++# elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-3.4.1/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/messages_members.h 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,118 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), ++ _M_name_messages(_S_get_c_name()) ++ { } ++ ++ template<typename _CharT> ++ messages<_CharT>::messages(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)), ++ _M_name_messages(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_messages = __tmp; ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::~messages() ++ { ++ if (_M_name_messages != _S_get_c_name()) ++ delete [] _M_name_messages; ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string<char>& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template<typename _CharT> ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template<typename _CharT> ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++ if (this->_M_name_messages != locale::facet::_S_get_c_name()) ++ delete [] this->_M_name_messages; ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ this->_M_name_messages = __tmp; ++ ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_messages); ++ this->_S_create_c_locale(this->_M_c_locale_messages, __s); ++ } ++ } +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-3.4.1/libstdc++-v3/config/locale/uclibc/monetary_members.cc +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,698 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ __ret.field[0] = sign; ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[2] = space; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[1] = space; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ else ++ { ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ default: ++ ; ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == true ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == false ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct<char, true>::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct<char, false>::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ { ++ uc = static_cast<unsigned char>(money_base::_S_atoms[__i]); ++ _M_data->_M_atoms[__i] = btowc(uc); ++ } ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ { ++ uc = static_cast<unsigned char>(money_base::_S_atoms[__i]); ++ _M_data->_M_atoms[__i] = btowc(uc); ++ } ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct<wchar_t, true>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++ ++ template<> ++ moneypunct<wchar_t, false>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++#endif ++} +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-3.4.1/libstdc++-v3/config/locale/uclibc/numeric_members.cc +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2004-08-12 16:13:31.000000000 -0500 +@@ -0,0 +1,183 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct<char>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, ++ __cloc)); ++ ++ // Check for NULL, which implies no grouping. ++ if (_M_data->_M_thousands_sep == '\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = "true"; ++ _M_data->_M_truename_size = strlen(_M_data->_M_truename); ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = "false"; ++ _M_data->_M_falsename_size = strlen(_M_data->_M_falsename); ++ } ++ ++ template<> ++ numpunct<char>::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<wchar_t>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_get_c_locale()); ++#endif ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ { ++ uc = static_cast<unsigned char>(__num_base::_S_atoms_out[__i]); ++ _M_data->_M_atoms_out[__i] = btowc(uc); ++ } ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ { ++ uc = static_cast<unsigned char>(__num_base::_S_atoms_in[__j]); ++ _M_data->_M_atoms_in[__j] = btowc(uc); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); ++#endif ++ ++ if (_M_data->_M_thousands_sep == L'\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = L"true"; ++ _M_data->_M_truename_size = wcslen(_M_data->_M_truename); ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = L"false"; ++ _M_data->_M_falsename_size = wcslen(_M_data->_M_falsename); ++ } ++ ++ template<> ++ numpunct<wchar_t>::~numpunct() ++ { delete _M_data; } ++ #endif ++} +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-3.4.1/libstdc++-v3/config/locale/uclibc/time_members.cc +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/time_members.cc 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,347 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct<char>:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __strftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = "%m/%d/%y"; ++ _M_data->_M_date_era_format = "%m/%d/%y"; ++ _M_data->_M_time_format = "%H:%M:%S"; ++ _M_data->_M_time_era_format = "%H:%M:%S"; ++ _M_data->_M_date_time_format = ""; ++ _M_data->_M_date_time_era_format = ""; ++ _M_data->_M_am = "AM"; ++ _M_data->_M_pm = "PM"; ++ _M_data->_M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = "Sunday"; ++ _M_data->_M_day2 = "Monday"; ++ _M_data->_M_day3 = "Tuesday"; ++ _M_data->_M_day4 = "Wednesday"; ++ _M_data->_M_day5 = "Thursday"; ++ _M_data->_M_day6 = "Friday"; ++ _M_data->_M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = "Sun"; ++ _M_data->_M_aday2 = "Mon"; ++ _M_data->_M_aday3 = "Tue"; ++ _M_data->_M_aday4 = "Wed"; ++ _M_data->_M_aday5 = "Thu"; ++ _M_data->_M_aday6 = "Fri"; ++ _M_data->_M_aday7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = "January"; ++ _M_data->_M_month02 = "February"; ++ _M_data->_M_month03 = "March"; ++ _M_data->_M_month04 = "April"; ++ _M_data->_M_month05 = "May"; ++ _M_data->_M_month06 = "June"; ++ _M_data->_M_month07 = "July"; ++ _M_data->_M_month08 = "August"; ++ _M_data->_M_month09 = "September"; ++ _M_data->_M_month10 = "October"; ++ _M_data->_M_month11 = "November"; ++ _M_data->_M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = "Jan"; ++ _M_data->_M_amonth02 = "Feb"; ++ _M_data->_M_amonth03 = "Mar"; ++ _M_data->_M_amonth04 = "Apr"; ++ _M_data->_M_amonth05 = "May"; ++ _M_data->_M_amonth06 = "Jun"; ++ _M_data->_M_amonth07 = "Jul"; ++ _M_data->_M_amonth08 = "Aug"; ++ _M_data->_M_amonth09 = "Sep"; ++ _M_data->_M_amonth10 = "Oct"; ++ _M_data->_M_amonth11 = "Nov"; ++ _M_data->_M_amonth12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc); ++ _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ __timepunct<wchar_t>:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ ++ template<> ++ void ++ __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<wchar_t>; ++ ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = L"%m/%d/%y"; ++ _M_data->_M_date_era_format = L"%m/%d/%y"; ++ _M_data->_M_time_format = L"%H:%M:%S"; ++ _M_data->_M_time_era_format = L"%H:%M:%S"; ++ _M_data->_M_date_time_format = L""; ++ _M_data->_M_date_time_era_format = L""; ++ _M_data->_M_am = L"AM"; ++ _M_data->_M_pm = L"PM"; ++ _M_data->_M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = L"Sunday"; ++ _M_data->_M_day2 = L"Monday"; ++ _M_data->_M_day3 = L"Tuesday"; ++ _M_data->_M_day4 = L"Wednesday"; ++ _M_data->_M_day5 = L"Thursday"; ++ _M_data->_M_day6 = L"Friday"; ++ _M_data->_M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = L"Sun"; ++ _M_data->_M_aday2 = L"Mon"; ++ _M_data->_M_aday3 = L"Tue"; ++ _M_data->_M_aday4 = L"Wed"; ++ _M_data->_M_aday5 = L"Thu"; ++ _M_data->_M_aday6 = L"Fri"; ++ _M_data->_M_aday7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = L"January"; ++ _M_data->_M_month02 = L"February"; ++ _M_data->_M_month03 = L"March"; ++ _M_data->_M_month04 = L"April"; ++ _M_data->_M_month05 = L"May"; ++ _M_data->_M_month06 = L"June"; ++ _M_data->_M_month07 = L"July"; ++ _M_data->_M_month08 = L"August"; ++ _M_data->_M_month09 = L"September"; ++ _M_data->_M_month10 = L"October"; ++ _M_data->_M_month11 = L"November"; ++ _M_data->_M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = L"Jan"; ++ _M_data->_M_amonth02 = L"Feb"; ++ _M_data->_M_amonth03 = L"Mar"; ++ _M_data->_M_amonth04 = L"Apr"; ++ _M_data->_M_amonth05 = L"May"; ++ _M_data->_M_amonth06 = L"Jun"; ++ _M_data->_M_amonth07 = L"Jul"; ++ _M_data->_M_amonth08 = L"Aug"; ++ _M_data->_M_amonth09 = L"Sep"; ++ _M_data->_M_amonth10 = L"Oct"; ++ _M_data->_M_amonth11 = L"Nov"; ++ _M_data->_M_amonth12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_FMT, __cloc)); ++ _M_data->_M_date_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc)); ++ _M_data->_M_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT, __cloc)); ++ _M_data->_M_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc)); ++ _M_data->_M_date_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_T_FMT, __cloc)); ++ _M_data->_M_date_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc)); ++ _M_data->_M_am = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WAM_STR, __cloc)); ++ _M_data->_M_pm = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WPM_STR, __cloc)); ++ _M_data->_M_am_pm_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc)); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_1, __cloc)); ++ _M_data->_M_day2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_2, __cloc)); ++ _M_data->_M_day3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_3, __cloc)); ++ _M_data->_M_day4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_4, __cloc)); ++ _M_data->_M_day5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_5, __cloc)); ++ _M_data->_M_day6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_6, __cloc)); ++ _M_data->_M_day7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_7, __cloc)); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_1, __cloc)); ++ _M_data->_M_aday2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_2, __cloc)); ++ _M_data->_M_aday3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_3, __cloc)); ++ _M_data->_M_aday4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_4, __cloc)); ++ _M_data->_M_aday5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_5, __cloc)); ++ _M_data->_M_aday6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_6, __cloc)); ++ _M_data->_M_aday7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_7, __cloc)); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_1, __cloc)); ++ _M_data->_M_month02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_2, __cloc)); ++ _M_data->_M_month03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_3, __cloc)); ++ _M_data->_M_month04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_4, __cloc)); ++ _M_data->_M_month05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_5, __cloc)); ++ _M_data->_M_month06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_6, __cloc)); ++ _M_data->_M_month07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_7, __cloc)); ++ _M_data->_M_month08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_8, __cloc)); ++ _M_data->_M_month09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_9, __cloc)); ++ _M_data->_M_month10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_10, __cloc)); ++ _M_data->_M_month11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_11, __cloc)); ++ _M_data->_M_month12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_12, __cloc)); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_1, __cloc)); ++ _M_data->_M_amonth02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_2, __cloc)); ++ _M_data->_M_amonth03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_3, __cloc)); ++ _M_data->_M_amonth04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_4, __cloc)); ++ _M_data->_M_amonth05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_5, __cloc)); ++ _M_data->_M_amonth06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_6, __cloc)); ++ _M_data->_M_amonth07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_7, __cloc)); ++ _M_data->_M_amonth08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_8, __cloc)); ++ _M_data->_M_amonth09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_9, __cloc)); ++ _M_data->_M_amonth10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_10, __cloc)); ++ _M_data->_M_amonth11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_11, __cloc)); ++ _M_data->_M_amonth12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_12, __cloc)); ++ } ++#endif // 0 ++ } ++#endif ++} +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/time_members.h gcc-3.4.1/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-3.4.1-dist/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/locale/uclibc/time_members.h 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,68 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) ++ : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_timepunct = __tmp; ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::~__timepunct() ++ { ++ if (_M_name_timepunct != _S_get_c_name()) ++ delete [] _M_name_timepunct; ++ delete _M_data; ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-3.4.1/libstdc++-v3/config/os/uclibc/ctype_base.h +--- gcc-3.4.1-dist/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/os/uclibc/ctype_base.h 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,58 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ ++ // NB: Offsets into ctype<char>::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISalpha | _ISdigit | _ISpunct; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalpha | _ISdigit; ++ }; +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-3.4.1/libstdc++-v3/config/os/uclibc/ctype_inline.h +--- gcc-3.4.1-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/os/uclibc/ctype_inline.h 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype<char>:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast<unsigned char>(__c)] & __m; } ++ ++ const char* ++ ctype<char>:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast<unsigned char>(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-3.4.1/libstdc++-v3/config/os/uclibc/ctype_noninline.h +--- gcc-3.4.1-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,92 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype<char>::classic_table() throw() ++ { return __C_ctype_b; } ++ ++ ctype<char>::ctype(__c_locale, const mask* __table, bool __del, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ char ++ ctype<char>::do_toupper(char __c) const ++ { return _M_toupper[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype<char>::do_tolower(char __c) const ++ { return _M_tolower[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +diff -urN gcc-3.4.1-dist/libstdc++-v3/config/os/uclibc/os_defines.h gcc-3.4.1/libstdc++-v3/config/os/uclibc/os_defines.h +--- gcc-3.4.1-dist/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/config/os/uclibc/os_defines.h 2004-08-12 15:54:48.000000000 -0500 +@@ -0,0 +1,44 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCXX_OS_DEFINES ++#define _GLIBCXX_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include <features.h> ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif +diff -urN gcc-3.4.1-dist/libstdc++-v3/configure gcc-3.4.1/libstdc++-v3/configure +--- gcc-3.4.1-dist/libstdc++-v3/configure 2004-06-25 17:02:47.000000000 -0500 ++++ gcc-3.4.1/libstdc++-v3/configure 2004-08-12 16:20:43.000000000 -0500 +@@ -3878,6 +3878,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5545,6 +5550,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + cat >conftest.$ac_ext <<_ACEOF + #line $LINENO "configure" +@@ -5759,6 +5767,77 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ echo "$as_me:$LINENO: result: uclibc" >&5 ++echo "${ECHO_T}uclibc" >&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_check_msgfmt+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_check_msgfmt="yes" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt=$ac_cv_prog_check_msgfmt ++if test -n "$check_msgfmt"; then ++ echo "$as_me:$LINENO: result: $check_msgfmt" >&5 ++echo "${ECHO_T}$check_msgfmt" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.1-dist/libstdc++-v3/configure.host gcc-3.4.1/libstdc++-v3/configure.host +--- gcc-3.4.1-dist/libstdc++-v3/configure.host 2004-03-18 11:36:12.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/configure.host 2004-08-12 15:54:48.000000000 -0500 +@@ -217,6 +217,12 @@ + ;; + esac + ++# Override for uClibc since linux-uclibc gets mishandled above. ++case "${host_os}" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; ++esac + + # Set any OS-dependent and CPU-dependent bits. + # THIS TABLE IS SORTED. KEEP IT THAT WAY. +diff -urN gcc-3.4.1-dist/libstdc++-v3/crossconfig.m4 gcc-3.4.1/libstdc++-v3/crossconfig.m4 +--- gcc-3.4.1-dist/libstdc++-v3/crossconfig.m4 2004-06-10 12:12:14.000000000 -0500 ++++ gcc-3.4.1/libstdc++-v3/crossconfig.m4 2004-08-12 15:54:48.000000000 -0500 +@@ -122,6 +122,99 @@ + ;; + esac + ;; ++ *-uclibc*) ++# Temporary hack until we implement the float versions of the libm funcs ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h float.h endian.h inttypes.h locale.h float.h stdint.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCXX_CHECK_LINKER_FEATURES ++ GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCXX_CHECK_WCHAR_T_SUPPORT ++ ++ # For LFS. ++ AC_DEFINE(HAVE_INT64_T) ++ case "$target" in ++ *-uclinux*) ++ # Don't enable LFS with uClinux ++ ;; ++ *) ++ AC_DEFINE(_GLIBCXX_USE_LFS) ++ esac ++ ++ # For showmanyc_helper(). ++ AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h) ++ GLIBCXX_CHECK_POLL ++ GLIBCXX_CHECK_S_ISREG_OR_S_IFREG ++ ++ # For xsputn_2(). ++ AC_CHECK_HEADERS(sys/uio.h) ++ GLIBCXX_CHECK_WRITEV ++ ++# AC_DEFINE(HAVE_ACOSF) ++# AC_DEFINE(HAVE_ASINF) ++# AC_DEFINE(HAVE_ATANF) ++# AC_DEFINE(HAVE_ATAN2F) ++ AC_DEFINE(HAVE_CEILF) ++ AC_DEFINE(HAVE_COPYSIGN) ++# AC_DEFINE(HAVE_COPYSIGNF) ++# AC_DEFINE(HAVE_COSF) ++# AC_DEFINE(HAVE_COSHF) ++# AC_DEFINE(HAVE_EXPF) ++# AC_DEFINE(HAVE_FABSF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ AC_DEFINE(HAVE_FLOORF) ++# AC_DEFINE(HAVE_FMODF) ++# AC_DEFINE(HAVE_FREXPF) ++ AC_DEFINE(HAVE_HYPOT) ++# AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++# AC_DEFINE(HAVE_LOGF) ++# AC_DEFINE(HAVE_LOG10F) ++# AC_DEFINE(HAVE_MODFF) ++# AC_DEFINE(HAVE_SINF) ++# AC_DEFINE(HAVE_SINHF) ++# AC_DEFINE(HAVE_SINCOS) ++# AC_DEFINE(HAVE_SINCOSF) ++ AC_DEFINE(HAVE_SQRTF) ++# AC_DEFINE(HAVE_TANF) ++# AC_DEFINE(HAVE_TANHF) ++ if test x"long_double_math_on_this_cpu" = x"yes"; then ++ AC_MSG_ERROR([long_double_math_on_this_cpu is yes!]) ++# AC_DEFINE(HAVE_ACOSL) ++# AC_DEFINE(HAVE_ASINL) ++# AC_DEFINE(HAVE_ATANL) ++# AC_DEFINE(HAVE_ATAN2L) ++# AC_DEFINE(HAVE_CEILL) ++# AC_DEFINE(HAVE_COPYSIGNL) ++# AC_DEFINE(HAVE_COSL) ++# AC_DEFINE(HAVE_COSHL) ++# AC_DEFINE(HAVE_EXPL) ++# AC_DEFINE(HAVE_FABSL) ++# AC_DEFINE(HAVE_FINITEL) ++# AC_DEFINE(HAVE_FLOORL) ++# AC_DEFINE(HAVE_FMODL) ++# AC_DEFINE(HAVE_FREXPL) ++# AC_DEFINE(HAVE_HYPOTL) ++# AC_DEFINE(HAVE_ISINFL) ++# AC_DEFINE(HAVE_ISNANL) ++# AC_DEFINE(HAVE_LOGL) ++# AC_DEFINE(HAVE_LOG10L) ++# AC_DEFINE(HAVE_MODFL) ++# AC_DEFINE(HAVE_POWL) ++# AC_DEFINE(HAVE_SINL) ++# AC_DEFINE(HAVE_SINHL) ++# AC_DEFINE(HAVE_SINCOSL) ++# AC_DEFINE(HAVE_SQRTL) ++# AC_DEFINE(HAVE_TANL) ++# AC_DEFINE(HAVE_TANHL) ++ fi ++ ;; + *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu) + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ + machine/endian.h machine/param.h sys/machine.h sys/types.h \ +@@ -136,7 +229,7 @@ + AC_DEFINE(HAVE_INT64_T) + case "$target" in + *-uclinux*) +- # Don't enable LFS with uClibc ++ # Don't enable LFS with uClinux + ;; + *) + AC_DEFINE(_GLIBCXX_USE_LFS) +diff -urN gcc-3.4.1-dist/libstdc++-v3/include/c_compatibility/wchar.h gcc-3.4.1/libstdc++-v3/include/c_compatibility/wchar.h +--- gcc-3.4.1-dist/libstdc++-v3/include/c_compatibility/wchar.h 2003-12-08 21:51:45.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/include/c_compatibility/wchar.h 2004-08-12 16:14:07.000000000 -0500 +@@ -101,7 +101,9 @@ + using std::wmemcpy; + using std::wmemmove; + using std::wmemset; ++#if _GLIBCXX_HAVE_WCSFTIME + using std::wcsftime; ++#endif + + #if _GLIBCXX_USE_C99 + using std::wcstold; +diff -urN gcc-3.4.1-dist/libstdc++-v3/include/c_std/std_cwchar.h gcc-3.4.1/libstdc++-v3/include/c_std/std_cwchar.h +--- gcc-3.4.1-dist/libstdc++-v3/include/c_std/std_cwchar.h 2003-12-08 21:44:35.000000000 -0600 ++++ gcc-3.4.1/libstdc++-v3/include/c_std/std_cwchar.h 2004-08-12 15:54:48.000000000 -0500 +@@ -179,7 +179,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#if _GLIBCXX_HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; diff --git a/openwrt/toolchain/gcc/3.4.1/400-mips-delay-slot.patch b/openwrt/toolchain/gcc/3.4.1/400-mips-delay-slot.patch new file mode 100644 index 0000000000..8111dba185 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.1/400-mips-delay-slot.patch @@ -0,0 +1,46 @@ +http://www.linux-mips.org/archives/linux-mips/2004-09/msg00000.html + +Atsushi Nemoto <anemo@mba.ocn.ne.jp> writes: +>/ Is this a get_user's problem or gcc's?/ + +The latter. gcc is putting the empty asm: + + __asm__ ("":"=r" (__gu_val)); + +into the delay slot of the call. + +Part of the problem is that gcc estimates the length of an asm to be the +number of instruction separators + 1. This means that it estimates the +asm above to be one instruction long, which is perhaps a little silly +for an empty string. + +But the real problem is that gcc should never trust this estimate anyway, +since each "instruction" could obviously be a multi-instruction macro. +gcc should certainly never put asms into delay slots. + +FWIW, I don't think the bug is specific to 3.3 or 3.4. It could +probably trigger for other gcc versions too. It is highly dependent +on scheduling though. + +The attached 3.4.x patch fixes the problem there, but if you want to work +around it for old versions, just avoid using empty asms if you can, +or make them volatile if you can't. + +Of course, the problem isn't confined to empty asms. If you have an asm +with a single, multi-instruction macro, gcc might try putting that in a +delay slot too. You should at least get an assembler warning in that case. + +Richard + + +--- gcc-3.4.1/gcc/config/mips/mips.md-orig 2004-09-02 10:38:36.000000000 -0500 ++++ gcc-3.4.1/gcc/config/mips/mips.md 2004-09-02 10:38:42.000000000 -0500 +@@ -251,7 +251,7 @@ + + ;; Can the instruction be put into a delay slot? + (define_attr "can_delay" "no,yes" +- (if_then_else (and (eq_attr "type" "!branch,call,jump") ++ (if_then_else (and (eq_attr "type" "!branch,call,jump,multi") + (and (eq_attr "hazard" "none") + (eq_attr "single_insn" "yes"))) + (const_string "yes") diff --git a/openwrt/toolchain/gcc/3.4.1/800-arm-bigendian.patch b/openwrt/toolchain/gcc/3.4.1/800-arm-bigendian.patch new file mode 100644 index 0000000000..0bae8f474c --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.1/800-arm-bigendian.patch @@ -0,0 +1,70 @@ +By Lennert Buytenhek <buytenh@wantstofly.org> +Adds support for arm*b-linux* big-endian ARM targets + +See http://gcc.gnu.org/PR16350 + +diff -urN gcc-3.4.1-dist/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-08-16 16:01:50.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-16 15:43:40.000000000 -0500 +@@ -30,17 +30,34 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + /* Default is to use APCS-32 mode. */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 | \ ++ ARM_FLAG_MMU_TRAPS | \ ++ TARGET_ENDIAN_DEFAULT ) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -101,7 +118,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + #endif + +diff -urN gcc-3.4.1-dist/gcc/config.gcc gcc-3.4.1/gcc/config.gcc +--- gcc-3.4.1-dist/gcc/config.gcc 2004-08-16 16:01:50.000000000 -0500 ++++ gcc-3.4.1/gcc/config.gcc 2004-08-16 16:01:25.000000000 -0500 +@@ -672,6 +672,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/openwrt/toolchain/gcc/3.4.1/810-arm-bigendian-uclibc.patch b/openwrt/toolchain/gcc/3.4.1/810-arm-bigendian-uclibc.patch new file mode 100644 index 0000000000..a4d87e2317 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.1/810-arm-bigendian-uclibc.patch @@ -0,0 +1,27 @@ +diff -urN gcc-3.4.1-dist/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-08-16 16:08:18.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-16 16:06:24.000000000 -0500 +@@ -107,7 +107,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + #else + #define LINK_SPEC "%{h*} %{version:-v} \ +diff -urN gcc-3.4.1-dist/gcc/config.gcc gcc-3.4.1/gcc/config.gcc +--- gcc-3.4.1-dist/gcc/config.gcc 2004-08-16 16:08:18.000000000 -0500 ++++ gcc-3.4.1/gcc/config.gcc 2004-08-16 16:03:25.000000000 -0500 +@@ -666,6 +666,11 @@ + ;; + arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/openwrt/toolchain/gcc/3.4.1/arm-softfloat.patch.conditional b/openwrt/toolchain/gcc/3.4.1/arm-softfloat.patch.conditional new file mode 100644 index 0000000000..19d1b90dac --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.1/arm-softfloat.patch.conditional @@ -0,0 +1,270 @@ +Note... modified my mjn3 to not conflict with the big endian arm patch. +Warning!!! Only the linux target is aware of TARGET_ENDIAN_DEFAULT. +Also changed + #define SUBTARGET_EXTRA_ASM_SPEC "\ + %{!mcpu=*:-mcpu=xscale} \ + %{mhard-float:-mfpu=fpa} \ + %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" +to + #define SUBTARGET_EXTRA_ASM_SPEC "\ + %{mhard-float:-mfpu=fpa} \ + %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" +in gcc/config/arm/linux-elf.h. +# +# Submitted: +# +# Dimitry Andric <dimitry@andric.com>, 2004-05-01 +# +# Description: +# +# Nicholas Pitre released this patch for gcc soft-float support here: +# http://lists.arm.linux.org.uk/pipermail/linux-arm/2003-October/006436.html +# +# This version has been adapted to work with gcc 3.4.0. +# +# The original patch doesn't distinguish between softfpa and softvfp modes +# in the way Nicholas Pitre probably meant. His description is: +# +# "Default is to use APCS-32 mode with soft-vfp. The old Linux default for +# floats can be achieved with -mhard-float or with the configure +# --with-float=hard option. If -msoft-float or --with-float=soft is used then +# software float support will be used just like the default but with the legacy +# big endian word ordering for double float representation instead." +# +# Which means the following: +# +# * If you compile without -mhard-float or -msoft-float, you should get +# software floating point, using the VFP format. The produced object file +# should have these flags in its header: +# +# private flags = 600: [APCS-32] [VFP float format] [software FP] +# +# * If you compile with -mhard-float, you should get hardware floating point, +# which always uses the FPA format. Object file header flags should be: +# +# private flags = 0: [APCS-32] [FPA float format] +# +# * If you compile with -msoft-float, you should get software floating point, +# using the FPA format. This is done for compatibility reasons with many +# existing distributions. Object file header flags should be: +# +# private flags = 200: [APCS-32] [FPA float format] [software FP] +# +# The original patch from Nicholas Pitre contained the following constructs: +# +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +# %{mhard-float:-mfpu=fpa} \ +# %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" +# +# However, gcc doesn't accept this ";:" notation, used in the 3rd line. This +# is probably the reason Robert Schwebel modified it to: +# +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +# %{mhard-float:-mfpu=fpa} \ +# %{!mhard-float: %{msoft-float:-mfpu=softfpa -mfpu=softvfp}}" +# +# But this causes the following behaviour: +# +# * If you compile without -mhard-float or -msoft-float, the compiler generates +# software floating point instructions, but *nothing* is passed to the +# assembler, which results in an object file which has flags: +# +# private flags = 0: [APCS-32] [FPA float format] +# +# This is not correct! +# +# * If you compile with -mhard-float, the compiler generates hardware floating +# point instructions, and passes "-mfpu=fpa" to the assembler, which results +# in an object file which has the same flags as in the previous item, but now +# those *are* correct. +# +# * If you compile with -msoft-float, the compiler generates software floating +# point instructions, and passes "-mfpu=softfpa -mfpu=softvfp" (in that +# order) to the assembler, which results in an object file with flags: +# +# private flags = 600: [APCS-32] [VFP float format] [software FP] +# +# This is not correct, because the last "-mfpu=" option on the assembler +# command line determines the actual FPU convention used (which should be FPA +# in this case). +# +# Therefore, I modified this patch to get the desired behaviour. Every +# instance of the notation: +# +# %{msoft-float:-mfpu=softfpa -mfpu=softvfp} +# +# was changed to: +# +# %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp} +# +# I also did the following: +# +# * Modified all TARGET_DEFAULT macros I could find to include ARM_FLAG_VFP, to +# be consistent with Nicholas' original patch. +# * Removed any "msoft-float" or "mhard-float" from all MULTILIB_DEFAULTS +# macros I could find. I think that if you compile without any options, you +# would like to get the defaults. :) +# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed +# anymore. (The required functions are now in libgcc.) + +diff -urN gcc-3.4.1-old/gcc/config/arm/coff.h gcc-3.4.1/gcc/config/arm/coff.h +--- gcc-3.4.1-old/gcc/config/arm/coff.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/coff.h 2004-09-02 21:51:15.000000000 -0500 +@@ -31,11 +31,16 @@ + #define TARGET_VERSION fputs (" (ARM/coff)", stderr) + + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" } + #endif + + /* This is COFF, but prefer stabs. */ +diff -urN gcc-3.4.1-old/gcc/config/arm/elf.h gcc-3.4.1/gcc/config/arm/elf.h +--- gcc-3.4.1-old/gcc/config/arm/elf.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -46,7 +46,9 @@ + + #ifndef SUBTARGET_ASM_FLOAT_SPEC + #define SUBTARGET_ASM_FLOAT_SPEC "\ +-%{mapcs-float:-mfloat} %{msoft-float:-mfpu=softfpa}" ++%{mapcs-float:-mfloat} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + #endif + + #ifndef ASM_SPEC +@@ -106,12 +108,17 @@ + #endif + + #ifndef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + #endif + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } + #endif + + #define TARGET_ASM_FILE_START_APP_OFF true +diff -urN gcc-3.4.1-old/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-old/gcc/config/arm/linux-elf.h 2004-09-02 21:50:52.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-09-02 22:00:49.000000000 -0500 +@@ -44,12 +44,26 @@ + #define TARGET_LINKER_EMULATION "armelf_linux" + #endif + +-/* Default is to use APCS-32 mode. */ ++/* ++ * Default is to use APCS-32 mode with soft-vfp. ++ * The old Linux default for floats can be achieved with -mhard-float ++ * or with the configure --with-float=hard option. ++ * If -msoft-float or --with-float=soft is used then software float ++ * support will be used just like the default but with the legacy ++ * big endian word ordering for double float representation instead. ++ */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT \ +- ( ARM_FLAG_APCS_32 | \ +- ARM_FLAG_MMU_TRAPS | \ +- TARGET_ENDIAN_DEFAULT ) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_SOFT_FLOAT \ ++ | TARGET_ENDIAN_DEFAULT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_MMU_TRAPS ) ++ ++#undef SUBTARGET_EXTRA_ASM_SPEC ++#define SUBTARGET_EXTRA_ASM_SPEC "\ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +@@ -57,7 +71,7 @@ + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -72,7 +86,7 @@ + %{shared:-lc} \ + %{!shared:%{profile:-lc_p}%{!profile:-lc}}" + +-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc" ++#define LIBGCC_SPEC "-lgcc" + + /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add + the GNU/Linux magical crtbegin.o file (see crtstuff.c) which +diff -urN gcc-3.4.1-old/gcc/config/arm/t-linux gcc-3.4.1/gcc/config/arm/t-linux +--- gcc-3.4.1-old/gcc/config/arm/t-linux 2003-09-20 16:09:07.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/t-linux 2004-09-02 21:51:15.000000000 -0500 +@@ -4,7 +4,10 @@ + LIBGCC2_DEBUG_CFLAGS = -g0 + + LIB1ASMSRC = arm/lib1funcs.asm +-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx ++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ ++ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ ++ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ ++ _fixsfsi _fixunssfsi + + # MULTILIB_OPTIONS = mhard-float/msoft-float + # MULTILIB_DIRNAMES = hard-float soft-float +diff -urN gcc-3.4.1-old/gcc/config/arm/unknown-elf.h gcc-3.4.1/gcc/config/arm/unknown-elf.h +--- gcc-3.4.1-old/gcc/config/arm/unknown-elf.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/unknown-elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -30,7 +30,12 @@ + + /* Default to using APCS-32 and software floating point. */ + #ifndef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + #endif + + /* Now we define the strings used to build the spec file. */ +diff -urN gcc-3.4.1-old/gcc/config/arm/xscale-elf.h gcc-3.4.1/gcc/config/arm/xscale-elf.h +--- gcc-3.4.1-old/gcc/config/arm/xscale-elf.h 2003-07-01 18:26:43.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/xscale-elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -49,11 +49,12 @@ + endian, regardless of the endian-ness of the memory + system. */ + +-#define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +- %{mhard-float:-mfpu=fpa} \ +- %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" ++#define SUBTARGET_EXTRA_ASM_SPEC "\ ++%{!mcpu=*:-mcpu=xscale} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "mlittle-endian", "mno-thumb-interwork", "marm", "msoft-float" } ++ { "mlittle-endian", "mno-thumb-interwork", "marm" } + #endif diff --git a/openwrt/toolchain/gcc/3.4.2/100-uclibc-conf.patch b/openwrt/toolchain/gcc/3.4.2/100-uclibc-conf.patch new file mode 100644 index 0000000000..29e4c802e2 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/100-uclibc-conf.patch @@ -0,0 +1,442 @@ +diff -urN gcc-3.4.1-dist/boehm-gc/configure gcc-3.4.1/boehm-gc/configure +--- gcc-3.4.1-dist/boehm-gc/configure 2004-07-01 14:14:03.000000000 -0500 ++++ gcc-3.4.1/boehm-gc/configure 2004-08-12 16:22:57.000000000 -0500 +@@ -1947,6 +1947,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN gcc-3.4.1-dist/boehm-gc/ltconfig gcc-3.4.1/boehm-gc/ltconfig +--- gcc-3.4.1-dist/boehm-gc/ltconfig 2002-11-20 09:59:06.000000000 -0600 ++++ gcc-3.4.1/boehm-gc/ltconfig 2004-08-12 15:54:42.000000000 -0500 +@@ -1981,6 +1981,23 @@ + fi + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ++ file_magic_cmd=/usr/bin/file ++ file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + version_type=sunos + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then +diff -urN gcc-3.4.1-dist/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-01-31 00:18:11.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-12 15:54:42.000000000 -0500 +@@ -81,6 +81,18 @@ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC "%{h*} %{version:-v} \ ++ %{b} %{Wl,*:%*} \ ++ %{static:-Bstatic} \ ++ %{shared:-shared} \ ++ %{symbolic:-Bsymbolic} \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ ++ -X \ ++ %{mbig-endian:-EB}" \ ++ SUBTARGET_EXTRA_LINK_SPEC ++#else + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ +@@ -91,6 +103,7 @@ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC ++#endif + + #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS() + +diff -urN gcc-3.4.1-dist/gcc/config/cris/linux.h gcc-3.4.1/gcc/config/cris/linux.h +--- gcc-3.4.1-dist/gcc/config/cris/linux.h 2003-11-28 21:08:09.000000000 -0600 ++++ gcc-3.4.1/gcc/config/cris/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -79,6 +79,25 @@ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -93,6 +112,8 @@ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +diff -urN gcc-3.4.1-dist/gcc/config/cris/t-linux-uclibc gcc-3.4.1/gcc/config/cris/t-linux-uclibc +--- gcc-3.4.1-dist/gcc/config/cris/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/cris/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,3 @@ ++T_CFLAGS = -DUSE_UCLIBC ++TARGET_LIBGCC2_CFLAGS += -fPIC ++CRTSTUFF_T_CFLAGS_S = $(TARGET_LIBGCC2_CFLAGS) +diff -urN gcc-3.4.1-dist/gcc/config/i386/linux.h gcc-3.4.1/gcc/config/i386/linux.h +--- gcc-3.4.1-dist/gcc/config/i386/linux.h 2003-11-28 21:08:10.000000000 -0600 ++++ gcc-3.4.1/gcc/config/i386/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -118,6 +118,15 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.1}} \ + %{static:-static}}}" + #else ++#if defined USE_UCLIBC ++#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ +@@ -126,6 +135,7 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}}}" + #endif ++#endif + + /* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named +diff -urN gcc-3.4.1-dist/gcc/config/mips/linux.h gcc-3.4.1/gcc/config/mips/linux.h +--- gcc-3.4.1-dist/gcc/config/mips/linux.h 2004-06-15 20:42:24.000000000 -0500 ++++ gcc-3.4.1/gcc/config/mips/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -109,6 +109,17 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC \ ++ "%(endian_spec) \ ++ %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ +@@ -118,6 +129,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ + %{static:-static}}}" ++#endif + + #undef SUBTARGET_ASM_SPEC + #define SUBTARGET_ASM_SPEC "\ +diff -urN gcc-3.4.1-dist/gcc/config/rs6000/linux.h gcc-3.4.1/gcc/config/rs6000/linux.h +--- gcc-3.4.1-dist/gcc/config/rs6000/linux.h 2004-02-25 09:11:19.000000000 -0600 ++++ gcc-3.4.1/gcc/config/rs6000/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -61,7 +61,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #define LINK_GCC_C_SEQUENCE_SPEC \ + "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" +diff -urN gcc-3.4.1-dist/gcc/config/rs6000/sysv4.h gcc-3.4.1/gcc/config/rs6000/sysv4.h +--- gcc-3.4.1-dist/gcc/config/rs6000/sysv4.h 2004-06-10 01:39:50.000000000 -0500 ++++ gcc-3.4.1/gcc/config/rs6000/sysv4.h 2004-08-12 15:54:43.000000000 -0500 +@@ -947,6 +947,7 @@ + mcall-linux : %(link_os_linux) ; \ + mcall-gnu : %(link_os_gnu) ; \ + mcall-netbsd : %(link_os_netbsd) ; \ ++ mcall-linux-uclibc : %(link_os_linux_uclibc); \ + mcall-openbsd: %(link_os_openbsd) ; \ + : %(link_os_default) }" + +@@ -1124,6 +1125,10 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}" + ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + #if defined(HAVE_LD_EH_FRAME_HDR) + # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " + #endif +@@ -1290,6 +1295,7 @@ + { "link_os_sim", LINK_OS_SIM_SPEC }, \ + { "link_os_freebsd", LINK_OS_FREEBSD_SPEC }, \ + { "link_os_linux", LINK_OS_LINUX_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_gnu", LINK_OS_GNU_SPEC }, \ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_openbsd", LINK_OS_OPENBSD_SPEC }, \ +diff -urN gcc-3.4.1-dist/gcc/config/sh/linux.h gcc-3.4.1/gcc/config/sh/linux.h +--- gcc-3.4.1-dist/gcc/config/sh/linux.h 2004-01-11 20:29:13.000000000 -0600 ++++ gcc-3.4.1/gcc/config/sh/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -73,12 +73,21 @@ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define SUBTARGET_LINK_SPEC \ ++ "%{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}" ++#else + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}" ++#endif + + #undef LIB_SPEC + #define LIB_SPEC \ +diff -urN gcc-3.4.1-dist/gcc/config/sh/t-linux-uclibc gcc-3.4.1/gcc/config/sh/t-linux-uclibc +--- gcc-3.4.1-dist/gcc/config/sh/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/sh/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,13 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++TARGET_LIBGCC2_CFLAGS = -fpic -DNO_FPSCR_VALUES ++LIB1ASMFUNCS_CACHE = _ic_invalidate ++ ++LIB2FUNCS_EXTRA= ++ ++MULTILIB_OPTIONS= $(MULTILIB_ENDIAN) m3e/m4 ++MULTILIB_DIRNAMES= ++MULTILIB_MATCHES = ++MULTILIB_EXCEPTIONS= ++ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o +diff -urN gcc-3.4.1-dist/gcc/config/sh/t-sh64-uclibc gcc-3.4.1/gcc/config/sh/t-sh64-uclibc +--- gcc-3.4.1-dist/gcc/config/sh/t-sh64-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/sh/t-sh64-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,13 @@ ++EXTRA_MULTILIB_PARTS= crt1.o crti.o crtn.o crtbegin.o crtend.o ++ ++LIB1ASMFUNCS = \ ++ _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ ++ _shcompact_call_trampoline _shcompact_return_trampoline \ ++ _shcompact_incoming_args _ic_invalidate _nested_trampoline \ ++ _push_pop_shmedia_regs \ ++ _udivdi3 _divdi3 _umoddi3 _moddi3 ++ ++MULTILIB_OPTIONS = $(MULTILIB_ENDIAN) m5-32media-nofpu/m5-compact/m5-compact-nofpu/m5-64media/m5-64media-nofpu ++MULTILIB_DIRNAMES= $(MULTILIB_ENDIAN) nofpu compact nofpu/compact media64 nofpu/media64 ++MULTILIB_MATCHES= ++MULTILIB_EXCEPTIONS= +diff -urN gcc-3.4.1-dist/gcc/config/t-linux-uclibc gcc-3.4.1/gcc/config/t-linux-uclibc +--- gcc-3.4.1-dist/gcc/config/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,15 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Compile crtbeginS.o and crtendS.o with pic. ++CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC ++# Compile libgcc2.a with pic. ++TARGET_LIBGCC2_CFLAGS = -fPIC ++ ++# Override t-slibgcc-elf-ver to export some libgcc symbols with ++# the symbol versions that glibc used. ++#SHLIB_MAPFILES += $(srcdir)/config/libgcc-glibc.ver ++ ++# Use unwind-dw2-fde ++LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ ++ $(srcdir)/unwind-sjlj.c $(srcdir)/gthr-gnat.c $(srcdir)/unwind-c.c ++LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h +diff -urN gcc-3.4.1-dist/gcc/config.gcc gcc-3.4.1/gcc/config.gcc +--- gcc-3.4.1-dist/gcc/config.gcc 2004-04-21 10:12:35.000000000 -0500 ++++ gcc-3.4.1/gcc/config.gcc 2004-08-12 15:59:46.000000000 -0500 +@@ -664,6 +664,12 @@ + extra_parts="" + use_collect2=yes + ;; ++arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc ++ tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" +@@ -725,6 +731,10 @@ + tmake_file="cris/t-cris cris/t-elfmulti" + gas=yes + ;; ++cris-*-linux-uclibc*) ++ tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" ++ tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux-uclibc" ++ ;; + cris-*-linux*) + tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" + tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux" +@@ -988,6 +998,11 @@ + thread_file='single' + fi + ;; ++i[34567]86-*-linux*uclibc*) # Intel 80386's running GNU/Linux ++ # with ELF format using uClibc ++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc i386/t-crtstuff" ++ ;; + i[34567]86-*-linux*) # Intel 80386's running GNU/Linux + # with ELF format using glibc 2 + # aka GNU/Linux C library 6 +@@ -1547,6 +1562,16 @@ + gnu_ld=yes + gas=yes + ;; ++mips*-*-linux-uclibc*) # Linux MIPS, either endian. uClibc ++ tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" ++ case ${target} in ++ mipsisa32*-*) ++ target_cpu_default="MASK_SOFT_FLOAT" ++ tm_defines="MIPS_ISA_DEFAULT=32" ++ ;; ++ esac ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc" ++ ;; + mips*-*-linux*) # Linux MIPS, either endian. + tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" + case ${target} in +@@ -1764,6 +1789,10 @@ + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h rs6000/linuxspe.h" + tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" + ;; ++powerpc-*-linux-uclibc*) ++ tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" ++ tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux-uclibc rs6000/t-ppccomm" ++ ;; + powerpc-*-linux*) + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" + tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" +@@ -1916,7 +1945,7 @@ + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/embed-elf.h sh/rtemself.h rtems.h" + ;; + sh-*-linux* | sh[2346lbe]*-*-linux*) +- tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver t-linux" ++ tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver" + case ${target} in + sh*be-*-* | sh*eb-*-*) ;; + *) +@@ -1924,9 +1953,17 @@ + tmake_file="${tmake_file} sh/t-le" + ;; + esac +- tmake_file="${tmake_file} sh/t-linux" ++ case ${target} in ++ *-*-linux-uclibc*) tmake_file="${tmake_file} t-linux-uclibc sh/t-linux-uclibc" ;; ++ *) tmake_file="${tmake_file} t-linux sh/t-linux" ;; ++ esac + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/linux.h" + case ${target} in ++ sh64*-*-linux-uclibc*) ++ tmake_file="${tmake_file} sh/t-sh64-uclibc" ++ tm_file="${tm_file} sh/sh64.h" ++ extra_headers="shmedia.h ushmedia.h sshmedia.h" ++ ;; + sh64*) + tmake_file="${tmake_file} sh/t-sh64" + tm_file="${tm_file} sh/sh64.h" +diff -urN gcc-3.4.1-dist/libtool.m4 gcc-3.4.1/libtool.m4 +--- gcc-3.4.1-dist/libtool.m4 2004-05-18 04:08:37.000000000 -0500 ++++ gcc-3.4.1/libtool.m4 2004-08-12 15:54:43.000000000 -0500 +@@ -689,6 +689,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gcc-3.4.1-dist/ltconfig gcc-3.4.1/ltconfig +--- gcc-3.4.1-dist/ltconfig 2004-03-05 15:05:41.000000000 -0600 ++++ gcc-3.4.1/ltconfig 2004-08-12 15:55:48.000000000 -0500 +@@ -602,6 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in ++linux-uclibc*) ;; + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +@@ -1262,6 +1263,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/gcc/3.4.2/200-uclibc-locale.patch b/openwrt/toolchain/gcc/3.4.2/200-uclibc-locale.patch new file mode 100644 index 0000000000..3fc4900b06 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/200-uclibc-locale.patch @@ -0,0 +1,3246 @@ +diff -urN gcc-3.4.2-dist/libstdc++-v3/acinclude.m4 gcc-3.4.2/libstdc++-v3/acinclude.m4 +--- gcc-3.4.2-dist/libstdc++-v3/acinclude.m4 2004-07-15 12:42:45.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/acinclude.m4 2004-09-10 10:47:40.000000000 -0500 +@@ -996,7 +996,7 @@ + AC_MSG_CHECKING([for C locale to use]) + GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@], + [use MODEL for target locale package], +- [permit generic|gnu|ieee_1003.1-2001|yes|no|auto]) ++ [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto]) + + # If they didn't use this option switch, or if they specified --enable + # with no specific model, we'll have to look for one. If they +@@ -1012,6 +1012,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ x*-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include <features.h> +@@ -1138,6 +1141,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.2-dist/libstdc++-v3/aclocal.m4 gcc-3.4.2/libstdc++-v3/aclocal.m4 +--- gcc-3.4.2-dist/libstdc++-v3/aclocal.m4 2004-08-13 15:44:03.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/aclocal.m4 2004-09-10 10:47:40.000000000 -0500 +@@ -1025,6 +1025,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ x*-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include <features.h> +@@ -1151,6 +1154,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,59 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek <jakub@redhat.com> ++ ++#include <clocale> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#endif // GLIBC 2.3 and later +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,160 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <cerrno> // For errno ++#include <locale> ++#include <stdexcept> ++#include <langinfo.h> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#warning should dummy __newlocale check for C|POSIX ? ++#define __newlocale(a, b, c) NULL ++#define __freelocale(a) ((void)0) ++#define __duplocale(a) __c_locale() ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error(__N("locale::facet::_S_create_c_locale " ++ "name not valid")); ++ } ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++ if (_S_get_c_locale() != __cloc) ++ __freelocale(__cloc); ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++ { return __duplocale(__cloc); } ++} // namespace std ++ ++namespace __gnu_cxx ++{ ++ const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES", ++#if _GLIBCXX_NUM_CATEGORIES != 0 ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} ++ ++namespace std ++{ ++ const char* const* const locale::_S_categories = __gnu_cxx::category_names; ++} // namespace std +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.h 2004-09-10 10:48:08.000000000 -0500 +@@ -0,0 +1,115 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include <cstring> // get std::strlen ++#include <cstdio> // get std::snprintf or std::sprintf ++#include <clocale> ++#include <langinfo.h> // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include <iconv.h> // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include <libintl.h> // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCXX_C_LOCALE_GNU for ++#endif ++#define _GLIBCXX_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCXX_NUM_CATEGORIES 6 ++#define _GLIBCXX_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template<typename _Tv> ++ int ++ __convert_from_v(char* __out, const int __size, const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = std::setlocale(LC_ALL, NULL); ++ char* __sav = new char[std::strlen(__old) + 1]; ++ std::strcpy(__sav, __old); ++ std::setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ std::setlocale(LC_ALL, __sav); ++ delete [] __sav; ++#endif ++ return __ret; ++ } ++} ++ ++#endif +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,306 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // wcsnrtombs is *very* fast but stops if encounters NUL characters: ++ // in case we fall back to wcrtomb and then continue, in a loop. ++ // NB: wcsnrtombs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0', ++ __from_end - __from_next); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ const size_t __conv = wcsnrtombs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // wcrtomb. ++ for (; __from < __from_next; ++__from) ++ __to_next += wcrtomb(__to_next, *__from, &__tmp_state); ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ extern_type __buf[MB_LEN_MAX]; ++ __tmp_state = __state; ++ const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state); ++ if (__conv > static_cast<size_t>(__to_end - __to_next)) ++ __ret = partial; ++ else ++ { ++ memcpy(__to_next, __buf, __conv); ++ __state = __tmp_state; ++ __to_next += __conv; ++ ++__from_next; ++ } ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we store a L'\0' and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from_next, '\0', ++ __from_end ++ - __from_next)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ size_t __conv = mbsnrtowcs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (;; ++__to_next, __from += __conv) ++ { ++ __conv = mbrtowc(__to_next, __from, __from_end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __from_next = __from; ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ // It is unclear what to return in this case (see DR 382). ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ if (__to_next < __to_end) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from_next; ++ *__to_next++ = L'\0'; ++ } ++ else ++ __ret = partial; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_encoding() const throw() ++ { ++ // XXX This implementation assumes that the encoding is ++ // stateless and is either single-byte or variable-width. ++ int __ret = 0; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ if (MB_CUR_MAX == 1) ++ __ret = 1; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_max_length() const throw() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ // XXX Probably wrong for stateful encodings. ++ int __ret = MB_CUR_MAX; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_length(state_type& __state, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { ++ int __ret = 0; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we advance past it and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ ++ // A dummy internal buffer is needed in order for mbsnrtocws to consider ++ // its fourth parameter (it wouldn't with NULL as first parameter). ++ wchar_t* __to = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from, '\0', ++ __end ++ - __from)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __end; ++ ++ const extern_type* __tmp_from = __from; ++ size_t __conv = mbsnrtowcs(__to, &__from, ++ __from_chunk_end - __from, ++ __max, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (__from = __tmp_from;; __from += __conv) ++ { ++ __conv = mbrtowc(NULL, __from, __end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __state = __tmp_state; ++ __ret += __from - __tmp_from; ++ break; ++ } ++ if (!__from) ++ __from = __from_chunk_end; ++ ++ __ret += __from - __tmp_from; ++ __max -= __conv; ++ ++ if (__from < __end && __max) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from; ++ ++__ret; ++ --__max; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/collate_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/collate_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate<char>::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<char>::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ int ++ collate<wchar_t>::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,300 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype<char> specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname<char>::ctype_byname(const char* __s, size_t __refs) ++ : ctype<char>(0, false, __refs) ++ { ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_ctype); ++ this->_S_create_c_locale(this->_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper; ++ this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower; ++ this->_M_table = this->_M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ ctype<wchar_t>::__wmask_type ++ ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = 0; ++ } ++ return __ret; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype<wchar_t>:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__m & _M_bit[__bitcur] ++ && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ { ++ __ret = true; ++ break; ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (; __lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ __m |= _M_bit[__bitcur]; ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype<wchar_t>:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<wchar_t>:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast<unsigned char>(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype<wchar_t>:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++ if (__wc >= 0 && __wc < 128 && _M_narrow_ok) ++ return _M_narrow[__wc]; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ const int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ if (_M_narrow_ok) ++ while (__lo < __hi) ++ { ++ if (*__lo >= 0 && *__lo < 128) ++ *__dest = _M_narrow[*__lo]; ++ else ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype<wchar_t>::_M_initialize_ctype() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wint_t __i; ++ for (__i = 0; __i < 128; ++__i) ++ { ++ const int __c = wctob(__i); ++ if (__c == EOF) ++ break; ++ else ++ _M_narrow[__i] = static_cast<char>(__c); ++ } ++ if (__i == 128) ++ _M_narrow_ok = true; ++ else ++ _M_narrow_ok = false; ++ for (size_t __j = 0; ++ __j < sizeof(_M_widen) / sizeof(wint_t); ++__j) ++ _M_widen[__j] = btowc(__j); ++ ++ for (size_t __k = 0; __k <= 11; ++__k) ++ { ++ _M_bit[__k] = static_cast<mask>(_ISbit(__k)); ++ _M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++#endif // _GLIBCXX_USE_WCHAR_T ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages<char>::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast<const char*>(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ wstring ++ messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++# elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,118 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), ++ _M_name_messages(_S_get_c_name()) ++ { } ++ ++ template<typename _CharT> ++ messages<_CharT>::messages(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)), ++ _M_name_messages(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_messages = __tmp; ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::~messages() ++ { ++ if (_M_name_messages != _S_get_c_name()) ++ delete [] _M_name_messages; ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string<char>& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template<typename _CharT> ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template<typename _CharT> ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++ if (this->_M_name_messages != locale::facet::_S_get_c_name()) ++ delete [] this->_M_name_messages; ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ this->_M_name_messages = __tmp; ++ ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_messages); ++ this->_S_create_c_locale(this->_M_c_locale_messages, __s); ++ } ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,698 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ __ret.field[0] = sign; ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[2] = space; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[1] = space; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ else ++ { ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ default: ++ ; ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == true ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == false ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct<char, true>::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct<char, false>::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ { ++ uc = static_cast<unsigned char>(money_base::_S_atoms[__i]); ++ _M_data->_M_atoms[__i] = btowc(uc); ++ } ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ { ++ uc = static_cast<unsigned char>(money_base::_S_atoms[__i]); ++ _M_data->_M_atoms[__i] = btowc(uc); ++ } ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct<wchar_t, true>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++ ++ template<> ++ moneypunct<wchar_t, false>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,183 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct<char>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, ++ __cloc)); ++ ++ // Check for NULL, which implies no grouping. ++ if (_M_data->_M_thousands_sep == '\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = "true"; ++ _M_data->_M_truename_size = strlen(_M_data->_M_truename); ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = "false"; ++ _M_data->_M_falsename_size = strlen(_M_data->_M_falsename); ++ } ++ ++ template<> ++ numpunct<char>::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<wchar_t>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_get_c_locale()); ++#endif ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ { ++ uc = static_cast<unsigned char>(__num_base::_S_atoms_out[__i]); ++ _M_data->_M_atoms_out[__i] = btowc(uc); ++ } ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ { ++ uc = static_cast<unsigned char>(__num_base::_S_atoms_in[__j]); ++ _M_data->_M_atoms_in[__j] = btowc(uc); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); ++#endif ++ ++ if (_M_data->_M_thousands_sep == L'\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = L"true"; ++ _M_data->_M_truename_size = wcslen(_M_data->_M_truename); ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = L"false"; ++ _M_data->_M_falsename_size = wcslen(_M_data->_M_falsename); ++ } ++ ++ template<> ++ numpunct<wchar_t>::~numpunct() ++ { delete _M_data; } ++ #endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.cc 2004-09-10 10:48:00.000000000 -0500 +@@ -0,0 +1,356 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct<char>:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const size_t __len = __strftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = '\0'; ++ } ++ ++ template<> ++ void ++ __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = "%m/%d/%y"; ++ _M_data->_M_date_era_format = "%m/%d/%y"; ++ _M_data->_M_time_format = "%H:%M:%S"; ++ _M_data->_M_time_era_format = "%H:%M:%S"; ++ _M_data->_M_date_time_format = ""; ++ _M_data->_M_date_time_era_format = ""; ++ _M_data->_M_am = "AM"; ++ _M_data->_M_pm = "PM"; ++ _M_data->_M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = "Sunday"; ++ _M_data->_M_day2 = "Monday"; ++ _M_data->_M_day3 = "Tuesday"; ++ _M_data->_M_day4 = "Wednesday"; ++ _M_data->_M_day5 = "Thursday"; ++ _M_data->_M_day6 = "Friday"; ++ _M_data->_M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = "Sun"; ++ _M_data->_M_aday2 = "Mon"; ++ _M_data->_M_aday3 = "Tue"; ++ _M_data->_M_aday4 = "Wed"; ++ _M_data->_M_aday5 = "Thu"; ++ _M_data->_M_aday6 = "Fri"; ++ _M_data->_M_aday7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = "January"; ++ _M_data->_M_month02 = "February"; ++ _M_data->_M_month03 = "March"; ++ _M_data->_M_month04 = "April"; ++ _M_data->_M_month05 = "May"; ++ _M_data->_M_month06 = "June"; ++ _M_data->_M_month07 = "July"; ++ _M_data->_M_month08 = "August"; ++ _M_data->_M_month09 = "September"; ++ _M_data->_M_month10 = "October"; ++ _M_data->_M_month11 = "November"; ++ _M_data->_M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = "Jan"; ++ _M_data->_M_amonth02 = "Feb"; ++ _M_data->_M_amonth03 = "Mar"; ++ _M_data->_M_amonth04 = "Apr"; ++ _M_data->_M_amonth05 = "May"; ++ _M_data->_M_amonth06 = "Jun"; ++ _M_data->_M_amonth07 = "Jul"; ++ _M_data->_M_amonth08 = "Aug"; ++ _M_data->_M_amonth09 = "Sep"; ++ _M_data->_M_amonth10 = "Oct"; ++ _M_data->_M_amonth11 = "Nov"; ++ _M_data->_M_amonth12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc); ++ _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ __timepunct<wchar_t>:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++ const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = L'\0'; ++ } ++ ++ template<> ++ void ++ __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<wchar_t>; ++ ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = L"%m/%d/%y"; ++ _M_data->_M_date_era_format = L"%m/%d/%y"; ++ _M_data->_M_time_format = L"%H:%M:%S"; ++ _M_data->_M_time_era_format = L"%H:%M:%S"; ++ _M_data->_M_date_time_format = L""; ++ _M_data->_M_date_time_era_format = L""; ++ _M_data->_M_am = L"AM"; ++ _M_data->_M_pm = L"PM"; ++ _M_data->_M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = L"Sunday"; ++ _M_data->_M_day2 = L"Monday"; ++ _M_data->_M_day3 = L"Tuesday"; ++ _M_data->_M_day4 = L"Wednesday"; ++ _M_data->_M_day5 = L"Thursday"; ++ _M_data->_M_day6 = L"Friday"; ++ _M_data->_M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = L"Sun"; ++ _M_data->_M_aday2 = L"Mon"; ++ _M_data->_M_aday3 = L"Tue"; ++ _M_data->_M_aday4 = L"Wed"; ++ _M_data->_M_aday5 = L"Thu"; ++ _M_data->_M_aday6 = L"Fri"; ++ _M_data->_M_aday7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = L"January"; ++ _M_data->_M_month02 = L"February"; ++ _M_data->_M_month03 = L"March"; ++ _M_data->_M_month04 = L"April"; ++ _M_data->_M_month05 = L"May"; ++ _M_data->_M_month06 = L"June"; ++ _M_data->_M_month07 = L"July"; ++ _M_data->_M_month08 = L"August"; ++ _M_data->_M_month09 = L"September"; ++ _M_data->_M_month10 = L"October"; ++ _M_data->_M_month11 = L"November"; ++ _M_data->_M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = L"Jan"; ++ _M_data->_M_amonth02 = L"Feb"; ++ _M_data->_M_amonth03 = L"Mar"; ++ _M_data->_M_amonth04 = L"Apr"; ++ _M_data->_M_amonth05 = L"May"; ++ _M_data->_M_amonth06 = L"Jun"; ++ _M_data->_M_amonth07 = L"Jul"; ++ _M_data->_M_amonth08 = L"Aug"; ++ _M_data->_M_amonth09 = L"Sep"; ++ _M_data->_M_amonth10 = L"Oct"; ++ _M_data->_M_amonth11 = L"Nov"; ++ _M_data->_M_amonth12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_FMT, __cloc)); ++ _M_data->_M_date_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc)); ++ _M_data->_M_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT, __cloc)); ++ _M_data->_M_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc)); ++ _M_data->_M_date_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_T_FMT, __cloc)); ++ _M_data->_M_date_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc)); ++ _M_data->_M_am = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WAM_STR, __cloc)); ++ _M_data->_M_pm = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WPM_STR, __cloc)); ++ _M_data->_M_am_pm_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc)); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_1, __cloc)); ++ _M_data->_M_day2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_2, __cloc)); ++ _M_data->_M_day3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_3, __cloc)); ++ _M_data->_M_day4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_4, __cloc)); ++ _M_data->_M_day5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_5, __cloc)); ++ _M_data->_M_day6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_6, __cloc)); ++ _M_data->_M_day7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_7, __cloc)); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_1, __cloc)); ++ _M_data->_M_aday2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_2, __cloc)); ++ _M_data->_M_aday3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_3, __cloc)); ++ _M_data->_M_aday4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_4, __cloc)); ++ _M_data->_M_aday5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_5, __cloc)); ++ _M_data->_M_aday6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_6, __cloc)); ++ _M_data->_M_aday7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_7, __cloc)); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_1, __cloc)); ++ _M_data->_M_month02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_2, __cloc)); ++ _M_data->_M_month03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_3, __cloc)); ++ _M_data->_M_month04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_4, __cloc)); ++ _M_data->_M_month05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_5, __cloc)); ++ _M_data->_M_month06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_6, __cloc)); ++ _M_data->_M_month07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_7, __cloc)); ++ _M_data->_M_month08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_8, __cloc)); ++ _M_data->_M_month09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_9, __cloc)); ++ _M_data->_M_month10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_10, __cloc)); ++ _M_data->_M_month11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_11, __cloc)); ++ _M_data->_M_month12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_12, __cloc)); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_1, __cloc)); ++ _M_data->_M_amonth02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_2, __cloc)); ++ _M_data->_M_amonth03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_3, __cloc)); ++ _M_data->_M_amonth04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_4, __cloc)); ++ _M_data->_M_amonth05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_5, __cloc)); ++ _M_data->_M_amonth06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_6, __cloc)); ++ _M_data->_M_amonth07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_7, __cloc)); ++ _M_data->_M_amonth08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_8, __cloc)); ++ _M_data->_M_amonth09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_9, __cloc)); ++ _M_data->_M_amonth10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_10, __cloc)); ++ _M_data->_M_amonth11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_11, __cloc)); ++ _M_data->_M_amonth12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_12, __cloc)); ++ } ++#endif // 0 ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,68 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) ++ : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_timepunct = __tmp; ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::~__timepunct() ++ { ++ if (_M_name_timepunct != _S_get_c_name()) ++ delete [] _M_name_timepunct; ++ delete _M_data; ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_base.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_base.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,58 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ ++ // NB: Offsets into ctype<char>::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISalpha | _ISdigit | _ISpunct; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalpha | _ISdigit; ++ }; +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_inline.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_inline.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype<char>:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast<unsigned char>(__c)] & __m; } ++ ++ const char* ++ ctype<char>:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast<unsigned char>(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,92 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype<char>::classic_table() throw() ++ { return __C_ctype_b; } ++ ++ ctype<char>::ctype(__c_locale, const mask* __table, bool __del, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ char ++ ctype<char>::do_toupper(char __c) const ++ { return _M_toupper[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype<char>::do_tolower(char __c) const ++ { return _M_tolower[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/os_defines.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/os_defines.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/os_defines.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,44 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCXX_OS_DEFINES ++#define _GLIBCXX_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include <features.h> ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif +diff -urN gcc-3.4.2-dist/libstdc++-v3/configure gcc-3.4.2/libstdc++-v3/configure +--- gcc-3.4.2-dist/libstdc++-v3/configure 2004-08-13 15:44:04.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/configure 2004-09-10 10:47:40.000000000 -0500 +@@ -3878,6 +3878,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5545,6 +5550,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + cat >conftest.$ac_ext <<_ACEOF + #line $LINENO "configure" +@@ -5759,6 +5767,77 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ echo "$as_me:$LINENO: result: uclibc" >&5 ++echo "${ECHO_T}uclibc" >&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_check_msgfmt+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_check_msgfmt="yes" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt=$ac_cv_prog_check_msgfmt ++if test -n "$check_msgfmt"; then ++ echo "$as_me:$LINENO: result: $check_msgfmt" >&5 ++echo "${ECHO_T}$check_msgfmt" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.2-dist/libstdc++-v3/configure.host gcc-3.4.2/libstdc++-v3/configure.host +--- gcc-3.4.2-dist/libstdc++-v3/configure.host 2004-08-27 14:52:30.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/configure.host 2004-09-10 10:47:40.000000000 -0500 +@@ -217,6 +217,12 @@ + ;; + esac + ++# Override for uClibc since linux-uclibc gets mishandled above. ++case "${host_os}" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; ++esac + + # Set any OS-dependent and CPU-dependent bits. + # THIS TABLE IS SORTED. KEEP IT THAT WAY. +diff -urN gcc-3.4.2-dist/libstdc++-v3/crossconfig.m4 gcc-3.4.2/libstdc++-v3/crossconfig.m4 +--- gcc-3.4.2-dist/libstdc++-v3/crossconfig.m4 2004-07-06 20:23:49.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/crossconfig.m4 2004-09-10 10:47:40.000000000 -0500 +@@ -138,6 +138,99 @@ + ;; + esac + ;; ++ *-uclibc*) ++# Temporary hack until we implement the float versions of the libm funcs ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h float.h endian.h inttypes.h locale.h float.h stdint.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCXX_CHECK_LINKER_FEATURES ++ GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCXX_CHECK_WCHAR_T_SUPPORT ++ ++ # For LFS. ++ AC_DEFINE(HAVE_INT64_T) ++ case "$target" in ++ *-uclinux*) ++ # Don't enable LFS with uClinux ++ ;; ++ *) ++ AC_DEFINE(_GLIBCXX_USE_LFS) ++ esac ++ ++ # For showmanyc_helper(). ++ AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h) ++ GLIBCXX_CHECK_POLL ++ GLIBCXX_CHECK_S_ISREG_OR_S_IFREG ++ ++ # For xsputn_2(). ++ AC_CHECK_HEADERS(sys/uio.h) ++ GLIBCXX_CHECK_WRITEV ++ ++# AC_DEFINE(HAVE_ACOSF) ++# AC_DEFINE(HAVE_ASINF) ++# AC_DEFINE(HAVE_ATANF) ++# AC_DEFINE(HAVE_ATAN2F) ++ AC_DEFINE(HAVE_CEILF) ++ AC_DEFINE(HAVE_COPYSIGN) ++# AC_DEFINE(HAVE_COPYSIGNF) ++# AC_DEFINE(HAVE_COSF) ++# AC_DEFINE(HAVE_COSHF) ++# AC_DEFINE(HAVE_EXPF) ++# AC_DEFINE(HAVE_FABSF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ AC_DEFINE(HAVE_FLOORF) ++# AC_DEFINE(HAVE_FMODF) ++# AC_DEFINE(HAVE_FREXPF) ++ AC_DEFINE(HAVE_HYPOT) ++# AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++# AC_DEFINE(HAVE_LOGF) ++# AC_DEFINE(HAVE_LOG10F) ++# AC_DEFINE(HAVE_MODFF) ++# AC_DEFINE(HAVE_SINF) ++# AC_DEFINE(HAVE_SINHF) ++# AC_DEFINE(HAVE_SINCOS) ++# AC_DEFINE(HAVE_SINCOSF) ++ AC_DEFINE(HAVE_SQRTF) ++# AC_DEFINE(HAVE_TANF) ++# AC_DEFINE(HAVE_TANHF) ++ if test x"long_double_math_on_this_cpu" = x"yes"; then ++ AC_MSG_ERROR([long_double_math_on_this_cpu is yes!]) ++# AC_DEFINE(HAVE_ACOSL) ++# AC_DEFINE(HAVE_ASINL) ++# AC_DEFINE(HAVE_ATANL) ++# AC_DEFINE(HAVE_ATAN2L) ++# AC_DEFINE(HAVE_CEILL) ++# AC_DEFINE(HAVE_COPYSIGNL) ++# AC_DEFINE(HAVE_COSL) ++# AC_DEFINE(HAVE_COSHL) ++# AC_DEFINE(HAVE_EXPL) ++# AC_DEFINE(HAVE_FABSL) ++# AC_DEFINE(HAVE_FINITEL) ++# AC_DEFINE(HAVE_FLOORL) ++# AC_DEFINE(HAVE_FMODL) ++# AC_DEFINE(HAVE_FREXPL) ++# AC_DEFINE(HAVE_HYPOTL) ++# AC_DEFINE(HAVE_ISINFL) ++# AC_DEFINE(HAVE_ISNANL) ++# AC_DEFINE(HAVE_LOGL) ++# AC_DEFINE(HAVE_LOG10L) ++# AC_DEFINE(HAVE_MODFL) ++# AC_DEFINE(HAVE_POWL) ++# AC_DEFINE(HAVE_SINL) ++# AC_DEFINE(HAVE_SINHL) ++# AC_DEFINE(HAVE_SINCOSL) ++# AC_DEFINE(HAVE_SQRTL) ++# AC_DEFINE(HAVE_TANL) ++# AC_DEFINE(HAVE_TANHL) ++ fi ++ ;; + *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu) + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ + machine/endian.h machine/param.h sys/machine.h sys/types.h \ +@@ -152,7 +245,7 @@ + AC_DEFINE(HAVE_INT64_T) + case "$target" in + *-uclinux*) +- # Don't enable LFS with uClibc ++ # Don't enable LFS with uClinux + ;; + *) + AC_DEFINE(_GLIBCXX_USE_LFS) +diff -urN gcc-3.4.2-dist/libstdc++-v3/include/c_compatibility/wchar.h gcc-3.4.2/libstdc++-v3/include/c_compatibility/wchar.h +--- gcc-3.4.2-dist/libstdc++-v3/include/c_compatibility/wchar.h 2003-12-08 21:51:45.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/include/c_compatibility/wchar.h 2004-09-10 10:47:40.000000000 -0500 +@@ -101,7 +101,9 @@ + using std::wmemcpy; + using std::wmemmove; + using std::wmemset; ++#if _GLIBCXX_HAVE_WCSFTIME + using std::wcsftime; ++#endif + + #if _GLIBCXX_USE_C99 + using std::wcstold; +diff -urN gcc-3.4.2-dist/libstdc++-v3/include/c_std/std_cwchar.h gcc-3.4.2/libstdc++-v3/include/c_std/std_cwchar.h +--- gcc-3.4.2-dist/libstdc++-v3/include/c_std/std_cwchar.h 2004-07-20 03:52:12.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/include/c_std/std_cwchar.h 2004-09-10 10:47:40.000000000 -0500 +@@ -179,7 +179,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#if _GLIBCXX_HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; diff --git a/openwrt/toolchain/gcc/3.4.2/300-libstdc++-pic.patch b/openwrt/toolchain/gcc/3.4.2/300-libstdc++-pic.patch new file mode 100644 index 0000000000..c030ba6205 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/300-libstdc++-pic.patch @@ -0,0 +1,47 @@ +# DP: Build and install libstdc++_pic.a library. + +--- gcc/libstdc++-v3/src/Makefile.am~ 2003-02-28 09:21:05.000000000 +0100 ++++ gcc/libstdc++-v3/src/Makefile.am 2003-02-28 09:28:50.000000000 +0100 +@@ -224,6 +224,10 @@ + @OPT_LDFLAGS@ @SECTION_LDFLAGS@ $(AM_CXXFLAGS) $(LDFLAGS) -o $@ + + ++install-exec-local: ++ $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++ + # Added bits to build debug library. + if GLIBCPP_BUILD_DEBUG + all-local: build_debug + +--- gcc/libstdc++-v3/src/Makefile.in~ 2004-02-21 09:55:48.000000000 +0100 ++++ gcc/libstdc++-v3/src/Makefile.in 2004-02-21 09:59:34.000000000 +0100 +@@ -585,7 +585,7 @@ + + install-data-am: install-data-local + +-install-exec-am: install-toolexeclibLTLIBRARIES ++install-exec-am: install-toolexeclibLTLIBRARIES install-exec-local + + install-info: install-info-am + +@@ -618,6 +618,7 @@ + distclean-tags distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-data-local \ + install-exec install-exec-am install-info install-info-am \ ++ install-exec-local \ + install-man install-strip install-toolexeclibLTLIBRARIES \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ +@@ -707,6 +708,11 @@ + install_debug: + (cd ${debugdir} && $(MAKE) \ + toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install) ++ ++install-exec-local: ++ $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++ + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: diff --git a/openwrt/toolchain/gcc/3.4.2/300-pr15526.patch b/openwrt/toolchain/gcc/3.4.2/300-pr15526.patch new file mode 100644 index 0000000000..f01c59f114 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/300-pr15526.patch @@ -0,0 +1,53 @@ +# DP: 2004-09-26 Roger Sayle <roger@eyesopen.com> +# DP: +# DP: PR other/15526 +# DP: Backport from mainline +# DP: 2004-05-20 Falk Hueffner <falk@debian.org> +# DP: * libgcc2.c (__mulvsi3): Fix overflow test. + +diff -u -r1.170.6.1 -r1.170.6.2 +--- gcc/gcc/libgcc2.c 2004/07/17 21:18:47 1.170.6.1 ++++ gcc/gcc/libgcc2.c 2004/09/26 20:47:14 1.170.6.2 +@@ -130,9 +130,7 @@ + { + const DWtype w = (DWtype) a * (DWtype) b; + +- if (((a >= 0) == (b >= 0)) +- ? (UDWtype) w > (UDWtype) (((DWtype) 1 << (WORD_SIZE - 1)) - 1) +- : (UDWtype) w < (UDWtype) ((DWtype) -1 << (WORD_SIZE - 1))) ++ if ((Wtype) (w >> WORD_SIZE) != (Wtype) w >> (WORD_SIZE - 1)) + abort (); + + return w; + +/cvs/gcc/gcc/gcc/testsuite/gcc.dg/ftrapv-1.c,v --> standard output +revision 1.1.22.1 +--- gcc/gcc/testsuite/gcc.dg/ftrapv-1.c ++++ /dev/null 2004-10-15 06:22:06.980596000 +0000 +@@ -0,0 +1,25 @@ ++/* Copyright (C) 2004 Free Software Foundation. ++ ++ PR other/15526 ++ Verify correct overflow checking with -ftrapv. ++ ++ Written by Falk Hueffner, 20th May 2004. */ ++ ++/* { dg-do run } */ ++/* { dg-options "-ftrapv" } */ ++ ++__attribute__((noinline)) int ++mulv(int a, int b) ++{ ++ return a * b; ++} ++ ++int ++main() ++{ ++ mulv( 0, 0); ++ mulv( 0, -1); ++ mulv(-1, 0); ++ mulv(-1, -1); ++ return 0; ++} + diff --git a/openwrt/toolchain/gcc/3.4.2/300-pr17541.patch b/openwrt/toolchain/gcc/3.4.2/300-pr17541.patch new file mode 100644 index 0000000000..ca5fa09abb --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/300-pr17541.patch @@ -0,0 +1,234 @@ +# DP: 2004-09-21 Bud Davis <bdavis9659@comcast.net> +# DP: +# DP: PR fortran/17541 +# DP: * bld.c (ffebld_constant_new_real2_val): Fix typo, +# DP: +# DP: PR fortran/17541 +# DP: * g77.f-torture/execute/pr17541.f: New test. + +Index: gcc/gcc/f/bld.c +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/f/Attic/bld.c,v +retrieving revision 1.16.14.1 +retrieving revision 1.16.14.2 +diff -u -r1.16.14.1 -r1.16.14.2 +--- gcc/gcc/f/bld.c 12 Jul 2004 17:58:36 -0000 1.16.14.1 ++++ gcc/gcc/f/bld.c 21 Sep 2004 12:54:27 -0000 1.16.14.2 +@@ -1333,7 +1333,7 @@ + nc = malloc_new_kp (ffebld_constant_pool(), + "FFEBLD_constREAL2", + sizeof (*nc)); +- nc->consttype = FFEBLD_constREAL1; ++ nc->consttype = FFEBLD_constREAL2; + nc->u.real2 = val; + nc->hook = FFECOM_constantNULL; + nc->llink = NULL; +Index: gcc/gcc/testsuite/g77.f-torture/execute/pr17541.f +=================================================================== +RCS file: gcc/gcc/testsuite/g77.f-torture/execute/pr17541.f +diff -N gcc/gcc/testsuite/g77.f-torture/execute/pr17541.f +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ gcc/gcc/testsuite/g77.f-torture/execute/pr17541.f 21 Sep 2004 12:54:35 -0000 1.1.2.1 +@@ -0,0 +1,202 @@ ++ program test ++ implicit none ++! check all types of data statements ++! pr 17541 ++ real r(2) ++ double precision s(2) ++ integer*1 ib(2) ++ integer*2 ih(2) ++ integer*4 iw(2) ++ integer*8 id(3) ++ logical*1 lb(2) ++ logical*2 lh(2) ++ logical*4 lw(2) ++ logical*8 ld(2) ++ character*1 a(2) ++ character*5 b(2) ++ complex c1(2) ++ complex*8 c2(2) ++ data r / 1.0,2.0 / ++ data s / 2.d0,1.d0/ ++ data ib / 1,-1 / ++ data ih / 2,100/ ++ data iw / 4,3560000 / ++ data id / 8,Z'ABCDEF01',Z'5555AAAA' / ++ data a / 'a', 'z' / ++ data b / 'xyz','abc'/ ++ data c1 /(1.0,2.0),(-1.0,-2.0)/ ++ data c2 /(1.d0,2.d0),(-1.d0,-2.d0)/ ++ data lb / .TRUE.,.FALSE. / ++ data lh / .TRUE.,.FALSE. / ++ data lw / .TRUE.,.FALSE. / ++ data ld / .TRUE.,.FALSE. / ++ logical dbug ++ data dbug /.FALSE./ ++! check the reals first ++ if (r(1).ne.1.0) then ++ if (dbug) then ++ print*,r(1), ' should be 1.0 ' ++ else ++ call abort ++ endif ++ endif ++ if (r(2).ne.2.0) then ++ if (dbug) then ++ print*,r(2), ' should be 2.0 ' ++ else ++ call abort ++ endif ++ endif ++ if (s(1).ne.2.d0) then ++ if (dbug) then ++ print*,s(1), ' xxshould be 2.d0 ' ++ else ++ call abort ++ endif ++ endif ++ if (s(2).ne.1.d0) then ++ if (dbug) then ++ print*,s(2), ' should be 1.d0 ' ++ else ++ call abort ++ endif ++ endif ++! now the integers ++ if (ib(1).ne.1) then ++ if (dbug) then ++ print*,ib(1), ' should be 1 ' ++ else ++ call abort ++ endif ++ endif ++ if (ib(2).ne.-1) then ++ if (dbug) then ++ print*,ib(2), ' should be -1 ' ++ else ++ call abort ++ endif ++ endif ++ if (ih(1).ne.2) then ++ if (dbug) then ++ print*,ih(2), ' should be 2 ' ++ else ++ call abort ++ endif ++ endif ++ if (ih(2).ne.100) then ++ if (dbug) then ++ print*,ih(2), ' should be 100 ' ++ else ++ call abort ++ endif ++ endif ++ if (iw(1).ne.4) then ++ if (dbug) then ++ print*,iw(1), ' should be 4 ' ++ else ++ call abort ++ endif ++ endif ++ if (iw(2).ne.3560000) then ++ if (dbug) then ++ print*,iw(2), ' should be 3560000 ' ++ else ++ call abort ++ endif ++ endif ++ if (id(1).ne.8) then ++ if (dbug) print*,id(1), ' should be 8 ' ++ call abort ++ endif ++ if (id(2).ne.Z'ABCDEF01') then ++ if (dbug) print*,id(2), " should be Z'ABCDEF01' " ++ call abort ++ endif ++ if (id(3).ne.Z'5555AAAA') then ++ if (dbug) print*,id(2), " should be Z'5555AAAA' " ++ call abort ++ endif ++! complex ++ if (c1(1).ne.(1.0,2.0)) then ++ if (dbug) then ++ print*,c1(1), ' should be (1.0,2.0) ' ++ else ++ call abort ++ endif ++ endif ++ if (c1(2).ne.(-1.0,-2.0)) then ++ if (dbug) then ++ print*,c1(2), ' should be (-1.0,-2.0) ' ++ else ++ call abort ++ endif ++ endif ++ if (c2(1).ne.(1.d0,2.d0)) then ++ if (dbug) then ++ print*,c2(1), ' should be (1.0,2.0) ' ++ else ++ call abort ++ endif ++ endif ++ if (c2(2).ne.(-1.d0,-2.d0)) then ++ if (dbug) then ++ print*,c2(2), ' should be (-1.0,-2.0) ' ++ else ++ call abort ++ endif ++ endif ++! character ++ if (a(1).ne.'a') then ++ if (dbug) then ++ print*,a(1), ' should be a ' ++ else ++ call abort ++ endif ++ endif ++ if (b(1).ne.'xyz') then ++ if (dbug) then ++ print*,b(1), ' should be xyz ' ++ else ++ call abort ++ endif ++ endif ++!logicals ++ if (.NOT.lb(1)) then ++ if (dbug) print*,lb(1), ' should be .T. ' ++ call abort ++ endif ++ if (lb(2)) then ++ if (dbug) print*,lb(2), ' should be .F. ' ++ call abort ++ endif ++ if (.NOT.lh(1)) then ++ if (dbug) print*,lh(1), ' should be .T. ' ++ call abort ++ endif ++ if (lh(2)) then ++ if (dbug) print*,lh(2), ' should be .F. ' ++ call abort ++ endif ++ if (.NOT.lw(1)) then ++ if (dbug) print*,lw(1), ' should be .T. ' ++ call abort ++ endif ++ if (lw(2)) then ++ if (dbug) print*,lw(2), ' should be .F. ' ++ call abort ++ endif ++ if (.NOT.ld(1)) then ++ if (dbug) then ++ print*,ld(1), ' should be .T. ' ++ else ++ call abort ++ endif ++ endif ++ if (ld(2)) then ++ if (dbug) then ++ print*,ld(2), ' should be .F. ' ++ else ++ call abort ++ endif ++ endif ++ end diff --git a/openwrt/toolchain/gcc/3.4.2/300-pr17976.patch b/openwrt/toolchain/gcc/3.4.2/300-pr17976.patch new file mode 100644 index 0000000000..78bb3559ff --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/300-pr17976.patch @@ -0,0 +1,106 @@ +From: Mark Mitchell <mark@codesourcery.com> +Sender: gcc-patches-owner@gcc.gnu.org +To: gcc-patches@gcc.gnu.org +Subject: C++ PATCH: PR 17976 +Date: Thu, 14 Oct 2004 21:24:41 -0700 + + +This was a case where we generated multiple destructor calls for the +same global variable, in the (probably rare) situation that an +"extern" declaration followed the definition. + +Tested on i686-pc-linux-gnu, applied on the mainline and on the 3.4 +branch. + +-- +Mark Mitchell +CodeSourcery, LLC +mark@codesourcery.com + +# DP: 2004-10-14 Mark Mitchell <mark@codesourcery.com> +# DP: +# DP: PR c++/17976 +# DP: * decl.c (cp_finish_decl): Do not call expand_static_init more +# DP: than once for a single variable. +# DP: +# DP: 2004-10-14 Mark Mitchell <mark@codesourcery.com> +# DP: +# DP: PR c++/17976 +# DP: * g++.dg/init/dtor3.C: New test. + +Index: testsuite/g++.dg/init/dtor3.C +=================================================================== +RCS file: testsuite/g++.dg/init/dtor3.C +diff -N testsuite/g++.dg/init/dtor3.C +*** /dev/null 1 Jan 1970 00:00:00 -0000 +--- gcc/gcc/testsuite/g++.dg/init/dtor3.C 15 Oct 2004 04:02:22 -0000 +*************** +*** 0 **** +--- 1,21 ---- ++ // PR c++/17976 ++ // { dg-do run } ++ ++ extern "C" void abort(); ++ struct A ++ { ++ static int i; ++ A(){} ++ ~A(){i++;if(i>1)abort();} ++ }; ++ ++ int A::i = 0; ++ ++ A a; ++ extern A a; ++ ++ int main() ++ { ++ return 0; ++ } ++ +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/cp/decl.c,v +retrieving revision 1.1174.2.26 +retrieving revision 1.1174.2.27 +diff -u -r1.1174.2.26 -r1.1174.2.27 +--- gcc/gcc/cp/decl.c 2004/10/10 21:54:59 1.1174.2.26 ++++ gcc/gcc/cp/decl.c 2004/10/15 04:23:46 1.1174.2.27 +@@ -4778,6 +4778,7 @@ + tree cleanup; + const char *asmspec = NULL; + int was_readonly = 0; ++ bool var_definition_p = false; + + if (decl == error_mark_node) + return; +@@ -4930,6 +4931,11 @@ + /* Remember that the initialization for this variable has + taken place. */ + DECL_INITIALIZED_P (decl) = 1; ++ /* This declaration is the definition of this variable, ++ unless we are initializing a static data member within ++ the class specifier. */ ++ if (!DECL_EXTERNAL (decl)) ++ var_definition_p = true; + } + /* If the variable has an array type, lay out the type, even if + there is no initializer. It is valid to index through the +@@ -5004,8 +5010,16 @@ + initialize_local_var (decl, init); + } + +- if (TREE_STATIC (decl)) +- expand_static_init (decl, init); ++ /* If a variable is defined, and then a subsequent ++ definintion with external linkage is encountered, we will ++ get here twice for the same variable. We want to avoid ++ calling expand_static_init more than once. For variables ++ that are not static data members, we can call ++ expand_static_init only when we actually process the ++ initializer. It is not legal to redeclare a static data ++ member, so this issue does not arise in that case. */ ++ if (var_definition_p && TREE_STATIC (decl)) ++ expand_static_init (decl, init); + } + finish_end0: + diff --git a/openwrt/toolchain/gcc/3.4.2/400-mips-pr17565.patch b/openwrt/toolchain/gcc/3.4.2/400-mips-pr17565.patch new file mode 100644 index 0000000000..7ae6aa56f6 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/400-mips-pr17565.patch @@ -0,0 +1,102 @@ +[committed] Fix target/17565: asms in delay slots + + * From: Richard Sandiford <rsandifo at redhat dot com> + * To: gcc-patches at gcc dot gnu dot org + * Date: Mon, 20 Sep 2004 07:55:58 +0100 + * Subject: [committed] Fix target/17565: asms in delay slots + +The MIPS port was allowing asms to be put into delay slots if the +compiler guesses they are only one instruction long. This is wrong +because of the possibility of it containing macros. + +The problem can be reproduced as an assembler warning +in the following testcase: + +int foo (int n) +{ + register int k asm ("$16") = n; + if (k > 0) + { + bar (); + asm ("li %0,0x12345678" : "=r" (k)); + } + return k; +} + +because the multi-instruction asm statement goes into the delay +slot of the call to bar(). + +This is reduced from a much more serious linux problem. Linux is fond +of using empty asm statements, and since gcc estimates empty asms to be +one instruction long, they too might be put into delay slots. This +actually has the effect of putting the following instruction into the +delay slot instead. Since there's no assembler warning, the problem was +only detected as a run-time failure. + +The fix is simple: set the asm value of "can_delay" to "no". +Tested on mipsisa64-elf, applied to mainline. + +This problem goes back to at least 2.95, so it isn't technically a +regression. On the other hand, it's the kind of bug that could trigger +for different types of code in different releases, so I'm sure there's +a testcase that fails (say) in 3.4 and not in 2.95. Will probably ask +Mark for permission to backport to 3.4. + +Richard + + + PR target/17565 + * config/mips/mips.md (define_asm_attributes): Set can_delay to no. + +testsuite/ + * gcc.target/mips/asm-1.c: New test. + +Index: config/mips/mips.md +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/config/mips/mips.md,v +retrieving revision 1.306 +diff -c -p -F^\([(a-zA-Z0-9_]\|#define\) -r1.306 mips.md +*** gcc/gcc/config/mips/mips.md 13 Sep 2004 19:32:05 -0000 1.306 +--- gcc/gcc/config/mips/mips.md 20 Sep 2004 06:52:31 -0000 +*************** (define_attr "may_clobber_hilo" "no,yes" +*** 266,272 **** + + ;; Describe a user's asm statement. + (define_asm_attributes +! [(set_attr "type" "multi")]) + + ;; ......................... + ;; +--- 266,273 ---- + + ;; Describe a user's asm statement. + (define_asm_attributes +! [(set_attr "type" "multi") +! (set_attr "can_delay" "no")]) + + ;; ......................... + ;; +Index: testsuite/gcc.target/mips/asm-1.c +=================================================================== +RCS file: testsuite/gcc.target/mips/asm-1.c +diff -N testsuite/gcc.target/mips/asm-1.c +*** gcc/gcc/testsuite/gcc.target/mips/asm-1.c 1 Jan 1970 00:00:00 -0000 +--- gcc/gcc/testsuite/gcc.target/mips/asm-1.c 20 Sep 2004 06:52:31 -0000 +*************** +*** 0 **** +--- 1,14 ---- ++ /* PR target/17565. GCC used to put the asm into the delay slot ++ of the call. */ ++ /* { dg-do assemble } */ ++ /* { dg-options "-O" } */ ++ int foo (int n) ++ { ++ register int k asm ("$16") = n; ++ if (k > 0) ++ { ++ bar (); ++ asm ("li %0,0x12345678" : "=r" (k)); ++ } ++ return k; ++ } + diff --git a/openwrt/toolchain/gcc/3.4.2/401-ppc-eabi-typo.patch b/openwrt/toolchain/gcc/3.4.2/401-ppc-eabi-typo.patch new file mode 100644 index 0000000000..dbb856868d --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/401-ppc-eabi-typo.patch @@ -0,0 +1,20 @@ +revision 1.12 +date: 2004/07/16 15:13:40; author: segher; state: Exp; lines: +1 -1 + * config/rs6000/eabi.asm (__eabi_convert): Fix typo (cmpi vs. cmpwi). +Index: gcc/config/rs6000/eabi.asm +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/config/rs6000/eabi.asm,v +retrieving revision 1.11 +retrieving revision 1.12 +diff -u -b -B -w -p -r1.11 -r1.12 +--- gcc/gcc/config/rs6000/eabi.asm 20 Sep 2002 23:46:58 -0000 1.11 ++++ gcc/gcc/config/rs6000/eabi.asm 16 Jul 2004 15:13:40 -0000 1.12 +@@ -252,7 +252,7 @@ FUNC_START(__eabi_convert) + + .Lcvt: + lwzu 6,4(3) /* pointer to convert */ +- cmpi 0,6,0 ++ cmpwi 0,6,0 + beq- .Lcvt2 /* if pointer is null, don't convert */ + + add 6,6,12 /* convert pointer */ diff --git a/openwrt/toolchain/gcc/3.4.2/402-mips-pr17770.patch b/openwrt/toolchain/gcc/3.4.2/402-mips-pr17770.patch new file mode 100644 index 0000000000..87d603023c --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/402-mips-pr17770.patch @@ -0,0 +1,12 @@ +--- gcc-3.4.2/gcc/config/mips/mips.md 2004-06-25 02:35:30.000000000 -0500 ++++ gcc-3.4-cvs/gcc/config/mips/mips.md 2004-10-26 01:54:56.000000000 -0500 +@@ -4073,8 +4073,7 @@ + "!TARGET_MIPS16" + "lwl\t%0,%2" + [(set_attr "type" "load") +- (set_attr "mode" "SI") +- (set_attr "hazard" "none")]) ++ (set_attr "mode" "SI")]) + + (define_insn "mov_lwr" + [(set (match_operand:SI 0 "register_operand" "=d") diff --git a/openwrt/toolchain/gcc/3.4.2/600-gcc34-arm-ldm-peephole.patch b/openwrt/toolchain/gcc/3.4.2/600-gcc34-arm-ldm-peephole.patch new file mode 100644 index 0000000000..fb317e1537 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/600-gcc34-arm-ldm-peephole.patch @@ -0,0 +1,79 @@ +--- gcc-3.4.0/gcc/config/arm/arm.md.arm-ldm-peephole 2004-01-13 08:24:37.000000000 -0500 ++++ gcc-3.4.0/gcc/config/arm/arm.md 2004-04-24 18:18:04.000000000 -0400 +@@ -8810,13 +8810,16 @@ + (set_attr "length" "4,8,8")] + ) + ++; Try to convert LDR+LDR+arith into [add+]LDM+arith ++; On XScale, LDM is always slower than two LDRs, so only do this if ++; optimising for size. + (define_insn "*arith_adjacentmem" + [(set (match_operand:SI 0 "s_register_operand" "=r") + (match_operator:SI 1 "shiftable_operator" + [(match_operand:SI 2 "memory_operand" "m") + (match_operand:SI 3 "memory_operand" "m")])) + (clobber (match_scratch:SI 4 "=r"))] +- "TARGET_ARM && adjacent_mem_locations (operands[2], operands[3])" ++ "TARGET_ARM && (!arm_tune_xscale || optimize_size) && adjacent_mem_locations (operands[2], operands[3])" + "* + { + rtx ldm[3]; +@@ -8851,6 +8854,8 @@ + } + if (val1 && val2) + { ++ /* This would be a loss on a Harvard core, but adjacent_mem_locations() ++ will prevent it from happening. */ + rtx ops[3]; + ldm[0] = ops[0] = operands[4]; + ops[1] = XEXP (XEXP (operands[2], 0), 0); +--- gcc-3.4.0/gcc/config/arm/arm.c.arm-ldm-peephole 2004-04-24 18:16:25.000000000 -0400 ++++ gcc-3.4.0/gcc/config/arm/arm.c 2004-04-24 18:18:04.000000000 -0400 +@@ -4593,8 +4593,11 @@ + arith_adjacentmem pattern to output an overlong sequence. */ + if (!const_ok_for_op (PLUS, val0) || !const_ok_for_op (PLUS, val1)) + return 0; +- +- return (reg0 == reg1) && ((val1 - val0) == 4 || (val0 - val1) == 4); ++ ++ /* For Harvard cores, only accept pairs where one offset is zero. ++ See comment in load_multiple_sequence. */ ++ return (reg0 == reg1) && ((val1 - val0) == 4 || (val0 - val1) == 4) ++ && (!arm_ld_sched || val0 == 0 || val1 == 0); + } + return 0; + } +@@ -4838,6 +4841,11 @@ + *load_offset = unsorted_offsets[order[0]]; + } + ++ /* For XScale a two-word LDM is a performance loss, so only do this if ++ size is more important. See comments in arm_gen_load_multiple. */ ++ if (nops == 2 && arm_tune_xscale && !optimize_size) ++ return 0; ++ + if (unsorted_offsets[order[0]] == 0) + return 1; /* ldmia */ + +@@ -5064,6 +5072,11 @@ + *load_offset = unsorted_offsets[order[0]]; + } + ++ /* For XScale a two-word LDM is a performance loss, so only do this if ++ size is more important. See comments in arm_gen_load_multiple. */ ++ if (nops == 2 && arm_tune_xscale && !optimize_size) ++ return 0; ++ + if (unsorted_offsets[order[0]] == 0) + return 1; /* stmia */ + +--- gcc-3.4.0/gcc/genpeep.c.arm-ldm-peephole 2003-07-05 01:27:22.000000000 -0400 ++++ gcc-3.4.0/gcc/genpeep.c 2004-04-24 18:18:04.000000000 -0400 +@@ -381,6 +381,7 @@ + printf ("#include \"recog.h\"\n"); + printf ("#include \"except.h\"\n\n"); + printf ("#include \"function.h\"\n\n"); ++ printf ("#include \"flags.h\"\n\n"); + + printf ("#ifdef HAVE_peephole\n"); + printf ("extern rtx peep_operand[];\n\n"); diff --git a/openwrt/toolchain/gcc/3.4.2/601-gcc34-arm-ldm.patch b/openwrt/toolchain/gcc/3.4.2/601-gcc34-arm-ldm.patch new file mode 100644 index 0000000000..142052fdf0 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/601-gcc34-arm-ldm.patch @@ -0,0 +1,119 @@ +--- gcc-3.4.0/gcc/config/arm/arm.c.arm-ldm 2004-02-27 09:51:05.000000000 -0500 ++++ gcc-3.4.0/gcc/config/arm/arm.c 2004-04-24 18:16:25.000000000 -0400 +@@ -8520,6 +8520,26 @@ + return_used_this_function = 0; + } + ++/* Return the number (counting from 0) of ++ the least significant set bit in MASK. */ ++ ++#ifdef __GNUC__ ++inline ++#endif ++static int ++number_of_first_bit_set (mask) ++ int mask; ++{ ++ int bit; ++ ++ for (bit = 0; ++ (mask & (1 << bit)) == 0; ++ ++bit) ++ continue; ++ ++ return bit; ++} ++ + const char * + arm_output_epilogue (rtx sibling) + { +@@ -8753,27 +8773,47 @@ + saved_regs_mask |= (1 << PC_REGNUM); + } + +- /* Load the registers off the stack. If we only have one register +- to load use the LDR instruction - it is faster. */ +- if (saved_regs_mask == (1 << LR_REGNUM)) +- { +- /* The exception handler ignores the LR, so we do +- not really need to load it off the stack. */ +- if (eh_ofs) +- asm_fprintf (f, "\tadd\t%r, %r, #4\n", SP_REGNUM, SP_REGNUM); +- else +- asm_fprintf (f, "\tldr\t%r, [%r], #4\n", LR_REGNUM, SP_REGNUM); +- } +- else if (saved_regs_mask) ++ if (saved_regs_mask) + { +- if (saved_regs_mask & (1 << SP_REGNUM)) +- /* Note - write back to the stack register is not enabled +- (ie "ldmfd sp!..."). We know that the stack pointer is +- in the list of registers and if we add writeback the +- instruction becomes UNPREDICTABLE. */ +- print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask); ++ /* Load the registers off the stack. If we only have one register ++ to load use the LDR instruction - it is faster. */ ++ if (bit_count (saved_regs_mask) == 1) ++ { ++ int reg = number_of_first_bit_set (saved_regs_mask); ++ ++ switch (reg) ++ { ++ case SP_REGNUM: ++ /* Mustn't use base writeback when loading SP. */ ++ asm_fprintf (f, "\tldr\t%r, [%r]\n", SP_REGNUM, SP_REGNUM); ++ break; ++ ++ case LR_REGNUM: ++ if (eh_ofs) ++ { ++ /* The exception handler ignores the LR, so we do ++ not really need to load it off the stack. */ ++ asm_fprintf (f, "\tadd\t%r, %r, #4\n", SP_REGNUM, SP_REGNUM); ++ break; ++ } ++ /* else fall through */ ++ ++ default: ++ asm_fprintf (f, "\tldr\t%r, [%r], #4\n", reg, SP_REGNUM); ++ break; ++ } ++ } + else +- print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask); ++ { ++ if (saved_regs_mask & (1 << SP_REGNUM)) ++ /* Note - write back to the stack register is not enabled ++ (ie "ldmfd sp!..."). We know that the stack pointer is ++ in the list of registers and if we add writeback the ++ instruction becomes UNPREDICTABLE. */ ++ print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask); ++ else ++ print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask); ++ } + } + + if (current_function_pretend_args_size) +@@ -11401,22 +11441,6 @@ + } + } + +-/* Return the number (counting from 0) of +- the least significant set bit in MASK. */ +- +-inline static int +-number_of_first_bit_set (int mask) +-{ +- int bit; +- +- for (bit = 0; +- (mask & (1 << bit)) == 0; +- ++bit) +- continue; +- +- return bit; +-} +- + /* Generate code to return from a thumb function. + If 'reg_containing_return_addr' is -1, then the return address is + actually on the stack, at the stack pointer. */ diff --git a/openwrt/toolchain/gcc/3.4.2/602-sdk-libstdc++-includes.patch b/openwrt/toolchain/gcc/3.4.2/602-sdk-libstdc++-includes.patch new file mode 100644 index 0000000000..4377c2143b --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/602-sdk-libstdc++-includes.patch @@ -0,0 +1,22 @@ +--- gcc-3.4.1/libstdc++-v3/libmath/Makefile.am~ 2003-08-27 22:29:42.000000000 +0100 ++++ gcc-3.4.1/libstdc++-v3/libmath/Makefile.am 2004-07-22 16:41:45.152130128 +0100 +@@ -32,7 +32,7 @@ + + libmath_la_SOURCES = stubs.c + +-AM_CPPFLAGS = $(CANADIAN_INCLUDES) ++AM_CPPFLAGS = $(CANADIAN_INCLUDES) -I$(toplevel_srcdir)/include + + # Only compiling "C" sources in this directory. + LIBTOOL = @LIBTOOL@ --tag CC +--- gcc-3.4.1/libstdc++-v3/fragment.am.old 2004-07-22 18:24:58.024083656 +0100 ++++ gcc-3.4.1/libstdc++-v3/fragment.am 2004-07-22 18:24:59.019932264 +0100 +@@ -18,7 +18,7 @@ + $(WARN_FLAGS) $(WERROR) -fdiagnostics-show-location=once + + # -I/-D flags to pass when compiling. +-AM_CPPFLAGS = $(GLIBCXX_INCLUDES) ++AM_CPPFLAGS = $(GLIBCXX_INCLUDES) -I$(toplevel_srcdir)/include + + + diff --git a/openwrt/toolchain/gcc/3.4.2/700-pr15068-fix.patch b/openwrt/toolchain/gcc/3.4.2/700-pr15068-fix.patch new file mode 100644 index 0000000000..2977765c5f --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/700-pr15068-fix.patch @@ -0,0 +1,44 @@ +See http://gcc.gnu.org/PR15068 + +Fixes error + +../sysdeps/generic/s_fmax.c: In function `__fmax': +../sysdeps/generic/s_fmax.c:28: internal compiler error: in elim_reg_cond, at flow.c:3257 +Please submit a full bug report, +with preprocessed source if appropriate. +See <URL:http://gcc.gnu.org/bugs.html> for instructions. +make[2]: *** [/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/build-glibc/math/s_fmax.o] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822/math' +make[1]: *** [math/others] Error 2 +make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822' +make: *** [all] Error 2 + +[ rediffed against gcc-3.4.1, with elbow grease, ending up with same thing as +http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/flow.c.diff?cvsroot=gcc&only_with_tag=csl-arm-branch&r1=1.563.4.2&r2=1.563.4.3 ] + +--- gcc-3.4.1/gcc/flow.c.old 2004-02-27 19:39:19.000000000 -0800 ++++ gcc-3.4.1/gcc/flow.c 2004-08-26 07:29:46.000000000 -0700 +@@ -1878,6 +1878,7 @@ + rtx set_src = SET_SRC (pc_set (BB_END (bb))); + rtx cond_true = XEXP (set_src, 0); + rtx reg = XEXP (cond_true, 0); ++ enum rtx_code inv_cond; + + if (GET_CODE (reg) == SUBREG) + reg = SUBREG_REG (reg); +@@ -1886,11 +1887,13 @@ + in the form of a comparison of a register against zero. + If the condition is more complex than that, then it is safe + not to record any information. */ +- if (GET_CODE (reg) == REG ++ inv_cond = reversed_comparison_code (cond_true, BB_END (bb)); ++ if (inv_cond != UNKNOWN ++ && GET_CODE (reg) == REG + && XEXP (cond_true, 1) == const0_rtx) + { + rtx cond_false +- = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond_true)), ++ = gen_rtx_fmt_ee (inv_cond, + GET_MODE (cond_true), XEXP (cond_true, 0), + XEXP (cond_true, 1)); + if (GET_CODE (XEXP (set_src, 1)) == PC) diff --git a/openwrt/toolchain/gcc/3.4.2/800-arm-bigendian.patch b/openwrt/toolchain/gcc/3.4.2/800-arm-bigendian.patch new file mode 100644 index 0000000000..0bae8f474c --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/800-arm-bigendian.patch @@ -0,0 +1,70 @@ +By Lennert Buytenhek <buytenh@wantstofly.org> +Adds support for arm*b-linux* big-endian ARM targets + +See http://gcc.gnu.org/PR16350 + +diff -urN gcc-3.4.1-dist/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-08-16 16:01:50.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-16 15:43:40.000000000 -0500 +@@ -30,17 +30,34 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + /* Default is to use APCS-32 mode. */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 | \ ++ ARM_FLAG_MMU_TRAPS | \ ++ TARGET_ENDIAN_DEFAULT ) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -101,7 +118,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + #endif + +diff -urN gcc-3.4.1-dist/gcc/config.gcc gcc-3.4.1/gcc/config.gcc +--- gcc-3.4.1-dist/gcc/config.gcc 2004-08-16 16:01:50.000000000 -0500 ++++ gcc-3.4.1/gcc/config.gcc 2004-08-16 16:01:25.000000000 -0500 +@@ -672,6 +672,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/openwrt/toolchain/gcc/3.4.2/810-arm-bigendian-uclibc.patch b/openwrt/toolchain/gcc/3.4.2/810-arm-bigendian-uclibc.patch new file mode 100644 index 0000000000..a4d87e2317 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/810-arm-bigendian-uclibc.patch @@ -0,0 +1,27 @@ +diff -urN gcc-3.4.1-dist/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-08-16 16:08:18.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-16 16:06:24.000000000 -0500 +@@ -107,7 +107,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + #else + #define LINK_SPEC "%{h*} %{version:-v} \ +diff -urN gcc-3.4.1-dist/gcc/config.gcc gcc-3.4.1/gcc/config.gcc +--- gcc-3.4.1-dist/gcc/config.gcc 2004-08-16 16:08:18.000000000 -0500 ++++ gcc-3.4.1/gcc/config.gcc 2004-08-16 16:03:25.000000000 -0500 +@@ -666,6 +666,11 @@ + ;; + arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/openwrt/toolchain/gcc/3.4.2/arm-softfloat.patch.conditional b/openwrt/toolchain/gcc/3.4.2/arm-softfloat.patch.conditional new file mode 100644 index 0000000000..19d1b90dac --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.2/arm-softfloat.patch.conditional @@ -0,0 +1,270 @@ +Note... modified my mjn3 to not conflict with the big endian arm patch. +Warning!!! Only the linux target is aware of TARGET_ENDIAN_DEFAULT. +Also changed + #define SUBTARGET_EXTRA_ASM_SPEC "\ + %{!mcpu=*:-mcpu=xscale} \ + %{mhard-float:-mfpu=fpa} \ + %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" +to + #define SUBTARGET_EXTRA_ASM_SPEC "\ + %{mhard-float:-mfpu=fpa} \ + %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" +in gcc/config/arm/linux-elf.h. +# +# Submitted: +# +# Dimitry Andric <dimitry@andric.com>, 2004-05-01 +# +# Description: +# +# Nicholas Pitre released this patch for gcc soft-float support here: +# http://lists.arm.linux.org.uk/pipermail/linux-arm/2003-October/006436.html +# +# This version has been adapted to work with gcc 3.4.0. +# +# The original patch doesn't distinguish between softfpa and softvfp modes +# in the way Nicholas Pitre probably meant. His description is: +# +# "Default is to use APCS-32 mode with soft-vfp. The old Linux default for +# floats can be achieved with -mhard-float or with the configure +# --with-float=hard option. If -msoft-float or --with-float=soft is used then +# software float support will be used just like the default but with the legacy +# big endian word ordering for double float representation instead." +# +# Which means the following: +# +# * If you compile without -mhard-float or -msoft-float, you should get +# software floating point, using the VFP format. The produced object file +# should have these flags in its header: +# +# private flags = 600: [APCS-32] [VFP float format] [software FP] +# +# * If you compile with -mhard-float, you should get hardware floating point, +# which always uses the FPA format. Object file header flags should be: +# +# private flags = 0: [APCS-32] [FPA float format] +# +# * If you compile with -msoft-float, you should get software floating point, +# using the FPA format. This is done for compatibility reasons with many +# existing distributions. Object file header flags should be: +# +# private flags = 200: [APCS-32] [FPA float format] [software FP] +# +# The original patch from Nicholas Pitre contained the following constructs: +# +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +# %{mhard-float:-mfpu=fpa} \ +# %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" +# +# However, gcc doesn't accept this ";:" notation, used in the 3rd line. This +# is probably the reason Robert Schwebel modified it to: +# +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +# %{mhard-float:-mfpu=fpa} \ +# %{!mhard-float: %{msoft-float:-mfpu=softfpa -mfpu=softvfp}}" +# +# But this causes the following behaviour: +# +# * If you compile without -mhard-float or -msoft-float, the compiler generates +# software floating point instructions, but *nothing* is passed to the +# assembler, which results in an object file which has flags: +# +# private flags = 0: [APCS-32] [FPA float format] +# +# This is not correct! +# +# * If you compile with -mhard-float, the compiler generates hardware floating +# point instructions, and passes "-mfpu=fpa" to the assembler, which results +# in an object file which has the same flags as in the previous item, but now +# those *are* correct. +# +# * If you compile with -msoft-float, the compiler generates software floating +# point instructions, and passes "-mfpu=softfpa -mfpu=softvfp" (in that +# order) to the assembler, which results in an object file with flags: +# +# private flags = 600: [APCS-32] [VFP float format] [software FP] +# +# This is not correct, because the last "-mfpu=" option on the assembler +# command line determines the actual FPU convention used (which should be FPA +# in this case). +# +# Therefore, I modified this patch to get the desired behaviour. Every +# instance of the notation: +# +# %{msoft-float:-mfpu=softfpa -mfpu=softvfp} +# +# was changed to: +# +# %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp} +# +# I also did the following: +# +# * Modified all TARGET_DEFAULT macros I could find to include ARM_FLAG_VFP, to +# be consistent with Nicholas' original patch. +# * Removed any "msoft-float" or "mhard-float" from all MULTILIB_DEFAULTS +# macros I could find. I think that if you compile without any options, you +# would like to get the defaults. :) +# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed +# anymore. (The required functions are now in libgcc.) + +diff -urN gcc-3.4.1-old/gcc/config/arm/coff.h gcc-3.4.1/gcc/config/arm/coff.h +--- gcc-3.4.1-old/gcc/config/arm/coff.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/coff.h 2004-09-02 21:51:15.000000000 -0500 +@@ -31,11 +31,16 @@ + #define TARGET_VERSION fputs (" (ARM/coff)", stderr) + + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" } + #endif + + /* This is COFF, but prefer stabs. */ +diff -urN gcc-3.4.1-old/gcc/config/arm/elf.h gcc-3.4.1/gcc/config/arm/elf.h +--- gcc-3.4.1-old/gcc/config/arm/elf.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -46,7 +46,9 @@ + + #ifndef SUBTARGET_ASM_FLOAT_SPEC + #define SUBTARGET_ASM_FLOAT_SPEC "\ +-%{mapcs-float:-mfloat} %{msoft-float:-mfpu=softfpa}" ++%{mapcs-float:-mfloat} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + #endif + + #ifndef ASM_SPEC +@@ -106,12 +108,17 @@ + #endif + + #ifndef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + #endif + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } + #endif + + #define TARGET_ASM_FILE_START_APP_OFF true +diff -urN gcc-3.4.1-old/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-old/gcc/config/arm/linux-elf.h 2004-09-02 21:50:52.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-09-02 22:00:49.000000000 -0500 +@@ -44,12 +44,26 @@ + #define TARGET_LINKER_EMULATION "armelf_linux" + #endif + +-/* Default is to use APCS-32 mode. */ ++/* ++ * Default is to use APCS-32 mode with soft-vfp. ++ * The old Linux default for floats can be achieved with -mhard-float ++ * or with the configure --with-float=hard option. ++ * If -msoft-float or --with-float=soft is used then software float ++ * support will be used just like the default but with the legacy ++ * big endian word ordering for double float representation instead. ++ */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT \ +- ( ARM_FLAG_APCS_32 | \ +- ARM_FLAG_MMU_TRAPS | \ +- TARGET_ENDIAN_DEFAULT ) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_SOFT_FLOAT \ ++ | TARGET_ENDIAN_DEFAULT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_MMU_TRAPS ) ++ ++#undef SUBTARGET_EXTRA_ASM_SPEC ++#define SUBTARGET_EXTRA_ASM_SPEC "\ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +@@ -57,7 +71,7 @@ + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -72,7 +86,7 @@ + %{shared:-lc} \ + %{!shared:%{profile:-lc_p}%{!profile:-lc}}" + +-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc" ++#define LIBGCC_SPEC "-lgcc" + + /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add + the GNU/Linux magical crtbegin.o file (see crtstuff.c) which +diff -urN gcc-3.4.1-old/gcc/config/arm/t-linux gcc-3.4.1/gcc/config/arm/t-linux +--- gcc-3.4.1-old/gcc/config/arm/t-linux 2003-09-20 16:09:07.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/t-linux 2004-09-02 21:51:15.000000000 -0500 +@@ -4,7 +4,10 @@ + LIBGCC2_DEBUG_CFLAGS = -g0 + + LIB1ASMSRC = arm/lib1funcs.asm +-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx ++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ ++ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ ++ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ ++ _fixsfsi _fixunssfsi + + # MULTILIB_OPTIONS = mhard-float/msoft-float + # MULTILIB_DIRNAMES = hard-float soft-float +diff -urN gcc-3.4.1-old/gcc/config/arm/unknown-elf.h gcc-3.4.1/gcc/config/arm/unknown-elf.h +--- gcc-3.4.1-old/gcc/config/arm/unknown-elf.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/unknown-elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -30,7 +30,12 @@ + + /* Default to using APCS-32 and software floating point. */ + #ifndef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + #endif + + /* Now we define the strings used to build the spec file. */ +diff -urN gcc-3.4.1-old/gcc/config/arm/xscale-elf.h gcc-3.4.1/gcc/config/arm/xscale-elf.h +--- gcc-3.4.1-old/gcc/config/arm/xscale-elf.h 2003-07-01 18:26:43.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/xscale-elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -49,11 +49,12 @@ + endian, regardless of the endian-ness of the memory + system. */ + +-#define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +- %{mhard-float:-mfpu=fpa} \ +- %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" ++#define SUBTARGET_EXTRA_ASM_SPEC "\ ++%{!mcpu=*:-mcpu=xscale} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "mlittle-endian", "mno-thumb-interwork", "marm", "msoft-float" } ++ { "mlittle-endian", "mno-thumb-interwork", "marm" } + #endif diff --git a/openwrt/toolchain/gcc/3.4.3/100-uclibc-conf.patch b/openwrt/toolchain/gcc/3.4.3/100-uclibc-conf.patch new file mode 100644 index 0000000000..29e4c802e2 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/100-uclibc-conf.patch @@ -0,0 +1,442 @@ +diff -urN gcc-3.4.1-dist/boehm-gc/configure gcc-3.4.1/boehm-gc/configure +--- gcc-3.4.1-dist/boehm-gc/configure 2004-07-01 14:14:03.000000000 -0500 ++++ gcc-3.4.1/boehm-gc/configure 2004-08-12 16:22:57.000000000 -0500 +@@ -1947,6 +1947,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN gcc-3.4.1-dist/boehm-gc/ltconfig gcc-3.4.1/boehm-gc/ltconfig +--- gcc-3.4.1-dist/boehm-gc/ltconfig 2002-11-20 09:59:06.000000000 -0600 ++++ gcc-3.4.1/boehm-gc/ltconfig 2004-08-12 15:54:42.000000000 -0500 +@@ -1981,6 +1981,23 @@ + fi + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ++ file_magic_cmd=/usr/bin/file ++ file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + version_type=sunos + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then +diff -urN gcc-3.4.1-dist/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-01-31 00:18:11.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-12 15:54:42.000000000 -0500 +@@ -81,6 +81,18 @@ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC "%{h*} %{version:-v} \ ++ %{b} %{Wl,*:%*} \ ++ %{static:-Bstatic} \ ++ %{shared:-shared} \ ++ %{symbolic:-Bsymbolic} \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ ++ -X \ ++ %{mbig-endian:-EB}" \ ++ SUBTARGET_EXTRA_LINK_SPEC ++#else + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ +@@ -91,6 +103,7 @@ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC ++#endif + + #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS() + +diff -urN gcc-3.4.1-dist/gcc/config/cris/linux.h gcc-3.4.1/gcc/config/cris/linux.h +--- gcc-3.4.1-dist/gcc/config/cris/linux.h 2003-11-28 21:08:09.000000000 -0600 ++++ gcc-3.4.1/gcc/config/cris/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -79,6 +79,25 @@ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -93,6 +112,8 @@ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +diff -urN gcc-3.4.1-dist/gcc/config/cris/t-linux-uclibc gcc-3.4.1/gcc/config/cris/t-linux-uclibc +--- gcc-3.4.1-dist/gcc/config/cris/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/cris/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,3 @@ ++T_CFLAGS = -DUSE_UCLIBC ++TARGET_LIBGCC2_CFLAGS += -fPIC ++CRTSTUFF_T_CFLAGS_S = $(TARGET_LIBGCC2_CFLAGS) +diff -urN gcc-3.4.1-dist/gcc/config/i386/linux.h gcc-3.4.1/gcc/config/i386/linux.h +--- gcc-3.4.1-dist/gcc/config/i386/linux.h 2003-11-28 21:08:10.000000000 -0600 ++++ gcc-3.4.1/gcc/config/i386/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -118,6 +118,15 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.1}} \ + %{static:-static}}}" + #else ++#if defined USE_UCLIBC ++#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ +@@ -126,6 +135,7 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}}}" + #endif ++#endif + + /* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named +diff -urN gcc-3.4.1-dist/gcc/config/mips/linux.h gcc-3.4.1/gcc/config/mips/linux.h +--- gcc-3.4.1-dist/gcc/config/mips/linux.h 2004-06-15 20:42:24.000000000 -0500 ++++ gcc-3.4.1/gcc/config/mips/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -109,6 +109,17 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define LINK_SPEC \ ++ "%(endian_spec) \ ++ %{shared:-shared} \ ++ %{!shared: \ ++ %{!ibcs: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}}}" ++#else + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ +@@ -118,6 +129,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ + %{static:-static}}}" ++#endif + + #undef SUBTARGET_ASM_SPEC + #define SUBTARGET_ASM_SPEC "\ +diff -urN gcc-3.4.1-dist/gcc/config/rs6000/linux.h gcc-3.4.1/gcc/config/rs6000/linux.h +--- gcc-3.4.1-dist/gcc/config/rs6000/linux.h 2004-02-25 09:11:19.000000000 -0600 ++++ gcc-3.4.1/gcc/config/rs6000/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -61,7 +61,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #define LINK_GCC_C_SEQUENCE_SPEC \ + "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" +diff -urN gcc-3.4.1-dist/gcc/config/rs6000/sysv4.h gcc-3.4.1/gcc/config/rs6000/sysv4.h +--- gcc-3.4.1-dist/gcc/config/rs6000/sysv4.h 2004-06-10 01:39:50.000000000 -0500 ++++ gcc-3.4.1/gcc/config/rs6000/sysv4.h 2004-08-12 15:54:43.000000000 -0500 +@@ -947,6 +947,7 @@ + mcall-linux : %(link_os_linux) ; \ + mcall-gnu : %(link_os_gnu) ; \ + mcall-netbsd : %(link_os_netbsd) ; \ ++ mcall-linux-uclibc : %(link_os_linux_uclibc); \ + mcall-openbsd: %(link_os_openbsd) ; \ + : %(link_os_default) }" + +@@ -1124,6 +1125,10 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}" + ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + #if defined(HAVE_LD_EH_FRAME_HDR) + # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " + #endif +@@ -1290,6 +1295,7 @@ + { "link_os_sim", LINK_OS_SIM_SPEC }, \ + { "link_os_freebsd", LINK_OS_FREEBSD_SPEC }, \ + { "link_os_linux", LINK_OS_LINUX_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_gnu", LINK_OS_GNU_SPEC }, \ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_openbsd", LINK_OS_OPENBSD_SPEC }, \ +diff -urN gcc-3.4.1-dist/gcc/config/sh/linux.h gcc-3.4.1/gcc/config/sh/linux.h +--- gcc-3.4.1-dist/gcc/config/sh/linux.h 2004-01-11 20:29:13.000000000 -0600 ++++ gcc-3.4.1/gcc/config/sh/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -73,12 +73,21 @@ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define SUBTARGET_LINK_SPEC \ ++ "%{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}" ++#else + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}" ++#endif + + #undef LIB_SPEC + #define LIB_SPEC \ +diff -urN gcc-3.4.1-dist/gcc/config/sh/t-linux-uclibc gcc-3.4.1/gcc/config/sh/t-linux-uclibc +--- gcc-3.4.1-dist/gcc/config/sh/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/sh/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,13 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++TARGET_LIBGCC2_CFLAGS = -fpic -DNO_FPSCR_VALUES ++LIB1ASMFUNCS_CACHE = _ic_invalidate ++ ++LIB2FUNCS_EXTRA= ++ ++MULTILIB_OPTIONS= $(MULTILIB_ENDIAN) m3e/m4 ++MULTILIB_DIRNAMES= ++MULTILIB_MATCHES = ++MULTILIB_EXCEPTIONS= ++ ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o +diff -urN gcc-3.4.1-dist/gcc/config/sh/t-sh64-uclibc gcc-3.4.1/gcc/config/sh/t-sh64-uclibc +--- gcc-3.4.1-dist/gcc/config/sh/t-sh64-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/sh/t-sh64-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,13 @@ ++EXTRA_MULTILIB_PARTS= crt1.o crti.o crtn.o crtbegin.o crtend.o ++ ++LIB1ASMFUNCS = \ ++ _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ ++ _shcompact_call_trampoline _shcompact_return_trampoline \ ++ _shcompact_incoming_args _ic_invalidate _nested_trampoline \ ++ _push_pop_shmedia_regs \ ++ _udivdi3 _divdi3 _umoddi3 _moddi3 ++ ++MULTILIB_OPTIONS = $(MULTILIB_ENDIAN) m5-32media-nofpu/m5-compact/m5-compact-nofpu/m5-64media/m5-64media-nofpu ++MULTILIB_DIRNAMES= $(MULTILIB_ENDIAN) nofpu compact nofpu/compact media64 nofpu/media64 ++MULTILIB_MATCHES= ++MULTILIB_EXCEPTIONS= +diff -urN gcc-3.4.1-dist/gcc/config/t-linux-uclibc gcc-3.4.1/gcc/config/t-linux-uclibc +--- gcc-3.4.1-dist/gcc/config/t-linux-uclibc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.1/gcc/config/t-linux-uclibc 2004-08-12 15:54:43.000000000 -0500 +@@ -0,0 +1,15 @@ ++T_CFLAGS = -DUSE_UCLIBC ++ ++# Compile crtbeginS.o and crtendS.o with pic. ++CRTSTUFF_T_CFLAGS_S = $(CRTSTUFF_T_CFLAGS) -fPIC ++# Compile libgcc2.a with pic. ++TARGET_LIBGCC2_CFLAGS = -fPIC ++ ++# Override t-slibgcc-elf-ver to export some libgcc symbols with ++# the symbol versions that glibc used. ++#SHLIB_MAPFILES += $(srcdir)/config/libgcc-glibc.ver ++ ++# Use unwind-dw2-fde ++LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ ++ $(srcdir)/unwind-sjlj.c $(srcdir)/gthr-gnat.c $(srcdir)/unwind-c.c ++LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h +diff -urN gcc-3.4.1-dist/gcc/config.gcc gcc-3.4.1/gcc/config.gcc +--- gcc-3.4.1-dist/gcc/config.gcc 2004-04-21 10:12:35.000000000 -0500 ++++ gcc-3.4.1/gcc/config.gcc 2004-08-12 15:59:46.000000000 -0500 +@@ -664,6 +664,12 @@ + extra_parts="" + use_collect2=yes + ;; ++arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc ++ tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" +@@ -725,6 +731,10 @@ + tmake_file="cris/t-cris cris/t-elfmulti" + gas=yes + ;; ++cris-*-linux-uclibc*) ++ tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" ++ tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux-uclibc" ++ ;; + cris-*-linux*) + tm_file="dbxelf.h elfos.h svr4.h ${tm_file} linux.h cris/linux.h" + tmake_file="cris/t-cris t-slibgcc-elf-ver cris/t-linux" +@@ -988,6 +998,11 @@ + thread_file='single' + fi + ;; ++i[34567]86-*-linux*uclibc*) # Intel 80386's running GNU/Linux ++ # with ELF format using uClibc ++ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h svr4.h linux.h i386/linux.h" ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc i386/t-crtstuff" ++ ;; + i[34567]86-*-linux*) # Intel 80386's running GNU/Linux + # with ELF format using glibc 2 + # aka GNU/Linux C library 6 +@@ -1547,6 +1562,16 @@ + gnu_ld=yes + gas=yes + ;; ++mips*-*-linux-uclibc*) # Linux MIPS, either endian. uClibc ++ tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" ++ case ${target} in ++ mipsisa32*-*) ++ target_cpu_default="MASK_SOFT_FLOAT" ++ tm_defines="MIPS_ISA_DEFAULT=32" ++ ;; ++ esac ++ tmake_file="t-slibgcc-elf-ver t-linux-uclibc" ++ ;; + mips*-*-linux*) # Linux MIPS, either endian. + tm_file="dbxelf.h elfos.h svr4.h linux.h ${tm_file} mips/linux.h" + case ${target} in +@@ -1764,6 +1789,10 @@ + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h rs6000/linuxspe.h" + tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" + ;; ++powerpc-*-linux-uclibc*) ++ tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" ++ tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux-uclibc rs6000/t-ppccomm" ++ ;; + powerpc-*-linux*) + tm_file="${tm_file} dbxelf.h elfos.h svr4.h freebsd-spec.h rs6000/sysv4.h rs6000/linux.h" + tmake_file="rs6000/t-fprules rs6000/t-ppcos t-slibgcc-elf-ver t-linux rs6000/t-ppccomm" +@@ -1916,7 +1945,7 @@ + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/embed-elf.h sh/rtemself.h rtems.h" + ;; + sh-*-linux* | sh[2346lbe]*-*-linux*) +- tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver t-linux" ++ tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver" + case ${target} in + sh*be-*-* | sh*eb-*-*) ;; + *) +@@ -1924,9 +1953,17 @@ + tmake_file="${tmake_file} sh/t-le" + ;; + esac +- tmake_file="${tmake_file} sh/t-linux" ++ case ${target} in ++ *-*-linux-uclibc*) tmake_file="${tmake_file} t-linux-uclibc sh/t-linux-uclibc" ;; ++ *) tmake_file="${tmake_file} t-linux sh/t-linux" ;; ++ esac + tm_file="${tm_file} dbxelf.h elfos.h svr4.h sh/elf.h sh/linux.h" + case ${target} in ++ sh64*-*-linux-uclibc*) ++ tmake_file="${tmake_file} sh/t-sh64-uclibc" ++ tm_file="${tm_file} sh/sh64.h" ++ extra_headers="shmedia.h ushmedia.h sshmedia.h" ++ ;; + sh64*) + tmake_file="${tmake_file} sh/t-sh64" + tm_file="${tm_file} sh/sh64.h" +diff -urN gcc-3.4.1-dist/libtool.m4 gcc-3.4.1/libtool.m4 +--- gcc-3.4.1-dist/libtool.m4 2004-05-18 04:08:37.000000000 -0500 ++++ gcc-3.4.1/libtool.m4 2004-08-12 15:54:43.000000000 -0500 +@@ -689,6 +689,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gcc-3.4.1-dist/ltconfig gcc-3.4.1/ltconfig +--- gcc-3.4.1-dist/ltconfig 2004-03-05 15:05:41.000000000 -0600 ++++ gcc-3.4.1/ltconfig 2004-08-12 15:55:48.000000000 -0500 +@@ -602,6 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in ++linux-uclibc*) ;; + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +@@ -1262,6 +1263,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no diff --git a/openwrt/toolchain/gcc/3.4.3/200-uclibc-locale.patch b/openwrt/toolchain/gcc/3.4.3/200-uclibc-locale.patch new file mode 100644 index 0000000000..3fc4900b06 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/200-uclibc-locale.patch @@ -0,0 +1,3246 @@ +diff -urN gcc-3.4.2-dist/libstdc++-v3/acinclude.m4 gcc-3.4.2/libstdc++-v3/acinclude.m4 +--- gcc-3.4.2-dist/libstdc++-v3/acinclude.m4 2004-07-15 12:42:45.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/acinclude.m4 2004-09-10 10:47:40.000000000 -0500 +@@ -996,7 +996,7 @@ + AC_MSG_CHECKING([for C locale to use]) + GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@], + [use MODEL for target locale package], +- [permit generic|gnu|ieee_1003.1-2001|yes|no|auto]) ++ [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto]) + + # If they didn't use this option switch, or if they specified --enable + # with no specific model, we'll have to look for one. If they +@@ -1012,6 +1012,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ x*-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include <features.h> +@@ -1138,6 +1141,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.2-dist/libstdc++-v3/aclocal.m4 gcc-3.4.2/libstdc++-v3/aclocal.m4 +--- gcc-3.4.2-dist/libstdc++-v3/aclocal.m4 2004-08-13 15:44:03.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/aclocal.m4 2004-09-10 10:47:40.000000000 -0500 +@@ -1025,6 +1025,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ x*-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include <features.h> +@@ -1151,6 +1154,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,59 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek <jakub@redhat.com> ++ ++#include <clocale> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#endif // GLIBC 2.3 and later +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,160 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <cerrno> // For errno ++#include <locale> ++#include <stdexcept> ++#include <langinfo.h> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#warning should dummy __newlocale check for C|POSIX ? ++#define __newlocale(a, b, c) NULL ++#define __freelocale(a) ((void)0) ++#define __duplocale(a) __c_locale() ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error(__N("locale::facet::_S_create_c_locale " ++ "name not valid")); ++ } ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++ if (_S_get_c_locale() != __cloc) ++ __freelocale(__cloc); ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++ { return __duplocale(__cloc); } ++} // namespace std ++ ++namespace __gnu_cxx ++{ ++ const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES", ++#if _GLIBCXX_NUM_CATEGORIES != 0 ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} ++ ++namespace std ++{ ++ const char* const* const locale::_S_categories = __gnu_cxx::category_names; ++} // namespace std +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.h 2004-09-10 10:48:08.000000000 -0500 +@@ -0,0 +1,115 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include <cstring> // get std::strlen ++#include <cstdio> // get std::snprintf or std::sprintf ++#include <clocale> ++#include <langinfo.h> // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include <iconv.h> // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include <libintl.h> // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCXX_C_LOCALE_GNU for ++#endif ++#define _GLIBCXX_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCXX_NUM_CATEGORIES 6 ++#define _GLIBCXX_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template<typename _Tv> ++ int ++ __convert_from_v(char* __out, const int __size, const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = std::setlocale(LC_ALL, NULL); ++ char* __sav = new char[std::strlen(__old) + 1]; ++ std::strcpy(__sav, __old); ++ std::setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ std::setlocale(LC_ALL, __sav); ++ delete [] __sav; ++#endif ++ return __ret; ++ } ++} ++ ++#endif +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,306 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // wcsnrtombs is *very* fast but stops if encounters NUL characters: ++ // in case we fall back to wcrtomb and then continue, in a loop. ++ // NB: wcsnrtombs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0', ++ __from_end - __from_next); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ const size_t __conv = wcsnrtombs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // wcrtomb. ++ for (; __from < __from_next; ++__from) ++ __to_next += wcrtomb(__to_next, *__from, &__tmp_state); ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ extern_type __buf[MB_LEN_MAX]; ++ __tmp_state = __state; ++ const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state); ++ if (__conv > static_cast<size_t>(__to_end - __to_next)) ++ __ret = partial; ++ else ++ { ++ memcpy(__to_next, __buf, __conv); ++ __state = __tmp_state; ++ __to_next += __conv; ++ ++__from_next; ++ } ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we store a L'\0' and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from_next, '\0', ++ __from_end ++ - __from_next)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ size_t __conv = mbsnrtowcs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (;; ++__to_next, __from += __conv) ++ { ++ __conv = mbrtowc(__to_next, __from, __from_end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __from_next = __from; ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ // It is unclear what to return in this case (see DR 382). ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ if (__to_next < __to_end) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from_next; ++ *__to_next++ = L'\0'; ++ } ++ else ++ __ret = partial; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_encoding() const throw() ++ { ++ // XXX This implementation assumes that the encoding is ++ // stateless and is either single-byte or variable-width. ++ int __ret = 0; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ if (MB_CUR_MAX == 1) ++ __ret = 1; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_max_length() const throw() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ // XXX Probably wrong for stateful encodings. ++ int __ret = MB_CUR_MAX; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_length(state_type& __state, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { ++ int __ret = 0; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we advance past it and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ ++ // A dummy internal buffer is needed in order for mbsnrtocws to consider ++ // its fourth parameter (it wouldn't with NULL as first parameter). ++ wchar_t* __to = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from, '\0', ++ __end ++ - __from)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __end; ++ ++ const extern_type* __tmp_from = __from; ++ size_t __conv = mbsnrtowcs(__to, &__from, ++ __from_chunk_end - __from, ++ __max, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (__from = __tmp_from;; __from += __conv) ++ { ++ __conv = mbrtowc(NULL, __from, __end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __state = __tmp_state; ++ __ret += __from - __tmp_from; ++ break; ++ } ++ if (!__from) ++ __from = __from_chunk_end; ++ ++ __ret += __from - __tmp_from; ++ __max -= __conv; ++ ++ if (__from < __end && __max) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from; ++ ++__ret; ++ --__max; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/collate_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/collate_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate<char>::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<char>::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ int ++ collate<wchar_t>::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,300 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype<char> specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname<char>::ctype_byname(const char* __s, size_t __refs) ++ : ctype<char>(0, false, __refs) ++ { ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_ctype); ++ this->_S_create_c_locale(this->_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper; ++ this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower; ++ this->_M_table = this->_M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ ctype<wchar_t>::__wmask_type ++ ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = 0; ++ } ++ return __ret; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype<wchar_t>:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__m & _M_bit[__bitcur] ++ && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ { ++ __ret = true; ++ break; ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (; __lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ __m |= _M_bit[__bitcur]; ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype<wchar_t>:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<wchar_t>:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast<unsigned char>(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype<wchar_t>:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++ if (__wc >= 0 && __wc < 128 && _M_narrow_ok) ++ return _M_narrow[__wc]; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ const int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ if (_M_narrow_ok) ++ while (__lo < __hi) ++ { ++ if (*__lo >= 0 && *__lo < 128) ++ *__dest = _M_narrow[*__lo]; ++ else ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype<wchar_t>::_M_initialize_ctype() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wint_t __i; ++ for (__i = 0; __i < 128; ++__i) ++ { ++ const int __c = wctob(__i); ++ if (__c == EOF) ++ break; ++ else ++ _M_narrow[__i] = static_cast<char>(__c); ++ } ++ if (__i == 128) ++ _M_narrow_ok = true; ++ else ++ _M_narrow_ok = false; ++ for (size_t __j = 0; ++ __j < sizeof(_M_widen) / sizeof(wint_t); ++__j) ++ _M_widen[__j] = btowc(__j); ++ ++ for (size_t __k = 0; __k <= 11; ++__k) ++ { ++ _M_bit[__k] = static_cast<mask>(_ISbit(__k)); ++ _M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++#endif // _GLIBCXX_USE_WCHAR_T ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages<char>::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast<const char*>(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ wstring ++ messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++# elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,118 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), ++ _M_name_messages(_S_get_c_name()) ++ { } ++ ++ template<typename _CharT> ++ messages<_CharT>::messages(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)), ++ _M_name_messages(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_messages = __tmp; ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::~messages() ++ { ++ if (_M_name_messages != _S_get_c_name()) ++ delete [] _M_name_messages; ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string<char>& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template<typename _CharT> ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template<typename _CharT> ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++ if (this->_M_name_messages != locale::facet::_S_get_c_name()) ++ delete [] this->_M_name_messages; ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ this->_M_name_messages = __tmp; ++ ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_messages); ++ this->_S_create_c_locale(this->_M_c_locale_messages, __s); ++ } ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,698 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ __ret.field[0] = sign; ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[2] = space; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[1] = space; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ else ++ { ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ default: ++ ; ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == true ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == false ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct<char, true>::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct<char, false>::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ { ++ uc = static_cast<unsigned char>(money_base::_S_atoms[__i]); ++ _M_data->_M_atoms[__i] = btowc(uc); ++ } ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ { ++ uc = static_cast<unsigned char>(money_base::_S_atoms[__i]); ++ _M_data->_M_atoms[__i] = btowc(uc); ++ } ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct<wchar_t, true>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++ ++ template<> ++ moneypunct<wchar_t, false>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,183 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct<char>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, ++ __cloc)); ++ ++ // Check for NULL, which implies no grouping. ++ if (_M_data->_M_thousands_sep == '\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = "true"; ++ _M_data->_M_truename_size = strlen(_M_data->_M_truename); ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = "false"; ++ _M_data->_M_falsename_size = strlen(_M_data->_M_falsename); ++ } ++ ++ template<> ++ numpunct<char>::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<wchar_t>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_get_c_locale()); ++#endif ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ { ++ uc = static_cast<unsigned char>(__num_base::_S_atoms_out[__i]); ++ _M_data->_M_atoms_out[__i] = btowc(uc); ++ } ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ { ++ uc = static_cast<unsigned char>(__num_base::_S_atoms_in[__j]); ++ _M_data->_M_atoms_in[__j] = btowc(uc); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); ++#endif ++ ++ if (_M_data->_M_thousands_sep == L'\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = L"true"; ++ _M_data->_M_truename_size = wcslen(_M_data->_M_truename); ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = L"false"; ++ _M_data->_M_falsename_size = wcslen(_M_data->_M_falsename); ++ } ++ ++ template<> ++ numpunct<wchar_t>::~numpunct() ++ { delete _M_data; } ++ #endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.cc 2004-09-10 10:48:00.000000000 -0500 +@@ -0,0 +1,356 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct<char>:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const size_t __len = __strftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = '\0'; ++ } ++ ++ template<> ++ void ++ __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = "%m/%d/%y"; ++ _M_data->_M_date_era_format = "%m/%d/%y"; ++ _M_data->_M_time_format = "%H:%M:%S"; ++ _M_data->_M_time_era_format = "%H:%M:%S"; ++ _M_data->_M_date_time_format = ""; ++ _M_data->_M_date_time_era_format = ""; ++ _M_data->_M_am = "AM"; ++ _M_data->_M_pm = "PM"; ++ _M_data->_M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = "Sunday"; ++ _M_data->_M_day2 = "Monday"; ++ _M_data->_M_day3 = "Tuesday"; ++ _M_data->_M_day4 = "Wednesday"; ++ _M_data->_M_day5 = "Thursday"; ++ _M_data->_M_day6 = "Friday"; ++ _M_data->_M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = "Sun"; ++ _M_data->_M_aday2 = "Mon"; ++ _M_data->_M_aday3 = "Tue"; ++ _M_data->_M_aday4 = "Wed"; ++ _M_data->_M_aday5 = "Thu"; ++ _M_data->_M_aday6 = "Fri"; ++ _M_data->_M_aday7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = "January"; ++ _M_data->_M_month02 = "February"; ++ _M_data->_M_month03 = "March"; ++ _M_data->_M_month04 = "April"; ++ _M_data->_M_month05 = "May"; ++ _M_data->_M_month06 = "June"; ++ _M_data->_M_month07 = "July"; ++ _M_data->_M_month08 = "August"; ++ _M_data->_M_month09 = "September"; ++ _M_data->_M_month10 = "October"; ++ _M_data->_M_month11 = "November"; ++ _M_data->_M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = "Jan"; ++ _M_data->_M_amonth02 = "Feb"; ++ _M_data->_M_amonth03 = "Mar"; ++ _M_data->_M_amonth04 = "Apr"; ++ _M_data->_M_amonth05 = "May"; ++ _M_data->_M_amonth06 = "Jun"; ++ _M_data->_M_amonth07 = "Jul"; ++ _M_data->_M_amonth08 = "Aug"; ++ _M_data->_M_amonth09 = "Sep"; ++ _M_data->_M_amonth10 = "Oct"; ++ _M_data->_M_amonth11 = "Nov"; ++ _M_data->_M_amonth12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc); ++ _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ __timepunct<wchar_t>:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++ const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = L'\0'; ++ } ++ ++ template<> ++ void ++ __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<wchar_t>; ++ ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = L"%m/%d/%y"; ++ _M_data->_M_date_era_format = L"%m/%d/%y"; ++ _M_data->_M_time_format = L"%H:%M:%S"; ++ _M_data->_M_time_era_format = L"%H:%M:%S"; ++ _M_data->_M_date_time_format = L""; ++ _M_data->_M_date_time_era_format = L""; ++ _M_data->_M_am = L"AM"; ++ _M_data->_M_pm = L"PM"; ++ _M_data->_M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = L"Sunday"; ++ _M_data->_M_day2 = L"Monday"; ++ _M_data->_M_day3 = L"Tuesday"; ++ _M_data->_M_day4 = L"Wednesday"; ++ _M_data->_M_day5 = L"Thursday"; ++ _M_data->_M_day6 = L"Friday"; ++ _M_data->_M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = L"Sun"; ++ _M_data->_M_aday2 = L"Mon"; ++ _M_data->_M_aday3 = L"Tue"; ++ _M_data->_M_aday4 = L"Wed"; ++ _M_data->_M_aday5 = L"Thu"; ++ _M_data->_M_aday6 = L"Fri"; ++ _M_data->_M_aday7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = L"January"; ++ _M_data->_M_month02 = L"February"; ++ _M_data->_M_month03 = L"March"; ++ _M_data->_M_month04 = L"April"; ++ _M_data->_M_month05 = L"May"; ++ _M_data->_M_month06 = L"June"; ++ _M_data->_M_month07 = L"July"; ++ _M_data->_M_month08 = L"August"; ++ _M_data->_M_month09 = L"September"; ++ _M_data->_M_month10 = L"October"; ++ _M_data->_M_month11 = L"November"; ++ _M_data->_M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = L"Jan"; ++ _M_data->_M_amonth02 = L"Feb"; ++ _M_data->_M_amonth03 = L"Mar"; ++ _M_data->_M_amonth04 = L"Apr"; ++ _M_data->_M_amonth05 = L"May"; ++ _M_data->_M_amonth06 = L"Jun"; ++ _M_data->_M_amonth07 = L"Jul"; ++ _M_data->_M_amonth08 = L"Aug"; ++ _M_data->_M_amonth09 = L"Sep"; ++ _M_data->_M_amonth10 = L"Oct"; ++ _M_data->_M_amonth11 = L"Nov"; ++ _M_data->_M_amonth12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_FMT, __cloc)); ++ _M_data->_M_date_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc)); ++ _M_data->_M_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT, __cloc)); ++ _M_data->_M_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc)); ++ _M_data->_M_date_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_T_FMT, __cloc)); ++ _M_data->_M_date_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc)); ++ _M_data->_M_am = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WAM_STR, __cloc)); ++ _M_data->_M_pm = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WPM_STR, __cloc)); ++ _M_data->_M_am_pm_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc)); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_1, __cloc)); ++ _M_data->_M_day2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_2, __cloc)); ++ _M_data->_M_day3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_3, __cloc)); ++ _M_data->_M_day4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_4, __cloc)); ++ _M_data->_M_day5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_5, __cloc)); ++ _M_data->_M_day6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_6, __cloc)); ++ _M_data->_M_day7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_7, __cloc)); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_1, __cloc)); ++ _M_data->_M_aday2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_2, __cloc)); ++ _M_data->_M_aday3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_3, __cloc)); ++ _M_data->_M_aday4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_4, __cloc)); ++ _M_data->_M_aday5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_5, __cloc)); ++ _M_data->_M_aday6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_6, __cloc)); ++ _M_data->_M_aday7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_7, __cloc)); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_1, __cloc)); ++ _M_data->_M_month02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_2, __cloc)); ++ _M_data->_M_month03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_3, __cloc)); ++ _M_data->_M_month04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_4, __cloc)); ++ _M_data->_M_month05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_5, __cloc)); ++ _M_data->_M_month06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_6, __cloc)); ++ _M_data->_M_month07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_7, __cloc)); ++ _M_data->_M_month08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_8, __cloc)); ++ _M_data->_M_month09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_9, __cloc)); ++ _M_data->_M_month10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_10, __cloc)); ++ _M_data->_M_month11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_11, __cloc)); ++ _M_data->_M_month12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_12, __cloc)); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_1, __cloc)); ++ _M_data->_M_amonth02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_2, __cloc)); ++ _M_data->_M_amonth03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_3, __cloc)); ++ _M_data->_M_amonth04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_4, __cloc)); ++ _M_data->_M_amonth05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_5, __cloc)); ++ _M_data->_M_amonth06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_6, __cloc)); ++ _M_data->_M_amonth07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_7, __cloc)); ++ _M_data->_M_amonth08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_8, __cloc)); ++ _M_data->_M_amonth09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_9, __cloc)); ++ _M_data->_M_amonth10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_10, __cloc)); ++ _M_data->_M_amonth11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_11, __cloc)); ++ _M_data->_M_amonth12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_12, __cloc)); ++ } ++#endif // 0 ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,68 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) ++ : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_timepunct = __tmp; ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::~__timepunct() ++ { ++ if (_M_name_timepunct != _S_get_c_name()) ++ delete [] _M_name_timepunct; ++ delete _M_data; ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_base.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_base.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,58 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ ++ // NB: Offsets into ctype<char>::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISalpha | _ISdigit | _ISpunct; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalpha | _ISdigit; ++ }; +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_inline.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_inline.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype<char>:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast<unsigned char>(__c)] & __m; } ++ ++ const char* ++ ctype<char>:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast<unsigned char>(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,92 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype<char>::classic_table() throw() ++ { return __C_ctype_b; } ++ ++ ctype<char>::ctype(__c_locale, const mask* __table, bool __del, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ char ++ ctype<char>::do_toupper(char __c) const ++ { return _M_toupper[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype<char>::do_tolower(char __c) const ++ { return _M_tolower[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/os_defines.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/os_defines.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/os_defines.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,44 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library 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 2, or (at your option) ++// any later version. ++ ++// This library is distributed in the hope that it will be useful, ++// but WITHOUT ANY WARRANTY; without even the implied warranty of ++// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++// GNU General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCXX_OS_DEFINES ++#define _GLIBCXX_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include <features.h> ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif +diff -urN gcc-3.4.2-dist/libstdc++-v3/configure gcc-3.4.2/libstdc++-v3/configure +--- gcc-3.4.2-dist/libstdc++-v3/configure 2004-08-13 15:44:04.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/configure 2004-09-10 10:47:40.000000000 -0500 +@@ -3878,6 +3878,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5545,6 +5550,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + cat >conftest.$ac_ext <<_ACEOF + #line $LINENO "configure" +@@ -5759,6 +5767,77 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ echo "$as_me:$LINENO: result: uclibc" >&5 ++echo "${ECHO_T}uclibc" >&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; ac_word=$2 ++echo "$as_me:$LINENO: checking for $ac_word" >&5 ++echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 ++if test "${ac_cv_prog_check_msgfmt+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_msgfmt" # Let the user override the test. ++else ++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++do ++ IFS=$as_save_IFS ++ test -z "$as_dir" && as_dir=. ++ for ac_exec_ext in '' $ac_executable_extensions; do ++ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ++ ac_cv_prog_check_msgfmt="yes" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt=$ac_cv_prog_check_msgfmt ++if test -n "$check_msgfmt"; then ++ echo "$as_me:$LINENO: result: $check_msgfmt" >&5 ++echo "${ECHO_T}$check_msgfmt" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.2-dist/libstdc++-v3/configure.host gcc-3.4.2/libstdc++-v3/configure.host +--- gcc-3.4.2-dist/libstdc++-v3/configure.host 2004-08-27 14:52:30.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/configure.host 2004-09-10 10:47:40.000000000 -0500 +@@ -217,6 +217,12 @@ + ;; + esac + ++# Override for uClibc since linux-uclibc gets mishandled above. ++case "${host_os}" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; ++esac + + # Set any OS-dependent and CPU-dependent bits. + # THIS TABLE IS SORTED. KEEP IT THAT WAY. +diff -urN gcc-3.4.2-dist/libstdc++-v3/crossconfig.m4 gcc-3.4.2/libstdc++-v3/crossconfig.m4 +--- gcc-3.4.2-dist/libstdc++-v3/crossconfig.m4 2004-07-06 20:23:49.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/crossconfig.m4 2004-09-10 10:47:40.000000000 -0500 +@@ -138,6 +138,99 @@ + ;; + esac + ;; ++ *-uclibc*) ++# Temporary hack until we implement the float versions of the libm funcs ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h float.h endian.h inttypes.h locale.h float.h stdint.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCXX_CHECK_LINKER_FEATURES ++ GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCXX_CHECK_WCHAR_T_SUPPORT ++ ++ # For LFS. ++ AC_DEFINE(HAVE_INT64_T) ++ case "$target" in ++ *-uclinux*) ++ # Don't enable LFS with uClinux ++ ;; ++ *) ++ AC_DEFINE(_GLIBCXX_USE_LFS) ++ esac ++ ++ # For showmanyc_helper(). ++ AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h) ++ GLIBCXX_CHECK_POLL ++ GLIBCXX_CHECK_S_ISREG_OR_S_IFREG ++ ++ # For xsputn_2(). ++ AC_CHECK_HEADERS(sys/uio.h) ++ GLIBCXX_CHECK_WRITEV ++ ++# AC_DEFINE(HAVE_ACOSF) ++# AC_DEFINE(HAVE_ASINF) ++# AC_DEFINE(HAVE_ATANF) ++# AC_DEFINE(HAVE_ATAN2F) ++ AC_DEFINE(HAVE_CEILF) ++ AC_DEFINE(HAVE_COPYSIGN) ++# AC_DEFINE(HAVE_COPYSIGNF) ++# AC_DEFINE(HAVE_COSF) ++# AC_DEFINE(HAVE_COSHF) ++# AC_DEFINE(HAVE_EXPF) ++# AC_DEFINE(HAVE_FABSF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ AC_DEFINE(HAVE_FLOORF) ++# AC_DEFINE(HAVE_FMODF) ++# AC_DEFINE(HAVE_FREXPF) ++ AC_DEFINE(HAVE_HYPOT) ++# AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++# AC_DEFINE(HAVE_LOGF) ++# AC_DEFINE(HAVE_LOG10F) ++# AC_DEFINE(HAVE_MODFF) ++# AC_DEFINE(HAVE_SINF) ++# AC_DEFINE(HAVE_SINHF) ++# AC_DEFINE(HAVE_SINCOS) ++# AC_DEFINE(HAVE_SINCOSF) ++ AC_DEFINE(HAVE_SQRTF) ++# AC_DEFINE(HAVE_TANF) ++# AC_DEFINE(HAVE_TANHF) ++ if test x"long_double_math_on_this_cpu" = x"yes"; then ++ AC_MSG_ERROR([long_double_math_on_this_cpu is yes!]) ++# AC_DEFINE(HAVE_ACOSL) ++# AC_DEFINE(HAVE_ASINL) ++# AC_DEFINE(HAVE_ATANL) ++# AC_DEFINE(HAVE_ATAN2L) ++# AC_DEFINE(HAVE_CEILL) ++# AC_DEFINE(HAVE_COPYSIGNL) ++# AC_DEFINE(HAVE_COSL) ++# AC_DEFINE(HAVE_COSHL) ++# AC_DEFINE(HAVE_EXPL) ++# AC_DEFINE(HAVE_FABSL) ++# AC_DEFINE(HAVE_FINITEL) ++# AC_DEFINE(HAVE_FLOORL) ++# AC_DEFINE(HAVE_FMODL) ++# AC_DEFINE(HAVE_FREXPL) ++# AC_DEFINE(HAVE_HYPOTL) ++# AC_DEFINE(HAVE_ISINFL) ++# AC_DEFINE(HAVE_ISNANL) ++# AC_DEFINE(HAVE_LOGL) ++# AC_DEFINE(HAVE_LOG10L) ++# AC_DEFINE(HAVE_MODFL) ++# AC_DEFINE(HAVE_POWL) ++# AC_DEFINE(HAVE_SINL) ++# AC_DEFINE(HAVE_SINHL) ++# AC_DEFINE(HAVE_SINCOSL) ++# AC_DEFINE(HAVE_SQRTL) ++# AC_DEFINE(HAVE_TANL) ++# AC_DEFINE(HAVE_TANHL) ++ fi ++ ;; + *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu) + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ + machine/endian.h machine/param.h sys/machine.h sys/types.h \ +@@ -152,7 +245,7 @@ + AC_DEFINE(HAVE_INT64_T) + case "$target" in + *-uclinux*) +- # Don't enable LFS with uClibc ++ # Don't enable LFS with uClinux + ;; + *) + AC_DEFINE(_GLIBCXX_USE_LFS) +diff -urN gcc-3.4.2-dist/libstdc++-v3/include/c_compatibility/wchar.h gcc-3.4.2/libstdc++-v3/include/c_compatibility/wchar.h +--- gcc-3.4.2-dist/libstdc++-v3/include/c_compatibility/wchar.h 2003-12-08 21:51:45.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/include/c_compatibility/wchar.h 2004-09-10 10:47:40.000000000 -0500 +@@ -101,7 +101,9 @@ + using std::wmemcpy; + using std::wmemmove; + using std::wmemset; ++#if _GLIBCXX_HAVE_WCSFTIME + using std::wcsftime; ++#endif + + #if _GLIBCXX_USE_C99 + using std::wcstold; +diff -urN gcc-3.4.2-dist/libstdc++-v3/include/c_std/std_cwchar.h gcc-3.4.2/libstdc++-v3/include/c_std/std_cwchar.h +--- gcc-3.4.2-dist/libstdc++-v3/include/c_std/std_cwchar.h 2004-07-20 03:52:12.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/include/c_std/std_cwchar.h 2004-09-10 10:47:40.000000000 -0500 +@@ -179,7 +179,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#if _GLIBCXX_HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; diff --git a/openwrt/toolchain/gcc/3.4.3/300-libstdc++-pic.patch b/openwrt/toolchain/gcc/3.4.3/300-libstdc++-pic.patch new file mode 100644 index 0000000000..c030ba6205 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/300-libstdc++-pic.patch @@ -0,0 +1,47 @@ +# DP: Build and install libstdc++_pic.a library. + +--- gcc/libstdc++-v3/src/Makefile.am~ 2003-02-28 09:21:05.000000000 +0100 ++++ gcc/libstdc++-v3/src/Makefile.am 2003-02-28 09:28:50.000000000 +0100 +@@ -224,6 +224,10 @@ + @OPT_LDFLAGS@ @SECTION_LDFLAGS@ $(AM_CXXFLAGS) $(LDFLAGS) -o $@ + + ++install-exec-local: ++ $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++ + # Added bits to build debug library. + if GLIBCPP_BUILD_DEBUG + all-local: build_debug + +--- gcc/libstdc++-v3/src/Makefile.in~ 2004-02-21 09:55:48.000000000 +0100 ++++ gcc/libstdc++-v3/src/Makefile.in 2004-02-21 09:59:34.000000000 +0100 +@@ -585,7 +585,7 @@ + + install-data-am: install-data-local + +-install-exec-am: install-toolexeclibLTLIBRARIES ++install-exec-am: install-toolexeclibLTLIBRARIES install-exec-local + + install-info: install-info-am + +@@ -618,6 +618,7 @@ + distclean-tags distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-data-local \ + install-exec install-exec-am install-info install-info-am \ ++ install-exec-local \ + install-man install-strip install-toolexeclibLTLIBRARIES \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ +@@ -707,6 +708,11 @@ + install_debug: + (cd ${debugdir} && $(MAKE) \ + toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install) ++ ++install-exec-local: ++ $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++ + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: diff --git a/openwrt/toolchain/gcc/3.4.3/600-gcc34-arm-ldm-peephole.patch b/openwrt/toolchain/gcc/3.4.3/600-gcc34-arm-ldm-peephole.patch new file mode 100644 index 0000000000..fb317e1537 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/600-gcc34-arm-ldm-peephole.patch @@ -0,0 +1,79 @@ +--- gcc-3.4.0/gcc/config/arm/arm.md.arm-ldm-peephole 2004-01-13 08:24:37.000000000 -0500 ++++ gcc-3.4.0/gcc/config/arm/arm.md 2004-04-24 18:18:04.000000000 -0400 +@@ -8810,13 +8810,16 @@ + (set_attr "length" "4,8,8")] + ) + ++; Try to convert LDR+LDR+arith into [add+]LDM+arith ++; On XScale, LDM is always slower than two LDRs, so only do this if ++; optimising for size. + (define_insn "*arith_adjacentmem" + [(set (match_operand:SI 0 "s_register_operand" "=r") + (match_operator:SI 1 "shiftable_operator" + [(match_operand:SI 2 "memory_operand" "m") + (match_operand:SI 3 "memory_operand" "m")])) + (clobber (match_scratch:SI 4 "=r"))] +- "TARGET_ARM && adjacent_mem_locations (operands[2], operands[3])" ++ "TARGET_ARM && (!arm_tune_xscale || optimize_size) && adjacent_mem_locations (operands[2], operands[3])" + "* + { + rtx ldm[3]; +@@ -8851,6 +8854,8 @@ + } + if (val1 && val2) + { ++ /* This would be a loss on a Harvard core, but adjacent_mem_locations() ++ will prevent it from happening. */ + rtx ops[3]; + ldm[0] = ops[0] = operands[4]; + ops[1] = XEXP (XEXP (operands[2], 0), 0); +--- gcc-3.4.0/gcc/config/arm/arm.c.arm-ldm-peephole 2004-04-24 18:16:25.000000000 -0400 ++++ gcc-3.4.0/gcc/config/arm/arm.c 2004-04-24 18:18:04.000000000 -0400 +@@ -4593,8 +4593,11 @@ + arith_adjacentmem pattern to output an overlong sequence. */ + if (!const_ok_for_op (PLUS, val0) || !const_ok_for_op (PLUS, val1)) + return 0; +- +- return (reg0 == reg1) && ((val1 - val0) == 4 || (val0 - val1) == 4); ++ ++ /* For Harvard cores, only accept pairs where one offset is zero. ++ See comment in load_multiple_sequence. */ ++ return (reg0 == reg1) && ((val1 - val0) == 4 || (val0 - val1) == 4) ++ && (!arm_ld_sched || val0 == 0 || val1 == 0); + } + return 0; + } +@@ -4838,6 +4841,11 @@ + *load_offset = unsorted_offsets[order[0]]; + } + ++ /* For XScale a two-word LDM is a performance loss, so only do this if ++ size is more important. See comments in arm_gen_load_multiple. */ ++ if (nops == 2 && arm_tune_xscale && !optimize_size) ++ return 0; ++ + if (unsorted_offsets[order[0]] == 0) + return 1; /* ldmia */ + +@@ -5064,6 +5072,11 @@ + *load_offset = unsorted_offsets[order[0]]; + } + ++ /* For XScale a two-word LDM is a performance loss, so only do this if ++ size is more important. See comments in arm_gen_load_multiple. */ ++ if (nops == 2 && arm_tune_xscale && !optimize_size) ++ return 0; ++ + if (unsorted_offsets[order[0]] == 0) + return 1; /* stmia */ + +--- gcc-3.4.0/gcc/genpeep.c.arm-ldm-peephole 2003-07-05 01:27:22.000000000 -0400 ++++ gcc-3.4.0/gcc/genpeep.c 2004-04-24 18:18:04.000000000 -0400 +@@ -381,6 +381,7 @@ + printf ("#include \"recog.h\"\n"); + printf ("#include \"except.h\"\n\n"); + printf ("#include \"function.h\"\n\n"); ++ printf ("#include \"flags.h\"\n\n"); + + printf ("#ifdef HAVE_peephole\n"); + printf ("extern rtx peep_operand[];\n\n"); diff --git a/openwrt/toolchain/gcc/3.4.3/601-gcc34-arm-ldm.patch b/openwrt/toolchain/gcc/3.4.3/601-gcc34-arm-ldm.patch new file mode 100644 index 0000000000..142052fdf0 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/601-gcc34-arm-ldm.patch @@ -0,0 +1,119 @@ +--- gcc-3.4.0/gcc/config/arm/arm.c.arm-ldm 2004-02-27 09:51:05.000000000 -0500 ++++ gcc-3.4.0/gcc/config/arm/arm.c 2004-04-24 18:16:25.000000000 -0400 +@@ -8520,6 +8520,26 @@ + return_used_this_function = 0; + } + ++/* Return the number (counting from 0) of ++ the least significant set bit in MASK. */ ++ ++#ifdef __GNUC__ ++inline ++#endif ++static int ++number_of_first_bit_set (mask) ++ int mask; ++{ ++ int bit; ++ ++ for (bit = 0; ++ (mask & (1 << bit)) == 0; ++ ++bit) ++ continue; ++ ++ return bit; ++} ++ + const char * + arm_output_epilogue (rtx sibling) + { +@@ -8753,27 +8773,47 @@ + saved_regs_mask |= (1 << PC_REGNUM); + } + +- /* Load the registers off the stack. If we only have one register +- to load use the LDR instruction - it is faster. */ +- if (saved_regs_mask == (1 << LR_REGNUM)) +- { +- /* The exception handler ignores the LR, so we do +- not really need to load it off the stack. */ +- if (eh_ofs) +- asm_fprintf (f, "\tadd\t%r, %r, #4\n", SP_REGNUM, SP_REGNUM); +- else +- asm_fprintf (f, "\tldr\t%r, [%r], #4\n", LR_REGNUM, SP_REGNUM); +- } +- else if (saved_regs_mask) ++ if (saved_regs_mask) + { +- if (saved_regs_mask & (1 << SP_REGNUM)) +- /* Note - write back to the stack register is not enabled +- (ie "ldmfd sp!..."). We know that the stack pointer is +- in the list of registers and if we add writeback the +- instruction becomes UNPREDICTABLE. */ +- print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask); ++ /* Load the registers off the stack. If we only have one register ++ to load use the LDR instruction - it is faster. */ ++ if (bit_count (saved_regs_mask) == 1) ++ { ++ int reg = number_of_first_bit_set (saved_regs_mask); ++ ++ switch (reg) ++ { ++ case SP_REGNUM: ++ /* Mustn't use base writeback when loading SP. */ ++ asm_fprintf (f, "\tldr\t%r, [%r]\n", SP_REGNUM, SP_REGNUM); ++ break; ++ ++ case LR_REGNUM: ++ if (eh_ofs) ++ { ++ /* The exception handler ignores the LR, so we do ++ not really need to load it off the stack. */ ++ asm_fprintf (f, "\tadd\t%r, %r, #4\n", SP_REGNUM, SP_REGNUM); ++ break; ++ } ++ /* else fall through */ ++ ++ default: ++ asm_fprintf (f, "\tldr\t%r, [%r], #4\n", reg, SP_REGNUM); ++ break; ++ } ++ } + else +- print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask); ++ { ++ if (saved_regs_mask & (1 << SP_REGNUM)) ++ /* Note - write back to the stack register is not enabled ++ (ie "ldmfd sp!..."). We know that the stack pointer is ++ in the list of registers and if we add writeback the ++ instruction becomes UNPREDICTABLE. */ ++ print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask); ++ else ++ print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask); ++ } + } + + if (current_function_pretend_args_size) +@@ -11401,22 +11441,6 @@ + } + } + +-/* Return the number (counting from 0) of +- the least significant set bit in MASK. */ +- +-inline static int +-number_of_first_bit_set (int mask) +-{ +- int bit; +- +- for (bit = 0; +- (mask & (1 << bit)) == 0; +- ++bit) +- continue; +- +- return bit; +-} +- + /* Generate code to return from a thumb function. + If 'reg_containing_return_addr' is -1, then the return address is + actually on the stack, at the stack pointer. */ diff --git a/openwrt/toolchain/gcc/3.4.3/602-sdk-libstdc++-includes.patch b/openwrt/toolchain/gcc/3.4.3/602-sdk-libstdc++-includes.patch new file mode 100644 index 0000000000..4377c2143b --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/602-sdk-libstdc++-includes.patch @@ -0,0 +1,22 @@ +--- gcc-3.4.1/libstdc++-v3/libmath/Makefile.am~ 2003-08-27 22:29:42.000000000 +0100 ++++ gcc-3.4.1/libstdc++-v3/libmath/Makefile.am 2004-07-22 16:41:45.152130128 +0100 +@@ -32,7 +32,7 @@ + + libmath_la_SOURCES = stubs.c + +-AM_CPPFLAGS = $(CANADIAN_INCLUDES) ++AM_CPPFLAGS = $(CANADIAN_INCLUDES) -I$(toplevel_srcdir)/include + + # Only compiling "C" sources in this directory. + LIBTOOL = @LIBTOOL@ --tag CC +--- gcc-3.4.1/libstdc++-v3/fragment.am.old 2004-07-22 18:24:58.024083656 +0100 ++++ gcc-3.4.1/libstdc++-v3/fragment.am 2004-07-22 18:24:59.019932264 +0100 +@@ -18,7 +18,7 @@ + $(WARN_FLAGS) $(WERROR) -fdiagnostics-show-location=once + + # -I/-D flags to pass when compiling. +-AM_CPPFLAGS = $(GLIBCXX_INCLUDES) ++AM_CPPFLAGS = $(GLIBCXX_INCLUDES) -I$(toplevel_srcdir)/include + + + diff --git a/openwrt/toolchain/gcc/3.4.3/700-pr15068-fix.patch b/openwrt/toolchain/gcc/3.4.3/700-pr15068-fix.patch new file mode 100644 index 0000000000..2977765c5f --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/700-pr15068-fix.patch @@ -0,0 +1,44 @@ +See http://gcc.gnu.org/PR15068 + +Fixes error + +../sysdeps/generic/s_fmax.c: In function `__fmax': +../sysdeps/generic/s_fmax.c:28: internal compiler error: in elim_reg_cond, at flow.c:3257 +Please submit a full bug report, +with preprocessed source if appropriate. +See <URL:http://gcc.gnu.org/bugs.html> for instructions. +make[2]: *** [/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/build-glibc/math/s_fmax.o] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822/math' +make[1]: *** [math/others] Error 2 +make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822' +make: *** [all] Error 2 + +[ rediffed against gcc-3.4.1, with elbow grease, ending up with same thing as +http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/flow.c.diff?cvsroot=gcc&only_with_tag=csl-arm-branch&r1=1.563.4.2&r2=1.563.4.3 ] + +--- gcc-3.4.1/gcc/flow.c.old 2004-02-27 19:39:19.000000000 -0800 ++++ gcc-3.4.1/gcc/flow.c 2004-08-26 07:29:46.000000000 -0700 +@@ -1878,6 +1878,7 @@ + rtx set_src = SET_SRC (pc_set (BB_END (bb))); + rtx cond_true = XEXP (set_src, 0); + rtx reg = XEXP (cond_true, 0); ++ enum rtx_code inv_cond; + + if (GET_CODE (reg) == SUBREG) + reg = SUBREG_REG (reg); +@@ -1886,11 +1887,13 @@ + in the form of a comparison of a register against zero. + If the condition is more complex than that, then it is safe + not to record any information. */ +- if (GET_CODE (reg) == REG ++ inv_cond = reversed_comparison_code (cond_true, BB_END (bb)); ++ if (inv_cond != UNKNOWN ++ && GET_CODE (reg) == REG + && XEXP (cond_true, 1) == const0_rtx) + { + rtx cond_false +- = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond_true)), ++ = gen_rtx_fmt_ee (inv_cond, + GET_MODE (cond_true), XEXP (cond_true, 0), + XEXP (cond_true, 1)); + if (GET_CODE (XEXP (set_src, 1)) == PC) diff --git a/openwrt/toolchain/gcc/3.4.3/800-arm-bigendian.patch b/openwrt/toolchain/gcc/3.4.3/800-arm-bigendian.patch new file mode 100644 index 0000000000..0bae8f474c --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/800-arm-bigendian.patch @@ -0,0 +1,70 @@ +By Lennert Buytenhek <buytenh@wantstofly.org> +Adds support for arm*b-linux* big-endian ARM targets + +See http://gcc.gnu.org/PR16350 + +diff -urN gcc-3.4.1-dist/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-08-16 16:01:50.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-16 15:43:40.000000000 -0500 +@@ -30,17 +30,34 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + /* Default is to use APCS-32 mode. */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 | \ ++ ARM_FLAG_MMU_TRAPS | \ ++ TARGET_ENDIAN_DEFAULT ) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -101,7 +118,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + #endif + +diff -urN gcc-3.4.1-dist/gcc/config.gcc gcc-3.4.1/gcc/config.gcc +--- gcc-3.4.1-dist/gcc/config.gcc 2004-08-16 16:01:50.000000000 -0500 ++++ gcc-3.4.1/gcc/config.gcc 2004-08-16 16:01:25.000000000 -0500 +@@ -672,6 +672,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/openwrt/toolchain/gcc/3.4.3/810-arm-bigendian-uclibc.patch b/openwrt/toolchain/gcc/3.4.3/810-arm-bigendian-uclibc.patch new file mode 100644 index 0000000000..a4d87e2317 --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/810-arm-bigendian-uclibc.patch @@ -0,0 +1,27 @@ +diff -urN gcc-3.4.1-dist/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-08-16 16:08:18.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-16 16:06:24.000000000 -0500 +@@ -107,7 +107,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + #else + #define LINK_SPEC "%{h*} %{version:-v} \ +diff -urN gcc-3.4.1-dist/gcc/config.gcc gcc-3.4.1/gcc/config.gcc +--- gcc-3.4.1-dist/gcc/config.gcc 2004-08-16 16:08:18.000000000 -0500 ++++ gcc-3.4.1/gcc/config.gcc 2004-08-16 16:03:25.000000000 -0500 +@@ -666,6 +666,11 @@ + ;; + arm*-*-linux-uclibc*) # ARM GNU/Linux with ELF - uClibc + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux-uclibc arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/openwrt/toolchain/gcc/3.4.3/arm-softfloat.patch.conditional b/openwrt/toolchain/gcc/3.4.3/arm-softfloat.patch.conditional new file mode 100644 index 0000000000..19d1b90dac --- /dev/null +++ b/openwrt/toolchain/gcc/3.4.3/arm-softfloat.patch.conditional @@ -0,0 +1,270 @@ +Note... modified my mjn3 to not conflict with the big endian arm patch. +Warning!!! Only the linux target is aware of TARGET_ENDIAN_DEFAULT. +Also changed + #define SUBTARGET_EXTRA_ASM_SPEC "\ + %{!mcpu=*:-mcpu=xscale} \ + %{mhard-float:-mfpu=fpa} \ + %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" +to + #define SUBTARGET_EXTRA_ASM_SPEC "\ + %{mhard-float:-mfpu=fpa} \ + %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" +in gcc/config/arm/linux-elf.h. +# +# Submitted: +# +# Dimitry Andric <dimitry@andric.com>, 2004-05-01 +# +# Description: +# +# Nicholas Pitre released this patch for gcc soft-float support here: +# http://lists.arm.linux.org.uk/pipermail/linux-arm/2003-October/006436.html +# +# This version has been adapted to work with gcc 3.4.0. +# +# The original patch doesn't distinguish between softfpa and softvfp modes +# in the way Nicholas Pitre probably meant. His description is: +# +# "Default is to use APCS-32 mode with soft-vfp. The old Linux default for +# floats can be achieved with -mhard-float or with the configure +# --with-float=hard option. If -msoft-float or --with-float=soft is used then +# software float support will be used just like the default but with the legacy +# big endian word ordering for double float representation instead." +# +# Which means the following: +# +# * If you compile without -mhard-float or -msoft-float, you should get +# software floating point, using the VFP format. The produced object file +# should have these flags in its header: +# +# private flags = 600: [APCS-32] [VFP float format] [software FP] +# +# * If you compile with -mhard-float, you should get hardware floating point, +# which always uses the FPA format. Object file header flags should be: +# +# private flags = 0: [APCS-32] [FPA float format] +# +# * If you compile with -msoft-float, you should get software floating point, +# using the FPA format. This is done for compatibility reasons with many +# existing distributions. Object file header flags should be: +# +# private flags = 200: [APCS-32] [FPA float format] [software FP] +# +# The original patch from Nicholas Pitre contained the following constructs: +# +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +# %{mhard-float:-mfpu=fpa} \ +# %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" +# +# However, gcc doesn't accept this ";:" notation, used in the 3rd line. This +# is probably the reason Robert Schwebel modified it to: +# +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +# %{mhard-float:-mfpu=fpa} \ +# %{!mhard-float: %{msoft-float:-mfpu=softfpa -mfpu=softvfp}}" +# +# But this causes the following behaviour: +# +# * If you compile without -mhard-float or -msoft-float, the compiler generates +# software floating point instructions, but *nothing* is passed to the +# assembler, which results in an object file which has flags: +# +# private flags = 0: [APCS-32] [FPA float format] +# +# This is not correct! +# +# * If you compile with -mhard-float, the compiler generates hardware floating +# point instructions, and passes "-mfpu=fpa" to the assembler, which results +# in an object file which has the same flags as in the previous item, but now +# those *are* correct. +# +# * If you compile with -msoft-float, the compiler generates software floating +# point instructions, and passes "-mfpu=softfpa -mfpu=softvfp" (in that +# order) to the assembler, which results in an object file with flags: +# +# private flags = 600: [APCS-32] [VFP float format] [software FP] +# +# This is not correct, because the last "-mfpu=" option on the assembler +# command line determines the actual FPU convention used (which should be FPA +# in this case). +# +# Therefore, I modified this patch to get the desired behaviour. Every +# instance of the notation: +# +# %{msoft-float:-mfpu=softfpa -mfpu=softvfp} +# +# was changed to: +# +# %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp} +# +# I also did the following: +# +# * Modified all TARGET_DEFAULT macros I could find to include ARM_FLAG_VFP, to +# be consistent with Nicholas' original patch. +# * Removed any "msoft-float" or "mhard-float" from all MULTILIB_DEFAULTS +# macros I could find. I think that if you compile without any options, you +# would like to get the defaults. :) +# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed +# anymore. (The required functions are now in libgcc.) + +diff -urN gcc-3.4.1-old/gcc/config/arm/coff.h gcc-3.4.1/gcc/config/arm/coff.h +--- gcc-3.4.1-old/gcc/config/arm/coff.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/coff.h 2004-09-02 21:51:15.000000000 -0500 +@@ -31,11 +31,16 @@ + #define TARGET_VERSION fputs (" (ARM/coff)", stderr) + + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" } + #endif + + /* This is COFF, but prefer stabs. */ +diff -urN gcc-3.4.1-old/gcc/config/arm/elf.h gcc-3.4.1/gcc/config/arm/elf.h +--- gcc-3.4.1-old/gcc/config/arm/elf.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -46,7 +46,9 @@ + + #ifndef SUBTARGET_ASM_FLOAT_SPEC + #define SUBTARGET_ASM_FLOAT_SPEC "\ +-%{mapcs-float:-mfloat} %{msoft-float:-mfpu=softfpa}" ++%{mapcs-float:-mfloat} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + #endif + + #ifndef ASM_SPEC +@@ -106,12 +108,17 @@ + #endif + + #ifndef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + #endif + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } + #endif + + #define TARGET_ASM_FILE_START_APP_OFF true +diff -urN gcc-3.4.1-old/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-old/gcc/config/arm/linux-elf.h 2004-09-02 21:50:52.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-09-02 22:00:49.000000000 -0500 +@@ -44,12 +44,26 @@ + #define TARGET_LINKER_EMULATION "armelf_linux" + #endif + +-/* Default is to use APCS-32 mode. */ ++/* ++ * Default is to use APCS-32 mode with soft-vfp. ++ * The old Linux default for floats can be achieved with -mhard-float ++ * or with the configure --with-float=hard option. ++ * If -msoft-float or --with-float=soft is used then software float ++ * support will be used just like the default but with the legacy ++ * big endian word ordering for double float representation instead. ++ */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT \ +- ( ARM_FLAG_APCS_32 | \ +- ARM_FLAG_MMU_TRAPS | \ +- TARGET_ENDIAN_DEFAULT ) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_SOFT_FLOAT \ ++ | TARGET_ENDIAN_DEFAULT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_MMU_TRAPS ) ++ ++#undef SUBTARGET_EXTRA_ASM_SPEC ++#define SUBTARGET_EXTRA_ASM_SPEC "\ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +@@ -57,7 +71,7 @@ + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -72,7 +86,7 @@ + %{shared:-lc} \ + %{!shared:%{profile:-lc_p}%{!profile:-lc}}" + +-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc" ++#define LIBGCC_SPEC "-lgcc" + + /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add + the GNU/Linux magical crtbegin.o file (see crtstuff.c) which +diff -urN gcc-3.4.1-old/gcc/config/arm/t-linux gcc-3.4.1/gcc/config/arm/t-linux +--- gcc-3.4.1-old/gcc/config/arm/t-linux 2003-09-20 16:09:07.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/t-linux 2004-09-02 21:51:15.000000000 -0500 +@@ -4,7 +4,10 @@ + LIBGCC2_DEBUG_CFLAGS = -g0 + + LIB1ASMSRC = arm/lib1funcs.asm +-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx ++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ ++ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ ++ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ ++ _fixsfsi _fixunssfsi + + # MULTILIB_OPTIONS = mhard-float/msoft-float + # MULTILIB_DIRNAMES = hard-float soft-float +diff -urN gcc-3.4.1-old/gcc/config/arm/unknown-elf.h gcc-3.4.1/gcc/config/arm/unknown-elf.h +--- gcc-3.4.1-old/gcc/config/arm/unknown-elf.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/unknown-elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -30,7 +30,12 @@ + + /* Default to using APCS-32 and software floating point. */ + #ifndef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + #endif + + /* Now we define the strings used to build the spec file. */ +diff -urN gcc-3.4.1-old/gcc/config/arm/xscale-elf.h gcc-3.4.1/gcc/config/arm/xscale-elf.h +--- gcc-3.4.1-old/gcc/config/arm/xscale-elf.h 2003-07-01 18:26:43.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/xscale-elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -49,11 +49,12 @@ + endian, regardless of the endian-ness of the memory + system. */ + +-#define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +- %{mhard-float:-mfpu=fpa} \ +- %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" ++#define SUBTARGET_EXTRA_ASM_SPEC "\ ++%{!mcpu=*:-mcpu=xscale} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "mlittle-endian", "mno-thumb-interwork", "marm", "msoft-float" } ++ { "mlittle-endian", "mno-thumb-interwork", "marm" } + #endif diff --git a/openwrt/toolchain/gcc/Config.in b/openwrt/toolchain/gcc/Config.in new file mode 100644 index 0000000000..9403aba278 --- /dev/null +++ b/openwrt/toolchain/gcc/Config.in @@ -0,0 +1,76 @@ +# Choose gcc version. +# WARNING -- 2.95 currently only builds for i386, arm, mips*, and powerpc. +# WARNING -- 2.95 does not currently build natively for the target. + +comment "Gcc Options" + +choice + prompt "GCC compiler Version" + default BR2_GCC_VERSION_3_4_2 + help + Select the version of gcc you wish to use. + + config BR2_GCC_VERSION_2_95 + bool "gcc 2.95" + depends on BR2_arm || BR2_i386 || BR2_mips || BR2_powerpc + + config BR2_GCC_VERSION_3_3_3 + bool "gcc 3.3.3" + + config BR2_GCC_VERSION_3_3_4 + bool "gcc 3.3.4" + + config BR2_GCC_VERSION_3_3_5 + bool "gcc 3.3.5" + + config BR2_GCC_VERSION_3_4_0 + bool "gcc 3.4.0" + + config BR2_GCC_VERSION_3_4_1 + bool "gcc 3.4.1" + + config BR2_GCC_VERSION_3_4_2 + bool "gcc 3.4.2" + + config BR2_GCC_VERSION_3_4_3 + bool "gcc 3.4.3" + +endchoice + +config BR2_GCC_VERSION + string + default "2.95" if BR2_GCC_VERSION_2_95 + default "3.3.3" if BR2_GCC_VERSION_3_3_3 + default "3.3.4" if BR2_GCC_VERSION_3_3_4 + default "3.3.5" if BR2_GCC_VERSION_3_3_5 + default "3.4.0" if BR2_GCC_VERSION_3_4_0 + default "3.4.1" if BR2_GCC_VERSION_3_4_1 + default "3.4.2" if BR2_GCC_VERSION_3_4_2 + default "3.4.3" if BR2_GCC_VERSION_3_4_3 + + +config BR2_GCC_USE_SJLJ_EXCEPTIONS + string + default "--enable-sjlj-exceptions" + help + Currently the unwind stuff seems to work for staticly linked apps + but not dynamic. So use setjmp/longjmp exceptions by default. + +config BR2_EXTRA_GCC_CONFIG_OPTIONS + string "Additional gcc options" + default "" + help + Any additional gcc options you may want to include.... + +config BR2_INSTALL_LIBSTDCPP + bool "Build/install c++ compiler and libstdc++?" + default n + help + Build/install c++ compiler and libstdc++? + +config BR2_INSTALL_LIBGCJ + bool "Build/install java compiler and libgcj?" + default n + depends on BR2_INSTALL_LIBSTDCPP + help + Build/install java compiler and libgcj? diff --git a/openwrt/toolchain/gcc/Config.in.2 b/openwrt/toolchain/gcc/Config.in.2 new file mode 100644 index 0000000000..c523b97051 --- /dev/null +++ b/openwrt/toolchain/gcc/Config.in.2 @@ -0,0 +1,6 @@ +config BR2_PACKAGE_GCC_TARGET + bool "native toolchain in the target filesystem" + default n + help + If you want the target system to be able to run + binutils/gcc and compile native code, say Y here. diff --git a/openwrt/toolchain/gcc/Makefile.in b/openwrt/toolchain/gcc/Makefile.in new file mode 100644 index 0000000000..2963ffbe3c --- /dev/null +++ b/openwrt/toolchain/gcc/Makefile.in @@ -0,0 +1,26 @@ +GCC_VERSION:=$(strip $(subst ",, $(BR2_GCC_VERSION))) +#" +GCC_USE_SJLJ_EXCEPTIONS:=$(strip $(subst ",, $(BR2_GCC_USE_SJLJ_EXCEPTIONS))) +#" +TARGET_OPTIMIZATION:=$(strip $(subst ",, $(BR2_TARGET_OPTIMIZATION))) +#"" + + +ifeq ($(BR2_SOFT_FLOAT),y) +# gcc 3.4.x soft float configuration is different than previous versions. +ifeq ($(findstring 3.4.,$(GCC_VERSION)),3.4.) +SOFT_FLOAT_CONFIG_OPTION:=--with-float=soft +else +SOFT_FLOAT_CONFIG_OPTION:=--without-float +endif +TARGET_SOFT_FLOAT:=-msoft-float +ARCH_FPU_SUFFIX:=_nofpu +else +SOFT_FLOAT_CONFIG_OPTION:= +TARGET_SOFT_FLOAT:= +ARCH_FPU_SUFFIX:= +endif + +ifeq ($(strip $(BR2_PACKAGE_GCC_TARGET)),y) +TARGETS+=gcc_target +endif diff --git a/openwrt/toolchain/gcc/gcc-uclibc-2.95.mk b/openwrt/toolchain/gcc/gcc-uclibc-2.95.mk new file mode 100644 index 0000000000..e5a36e4ccb --- /dev/null +++ b/openwrt/toolchain/gcc/gcc-uclibc-2.95.mk @@ -0,0 +1,277 @@ +# Makefile for to build a gcc/uClibc toolchain +# +# Copyright (C) 2002-2003 Erik Andersen <andersen@uclibc.org> +# Copyright (C) 2004 Manuel Novoa III <mjn3@uclibc.org> +# +# This program 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 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +ifeq ($(findstring 2.95,$(GCC_VERSION)),2.95) +GCC_VERSION:=$(strip $(GCC_VERSION)) + +GCC_SITE:=http://www.uclibc.org/downloads/toolchain +GCC_SOURCE:=gcc-20011006.tar.bz2 +GCC_DIR:=$(TOOL_BUILD_DIR)/gcc-20011006 +GCC_CAT:=bzcat + +STLPORT_SITE=http://www.stlport.org/archive +STLPORT_SOURCE=STLport-4.5.3.tar.gz +STLPORT_DIR=$(TOOL_BUILD_DIR)/STLport-4.5.3 +GCC_STRIP_HOST_BINARIES:=true + +############################################################# +# +# Setup some initial stuff +# +############################################################# + +ifeq ($(BR2_INSTALL_LIBSTDCPP),y) +TARGET_LANGUAGES:=c,c++ +STLPORT_TARGET=stlport +else +TARGET_LANGUAGES:=c +STLPORT_TARGET= +endif + +############################################################# +# +# build the first pass gcc compiler +# +############################################################# +GCC_BUILD_DIR1:=$(TOOL_BUILD_DIR)/gcc-$(GCC_VERSION)-initial + +$(DL_DIR)/$(GCC_SOURCE): + mkdir -p $(DL_DIR) + $(WGET) -P $(DL_DIR) $(GCC_SITE)/$(GCC_SOURCE) + +$(GCC_DIR)/.unpacked: $(DL_DIR)/$(GCC_SOURCE) + mkdir -p $(TOOL_BUILD_DIR) + $(GCC_CAT) $(DL_DIR)/$(GCC_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) - + touch $(GCC_DIR)/.unpacked + +$(GCC_DIR)/.patched: $(GCC_DIR)/.unpacked + # Apply any files named gcc-*.patch from the source directory to gcc + toolchain/patch-kernel.sh $(GCC_DIR) toolchain/gcc/$(GCC_VERSION) \*.patch\* + # + # We do not wish to build the libstdc++ library provided with gcc, + # since it doesn't seem to work at all with uClibc plus gcc 2.95... + # + mv $(GCC_DIR)/libstdc++ $(GCC_DIR)/libstdc++.orig + mv $(GCC_DIR)/libio $(GCC_DIR)/libio.orig + # + touch $(GCC_DIR)/.patched + +# The --without-headers option stopped working with gcc 3.0 and has never been +# # fixed, so we need to actually have working C library header files prior to +# # the step or libgcc will not build... +$(GCC_BUILD_DIR1)/.configured: $(GCC_DIR)/.patched + mkdir -p $(GCC_BUILD_DIR1) + -mkdir -p $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include + # Important! Required for limits.h to be fixed. + ln -sf include $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/sys-include + (cd $(GCC_BUILD_DIR1); PATH=$(TARGET_PATH) \ + $(GCC_DIR)/configure \ + --prefix=$(STAGING_DIR) \ + --build=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --enable-languages=c \ + --disable-shared \ + --includedir=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include \ + --with-headers=$(TOOL_BUILD_DIR)/uClibc_dev/usr/include \ + --disable-__cxa_atexit \ + --enable-target-optspace \ + --with-gnu-ld \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) \ + $(EXTRA_GCC_CONFIG_OPTIONS)); + touch $(GCC_BUILD_DIR1)/.configured + +$(GCC_BUILD_DIR1)/.compiled: $(GCC_BUILD_DIR1)/.configured + PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR1) all-gcc + touch $(GCC_BUILD_DIR1)/.compiled + +$(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc: $(GCC_BUILD_DIR1)/.compiled + PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR1) install-gcc + #rm -f $(STAGING_DIR)/bin/gccbug $(STAGING_DIR)/bin/gcov + #rm -rf $(STAGING_DIR)/info $(STAGING_DIR)/man $(STAGING_DIR)/share/doc $(STAGING_DIR)/share/locale + +gcc_initial: uclibc-configured binutils $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc + +gcc_initial-clean: + rm -rf $(GCC_BUILD_DIR1) + rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc_initial-dirclean: + rm -rf $(GCC_BUILD_DIR1) + +############################################################# +# +# STLport -- an alternative C++ library +# +############################################################# +STLPORT_PATCH=toolchain/gcc/2.95/STLport-4.5.3.patch + +$(DL_DIR)/$(STLPORT_SOURCE): + $(WGET) -P $(DL_DIR) $(STLPORT_SITE)/$(STLPORT_SOURCE) + +$(STLPORT_DIR)/Makefile: $(DL_DIR)/$(STLPORT_SOURCE) $(STLPORT_PATCH) + zcat $(DL_DIR)/$(STLPORT_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) - + cat $(STLPORT_PATCH) | patch -d $(STLPORT_DIR) -p1 + +$(STLPORT_DIR)/lib/libstdc++.a: $(STLPORT_DIR)/Makefile + $(MAKE) ARCH=$(OPTIMIZE_FOR_CPU) PREFIX=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME) -C $(STLPORT_DIR) + +$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++.a: $(STLPORT_DIR)/lib/libstdc++.a + $(MAKE) ARCH=$(OPTIMIZE_FOR_CPU) PREFIX=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME) -C $(STLPORT_DIR) install + +stlport: $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++.a + +stlport-source: $(DL_DIR)/$(STLPORT_SOURCE) + +stlport-clean: + rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++* + rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include/c++* + -$(MAKE) -C $(STLPORT_DIR) clean + +stlport-dirclean: + rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++* + rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include/g++-v3* + rm -rf $(STLPORT_DIR) + +############################################################# +# +# second pass compiler build. Build the compiler targeting +# the newly built shared uClibc library. +# +############################################################# +GCC_BUILD_DIR2:=$(TOOL_BUILD_DIR)/gcc-$(GCC_VERSION)-final + +$(GCC_BUILD_DIR2)/.configured: $(GCC_DIR)/.patched $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libc.a + mkdir -p $(GCC_BUILD_DIR2) + (cd $(GCC_BUILD_DIR2); PATH=$(TARGET_PATH) \ + $(GCC_DIR)/configure \ + --prefix=$(STAGING_DIR) \ + --build=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --enable-languages=$(TARGET_LANGUAGES) \ + --enable-shared \ + --with-gxx-include-dir=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include/c++ \ + --disable-__cxa_atexit \ + --enable-target-optspace \ + --with-gnu-ld \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) \ + $(EXTRA_GCC_CONFIG_OPTIONS)); + touch $(GCC_BUILD_DIR2)/.configured + +$(GCC_BUILD_DIR2)/.compiled: $(GCC_BUILD_DIR2)/.configured + PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR2) all + touch $(GCC_BUILD_DIR2)/.compiled + +$(GCC_BUILD_DIR2)/.installed: $(GCC_BUILD_DIR2)/.compiled + PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR2) install + # Strip the host binaries +ifeq ($(GCC_STRIP_HOST_BINARIES),true) + -strip --strip-all -R .note -R .comment $(STAGING_DIR)/bin/* +endif + # Set up the symlinks to enable lying about target name. + set -e; \ + (cd $(STAGING_DIR); \ + ln -sf $(REAL_GNU_TARGET_NAME) $(GNU_TARGET_NAME); \ + cd bin; \ + for app in $(REAL_GNU_TARGET_NAME)-* ; do \ + ln -sf $${app} \ + $(GNU_TARGET_NAME)$${app##$(REAL_GNU_TARGET_NAME)}; \ + done; \ + ); + touch $(GCC_BUILD_DIR2)/.installed + +gcc: uclibc-configured binutils gcc_initial $(LIBFLOAT_TARGET) uclibc \ + $(GCC_BUILD_DIR2)/.installed $(GCC_TARGETS) $(STLPORT_TARGET) + +gcc-source: $(DL_DIR)/$(GCC_SOURCE) + +gcc-clean: + rm -rf $(GCC_BUILD_DIR2) + rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc-dirclean: + rm -rf $(GCC_BUILD_DIR2) + +############################################################# +# +# Next build target gcc compiler +# +############################################################# +GCC_BUILD_DIR3:=$(BUILD_DIR)/gcc-$(GCC_VERSION)-target + +$(GCC_BUILD_DIR3)/.configured: $(GCC_BUILD_DIR2)/.installed + mkdir -p $(GCC_BUILD_DIR3) + (cd $(GCC_BUILD_DIR3); PATH=$(TARGET_PATH) \ + $(GCC_DIR)/configure \ + --prefix=/usr \ + --build=$(GNU_HOST_NAME) \ + --host=$(REAL_GNU_TARGET_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --enable-languages=$(TARGET_LANGUAGES) \ + --enable-shared \ + --with-gxx-include-dir=/usr/include/c++ \ + --disable-__cxa_atexit \ + --enable-target-optspace \ + --with-gnu-ld \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) \ + $(EXTRA_GCC_CONFIG_OPTIONS)); + touch $(GCC_BUILD_DIR3)/.configured + +$(GCC_BUILD_DIR3)/.compiled: $(GCC_BUILD_DIR3)/.configured + PATH=$(TARGET_PATH) \ + $(MAKE) $(TARGET_GCC_ARGS) -C $(GCC_BUILD_DIR3) all + touch $(GCC_BUILD_DIR3)/.compiled + +$(TARGET_DIR)/usr/bin/gcc: $(GCC_BUILD_DIR3)/.compiled + PATH=$(TARGET_PATH) \ + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(GCC_BUILD_DIR3) install + # Remove broken specs file (cross compile flag is set). + rm -f $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs + -(cd $(TARGET_DIR)/bin; find -type f | xargs $(STRIP) > /dev/null 2>&1) + -(cd $(TARGET_DIR)/usr/bin; find -type f | xargs $(STRIP) > /dev/null 2>&1) + -(cd $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION); $(STRIP) cc1 cc1plus collect2 > /dev/null 2>&1) + -(cd $(TARGET_DIR)/usr/lib; $(STRIP) libstdc++.so.*.*.* > /dev/null 2>&1) + -(cd $(TARGET_DIR)/lib; $(STRIP) libgcc_s.so.*.*.* > /dev/null 2>&1) + # + rm -f $(TARGET_DIR)/usr/lib/*.la* + #rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + # $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + # Work around problem of missing syslimits.h + cp -f $(STAGING_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/include/syslimits.h $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/include/ + # These are in /lib, so... + #rm -rf $(TARGET_DIR)/usr/lib/libgcc_s.so* + #touch -c $(TARGET_DIR)/usr/bin/gcc + +gcc_target: uclibc_target binutils_target $(TARGET_DIR)/usr/bin/gcc + +gcc_target-clean: + rm -rf $(GCC_BUILD_DIR3) + rm -f $(TARGET_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc_target-dirclean: + rm -rf $(GCC_BUILD_DIR3) + +endif diff --git a/openwrt/toolchain/gcc/gcc-uclibc-3.x.mk b/openwrt/toolchain/gcc/gcc-uclibc-3.x.mk new file mode 100644 index 0000000000..3457b4a69b --- /dev/null +++ b/openwrt/toolchain/gcc/gcc-uclibc-3.x.mk @@ -0,0 +1,321 @@ +# Makefile for to build a gcc/uClibc toolchain +# +# Copyright (C) 2002-2003 Erik Andersen <andersen@uclibc.org> +# Copyright (C) 2004 Manuel Novoa III <mjn3@uclibc.org> +# +# This program 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 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +ifneq ($(findstring 2.95,$(GCC_VERSION)),2.95) +GCC_VERSION:=$(strip $(GCC_VERSION)) + +#GCC_SITE:=ftp://ftp.gnu.org/gnu/gcc/releases/gcc-$(GCC_VERSION) +GCC_SITE:=http://mirrors.rcn.net/pub/sourceware/gcc/releases/gcc-$(GCC_VERSION) + +# +# snapshots.... +#GCC_VERSION:=3.3-20031013 +#GCC_SITE:=http://gcc.get-software.com/snapshots/$(GCC_VERSION) +# +GCC_SOURCE:=gcc-$(GCC_VERSION).tar.bz2 +GCC_DIR:=$(TOOL_BUILD_DIR)/gcc-$(GCC_VERSION) +GCC_CAT:=bzcat +GCC_STRIP_HOST_BINARIES:=true + +############################################################# +# +# Setup some initial stuff +# +############################################################# + +ifeq ($(BR2_INSTALL_LIBGCJ),y) +TARGET_LANGUAGES:=c,c++,java +else +ifeq ($(BR2_INSTALL_LIBSTDCPP),y) +TARGET_LANGUAGES:=c,c++ +else +TARGET_LANGUAGES:=c +endif +endif + +############################################################# +# +# build the first pass gcc compiler +# +############################################################# +GCC_BUILD_DIR1:=$(TOOL_BUILD_DIR)/gcc-$(GCC_VERSION)-initial + +$(DL_DIR)/$(GCC_SOURCE): + mkdir -p $(DL_DIR) + $(WGET) -P $(DL_DIR) $(GCC_SITE)/$(GCC_SOURCE) + +$(GCC_DIR)/.unpacked: $(DL_DIR)/$(GCC_SOURCE) + mkdir -p $(TOOL_BUILD_DIR) + $(GCC_CAT) $(DL_DIR)/$(GCC_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) - + touch $(GCC_DIR)/.unpacked + +$(GCC_DIR)/.patched: $(GCC_DIR)/.unpacked + # Apply any files named gcc-*.patch from the source directory to gcc + toolchain/patch-kernel.sh $(GCC_DIR) toolchain/gcc/$(GCC_VERSION) \*.patch + # Note: The soft float situation has improved considerably with gcc 3.4.x. + # We can dispense with the custom spec files, as well as libfloat for the arm case. + # However, we still need a patch for arm. There's a similar patch for gcc 3.3.x + # which needs to be integrated so we can kill of libfloat for good, except for + # anyone (?) who might still be using gcc 2.95. mjn3 +ifeq ($(BR2_SOFT_FLOAT),y) +ifeq ("$(strip $(ARCH))","arm") + toolchain/patch-kernel.sh $(GCC_DIR) toolchain/gcc/$(GCC_VERSION) arm-softfloat.patch.conditional +endif +ifeq ("$(strip $(ARCH))","armeb") + toolchain/patch-kernel.sh $(GCC_DIR) toolchain/gcc/$(GCC_VERSION) arm-softfloat.patch.conditional +endif + # Not yet updated to 3.4.1. + #ifeq ("$(strip $(ARCH))","i386") + #toolchain/patch-kernel.sh $(GCC_DIR) toolchain/gcc i386-gcc-soft-float.patch + #endif +endif + touch $(GCC_DIR)/.patched + +# The --without-headers option stopped working with gcc 3.0 and has never been +# # fixed, so we need to actually have working C library header files prior to +# # the step or libgcc will not build... + +$(GCC_BUILD_DIR1)/.configured: $(GCC_DIR)/.patched + mkdir -p $(GCC_BUILD_DIR1) + (cd $(GCC_BUILD_DIR1); PATH=$(TARGET_PATH) \ + $(GCC_DIR)/configure \ + --prefix=$(STAGING_DIR) \ + --build=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --enable-languages=c \ + --disable-shared \ + --with-sysroot=$(TOOL_BUILD_DIR)/uClibc_dev/ \ + --disable-__cxa_atexit \ + --enable-target-optspace \ + --with-gnu-ld \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) \ + $(GCC_WITH_CPU) $(GCC_WITH_ARCH) $(GCC_WITH_TUNE) \ + $(EXTRA_GCC_CONFIG_OPTIONS)); + touch $(GCC_BUILD_DIR1)/.configured + +$(GCC_BUILD_DIR1)/.compiled: $(GCC_BUILD_DIR1)/.configured + PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR1) all-gcc + touch $(GCC_BUILD_DIR1)/.compiled + +$(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc: $(GCC_BUILD_DIR1)/.compiled + PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR1) install-gcc + #rm -f $(STAGING_DIR)/bin/gccbug $(STAGING_DIR)/bin/gcov + #rm -rf $(STAGING_DIR)/info $(STAGING_DIR)/man $(STAGING_DIR)/share/doc $(STAGING_DIR)/share/locale + +gcc_initial: uclibc-configured binutils $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc + +gcc_initial-clean: + rm -rf $(GCC_BUILD_DIR1) + rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc_initial-dirclean: + rm -rf $(GCC_BUILD_DIR1) + +############################################################# +# +# second pass compiler build. Build the compiler targeting +# the newly built shared uClibc library. +# +############################################################# +# +# Sigh... I had to rework things because using --with-gxx-include-dir +# causes issues with include dir search order for g++. This seems to +# have something to do with "path translations" and possibly doesn't +# affect gcc-target. However, I haven't tested gcc-target yet so no +# guarantees. mjn3 + +GCC_BUILD_DIR2:=$(TOOL_BUILD_DIR)/gcc-$(GCC_VERSION)-final +$(GCC_BUILD_DIR2)/.configured: $(GCC_DIR)/.patched $(STAGING_DIR)/lib/libc.a + mkdir -p $(GCC_BUILD_DIR2) + # Important! Required for limits.h to be fixed. + ln -sf ../include $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/sys-include + (cd $(GCC_BUILD_DIR2); PATH=$(TARGET_PATH) \ + $(GCC_DIR)/configure \ + --prefix=$(STAGING_DIR) \ + --build=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --enable-languages=$(TARGET_LANGUAGES) \ + --enable-shared \ + --disable-__cxa_atexit \ + --enable-target-optspace \ + --with-gnu-ld \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) \ + $(GCC_WITH_CPU) $(GCC_WITH_ARCH) $(GCC_WITH_TUNE) \ + $(GCC_USE_SJLJ_EXCEPTIONS) \ + $(EXTRA_GCC_CONFIG_OPTIONS)); + touch $(GCC_BUILD_DIR2)/.configured + +$(GCC_BUILD_DIR2)/.compiled: $(GCC_BUILD_DIR2)/.configured + PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR2) all + touch $(GCC_BUILD_DIR2)/.compiled + +$(GCC_BUILD_DIR2)/.installed: $(GCC_BUILD_DIR2)/.compiled + PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR2) install + # Strip the host binaries +ifeq ($(GCC_STRIP_HOST_BINARIES),true) + -strip --strip-all -R .note -R .comment $(STAGING_DIR)/bin/* +endif + # Set up the symlinks to enable lying about target name. + set -e; \ + (cd $(STAGING_DIR); \ + ln -sf $(REAL_GNU_TARGET_NAME) $(GNU_TARGET_NAME); \ + cd bin; \ + for app in $(REAL_GNU_TARGET_NAME)-* ; do \ + ln -sf $${app} \ + $(GNU_TARGET_NAME)$${app##$(REAL_GNU_TARGET_NAME)}; \ + done; \ + ); + # + # Now for the ugly 3.3.x soft float hack... + # +ifeq ($(BR2_SOFT_FLOAT),y) +ifeq ($(findstring 3.3.,$(GCC_VERSION)),3.3.) + # Make sure we have a soft float specs file for this arch + if [ ! -f toolchain/gcc/$(GCC_VERSION)/specs-$(ARCH)-soft-float ] ; then \ + echo soft float configured but no specs file for this arch ; \ + /bin/false ; \ + fi; + # Replace specs file with one that defaults to soft float mode. + if [ ! -f $(STAGING_DIR)/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs ] ; then \ + echo staging dir specs file is missing ; \ + /bin/false ; \ + fi; + cp toolchain/gcc/$(GCC_VERSION)/specs-$(ARCH)-soft-float $(STAGING_DIR)/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs +endif +endif + # + # Ok... that's enough of that. + # + touch $(GCC_BUILD_DIR2)/.installed + +$(TARGET_DIR)/lib/libgcc_s.so.1: $(GCC_BUILD_DIR2)/.installed + # These are in /lib, so... + rm -rf $(TARGET_DIR)/usr/lib/libgcc_s.so* + -$(STRIP) $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libgcc_s.so.1 + -cp -a $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libgcc_s* $(TARGET_DIR)/lib/ + +gcc: uclibc-configured binutils gcc_initial $(LIBFLOAT_TARGET) uclibc \ + $(TARGET_DIR)/lib/libgcc_s.so.1 $(GCC_BUILD_DIR2)/.installed $(GCC_TARGETS) + +gcc-source: $(DL_DIR)/$(GCC_SOURCE) + +gcc-clean: + rm -rf $(GCC_BUILD_DIR2) + rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + +gcc-dirclean: + rm -rf $(GCC_BUILD_DIR2) + +############################################################# +# +# Next build target gcc compiler +# +############################################################# +GCC_BUILD_DIR3:=$(BUILD_DIR)/gcc-$(GCC_VERSION)-target + +$(GCC_BUILD_DIR3)/.configured: $(GCC_BUILD_DIR2)/.installed + mkdir -p $(GCC_BUILD_DIR3) + (cd $(GCC_BUILD_DIR3); PATH=$(TARGET_PATH) \ + $(GCC_DIR)/configure \ + --prefix=/usr \ + --build=$(GNU_HOST_NAME) \ + --host=$(REAL_GNU_TARGET_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --enable-languages=$(TARGET_LANGUAGES) \ + --enable-shared \ + --with-gxx-include-dir=/usr/include/c++ \ + --disable-__cxa_atexit \ + --enable-target-optspace \ + --with-gnu-ld \ + $(DISABLE_NLS) \ + $(MULTILIB) \ + $(SOFT_FLOAT_CONFIG_OPTION) \ + $(GCC_WITH_CPU) $(GCC_WITH_ARCH) $(GCC_WITH_TUNE) \ + $(GCC_USE_SJLJ_EXCEPTIONS) \ + $(EXTRA_GCC_CONFIG_OPTIONS)); + touch $(GCC_BUILD_DIR3)/.configured + +$(GCC_BUILD_DIR3)/.compiled: $(GCC_BUILD_DIR3)/.configured + PATH=$(TARGET_PATH) \ + $(MAKE) $(TARGET_GCC_ARGS) -C $(GCC_BUILD_DIR3) all + touch $(GCC_BUILD_DIR3)/.compiled + +# +# gcc-lib dir changes names to gcc with 3.4.mumble +# +ifeq ($(findstring 3.4.,$(GCC_VERSION)),3.4.) +GCC_LIB_SUBDIR=lib/gcc/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION) +else +GCC_LIB_SUBDIR=lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION) +endif + +$(TARGET_DIR)/usr/bin/gcc: $(GCC_BUILD_DIR3)/.compiled + PATH=$(TARGET_PATH) \ + $(MAKE) DESTDIR=$(TARGET_DIR) -C $(GCC_BUILD_DIR3) install + # Remove broken specs file (cross compile flag is set). + rm -f $(TARGET_DIR)/usr/$(GCC_LIB_SUBDIR)/specs + # + # Now for the ugly 3.3.x soft float hack... + # +ifeq ($(BR2_SOFT_FLOAT),y) +ifeq ($(findstring 3.3.,$(GCC_VERSION)),3.3.) + # Add a specs file that defaults to soft float mode. + cp toolchain/gcc/$(GCC_VERSION)/specs-$(ARCH)-soft-float $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs + # Make sure gcc does not think we are cross compiling + $(SED) "s/^1/0/;" $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs +endif +endif + # + # Ok... that's enough of that. + # + -(cd $(TARGET_DIR)/bin; find -type f | xargs $(STRIP) > /dev/null 2>&1) + -(cd $(TARGET_DIR)/usr/bin; find -type f | xargs $(STRIP) > /dev/null 2>&1) + -(cd $(TARGET_DIR)/usr/$(GCC_LIB_SUBDIR); $(STRIP) cc1 cc1plus collect2 > /dev/null 2>&1) + -(cd $(TARGET_DIR)/usr/lib; $(STRIP) libstdc++.so.*.*.* > /dev/null 2>&1) + -(cd $(TARGET_DIR)/lib; $(STRIP) libgcc_s.so.*.*.* > /dev/null 2>&1) + # + rm -f $(TARGET_DIR)/usr/lib/*.la* + #rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \ + # $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc + # Work around problem of missing syslimits.h + @if [ ! -f $(TARGET_DIR)/usr/$(GCC_LIB_SUBDIR)/include/syslimits.h ] ; then \ + echo "warning: working around missing syslimits.h" ; \ + cp -f $(STAGING_DIR)/$(GCC_LIB_SUBDIR)/include/syslimits.h \ + $(TARGET_DIR)/usr/$(GCC_LIB_SUBDIR)/include/ ; \ + fi + # These are in /lib, so... + #rm -rf $(TARGET_DIR)/usr/lib/libgcc_s.so* + #touch -c $(TARGET_DIR)/usr/bin/gcc + +gcc_target: uclibc_target binutils_target $(TARGET_DIR)/usr/bin/gcc + +gcc_target-clean: + rm -rf $(GCC_BUILD_DIR3) + rm -f $(TARGET_DIR)/usr/bin/$(REAL_GNU_TARGET_NAME)* + +gcc_target-dirclean: + rm -rf $(GCC_BUILD_DIR3) + +endif diff --git a/openwrt/toolchain/gcc/i386-gcc-soft-float.patch b/openwrt/toolchain/gcc/i386-gcc-soft-float.patch new file mode 100644 index 0000000000..97501087e2 --- /dev/null +++ b/openwrt/toolchain/gcc/i386-gcc-soft-float.patch @@ -0,0 +1,61 @@ +diff -urN gcc-3.3.2-orig/gcc/config/i386/i386.h gcc-3.3.2/gcc/config/i386/i386.h +--- gcc-3.3.2-orig/gcc/config/i386/i386.h 2003-06-25 16:18:31.000000000 -0500 ++++ gcc-3.3.2/gcc/config/i386/i386.h 2003-10-22 01:46:57.000000000 -0500 +@@ -653,6 +653,7 @@ + /* Define for XFmode or TFmode extended real floating point support. + The XFmode is specified by i386 ABI, while TFmode may be faster + due to alignment and simplifications in the address calculations. */ ++#if 0 + #define LONG_DOUBLE_TYPE_SIZE (TARGET_128BIT_LONG_DOUBLE ? 128 : 96) + #define MAX_LONG_DOUBLE_TYPE_SIZE 128 + #ifdef __x86_64__ +@@ -660,6 +661,17 @@ + #else + #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 96 + #endif ++#else ++ /* Set up for x86 soft float with 64-bit long doubles, since that's ++ * all the soft float emulation supports. */ ++#define LONG_DOUBLE_TYPE_SIZE (TARGET_128BIT_LONG_DOUBLE ? 128 : (TARGET_80387 ? 96 : 64)) ++#define MAX_LONG_DOUBLE_TYPE_SIZE 128 ++#ifdef __x86_64__ ++#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE 128 ++#else ++#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE (TARGET_80387 ? 96 : 64) ++#endif ++#endif + + /* Set the value of FLT_EVAL_METHOD in float.h. When using only the + FPU, assume that the fpcw is set to extended precision; when using +diff -urN gcc-3.3.2-orig/gcc/config/t-linux gcc-3.3.2/gcc/config/t-linux +--- gcc-3.3.2-orig/gcc/config/t-linux-uclibc 2003-06-04 11:56:11.000000000 -0500 ++++ gcc-3.3.2/gcc/config/t-linux-uclibc 2003-10-22 01:46:39.000000000 -0500 +@@ -21,3 +21,28 @@ + LIB2ADDEH = $(srcdir)/unwind-dw2.c $(srcdir)/unwind-dw2-fde.c \ + $(srcdir)/unwind-sjlj.c $(srcdir)/unwind-c.c + LIB2ADDEHDEP = unwind.inc unwind-dw2-fde.h ++ ++############################################## ++# We want fine grained libraries, so use the new code to build the ++# floating point emulation libraries. ++FPBIT = fp-bit.c ++DPBIT = dp-bit.c ++ ++#LIB2FUNCS_EXTRA = xp-bit.c ++ ++dp-bit.c: $(srcdir)/config/fp-bit.c ++ echo '#ifdef __LITTLE_ENDIAN__' > dp-bit.c ++ echo '#define FLOAT_BIT_ORDER_MISMATCH' >>dp-bit.c ++ echo '#endif' >> dp-bit.c ++ cat $(srcdir)/config/fp-bit.c >> dp-bit.c ++ ++fp-bit.c: $(srcdir)/config/fp-bit.c ++ echo '#define FLOAT' > fp-bit.c ++ echo '#ifdef __LITTLE_ENDIAN__' >> fp-bit.c ++ echo '#define FLOAT_BIT_ORDER_MISMATCH' >>fp-bit.c ++ echo '#endif' >> fp-bit.c ++ cat $(srcdir)/config/fp-bit.c >> fp-bit.c ++ ++#MULTILIB_OPTIONS = msoft-float ++#MULTILIB_DIRNAMES = soft-float ++ diff --git a/openwrt/toolchain/gdb/5.3/050-debian-subset.patch b/openwrt/toolchain/gdb/5.3/050-debian-subset.patch new file mode 100644 index 0000000000..e44b15ccdf --- /dev/null +++ b/openwrt/toolchain/gdb/5.3/050-debian-subset.patch @@ -0,0 +1,633 @@ +Patch pending upstream, probably acceptable. +-------------------------------------------- + + + +Daniel Jacobowitz <drow@mvista.com> writes: +> I like this. The way func_frame_chain_valid should really be used is +> by something like: +> +> /* NOTE: tm-i386nw.h and tm-i386v4.h override this. */ +> set_gdbarch_frame_chain_valid (gdbarch, file_frame_chain_valid); +> +> (copied from i386-tdep.c). +> +> Does this patch work for you? + +Yes, thanks. I've included a revised version of my patch below. + +> I'm curious as to why we can't just set this universally, or at least a +> little more globally. Most things that have a main () use it as a +> normal main (). I'd propose that we set it as the default frame chain, +> and provide/document an option to ignore inside_main_func. + +Well, gdbarch is never supposed to change the default behavior of +macros; this helps us convert pre-gdbarch targets incrementally. +Simply turning on gdbarch for one's target ideally wouldn't change its +behavior at all. + + +[Patch revised for Debian snapshot] +--- snap/gdb/i386-linux-tdep.c.orig 2002-08-18 19:53:57.000000000 -0400 ++++ snap/gdb/i386-linux-tdep.c 2002-08-18 19:54:31.000000000 -0400 +@@ -452,6 +452,9 @@ + + set_solib_svr4_fetch_link_map_offsets (gdbarch, + i386_linux_svr4_fetch_link_map_offsets); ++ ++ set_gdbarch_frame_chain_valid (gdbarch, ++ generic_func_frame_chain_valid); + } + + /* Provide a prototype to silence -Wmissing-prototypes. */ +[Hurd needs 6. Take 8, since it does no real harm.] + + +Package: gdb +Severity: normal +Tags: patch, sid + +Hello, + +GDB will crash on the Hurd after issuing the 'show' and hitting enter +a few times: + +../../gdb/ui-out.c:130: gdb-internal-error: push_level: Assertion +`uiout->level >= 0 && uiout->level < MAX_UI_OUT_LEVELS' failed. + +the problem is that MAX_UI_OUT_LEVELS is not high enough for the extra +option we have on the Hurd, it should be rised to 6 then, which works +fine: + +--- gdb-5.2.cvs20020401/gdb/ui-out.c~ Fri May 3 02:19:20 2002 ++++ gdb-5.2.cvs20020401/gdb/ui-out.c Fri May 3 02:19:32 2002 +@@ -45,7 +45,7 @@ + is always available. Stack/nested level 0 is reserved for the + top-level result. */ + +-enum { MAX_UI_OUT_LEVELS = 5 }; ++enum { MAX_UI_OUT_LEVELS = 8 }; + + struct ui_out_level + { + +-- +Robert Millan + +"5 years from now everyone will be running +free GNU on their 200 MIPS, 64M SPARCstation-5" + + Andrew S. Tanenbaum, 30 Jan 1992 + + +Submitted upstream, not liked very much. It's a hack, but it will do for +now. + +2002-07-31 Daniel Jacobowitz <drow@mvista.com> + + Fix PR gdb/568 + * thread-db.c (lwp_from_thread): Only warn if unable to find + the thread. + +Index: thread-db.c +=================================================================== +RCS file: /cvs/src/src/gdb/thread-db.c,v +retrieving revision 1.22 +diff -u -p -r1.22 thread-db.c +--- gdb/gdb/thread-db.c 23 Mar 2002 17:38:13 -0000 1.22 ++++ gdb/gdb/thread-db.c 31 Jul 2002 16:29:52 -0000 +@@ -260,6 +260,12 @@ lwp_from_thread (ptid_t ptid) + return ptid; + + err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (ptid), &th); ++ if (err == TD_ERR) ++ { ++ warning ("Cannot find thread %ld: %s", ++ (long) GET_THREAD (ptid), thread_db_err_str (err)); ++ return ptid; ++ } + if (err != TD_OK) + error ("Cannot find thread %ld: %s", + (long) GET_THREAD (ptid), thread_db_err_str (err)); +From Michael Fedrowitz <michaelf@debian.org>. Not submitted to FSF yet. + + Hi, + +gdb fails to build from source on m68k because some definitions have +been removed from tm-m68k.h. The patch below readds them. + +-Michael + + +diff -urN gdb-5.2.cvs20020818.orig/gdb/config/m68k/tm-m68k.h gdb-5.2.cvs20020818/gdb/config/m68k/tm-m68k.h +--- gdb-5.2.cvs20020818.orig/gdb/config/m68k/tm-m68k.h 2002-07-10 19:01:38.000000000 +0200 ++++ gdb-5.2.cvs20020818/gdb/config/m68k/tm-m68k.h 2002-10-06 18:01:59.000000000 +0200 +@@ -26,8 +26,11 @@ + /* Generic 68000 stuff, to be included by other tm-*.h files. */ + + /* D0_REGNM and A0_REGNUM must be defined here because they are +- used by the monitor. */ ++ used by the monitor. FPC_REGNUM, FPS_REGNUM and FPI_REGNUM are ++ defined here because they are used by m68klinux-nat.c. */ + + #define D0_REGNUM 0 + #define A0_REGNUM 8 +- ++#define FPC_REGNUM 26 ++#define FPS_REGNUM 27 ++#define FPI_REGNUM 28 + + +2002-11-24 Daniel Jacobowitz <drow@mvista.com> + + * doublest.c (convert_floatformat_to_doublest): Cast exp_bias to int. + * config/alpha/alpha-linux.mh (MH_CFLAGS): Add -mieee. + +--- gdb-5.2.debian90.cvs20021120/gdb/doublest.c.orig 2002-11-24 17:48:16.000000000 -0500 ++++ gdb-5.2.debian90.cvs20021120/gdb/doublest.c 2002-11-24 17:48:25.000000000 -0500 +@@ -177,7 +177,7 @@ + if (!special_exponent) + exponent -= fmt->exp_bias; + else if (exponent == 0) +- exponent = 1 - fmt->exp_bias; ++ exponent = 1 - (int)fmt->exp_bias; + + /* Build the result algebraically. Might go infinite, underflow, etc; + who cares. */ +--- gdb-5.2.debian90.cvs20021120/gdb/config/alpha/alpha-linux.mh.orig 2002-11-24 17:50:30.000000000 -0500 ++++ gdb-5.2.debian90.cvs20021120/gdb/config/alpha/alpha-linux.mh 2002-11-24 17:50:41.000000000 -0500 +@@ -8,3 +8,5 @@ + + MMALLOC = + MMALLOC_CFLAGS = -DNO_MMALLOC ++ ++MH_CFLAGS = -mieee +In CVS but not in 5.3 branch... + +2002-10-23 Daniel Jacobowitz <drow@mvista.com> + + * lin-lwp.c (lin_lwp_resume): Remove resume_all test for !step. + +Index: lin-lwp.c +=================================================================== +RCS file: /cvs/src/src/gdb/lin-lwp.c,v +retrieving revision 1.35 +diff -u -p -r1.35 lin-lwp.c +--- gdb-5.2.90/gdb/lin-lwp.c 27 Aug 2002 22:37:06 -0000 1.35 ++++ gdb-5.2.90/gdb/lin-lwp.c 23 Oct 2002 04:23:13 -0000 +@@ -579,11 +579,8 @@ lin_lwp_resume (ptid_t ptid, int step, e + struct lwp_info *lp; + int resume_all; + +- /* Apparently the interpretation of PID is dependent on STEP: If +- STEP is non-zero, a specific PID means `step only this process +- id'. But if STEP is zero, then PID means `continue *all* +- processes, but give the signal only to this one'. */ +- resume_all = (PIDGET (ptid) == -1) || !step; ++ /* A specific PTID means `step only this process id'. */ ++ resume_all = (PIDGET (ptid) == -1); + + if (resume_all) + iterate_over_lwps (resume_set_callback, NULL); + +Not submitted yet, testing. + +--- gdb-5.2.90/gdb/alpha-tdep.c.orig Sun Nov 24 21:42:53 2002 ++++ gdb-5.2.90/gdb/alpha-tdep.c Sun Nov 24 21:48:26 2002 +@@ -99,10 +99,12 @@ + + static alpha_extra_func_info_t heuristic_proc_desc (CORE_ADDR, + CORE_ADDR, +- struct frame_info *); ++ struct frame_info *, ++ int); + + static alpha_extra_func_info_t find_proc_desc (CORE_ADDR, +- struct frame_info *); ++ struct frame_info *, ++ int); + + #if 0 + static int alpha_in_lenient_prologue (CORE_ADDR, CORE_ADDR); +@@ -512,7 +514,7 @@ + if (tmp != 0) + pc = tmp; + +- proc_desc = find_proc_desc (pc, frame->next); ++ proc_desc = find_proc_desc (pc, frame->next, 1); + pcreg = proc_desc ? PROC_PC_REG (proc_desc) : ALPHA_RA_REGNUM; + + if (frame->signal_handler_caller) +@@ -596,10 +598,10 @@ + + static alpha_extra_func_info_t + heuristic_proc_desc (CORE_ADDR start_pc, CORE_ADDR limit_pc, +- struct frame_info *next_frame) ++ struct frame_info *next_frame, int read_sp_p) + { +- CORE_ADDR sp = read_next_frame_reg (next_frame, SP_REGNUM); +- CORE_ADDR vfp = sp; ++ CORE_ADDR sp; ++ CORE_ADDR vfp; + CORE_ADDR cur_pc; + int frame_size; + int has_frame_reg = 0; +@@ -607,6 +609,11 @@ + int pcreg = -1; + int regno; + ++ if (read_sp_p) ++ vfp = sp = read_next_frame_reg (next_frame, SP_REGNUM); ++ else ++ vfp = sp = 0; ++ + if (start_pc == 0) + return NULL; + memset (&temp_proc_desc, '\0', sizeof (temp_proc_desc)); +@@ -761,7 +768,7 @@ + CORE_ADDR func_addr, func_end; + + if (!proc_desc) +- proc_desc = find_proc_desc (pc, NULL); ++ proc_desc = find_proc_desc (pc, NULL, 0); + + if (proc_desc) + { +@@ -807,7 +814,7 @@ + } + + static alpha_extra_func_info_t +-find_proc_desc (CORE_ADDR pc, struct frame_info *next_frame) ++find_proc_desc (CORE_ADDR pc, struct frame_info *next_frame, int read_sp_p) + { + alpha_extra_func_info_t proc_desc; + struct block *b; +@@ -879,7 +886,7 @@ + { + alpha_extra_func_info_t found_heuristic = + heuristic_proc_desc (PROC_LOW_ADDR (proc_desc), +- pc, next_frame); ++ pc, next_frame, read_sp_p); + if (found_heuristic) + { + PROC_LOCALOFF (found_heuristic) = +@@ -921,7 +928,7 @@ + startaddr = heuristic_proc_start (pc); + + proc_desc = +- heuristic_proc_desc (startaddr, pc, next_frame); ++ heuristic_proc_desc (startaddr, pc, next_frame, read_sp_p); + } + return proc_desc; + } +@@ -937,7 +944,7 @@ + if (saved_pc == 0 || inside_entry_file (saved_pc)) + return 0; + +- proc_desc = find_proc_desc (saved_pc, frame); ++ proc_desc = find_proc_desc (saved_pc, frame, 1); + if (!proc_desc) + return 0; + +@@ -979,7 +986,7 @@ + { + /* Use proc_desc calculated in frame_chain */ + alpha_extra_func_info_t proc_desc = +- frame->next ? cached_proc_desc : find_proc_desc (frame->pc, frame->next); ++ frame->next ? cached_proc_desc : find_proc_desc (frame->pc, frame->next, 1); + + frame->extra_info = (struct frame_extra_info *) + frame_obstack_alloc (sizeof (struct frame_extra_info)); +@@ -1291,7 +1298,7 @@ + /* we need proc_desc to know how to restore the registers; + if it is NULL, construct (a temporary) one */ + if (proc_desc == NULL) +- proc_desc = find_proc_desc (frame->pc, frame->next); ++ proc_desc = find_proc_desc (frame->pc, frame->next, 1); + + /* Question: should we copy this proc_desc and save it in + frame->proc_desc? If we do, who will free it? +Not yet submitted upstream. This requires some serious thinking about. +If the target stack worked in any logical way, this wouldn't be necessary... +ending up with roughly: + thread_stratum: thread-db (silent reference to lin-lwp) + core_stratum: corelow + exec_stratum: exec + dummy_stratum: dummy +just makes no sense. + +This patch fixes debugging threaded applications which are statically linked +without breaking debugging threaded core files. It also fixes the PIDs in +generate-core-file'd corefiles. Mostly. + +diff -x '*~' -ur o/gdb-5.2.debian90.cvs20021120/gdb/corelow.c gdb-5.2.debian90.cvs20021120/gdb/corelow.c +--- o/gdb-5.2.debian90.cvs20021120/gdb/corelow.c 2002-09-18 13:23:15.000000000 -0400 ++++ gdb-5.2.debian90.cvs20021120/gdb/corelow.c 2002-12-03 14:03:32.000000000 -0500 +@@ -350,7 +350,7 @@ + bfd_map_over_sections (core_bfd, add_to_thread_list, + bfd_get_section_by_name (core_bfd, ".reg")); + +- if (ontop) ++ if (ontop || 1) + { + /* Fetch all registers from core file. */ + target_fetch_registers (-1); +diff -x '*~' -ur o/gdb-5.2.debian90.cvs20021120/gdb/linux-proc.c gdb-5.2.debian90.cvs20021120/gdb/linux-proc.c +--- o/gdb-5.2.debian90.cvs20021120/gdb/linux-proc.c 2002-12-03 14:13:52.000000000 -0500 ++++ gdb-5.2.debian90.cvs20021120/gdb/linux-proc.c 2002-12-03 13:56:34.000000000 -0500 +@@ -177,7 +177,7 @@ + #ifdef FILL_FPXREGSET + gdb_fpxregset_t fpxregs; + #endif +- unsigned long merged_pid = ptid_get_tid (ptid) << 16 | ptid_get_pid (ptid); ++ unsigned long merged_pid = ptid_get_tid (ptid) << 16; /* | ptid_get_pid (ptid); */ + + fill_gregset (&gregs, -1); + note_data = (char *) elfcore_write_prstatus (obfd, +diff -x '*~' -ur o/gdb-5.2.debian90.cvs20021120/gdb/target.c gdb-5.2.debian90.cvs20021120/gdb/target.c +--- o/gdb-5.2.debian90.cvs20021120/gdb/target.c 2002-09-18 13:23:22.000000000 -0400 ++++ gdb-5.2.debian90.cvs20021120/gdb/target.c 2002-12-03 14:06:07.000000000 -0500 +@@ -1589,6 +1589,7 @@ + dummy_target.to_find_memory_regions = dummy_find_memory_regions; + dummy_target.to_make_corefile_notes = dummy_make_corefile_notes; + dummy_target.to_magic = OPS_MAGIC; ++ cleanup_target (&dummy_target); + } + + +diff -x '*~' -ur o/gdb-5.2.debian90.cvs20021120/gdb/thread-db.c gdb-5.2.debian90.cvs20021120/gdb/thread-db.c +--- o/gdb-5.2.debian90.cvs20021120/gdb/thread-db.c 2002-12-03 14:13:50.000000000 -0500 ++++ gdb-5.2.debian90.cvs20021120/gdb/thread-db.c 2002-12-03 13:39:54.000000000 -0500 +@@ -57,6 +57,31 @@ + /* Non-zero if we're using this module's target vector. */ + static int using_thread_db; + ++/* Macros to pass an event to the next target if we should not be handling it ++ here in the thread_stratum. */ ++#define FIND_NEXT_TARGET(METHOD_NAME) \ ++ struct target_ops *next_target = &thread_db_ops; \ ++ while (1) \ ++ { \ ++ next_target = find_target_beneath (next_target); \ ++ if (next_target->METHOD_NAME != NULL) \ ++ break; \ ++ } ++ ++#define MAYBE_HAND_DOWN(METHOD_NAME,ARGS) \ ++ if (proc_handle.pid == 0) \ ++ { \ ++ FIND_NEXT_TARGET (METHOD_NAME); \ ++ (*next_target->METHOD_NAME) ARGS; \ ++ return; \ ++ } ++#define MAYBE_HAND_DOWN_RETURN(METHOD_NAME,ARGS) \ ++ if (proc_handle.pid == 0) \ ++ { \ ++ FIND_NEXT_TARGET (METHOD_NAME); \ ++ return (*next_target->METHOD_NAME) ARGS; \ ++ } ++ + /* Non-zero if we have to keep this module's target vector active + across re-runs. */ + static int keep_thread_db; +@@ -489,9 +514,7 @@ + { + td_err_e err; + +- /* Don't attempt to use thread_db on targets which can not run +- (core files). */ +- if (objfile == NULL || !target_has_execution) ++ if (objfile == NULL) + { + /* All symbols have been discarded. If the thread_db target is + active, deactivate it now. */ +@@ -515,7 +538,10 @@ + /* Initialize the structure that identifies the child process. Note + that at this point there is no guarantee that we actually have a + child process. */ +- proc_handle.pid = GET_PID (inferior_ptid); ++ if (target_has_execution) ++ proc_handle.pid = GET_PID (inferior_ptid); ++ else ++ proc_handle.pid = 0; + + /* Now attempt to open a connection to the thread library. */ + err = td_ta_new_p (&proc_handle, &thread_agent); +@@ -758,6 +784,9 @@ + struct cleanup *old_chain = save_inferior_ptid (); + int xfer; + ++ MAYBE_HAND_DOWN_RETURN (to_xfer_memory, (memaddr, myaddr, len, write, ++ attrib, target)); ++ + if (is_thread (inferior_ptid)) + { + /* FIXME: This seems to be necessary to make sure breakpoints +@@ -782,6 +811,8 @@ + gdb_prfpregset_t fpregset; + td_err_e err; + ++ MAYBE_HAND_DOWN (to_fetch_registers, (regno)); ++ + if (!is_thread (inferior_ptid)) + { + /* Pass the request to the target beneath us. */ +@@ -819,6 +850,8 @@ + gdb_prfpregset_t fpregset; + td_err_e err; + ++ MAYBE_HAND_DOWN (to_store_registers, (regno)); ++ + if (!is_thread (inferior_ptid)) + { + /* Pass the request to the target beneath us. */ +@@ -908,6 +941,8 @@ + td_thrinfo_t ti; + td_err_e err; + ++ MAYBE_HAND_DOWN_RETURN (to_thread_alive, (ptid)); ++ + if (is_thread (ptid)) + { + err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (ptid), &th); +@@ -961,6 +996,8 @@ + { + td_err_e err; + ++ MAYBE_HAND_DOWN (to_find_new_threads, ()); ++ + /* Iterate over all user-space threads to discover new threads. */ + err = td_ta_thr_iter_p (thread_agent, find_new_threads_callback, NULL, + TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY, +@@ -972,6 +1009,8 @@ + static char * + thread_db_pid_to_str (ptid_t ptid) + { ++ MAYBE_HAND_DOWN_RETURN (to_pid_to_str, (ptid)); ++ + if (is_thread (ptid)) + { + static char buf[64]; +Trivial. Need to submit this. + +--- gdb-5.2.debian90.cvs20021120/gdb/tracepoint.c.orig 2002-12-03 14:35:44.000000000 -0500 ++++ gdb-5.2.debian90.cvs20021120/gdb/tracepoint.c 2002-12-03 14:43:02.000000000 -0500 +@@ -861,6 +861,8 @@ + else + line = gdb_readline (0); + ++ if (line == NULL || *line == EOF) ++ break; + linetype = validate_actionline (&line, t); + if (linetype == BADLINE) + continue; /* already warned -- collect another line */ +Fix build on Sparc. + +--- gdb-5.3/gdb/sparc-nat.c.orig 2003-01-04 00:11:28.000000000 -0500 ++++ gdb-5.3/gdb/sparc-nat.c 2003-01-04 00:12:42.000000000 -0500 +@@ -33,6 +33,13 @@ + #include <sys/ptrace.h> + #include <sys/wait.h> + #ifdef __linux__ ++/* Sadly, <sys/ucontext.h> conflicts with <asm/reg.h> on Linux. And ++ -D_GNU_SOURCE brings in <sys/ucontext.h> implicitly with <signal.h>. ++ Hack around this. */ ++#undef FPU_REGS_TYPE ++#define fpu asm_reg_fpu ++#define fq asm_reg_fq ++#define fpq asm_reg_fpq + #include <asm/reg.h> + #else + #include <machine/reg.h> +diff -urN gdb-5.3/gdb/gdbserver.orig/gdbreplay.c gdb-5.3/gdb/gdbserver/gdbreplay.c +--- gdb-5.3/gdb/gdbserver.orig/gdbreplay.c 2002-07-09 11:38:58.000000000 -0600 ++++ gdb-5.3/gdb/gdbserver/gdbreplay.c 2003-08-20 08:44:20.000000000 -0600 +@@ -54,14 +54,15 @@ + perror_with_name (char *string) + { + #ifndef STDC_HEADERS +- extern int sys_nerr; + extern char *sys_errlist[]; + extern int errno; + #endif + const char *err; + char *combined; + +- err = (errno < sys_nerr) ? sys_errlist[errno] : "unknown error"; ++ err = strerror (errno); ++ if (err == NULL) ++ err = "unknown error"; + combined = (char *) alloca (strlen (err) + strlen (string) + 3); + strcpy (combined, string); + strcat (combined, ": "); +diff -urN gdb-5.3/gdb/gdbserver.orig/low-hppabsd.c gdb-5.3/gdb/gdbserver/low-hppabsd.c +--- gdb-5.3/gdb/gdbserver.orig/low-hppabsd.c 2002-01-17 14:13:49.000000000 -0700 ++++ gdb-5.3/gdb/gdbserver/low-hppabsd.c 2003-08-20 08:46:04.000000000 -0600 +@@ -61,7 +61,7 @@ + execv (program, allargs); + + fprintf (stderr, "Cannot exec %s: %s.\n", program, +- errno < sys_nerr ? sys_errlist[errno] : "unknown error"); ++ strerror (errno)); + fflush (stderr); + _exit (0177); + } +diff -urN gdb-5.3/gdb/gdbserver.orig/low-lynx.c gdb-5.3/gdb/gdbserver/low-lynx.c +--- gdb-5.3/gdb/gdbserver.orig/low-lynx.c 2002-01-17 14:13:49.000000000 -0700 ++++ gdb-5.3/gdb/gdbserver/low-lynx.c 2003-08-20 08:46:18.000000000 -0600 +@@ -79,7 +79,7 @@ + + fprintf (stderr, "GDBserver (process %d): Cannot exec %s: %s.\n", + getpid (), program, +- errno < sys_nerr ? sys_errlist[errno] : "unknown error"); ++ strerror (errno)); + fflush (stderr); + _exit (0177); + } +diff -urN gdb-5.3/gdb/gdbserver.orig/low-nbsd.c gdb-5.3/gdb/gdbserver/low-nbsd.c +--- gdb-5.3/gdb/gdbserver.orig/low-nbsd.c 2002-01-17 14:13:49.000000000 -0700 ++++ gdb-5.3/gdb/gdbserver/low-nbsd.c 2003-08-20 08:46:27.000000000 -0600 +@@ -137,7 +137,7 @@ + execv (program, allargs); + + fprintf (stderr, "Cannot exec %s: %s.\n", program, +- errno < sys_nerr ? sys_errlist[errno] : "unknown error"); ++ strerror (errno)); + fflush (stderr); + _exit (0177); + } +diff -urN gdb-5.3/gdb/gdbserver.orig/low-sparc.c gdb-5.3/gdb/gdbserver/low-sparc.c +--- gdb-5.3/gdb/gdbserver.orig/low-sparc.c 2002-01-17 14:13:50.000000000 -0700 ++++ gdb-5.3/gdb/gdbserver/low-sparc.c 2003-08-20 08:46:38.000000000 -0600 +@@ -44,7 +44,6 @@ + #include <sys/ptrace.h> + #include <sys/reg.h> + +-extern int sys_nerr; + extern char **sys_errlist; + extern int errno; + +@@ -67,7 +66,7 @@ + execv (program, allargs); + + fprintf (stderr, "Cannot exec %s: %s.\n", program, +- errno < sys_nerr ? sys_errlist[errno] : "unknown error"); ++ strerror (errno)); + fflush (stderr); + _exit (0177); + } +diff -urN gdb-5.3/gdb/gdbserver.orig/low-sun3.c gdb-5.3/gdb/gdbserver/low-sun3.c +--- gdb-5.3/gdb/gdbserver.orig/low-sun3.c 2002-01-17 14:13:50.000000000 -0700 ++++ gdb-5.3/gdb/gdbserver/low-sun3.c 2003-08-20 08:46:51.000000000 -0600 +@@ -41,7 +41,6 @@ + #include <sys/ptrace.h> + #include <machine/reg.h> + +-extern int sys_nerr; + extern char **sys_errlist; + extern int errno; + +@@ -64,7 +63,7 @@ + execv (program, allargs); + + fprintf (stderr, "Cannot exec %s: %s.\n", program, +- errno < sys_nerr ? sys_errlist[errno] : "unknown error"); ++ strerror (errno)); + fflush (stderr); + _exit (0177); + } +diff -urN gdb-5.3/gdb/gdbserver.orig/utils.c gdb-5.3/gdb/gdbserver/utils.c +--- gdb-5.3/gdb/gdbserver.orig/utils.c 2003-08-20 08:47:56.000000000 -0600 ++++ gdb-5.3/gdb/gdbserver/utils.c 2003-08-20 08:48:15.000000000 -0600 +@@ -33,16 +33,13 @@ + perror_with_name (char *string) + { + #ifndef STDC_HEADERS +- extern int sys_nerr; +- extern char *sys_errlist[]; + extern int errno; + #endif + const char *err; + char *combined; + +- if (errno < sys_nerr) +- err = sys_errlist[errno]; +- else ++ err = strerror (errno); ++ if (err == NULL) + err = "unknown error"; + + combined = (char *) alloca (strlen (err) + strlen (string) + 3); +diff -urN gdb-5.3/gdb/gdbserver.orig/linux-low.c.orig gdb-5.3/gdb/gdbserver/linux-low.c.orig +--- gdb-5.3/gdb/gdbserver.orig/linux-low.c 2003-08-20 08:40:27.000000000 -0600 ++++ gdb-5.3/gdb/gdbserver/linux-low.c 2003-08-20 08:44:54.000000000 -0600 +@@ -175,8 +175,7 @@ + if (ptrace (PTRACE_ATTACH, pid, 0, 0) != 0) + { + fprintf (stderr, "Cannot attach to process %d: %s (%d)\n", pid, +- errno < sys_nerr ? sys_errlist[errno] : "unknown error", +- errno); ++ strerror (errno), errno); + fflush (stderr); + + /* If we fail to attach to an LWP, just return. */ + diff --git a/openwrt/toolchain/gdb/5.3/100-uclibc.patch b/openwrt/toolchain/gdb/5.3/100-uclibc.patch new file mode 100644 index 0000000000..f9853035e3 --- /dev/null +++ b/openwrt/toolchain/gdb/5.3/100-uclibc.patch @@ -0,0 +1,154 @@ +diff -urN gdb-5.3/bfd/config.bfd gdb-5.3-new/bfd/config.bfd +--- gdb-5.3/bfd/config.bfd 2002-09-05 15:34:35.000000000 -0500 ++++ gdb-5.3-new/bfd/config.bfd 2004-01-11 06:25:31.000000000 -0600 +@@ -83,7 +83,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -97,7 +97,8 @@ + targ_defvec=bfd_elf64_ia64_aix_little_vec + targ_selvecs="bfd_elf64_ia64_aix_big_vec bfd_efi_app_ia64_vec" + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf*) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | \ ++ ia64*-*-linux-uclibc* | ia64*-*-elf*) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -176,11 +177,12 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | arm*-*-uclinux*) ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | \ ++ arm*-*-conix* | arm*-*-uclinux*) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +@@ -313,7 +315,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -324,7 +326,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -424,7 +426,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3456]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -438,7 +440,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -589,7 +591,7 @@ + targ_defvec=hp300hpux_vec + targ_underscore=yes + ;; +- m68*-*-linux*aout*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=m68klinux_vec + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes +@@ -865,7 +867,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -887,8 +890,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcqnx_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1038,7 +1041,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1081,7 +1084,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +diff -urN gdb-5.3/bfd/configure gdb-5.3-new/bfd/configure +--- gdb-5.3/bfd/configure 2002-08-28 05:38:44.000000000 -0500 ++++ gdb-5.3-new/bfd/configure 2004-01-11 06:27:15.000000000 -0600 +@@ -1677,6 +1677,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5067,7 +5072,7 @@ + alpha*-*-freebsd*) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5126,7 +5131,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3456]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; diff --git a/openwrt/toolchain/gdb/6.1.1/100-uclibc-conf.patch b/openwrt/toolchain/gdb/6.1.1/100-uclibc-conf.patch new file mode 100644 index 0000000000..8dbd347637 --- /dev/null +++ b/openwrt/toolchain/gdb/6.1.1/100-uclibc-conf.patch @@ -0,0 +1,290 @@ +diff -urN gdb-6.1.1-dist/bfd/config.bfd gdb-6.1.1/bfd/config.bfd +--- gdb-6.1.1-dist/bfd/config.bfd 2004-03-13 06:37:09.000000000 -0600 ++++ gdb-6.1.1/bfd/config.bfd 2004-08-08 05:01:47.000000000 -0500 +@@ -121,7 +121,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -131,7 +131,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu | ia64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -208,7 +208,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -216,7 +216,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -350,7 +350,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -361,7 +361,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-netbsd* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -483,7 +483,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -497,7 +497,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -667,7 +667,7 @@ + targ_defvec=hp300hpux_vec + targ_underscore=yes + ;; +- m68*-*-linux*aout*) ++ m68*-*-linux*aout* | m68*-*-linux-uclibc*) + targ_defvec=m68klinux_vec + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes +@@ -952,8 +952,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ +- powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | powerpc-*-rtems* | \ ++ powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss* ) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -984,8 +984,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* | \ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1141,7 +1141,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1188,7 +1188,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1257,7 +1257,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN gdb-6.1.1-dist/bfd/configure gdb-6.1.1/bfd/configure +--- gdb-6.1.1-dist/bfd/configure 2004-03-13 06:37:09.000000000 -0600 ++++ gdb-6.1.1/bfd/configure 2004-08-08 05:01:47.000000000 -0500 +@@ -1710,6 +1710,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5276,7 +5281,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5336,7 +5341,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5386,7 +5391,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5487,7 +5492,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN gdb-6.1.1-dist/bfd/configure.in gdb-6.1.1/bfd/configure.in +--- gdb-6.1.1-dist/bfd/configure.in 2004-03-13 06:37:09.000000000 -0600 ++++ gdb-6.1.1/bfd/configure.in 2004-08-08 05:01:47.000000000 -0500 +@@ -178,7 +178,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -259,7 +259,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -312,7 +312,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -397,7 +397,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN gdb-6.1.1-dist/libtool.m4 gdb-6.1.1/libtool.m4 +--- gdb-6.1.1-dist/libtool.m4 2003-04-10 22:58:39.000000000 -0500 ++++ gdb-6.1.1/libtool.m4 2004-08-08 05:01:47.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gdb-6.1.1-dist/ltconfig gdb-6.1.1/ltconfig +--- gdb-6.1.1-dist/ltconfig 2003-10-03 23:54:47.000000000 -0500 ++++ gdb-6.1.1/ltconfig 2004-08-08 05:01:47.000000000 -0500 +@@ -602,7 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in +-linux-gnu*) ;; ++linux-gnu*|linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1259,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN gdb-6.1.1-dist/opcodes/configure gdb-6.1.1/opcodes/configure +--- gdb-6.1.1-dist/opcodes/configure 2003-08-05 04:39:31.000000000 -0500 ++++ gdb-6.1.1/opcodes/configure 2004-08-08 05:01:47.000000000 -0500 +@@ -1700,6 +1700,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/gdb/6.1.1/200-uclibc-readline-conf.patch b/openwrt/toolchain/gdb/6.1.1/200-uclibc-readline-conf.patch new file mode 100644 index 0000000000..ffe792dd05 --- /dev/null +++ b/openwrt/toolchain/gdb/6.1.1/200-uclibc-readline-conf.patch @@ -0,0 +1,15 @@ +--- gdb-6.1.1-dist/readline/configure 2003-05-27 18:29:47.000000000 -0500 ++++ gdb-6.1.1/readline/configure 2004-08-09 14:20:23.000000000 -0500 +@@ -6249,7 +6249,12 @@ + + + echo "$as_me:$LINENO: checking for mbstate_t" >&5 ++echo $ECHO_N "bash_cv_have_mbstate_t=$bash_cv_have_mbstate_t" >&6 + echo $ECHO_N "checking for mbstate_t... $ECHO_C" >&6 ++if test "${bash_cv_have_mbstate_t+set}" != set; then ++ bash_cv_have_mbstate_t=yes ++ echo $ECHO_N "WARNING!! forcing to yes!!! $ECHO_C" >&6 ++fi + if test "${bash_cv_have_mbstate_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else diff --git a/openwrt/toolchain/gdb/6.2.1/100-uclibc-conf.patch b/openwrt/toolchain/gdb/6.2.1/100-uclibc-conf.patch new file mode 100644 index 0000000000..d3645bfeaa --- /dev/null +++ b/openwrt/toolchain/gdb/6.2.1/100-uclibc-conf.patch @@ -0,0 +1,290 @@ +diff -urN gdb-6.2-dist/bfd/config.bfd gdb-6.2/bfd/config.bfd +--- gdb-6.2-dist/bfd/config.bfd 2004-07-09 07:32:35.000000000 -0500 ++++ gdb-6.2/bfd/config.bfd 2004-08-08 04:23:19.000000000 -0500 +@@ -129,7 +129,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -139,7 +139,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu | ia64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -216,7 +216,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -224,7 +224,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -373,7 +373,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -384,7 +384,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-netbsd* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -507,7 +507,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -521,7 +521,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -691,7 +691,7 @@ + targ_defvec=hp300hpux_vec + targ_underscore=yes + ;; +- m68*-*-linux*aout*) ++ m68*-*-linux*aout* | m68*-*-linux-uclibc*) + targ_defvec=m68klinux_vec + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes +@@ -972,8 +972,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ +- powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | powerpc-*-rtems* | \ ++ powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss* ) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1009,8 +1009,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* | \ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1177,7 +1177,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1224,7 +1224,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1293,7 +1293,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN gdb-6.2-dist/bfd/configure gdb-6.2/bfd/configure +--- gdb-6.2-dist/bfd/configure 2004-07-07 12:28:45.000000000 -0500 ++++ gdb-6.2/bfd/configure 2004-08-08 04:27:01.000000000 -0500 +@@ -1698,6 +1698,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5264,7 +5269,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5328,7 +5333,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5366,7 +5371,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5470,7 +5475,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN gdb-6.2-dist/bfd/configure.in gdb-6.2/bfd/configure.in +--- gdb-6.2-dist/bfd/configure.in 2004-07-07 12:28:45.000000000 -0500 ++++ gdb-6.2/bfd/configure.in 2004-08-08 04:28:07.000000000 -0500 +@@ -164,7 +164,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -249,7 +249,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -290,7 +290,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -378,7 +378,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN gdb-6.2-dist/libtool.m4 gdb-6.2/libtool.m4 +--- gdb-6.2-dist/libtool.m4 2003-04-10 22:58:39.000000000 -0500 ++++ gdb-6.2/libtool.m4 2004-08-08 03:48:33.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gdb-6.2-dist/ltconfig gdb-6.2/ltconfig +--- gdb-6.2-dist/ltconfig 2003-10-03 23:54:47.000000000 -0500 ++++ gdb-6.2/ltconfig 2004-08-08 03:48:33.000000000 -0500 +@@ -602,7 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in +-linux-gnu*) ;; ++linux-gnu*|linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1259,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN gdb-6.2-dist/opcodes/configure gdb-6.2/opcodes/configure +--- gdb-6.2-dist/opcodes/configure 2004-07-07 12:28:53.000000000 -0500 ++++ gdb-6.2/opcodes/configure 2004-08-08 04:53:55.000000000 -0500 +@@ -1701,6 +1701,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/gdb/6.2.1/200-uclibc-readline-conf.patch b/openwrt/toolchain/gdb/6.2.1/200-uclibc-readline-conf.patch new file mode 100644 index 0000000000..ffe792dd05 --- /dev/null +++ b/openwrt/toolchain/gdb/6.2.1/200-uclibc-readline-conf.patch @@ -0,0 +1,15 @@ +--- gdb-6.1.1-dist/readline/configure 2003-05-27 18:29:47.000000000 -0500 ++++ gdb-6.1.1/readline/configure 2004-08-09 14:20:23.000000000 -0500 +@@ -6249,7 +6249,12 @@ + + + echo "$as_me:$LINENO: checking for mbstate_t" >&5 ++echo $ECHO_N "bash_cv_have_mbstate_t=$bash_cv_have_mbstate_t" >&6 + echo $ECHO_N "checking for mbstate_t... $ECHO_C" >&6 ++if test "${bash_cv_have_mbstate_t+set}" != set; then ++ bash_cv_have_mbstate_t=yes ++ echo $ECHO_N "WARNING!! forcing to yes!!! $ECHO_C" >&6 ++fi + if test "${bash_cv_have_mbstate_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else diff --git a/openwrt/toolchain/gdb/6.2.1/400-mips-coredump.patch b/openwrt/toolchain/gdb/6.2.1/400-mips-coredump.patch new file mode 100644 index 0000000000..4e17ba7bea --- /dev/null +++ b/openwrt/toolchain/gdb/6.2.1/400-mips-coredump.patch @@ -0,0 +1,28 @@ +Sometime around 2.4.22-23, the mips pt_regs.h fields were reordered, breaking +coredump handling by gdb for current kernels. Update the hardcoded constants +to reflect the change. +--- gdb-6.2.1/gdb/mips-linux-tdep.c-orig 2004-10-29 14:23:55.000000000 -0500 ++++ gdb-6.2.1/gdb/mips-linux-tdep.c 2004-10-29 14:26:44.000000000 -0500 +@@ -53,12 +53,22 @@ + + #define EF_REG0 6 + #define EF_REG31 37 ++ ++#if 0 + #define EF_LO 38 + #define EF_HI 39 + #define EF_CP0_EPC 40 + #define EF_CP0_BADVADDR 41 + #define EF_CP0_STATUS 42 + #define EF_CP0_CAUSE 43 ++#else ++#define EF_CP0_STATUS 38 ++#define EF_LO 39 ++#define EF_HI 40 ++#define EF_CP0_BADVADDR 41 ++#define EF_CP0_CAUSE 42 ++#define EF_CP0_EPC 43 ++#endif + + #define EF_SIZE 180 + diff --git a/openwrt/toolchain/gdb/6.2/100-uclibc-conf.patch b/openwrt/toolchain/gdb/6.2/100-uclibc-conf.patch new file mode 100644 index 0000000000..d3645bfeaa --- /dev/null +++ b/openwrt/toolchain/gdb/6.2/100-uclibc-conf.patch @@ -0,0 +1,290 @@ +diff -urN gdb-6.2-dist/bfd/config.bfd gdb-6.2/bfd/config.bfd +--- gdb-6.2-dist/bfd/config.bfd 2004-07-09 07:32:35.000000000 -0500 ++++ gdb-6.2/bfd/config.bfd 2004-08-08 04:23:19.000000000 -0500 +@@ -129,7 +129,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -139,7 +139,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu | ia64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -216,7 +216,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -224,7 +224,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -373,7 +373,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -384,7 +384,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-netbsd* | hppa*-*-linux-uclibc*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -507,7 +507,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -521,7 +521,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -691,7 +691,7 @@ + targ_defvec=hp300hpux_vec + targ_underscore=yes + ;; +- m68*-*-linux*aout*) ++ m68*-*-linux*aout* | m68*-*-linux-uclibc*) + targ_defvec=m68klinux_vec + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes +@@ -972,8 +972,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ +- powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | powerpc-*-rtems* | \ ++ powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss* ) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1009,8 +1009,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* | \ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1177,7 +1177,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1224,7 +1224,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1293,7 +1293,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN gdb-6.2-dist/bfd/configure gdb-6.2/bfd/configure +--- gdb-6.2-dist/bfd/configure 2004-07-07 12:28:45.000000000 -0500 ++++ gdb-6.2/bfd/configure 2004-08-08 04:27:01.000000000 -0500 +@@ -1698,6 +1698,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5264,7 +5269,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5328,7 +5333,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5366,7 +5371,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5470,7 +5475,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN gdb-6.2-dist/bfd/configure.in gdb-6.2/bfd/configure.in +--- gdb-6.2-dist/bfd/configure.in 2004-07-07 12:28:45.000000000 -0500 ++++ gdb-6.2/bfd/configure.in 2004-08-08 04:28:07.000000000 -0500 +@@ -164,7 +164,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -249,7 +249,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -290,7 +290,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -378,7 +378,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN gdb-6.2-dist/libtool.m4 gdb-6.2/libtool.m4 +--- gdb-6.2-dist/libtool.m4 2003-04-10 22:58:39.000000000 -0500 ++++ gdb-6.2/libtool.m4 2004-08-08 03:48:33.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN gdb-6.2-dist/ltconfig gdb-6.2/ltconfig +--- gdb-6.2-dist/ltconfig 2003-10-03 23:54:47.000000000 -0500 ++++ gdb-6.2/ltconfig 2004-08-08 03:48:33.000000000 -0500 +@@ -602,7 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in +-linux-gnu*) ;; ++linux-gnu*|linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1259,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN gdb-6.2-dist/opcodes/configure gdb-6.2/opcodes/configure +--- gdb-6.2-dist/opcodes/configure 2004-07-07 12:28:53.000000000 -0500 ++++ gdb-6.2/opcodes/configure 2004-08-08 04:53:55.000000000 -0500 +@@ -1701,6 +1701,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/openwrt/toolchain/gdb/6.2/200-uclibc-readline-conf.patch b/openwrt/toolchain/gdb/6.2/200-uclibc-readline-conf.patch new file mode 100644 index 0000000000..ffe792dd05 --- /dev/null +++ b/openwrt/toolchain/gdb/6.2/200-uclibc-readline-conf.patch @@ -0,0 +1,15 @@ +--- gdb-6.1.1-dist/readline/configure 2003-05-27 18:29:47.000000000 -0500 ++++ gdb-6.1.1/readline/configure 2004-08-09 14:20:23.000000000 -0500 +@@ -6249,7 +6249,12 @@ + + + echo "$as_me:$LINENO: checking for mbstate_t" >&5 ++echo $ECHO_N "bash_cv_have_mbstate_t=$bash_cv_have_mbstate_t" >&6 + echo $ECHO_N "checking for mbstate_t... $ECHO_C" >&6 ++if test "${bash_cv_have_mbstate_t+set}" != set; then ++ bash_cv_have_mbstate_t=yes ++ echo $ECHO_N "WARNING!! forcing to yes!!! $ECHO_C" >&6 ++fi + if test "${bash_cv_have_mbstate_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else diff --git a/openwrt/toolchain/gdb/Config.in b/openwrt/toolchain/gdb/Config.in new file mode 100644 index 0000000000..a17b736dc6 --- /dev/null +++ b/openwrt/toolchain/gdb/Config.in @@ -0,0 +1,49 @@ +# Choose gcc version. +# WARNING -- 2.95 currently only builds for i386, arm, mips*, and powerpc. +# WARNING -- 2.95 does not currently build natively for the target. + +comment "Gdb Options" + +config BR2_PACKAGE_GDB + bool "Build gdb debugger for the Target" + default n + select BR2_PACKAGE_NCURSES + help + Enable the gdb debugger. + +config BR2_PACKAGE_GDB_SERVER + bool "Build gdb server for the Target" + default n + select BR2_PACKAGE_NCURSES + help + Enable the gdb debugger. + +choice + prompt "GDB debuger Version" + default BR2_GDB_VERSION_5_3 + depends on BR2_PACKAGE_GDB || BR2_PACKAGE_GDB_SERVER || BR2_HOST_GDB + help + Select the version of gcc you wish to use. + + config BR2_GDB_VERSION_5.3 + bool "gdb 5.3" + + config BR2_GDB_VERSION_6_1_1 + bool "gdb 6.1.1" + + config BR2_GDB_VERSION_6_2 + bool "gdb 6.2" + + config BR2_GDB_VERSION_6_2_1 + bool "gdb 6.2.1" + +endchoice + +config BR2_GDB_VERSION + string + default "5.3" if BR2_GDB_VERSION_5.3 + default "6.1.1" if BR2_GDB_VERSION_6_1_1 + default "6.2" if BR2_GDB_VERSION_6_2 + default "6.2.1" if BR2_GDB_VERSION_6_2_1 + + diff --git a/openwrt/toolchain/gdb/Makefile.in b/openwrt/toolchain/gdb/Makefile.in new file mode 100644 index 0000000000..51a2ddb3d0 --- /dev/null +++ b/openwrt/toolchain/gdb/Makefile.in @@ -0,0 +1,10 @@ +GDB_VERSION:=$(strip $(subst ",, $(BR2_GDB_VERSION))) +#" + +ifeq ($(strip $(BR2_PACKAGE_GDB)),y) +TARGETS+=gdb_target +endif + +ifeq ($(strip $(BR2_PACKAGE_GDB_SERVER)),y) +TARGETS+=gdbserver gdbclient +endif diff --git a/openwrt/toolchain/gdb/gdb.mk b/openwrt/toolchain/gdb/gdb.mk new file mode 100644 index 0000000000..862f84d7f5 --- /dev/null +++ b/openwrt/toolchain/gdb/gdb.mk @@ -0,0 +1,189 @@ +###################################################################### +# +# gdb +# +###################################################################### +GDB_VERSION:=$(strip $(GDB_VERSION)) + +GDB_SITE:=http://ftp.gnu.org/gnu/gdb + +ifeq ($(GDB_VERSION),5.3) +GDB_SOURCE:=gdb-$(GDB_VERSION).tar.gz +GDB_CAT:=zcat +else +GDB_SOURCE:=gdb-$(GDB_VERSION).tar.bz2 +GDB_CAT:=bzcat +endif + +GDB_DIR:=$(TOOL_BUILD_DIR)/gdb-$(GDB_VERSION) + +$(DL_DIR)/$(GDB_SOURCE): + $(WGET) -P $(DL_DIR) $(GDB_SITE)/$(GDB_SOURCE) + +$(GDB_DIR)/.unpacked: $(DL_DIR)/$(GDB_SOURCE) + $(GDB_CAT) $(DL_DIR)/$(GDB_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) - + toolchain/patch-kernel.sh $(GDB_DIR) toolchain/gdb/$(GDB_VERSION) \*.patch + # Copy a config.sub from gcc. This is only necessary until + # gdb's config.sub supports <arch>-linux-uclibc tuples. + # Should probably integrate this into the patch. +ifeq ($(GDB_VERSION),5.3) + chmod u+x $(GDB_DIR)/gdb/gdbserver/configure + cp $(GCC_DIR)/config.sub $(GDB_DIR) + cp $(GCC_DIR)/config.sub $(GDB_DIR)/readline/support/ +endif + touch $(GDB_DIR)/.unpacked + +###################################################################### +# +# gdb target +# +###################################################################### + +GDB_TARGET_DIR:=$(BUILD_DIR)/gdb-$(GDB_VERSION)-target + +GDB_TARGET_CONFIGURE_VARS:= \ + ac_cv_type_uintptr_t=yes \ + gt_cv_func_gettext_libintl=yes \ + ac_cv_func_dcgettext=yes \ + gdb_cv_func_sigsetjmp=yes \ + bash_cv_func_strcoll_broken=no \ + bash_cv_must_reinstall_sighandlers=no \ + bash_cv_func_sigsetjmp=present \ + bash_cv_have_mbstate_t=yes + +$(GDB_TARGET_DIR)/.configured: $(GDB_DIR)/.unpacked + mkdir -p $(GDB_TARGET_DIR) + (cd $(GDB_TARGET_DIR); \ + gdb_cv_func_sigsetjmp=yes \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS_FOR_TARGET="$(TARGET_CFLAGS)" \ + $(GDB_TARGET_CONFIGURE_VARS) \ + $(GDB_DIR)/configure \ + --build=$(GNU_HOST_NAME) \ + --host=$(REAL_GNU_TARGET_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --prefix=/usr \ + $(DISABLE_NLS) \ + --without-uiout --disable-gdbmi \ + --disable-tui --disable-gdbtk --without-x \ + --disable-sim --enable-gdbserver \ + --without-included-gettext \ + ); +ifeq ($(ENABLE_LOCALE),true) + -$(SED) "s,^INTL *=.*,INTL = -lintl,g;" $(GDB_DIR)/gdb/Makefile +endif + touch $(GDB_TARGET_DIR)/.configured + +$(GDB_TARGET_DIR)/gdb/gdb: $(GDB_TARGET_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) MT_CFLAGS="$(TARGET_CFLAGS)" \ + -C $(GDB_TARGET_DIR) + $(STRIP) $(GDB_TARGET_DIR)/gdb/gdb + +$(TARGET_DIR)/usr/bin/gdb: $(GDB_TARGET_DIR)/gdb/gdb + install -c $(GDB_TARGET_DIR)/gdb/gdb $(TARGET_DIR)/usr/bin/gdb + +gdb_target: ncurses-headers $(TARGET_DIR)/usr/bin/gdb + +gdb_target-source: $(DL_DIR)/$(GDB_SOURCE) + +gdb_target-clean: + $(MAKE) -C $(GDB_DIR) clean + +gdb_target-dirclean: + rm -rf $(GDB_DIR) + +###################################################################### +# +# gdbserver +# +###################################################################### + +GDB_SERVER_DIR:=$(BUILD_DIR)/gdbserver-$(GDB_VERSION) + +$(GDB_SERVER_DIR)/.configured: $(GDB_DIR)/.unpacked + mkdir -p $(GDB_SERVER_DIR) + (cd $(GDB_SERVER_DIR); \ + $(TARGET_CONFIGURE_OPTS) \ + gdb_cv_func_sigsetjmp=yes \ + $(GDB_DIR)/gdb/gdbserver/configure \ + --build=$(GNU_HOST_NAME) \ + --host=$(REAL_GNU_TARGET_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + --prefix=/usr \ + --exec-prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --libexecdir=/usr/lib \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --localstatedir=/var \ + --mandir=/usr/man \ + --infodir=/usr/info \ + --includedir=$(STAGING_DIR)/include \ + $(DISABLE_NLS) \ + --without-uiout --disable-gdbmi \ + --disable-tui --disable-gdbtk --without-x \ + --without-included-gettext \ + ); + touch $(GDB_SERVER_DIR)/.configured + +$(GDB_SERVER_DIR)/gdbserver: $(GDB_SERVER_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) MT_CFLAGS="$(TARGET_CFLAGS)" \ + -C $(GDB_SERVER_DIR) + $(STRIP) $(GDB_SERVER_DIR)/gdbserver + +$(TARGET_DIR)/usr/bin/gdbserver: $(GDB_SERVER_DIR)/gdbserver + install -c $(GDB_SERVER_DIR)/gdbserver $(TARGET_DIR)/usr/bin/gdbserver + +gdbserver: ncurses-headers $(TARGET_DIR)/usr/bin/gdbserver + +gdbserver-clean: + $(MAKE) -C $(GDB_SERVER_DIR) clean + +gdbserver-dirclean: + rm -rf $(GDB_SERVER_DIR) + +###################################################################### +# +# gdb client +# +###################################################################### + +GDB_CLIENT_DIR:=$(TOOL_BUILD_DIR)/gdbclient-$(GDB_VERSION) + +$(GDB_CLIENT_DIR)/.configured: $(GDB_DIR)/.unpacked + mkdir -p $(GDB_CLIENT_DIR) + (cd $(GDB_CLIENT_DIR); \ + gdb_cv_func_sigsetjmp=yes \ + $(GDB_DIR)/configure \ + --prefix=$(STAGING_DIR) \ + --build=$(GNU_HOST_NAME) \ + --host=$(GNU_HOST_NAME) \ + --target=$(REAL_GNU_TARGET_NAME) \ + $(DISABLE_NLS) \ + --without-uiout --disable-gdbmi \ + --disable-tui --disable-gdbtk --without-x \ + --without-included-gettext \ + --enable-threads \ + ); + touch $(GDB_CLIENT_DIR)/.configured + +$(GDB_CLIENT_DIR)/gdb/gdb: $(GDB_CLIENT_DIR)/.configured + $(MAKE) -C $(GDB_CLIENT_DIR) + strip $(GDB_CLIENT_DIR)/gdb/gdb + +$(TARGET_CROSS)gdb: $(GDB_CLIENT_DIR)/gdb/gdb + install -c $(GDB_CLIENT_DIR)/gdb/gdb $(TARGET_CROSS)gdb + ln -s ../../bin/$(REAL_GNU_TARGET_NAME)-gdb \ + $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/bin/gdb + +gdbclient: $(TARGET_CROSS)gdb + +gdbclient-clean: + $(MAKE) -C $(GDB_CLIENT_DIR) clean + +gdbclient-dirclean: + rm -rf $(GDB_CLIENT_DIR) + + + diff --git a/openwrt/toolchain/patch-kernel.sh b/openwrt/toolchain/patch-kernel.sh new file mode 100755 index 0000000000..79401c2a74 --- /dev/null +++ b/openwrt/toolchain/patch-kernel.sh @@ -0,0 +1,53 @@ +#! /bin/sh +# A little script I whipped up to make it easy to +# patch source trees and have sane error handling +# -Erik +# +# (c) 2002 Erik Andersen <andersen@codepoet.org> + +# Set directories from arguments, or use defaults. +targetdir=${1-.} +patchdir=${2-../kernel-patches} +patchpattern=${3-*} + +if [ ! -d "${targetdir}" ] ; then + echo "Aborting. '${targetdir}' is not a directory." + exit 1 +fi +if [ ! -d "${patchdir}" ] ; then + echo "Aborting. '${patchdir}' is not a directory." + exit 1 +fi + +for i in ${patchdir}/${patchpattern} ; do + case "$i" in + *.gz) + type="gzip"; uncomp="gunzip -dc"; ;; + *.bz) + type="bzip"; uncomp="bunzip -dc"; ;; + *.bz2) + type="bzip2"; uncomp="bunzip2 -dc"; ;; + *.zip) + type="zip"; uncomp="unzip -d"; ;; + *.Z) + type="compress"; uncomp="uncompress -c"; ;; + *) + type="plaintext"; uncomp="cat"; ;; + esac + echo "" + echo "Applying ${i} using ${type}: " + ${uncomp} ${i} | patch -p1 -E -d ${targetdir} + if [ $? != 0 ] ; then + echo "Patch failed! Please fix $i!" + exit 1 + fi +done + +# Check for rejects... +if [ "`find $targetdir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ] ; then + echo "Aborting. Reject files found." + exit 1 +fi + +# Remove backup files +find $targetdir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \; diff --git a/openwrt/toolchain/uClibc/Config.in b/openwrt/toolchain/uClibc/Config.in new file mode 100644 index 0000000000..335cab2455 --- /dev/null +++ b/openwrt/toolchain/uClibc/Config.in @@ -0,0 +1,23 @@ +# Choose uClibc options +# + +comment "uClibc Options" + +config BR2_UCLIBC_VERSION_SNAPSHOT + bool "Use the daily snapshot of uClibc?" + default y + help + Would you like to use the latest daily snapshot? + +config BR2_USE_UCLIBC_SNAPSHOT + string + default "snapshot" + depends on BR2_UCLIBC_VERSION_SNAPSHOT + +config BR2_ENABLE_LOCALE + bool "Enable locale/gettext/i18n support?" + default n + help + Enable locale/gettext/i18n support? + + diff --git a/openwrt/toolchain/uClibc/uClibc.config b/openwrt/toolchain/uClibc/uClibc.config new file mode 100644 index 0000000000..4c3c5a1792 --- /dev/null +++ b/openwrt/toolchain/uClibc/uClibc.config @@ -0,0 +1,150 @@ +# +# Automatically generated make config: don't edit +# +# TARGET_alpha is not set +# TARGET_arm is not set +# TARGET_cris is not set +# TARGET_e1 is not set +# TARGET_frv is not set +# TARGET_h8300 is not set +# TARGET_i386 is not set +# TARGET_i960 is not set +# TARGET_m68k is not set +# TARGET_microblaze is not set +TARGET_mips=y +# TARGET_nios is not set +# TARGET_nios2 is not set +# TARGET_powerpc is not set +# TARGET_sh is not set +# TARGET_sparc is not set +# TARGET_v850 is not set + +# +# Target Architecture Features and Options +# +HAVE_ELF=y +ARCH_SUPPORTS_LITTLE_ENDIAN=y +TARGET_ARCH="mips" +ARCH_CFLAGS="-mno-split-addresses" +ARCH_SUPPORTS_BIG_ENDIAN=y +# CONFIG_MIPS_ISA_1 is not set +# CONFIG_MIPS_ISA_2 is not set +# CONFIG_MIPS_ISA_3 is not set +# CONFIG_MIPS_ISA_4 is not set +CONFIG_MIPS_ISA_MIPS32=y +# CONFIG_MIPS_ISA_MIPS64 is not set +ARCH_LITTLE_ENDIAN=y +# ARCH_BIG_ENDIAN is not set +# ARCH_HAS_NO_MMU is not set +ARCH_HAS_MMU=y +UCLIBC_HAS_FLOATS=y +HAS_FPU=y +DO_C99_MATH=y +WARNINGS="-Wall" +KERNEL_SOURCE="/usr/src/cvs/new/buildroot/toolchain_build_mipsel/linux" +C_SYMBOL_PREFIX="" +HAVE_DOT_CONFIG=y + +# +# General Library Settings +# +# HAVE_NO_PIC is not set +DOPIC=y +# HAVE_NO_SHARED is not set +HAVE_SHARED=y +# ARCH_HAS_NO_LDSO is not set +BUILD_UCLIBC_LDSO=y +# FORCE_SHAREABLE_TEXT_SEGMENTS is not set +LDSO_LDD_SUPPORT=y +LDSO_CACHE_SUPPORT=y +# LDSO_PRELOAD_FILE_SUPPORT is not set +LDSO_BASE_FILENAME="ld.so" +UCLIBC_CTOR_DTOR=y +# UCLIBC_PROPOLICE is not set +# HAS_NO_THREADS is not set +UCLIBC_HAS_THREADS=y +PTHREADS_DEBUG_SUPPORT=y +UCLIBC_HAS_LFS=y +# MALLOC is not set +# MALLOC_SIMPLE is not set +MALLOC_STANDARD=y +MALLOC_GLIBC_COMPAT=y +UCLIBC_DYNAMIC_ATEXIT=y +HAS_SHADOW=y +# UNIX98PTY_ONLY is not set +ASSUME_DEVPTS=y +UCLIBC_HAS_TM_EXTENSIONS=y +UCLIBC_HAS_TZ_CACHING=y +UCLIBC_HAS_TZ_FILE=y +UCLIBC_HAS_TZ_FILE_READ_MANY=y +UCLIBC_TZ_FILE_PATH="/etc/TZ" + +# +# Networking Support +# +UCLIBC_HAS_IPV6=y +UCLIBC_HAS_RPC=y +UCLIBC_HAS_FULL_RPC=y + +# +# String and Stdio Support +# +UCLIBC_HAS_STRING_GENERIC_OPT=y +UCLIBC_HAS_STRING_ARCH_OPT=y +UCLIBC_HAS_CTYPE_TABLES=y +UCLIBC_HAS_CTYPE_SIGNED=y +# UCLIBC_HAS_CTYPE_UNSAFE is not set +UCLIBC_HAS_CTYPE_CHECKED=y +# UCLIBC_HAS_CTYPE_ENFORCED is not set +UCLIBC_HAS_WCHAR=y +# UCLIBC_HAS_LOCALE is not set +UCLIBC_HAS_HEXADECIMAL_FLOATS=y +UCLIBC_HAS_GLIBC_CUSTOM_PRINTF=y +UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9 +UCLIBC_HAS_SCANF_GLIBC_A_FLAG=y +# UCLIBC_HAS_STDIO_BUFSIZ_NONE is not set +# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set +UCLIBC_HAS_STDIO_BUFSIZ_4096=y +# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set +UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE=y +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4 is not set +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set +UCLIBC_HAS_STDIO_GETC_MACRO=y +UCLIBC_HAS_STDIO_PUTC_MACRO=y +UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y +# UCLIBC_HAS_FOPEN_LARGEFILE_MODE is not set +UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE=y +UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y +UCLIBC_HAS_PRINTF_M_SPEC=y +UCLIBC_HAS_ERRNO_MESSAGES=y +# UCLIBC_HAS_SYS_ERRLIST is not set +UCLIBC_HAS_SIGNUM_MESSAGES=y +# UCLIBC_HAS_SYS_SIGLIST is not set +UCLIBC_HAS_GNU_GETOPT=y + +# +# Big and Tall +# +UCLIBC_HAS_REGEX=y +# UCLIBC_HAS_WORDEXP is not set +UCLIBC_HAS_FTW=y +UCLIBC_HAS_GLOB=y + +# +# Library Installation Options +# +SHARED_LIB_LOADER_PREFIX="/lib" +RUNTIME_PREFIX="/" +DEVEL_PREFIX="/usr/" + +# +# uClibc development/debugging options +# +# DODEBUG is not set +# DOASSERTS is not set +# SUPPORT_LD_DEBUG is not set +# SUPPORT_LD_DEBUG_EARLY is not set +# UCLIBC_MJN3_ONLY is not set diff --git a/openwrt/toolchain/uClibc/uClibc.config-locale b/openwrt/toolchain/uClibc/uClibc.config-locale new file mode 100644 index 0000000000..95a4983fc5 --- /dev/null +++ b/openwrt/toolchain/uClibc/uClibc.config-locale @@ -0,0 +1,142 @@ +# +# Automatically generated make config: don't edit +# +# TARGET_alpha is not set +# TARGET_arm is not set +# TARGET_bfin is not set +# TARGET_cris is not set +# TARGET_e1 is not set +# TARGET_frv is not set +# TARGET_h8300 is not set +# TARGET_i386 is not set +# TARGET_i960 is not set +# TARGET_m68k is not set +# TARGET_microblaze is not set +# TARGET_mips is not set +# TARGET_nios is not set +# TARGET_nios2 is not set +# TARGET_powerpc is not set +# TARGET_sh is not set +# TARGET_sparc is not set +# TARGET_v850 is not set + +# +# Target Architecture Features and Options +# +HAVE_ELF=y +TARGET_ARCH="none" +# ARCH_HAS_NO_MMU is not set +UCLIBC_HAS_FLOATS=y +HAS_FPU=y +DO_C99_MATH=y +WARNINGS="-Wall" +KERNEL_SOURCE="/usr/src/linux" +HAVE_DOT_CONFIG=y + +# +# General Library Settings +# +# HAVE_NO_PIC is not set +DOPIC=y +HAVE_SHARED=y +BUILD_UCLIBC_LDSO=y +# FORCE_SHAREABLE_TEXT_SEGMENTS is not set +LDSO_LDD_SUPPORT=y +UCLIBC_CTOR_DTOR=y +# UCLIBC_PROPOLICE is not set +# UCLIBC_PROFILING is not set +UCLIBC_HAS_THREADS=y +PTHREADS_DEBUG_SUPPORT=y +UCLIBC_HAS_LFS=y +# MALLOC is not set +# MALLOC_SIMPLE is not set +MALLOC_STANDARD=y +MALLOC_GLIBC_COMPAT=y +UCLIBC_DYNAMIC_ATEXIT=y +HAS_SHADOW=y +# UNIX98PTY_ONLY is not set +ASSUME_DEVPTS=y +UCLIBC_HAS_TM_EXTENSIONS=y +UCLIBC_HAS_TZ_CACHING=y +UCLIBC_HAS_TZ_FILE=y +UCLIBC_HAS_TZ_FILE_READ_MANY=y +UCLIBC_TZ_FILE_PATH="/etc/TZ" + +# +# Networking Support +# +UCLIBC_HAS_IPV6=y +UCLIBC_HAS_RPC=y +UCLIBC_HAS_FULL_RPC=y + +# +# String and Stdio Support +# +UCLIBC_HAS_CTYPE_TABLES=y +UCLIBC_HAS_CTYPE_SIGNED=y +# UCLIBC_HAS_CTYPE_UNSAFE is not set +UCLIBC_HAS_CTYPE_CHECKED=y +# UCLIBC_HAS_CTYPE_ENFORCED is not set +UCLIBC_HAS_WCHAR=y +UCLIBC_HAS_LOCALE=y +UCLIBC_PREGENERATED_LOCALE_DATA=y +UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA=y +UCLIBC_HAS_XLOCALE=y +UCLIBC_HAS_HEXADECIMAL_FLOATS=y +UCLIBC_HAS_GLIBC_DIGIT_GROUPING=y +UCLIBC_HAS_SCANF_LENIENT_DIGIT_GROUPING=y +UCLIBC_HAS_GLIBC_CUSTOM_PRINTF=y +UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9 +UCLIBC_HAS_SCANF_GLIBC_A_FLAG=y +# UCLIBC_HAS_STDIO_BUFSIZ_NONE is not set +# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set +# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set +UCLIBC_HAS_STDIO_BUFSIZ_4096=y +# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set +UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE=y +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4 is not set +# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set +UCLIBC_HAS_STDIO_GETC_MACRO=y +UCLIBC_HAS_STDIO_PUTC_MACRO=y +UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y +# UCLIBC_HAS_FOPEN_LARGEFILE_MODE is not set +UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE=y +UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y +UCLIBC_HAS_PRINTF_M_SPEC=y +UCLIBC_HAS_ERRNO_MESSAGES=y +# UCLIBC_HAS_SYS_ERRLIST is not set +UCLIBC_HAS_SIGNUM_MESSAGES=y +# UCLIBC_HAS_SYS_SIGLIST is not set +UCLIBC_HAS_GETTEXT_AWARENESS=y +UCLIBC_HAS_GNU_GETOPT=y + +# +# Big and Tall +# +UCLIBC_HAS_REGEX=y +UCLIBC_HAS_WORDEXP=y +UCLIBC_HAS_FTW=y +UCLIBC_HAS_GLOB=y + +# +# Library Installation Options +# +SHARED_LIB_LOADER_PREFIX="/lib" +RUNTIME_PREFIX="/" +DEVEL_PREFIX="/usr/" + +# +# uClibc security related options +# +# UCLIBC_SECURITY is not set + +# +# uClibc development/debugging options +# +# DODEBUG is not set +# DOASSERTS is not set +# SUPPORT_LD_DEBUG is not set +# SUPPORT_LD_DEBUG_EARLY is not set +# UCLIBC_MJN3_ONLY is not set diff --git a/openwrt/toolchain/uClibc/uclibc.mk b/openwrt/toolchain/uClibc/uclibc.mk new file mode 100644 index 0000000000..d104ce145c --- /dev/null +++ b/openwrt/toolchain/uClibc/uclibc.mk @@ -0,0 +1,167 @@ +############################################################# +# +# uClibc (the C library) +# +############################################################# + +ifeq ($(BR2_UCLIBC_VERSION_SNAPSHOT),y) +# Be aware that this changes daily.... +UCLIBC_DIR:=$(TOOL_BUILD_DIR)/uClibc +UCLIBC_SOURCE:=uClibc-$(strip $(subst ",, $(BR2_USE_UCLIBC_SNAPSHOT))).tar.bz2 +#" +UCLIBC_SITE:=http://www.uclibc.org/downloads/snapshots +else +# Note: 0.9.26 has known problems. So best use a snapshot until .27 is out. +# Anticipate the change. +UCLIBC_DIR:=$(TOOL_BUILD_DIR)/uClibc-0.9.27 +UCLIBC_SOURCE:=uClibc-0.9.27.tar.bz2 +UCLIBC_SITE:=http://www.uclibc.org/downloads +endif + +UCLIBC_TARGET_ARCH:=$(shell echo $(ARCH) | sed -e s'/-.*//' \ + -e 's/i.86/i386/' \ + -e 's/sparc.*/sparc/' \ + -e 's/arm.*/arm/g' \ + -e 's/m68k.*/m68k/' \ + -e 's/ppc/powerpc/g' \ + -e 's/v850.*/v850/g' \ + -e 's/sh64/sh/' \ + -e 's/sh[234].*/sh/' \ + -e 's/mips.*/mips/' \ + -e 's/mipsel.*/mips/' \ + -e 's/cris.*/cris/' \ +) + + +$(DL_DIR)/$(UCLIBC_SOURCE): + mkdir -p $(DL_DIR) + $(WGET) -P $(DL_DIR) $(UCLIBC_SITE)/$(UCLIBC_SOURCE) + +$(UCLIBC_DIR)/.unpacked: $(DL_DIR)/$(UCLIBC_SOURCE) + mkdir -p $(TOOL_BUILD_DIR) + bzcat $(DL_DIR)/$(UCLIBC_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) - + touch $(UCLIBC_DIR)/.unpacked + +$(UCLIBC_DIR)/.configured: $(UCLIBC_DIR)/.unpacked + $(SED) 's,^CROSS=.*,CROSS=$(TARGET_CROSS),g' $(UCLIBC_DIR)/Rules.mak +ifeq ($(BR2_ENABLE_LOCALE),y) + cp toolchain/uClibc/uClibc.config-locale $(UCLIBC_DIR)/.config +else + cp toolchain/uClibc/uClibc.config $(UCLIBC_DIR)/.config +endif + $(SED) 's,^.*TARGET_$(UCLIBC_TARGET_ARCH).*,TARGET_$(UCLIBC_TARGET_ARCH)=y,g' \ + $(UCLIBC_DIR)/.config + $(SED) 's,^TARGET_ARCH.*,TARGET_ARCH=\"$(UCLIBC_TARGET_ARCH)\",g' $(UCLIBC_DIR)/.config + $(SED) 's,^KERNEL_SOURCE=.*,KERNEL_SOURCE=\"$(LINUX_HEADERS_DIR)\",g' \ + $(UCLIBC_DIR)/.config + $(SED) 's,^RUNTIME_PREFIX=.*,RUNTIME_PREFIX=\"/\",g' \ + $(UCLIBC_DIR)/.config + $(SED) 's,^DEVEL_PREFIX=.*,DEVEL_PREFIX=\"/usr/\",g' \ + $(UCLIBC_DIR)/.config + $(SED) 's,^SHARED_LIB_LOADER_PREFIX=.*,SHARED_LIB_LOADER_PREFIX=\"/lib\",g' \ + $(UCLIBC_DIR)/.config +ifeq ($(BR2_LARGEFILE),y) + $(SED) 's,^.*UCLIBC_HAS_LFS.*,UCLIBC_HAS_LFS=y,g' $(UCLIBC_DIR)/.config +else + $(SED) 's,^.*UCLIBC_HAS_LFS.*,UCLIBC_HAS_LFS=n,g' $(UCLIBC_DIR)/.config +endif + $(SED) 's,.*UCLIBC_HAS_WCHAR.*,UCLIBC_HAS_WCHAR=y,g' $(UCLIBC_DIR)/.config +ifeq ($(BR2_SOFT_FLOAT),y) + $(SED) 's,.*HAS_FPU.*,HAS_FPU=n\nUCLIBC_HAS_FLOATS=y\nUCLIBC_HAS_SOFT_FLOAT=y,g' $(UCLIBC_DIR)/.config +endif + mkdir -p $(TOOL_BUILD_DIR)/uClibc_dev/usr/include + mkdir -p $(TOOL_BUILD_DIR)/uClibc_dev/usr/lib + mkdir -p $(TOOL_BUILD_DIR)/uClibc_dev/lib + $(MAKE1) -C $(UCLIBC_DIR) \ + PREFIX=$(TOOL_BUILD_DIR)/uClibc_dev/ \ + DEVEL_PREFIX=/usr/ \ + RUNTIME_PREFIX=$(TOOL_BUILD_DIR)/uClibc_dev/ \ + HOSTCC="$(HOSTCC)" \ + pregen install_dev; + touch $(UCLIBC_DIR)/.configured + +$(UCLIBC_DIR)/lib/libc.a: $(UCLIBC_DIR)/.configured $(LIBFLOAT_TARGET) + $(MAKE1) -C $(UCLIBC_DIR) \ + PREFIX= \ + DEVEL_PREFIX=/ \ + RUNTIME_PREFIX=/ \ + HOSTCC="$(HOSTCC)" \ + all + touch -c $(UCLIBC_DIR)/lib/libc.a + +$(STAGING_DIR)/lib/libc.a: $(UCLIBC_DIR)/lib/libc.a + $(MAKE1) -C $(UCLIBC_DIR) \ + PREFIX=$(STAGING_DIR)/ \ + DEVEL_PREFIX=/ \ + RUNTIME_PREFIX=/ \ + install_runtime + $(MAKE1) -C $(UCLIBC_DIR) \ + PREFIX=$(STAGING_DIR)/ \ + DEVEL_PREFIX=/ \ + RUNTIME_PREFIX=/ \ + install_dev + # Build the host utils. Need to add an install target... + $(MAKE1) -C $(UCLIBC_DIR)/utils \ + PREFIX=$(STAGING_DIR) \ + HOSTCC="$(HOSTCC)" \ + hostutils + touch -c $(STAGING_DIR)/lib/libc.a + +ifneq ($(TARGET_DIR),) +$(TARGET_DIR)/lib/libc.so.0: $(STAGING_DIR)/lib/libc.a + $(MAKE1) -C $(UCLIBC_DIR) \ + PREFIX=$(TARGET_DIR) \ + DEVEL_PREFIX=/usr/ \ + RUNTIME_PREFIX=/ \ + install_runtime + touch -c $(TARGET_DIR)/lib/libc.so.0 + +$(TARGET_DIR)/usr/bin/ldd: + $(MAKE1) -C $(UCLIBC_DIR) $(TARGET_CONFIGURE_OPTS) \ + PREFIX=$(TARGET_DIR) utils install_utils + touch -c $(TARGET_DIR)/usr/bin/ldd + +UCLIBC_TARGETS=$(TARGET_DIR)/lib/libc.so.0 +endif + +uclibc-configured: $(UCLIBC_DIR)/.configured + +uclibc: $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc $(STAGING_DIR)/lib/libc.a \ + $(UCLIBC_TARGETS) + +uclibc-source: $(DL_DIR)/$(UCLIBC_SOURCE) + +uclibc-configured-source: uclibc-source + +uclibc-clean: + -$(MAKE1) -C $(UCLIBC_DIR) clean + rm -f $(UCLIBC_DIR)/.config + +uclibc-dirclean: + rm -rf $(UCLIBC_DIR) + +uclibc-target-utils: $(TARGET_DIR)/usr/bin/ldd + +############################################################# +# +# uClibc for the target just needs its header files +# and whatnot installed. +# +############################################################# + +$(TARGET_DIR)/usr/lib/libc.a: $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libc.a + $(MAKE1) -C $(UCLIBC_DIR) \ + PREFIX=$(TARGET_DIR) \ + DEVEL_PREFIX=/usr/ \ + RUNTIME_PREFIX=/ \ + install_dev + touch -c $(TARGET_DIR)/usr/lib/libc.a + +uclibc_target: gcc uclibc $(TARGET_DIR)/usr/lib/libc.a $(TARGET_DIR)/usr/bin/ldd + +uclibc_target-clean: + rm -f $(TARGET_DIR)/include + +uclibc_target-dirclean: + rm -f $(TARGET_DIR)/include + -- GitLab