From 036db59989c6a79cda67fe0a95c48233cc54d22e Mon Sep 17 00:00:00 2001 From: Mike Baker Date: Sun, 6 Mar 2005 03:34:52 +0000 Subject: [PATCH] nbd's makefile/menuconfig rewrite git-svn-id: svn://svn.openwrt.org/openwrt/trunk@307 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- openwrt/Config.in | 7 +- openwrt/Makefile | 136 +- openwrt/docs/CHANGES | 9 +- openwrt/package/Config.in | 31 +- openwrt/package/Makefile | 44 + openwrt/package/Makefile.in | 65 - openwrt/package/Sysconf.in | 31 + openwrt/package/arptables/Config.in | 6 + openwrt/package/arptables/Makefile | 43 + openwrt/package/arptables/arptables.control | 8 + openwrt/package/bridge/Config.in | 2 +- openwrt/package/bridge/Makefile | 69 + openwrt/package/bridge/bridge.control | 8 + openwrt/package/bridge/bridge.mk | 73 - openwrt/package/busybox/Config.in | 7 + openwrt/package/busybox/Makefile | 9 + openwrt/package/busybox/busybox.config | 4 +- openwrt/package/busybox/busybox.mk | 35 +- openwrt/package/busybox/config/Config.in | 293 ++++ .../package/busybox/config/archival/Config.in | 258 +++ .../busybox/config/console-tools/Config.in | 68 + .../busybox/config/coreutils/Config.in | 613 +++++++ .../busybox/config/debianutils/Config.in | 58 + .../package/busybox/config/editors/Config.in | 123 ++ .../busybox/config/findutils/Config.in | 133 ++ openwrt/package/busybox/config/init/Config.in | 72 + .../busybox/config/loginutils/Config.in | 161 ++ .../busybox/config/miscutils/Config.in | 201 +++ .../package/busybox/config/modutils/Config.in | 113 ++ .../busybox/config/networking/Config.in | 634 +++++++ .../busybox/config/networking/udhcp/Config.in | 62 + .../package/busybox/config/procps/Config.in | 87 + .../package/busybox/config/shell/Config.in | 229 +++ .../package/busybox/config/sysklogd/Config.in | 109 ++ .../busybox/config/util-linux/Config.in | 357 ++++ openwrt/package/config/confdata.c | 2 +- openwrt/package/dnsmasq/Makefile | 9 + openwrt/package/dnsmasq/dnsmasq.mk | 13 +- openwrt/package/dropbear_sshd/Config.in | 8 - .../package/dropbear_sshd/dropbear-init.patch | 59 - .../package/dropbear_sshd/dropbear_sshd.mk | 82 - openwrt/package/ebtables/Config.in | 6 +- openwrt/package/ebtables/Makefile | 43 + openwrt/package/ebtables/ebtables.control | 9 + openwrt/package/ebtables/ebtables.mk | 41 - openwrt/package/iproute2/Config.in | 17 + openwrt/package/iproute2/Makefile | 87 + openwrt/package/iproute2/ip.control | 8 + .../iproute2/patches/debian-patches-3.patch | 1497 +++++++++++++++++ .../patches/iproute2-ipxfrm_no_sctp.patch | 18 + .../patches/iproute2-tc-make-fix.patch | 11 + openwrt/package/iproute2/tc.control | 9 + openwrt/package/iptables/Config.in | 19 +- openwrt/package/iptables/Makefile | 97 ++ .../iptables/control/ip6tables.control | 9 + .../iptables/control/iptables-extra.control | 9 + .../package/iptables/control/iptables.control | 8 + openwrt/package/iptables/iptables.mk | 55 - openwrt/package/iptables/kernelconfig.mk | 35 + .../iptables/patches/ipp2p-0.7.1.patch | 538 ++++++ openwrt/package/linksys-utils/Config.in | 5 + openwrt/package/linksys-utils/Makefile | 43 + .../linksys-utils/linksys-utils.control | 8 + openwrt/package/linux/Config.in | 66 +- openwrt/package/linux/Makefile | 74 + .../linux/control/kmod-arptables.control | 8 + .../package/linux/control/kmod-crypto.control | 8 + .../linux/control/kmod-ebtables.control | 8 + .../linux/control/kmod-ip6tables.control | 9 + .../linux/control/kmod-iptables-extra.control | 8 + .../package/linux/control/kmod-ipv6.control | 8 + .../package/linux/control/kmod-mppe.control | 8 + .../package/linux/control/kmod-sched.control | 8 + .../package/linux/control/kmod-tun.control | 8 + .../package/linux/control/kmod-usb.control | 8 + .../kernel-patches/105-makefile-mkdep-fix.bz2 | Bin 0 -> 445 bytes .../304-netfilter-ipp2p-0.7.1.bz2 | Bin 0 -> 5300 bytes openwrt/package/linux/linux.config | 3 +- openwrt/package/linux/linux.mk | 38 +- openwrt/package/lzo/Config.in | 7 + openwrt/package/lzo/Makefile | 69 + openwrt/package/lzo/lzo.control | 8 + .../lzo/patches/lzo-cross-compile.patch | 43 + openwrt/package/openssl/Config.in | 7 + openwrt/package/openssl/Makefile | 73 + openwrt/package/openssl/openssl.control | 8 + openwrt/package/openssl/openssl.mk | 95 ++ openwrt/package/openssl/patches/openssl.patch | 238 +++ .../package/openssl/patches/remove_fips.patch | 35 + openwrt/package/openvpn/Config.in | 10 + openwrt/package/openvpn/Makefile | 69 + openwrt/package/openvpn/openvpn.control | 9 + openwrt/package/openwrt/Makefile | 9 + openwrt/package/openwrt/openwrt.mk | 52 +- openwrt/package/sed/Config.in | 9 - openwrt/package/sed/sed.mk | 136 -- openwrt/package/sed/sedcheck.sh | 21 - openwrt/package/zlib/Config.in | 8 +- openwrt/package/zlib/Makefile | 62 + openwrt/package/zlib/zlib.control | 8 + openwrt/package/zlib/zlib.mk | 75 - openwrt/package/zlib/zlib.patch | 206 +++ openwrt/rules.mk | 122 ++ openwrt/scripts/configtest.pl | 12 + openwrt/scripts/gen_busybox_config.pl | 22 + openwrt/scripts/gen_busybox_menuconfig.pl | 69 + openwrt/scripts/make-ipkg-dir.sh | 11 + .../{toolchain => scripts}/patch-kernel.sh | 0 openwrt/target/Config.in | 42 +- openwrt/target/Makefile.in | 20 - openwrt/target/default/Makefile.in | 0 openwrt/target/default/skel.tar.gz | Bin 193 -> 0 bytes .../target/default/target_skeleton/bin/login | 11 +- .../target_skeleton/etc/init.d/S10boot | 5 + .../target_skeleton/etc/nvram.overrides | 9 +- .../default/target_skeleton/etc/preinit | 4 +- .../target/default/target_skeleton/etc/shells | 1 + openwrt/target/device/Config.in | 17 - openwrt/target/device/Makefile.in | 2 - openwrt/target/jffs2/Config.in | 5 - openwrt/target/jffs2/Makefile | 36 + openwrt/target/jffs2/jffs2root.mk | 19 - openwrt/target/squashfs-lzma/Config.in | 5 - openwrt/target/squashfs-lzma/Makefile | 16 + .../target/squashfs-lzma/squashfslzmaroot.mk | 20 - openwrt/target/utils/Makefile | 28 + .../openwrt => target/utils/src}/addpattern.c | 0 openwrt/target/utils/src/motorola-bin.c | 109 ++ .../openwrt => target/utils/src}/trx.c | 0 openwrt/toolchain/Config.in | 2 +- openwrt/toolchain/Makefile | 45 + openwrt/toolchain/Makefile.in | 10 - .../2.14.90.0.6/002-max-pagesize.patch | 12 + .../2.14.90.0.7/002-max-pagesize.patch | 12 + .../binutils/2.15/002-max-pagesize.patch | 12 + openwrt/toolchain/binutils/Makefile | 9 + openwrt/toolchain/binutils/Makefile.in | 1 - openwrt/toolchain/binutils/binutils.mk | 10 +- .../gcc/2.95/050-debian-subset.patch.bz2 | Bin 125295 -> 0 bytes .../toolchain/gcc/2.95/100-uclibc-conf.patch | 291 ---- .../toolchain/gcc/2.95/STLport-4.5.3.patch | 407 ----- openwrt/toolchain/gcc/Config.in | 4 - openwrt/toolchain/gcc/Makefile | 9 + openwrt/toolchain/gcc/gcc-uclibc-2.95.mk | 277 --- openwrt/toolchain/gcc/gcc-uclibc-3.x.mk | 35 +- openwrt/toolchain/kernel-headers/Makefile | 10 + .../kernel-headers/kernel-headers.mk | 4 +- openwrt/toolchain/uClibc/Makefile | 10 + openwrt/toolchain/uClibc/uclibc.mk | 8 +- openwrt/toolchain/utils/Makefile | 21 + .../openwrt => toolchain/utils/src}/sstrip.c | 0 151 files changed, 8247 insertions(+), 1949 deletions(-) create mode 100644 openwrt/package/Makefile delete mode 100644 openwrt/package/Makefile.in create mode 100644 openwrt/package/Sysconf.in create mode 100644 openwrt/package/arptables/Config.in create mode 100644 openwrt/package/arptables/Makefile create mode 100644 openwrt/package/arptables/arptables.control create mode 100644 openwrt/package/bridge/Makefile create mode 100644 openwrt/package/bridge/bridge.control delete mode 100644 openwrt/package/bridge/bridge.mk create mode 100644 openwrt/package/busybox/Makefile create mode 100644 openwrt/package/busybox/config/Config.in create mode 100644 openwrt/package/busybox/config/archival/Config.in create mode 100644 openwrt/package/busybox/config/console-tools/Config.in create mode 100644 openwrt/package/busybox/config/coreutils/Config.in create mode 100644 openwrt/package/busybox/config/debianutils/Config.in create mode 100644 openwrt/package/busybox/config/editors/Config.in create mode 100644 openwrt/package/busybox/config/findutils/Config.in create mode 100644 openwrt/package/busybox/config/init/Config.in create mode 100644 openwrt/package/busybox/config/loginutils/Config.in create mode 100644 openwrt/package/busybox/config/miscutils/Config.in create mode 100644 openwrt/package/busybox/config/modutils/Config.in create mode 100644 openwrt/package/busybox/config/networking/Config.in create mode 100644 openwrt/package/busybox/config/networking/udhcp/Config.in create mode 100644 openwrt/package/busybox/config/procps/Config.in create mode 100644 openwrt/package/busybox/config/shell/Config.in create mode 100644 openwrt/package/busybox/config/sysklogd/Config.in create mode 100644 openwrt/package/busybox/config/util-linux/Config.in create mode 100644 openwrt/package/dnsmasq/Makefile delete mode 100644 openwrt/package/dropbear_sshd/Config.in delete mode 100644 openwrt/package/dropbear_sshd/dropbear-init.patch delete mode 100644 openwrt/package/dropbear_sshd/dropbear_sshd.mk create mode 100644 openwrt/package/ebtables/Makefile create mode 100644 openwrt/package/ebtables/ebtables.control delete mode 100644 openwrt/package/ebtables/ebtables.mk create mode 100644 openwrt/package/iproute2/Config.in create mode 100644 openwrt/package/iproute2/Makefile create mode 100644 openwrt/package/iproute2/ip.control create mode 100644 openwrt/package/iproute2/patches/debian-patches-3.patch create mode 100644 openwrt/package/iproute2/patches/iproute2-ipxfrm_no_sctp.patch create mode 100644 openwrt/package/iproute2/patches/iproute2-tc-make-fix.patch create mode 100644 openwrt/package/iproute2/tc.control create mode 100644 openwrt/package/iptables/Makefile create mode 100644 openwrt/package/iptables/control/ip6tables.control create mode 100644 openwrt/package/iptables/control/iptables-extra.control create mode 100644 openwrt/package/iptables/control/iptables.control delete mode 100644 openwrt/package/iptables/iptables.mk create mode 100644 openwrt/package/iptables/kernelconfig.mk create mode 100644 openwrt/package/iptables/patches/ipp2p-0.7.1.patch create mode 100644 openwrt/package/linksys-utils/Config.in create mode 100644 openwrt/package/linksys-utils/Makefile create mode 100644 openwrt/package/linksys-utils/linksys-utils.control create mode 100644 openwrt/package/linux/Makefile create mode 100644 openwrt/package/linux/control/kmod-arptables.control create mode 100644 openwrt/package/linux/control/kmod-crypto.control create mode 100644 openwrt/package/linux/control/kmod-ebtables.control create mode 100644 openwrt/package/linux/control/kmod-ip6tables.control create mode 100644 openwrt/package/linux/control/kmod-iptables-extra.control create mode 100644 openwrt/package/linux/control/kmod-ipv6.control create mode 100644 openwrt/package/linux/control/kmod-mppe.control create mode 100644 openwrt/package/linux/control/kmod-sched.control create mode 100644 openwrt/package/linux/control/kmod-tun.control create mode 100644 openwrt/package/linux/control/kmod-usb.control create mode 100644 openwrt/package/linux/kernel-patches/105-makefile-mkdep-fix.bz2 create mode 100644 openwrt/package/linux/kernel-patches/304-netfilter-ipp2p-0.7.1.bz2 create mode 100644 openwrt/package/lzo/Config.in create mode 100644 openwrt/package/lzo/Makefile create mode 100644 openwrt/package/lzo/lzo.control create mode 100644 openwrt/package/lzo/patches/lzo-cross-compile.patch create mode 100644 openwrt/package/openssl/Config.in create mode 100644 openwrt/package/openssl/Makefile create mode 100644 openwrt/package/openssl/openssl.control create mode 100644 openwrt/package/openssl/openssl.mk create mode 100644 openwrt/package/openssl/patches/openssl.patch create mode 100644 openwrt/package/openssl/patches/remove_fips.patch create mode 100644 openwrt/package/openvpn/Config.in create mode 100644 openwrt/package/openvpn/Makefile create mode 100644 openwrt/package/openvpn/openvpn.control create mode 100644 openwrt/package/openwrt/Makefile delete mode 100644 openwrt/package/sed/Config.in delete mode 100644 openwrt/package/sed/sed.mk delete mode 100755 openwrt/package/sed/sedcheck.sh create mode 100644 openwrt/package/zlib/Makefile create mode 100644 openwrt/package/zlib/zlib.control delete mode 100644 openwrt/package/zlib/zlib.mk create mode 100644 openwrt/package/zlib/zlib.patch create mode 100644 openwrt/rules.mk create mode 100755 openwrt/scripts/configtest.pl create mode 100755 openwrt/scripts/gen_busybox_config.pl create mode 100644 openwrt/scripts/gen_busybox_menuconfig.pl create mode 100755 openwrt/scripts/make-ipkg-dir.sh rename openwrt/{toolchain => scripts}/patch-kernel.sh (100%) delete mode 100644 openwrt/target/Makefile.in delete mode 100644 openwrt/target/default/Makefile.in delete mode 100644 openwrt/target/default/skel.tar.gz create mode 100644 openwrt/target/default/target_skeleton/etc/shells delete mode 100644 openwrt/target/device/Config.in delete mode 100644 openwrt/target/device/Makefile.in delete mode 100644 openwrt/target/jffs2/Config.in create mode 100644 openwrt/target/jffs2/Makefile delete mode 100644 openwrt/target/squashfs-lzma/Config.in create mode 100644 openwrt/target/squashfs-lzma/Makefile create mode 100644 openwrt/target/utils/Makefile rename openwrt/{package/openwrt => target/utils/src}/addpattern.c (100%) create mode 100644 openwrt/target/utils/src/motorola-bin.c rename openwrt/{package/openwrt => target/utils/src}/trx.c (100%) create mode 100644 openwrt/toolchain/Makefile delete mode 100644 openwrt/toolchain/Makefile.in create mode 100644 openwrt/toolchain/binutils/2.14.90.0.6/002-max-pagesize.patch create mode 100644 openwrt/toolchain/binutils/2.14.90.0.7/002-max-pagesize.patch create mode 100644 openwrt/toolchain/binutils/2.15/002-max-pagesize.patch create mode 100644 openwrt/toolchain/binutils/Makefile delete mode 100644 openwrt/toolchain/binutils/Makefile.in delete mode 100644 openwrt/toolchain/gcc/2.95/050-debian-subset.patch.bz2 delete mode 100644 openwrt/toolchain/gcc/2.95/100-uclibc-conf.patch delete mode 100644 openwrt/toolchain/gcc/2.95/STLport-4.5.3.patch create mode 100644 openwrt/toolchain/gcc/Makefile delete mode 100644 openwrt/toolchain/gcc/gcc-uclibc-2.95.mk create mode 100644 openwrt/toolchain/kernel-headers/Makefile create mode 100644 openwrt/toolchain/uClibc/Makefile create mode 100644 openwrt/toolchain/utils/Makefile rename openwrt/{package/openwrt => toolchain/utils/src}/sstrip.c (100%) diff --git a/openwrt/Config.in b/openwrt/Config.in index 7fd499b2e0..5867be0e6f 100644 --- a/openwrt/Config.in +++ b/openwrt/Config.in @@ -2,6 +2,10 @@ mainmenu "OpenWRT Configuration" +config MODULES + bool + default y + config BR2_HAVE_DOT_CONFIG bool default y @@ -102,8 +106,5 @@ config BR2_JLEVEL endmenu source "toolchain/Config.in" - source "package/Config.in" - source "target/Config.in" - diff --git a/openwrt/Makefile b/openwrt/Makefile index ae8e59fbea..ed4ea1529f 100644 --- a/openwrt/Makefile +++ b/openwrt/Makefile @@ -1,5 +1,6 @@ -# Makefile for buildroot2 +# Makefile for OpenWRT # +# Copyright (C) 2005 by Felix Fietkau # Copyright (C) 1999-2004 by Erik Andersen # # This program is free software; you can redistribute it and/or modify @@ -21,7 +22,8 @@ # Just run 'make menuconfig', configure stuff, then run 'make'. # You shouldn't need to mess with anything beyond this point... #-------------------------------------------------------------- -TOPDIR=./ +TOPDIR=${shell pwd} +export TOPDIR CONFIG_CONFIG_IN = Config.in CONFIG_DEFCONFIG = .defconfig CONFIG = package/config @@ -31,27 +33,30 @@ noconfig_targets := menuconfig config oldconfig randconfig \ # 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 +-include $(TOPDIR)/.config endif ifeq ($(strip $(BR2_HAVE_DOT_CONFIG)),y) +include $(TOPDIR)/rules.mk -############################################################# +all: world + +############################################################## # -# The list of stuff to build for the target toolchain -# along with the packages to build for the target. +# Build the toolchain # ############################################################## -TARGETS:=host-sed kernel-headers uclibc-configured binutils gcc uclibc-target-utils linux openwrt +toolchain_install: + $(MAKE) -C toolchain install -include toolchain/Makefile.in -include package/Makefile.in +############################################################## +# +# Make all packages +# +############################################################## + +package_install: toolchain + $(MAKE) -C package compile install ############################################################# # @@ -61,32 +66,12 @@ include package/Makefile.in ############################################################# - -all: world - # In this section, we need .config include .config.cmd -# We also need the various per-package makefiles, which also add -# each selected package to TARGETS if that package was selected -# in the .config file. -include toolchain/*/*.mk -include package/*/*.mk -include target/*/*.mk +world: $(DL_DIR) $(BUILD_DIR) target_prepare $(TARGET_DIR) toolchain_install package_install target_install -# target stuff is last so it can override anything else -include target/Makefile.in - -TARGETS_CLEAN:=$(patsubst %,%-clean,$(TARGETS)) -TARGETS_SOURCE:=$(patsubst %,%-source,$(TARGETS)) -TARGETS_DIRCLEAN:=$(patsubst %,%-dirclean,$(TARGETS)) - -world: $(DL_DIR) $(BUILD_DIR) $(STAGING_DIR) $(TARGET_DIR) $(TARGETS) - @echo DONE. - -.PHONY: all world clean dirclean distclean source $(TARGETS) \ - $(TARGETS_CLEAN) $(TARGETS_DIRCLEAN) $(TARGETS_SOURCE) \ - $(DL_DIR) $(BUILD_DIR) $(TOOL_BUILD_DIR) $(STAGING_DIR) +.PHONY: all world clean dirclean distclean image_clean target_clean source target_prepare target_install toolchain_install package_install ############################################################# # @@ -94,33 +79,18 @@ world: $(DL_DIR) $(BUILD_DIR) $(STAGING_DIR) $(TARGET_DIR) $(TARGETS) # dependancies anywhere else # ############################################################# +target_prepare: + $(MAKE) -C target prepare + +target_install: + $(MAKE) -C target install + $(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): - if [ -f "$(TARGET_SKELETON)" ] ; then \ - zcat $(TARGET_SKELETON) | tar -C $(BUILD_DIR) -xf -; \ - fi; - if [ -d "$(TARGET_SKEL_DIR)" ] ; then \ - cp -a $(TARGET_SKEL_DIR)/* $(TARGET_DIR)/; \ - fi; - -find $(TARGET_DIR) -type d -name CVS | xargs rm -rf - -find $(TARGET_DIR) -type d -name .svn | xargs rm -rf - -ln -sf /tmp/resolv.conf $(TARGET_DIR)/etc - -mkdir -p $(TARGET_DIR)/jffs - source: $(TARGETS_SOURCE) ############################################################# @@ -128,27 +98,34 @@ source: $(TARGETS_SOURCE) # Cleanup and misc junk # ############################################################# -clean: - rm -rf $(TARGET_DIR) $(IMAGE).* - $(MAKE) openwrt-image-clean +image_clean: + rm -f $(STAMP_DIR)/.*-compile + rm -f $(STAMP_DIR)/.*-install + rm -rf $(BIN_DIR) + +target_clean: image_clean + rm -rf $(TARGET_DIR) -dirclean: $(TARGETS_DIRCLEAN) - rm -rf $(TARGET_DIR) $(IMAGE).* - $(MAKE) openwrt-image-dirclean +clean: target_clean + @$(MAKE) -C $(CONFIG) clean + +dirclean: clean + rm -rf $(STAMP_DIR) + $(MAKE) -C package clean + $(MAKE) -C target clean + rm -rf $(BUILD_DIR) distclean: clean - rm -rf $(DL_DIR) $(BUILD_DIR) $(TOOL_BUILD_DIR) - rm .config* .tmpconfig.h + rm -rf $(STAMP_DIR) $(DL_DIR) $(BUILD_DIR) $(TOOL_BUILD_DIR) + rm -f .config* .tmpconfig.h -sourceball: - rm -rf $(BUILD_DIR) +sourceball: distclean 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 @@ -162,7 +139,7 @@ $(CONFIG)/conf: cp $(CONFIG_DEFCONFIG) .config; \ fi $(CONFIG)/mconf: - $(MAKE) -C $(CONFIG) ncurses conf mconf + $(MAKE) -C $(CONFIG) -@if [ ! -f .config ] ; then \ cp $(CONFIG_DEFCONFIG) .config; \ fi @@ -171,21 +148,25 @@ menuconfig: $(CONFIG)/mconf -touch .config -cp .config .config.test @$(CONFIG)/mconf $(CONFIG_CONFIG_IN) + -./scripts/configtest.pl config: $(CONFIG)/conf -touch .config -cp .config .config.test @$(CONFIG)/conf $(CONFIG_CONFIG_IN) + -./scripts/configtest.pl oldconfig: $(CONFIG)/conf -touch .config -cp .config .config.test @$(CONFIG)/conf -o $(CONFIG_CONFIG_IN) + -./scripts/configtest.pl randconfig: $(CONFIG)/conf -touch .config -cp .config .config.test @$(CONFIG)/conf -r $(CONFIG_CONFIG_IN) + -./scripts/configtest.pl allyesconfig: $(CONFIG)/conf #@$(CONFIG)/conf -y $(CONFIG_CONFIG_IN) @@ -193,31 +174,22 @@ allyesconfig: $(CONFIG)/conf -touch .config -cp .config .config.test @$(CONFIG)/conf -o $(CONFIG_CONFIG_IN) + -./scripts/configtest.pl allnoconfig: $(CONFIG)/conf -touch .config -cp .config .config.test @$(CONFIG)/conf -n $(CONFIG_CONFIG_IN) + -./scripts/configtest.pl defconfig: $(CONFIG)/conf -touch .config -cp .config .config.test @$(CONFIG)/conf -d $(CONFIG_CONFIG_IN) - -############################################################# -# -# Cleanup and misc junk -# -############################################################# -clean: - @$(MAKE) -C $(CONFIG) clean - -distclean: clean + -./scripts/configtest.pl endif # ifeq ($(strip $(BR2_HAVE_DOT_CONFIG)),y) .PHONY: dummy subdirs release distclean clean config oldconfig \ menuconfig tags check test depend -targets: - @echo $(TARGETS) diff --git a/openwrt/docs/CHANGES b/openwrt/docs/CHANGES index 36ee41af10..30d48847ed 100644 --- a/openwrt/docs/CHANGES +++ b/openwrt/docs/CHANGES @@ -5,6 +5,13 @@ Changes between official and experimental *) new buildroot (based on uClib buildroot2) + *) makefiles are no longer included but executed instead + => easier to create packages + + *) enhanced configuration system + *) busybox fully configurable from menuconfig + *) enabled tristate for some packages + => < > disabled, compile as .ipk, <*> compile as .ipk and embed *) new kernel (updated to 2.4.29) @@ -18,4 +25,4 @@ *) better support for Asus WL-500g (kernel modules for usb,scsi,vfat build) - + diff --git a/openwrt/package/Config.in b/openwrt/package/Config.in index aec730f2f8..c449c117cc 100644 --- a/openwrt/package/Config.in +++ b/openwrt/package/Config.in @@ -2,20 +2,33 @@ menu "OpenWrt Package Selection" -comment "The absolute minimum" -source "package/linux/Config.in" -source "package/busybox/Config.in" - comment "The default set" +source "package/busybox/Config.in" source "package/dnsmasq/Config.in" source "package/iptables/Config.in" source "package/bridge/Config.in" -comment "libraries" -source "package/zlib/Config.in" - -comment "Suggested Extras" +comment "Networking" +source "package/linksys-utils/Config.in" +source "package/ppp/Config.in" +source "package/dropbear/Config.in" source "package/ebtables/Config.in" -source "package/dropbear_sshd/Config.in" +source "package/arptables/Config.in" +source "package/iproute2/Config.in" +source "package/openvpn/Config.in" + +comment "Libraries" +source "package/zlib/Config.in" +source "package/lzo/Config.in" +source "package/openssl/Config.in" endmenu + +menu "Kernel Configuration" + +source "package/linux/Config.in" + +endmenu + +source "package/Sysconf.in" + diff --git a/openwrt/package/Makefile b/openwrt/package/Makefile new file mode 100644 index 0000000000..5afc8f9f1f --- /dev/null +++ b/openwrt/package/Makefile @@ -0,0 +1,44 @@ +# Main makefile for the packages +include $(TOPDIR)/rules.mk + +package-y:=openwrt +package-$(BR2_PACKAGE_BRIDGE) += bridge +package-$(BR2_PACKAGE_BUSYBOX) += busybox +package-$(BR2_PACKAGE_DROPBEAR) += dropbear +package-$(BR2_PACKAGE_DNSMASQ) += dnsmasq +package-$(BR2_PACKAGE_EBTABLES) += ebtables +package-$(BR2_PACKAGE_ARPTABLES) += arptables +package-$(BR2_PACKAGE_IPTABLES) += iptables +package-$(BR2_PACKAGE_PPP) += ppp +package-$(BR2_PACKAGE_LZO) += lzo +package-$(BR2_PACKAGE_ZLIB) += zlib +package-$(BR2_PACKAGE_OPENSSL) += openssl +package-$(BR2_PACKAGE_OPENVPN) += openvpn +package-$(BR2_PACKAGE_IPROUTE2) += iproute2 +package-$(BR2_PACKAGE_LINKSYS_UTILS) += linksys-utils + +all: compile install +clean: $(patsubst %,%-clean,$(package-) $(package-y) $(package-m)) linux-clean +compile: $(patsubst %,%-compile,$(package-y) $(package-m)) +install: $(patsubst %,%-install,$(package-y)) + +dropbear-compile: zlib-compile +openssl-compile: zlib-compile +$(patsubst %,%-prepare,$(package-y) $(package-m)): linux-install + +%-prepare: + @[ -f $(STAMP_DIR)/.$@ ] || $(MAKE) -C $(patsubst %-prepare,%,$@) prepare + @touch $(STAMP_DIR)/.$@ + +%-compile: %-prepare + @[ -f $(STAMP_DIR)/.$@ ] || $(MAKE) -C $(patsubst %-compile,%,$@) compile + @touch $(STAMP_DIR)/.$@ + +%-install: %-compile + @[ -f $(STAMP_DIR)/.$@ ] || $(MAKE) -C $(patsubst %-install,%,$@) install + @touch $(STAMP_DIR)/.$@ + +%-clean: + @$(MAKE) -C $(patsubst %-clean,%,$@) clean + @rm -f $(STAMP_DIR)/.$(patsubst %-clean,%,$@)-* + diff --git a/openwrt/package/Makefile.in b/openwrt/package/Makefile.in deleted file mode 100644 index 0d600d0a5a..0000000000 --- a/openwrt/package/Makefile.in +++ /dev/null @@ -1,65 +0,0 @@ -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 -BUILD_DIR:=$(BASE_DIR)/build_$(ARCH)$(ARCH_FPU_SUFFIX) -PACKAGE_DIR:=$(BASE_DIR)/package -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 -PATCH=toolchain/patch-kernel.sh - - -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/Sysconf.in b/openwrt/package/Sysconf.in new file mode 100644 index 0000000000..647e292ff7 --- /dev/null +++ b/openwrt/package/Sysconf.in @@ -0,0 +1,31 @@ +# + +menu "Runtime Configuration" + choice + bool "Telnet access" + default BR2_SYSCONF_TELNET_OPEN + + config BR2_SYSCONF_TELNET_FAILSAFE_ONLY + bool "open, failsafe only" + + config BR2_SYSCONF_TELNET_OPEN + bool "open" + + endchoice + + menu "Failsafe configuration" + + config BR2_SYSCONF_FAILSAFE_IP + string "IP Address" + default "192.168.1.1" + + config BR2_SYSCONF_FAILSAFE_NETMASK + string "Netmask" + default "255.255.255.0" + + config BR2_SYSCONF_FAILSAFE_MAC + string "MAC Address" + default "00:00:BA:DC:0D:ED" + + endmenu +endmenu diff --git a/openwrt/package/arptables/Config.in b/openwrt/package/arptables/Config.in new file mode 100644 index 0000000000..cde4d0541b --- /dev/null +++ b/openwrt/package/arptables/Config.in @@ -0,0 +1,6 @@ +config BR2_PACKAGE_ARPTABLES + tristate "ARP Firewalling" + default m + help + ARP Firewalling (arptables) + http://ebtables.sourceforge.net/ diff --git a/openwrt/package/arptables/Makefile b/openwrt/package/arptables/Makefile new file mode 100644 index 0000000000..d6af30f33b --- /dev/null +++ b/openwrt/package/arptables/Makefile @@ -0,0 +1,43 @@ +############################################################# +# +# arptables +# +############################################################# +include $(TOPDIR)/rules.mk + +PKG_NAME:=arptables +PKG_VERSION:=0.0.3 +PKG_RELEASE:=1 +PKG_SOURCE_URL:=http://umn.dl.sourceforge.net/sourceforge/ebtables/ +PKG_SOURCE:=$(PKG_NAME)-v$(PKG_VERSION).tar.gz +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-v$(PKG_VERSION) +PKG_CAT:=zcat +PKG_IPK:=$(PACKAGE_DIR)/$(PKG_NAME)_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk +PKG_IPK_DIR:=$(PKG_BUILD_DIR)/ipkg + +$(DL_DIR)/$(PKG_SOURCE): + $(WGET) -P $(DL_DIR) $(PKG_SOURCE_URL)/$(PKG_SOURCE) + +$(PKG_BUILD_DIR)/.unpacked: $(DL_DIR)/$(PKG_SOURCE) + $(PKG_CAT) $(DL_DIR)/$(PKG_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + touch $(PKG_BUILD_DIR)/.unpacked + +$(PKG_BUILD_DIR)/arptables: $(PKG_BUILD_DIR)/.unpacked + $(MAKE) -C $(PKG_BUILD_DIR) \ + CC=$(TARGET_CC) LD=$(TARGET_CROSS)ld \ + CFLAGS="$(TARGET_CFLAGS) -Wall -I$(PKG_BUILD_DIR)/include/linux/include -I$(PKG_BUILD_DIR)/include -DARPTABLES_VERSION=\\\"$(PKG_VERSION)\\\" " + +$(PKG_IPK): $(PKG_BUILD_DIR)/arptables + $(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_IPK_DIR) $(PKG_NAME).control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH) + mkdir -p $(PKG_IPK_DIR)/usr/sbin + cp $(PKG_BUILD_DIR)/arptables $(PKG_IPK_DIR)/usr/sbin/ + mkdir -p $(PACKAGE_DIR) + $(IPKG_BUILD) $(PKG_IPK_DIR) $(PACKAGE_DIR) + +source: $(DL_DIR)/$(PKG_SOURCE) +prepare: $(PKG_BUILD_DIR)/.unpacked +compile: $(PKG_IPK) +install: + $(IPKG) install $(PKG_IPK) +clean: + rm -rf $(PKG_BUILD_DIR) diff --git a/openwrt/package/arptables/arptables.control b/openwrt/package/arptables/arptables.control new file mode 100644 index 0000000000..d4e9e27e5c --- /dev/null +++ b/openwrt/package/arptables/arptables.control @@ -0,0 +1,8 @@ +Package: arptables +Priority: optional +Section: net +Version: 1.2.11-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: ARP firewalling software diff --git a/openwrt/package/bridge/Config.in b/openwrt/package/bridge/Config.in index 5856e3f791..8e5cddbb36 100644 --- a/openwrt/package/bridge/Config.in +++ b/openwrt/package/bridge/Config.in @@ -1,5 +1,5 @@ config BR2_PACKAGE_BRIDGE - bool "bridge" + tristate "Ethernet bridging support" default y help Manage ethernet bridging; a way to connect networks together to diff --git a/openwrt/package/bridge/Makefile b/openwrt/package/bridge/Makefile new file mode 100644 index 0000000000..5340a9b58e --- /dev/null +++ b/openwrt/package/bridge/Makefile @@ -0,0 +1,69 @@ +############################################################# +# +# ebtables +# +############################################################# +include $(TOPDIR)/rules.mk + +PKG_NAME:=bridge +PKG_VERSION:=1.0.4 +PKG_RELEASE:=1 +PKG_SOURCE_URL:=http://umn.dl.sourceforge.net/sourceforge/bridge +PKG_SOURCE:=bridge-utils-$(PKG_VERSION).tar.gz +PKG_BUILD_DIR:=$(BUILD_DIR)/bridge-utils-$(PKG_VERSION) +PKG_CAT:=zcat +PKG_IPK:=$(PACKAGE_DIR)/$(PKG_NAME)_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk +PKG_IPK_DIR:=$(PKG_BUILD_DIR)/ipkg + +$(DL_DIR)/$(PKG_SOURCE): + $(WGET) -P $(DL_DIR) $(PKG_SOURCE_URL)/$(PKG_SOURCE) + +$(PKG_BUILD_DIR)/.unpacked: $(DL_DIR)/$(PKG_SOURCE) + $(PKG_CAT) $(DL_DIR)/$(PKG_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + touch $(PKG_BUILD_DIR)/.unpacked + +$(PKG_BUILD_DIR)/.patched: $(PKG_BUILD_DIR)/.unpacked + $(PATCH) $(PKG_BUILD_DIR) ./patches + touch $(PKG_BUILD_DIR)/.patched + +$(PKG_BUILD_DIR)/.configured: $(PKG_BUILD_DIR)/.patched + (cd $(PKG_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-headers=$(LINUX_DIR) \ + ); + touch $(PKG_BUILD_DIR)/.configured + +$(PKG_BUILD_DIR)/brctl/brctl: $(PKG_BUILD_DIR)/.configured + $(MAKE) -C $(PKG_BUILD_DIR) + +$(PKG_IPK): $(PKG_BUILD_DIR)/brctl/brctl + $(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_IPK_DIR) $(PKG_NAME).control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH) + mkdir -p $(PKG_IPK_DIR)/usr/sbin + cp $(PKG_BUILD_DIR)/brctl/brctl $(PKG_IPK_DIR)/usr/sbin/ + $(STRIP) $(PKG_IPK_DIR)/usr/sbin/brctl + mkdir -p $(PACKAGE_DIR) + $(IPKG_BUILD) $(PKG_IPK_DIR) $(PACKAGE_DIR) + +source: $(DL_DIR)/$(PKG_SOURCE) +prepare: $(PKG_BUILD_DIR)/.patched +compile: $(PKG_IPK) +install: + $(IPKG) install $(PKG_IPK) +clean: + rm -rf $(PKG_BUILD_DIR) diff --git a/openwrt/package/bridge/bridge.control b/openwrt/package/bridge/bridge.control new file mode 100644 index 0000000000..9ba7b50274 --- /dev/null +++ b/openwrt/package/bridge/bridge.control @@ -0,0 +1,8 @@ +Package: bridge +Priority: essential +Section: net +Version: 1.0.4-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: Ethernet bridging tools diff --git a/openwrt/package/bridge/bridge.mk b/openwrt/package/bridge/bridge.mk deleted file mode 100644 index e831e26d06..0000000000 --- a/openwrt/package/bridge/bridge.mk +++ /dev/null @@ -1,73 +0,0 @@ -############################################################# -# -# 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_PATCHES=$(PACKAGE_DIR)/bridge/patches -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) - - touch $(BRIDGE_BUILD_DIR)/.unpacked - -$(BRIDGE_BUILD_DIR)/.patched: $(BRIDGE_BUILD_DIR)/.unpacked - $(PATCH) $(BRIDGE_BUILD_DIR) $(BRIDGE_PATCHES) - touch $(BRIDGE_BUILD_DIR)/.patched - -$(BRIDGE_BUILD_DIR)/.configured: $(BRIDGE_BUILD_DIR)/.patched - (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-headers=$(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 - mkdir -p $(TARGET_DIR)/usr/sbin - cp -af $(BRIDGE_BUILD_DIR)/brctl/brctl $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY) - $(STRIP) $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY) - -bridge: uclibc $(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) - -############################################################# -# -# Toplevel Makefile options -# -############################################################# -ifeq ($(strip $(BR2_PACKAGE_BRIDGE)),y) -TARGETS+=bridge -endif diff --git a/openwrt/package/busybox/Config.in b/openwrt/package/busybox/Config.in index 9420f53694..4f72994af5 100644 --- a/openwrt/package/busybox/Config.in +++ b/openwrt/package/busybox/Config.in @@ -17,3 +17,10 @@ config BR2_PACKAGE_BUSYBOX_SNAPSHOT Use the latest busybox CVS snapshot instead of release. For fun, you should say Y. + +menu "Busybox Configuration" + depends BR2_PACKAGE_BUSYBOX + +source package/busybox/config/Config.in + +endmenu diff --git a/openwrt/package/busybox/Makefile b/openwrt/package/busybox/Makefile new file mode 100644 index 0000000000..8877c373c1 --- /dev/null +++ b/openwrt/package/busybox/Makefile @@ -0,0 +1,9 @@ +include $(TOPDIR)/rules.mk + +include ./busybox.mk + +source: busybox-source +prepare: $(BUSYBOX_DIR)/.unpacked +compile: $(BUSYBOX_DIR)/busybox +install: busybox +clean: busybox-dirclean diff --git a/openwrt/package/busybox/busybox.config b/openwrt/package/busybox/busybox.config index 1b78d20c24..c79c7ec764 100644 --- a/openwrt/package/busybox/busybox.config +++ b/openwrt/package/busybox/busybox.config @@ -26,7 +26,7 @@ CONFIG_FEATURE_SUID=y CONFIG_LFS=y USING_CROSS_COMPILER=y CROSS_COMPILER_PREFIX="mipsel-uclibc-" -EXTRA_CFLAGS_OPTIONS="-Os " +EXTRA_CFLAGS_OPTIONS="-Os -pipe -mips2" # # Installation Options @@ -189,7 +189,7 @@ CONFIG_MKTEMP=y # CONFIG_PIPE_PROGRESS is not set # CONFIG_READLINK is not set CONFIG_RUN_PARTS=y -# CONFIG_START_STOP_DAEMON is not set +CONFIG_START_STOP_DAEMON=y CONFIG_WHICH=y # diff --git a/openwrt/package/busybox/busybox.mk b/openwrt/package/busybox/busybox.mk index e19aa7bc4f..76de2548a0 100644 --- a/openwrt/package/busybox/busybox.mk +++ b/openwrt/package/busybox/busybox.mk @@ -16,7 +16,7 @@ BUSYBOX_SOURCE:=busybox-$(BUSYBOX_VER).tar.bz2 BUSYBOX_SITE:=http://www.busybox.net/downloads endif BUSYBOX_UNZIP=bzcat -BUSYBOX_CONFIG:=package/busybox/busybox.config +BUSYBOX_CONFIG:=./busybox.config $(DL_DIR)/$(BUSYBOX_SOURCE): $(WGET) -P $(DL_DIR) $(BUSYBOX_SITE)/$(BUSYBOX_SOURCE) @@ -26,19 +26,20 @@ 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/patches + $(PATCH) $(BUSYBOX_DIR) ./patches 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 + $(SCRIPT_DIR)/gen_busybox_config.pl $(TOPDIR)/.config > $(BUSYBOX_DIR)/.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 @@ -49,10 +50,11 @@ $(BUSYBOX_DIR)/busybox: $(BUSYBOX_DIR)/.configured $(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 + $(STRIP) $(TARGET_DIR)/bin/busybox # Just in case -chmod a+x $(TARGET_DIR)/usr/share/udhcpc/default.script -busybox: uclibc $(TARGET_DIR)/bin/busybox +busybox: $(TARGET_DIR)/bin/busybox busybox-clean: rm -f $(TARGET_DIR)/bin/busybox @@ -60,12 +62,3 @@ busybox-clean: busybox-dirclean: rm -rf $(BUSYBOX_DIR) - -############################################################# -# -# Toplevel Makefile options -# -############################################################# -ifeq ($(strip $(BR2_PACKAGE_BUSYBOX)),y) -TARGETS+=busybox -endif diff --git a/openwrt/package/busybox/config/Config.in b/openwrt/package/busybox/config/Config.in new file mode 100644 index 0000000000..e7afb53629 --- /dev/null +++ b/openwrt/package/busybox/config/Config.in @@ -0,0 +1,293 @@ +# +# For a description of the syntax of this configuration file, +# see scripts/kbuild/config-language.txt. +# + + +config BUSYBOX_HAVE_DOT_CONFIG + bool + default y + +menu "General Configuration" + +choice + prompt "Buffer allocation policy" + default BUSYBOX_CONFIG_FEATURE_BUFFERS_GO_ON_STACK + help + There are 3 ways BusyBox can handle buffer allocations: + - Use malloc. This costs code size for the call to xmalloc. + - Put them on stack. For some very small machines with limited stack + space, this can be deadly. For most folks, this works just fine. + - Put them in BSS. This works beautifully for computers with a real + MMU (and OS support), but wastes runtime RAM for uCLinux. This + behavior was the only one available for BusyBox versions 0.48 and + earlier. + +config BUSYBOX_CONFIG_FEATURE_BUFFERS_USE_MALLOC + bool "Allocate with Malloc" + +config BUSYBOX_CONFIG_FEATURE_BUFFERS_GO_ON_STACK + bool "Allocate on the Stack" + +config BUSYBOX_CONFIG_FEATURE_BUFFERS_GO_IN_BSS + bool "Allocate in the .bss section" + +endchoice + +config BUSYBOX_CONFIG_FEATURE_VERBOSE_USAGE + bool "Show verbose applet usage messages" + default y + help + All BusyBox applets will show more verbose help messages when + busybox is invoked with --help. This will add a lot of text to the + busybox binary. In the default configuration, this will add about + 13k, but it can add much more depending on your configuration. + +config BUSYBOX_CONFIG_FEATURE_INSTALLER + bool "Support --install [-s] to install applet links at runtime" + default n + help + Enable 'busybox --install [-s]' support. This will allow you to use + busybox at runtime to create hard links or symlinks for all the + applets that are compiled into busybox. This feature requires the + /proc filesystem. + +config BUSYBOX_CONFIG_LOCALE_SUPPORT + bool "Enable locale support (system needs locale for this to work)" + default n + help + Enable this if your system has locale support and you would like + busybox to support locale settings. + +config BUSYBOX_CONFIG_FEATURE_DEVFS + bool "Support for devfs" + default y + help + Enable if you want BusyBox to work with devfs. + +config BUSYBOX_CONFIG_FEATURE_DEVPTS + bool "Use the devpts filesystem for Unix98 PTYs" + default y if BUSYBOX_CONFIG_FEATURE_DEVFS + help + Enable if you want BusyBox to use Unix98 PTY support. If enabled, + busybox will use /dev/ptmx for the master side of the pseudoterminal + and /dev/pts/ for the slave side. Otherwise, BSD style + /dev/ttyp will be used. To use this option, you should have + devpts or devfs mounted. + +config BUSYBOX_CONFIG_FEATURE_CLEAN_UP + bool "Clean up all memory before exiting (usually not needed)" + default n + help + As a size optimization, busybox by default does not cleanup memory + that is dynamically allocated or close files before exiting. This + saves space and is usually not needed since the OS will clean up for + us. Don't enable this unless you have a really good reason to clean + things up manually. + +config BUSYBOX_CONFIG_FEATURE_SUID + bool "Support for SUID/SGID handling" + default y + help + Support SUID and SGID binaries. + +config BUSYBOX_CONFIG_FEATURE_SUID_CONFIG + bool "Runtime SUID/SGID configuration via /etc/busybox.conf" + default n if BUSYBOX_CONFIG_FEATURE_SUID + depends on BUSYBOX_CONFIG_FEATURE_SUID + help + Allow the SUID / SGID state of an applet to be determined runtime by + checking /etc/busybox.conf. The format of this file is as follows: + + = [Ssx-][Ssx-][x-] (|).(|) + + An example might help: + + [SUID] + su = ssx root.0 # applet su can be run by anyone and runs with euid=0/egid=0 + su = ssx # exactly the same + + mount = sx- root.disk # applet mount can be run by root and members of group disk + # and runs with euid=0 + + cp = --- # disable applet cp for everyone + + Robert 'sandman' Griebl has more information here: + . + +config BUSYBOX_CONFIG_FEATURE_SUID_CONFIG_QUIET + bool "Suppress warning message if /etc/busybox.conf is not readable" + default n + depends on BUSYBOX_CONFIG_FEATURE_SUID_CONFIG + help + /etc/busybox.conf should be readable by the user needing the SUID, check + this option to avoid users to be notified about missing permissions. + +config BUSYBOX_CONFIG_SELINUX + bool "Support NSA Security Enhanced Linux" + default n + help + Enable support for SE Linux in applets ls, ps, and id. Also provide + the option of compiling in SE Linux applets. + + If you do not have a complete SE Linux Full Userland installed, this + stuff will not compile. Go visit + http://www.nsa.gov/selinux/index.html + to download the necessary stuff to allow busybox to compile with this + option enabled. + + Most people will leave this set to 'N'. + +endmenu + +menu 'Build Options' + +config BUSYBOX_CONFIG_STATIC + bool "Build BusyBox as a static binary (no shared libs)" + default n + help + If you want to build a static BusyBox binary, which does not + use or require any shared libraries, then enable this option. + This can cause BusyBox to be considerably larger, so you should + leave this option false unless you have a good reason (i.e. + your target platform does not support shared libraries, or + you are building an initrd which doesn't need anything but + BusyBox, etc). + + Most people will leave this set to 'N'. + +config BUSYBOX_CONFIG_LFS + bool + default y + select BUSYBOX_FDISK_SUPPORT_LARGE_DISKS + help + If you want to build BusyBox with large file support, then enable + this option. This will have no effect if your kernel or your C + library lacks large file support for large files. Some of the + programs that can benefit from large file support include dd, gzip, + cp, mount, tar, and many others. If you want to access files larger + than 2 Gigabytes, enable this option. Otherwise, leave it set to 'N'. + +config BUSYBOX_USING_CROSS_COMPILER + bool + default y + help + Do you want to build BusyBox with a Cross Compiler? If so, + then enable this option. Otherwise leave it set to 'N'. + +config BUSYBOX_CROSS_COMPILER_PREFIX + string + default "mipsel-uclibc-" + depends on BUSYBOX_USING_CROSS_COMPILER + help + If you want to build BusyBox with a cross compiler, then you + will need to set this to the cross-compiler prefix. For example, + if my cross-compiler is /usr/i386-linux-uclibc/bin/i386-uclibc-gcc + then I would enter '/usr/i386-linux-uclibc/bin/i386-uclibc-' here, + which will ensure the correct compiler is used. + +config BUSYBOX_EXTRA_CFLAGS_OPTIONS + string + default "-Os " + help + Do you want to pass any extra CFLAGS options to the compiler as + you build BusyBox? If so, this is the option for you... For example, + if you want to add some simple compiler switches (like -march=i686), + or check for warnings using -Werror, just those options here. + +endmenu + +menu 'Installation Options' + +config BUSYBOX_CONFIG_INSTALL_NO_USR + bool "Don't use /usr" + default n + help + Disable use of /usr. Don't activate this option if you don't know + that you really want this behaviour. + +config BUSYBOX_PREFIX + string + default "./_install" + help + Define your directory to install BusyBox files/subdirs in. + + + +endmenu + +source package/busybox/config/archival/Config.in +source package/busybox/config/coreutils/Config.in +source package/busybox/config/console-tools/Config.in +source package/busybox/config/debianutils/Config.in +source package/busybox/config/editors/Config.in +source package/busybox/config/findutils/Config.in +source package/busybox/config/init/Config.in +source package/busybox/config/loginutils/Config.in +source package/busybox/config/miscutils/Config.in +source package/busybox/config/modutils/Config.in +source package/busybox/config/networking/Config.in +source package/busybox/config/procps/Config.in +source package/busybox/config/shell/Config.in +source package/busybox/config/sysklogd/Config.in +source package/busybox/config/util-linux/Config.in + +menu 'Debugging Options' + +config BUSYBOX_CONFIG_DEBUG + bool "Build BusyBox with Debugging symbols" + default n + help + Say Y here if you wish to compile BusyBox with debugging symbols. + This will allow you to use a debugger to examine BusyBox internals + while applets are running. This increases the size of the binary + considerably and should only be used when doing development. + If you are doing development and want to debug BusyBox, answer Y. + + Most people should answer N. + +choice + prompt "Additional debugging library" + default BUSYBOX_CONFIG_NO_DEBUG_LIB + depends on BUSYBOX_CONFIG_DEBUG + help + Using an additional debugging library will make BusyBox become + considerable larger and will cause it to run more slowly. You + should always leave this option disabled for production use. + + dmalloc support: + ---------------- + This enables compiling with dmalloc ( http://dmalloc.com/ ) + which is an excellent public domain mem leak and malloc problem + detector. To enable dmalloc, before running busybox you will + want to properly set your environment, for example: + export DMALLOC_OPTIONS=debug=0x34f47d83,inter=100,log=logfile + The 'debug=' value is generated using the following command + dmalloc -p log-stats -p log-non-free -p log-bad-space -p log-elapsed-time \ + -p check-fence -p check-heap -p check-lists -p check-blank \ + -p check-funcs -p realloc-copy -p allow-free-null + + Electric-fence support: + ----------------------- + This enables compiling with Electric-fence support. Electric + fence is another very useful malloc debugging library which uses + your computer's virtual memory hardware to detect illegal memory + accesses. This support will make BusyBox be considerable larger + and run slower, so you should leave this option disabled unless + you are hunting a hard to find memory problem. + + +config BUSYBOX_CONFIG_NO_DEBUG_LIB + bool "None" + +config BUSYBOX_CONFIG_DMALLOC + bool "Dmalloc" + +config BUSYBOX_CONFIG_EFENCE + bool "Electric-fence" + +endchoice + + +endmenu + diff --git a/openwrt/package/busybox/config/archival/Config.in b/openwrt/package/busybox/config/archival/Config.in new file mode 100644 index 0000000000..8bb4886eb6 --- /dev/null +++ b/openwrt/package/busybox/config/archival/Config.in @@ -0,0 +1,258 @@ +# +# For a description of the syntax of this configuration file, +# see scripts/kbuild/config-language.txt. +# + +menu "Archival Utilities" + +config BUSYBOX_CONFIG_AR + bool "ar" + default n + help + ar is an archival utility program used to create, modify, and + extract contents from archives. An archive is a single file holding + a collection of other files in a structure that makes it possible to + retrieve the original individual files (called archive members). + The original files' contents, mode (permissions), timestamp, owner, + and group are preserved in the archive, and can be restored on + extraction. + + The stored filename is limited to 15 characters. (for more information + see long filename support). + ar has 60 bytes of overheads for every stored file. + + This implementation of ar can extract archives, it cannot create or + modify them. + On an x86 system, the ar applet adds about 1K. + + Unless you have a specific application which requires ar, you should + probably say N here. + +config BUSYBOX_CONFIG_FEATURE_AR_LONG_FILENAMES + bool " Enable support for long filenames (not need for debs)" + default n + depends on BUSYBOX_CONFIG_AR + help + By default the ar format can only store the first 15 characters of the + filename, this option removes that limitation. + It supports the GNU ar long filename method which moves multiple long + filenames into a the data section of a new ar entry. + +config BUSYBOX_CONFIG_BUNZIP2 + bool "bunzip2" + default y + help + bunzip2 is a compression utility using the Burrows-Wheeler block + sorting text compression algorithm, and Huffman coding. Compression + is generally considerably better than that achieved by more + conventional LZ77/LZ78-based compressors, and approaches the + performance of the PPM family of statistical compressors. + + The BusyBox bunzip2 applet is limited to de-compression only. + On an x86 system, this applet adds about 11K. + + Unless you have a specific application which requires bunzip2, you + should probably say N here. + +config BUSYBOX_CONFIG_CPIO + bool "cpio" + default n + help + cpio is an archival utility program used to create, modify, and extract + contents from archives. + cpio has 110 bytes of overheads for every stored file. + + This implementation of cpio can extract cpio archives created in the + "newc" or "crc" format, it cannot create or modify them. + + Unless you have a specific application which requires cpio, you should + probably say N here. + +config BUSYBOX_CONFIG_DPKG + bool "dpkg" + default n + help + dpkg is a medium-level tool to install, build, remove and manage Debian packages. + + This implementation of dpkg has a number of limitations, you should use the + official dpkg if possible. + +config BUSYBOX_CONFIG_DPKG_DEB + bool "dpkg_deb" + default n + help + dpkg-deb packs, unpacks and provides information about Debian archives. + + This implementation of dpkg-deb cannot pack archives. + + Unless you have a specific application which requires dpkg-deb, you should + probably say N here. + +config BUSYBOX_CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY + bool " extract only (-x)" + default n + depends on BUSYBOX_CONFIG_DPKG_DEB + help + This reduces dpkg-deb to the equivalent of "ar -p data.tar.gz | tar -zx". + However it saves space as none of the extra dpkg-deb, ar or tar options are + needed, they are linked to internally. + +config BUSYBOX_CONFIG_GUNZIP + bool "gunzip" + default y + help + gunzip is used to decompress archives created by gzip. + You can use the `-t' option to test the integrity of + an archive, without decompressing it. + +config BUSYBOX_CONFIG_FEATURE_GUNZIP_UNCOMPRESS + bool " Uncompress support" + default y + depends on BUSYBOX_CONFIG_GUNZIP + help + Enable if you want gunzip to have the ability to decompress + archives created by the program compress (not much + used anymore). + +config BUSYBOX_CONFIG_GZIP + bool "gzip" + default y + help + gzip is used to compress files. + It's probably the most widely used UNIX compression program. + +config BUSYBOX_CONFIG_RPM2CPIO + bool "rpm2cpio" + default n + help + Converts an RPM file into a CPIO archive. + +config BUSYBOX_CONFIG_RPM + bool "rpm" + default n + help + Mini RPM applet - queries and extracts + +config BUSYBOX_CONFIG_TAR + bool "tar" + default y + help + tar is an archiving program. It's commonly used with gzip to + create compressed archives. It's probably the most widely used + UNIX archive program. + +config BUSYBOX_CONFIG_FEATURE_TAR_CREATE + bool " Enable archive creation" + default y + depends on BUSYBOX_CONFIG_TAR + help + If you enable this option you'll be able to create + tar archives using the `-c' option. + +config BUSYBOX_CONFIG_FEATURE_TAR_BZIP2 + bool " Enable -j option to handle .tar.bz2 files" + default y + depends on BUSYBOX_CONFIG_TAR + help + If you enable this option you'll be able to extract + archives compressed with bzip2. + +config BUSYBOX_CONFIG_FEATURE_TAR_FROM + bool " Enable -X (exclude from) and -T (include from) options)" + default n + depends on BUSYBOX_CONFIG_TAR + help + If you enable this option you'll be able to specify + a list of files to include or exclude from an archive. + +config BUSYBOX_CONFIG_FEATURE_TAR_GZIP + bool " Enable -z option" + default y + depends on BUSYBOX_CONFIG_TAR + help + If you enable this option tar will be able to call gzip, + when creating or extracting tar gziped archives. + +config BUSYBOX_CONFIG_FEATURE_TAR_COMPRESS + bool " Enable -Z option" + default n + depends on BUSYBOX_CONFIG_TAR + help + If you enable this option tar will be able to call uncompress, + when extracting .tar.Z archives. + +config BUSYBOX_CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY + bool " Enable support for old tar header format" + default n + depends on BUSYBOX_CONFIG_TAR + help + This option is required to unpack archives created in + the old GNU format; help to kill this old format by + repacking your ancient archives with the new format. + +config BUSYBOX_CONFIG_FEATURE_TAR_GNU_EXTENSIONS + bool " Enable support for some GNU tar extensions" + default y + depends on BUSYBOX_CONFIG_TAR + help + With this option busybox supports GNU long filenames and + linknames. + +config BUSYBOX_CONFIG_FEATURE_TAR_LONG_OPTIONS + bool " Enable long options" + default n + depends on BUSYBOX_CONFIG_TAR + help + Enable use of long options, increases size by about 400 Bytes + +config BUSYBOX_CONFIG_UNCOMPRESS + bool "uncompress" + default n + help + uncompress is used to decompress archives created by compress. + Not much used anymore, replaced by gzip/gunzip. + +config BUSYBOX_CONFIG_UNZIP + bool "unzip" + default n + help + unzip will list or extract files from a ZIP archive, + commonly found on DOS/WIN systems. The default behavior + (with no options) is to extract the archive into the + current directory. Use the `-d' option to extract to a + directory of your choice. + +comment "Common options for cpio and tar" + depends on BUSYBOX_CONFIG_CPIO || BUSYBOX_CONFIG_TAR + +config BUSYBOX_CONFIG_FEATURE_UNARCHIVE_TAPE + bool " Enable tape drive support" + default n + depends on BUSYBOX_CONFIG_CPIO || BUSYBOX_CONFIG_TAR + help + I don't think this is needed anymore. + +comment "Common options for dpkg and dpkg_deb" + depends on BUSYBOX_CONFIG_DPKG || BUSYBOX_CONFIG_DPKG_DEB + +config BUSYBOX_CONFIG_FEATURE_DEB_TAR_GZ + bool " gzip debian packages (normal)" + default n if BUSYBOX_CONFIG_DPKG || BUSYBOX_CONFIG_DPKG_DEB + depends on BUSYBOX_CONFIG_DPKG || BUSYBOX_CONFIG_DPKG_DEB + help + This is the default compression method inside the debian ar file. + + If you want compatibility with standard .deb's you should say yes here. + +config BUSYBOX_CONFIG_FEATURE_DEB_TAR_BZ2 + bool " bzip2 debian packages" + default n + depends on BUSYBOX_CONFIG_DPKG || BUSYBOX_CONFIG_DPKG_DEB + help + This allows dpkg and dpkg-deb to extract deb's that are compressed internally + with bzip2 instead of gzip. + + You only want this if you are creating your own custom debian packages that + use an internal control.tar.bz2 or data.tar.bz2. + +endmenu diff --git a/openwrt/package/busybox/config/console-tools/Config.in b/openwrt/package/busybox/config/console-tools/Config.in new file mode 100644 index 0000000000..207e2df21c --- /dev/null +++ b/openwrt/package/busybox/config/console-tools/Config.in @@ -0,0 +1,68 @@ +# +# For a description of the syntax of this configuration file, +# see scripts/kbuild/config-language.txt. +# + +menu "Console Utilities" + +config BUSYBOX_CONFIG_CHVT + bool "chvt" + default n + help + This program is used to change to another terminal. + Example: chvt 4 (change to terminal /dev/tty4) + +config BUSYBOX_CONFIG_CLEAR + bool "clear" + default y + help + This program clears the terminal screen. + +config BUSYBOX_CONFIG_DEALLOCVT + bool "deallocvt" + default n + help + This program deallocates unused virtual consoles. + +config BUSYBOX_CONFIG_DUMPKMAP + bool "dumpkmap" + default n + help + This program dumps the kernel's keyboard translation table to + stdout, in binary format. You can then use loadkmap to load it. + +config BUSYBOX_CONFIG_LOADFONT + bool "loadfont" + default n + help + This program loads a console font from standard input. + +config BUSYBOX_CONFIG_LOADKMAP + bool "loadkmap" + default n + help + This program loads a keyboard translation table from + standard input. + +config BUSYBOX_CONFIG_OPENVT + bool "openvt" + default n + help + This program is used to start a command on an unused + virtual terminal. + +config BUSYBOX_CONFIG_RESET + bool "reset" + default y + help + This program is used to reset the terminal screen, if it + gets messed up. + +config BUSYBOX_CONFIG_SETKEYCODES + bool "setkeycodes" + default n + help + This program loads entries into the kernel's scancode-to-keycode + map, allowing unusual keyboards to generate usable keycodes. + +endmenu diff --git a/openwrt/package/busybox/config/coreutils/Config.in b/openwrt/package/busybox/config/coreutils/Config.in new file mode 100644 index 0000000000..1f3da2f107 --- /dev/null +++ b/openwrt/package/busybox/config/coreutils/Config.in @@ -0,0 +1,613 @@ +# +# For a description of the syntax of this configuration file, +# see scripts/kbuild/config-language.txt. +# + +menu "Coreutils" + +config BUSYBOX_CONFIG_BASENAME + bool "basename" + default y + help + basename is used to strip the directory and suffix from filenames, + leaving just the filename itself. Enable this option if you wish + to enable the 'basename' utility. + +config BUSYBOX_CONFIG_CAL + bool "cal" + default n + help + cal is used to display a monthly calender. + +config BUSYBOX_CONFIG_CAT + bool "cat" + default y + help + cat is used to concatenate files and print them to the standard + output. Enable this option if you wish to enable the 'cat' utility. + +config BUSYBOX_CONFIG_CHGRP + bool "chgrp" + default y + help + chgrp is used to change the group ownership of files. + +config BUSYBOX_CONFIG_CHMOD + bool "chmod" + default y + help + chmod is used to change the access permission of files. + +config BUSYBOX_CONFIG_CHOWN + bool "chown" + default y + help + chown is used to change the user and/or group ownership + of files. + +config BUSYBOX_CONFIG_CHROOT + bool "chroot" + default y + help + chroot is used to change the root directory and run a command. + The default command is `/bin/sh'. + +config BUSYBOX_CONFIG_CMP + bool "cmp" + default n + help + cmp is used to compare two files and returns the result + to standard output. + +config BUSYBOX_CONFIG_CP + bool "cp" + default y + help + cp is used to copy files and directories. + +config BUSYBOX_CONFIG_CUT + bool "cut" + default y + help + cut is used to print selected parts of lines from + each file to stdout. + +if BUSYBOX_CONFIG_WATCH + config BUSYBOX_CONFIG_DATE + default y + comment "date (forced enabled for use with watch)" +endif + +if !CONFIG_WATCH + config BUSYBOX_CONFIG_DATE + bool "date" + default y + help + date is used to set the system date or display the + current time in the given format. +endif + +config BUSYBOX_CONFIG_FEATURE_DATE_ISOFMT + bool " Enable ISO date format output (-I)" + default y + depends on BUSYBOX_CONFIG_DATE + help + Enable option (-I) to output an ISO-8601 compliant + date/time string. + +config BUSYBOX_CONFIG_DD + bool "dd" + default y + help + dd copies a file (from standard input to standard output, + by default) using specific input and output blocksizes, + while optionally performing conversions on it. + +config BUSYBOX_CONFIG_DF + bool "df" + default y + help + df reports the amount of disk space used and available + on filesystems. + +config BUSYBOX_CONFIG_DIRNAME + bool "dirname" + default n + help + dirname is used to strip a non-directory suffix from + a file name. + +config BUSYBOX_CONFIG_DOS2UNIX + bool "dos2unix/unix2dos" + default n + help + dos2unix is used to convert a text file from DOS format to + UNIX format, and vice versa. + +config BUSYBOX_CONFIG_UNIX2DOS + bool + default n + depends on BUSYBOX_CONFIG_DOS2UNIX + +config BUSYBOX_CONFIG_DU + bool "du (default blocksize of 512 bytes)" + default n + help + du is used to report the amount of disk space used + for specified files. + +config BUSYBOX_CONFIG_FEATURE_DU_DEFALT_BLOCKSIZE_1K + bool " Use a default blocksize of 1024 bytes (1K)" + default n + depends on BUSYBOX_CONFIG_DU + help + Use a blocksize of (1K) instead of the default 512b. + +config BUSYBOX_CONFIG_ECHO + bool "echo (basic SUSv3 version taking no options)" + default y + help + echo is used to print a specified string to stdout. + +config BUSYBOX_CONFIG_FEATURE_FANCY_ECHO + bool " Enable echo options (-n and -e)" + default y + depends on BUSYBOX_CONFIG_ECHO + help + This adds options (-n and -e) to echo. + +config BUSYBOX_CONFIG_ENV + bool "env" + default y + help + env is used to set an environment variable and run + a command; without options it displays the current + environment. + +config BUSYBOX_CONFIG_EXPR + bool "expr" + default y + help + expr is used to calculate numbers and print the result + to standard output. + +if BUSYBOX_CONFIG_HUSH || BUSYBOX_CONFIG_LASH || BUSYBOX_CONFIG_MSH + config BUSYBOX_CONFIG_FALSE + default y + comment "false (forced enabled for use with shell)" +endif + +if !CONFIG_HUSH && !CONFIG_LASH && !CONFIG_MSH + config BUSYBOX_CONFIG_FALSE + bool "false" + default y + help + false returns an exit code of FALSE (1). +endif + +config BUSYBOX_CONFIG_FOLD + bool "fold" + default n + help + Wrap text to fit a specific width. + +config BUSYBOX_CONFIG_HEAD + bool "head" + default y + help + head is used to print the first specified number of lines + from files. + +config BUSYBOX_CONFIG_FEATURE_FANCY_HEAD + bool " Enable head options (-c, -q, and -v)" + default n + depends on BUSYBOX_CONFIG_HEAD + help + This enables the head options (-c, -q, and -v). + +config BUSYBOX_CONFIG_HOSTID + bool "hostid" + default y + help + hostid prints the numeric identifier (in hexadecimal) for + the current host. + +config BUSYBOX_CONFIG_ID + bool "id" + default n + help + id displays the current user and group ID names. + +config BUSYBOX_CONFIG_INSTALL + bool "install" + default y + help + Copy files and set attributes. + +config BUSYBOX_CONFIG_LENGTH + bool "length" + default y + help + length is used to print out the length of a specified string. + +config BUSYBOX_CONFIG_LN + bool "ln" + default y + help + ln is used to create hard or soft links between files. + +config BUSYBOX_CONFIG_LOGNAME + bool "logname" + default n + help + logname is used to print the current user's login name. + +config BUSYBOX_CONFIG_LS + bool "ls" + default y + help + ls is used to list the contents of directories. + +config BUSYBOX_CONFIG_FEATURE_LS_FILETYPES + bool " Enable filetyping options (-p and -F)" + default y + depends on BUSYBOX_CONFIG_LS + help + Enable the ls options (-p and -F). + +config BUSYBOX_CONFIG_FEATURE_LS_FOLLOWLINKS + bool " Enable symlinks dereferencing (-L)" + default y + depends on BUSYBOX_CONFIG_LS + help + Enable the ls option (-L). + +config BUSYBOX_CONFIG_FEATURE_LS_RECURSIVE + bool " Enable recursion (-R)" + default y + depends on BUSYBOX_CONFIG_LS + help + Enable the ls option (-R). + +config BUSYBOX_CONFIG_FEATURE_LS_SORTFILES + bool " Sort the file names" + default y + depends on BUSYBOX_CONFIG_LS + help + Allow ls to sort file names alphabetically. + +config BUSYBOX_CONFIG_FEATURE_LS_TIMESTAMPS + bool " Show file timestamps" + default y + depends on BUSYBOX_CONFIG_LS + help + Allow ls to display timestamps for files. + +config BUSYBOX_CONFIG_FEATURE_LS_USERNAME + bool " Show username/groupnames" + default y + depends on BUSYBOX_CONFIG_LS + help + Allow ls to display username/groupname for files. + +config BUSYBOX_CONFIG_FEATURE_LS_COLOR + bool " Use color to identify file types" + default y + depends on BUSYBOX_CONFIG_LS + help + Allow ls to use color when displaying files. + +config BUSYBOX_CONFIG_MD5SUM + bool "md5sum" + default y + help + md5sum is used to print or check MD5 checksums. + +config BUSYBOX_CONFIG_MKDIR + bool "mkdir" + default y + help + mkdir is used to create directories with the specified names. + +config BUSYBOX_CONFIG_MKFIFO + bool "mkfifo" + default y + help + mkfifo is used to create FIFOs (named pipes). + The `mknod' program can also create FIFOs. + +config BUSYBOX_CONFIG_MKNOD + bool "mknod" + default n + help + mknod is used to create FIFOs or block/character special + files with the specified names. + +config BUSYBOX_CONFIG_MV + bool "mv" + default y + help + mv is used to move or rename files or directories. + +config BUSYBOX_CONFIG_OD + bool "od" + default n + help + od is used to dump binary files in octal and other formats. + +config BUSYBOX_CONFIG_PRINTF + bool "printf" + default n + help + printf is used to format and print specified strings. + It's similar to `echo' except it has more options. + +config BUSYBOX_CONFIG_PWD + bool "pwd" + default y + help + pwd is used to print the current directory. + +config BUSYBOX_CONFIG_REALPATH + bool "realpath" + default n + help + Return the canonicalized absolute pathname. + This isn't provided by GNU shellutils, but where else does it belong. + +config BUSYBOX_CONFIG_RM + bool "rm" + default y + help + rm is used to remove files or directories. + +config BUSYBOX_CONFIG_RMDIR + bool "rmdir" + default y + help + rmdir is used to remove empty directories. + +config BUSYBOX_CONFIG_SEQ + bool "seq" + default n + help + print a sequence of numbers + +config BUSYBOX_CONFIG_SHA1SUM + bool "sha1sum" + default n + help + Compute and check SHA1 message digest + +config BUSYBOX_CONFIG_SLEEP + bool "sleep (single integer arg with no suffix)" + default y + help + sleep is used to pause for a specified number of seconds, + +config BUSYBOX_CONFIG_FEATURE_FANCY_SLEEP + bool " Enable multiple integer args and optional time suffixes" + default y + depends on BUSYBOX_CONFIG_SLEEP + help + Allow sleep to pause for specified minutes, hours, and days. + +config BUSYBOX_CONFIG_SORT + bool "sort" + default y + help + sort is used to sort lines of text in specified files. + +config BUSYBOX_CONFIG_STTY + bool "stty" + default n + help + stty is used to change and print terminal line settings. + +config BUSYBOX_CONFIG_SYNC + bool "sync" + default y + help + sync is used to flush filesystem buffers. + +config BUSYBOX_CONFIG_TAIL + bool "tail" + default y + help + tail is used to print the last specified number of lines + from files. + +config BUSYBOX_CONFIG_FEATURE_FANCY_TAIL + bool " Enable extra tail options (-q, -s, and -v)" + default y + depends on BUSYBOX_CONFIG_TAIL + help + The options (-q, -s, and -v) are provided by GNU tail, but + are not specific in the SUSv3 standard. + +config BUSYBOX_CONFIG_TEE + bool "tee" + default y + help + tee is used to read from standard input and write + to standard output and files. + +config BUSYBOX_CONFIG_FEATURE_TEE_USE_BLOCK_IO + bool " Enable block i/o (larger/faster) instead of byte i/o." + default y + depends on BUSYBOX_CONFIG_TEE + help + Enable this option for a faster tee, at expense of size. + +if BUSYBOX_CONFIG_ASH || BUSYBOX_CONFIG_HUSH || BUSYBOX_CONFIG_LASH || BUSYBOX_CONFIG_MSH + config BUSYBOX_CONFIG_TEST + default y + comment "test (forced enabled for use with shell)" +endif + +if !CONFIG_ASH && !CONFIG_HUSH && !CONFIG_LASH && !CONFIG_MSH + config BUSYBOX_CONFIG_TEST + bool "test" + default y + help + test is used to check file types and compare values, + returning an appropriate exit code. The shells (ash + and bash) have test builtin. +endif + +config BUSYBOX_CONFIG_FEATURE_TEST_64 + bool " Extend test to 64 bit" + default n + depends on BUSYBOX_CONFIG_TEST + help + Enable 64-bit support in test. + +config BUSYBOX_CONFIG_TOUCH + bool "touch" + default y + help + touch is used to create or change the access and/or + modification timestamp of specified files. + +config BUSYBOX_CONFIG_TR + bool "tr" + default n + help + tr is used to squeeze, and/or delete characters from standard + input, writing to standard output. + +if BUSYBOX_CONFIG_HUSH || BUSYBOX_CONFIG_LASH || BUSYBOX_CONFIG_MSH + config BUSYBOX_CONFIG_TRUE + default y + comment "true (forced enabled for use with shell)" +endif + +if !CONFIG_HUSH && !CONFIG_LASH && !CONFIG_MSH + config BUSYBOX_CONFIG_TRUE + bool "true" + default y + help + true returns an exit code of TRUE (0). + +endif + +config BUSYBOX_CONFIG_TTY + bool "tty" + default n + help + tty is used to print the name of the current terminal to + standard output. + +config BUSYBOX_CONFIG_UNAME + bool "uname" + default y + help + uname is used to print system information. + +config BUSYBOX_CONFIG_UNIQ + bool "uniq" + default y + help + uniq is used to remove duplicate lines from a sorted file. + +config BUSYBOX_CONFIG_USLEEP + bool "usleep" + default n + help + usleep is used to pause for a specified number of microseconds. + +config BUSYBOX_CONFIG_UUDECODE + bool "uudecode" + default n + help + uudecode is used to decode a uuencoded file. + +config BUSYBOX_CONFIG_UUENCODE + bool "uuencode" + default n + help + uuencode is used to uuencode a file. + +config BUSYBOX_CONFIG_WATCH + bool "watch" + default n + help + watch is used to execute a program periodically, showing + output to the screen. + +config BUSYBOX_CONFIG_WC + bool "wc" + default y + help + wc is used to print the number of bytes, words, and lines, + in specified files. + +config BUSYBOX_CONFIG_WHO + bool "who" + default n + select BUSYBOX_CONFIG_FEATURE_U_W_TMP + help + who is used to show who is logged on. + +config BUSYBOX_CONFIG_WHOAMI + bool "whoami" + default n + help + whoami is used to print the username of the current + user id (same as id -un). + +config BUSYBOX_CONFIG_YES + bool "yes" + default y + help + yes is used to repeatedly output a specific string, or + the default string `y'. + +comment "Common options for cp and mv" + depends on BUSYBOX_CONFIG_CP || BUSYBOX_CONFIG_MV + +config BUSYBOX_CONFIG_FEATURE_PRESERVE_HARDLINKS + bool " Preserve hard links" + default y + depends on BUSYBOX_CONFIG_CP || BUSYBOX_CONFIG_MV + help + Allow cp and mv to preserve hard links. + +comment "Common options for ls and more" + depends on BUSYBOX_CONFIG_LS || BUSYBOX_CONFIG_MORE + +config BUSYBOX_CONFIG_FEATURE_AUTOWIDTH + bool " Calculate terminal & column widths" + default y + depends on BUSYBOX_CONFIG_LS || BUSYBOX_CONFIG_MORE + help + This option allows utilities such as 'ls' and 'more' to determine the + width of the screen, which can allow them to display additional text + or avoid wrapping text onto the next line. If you leave this + disabled, your utilities will be especially primitive and will be + unable to determine the current screen width. + +comment "Common options for df, du, ls" + depends on BUSYBOX_CONFIG_DF || BUSYBOX_CONFIG_DU || BUSYBOX_CONFIG_LS + +config BUSYBOX_CONFIG_FEATURE_HUMAN_READABLE + bool " Support for human readable output (example 13k, 23M, 235G)" + default y + depends on BUSYBOX_CONFIG_DF || BUSYBOX_CONFIG_DU || BUSYBOX_CONFIG_LS + help + Allow df, du, and ls to have human readable output. + +comment "Common options for md5sum, sha1sum" + depends on BUSYBOX_CONFIG_MD5SUM || BUSYBOX_CONFIG_SHA1SUM + +config BUSYBOX_CONFIG_FEATURE_MD5_SHA1_SUM_CHECK + bool " Enable -c, -s and -w options" + default y + depends on BUSYBOX_CONFIG_MD5SUM || BUSYBOX_CONFIG_SHA1SUM + help + Enabling the -c options allows files to be checked + against pre-calculated hash values. + + -s and -w are useful options when verifying checksums. + +endmenu diff --git a/openwrt/package/busybox/config/debianutils/Config.in b/openwrt/package/busybox/config/debianutils/Config.in new file mode 100644 index 0000000000..c5a07eaec5 --- /dev/null +++ b/openwrt/package/busybox/config/debianutils/Config.in @@ -0,0 +1,58 @@ +# +# For a description of the syntax of this configuration file, +# see scripts/kbuild/config-language.txt. +# + +menu "Debian Utilities" + +config BUSYBOX_CONFIG_MKTEMP + bool "mktemp" + default y + help + mktemp is used to create unique temporary files + +config BUSYBOX_CONFIG_PIPE_PROGRESS + bool "pipe_progress" + default n + help + Display a dot to indicate pipe activity. + +config BUSYBOX_CONFIG_READLINK + bool "readlink" + default n + help + This program reads a symbolic link and returns the name + of the file it points to + +config BUSYBOX_CONFIG_RUN_PARTS + bool "run-parts" + default y + help + run-parts is a utility designed to run all the scripts in a directory. + + It is useful to set up a directory like cron.daily, where you need to + execute all the scripts in that directory. + + In this implementation of run-parts some features (such as report mode) + are not implemented. + + Unless you know that run-parts is used in some of your scripts + you can safely say N here. + +config BUSYBOX_CONFIG_START_STOP_DAEMON + bool "start-stop-daemon" + default y + help + start-stop-daemon is used to control the creation and + termination of system-level processes, usually the ones + started during the startup of the system. + +config BUSYBOX_CONFIG_WHICH + bool "which" + default y + help + which is used to find programs in your PATH and + print out their pathnames. + +endmenu + diff --git a/openwrt/package/busybox/config/editors/Config.in b/openwrt/package/busybox/config/editors/Config.in new file mode 100644 index 0000000000..85074b333f --- /dev/null +++ b/openwrt/package/busybox/config/editors/Config.in @@ -0,0 +1,123 @@ +# +# For a description of the syntax of this configuration file, +# see scripts/kbuild/config-language.txt. +# + +menu "Editors" + +config BUSYBOX_CONFIG_AWK + bool "awk" + default y + help + Awk is used as a pattern scanning and processing language. This is + the BusyBox implementation of that programming language. + +config BUSYBOX_CONFIG_FEATURE_AWK_MATH + bool " Enable math functions (requires libm)" + default y + depends on BUSYBOX_CONFIG_AWK + help + Enable math functions of the Awk programming language. + NOTE: This will require libm to be present for linking. + +config BUSYBOX_CONFIG_PATCH + bool "patch" + default n + help + Apply a unified diff formatted patch. + +config BUSYBOX_CONFIG_SED + bool "sed" + default y + help + sed is used to perform text transformations on a file + or input from a pipeline. + +config BUSYBOX_CONFIG_VI + bool "vi" + default y + help + 'vi' is a text editor. More specifically, it is the One True + text editor . It does, however, have a rather steep + learning curve. If you are not already comfortable with 'vi' + you may wish to use something else. + +config BUSYBOX_CONFIG_FEATURE_VI_COLON + bool " Enable \":\" colon commands (no \"ex\" mode)" + default y + depends on BUSYBOX_CONFIG_VI + help + Enable a limited set of colon commands for vi. This does not + provide an "ex" mode. + +config BUSYBOX_CONFIG_FEATURE_VI_YANKMARK + bool " Enable yank/put commands and mark cmds" + default y + depends on BUSYBOX_CONFIG_VI + help + This will enable you to use yank and put, as well as mark in + busybox vi. + +config BUSYBOX_CONFIG_FEATURE_VI_SEARCH + bool " Enable search and replace cmds" + default y + depends on BUSYBOX_CONFIG_VI + help + Select this if you wish to be able to do search and replace in + busybox vi. + +config BUSYBOX_CONFIG_FEATURE_VI_USE_SIGNALS + bool " Catch signals" + default y + depends on BUSYBOX_CONFIG_VI + help + Selecting this option will make busybox vi signal aware. This will + make busybox vi support SIGWINCH to deal with Window Changes, catch + Ctrl-Z and Ctrl-C and alarms. + +config BUSYBOX_CONFIG_FEATURE_VI_DOT_CMD + bool " Remember previous cmd and \".\" cmd" + default y + depends on BUSYBOX_CONFIG_VI + help + Make busybox vi remember the last command and be able to repeat it. + +config BUSYBOX_CONFIG_FEATURE_VI_READONLY + bool " Enable -R option and \"view\" mode" + default y + depends on BUSYBOX_CONFIG_VI + help + Enable the read-only command line option, which allows the user to + open a file in read-only mode. + +config BUSYBOX_CONFIG_FEATURE_VI_SETOPTS + bool " Enable set-able options, ai ic showmatch" + default y + depends on BUSYBOX_CONFIG_VI + help + Enable the editor to set some (ai, ic, showmatch) options. + +config BUSYBOX_CONFIG_FEATURE_VI_SET + bool " Support for :set" + default y + depends on BUSYBOX_CONFIG_VI + help + Support for ":set". + +config BUSYBOX_CONFIG_FEATURE_VI_WIN_RESIZE + bool " Handle window resize" + default y + depends on BUSYBOX_CONFIG_VI + help + Make busybox vi behave nicely with terminals that get resized. + +config BUSYBOX_CONFIG_FEATURE_VI_OPTIMIZE_CURSOR + bool " Optimize cursor movement" + default y + depends on BUSYBOX_CONFIG_VI + help + This will make the cursor movement faster, but requires more memory + and it makes the applet a tiny bit larger. + +endmenu + diff --git a/openwrt/package/busybox/config/findutils/Config.in b/openwrt/package/busybox/config/findutils/Config.in new file mode 100644 index 0000000000..fb5a8c05f1 --- /dev/null +++ b/openwrt/package/busybox/config/findutils/Config.in @@ -0,0 +1,133 @@ +# +# For a description of the syntax of this configuration file, +# see scripts/kbuild/config-language.txt. +# + +menu "Finding Utilities" + +config BUSYBOX_CONFIG_FIND + bool "find" + default y + help + find is used to search your system to find specified files. + +config BUSYBOX_CONFIG_FEATURE_FIND_MTIME + bool " Enable modified time matching (-mtime) option" + default n + depends on BUSYBOX_CONFIG_FIND + help + Allow searching based on the modification time of + files. + +config BUSYBOX_CONFIG_FEATURE_FIND_PERM + bool " Enable permissions matching (-perm) option" + default y + depends on BUSYBOX_CONFIG_FIND + help + Enable searching based on file permissions. + +config BUSYBOX_CONFIG_FEATURE_FIND_TYPE + bool " Enable filetype matching (-type) option" + default y + depends on BUSYBOX_CONFIG_FIND + help + Enable searching based on file type (file, + directory, socket, device, etc.). + +config BUSYBOX_CONFIG_FEATURE_FIND_XDEV + bool " Enable stay in filesystem (-xdev) option" + default y + depends on BUSYBOX_CONFIG_FIND + help + This option will allow find to restrict searches to a single + filesystem. + +config BUSYBOX_CONFIG_FEATURE_FIND_NEWER + bool " Enable -newer option for comparing file mtimes" + default n + depends on BUSYBOX_CONFIG_FIND + help + Support the 'find -newer' option for finding any files which have + a modified time that is more recent than the specified FILE. + +config BUSYBOX_CONFIG_FEATURE_FIND_INUM + bool " Enable inode number matching (-inum) option" + default n + depends on BUSYBOX_CONFIG_FIND + help + Support the 'find -inum' option for searching by inode number. + +config BUSYBOX_CONFIG_GREP + bool "grep" + default y + help + grep is used to search files for a specified pattern. + +config BUSYBOX_CONFIG_FEATURE_GREP_EGREP_ALIAS + bool " Support extended regular expressions (egrep & grep -E)" + default y + depends on BUSYBOX_CONFIG_GREP + help + Enabled support for extended regular expressions. Extended + regular expressions allow for alternation (foo|bar), grouping, + and various repetition operators. + +config BUSYBOX_CONFIG_FEATURE_GREP_FGREP_ALIAS + bool " Alias fgrep to grep -f" + default y + depends on BUSYBOX_CONFIG_GREP + help + fgrep sees the search pattern as a normal string rather than + regular expressions. + grep -f is always builtin, this just creates the fgrep alias. + +config BUSYBOX_CONFIG_FEATURE_GREP_CONTEXT + bool " Enable before and after context flags (-A, -B and -C)" + default y + depends on BUSYBOX_CONFIG_GREP + help + Print the specified number of leading (-B) and/or trailing (-A) + context surrounding our matching lines. + Print the specified number of context lines (-C). + +config BUSYBOX_CONFIG_XARGS + bool "xargs" + default y + help + xargs is used to execute a specified command on + every item from standard input. + +config BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION + bool " Enable prompt and confirmation option -p" + default y + depends on BUSYBOX_CONFIG_XARGS + help + Support prompt the user about whether to run each command + line and read a line from the terminal. + +config BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_QUOTES + bool " Enable support single and double quotes and backslash" + default y + depends on BUSYBOX_CONFIG_XARGS + help + Default xargs unsupport single and double quotes + and backslash for can use aruments with spaces. + +config BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT + bool " Enable support options -x" + default y + depends on BUSYBOX_CONFIG_XARGS + help + Enable support exit if the size (see the -s or -n option) + is exceeded. + +config BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM + bool " Enable options -0" + default y + depends on BUSYBOX_CONFIG_XARGS + help + Enable input filenames are terminated by a null character + instead of by whitespace, and the quotes and backslash + are not special. + +endmenu diff --git a/openwrt/package/busybox/config/init/Config.in b/openwrt/package/busybox/config/init/Config.in new file mode 100644 index 0000000000..087d836bf9 --- /dev/null +++ b/openwrt/package/busybox/config/init/Config.in @@ -0,0 +1,72 @@ +# +# For a description of the syntax of this configuration file, +# see scripts/kbuild/config-language.txt. +# + +menu "Init Utilities" + +config BUSYBOX_CONFIG_INIT + bool "init" + default y + help + init is the first program run when the system boots. + +config BUSYBOX_CONFIG_FEATURE_USE_INITTAB + bool " Support reading an inittab file?" + default y + depends on BUSYBOX_CONFIG_INIT + help + Allow init to read an inittab file when the system boot. + +config BUSYBOX_CONFIG_FEATURE_INITRD + bool " Support running init from within an initrd?" + default n + depends on BUSYBOX_CONFIG_INIT + help + Allow init to be called from an initrd as linuxrc. + +config BUSYBOX_CONFIG_FEATURE_INIT_COREDUMPS + bool " Support dumping core for child processes (debugging only)?" + default n + depends on BUSYBOX_CONFIG_INIT + help + If this option is enabled and the file /.init_enable_core + exists, then init will call setrlimit() to allow unlimited + core file sizes. If this option is disabled, processes + will not generate any core files. + +config BUSYBOX_CONFIG_FEATURE_EXTRA_QUIET + bool " Should init be _extra_ quiet on boot?" + default n + depends on BUSYBOX_CONFIG_INIT + help + Prevent init from logging some messages to the console + during boot. + +config BUSYBOX_CONFIG_HALT + bool "halt" + default n + help + Stop all processes and halt the system. + +config BUSYBOX_CONFIG_POWEROFF + bool "poweroff" + default n + help + Stop all processes and (try to) power off the system. + +config BUSYBOX_CONFIG_REBOOT + bool "reboot" + default y + help + Stop all processes and reboot the system. + +config BUSYBOX_CONFIG_MESG + bool "mesg" + default y + help + Mesg controls access to your terminal by others. It is typically + used to allow or disallow other users to write to your terminal + +endmenu + diff --git a/openwrt/package/busybox/config/loginutils/Config.in b/openwrt/package/busybox/config/loginutils/Config.in new file mode 100644 index 0000000000..e42140ac27 --- /dev/null +++ b/openwrt/package/busybox/config/loginutils/Config.in @@ -0,0 +1,161 @@ +# +# For a description of the syntax of this configuration file, +# see scripts/kbuild/config-language.txt. +# + +menu "Login/Password Management Utilities" + +config BUSYBOX_CONFIG_USE_BB_PWD_GRP + bool "Use internal password and group functions rather than system functions" + default n + help + If you leave this disabled, busybox will use the system's password + and group functions. And if you are using the GNU C library + (glibc), you will then need to install the /etc/nsswitch.conf + configuration file and the required /lib/libnss_* libraries in + order for the password and group functions to work. This generally + makes your embedded system quite a bit larger. + + Enabling this option will cause busybox to directly access the + system's /etc/password, /etc/group files (and your system will be + smaller, and I will get fewer emails asking about how glibc NSS + works). When this option is enabled, you will not be able to use + PAM to access remote LDAP password servers and whatnot. And if you + want hostname resolution to work with glibc, you still need the + /lib/libnss_* libraries. + + If you enable this option, it will add about 1.5k to busybox. + + +config BUSYBOX_CONFIG_ADDGROUP + bool "addgroup" + default n + help + Utility for creating a new group account. + +config BUSYBOX_CONFIG_DELGROUP + bool "delgroup" + default n + help + Utility for deleting a group account. + +config BUSYBOX_CONFIG_ADDUSER + bool "adduser" + default n + help + Utility for creating a new user account. + +config BUSYBOX_CONFIG_DELUSER + bool "deluser" + default n + help + Utility for deleting a user account. + +config BUSYBOX_CONFIG_GETTY + bool "getty" + default n + help + getty lets you log in on a tty, it is normally invoked by init. + +config BUSYBOX_CONFIG_FEATURE_U_W_TMP + bool " Support utmp and wtmp files" + depends on BUSYBOX_CONFIG_GETTY || BUSYBOX_CONFIG_LOGIN || BUSYBOX_CONFIG_SU || BUSYBOX_CONFIG_WHO || BUSYBOX_CONFIG_LAST + default n + help + The files /var/run/utmp and /var/run/wtmp can be used to track when + user's have logged into and logged out of the system, allowing programs + such as 'who' and 'last' to list who is currently logged in. + +config BUSYBOX_CONFIG_LOGIN + bool "login" + default n + select BUSYBOX_CONFIG_FEATURE_SUID + help + login is used when signing onto a system. + + Note that Busybox binary must be setuid root for this applet to + work properly. + +config BUSYBOX_CONFIG_FEATURE_SECURETTY + bool " Support for /etc/securetty" + default n + depends on BUSYBOX_CONFIG_LOGIN + help + The file /etc/securetty is used by (some versions of) login(1). + The file contains the device names of tty lines (one per line, + without leading /dev/) on which root is allowed to login. + +config BUSYBOX_CONFIG_PASSWD + bool "passwd" + default n + select BUSYBOX_CONFIG_FEATURE_SUID + help + passwd changes passwords for user and group accounts. A normal user + may only change the password for his/her own account, the super user + may change the password for any account. The administrator of a group + may change the password for the group. + + Note that Busybox binary must be setuid root for this applet to + work properly. + +config BUSYBOX_CONFIG_SU + bool "su" + default n + select BUSYBOX_CONFIG_FEATURE_SUID + help + su is used to become another user during a login session. + Invoked without a username, su defaults to becoming the super user. + + Note that Busybox binary must be setuid root for this applet to + work properly. + +config BUSYBOX_CONFIG_SULOGIN + bool "sulogin" + default n + help + sulogin is invoked when the system goes into single user + mode (this is done through an entry in inittab). + +config BUSYBOX_CONFIG_VLOCK + bool "vlock" + default n + select BUSYBOX_CONFIG_FEATURE_SUID + help + Build the "vlock" applet which allows you to lock (virtual) terminals. + + Note that Busybox binary must be setuid root for this applet to + work properly. + +comment "Common options for adduser, deluser, login, su" + depends on BUSYBOX_CONFIG_ADDUSER || BUSYBOX_CONFIG_DELUSER || BUSYBOX_CONFIG_LOGIN || BUSYBOX_CONFIG_SU + +config BUSYBOX_CONFIG_FEATURE_SHADOWPASSWDS + bool "Support for shadow passwords" + default n + depends on BUSYBOX_CONFIG_ADDUSER || BUSYBOX_CONFIG_DELUSER || BUSYBOX_CONFIG_LOGIN || BUSYBOX_CONFIG_SU + help + Build support for shadow password in /etc/shadow. This file is only + readable by root and thus the encrypted passwords are no longer + publicly readable. + +config BUSYBOX_CONFIG_USE_BB_SHADOW + bool " Use busybox shadow password functions" + default n + depends on BUSYBOX_CONFIG_USE_BB_PWD_GRP && BUSYBOX_CONFIG_FEATURE_SHADOWPASSWDS + help + If you leave this disabled, busybox will use the system's shadow + password handling functions. And if you are using the GNU C library + (glibc), you will then need to install the /etc/nsswitch.conf + configuration file and the required /lib/libnss_* libraries in + order for the shadow password functions to work. This generally + makes your embedded system quite a bit larger. + + Enabling this option will cause busybox to directly access the + system's /etc/shadow file when handling shadow passwords. This + makes your system smaller and I will get fewer emails asking about + how glibc NSS works). When this option is enabled, you will not be + able to use PAM to access shadow passwords from remote LDAP + password servers and whatnot. + +endmenu + diff --git a/openwrt/package/busybox/config/miscutils/Config.in b/openwrt/package/busybox/config/miscutils/Config.in new file mode 100644 index 0000000000..072993b28d --- /dev/null +++ b/openwrt/package/busybox/config/miscutils/Config.in @@ -0,0 +1,201 @@ +# +# For a description of the syntax of this configuration file, +# see scripts/kbuild/config-language.txt. +# + +menu "Miscellaneous Utilities" + +config BUSYBOX_CONFIG_ADJTIMEX + bool "adjtimex" + default n + help + Adjtimex reads and optionally sets adjustment parameters for + the Linux clock adjustment algorithm. + +config BUSYBOX_CONFIG_CROND + bool "crond" + default y + select BUSYBOX_CONFIG_FEATURE_SUID + help + Crond is a background daemon that parses individual crontab + files and executes commands on behalf of the users in question. + This is a port of dcron from slackware. It uses files of the + format /var/spool/cron/crontabs/ files, for example: + $ cat /var/spool/cron/crontabs/root + # Run daily cron jobs at 4:40 every day: + 40 4 * * * /etc/cron/daily > /dev/null 2>&1 + Note that Busybox binary must be setuid root for this applet to + work properly. + +config BUSYBOX_CONFIG_FEATURE_CROND_CALL_SENDMAIL + bool " Using /usr/sbin/sendmail?" + default n + depends on BUSYBOX_CONFIG_CROND + help + Support calling /usr/sbin/sendmail for send cmd outputs. + +config BUSYBOX_CONFIG_CRONTAB + bool "crontab" + default y + help + Crontab manipulates the crontab for a particular user. Only + the superuser may specify a different user and/or crontab directory. + +config BUSYBOX_CONFIG_DC + bool "dc" + default n + help + Dc is a reverse-polish desk calculator which supports unlimited + precision arithmetic. + +config BUSYBOX_CONFIG_DEVFSD + bool "devfsd" + default n + help + Provides compatibility with old device names on a devfs systems. + You should set it to true if you have devfs enabled. + The following keywords in devsfd.conf are supported: + "CLEAR_CONFIG", "INCLUDE", "OPTIONAL_INCLUDE", "RESTORE", + "PERMISSIONS", "EXECUTE", "COPY", "IGNORE", + "MKOLDCOMPAT", "MKNEWCOMPAT","RMOLDCOMPAT", "RMNEWCOMPAT". + + But only if they are written UPPERCASE!!!!!!!! + +config BUSYBOX_CONFIG_DEVFSD_MODLOAD + bool "Adds support for MODLOAD keyword in devsfd.conf" + default n + depends on BUSYBOX_CONFIG_DEVFSD + help + This actually doesn't work with busybox modutils but needs the real modutils. + +config BUSYBOX_CONFIG_DEVFSD_FG_NP + bool "Enables the -fg and -np options" + default n + depends on BUSYBOX_CONFIG_DEVFSD + help + -fg Run the daemon in the foreground. + -np Exit after parsing the configuration file. Do not poll for events. + +config BUSYBOX_CONFIG_DEVFSD_VERBOSE + bool "Increases logging (and size)" + default n + depends on BUSYBOX_CONFIG_DEVFSD + help + Increases logging to stderr or syslog. + +config BUSYBOX_CONFIG_LAST + bool "last" + default n + select BUSYBOX_CONFIG_FEATURE_U_W_TMP + help + 'last' displays a list of the last users that logged into the system. + +config BUSYBOX_CONFIG_HDPARM + bool "hdparm" + default n + help + Get/Set hard drive parameters. Primarily intended for ATA + drives. Adds about 13k (or around 30k if you enable the + BUSYBOX_CONFIG_FEATURE_HDPARM_GET_IDENTITY option).... + +config BUSYBOX_CONFIG_FEATURE_HDPARM_GET_IDENTITY + bool " Support obtaining detailed information directly from drives" + default n + depends on BUSYBOX_CONFIG_HDPARM + help + Enables the -I and -Istdin options to obtain detailed information + directly from drives about their capabilities and supported ATA + feature set. Enabling this option will add about 16k... + +config BUSYBOX_CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF + bool " Register an IDE interface (DANGEROUS)" + default n + depends on BUSYBOX_CONFIG_HDPARM + help + Enables the 'hdparm -R' option to register an IDE interface. + This is dangerous stuff, so you should probably say N. + +config BUSYBOX_CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF + bool " Un-register an IDE interface (DANGEROUS)" + default n + depends on BUSYBOX_CONFIG_HDPARM + help + Enables the 'hdparm -U' option to un-register an IDE interface. + This is dangerous stuff, so you should probably say N. + +config BUSYBOX_CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET + bool " perform device reset (DANGEROUS)" + default n + depends on BUSYBOX_CONFIG_HDPARM + help + Enables the 'hdparm -w' option to perform a device reset. + This is dangerous stuff, so you should probably say N. + +config BUSYBOX_CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF + bool " tristate device for hotswap (DANGEROUS)" + default n + depends on BUSYBOX_CONFIG_HDPARM + help + Enables the 'hdparm -x' option to tristate device for hotswap, + and the '-b' option to get/set bus state. This is dangerous + stuff, so you should probably say N. + +config BUSYBOX_CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA + bool " get/set using_dma flag (DANGEROUS)" + default n + depends on BUSYBOX_CONFIG_HDPARM + help + Enables the 'hdparm -d' option to get/set using_dma flag. + This is dangerous stuff, so you should probably say N. + +config BUSYBOX_CONFIG_MAKEDEVS + bool "makedevs" + default n + help + 'makedevs' is a utility used and created by the Linux Router Project. + It creates a large number of device special files (/dev devices) + rather quickly, and can be considerably faster then running mknod a + zillion times. + +config BUSYBOX_CONFIG_MT + bool "mt" + default n + help + mt is used to control tape devices. You can use the mt utility + to advance or rewind a tape past a specified number of archive + files on the tape. + +config BUSYBOX_CONFIG_RX + bool "rx" + default n + help + Receive files using the Xmodem protocol. + +config BUSYBOX_CONFIG_STRINGS + bool "strings" + default y + help + strings prints the printable character sequences for each file + specified. + +config BUSYBOX_CONFIG_TIME + bool "time" + default y + help + The time command runs the specified program with the given arguments. + When the command finishes, time writes a message to standard output + giving timing statistics about this program run. + +config BUSYBOX_CONFIG_WATCHDOG + bool "watchdog" + default n + help + The watchdog utility is used with hardware or software watchdog + device drivers. It opens the specified watchdog device special file + and periodically writes a magic character to the device. If the + watchdog applet ever fails to write the magic character within a + certain amount of time, the watchdog device assumes the system has + hung, and will cause the hardware to reboot. + +endmenu + diff --git a/openwrt/package/busybox/config/modutils/Config.in b/openwrt/package/busybox/config/modutils/Config.in new file mode 100644 index 0000000000..536236b7c3 --- /dev/null +++ b/openwrt/package/busybox/config/modutils/Config.in @@ -0,0 +1,113 @@ +# +# For a description of the syntax of this configuration file, +# see scripts/kbuild/config-language.txt. +# + +menu "Linux Module Utilities" + +config BUSYBOX_CONFIG_INSMOD + bool "insmod" + default y + help + insmod is used to load specified modules in the running kernel. + +config BUSYBOX_CONFIG_FEATURE_2_4_MODULES + bool " Support version 2.2.x to 2.4.x Linux kernels" + default y + depends on BUSYBOX_CONFIG_INSMOD + help + Support module loading for 2.2.x and 2.4.x Linux kernels. + +config BUSYBOX_CONFIG_FEATURE_2_6_MODULES + bool " Support version 2.6.x Linux kernels" + default n + depends on BUSYBOX_CONFIG_INSMOD + help + Support module loading for newer 2.6.x Linux kernels. + +config BUSYBOX_CONFIG_FEATURE_INSMOD_VERSION_CHECKING + bool " Module version checking" + default n + depends on BUSYBOX_CONFIG_INSMOD && BUSYBOX_CONFIG_FEATURE_2_4_MODULES + help + Support checking of versions for modules. This is used to + ensure that the kernel and module are made for each other. + +config BUSYBOX_CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS + bool " Add module symbols to kernel symbol table" + default n + depends on BUSYBOX_CONFIG_INSMOD && BUSYBOX_CONFIG_FEATURE_2_4_MODULES + help + By adding module symbols to the kernel symbol table, Oops messages + occuring within kernel modules can be properly debugged. By enabling + this feature, module symbols will always be added to the kernel symbol + table for properly debugging support. If you are not interested in + Oops messages from kernel modules, say N. + +config BUSYBOX_CONFIG_FEATURE_INSMOD_LOADINKMEM + bool " In kernel memory optimization (uClinux only)" + default n + depends on BUSYBOX_CONFIG_INSMOD && BUSYBOX_CONFIG_FEATURE_2_4_MODULES + help + This is a special uClinux only memory optimization that lets insmod + load the specified kernel module directly into kernel space, reducing + memory usage by preventing the need for two copies of the module + being loaded into memory. + +config BUSYBOX_CONFIG_FEATURE_INSMOD_LOAD_MAP + bool " Enable load map (-m) option" + default n + depends on BUSYBOX_CONFIG_INSMOD && BUSYBOX_CONFIG_FEATURE_2_4_MODULES + help + Enabling this, one would be able to get a load map + output on stdout. This makes kernel module debugging + easier. + If you don't plan to debug kernel modules, you + don't need this option. + +config BUSYBOX_CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL + bool " Symbols in load map" + default n + depends on BUSYBOX_CONFIG_FEATURE_INSMOD_LOAD_MAP + help + Without this option, -m will only output section + load map. With this option, -m will also output + symbols load map. + +config BUSYBOX_CONFIG_LSMOD + bool "lsmod" + default y + help + lsmod is used to display a list of loaded modules. + +config BUSYBOX_CONFIG_FEATURE_QUERY_MODULE_INTERFACE + bool + default y + depends on BUSYBOX_CONFIG_FEATURE_2_4_MODULES && !CONFIG_FEATURE_2_6_MODULES + +config BUSYBOX_CONFIG_MODPROBE + bool "modprobe" + default n + help + Handle the loading of modules, and their dependancies on a high + level. + +config BUSYBOX_CONFIG_RMMOD + bool "rmmod" + default y + help + rmmod is used to unload specified modules from the kernel. + +config BUSYBOX_CONFIG_FEATURE_CHECK_TAINTED_MODULE + bool "Support tainted module checking with new kernels" + default n + depends on BUSYBOX_CONFIG_INSMOD || BUSYBOX_CONFIG_LSMOD + help + Support checking for tainted modules. These are usually binary + only modules that will make the linux-kernel list ignore your + support request. + This option is required to support GPLONLY modules. + + +endmenu + diff --git a/openwrt/package/busybox/config/networking/Config.in b/openwrt/package/busybox/config/networking/Config.in new file mode 100644 index 0000000000..5af65ef4aa --- /dev/null +++ b/openwrt/package/busybox/config/networking/Config.in @@ -0,0 +1,634 @@ +# +# For a description of the syntax of this configuration file, +# see scripts/kbuild/config-language.txt. +# + +menu "Networking Utilities" + +config BUSYBOX_CONFIG_FEATURE_IPV6 + bool "Enable IPv6 support" + default y + help + Enable IPv6 support to busybox. This makes applets that talk IP + able to work with IPv6. + +config BUSYBOX_CONFIG_ARPING + bool "arping" + default y + help + Ping hosts by ARP packets + +config BUSYBOX_CONFIG_FTPGET + bool "ftpget" + default n + help + Retrieve a remote file via FTP. + +config BUSYBOX_CONFIG_FTPPUT + bool "ftpput" + default n + help + Store a remote file via FTP. + +config BUSYBOX_CONFIG_HOSTNAME + bool "hostname" + default n + help + Show or set the system's host name + +config BUSYBOX_CONFIG_HTTPD + bool "httpd" + default y + help + Serve web pages via an HTTP server. + +config BUSYBOX_CONFIG_FEATURE_HTTPD_USAGE_FROM_INETD_ONLY + bool " Support using httpd only from inetd" + default n + depends on BUSYBOX_CONFIG_HTTPD + help + This option disables uid and port options for the httpd applet + but requires inetd server daemon. + +config BUSYBOX_CONFIG_FEATURE_HTTPD_BASIC_AUTH + bool " Enable Basic http Authentication" + default y + depends on BUSYBOX_CONFIG_HTTPD + help + Utilizes password settings from /etc/httpd.conf for basic + authentication on a per url basis. + +config BUSYBOX_CONFIG_FEATURE_HTTPD_AUTH_MD5 + bool " Support MD5 crypted passwords for http Authentication" + default y + depends on BUSYBOX_CONFIG_FEATURE_HTTPD_BASIC_AUTH + help + Enables basic per url authentication from /etc/httpd.conf + using md5 passwords. + + +if !CONFIG_FEATURE_HTTPD_USAGE_FROM_INETD_ONLY +config BUSYBOX_CONFIG_FEATURE_HTTPD_RELOAD_CONFIG_SIGHUP + bool " Support reloading the global config file using hup signal" + default y + depends on BUSYBOX_CONFIG_HTTPD + help + This option enables processing of SIGHUP to reload cached + configuration settings. + +config BUSYBOX_CONFIG_FEATURE_HTTPD_SETUID + bool " Enable support -u option" + default n + depends on BUSYBOX_CONFIG_HTTPD + help + This option allows the server to run as a specific user + rather than defaulting to the user that starts the server. + Use of this option requires special privileges to change to a + different user. +endif + +config BUSYBOX_CONFIG_FEATURE_HTTPD_CONFIG_WITH_MIME_TYPES + bool " Support loading additional MIME types at run-time" + default y + depends on BUSYBOX_CONFIG_HTTPD + help + This option enables support for additional MIME types at + run-time to be specified in the configuration file. + +config BUSYBOX_CONFIG_FEATURE_HTTPD_CGI + bool " Support Common Gateway Interface (CGI)" + default y + depends on BUSYBOX_CONFIG_HTTPD + help + This option allows scripts and executables to be invoked + when specific urls are requested. + +config BUSYBOX_CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV + bool " Support the REMOTE_PORT environment variable for CGI" + default y + depends on BUSYBOX_CONFIG_FEATURE_HTTPD_CGI + help + Use of this option can assist scripts in generating + references that contain a unique port number. + +config BUSYBOX_CONFIG_FEATURE_HTTPD_ENCODE_URL_STR + bool " Enable the -e option for shell script CGI simplification." + default y + depends on BUSYBOX_CONFIG_HTTPD + help + After set, this option allows html encoding arbitrary + strings for display of the browser. Output goes to stdout. + For example, httpd -e "" as + "<Hello World>". + +config BUSYBOX_CONFIG_IFCONFIG + bool "ifconfig" + default y + help + Ifconfig is used to configure the kernel-resident network interfaces. + +config BUSYBOX_CONFIG_FEATURE_IFCONFIG_STATUS + bool " Enable status reporting output (+7k)" + default y + depends on BUSYBOX_CONFIG_IFCONFIG + help + If ifconfig is called with no arguments it will display the status + of the currently active interfaces. + +config BUSYBOX_CONFIG_FEATURE_IFCONFIG_SLIP + bool " Enable slip-specific options \"keepalive\" and \"outfill\"" + default n + depends on BUSYBOX_CONFIG_IFCONFIG + help + Allow "keepalive" and "outfill" support for SLIP. If you're not + planning on using serial lines, leave this unchecked. + +config BUSYBOX_CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ + bool " Enable options \"mem_start\", \"io_addr\", and \"irq\"" + default n + depends on BUSYBOX_CONFIG_IFCONFIG + help + Allow the start address for shared memory, start address for I/O, + and/or the interrupt line used by the specified device. + +config BUSYBOX_CONFIG_FEATURE_IFCONFIG_HW + bool " Enable option \"hw\" (ether only)" + default y + depends on BUSYBOX_CONFIG_IFCONFIG + help + Set the hardware address of this interface, if the device driver + supports this operation. Currently, we only support the 'ether' + class. + +config BUSYBOX_CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS + bool " Set the broadcast automatically" + default y + depends on BUSYBOX_CONFIG_IFCONFIG + help + Setting this will make ifconfig attempt to find the broadcast + automatically if the value '+' is used. + +config BUSYBOX_CONFIG_IFUPDOWN + bool "ifupdown" + default n + help + Activate or deactivate the specified interfaces. This applet makes + use of either "ifconfig" and "route" or the "ip" command to actually + configure network interfaces. Therefore, you will probably also want + to enable either BUSYBOX_CONFIG_IFCONFIG and BUSYBOX_CONFIG_ROUTE, or enable + BUSYBOX_CONFIG_FEATURE_IFUPDOWN_IP and the various BUSYBOX_CONFIG_IP options. Of + course you could use non-busybox versions of these programs, so + against my better judgement (since this will surely result in plenty + of support questions on the mailing list), I do not force you to + enable these additional options. It is up to you to supply either + "ifconfig" and "route" or the "ip" command, either via busybox or via + standalone utilities. + +config BUSYBOX_CONFIG_FEATURE_IFUPDOWN_IP + bool " Use ip applet" + default n + depends on BUSYBOX_CONFIG_IFUPDOWN + help + Use the iproute "ip" command to implement "ifup" and "ifdown", rather + than the default of using the older 'ifconfig' and 'route' utilities. + +config BUSYBOX_CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN + bool " Use busybox ip applet" + default n + depends on BUSYBOX_CONFIG_FEATURE_IFUPDOWN_IP + select BUSYBOX_CONFIG_IP + select BUSYBOX_CONFIG_FEATURE_IP_ADDRESS + select BUSYBOX_CONFIG_FEATURE_IP_LINK + select BUSYBOX_CONFIG_FEATURE_IP_ROUTE + help + Use the busybox iproute "ip" applet to implement "ifupdown". + + If leave this disabled, you must install the full-blown iproute2 + utility or the "ifup" and "ifdown" applets will not work. + +config BUSYBOX_CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN + bool " Use busybox ifconfig and route applets" + default n + depends on BUSYBOX_CONFIG_IFUPDOWN && !CONFIG_FEATURE_IFUPDOWN_IP + select BUSYBOX_CONFIG_IFCONFIG + select BUSYBOX_CONFIG_ROUTE + help + Use the busybox iproute "ifconfig" and "route" applets to + implement the "ifup" and "ifdown" utilities. + + If leave this disabled, you must install the full-blown ifconfig + and route utilities, or the "ifup" and "ifdown" applets will not + work. + +config BUSYBOX_CONFIG_FEATURE_IFUPDOWN_IPV4 + bool " Enable support for IPv4" + default n + depends on BUSYBOX_CONFIG_IFUPDOWN + help + If you want busybox to talk IPv4, leave this on. + +config BUSYBOX_CONFIG_FEATURE_IFUPDOWN_IPV6 + bool " Enable support for IPv6" + default n + depends on BUSYBOX_CONFIG_IFUPDOWN + help + If you need support for IPv6, turn this option on. + +config BUSYBOX_CONFIG_FEATURE_IFUPDOWN_IPX + bool " Enable support for IPX" + default n + depends on BUSYBOX_CONFIG_IFUPDOWN + help + If this option is selected you can use busybox to work with IPX + networks. + +config BUSYBOX_CONFIG_FEATURE_IFUPDOWN_MAPPING + bool " Enable mapping support" + default n + depends on BUSYBOX_CONFIG_IFUPDOWN + help + This enables support for the "mapping" stanza, unless you have + a weird network setup you don't need it. + +config BUSYBOX_CONFIG_INETD + bool "inetd" + default n + help + Internet superserver daemon + +config BUSYBOX_CONFIG_FEATURE_INETD_SUPPORT_BILTIN_ECHO + bool " Support echo service" + default n + depends on BUSYBOX_CONFIG_INETD + help + Echo received data internal inetd service + +config BUSYBOX_CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DISCARD + bool " Support discard service" + default n + depends on BUSYBOX_CONFIG_INETD + help + Internet /dev/null internal inetd service + +config BUSYBOX_CONFIG_FEATURE_INETD_SUPPORT_BILTIN_TIME + bool " Support time service" + default n + depends on BUSYBOX_CONFIG_INETD + help + Return 32 bit time since 1900 internal inetd service + +config BUSYBOX_CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DAYTIME + bool " Support daytime service" + default n + depends on BUSYBOX_CONFIG_INETD + help + Return human-readable time internal inetd service + +config BUSYBOX_CONFIG_FEATURE_INETD_SUPPORT_BILTIN_CHARGEN + bool " Support chargen service" + default n + depends on BUSYBOX_CONFIG_INETD + help + Familiar character generator internal inetd service + + +config BUSYBOX_CONFIG_IP + bool "ip" + default n + help + The "ip" applet is a TCP/IP interface configuration and routing + utility. You generally don't need "ip" to use busybox with + TCP/IP. + +if BUSYBOX_CONFIG_IP && BUSYBOX_CONFIG_IPADDR + config BUSYBOX_CONFIG_FEATURE_IP_ADDRESS + default n + comment " address (forced enabled for ipaddr)" +endif +if ! (CONFIG_IP && BUSYBOX_CONFIG_IPADDR) + config BUSYBOX_CONFIG_FEATURE_IP_ADDRESS + bool " address" + default n + depends on BUSYBOX_CONFIG_IP + help + Address manipulation support for the "ip" applet. +endif + +if BUSYBOX_CONFIG_IP && BUSYBOX_CONFIG_IPLINK + config BUSYBOX_CONFIG_FEATURE_IP_LINK + default n + comment " link (forced enabled for iplink)" +endif +if !(CONFIG_IP && BUSYBOX_CONFIG_IPLINK) + config BUSYBOX_CONFIG_FEATURE_IP_LINK + bool " link" + default n + depends on BUSYBOX_CONFIG_IP + help + Configure network devices with "ip". +endif + +if BUSYBOX_CONFIG_IP && BUSYBOX_CONFIG_IPROUTE + config BUSYBOX_CONFIG_FEATURE_IP_ROUTE + default n + comment " route (forced enabled for iproute)" +endif +if !(CONFIG_IP && BUSYBOX_CONFIG_IPROUTE) + config BUSYBOX_CONFIG_FEATURE_IP_ROUTE + bool " route" + default n + depends on BUSYBOX_CONFIG_IP + help + Add support for routing table management to "ip". +endif + +if BUSYBOX_CONFIG_IP && BUSYBOX_CONFIG_IPTUNNEL + config BUSYBOX_CONFIG_FEATURE_IP_TUNNEL + default n + comment " tunnel (forced enabled for iptunnel)" +endif +if !(CONFIG_IP && BUSYBOX_CONFIG_IPTUNNEL) + config BUSYBOX_CONFIG_FEATURE_IP_TUNNEL + bool " tunnel" + default n + depends on BUSYBOX_CONFIG_IP + help + Add support for tunneling commands to "ip". +endif + +config BUSYBOX_CONFIG_IPCALC + bool "ipcalc" + default y + help + ipcalc takes an IP address and netmask and calculates the + resulting broadcast, network, and host range. + +config BUSYBOX_CONFIG_FEATURE_IPCALC_FANCY + bool " Fancy IPCALC, more options, adds 1 kbyte" + default y + depends on BUSYBOX_CONFIG_IPCALC + help + Adds the options hostname, prefix and silent to the output of "ipcalc". + +config BUSYBOX_CONFIG_IPADDR + bool "ipaddr" + default n + help + Equivalent to selecting address support to "ip", above. + +config BUSYBOX_CONFIG_IPLINK + bool "iplink" + default n + help + Equivalent to selecting link support to "ip", above. + +config BUSYBOX_CONFIG_IPROUTE + bool "iproute" + default n + help + Equivalent to selecting route support to "ip", above. + +config BUSYBOX_CONFIG_IPTUNNEL + bool "iptunnel" + default n + help + Equivalent to selecting tunnel support to "ip", above. + +config BUSYBOX_CONFIG_NAMEIF + bool "nameif" + default n + help + nameif is used to rename network interface by its MAC address. + Renamed interfaces MUST be in the down state. + It is possible to use a file (default: /etc/mactab) + with list of new interface names and MACs. + Maximum interface name length: IF_NAMESIZE = 16 + File fields are separated by space or tab. + File format: + # Comment + new_interface_name XX:XX:XX:XX:XX:XX + +config BUSYBOX_CONFIG_NC + bool "nc" + default y + help + A simple Unix utility which reads and writes data across network + connections. + +config BUSYBOX_CONFIG_NETSTAT + bool "netstat" + default y + help + netstat prints information about the Linux networking subsystem. + +config BUSYBOX_CONFIG_NSLOOKUP + bool "nslookup" + default y + help + nslookup is a tool to query Internet name servers. + +config BUSYBOX_CONFIG_PING + bool "ping" + default y + help + ping uses the ICMP protocol's mandatory ECHO_REQUEST datagram to + elicit an ICMP ECHO_RESPONSE from a host or gateway. + +config BUSYBOX_CONFIG_FEATURE_FANCY_PING + bool " Enable fancy ping output" + default y + depends on BUSYBOX_CONFIG_PING + help + Make the output from the ping applet include statistics, and at the + same time provide full support for ICMP packets. + +config BUSYBOX_CONFIG_PING6 + bool "ping6" + default y + depends on BUSYBOX_CONFIG_FEATURE_IPV6 + help + This will give you a ping that can talk IPv6. + +config BUSYBOX_CONFIG_FEATURE_FANCY_PING6 + bool " Enable fancy ping6 output" + default y + depends on BUSYBOX_CONFIG_PING6 + help + Make the output from the ping6 applet include statistics, and at the + same time provide full support for ICMP packets. + +config BUSYBOX_CONFIG_ROUTE + bool "route" + default y + help + Route displays or manipulates the kernel's IP routing tables. + +config BUSYBOX_CONFIG_TELNET + bool "telnet" + default n + help + Telnet is an interface to the TELNET protocol, but is also commonly + used to test other simple protocols. + +config BUSYBOX_CONFIG_FEATURE_TELNET_TTYPE + bool " Pass TERM type to remote host" + default n + depends on BUSYBOX_CONFIG_TELNET + help + Setting this option will forward the TERM environment variable to the + remote host you are connecting to. This is useful to make sure that + things like ANSI colors and other control sequences behave. + +config BUSYBOX_CONFIG_FEATURE_TELNET_AUTOLOGIN + bool " Pass USER type to remote host" + default n + depends on BUSYBOX_CONFIG_TELNET + help + Setting this option will forward the USER environment variable to the + remote host you are connecting to. This is useful when you need to + log into a machine without telling the username (autologin). This + option enables `-a' and `-l USER' arguments. + +config BUSYBOX_CONFIG_TELNETD + bool "telnetd" + default y + #select BUSYBOX_CONFIG_LOGIN + help + A daemon for the TELNET protocol, allowing you to log onto the host + running the daemon. Please keep in mind that the TELNET protocol + sends passwords in plain text. If you can't afford the space for an + SSH daemon and you trust your network, you may say 'y' here. As a + more secure alternative, you should seriously consider installing the + very small Dropbear SSH daemon instead: + http://matt.ucc.asn.au/dropbear/dropbear.html + + Note that for busybox telnetd to work you need several things: + First of all, your kernel needs: + BUSYBOX_CONFIG_UNIX98_PTYS=y + BUSYBOX_CONFIG_DEVPTS_FS=y + + Next, you need a /dev/pts directory on your root filesystem: + + $ ls -ld /dev/pts + drwxr-xr-x 2 root root 0 Sep 23 13:21 /dev/pts/ + + Next you need the pseudo terminal master multiplexer /dev/ptmx: + + $ ls -la /dev/ptmx + crw-rw-rw- 1 root tty 5, 2 Sep 23 13:55 /dev/ptmx + + Any /dev/ttyp[0-9]* files you may have can be removed. + Next, you need to mount the devpts filesystem on /dev/pts using: + + mount -t devpts devpts /dev/pts + + You need to be sure that Busybox has BUSYBOX_CONFIG_LOGIN and + BUSYBOX_CONFIG_FEATURE_SUID enabled. And finally, you should make + certain that Busybox has been installed setuid root: + + chown root.root /bin/busybox + chmod 4755 /bin/busybox + + with all that done, telnetd _should_ work.... + + +config BUSYBOX_CONFIG_FEATURE_TELNETD_INETD + bool " Support call from inetd only" + default n + depends on BUSYBOX_CONFIG_TELNETD + help + Selecting this will make telnetd only callable from inetd, + removing the standalone support. + +config BUSYBOX_CONFIG_TFTP + bool "tftp" + default n + help + This enables the Trivial File Transfer Protocol client program. TFTP + is usually used for simple, small transfers such as a root image + for a network-enabled bootloader. + +config BUSYBOX_CONFIG_FEATURE_TFTP_GET + bool " Enable \"get\" command" + default n + depends on BUSYBOX_CONFIG_TFTP + help + Add support for the GET command within the TFTP client. This allows + a client to retrieve a file from a TFTP server. + +config BUSYBOX_CONFIG_FEATURE_TFTP_PUT + bool " Enable \"put\" command" + default n + depends on BUSYBOX_CONFIG_TFTP + help + Add support for the PUT command within the TFTP client. This allows + a client to transfer a file to a TFTP server. + +config BUSYBOX_CONFIG_FEATURE_TFTP_BLOCKSIZE + bool " Enable \"blocksize\" command" + default n + depends on BUSYBOX_CONFIG_TFTP + help + Allow the client to specify the desired block size for transfers. + +config BUSYBOX_CONFIG_FEATURE_TFTP_DEBUG + bool " Enable debug" + default n + depends on BUSYBOX_CONFIG_TFTP + help + Enable debug settings for tftp. This is useful if you're running + into problems with tftp as the protocol doesn't help you much when + you run into problems. + +config BUSYBOX_CONFIG_TRACEROUTE + bool "traceroute" + default y + help + Utility to trace the route of IP packets + +config BUSYBOX_CONFIG_FEATURE_TRACEROUTE_VERBOSE + bool " Enable verbose output" + default y + depends on BUSYBOX_CONFIG_TRACEROUTE + help + Add some verbosity to traceroute. This includes amongst other things + hostnames and ICMP response types. + +config BUSYBOX_CONFIG_VCONFIG + bool "vconfig" + default y + help + Creates, removes, and configures VLAN interfaces + +config BUSYBOX_CONFIG_WGET + bool "wget" + default y + help + wget is a utility for non-interactive download of files from HTTP, + HTTPS, and FTP servers. + +config BUSYBOX_CONFIG_FEATURE_WGET_STATUSBAR + bool " Enable a nifty process meter (+2k)" + default y + depends on BUSYBOX_CONFIG_WGET + help + Enable the transfer progress bar for wget transfers. + +config BUSYBOX_CONFIG_FEATURE_WGET_AUTHENTICATION + bool " Enable HTTP authentication" + default y + depends on BUSYBOX_CONFIG_WGET + help + Support authenticated HTTP transfers. + +config BUSYBOX_CONFIG_FEATURE_WGET_IP6_LITERAL + bool " Enable IPv6 literal addresses" + default y + depends on BUSYBOX_CONFIG_WGET + help + Support IPv6 address literal notation in URLs. + +source package/busybox/config/networking/udhcp/Config.in + +endmenu + diff --git a/openwrt/package/busybox/config/networking/udhcp/Config.in b/openwrt/package/busybox/config/networking/udhcp/Config.in new file mode 100644 index 0000000000..d15128ce3f --- /dev/null +++ b/openwrt/package/busybox/config/networking/udhcp/Config.in @@ -0,0 +1,62 @@ +# +# For a description of the syntax of this configuration file, +# see scripts/kbuild/config-language.txt. +# + +menu "udhcp Server/Client" + +config BUSYBOX_CONFIG_UDHCPD + bool "udhcp Server (udhcpd)" + default n + help + uDHCPd is a DHCP server geared primarily toward embedded systems, + while striving to be fully functional and RFC compliant. + + See http://udhcp.busybox.net for further details. + +config BUSYBOX_CONFIG_UDHCPC + bool "udhcp Client (udhcpc)" + default y + help + uDHCPc is a DHCP client geared primarily toward embedded systems, + while striving to be fully functional and RFC compliant. + + The udhcp client negotiates a lease with the DHCP server and + notifies a set of scripts when a lease is obtained or lost. + + See http://udhcp.busybox.net for further details. + +config BUSYBOX_CONFIG_DUMPLEASES + bool "Lease display utility (dumpleases)" + default n + depends on BUSYBOX_CONFIG_UDHCPD + help + dumpleases displays the leases written out by the udhcpd server. + Lease times are stored in the file by time remaining in lease, or + by the absolute time that it expires in seconds from epoch. + + See http://udhcp.busybox.net for further details. + +config BUSYBOX_CONFIG_FEATURE_UDHCP_SYSLOG + bool " Log udhcp messages to syslog (instead of stdout)" + default n + depends on BUSYBOX_CONFIG_UDHCPD || BUSYBOX_CONFIG_UDHCPC + help + If selected, udhcpd will log all its messages to syslog, otherwise, + it will attempt to log them to stdout. + + See http://udhcp.busybox.net for further details. + +config BUSYBOX_CONFIG_FEATURE_UDHCP_DEBUG + bool " Compile udhcp with noisy debugging messages" + default n + depends on BUSYBOX_CONFIG_UDHCPD || BUSYBOX_CONFIG_UDHCPC + help + If selected, udhcpd will output extra debugging output. If using + this option, compile uDHCP with "-g", and do not fork the daemon to + the background. + + See http://udhcp.busybox.net for further details. + +endmenu + diff --git a/openwrt/package/busybox/config/procps/Config.in b/openwrt/package/busybox/config/procps/Config.in new file mode 100644 index 0000000000..6d16180993 --- /dev/null +++ b/openwrt/package/busybox/config/procps/Config.in @@ -0,0 +1,87 @@ +# +# For a description of the syntax of this configuration file, +# see scripts/kbuild/config-language.txt. +# + +menu "Process Utilities" + +config BUSYBOX_CONFIG_FREE + bool "free" + default y + help + free displays the total amount of free and used physical and swap + memory in the system, as well as the buffers used by the kernel. + The shared memory column should be ignored; it is obsolete. + +config BUSYBOX_CONFIG_KILL + bool "kill" + default y + help + The command kill sends the specified signal to the specified + process or process group. If no signal is specified, the TERM + signal is sent. + +config BUSYBOX_CONFIG_KILLALL + bool "killall" + default y + depends on BUSYBOX_CONFIG_KILL + help + killall sends a signal to all processes running any of the + specified commands. If no signal name is specified, SIGTERM is + sent. + +config BUSYBOX_CONFIG_KILLALL5 + bool "killall5" + default y + depends on BUSYBOX_CONFIG_KILL + +config BUSYBOX_CONFIG_PIDOF + bool "pidof" + default y + help + Pidof finds the process id's (pids) of the named programs. It prints + those id's on the standard output. + +config BUSYBOX_CONFIG_PS + bool "ps" + default y + help + ps gives a snapshot of the current processes. + +config BUSYBOX_CONFIG_RENICE + bool "renice" + default n + help + Renice alters the scheduling priority of one or more running + processes. + +config BUSYBOX_CONFIG_TOP + bool "top" + default y + help + The top program provides a dynamic real-time view of a running + system. + +config BUSYBOX_FEATURE_CPU_USAGE_PERCENTAGE + bool + default y + depends on BUSYBOX_CONFIG_TOP + help + Make top display CPU usage. + +config BUSYBOX_CONFIG_UPTIME + bool "uptime" + default y + help + uptime gives a one line display of the current time, how long + the system has been running, how many users are currently logged + on, and the system load averages for the past 1, 5, and 15 minutes. + +config BUSYBOX_CONFIG_SYSCTL + bool "sysctl" + default y + help + sysctl - configure kernel parameters at runtime + +endmenu + diff --git a/openwrt/package/busybox/config/shell/Config.in b/openwrt/package/busybox/config/shell/Config.in new file mode 100644 index 0000000000..6ac4f69710 --- /dev/null +++ b/openwrt/package/busybox/config/shell/Config.in @@ -0,0 +1,229 @@ +# +# For a description of the syntax of this configuration file, +# see scripts/kbuild/config-language.txt. +# + +menu "Another Bourne-like Shell" + +choice + prompt "Choose your default shell" + default BUSYBOX_CONFIG_FEATURE_SH_IS_ASH + help + Choose a shell. The ash shell is the most bash compatible + and full featured one. + +config BUSYBOX_CONFIG_FEATURE_SH_IS_ASH + select BUSYBOX_CONFIG_ASH + bool "ash" + +config BUSYBOX_CONFIG_FEATURE_SH_IS_HUSH + select BUSYBOX_CONFIG_HUSH + bool "hush" + +config BUSYBOX_CONFIG_FEATURE_SH_IS_LASH + select BUSYBOX_CONFIG_LASH + bool "lash" + +config BUSYBOX_CONFIG_FEATURE_SH_IS_MSH + select BUSYBOX_CONFIG_MSH + bool "msh" + +config BUSYBOX_CONFIG_FEATURE_SH_IS_NONE + bool "none" + +endchoice + +config BUSYBOX_CONFIG_ASH + bool "ash" + default y + help + Tha 'ash' shell adds about 60k in the default configuration and is + the most complete and most pedantically correct shell included with + busybox. This shell is actually a derivative of the Debian 'dash' + shell (by Herbert Xu), which was created by porting the 'ash' shell + (written by Kenneth Almquist) from NetBSD. + +comment "Ash Shell Options" + depends on BUSYBOX_CONFIG_ASH + +config BUSYBOX_CONFIG_ASH_JOB_CONTROL + bool " Enable Job control" + default y + depends on BUSYBOX_CONFIG_ASH + help + Enable job control in the ash shell. + +config BUSYBOX_CONFIG_ASH_ALIAS + bool " Enable alias support" + default y + depends on BUSYBOX_CONFIG_ASH + help + Enable alias support in the ash shell. + +config BUSYBOX_CONFIG_ASH_MATH_SUPPORT + bool " Enable Posix math support" + default y + depends on BUSYBOX_CONFIG_ASH + help + Enable math support in the ash shell. + +config BUSYBOX_CONFIG_ASH_MATH_SUPPORT_64 + bool " Extend Posix math support to 64 bit" + default n + depends on BUSYBOX_CONFIG_ASH_MATH_SUPPORT + help + Enable 64-bit math support in the ash shell. This will make + the shell slightly larger, but will allow computation with very + large numbers. + +config BUSYBOX_CONFIG_ASH_GETOPTS + bool " Enable getopts builtin to parse positional parameters" + default y + depends on BUSYBOX_CONFIG_ASH + help + Enable getopts builtin in the ash shell. + +config BUSYBOX_CONFIG_ASH_CMDCMD + bool " Enable cmdcmd to override shell builtins" + default y + depends on BUSYBOX_CONFIG_ASH + help + Enable support for the ash 'command' builtin, which allows + you to run the specified command with the specified arguments, + even when there is an ash builtin command with the same name. + +config BUSYBOX_CONFIG_ASH_MAIL + bool " Check for new mail on interactive shells" + default n + depends on BUSYBOX_CONFIG_ASH + help + Enable "check for new mail" in the ash shell. + +config BUSYBOX_CONFIG_ASH_OPTIMIZE_FOR_SIZE + bool " Optimize for size instead of speed" + default y + depends on BUSYBOX_CONFIG_ASH + help + Compile ash for reduced size at price of speed. + +config BUSYBOX_CONFIG_ASH_RANDOM_SUPPORT + bool " Enable pseudorandom generator and variable $RANDOM" + default n + depends on BUSYBOX_CONFIG_ASH + help + Enable pseudorandom generator and dynamic variable "$RANDOM". + Each read of "$RANDOM" will generate a new pseudorandom value. + You can reset the generator by using a specified start value. + After "unset RANDOM" then generator will switch off and this + variable will no longer have special treatment. + +config BUSYBOX_CONFIG_HUSH + bool "hush" + default n + help + hush is a very small shell (just 18k) and it has fairly complete + Bourne shell grammar. It even handles all the normal flow control + options such as if/then/elif/else/fi, for/in/do/done, while loops, + etc. + + It does not handle case/esac, select, function, here documents ( << + word ), arithmetic expansion, aliases, brace expansion, tilde + expansion, &> and >& redirection of stdout+stderr, etc. + + +config BUSYBOX_CONFIG_LASH + bool "lash" + default n + help + lash is the very smallest shell (adds just 10k) and it is quite + usable as a command prompt, but it is not suitable for any but the + most trivial scripting (such as an initrd that calls insmod a few + times) since it does not understand any Bourne shell grammar. It + does handle pipes, redirects, and job control though. Adding in + command editing makes it a very nice lightweight command prompt. + + +config BUSYBOX_CONFIG_MSH + bool "msh" + default n + help + The minix shell (adds just 30k) is quite complete and handles things + like for/do/done, case/esac and all the things you expect a Bourne + shell to do. It is not always pedantically correct about Bourne + shell grammar (try running the shell testscript "tests/sh.testcases" + on it and compare vs bash) but for most things it works quite well. + It also uses only vfork, so it can be used on uClinux systems. + +comment "Bourne Shell Options" + depends on BUSYBOX_CONFIG_MSH || BUSYBOX_CONFIG_LASH || BUSYBOX_CONFIG_HUSH || BUSYBOX_CONFIG_ASH + +config BUSYBOX_CONFIG_FEATURE_SH_EXTRA_QUIET + bool "Hide message on interactive shell startup" + default n + depends on BUSYBOX_CONFIG_MSH || BUSYBOX_CONFIG_LASH || BUSYBOX_CONFIG_HUSH || BUSYBOX_CONFIG_ASH + help + Remove the busybox introduction when starting a shell. + +config BUSYBOX_CONFIG_FEATURE_SH_STANDALONE_SHELL + bool "Standalone shell" + default n + depends on BUSYBOX_CONFIG_MSH || BUSYBOX_CONFIG_LASH || BUSYBOX_CONFIG_HUSH || BUSYBOX_CONFIG_ASH + help + This option causes the selected busybox shell to use busybox applets + in preference to executables in the PATH whenever possible. For + example, entering the command 'ifconfig' into the shell would cause + busybox to use the ifconfig busybox applet. Specifying the fully + qualified executable name, such as '/sbin/ifconfig' will still + execute the /sbin/ifconfig executable on the filesystem. This option + is generally used when creating a staticly linked version of busybox + for use as a rescue shell, in the event that you screw up your system. + + Note that when using this option, the shell will attempt to directly + run '/bin/busybox'. If you do not have the busybox binary sitting in + that exact location with that exact name, this option will not work at + all. + +config BUSYBOX_CONFIG_FEATURE_COMMAND_EDITING + bool "command line editing" + default y + depends on BUSYBOX_CONFIG_MSH || BUSYBOX_CONFIG_LASH || BUSYBOX_CONFIG_HUSH || BUSYBOX_CONFIG_ASH + help + Enable command editing in shell. + +config BUSYBOX_CONFIG_FEATURE_COMMAND_HISTORY + int "history size" + default 15 + depends on BUSYBOX_CONFIG_FEATURE_COMMAND_EDITING + help + Specify command history size in shell. + +config BUSYBOX_CONFIG_FEATURE_COMMAND_SAVEHISTORY + bool "history saving" + default n + depends on BUSYBOX_CONFIG_ASH && BUSYBOX_CONFIG_FEATURE_COMMAND_EDITING + help + Enable history saving in ash shell. + +config BUSYBOX_CONFIG_FEATURE_COMMAND_TAB_COMPLETION + bool "tab completion" + default y + depends on BUSYBOX_CONFIG_FEATURE_COMMAND_EDITING + help + Enable tab completion in shell. + +config BUSYBOX_CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION + bool "username completion" + default n + depends on BUSYBOX_CONFIG_FEATURE_COMMAND_TAB_COMPLETION + help + Enable username completion in shell. + +config BUSYBOX_CONFIG_FEATURE_SH_FANCY_PROMPT + bool "Fancy shell prompts" + default y + depends on BUSYBOX_CONFIG_FEATURE_COMMAND_EDITING + help + Setting this option allows for prompts to use things like \w and + \$ and also using escape codes. + +endmenu diff --git a/openwrt/package/busybox/config/sysklogd/Config.in b/openwrt/package/busybox/config/sysklogd/Config.in new file mode 100644 index 0000000000..209bdff053 --- /dev/null +++ b/openwrt/package/busybox/config/sysklogd/Config.in @@ -0,0 +1,109 @@ +# +# For a description of the syntax of this configuration file, +# see scripts/kbuild/config-language.txt. +# + +menu "System Logging Utilities" + +config BUSYBOX_CONFIG_SYSLOGD + bool "syslogd" + default y + help + The syslogd utility is used to record logs of all the + significant events that occur on a system. Every + message that is logged records the date and time of the + event, and will generally also record the name of the + application that generated the message. When used in + conjunction with klogd, messages from the Linux kernel + can also be recorded. This is terribly useful, + especially for finding what happened when something goes + wrong. And something almost always will go wrong if + you wait long enough.... + +config BUSYBOX_CONFIG_FEATURE_ROTATE_LOGFILE + bool " Rotate message files" + default y + depends on BUSYBOX_CONFIG_SYSLOGD + help + This enables syslogd to rotate the message files + on his own. No need to use an external rotatescript. + +config BUSYBOX_CONFIG_FEATURE_REMOTE_LOG + bool " Remote Log support" + default y + depends on BUSYBOX_CONFIG_SYSLOGD + help + When you enable this feature, the syslogd utility can + be used to send system log messages to another system + connected via a network. This allows the remote + machine to log all the system messages, which can be + terribly useful for reducing the number of serial + cables you use. It can also be a very good security + measure to prevent system logs from being tampered with + by an intruder. + +config BUSYBOX_CONFIG_FEATURE_IPC_SYSLOG + bool " Circular Buffer support" + default y + depends on BUSYBOX_CONFIG_SYSLOGD + help + When you enable this feature, the syslogd utility will + use a circular buffer to record system log messages. + When the buffer is filled it will continue to overwrite + the oldest messages. This can be very useful for + systems with little or no permanent storage, since + otherwise system logs can eventually fill up your + entire filesystem, which may cause your system to + break badly. + +config BUSYBOX_CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE + int " Circular buffer size in Kbytes (minimum 4KB)" + default 16 + depends on BUSYBOX_CONFIG_FEATURE_IPC_SYSLOG + help + This option sets the size of the circular buffer + used to record system log messages. + +config BUSYBOX_CONFIG_LOGREAD + bool " logread" + default y + depends on BUSYBOX_CONFIG_FEATURE_IPC_SYSLOG + help + If you enabled Circular Buffer support, you almost + certainly want to enable this feature as well. This + utility will allow you to read the messages that are + stored in the syslogd circular buffer. + +config BUSYBOX_CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING + bool " logread double buffering" + default n + depends on BUSYBOX_CONFIG_LOGREAD + help + 'logread' ouput to slow serial terminals can have + side effects on syslog because of the semaphore. + This option make logread to double buffer copy + from circular buffer, minimizing semaphore + contention at some minor memory expense. + +config BUSYBOX_CONFIG_KLOGD + bool "klogd" + default y + depends on BUSYBOX_CONFIG_SYSLOGD + help + klogd is a utility which intercepts and logs all + messages from the Linux kernel and sends the messages + out to the 'syslogd' utility so they can be logged. If + you wish to record the messages produced by the kernel, + you should enable this option. + +config BUSYBOX_CONFIG_LOGGER + bool "logger" + default y + help + The logger utility allows you to send arbitrary text + messages to the system log (i.e. the 'syslogd' utility) so + they can be logged. This is generally used to help locate + problems that occur within programs and scripts. + +endmenu + diff --git a/openwrt/package/busybox/config/util-linux/Config.in b/openwrt/package/busybox/config/util-linux/Config.in new file mode 100644 index 0000000000..c491252b72 --- /dev/null +++ b/openwrt/package/busybox/config/util-linux/Config.in @@ -0,0 +1,357 @@ +# +# For a description of the syntax of this configuration file, +# see scripts/kbuild/config-language.txt. +# + +menu "Linux System Utilities" + + +config BUSYBOX_CONFIG_DMESG + bool "dmesg" + default y + help + dmesg is used to examine or control the kernel ring buffer. When the + Linux kernel prints messages to the system log, they are stored in + the kernel ring buffer. You can use dmesg to print the kernel's ring + buffer, clear the kernel ring buffer, change the size of the kernel + ring buffer, and change the priority level at which kernel messages + are also logged to the system console. Enable this option if you + wish to enable the 'dmesg' utility. + +config BUSYBOX_CONFIG_FBSET + bool "fbset" + default n + help + fbset is used to show or change the settings of a Linux frame buffer + device. The frame buffer device provides a simple and unique + interface to access a graphics display. Enable this option + if you wish to enable the 'fbset' utility. + + +config BUSYBOX_CONFIG_FEATURE_FBSET_FANCY + bool " Turn on extra fbset options" + default n + depends on BUSYBOX_CONFIG_FBSET + help + This option enables extended fbset options, allowing one to set the + framebuffer size, color depth, etc. interface to access a graphics + display. Enable this option if you wish to enable extended fbset + options. + +config BUSYBOX_CONFIG_FEATURE_FBSET_READMODE + bool " Turn on fbset readmode support" + default n + depends on BUSYBOX_CONFIG_FBSET + help + This option allows fbset to read the video mode database stored by + default n /etc/fb.modes, which can be used to set frame buffer + device to pre-defined video modes. + +config BUSYBOX_CONFIG_FDFLUSH + bool "fdflush" + default n + help + fdflush is only needed when changing media on slightly-broken + removable media drives. It is used to make Linux believe that a + hardware disk-change switch has been actuated, which causes Linux to + forget anything it has cached from the previous media. If you have + such a slightly-broken drive, you will need to run fdflush every time + you change a disk. Most people have working hardware and can safely + leave this disabled. + +config BUSYBOX_CONFIG_FDFORMAT + bool "fdformat" + default n + help + fdformat is used to low-level format a floppy disk. + +config BUSYBOX_CONFIG_FDISK + bool "fdisk" + default n + help + The fdisk utility is used to divide hard disks into one or more + logical disks, which are generally called partitions. This utility + can be used to list and edit the set of partitions or BSD style + 'disk slices' that are defined on a hard drive. + +config BUSYBOX_FDISK_SUPPORT_LARGE_DISKS + bool + default y + depends on BUSYBOX_CONFIG_FDISK + help + Enable this option to support large disks > 4GB. + +config BUSYBOX_CONFIG_FEATURE_FDISK_WRITABLE + bool " Write support" + default n + depends on BUSYBOX_CONFIG_FDISK + help + Enabling this option allows you to create or change a partition table + and write those changes out to disk. If you leave this option + disabled, you will only be able to view the partition table. + +config BUSYBOX_CONFIG_FEATURE_AIX_LABEL + bool " Support AIX disklabels" + default n + depends on BUSYBOX_CONFIG_FDISK && BUSYBOX_CONFIG_FEATURE_FDISK_WRITABLE + help + Enabling this option allows you to create or change AIX disklabels. + Most people can safely leave this option disabled. + +config BUSYBOX_CONFIG_FEATURE_SGI_LABEL + bool " Support SGI disklabels" + default n + depends on BUSYBOX_CONFIG_FDISK && BUSYBOX_CONFIG_FEATURE_FDISK_WRITABLE + help + Enabling this option allows you to create or change SGI disklabels. + Most people can safely leave this option disabled. + +config BUSYBOX_CONFIG_FEATURE_SUN_LABEL + bool " Support SUN disklabels" + default n + depends on BUSYBOX_CONFIG_FDISK && BUSYBOX_CONFIG_FEATURE_FDISK_WRITABLE + help + Enabling this option allows you to create or change SUN disklabels. + Most people can safely leave this option disabled. + +config BUSYBOX_CONFIG_FEATURE_OSF_LABEL + bool " Support BSD disklabels" + default n + depends on BUSYBOX_CONFIG_FDISK && BUSYBOX_CONFIG_FEATURE_FDISK_WRITABLE + help + Enabling this option allows you to create or change BSD disklabels + and define and edit BSD disk slices. + +config BUSYBOX_CONFIG_FEATURE_FDISK_ADVANCED + bool " Support expert mode" + default n + depends on BUSYBOX_CONFIG_FDISK && BUSYBOX_CONFIG_FEATURE_FDISK_WRITABLE + help + Enabling this option allows you to do terribly unsafe things like + define arbitrary drive geometry, move the beginning of data in a + partition, and similarly evil things. Unless you have a very good + reason you would be wise to leave this disabled. + +config BUSYBOX_CONFIG_FREERAMDISK + bool "freeramdisk" + default n + help + Linux allows you to create ramdisks. This utility allows you to + delete them and completely free all memory that was used for the + ramdisk. For example, if you boot Linux into a ramdisk and later + pivot_root, you may want to free the memory that is allocated to the + ramdisk. If you have no use for freeing memory from a ramdisk, leave + this disabled. + +config BUSYBOX_CONFIG_FSCK_MINIX + bool "fsck_minix" + default n + help + The minix filesystem is a nice, small, compact, read-write filesystem + with little overhead. It is not a journaling filesystem however and + can experience corruption if it is not properly unmounted or if the + power goes off in the middle of a write. This utility allows you to + check for and attempt to repair any corruption that occurs to a minix + filesystem. + +config BUSYBOX_CONFIG_MKFS_MINIX + bool "mkfs_minix" + default n + help + The minix filesystem is a nice, small, compact, read-write filesystem + with little overhead. If you wish to be able to create minix filesystems + this utility will do the job for you. + +comment "Minix filesystem support" + depends on BUSYBOX_CONFIG_FSCK_MINIX || BUSYBOX_CONFIG_MKFS_MINIX + +config BUSYBOX_CONFIG_FEATURE_MINIX2 + bool " Support Minix fs v2 (fsck_minix/mkfs_minix)" + default n + depends on BUSYBOX_CONFIG_FSCK_MINIX || BUSYBOX_CONFIG_MKFS_MINIX + help + If you wish to be able to create version 2 minix filesystems, enable this. + If you enabled 'mkfs_minix' then you almost certainly want to be using the + version 2 filesystem support. + +config BUSYBOX_CONFIG_GETOPT + bool "getopt" + default n + help + The getopt utility is used to break up (parse) options in command + lines to make it easy to write complex shell scripts that also check + for legal (and illegal) options. If you want to write horribly + complex shell scripts, or use some horribly complex shell script + written by others, this utility may be for you. Most people will + wisely leave this disabled. + +config BUSYBOX_CONFIG_HEXDUMP + bool "hexdump" + default y + help + The hexdump utility is used to display binary data in a readable + way that is comparable to the output from most hex editors. + +config BUSYBOX_CONFIG_HWCLOCK + bool "hwclock" + default n + help + The hwclock utility is used to read and set the hardware clock + on a system. This is primarily used to set the current time on + shutdown in the hardware clock, so the hardware will keep the + correct time when Linux is _not_ running. + +config BUSYBOX_CONFIG_FEATURE_HWCLOCK_LONGOPTIONS + bool " Support long options (--hctosys,...)" + default n + depends on BUSYBOX_CONFIG_HWCLOCK + help + By default, the hwclock utility only uses short options. If you + are overly fond of its long options, such as --hctosys, --utc, etc) + then enable this option. + +config BUSYBOX_CONFIG_LOSETUP + bool "losetup" + default n + help + losetup is used to associate or detach a loop device with a regular + file or block device, and to query the status of a loop device. This + version does not currently support enabling data encryption. + +config BUSYBOX_CONFIG_MKSWAP + bool "mkswap" + default n + help + The mkswap utility is used to configure a file or disk partition as + Linux swap space. This allows Linux to use the entire file or + partition as if it were additional RAM, which can greatly increase + the capability of low-memory machines. This additional memory is + much slower than real RAM, but can be very helpful at preventing your + applications being killed by the Linux out of memory (OOM) killer. + Once you have created swap space using 'mkswap' you need to enable + the swap space using the 'swapon' utility. + +config BUSYBOX_CONFIG_MORE + bool "more" + default y + help + more is a simple utility which allows you to read text one screen + sized page at a time. If you want to read text that is larger than + the screen, and you are using anything faster than a 300 baud modem, + you will probably find this utility very helpful. If you don't have + any need to reading text files, you can leave this disabled. + +config BUSYBOX_CONFIG_FEATURE_USE_TERMIOS + bool " Use termios to manipulate the screen" + default y + depends on BUSYBOX_CONFIG_MORE + help + This option allows utilities such as 'more' and 'top' to determine + the size of the screen. If you leave this disabled, your utilities + that display things on the screen will be especially primitive and + will be unable to determine the current screen size, and will be + unable to move the cursor. + +config BUSYBOX_CONFIG_PIVOT_ROOT + bool "pivot_root" + default y + help + The pivot_root utility swaps the mount points for the root filesystem + with some other mounted filesystem. This allows you to do all sorts + of wild and crazy things with your Linux system and is far more + powerful than 'chroot'. + +config BUSYBOX_CONFIG_RDATE + bool "rdate" + default y + help + The rdate utility allows you to synchronize the date and time of your + system clock with the date and time of a remote networked system using + the RFC868 protocol, which is built into the inetd daemon on most + systems. + +config BUSYBOX_CONFIG_SWAPONOFF + bool "swaponoff" + default n + help + This option enables both the 'swapon' and the 'swapoff' utilities. + Once you have created some swap space using 'mkswap', you also need + to enable your swap space with the 'swapon' utility. The 'swapoff' + utility is used, typically at system shutdown, to disable any swap + space. If you are not using any swap space, you can leave this + option disabled. + +config BUSYBOX_CONFIG_MOUNT + bool "mount" + default y + help + All files and filesystems in Unix are arranged into one big directory + tree. The 'mount' utility is used to graft a filesystem onto a + particular part of the tree. A filesystem can either live on a block + device, or it can be accessible over the network, as is the case with + NFS filesystems. Most people using BusyBox will also want to enable + the 'mount' utility. + +config BUSYBOX_CONFIG_NFSMOUNT + bool " Support mounting NFS file systems" + default y + depends on BUSYBOX_CONFIG_MOUNT + help + Enable mounting of NFS file systems. + +config BUSYBOX_CONFIG_UMOUNT + bool "umount" + default y + help + When you want to remove a mounted filesystem from its current mount point, + for example when you are shutting down the system, the 'umount' utility is + the tool to use. If you enabled the 'mount' utility, you almost certainly + also want to enable 'umount'. + +config BUSYBOX_CONFIG_FEATURE_MOUNT_FORCE + bool " Support forced filesystem unmounting" + default y + depends on BUSYBOX_CONFIG_UMOUNT + help + This allows you to _force_ a filesystem to be umounted. This is generally + only useful when you want to get rid of an unreachable NFS system. + +comment "Common options for mount/umount" + depends on BUSYBOX_CONFIG_MOUNT || BUSYBOX_CONFIG_UMOUNT + +config BUSYBOX_CONFIG_FEATURE_MOUNT_LOOP + bool " Support for loop devices" + default y + depends on BUSYBOX_CONFIG_MOUNT || BUSYBOX_CONFIG_UMOUNT + help + Enabling this feature allows mount to use the '-o' loop options, + which lets you loop mount files. Mount will automagically setup and + free the necessary loop devices so you do not need to mess with the + 'losetup' utility unless you really want to. This is really + only useful if you plan to loop mount files. + +config BUSYBOX_CONFIG_FEATURE_MTAB_SUPPORT + bool " Support for a real /etc/mtab (instead of /proc/mounts)" + default n + depends on BUSYBOX_CONFIG_MOUNT || BUSYBOX_CONFIG_UMOUNT + help + If your root filesystem is writable and you wish to have the 'mount' + utility create an mtab file listing the filesystems which have been + mounted then you should enable this option. Most people that use + BusyBox have a read-only root filesystem, so they will leave this + option disabled and BusyBox will use the /proc/mounts file. + +config BUSYBOX_CONFIG_FEATURE_MTAB_FILENAME + string " mtab file location" + default n + depends on BUSYBOX_CONFIG_FEATURE_MTAB_SUPPORT + help + Some people have a read only root filesystem, but they also wish to + have the 'mount' utility create an mtab file listing the filesystems + which have been mounted. This option allows you to specify an alternative + location for the mtab file, such as /var/mtab, or /tmp/mtab. The default + value is /etc/mtab, which is where this file is located on most desktop + Linux systems. + +endmenu + diff --git a/openwrt/package/config/confdata.c b/openwrt/package/config/confdata.c index fd3a345e26..e24206ffd2 100644 --- a/openwrt/package/config/confdata.c +++ b/openwrt/package/config/confdata.c @@ -356,8 +356,8 @@ int conf_write(const char *name) fprintf(out_h, "#undef %s\n", sym->name); break; case mod: -#if 0 fprintf(out, "%s=m\n", sym->name); +#if 0 if (out_h) fprintf(out_h, "#define %s_MODULE 1\n", sym->name); #endif diff --git a/openwrt/package/dnsmasq/Makefile b/openwrt/package/dnsmasq/Makefile new file mode 100644 index 0000000000..cd4cae4be9 --- /dev/null +++ b/openwrt/package/dnsmasq/Makefile @@ -0,0 +1,9 @@ +include $(TOPDIR)/rules.mk + +include ./dnsmasq.mk + +source: dnsmasq-source +prepare: $(DNSMASQ_DIR)/.unpacked +compile: $(DNSMASQ_DIR)/src/dnsmasq +install: dnsmasq +clean: dnsmasq-dirclean diff --git a/openwrt/package/dnsmasq/dnsmasq.mk b/openwrt/package/dnsmasq/dnsmasq.mk index e6b50a2613..a0289c3524 100644 --- a/openwrt/package/dnsmasq/dnsmasq.mk +++ b/openwrt/package/dnsmasq/dnsmasq.mk @@ -20,13 +20,12 @@ 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) +$(DNSMASQ_DIR)/.unpacked: $(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 + $(PATCH) $(DNSMASQ_DIR) ./ $(DNSMASQ_VER)-\*.patch + touch $(DNSMASQ_DIR)/.unpacked -$(DNSMASQ_DIR)/src/$(DNSMASQ_BINARY): $(DNSMASQ_DIR)/.source +$(DNSMASQ_DIR)/src/$(DNSMASQ_BINARY): $(DNSMASQ_DIR)/.unpacked $(MAKE) CC=$(TARGET_CC) CFLAGS="$(TARGET_CFLAGS)" \ BINDIR=/usr/sbin MANDIR=/usr/man -C $(DNSMASQ_DIR) @@ -36,9 +35,9 @@ $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY): $(DNSMASQ_DIR)/src/$(DNSMASQ_BINARY) $(STRIP) $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY) rm -rf $(TARGET_DIR)/usr/man -dnsmasq: uclibc $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY) +dnsmasq: $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY) -dnsmasq1: uclibc $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY) +dnsmasq1: $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY) dnsmasq-source: $(DL_DIR)/$(DNSMASQ_SOURCE) diff --git a/openwrt/package/dropbear_sshd/Config.in b/openwrt/package/dropbear_sshd/Config.in deleted file mode 100644 index 69522fdba1..0000000000 --- a/openwrt/package/dropbear_sshd/Config.in +++ /dev/null @@ -1,8 +0,0 @@ -config BR2_PACKAGE_DROPBEAR_SSHD - bool "dropbear_sshd" - select BR2_PACKAGE_ZLIB - 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/dropbear-init.patch b/openwrt/package/dropbear_sshd/dropbear-init.patch deleted file mode 100644 index d6bf1740a0..0000000000 --- a/openwrt/package/dropbear_sshd/dropbear-init.patch +++ /dev/null @@ -1,59 +0,0 @@ ---- 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 deleted file mode 100644 index 4031e218fb..0000000000 --- a/openwrt/package/dropbear_sshd/dropbear_sshd.mk +++ /dev/null @@ -1,82 +0,0 @@ -############################################################# -# -# 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) - -ifeq ($(strip $(BR2_PACKAGE_DROPBEAR_SSHD)),y) -TARGETS+=dropbear_sshd -endif diff --git a/openwrt/package/ebtables/Config.in b/openwrt/package/ebtables/Config.in index 22c32abedf..2e6b8257cc 100644 --- a/openwrt/package/ebtables/Config.in +++ b/openwrt/package/ebtables/Config.in @@ -1,6 +1,6 @@ config BR2_PACKAGE_EBTABLES - bool "ebtables" - default n + tristate "Ethernet Bridge Firewalling" + default m help - ethernet bridging firewalling + Ethernet Bridge Firewalling (ebtables) http://ebtables.sourceforge.net/ diff --git a/openwrt/package/ebtables/Makefile b/openwrt/package/ebtables/Makefile new file mode 100644 index 0000000000..384576db9d --- /dev/null +++ b/openwrt/package/ebtables/Makefile @@ -0,0 +1,43 @@ +############################################################# +# +# ebtables +# +############################################################# +include $(TOPDIR)/rules.mk + +PKG_NAME:=ebtables +PKG_VERSION:=2.0.6 +PKG_RELEASE:=1 +PKG_SOURCE_URL:=http://umn.dl.sourceforge.net/sourceforge/ebtables/ +PKG_SOURCE:=$(PKG_NAME)-v$(PKG_VERSION).tar.gz +PKG_BUILD_DIR:=$(BUILD_DIR)/ebtables-v$(PKG_VERSION) +PKG_CAT:=zcat +PKG_IPK:=$(PACKAGE_DIR)/$(PKG_NAME)_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk +PKG_IPK_DIR:=$(PKG_BUILD_DIR)/ipkg + +$(DL_DIR)/$(PKG_SOURCE): + $(WGET) -P $(DL_DIR) $(PKG_SOURCE_URL)/$(PKG_SOURCE) + +$(PKG_BUILD_DIR)/.unpacked: $(DL_DIR)/$(PKG_SOURCE) + $(PKG_CAT) $(DL_DIR)/$(PKG_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + touch $(PKG_BUILD_DIR)/.unpacked + +$(PKG_BUILD_DIR)/ebtables: $(PKG_BUILD_DIR)/.unpacked + $(MAKE) -C $(PKG_BUILD_DIR) \ + CC=$(TARGET_CC) LD=$(TARGET_CROSS)ld \ + CFLAGS="$(TARGET_CFLAGS) -Wall" + +$(PKG_IPK): $(PKG_BUILD_DIR)/ebtables + $(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_IPK_DIR) $(PKG_NAME).control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH) + mkdir -p $(PKG_IPK_DIR)/usr/sbin + cp $(PKG_BUILD_DIR)/ebtables $(PKG_IPK_DIR)/usr/sbin/ + mkdir -p $(PACKAGE_DIR) + $(IPKG_BUILD) $(PKG_IPK_DIR) $(PACKAGE_DIR) + +source: $(DL_DIR)/$(PKG_SOURCE) +prepare: $(PKG_BUILD_DIR)/.unpacked +compile: $(PKG_IPK) +install: + $(IPKG) install $(PKG_IPK) +clean: + rm -rf $(PKG_BUILD_DIR) diff --git a/openwrt/package/ebtables/ebtables.control b/openwrt/package/ebtables/ebtables.control new file mode 100644 index 0000000000..550e5d6e06 --- /dev/null +++ b/openwrt/package/ebtables/ebtables.control @@ -0,0 +1,9 @@ +Package: ebtables +Priority: optional +Section: net +Version: 1.2.11-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: Ethernet bridge firewalling software +Depends: kmod-ebtables diff --git a/openwrt/package/ebtables/ebtables.mk b/openwrt/package/ebtables/ebtables.mk deleted file mode 100644 index e7982ca1f4..0000000000 --- a/openwrt/package/ebtables/ebtables.mk +++ /dev/null @@ -1,41 +0,0 @@ -############################################################# -# -# ebtables -# -############################################################# - -EBTABLES_SOURCE_URL=http://umn.dl.sourceforge.net/sourceforge/ebtables/ -EBTABLES_SOURCE=ebtables-v2.0.6.tar.gz -EBTABLES_BUILD_DIR=$(BUILD_DIR)/ebtables-v2.0.6 -EBTABLES_TARGET_BINARY:=usr/sbin/ebtables - -$(DL_DIR)/$(EBTABLES_SOURCE): - $(WGET) -P $(DL_DIR) $(EBTABLES_SOURCE_URL)/$(EBTABLES_SOURCE) - -$(EBTABLES_BUILD_DIR)/.unpacked: $(DL_DIR)/$(EBTABLES_SOURCE) - zcat $(DL_DIR)/$(EBTABLES_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - - touch $(EBTABLES_BUILD_DIR)/.unpacked - -$(EBTABLES_BUILD_DIR)/ebtables: $(EBTABLES_BUILD_DIR)/.unpacked - $(MAKE) -C $(EBTABLES_BUILD_DIR) \ - CC=$(TARGET_CC) LD=$(TARGET_CROSS)ld \ - CFLAGS="$(TARGET_CFLAGS) -Wall" - -$(TARGET_DIR)/$(EBTABLES_TARGET_BINARY): $(EBTABLES_BUILD_DIR)/ebtables - cp -af $(EBTABLES_BUILD_DIR)/ebtables $(TARGET_DIR)/$(EBTABLES_TARGET_BINARY) - $(STRIP) $(TARGET_DIR)/$(EBTABLES_TARGET_BINARY) - -ebtables: $(TARGET_DIR)/$(EBTABLES_TARGET_BINARY) - -ebtables-source: $(DL_DIR)/$(EBTABLES_SOURCE) - -ebtables-clean: - #$(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(EBTABLES_BUILD_DIR) uninstall - -$(MAKE) -C $(EBTABLES_BUILD_DIR) clean - -ebtables-dirclean: - rm -rf $(EBTABLES_BUILD_DIR) - -ifeq ($(strip $(BR2_PACKAGE_EBTABLES)),y) -TARGETS+=ebtables -endif diff --git a/openwrt/package/iproute2/Config.in b/openwrt/package/iproute2/Config.in new file mode 100644 index 0000000000..6f64eb53bd --- /dev/null +++ b/openwrt/package/iproute2/Config.in @@ -0,0 +1,17 @@ +config BR2_PACKAGE_IPROUTE2 + bool + depends BR2_PACKAGE_IPROUTE2_IP || BR2_PACKAGE_IPROUTE2_TC + default n + +config BR2_PACKAGE_IPROUTE2_IP + tristate "iproute2 routing control (ip)" + default m + select BR2_PACKAGE_IPROUTE2 + +config BR2_PACKAGE_IPROUTE2_TC + tristate "iproute2 traffic control (tc)" + default m + select BR2_PACKAGE_IPROUTE2 + select BR2_PACKAGE_KMOD_SCHED + + diff --git a/openwrt/package/iproute2/Makefile b/openwrt/package/iproute2/Makefile new file mode 100644 index 0000000000..a2d52df116 --- /dev/null +++ b/openwrt/package/iproute2/Makefile @@ -0,0 +1,87 @@ +############################################################# +# +# ebtables +# +############################################################# +include $(TOPDIR)/rules.mk + +PKG_NAME:=iproute2 +PKG_VERSION:=2.6.9 +PKG_RELEASE:=1 +PKG_SOURCE_URL:=http://developer.osdl.org/dev/iproute2/download/ +PKG_SOURCE:=$(PKG_NAME)-2.6.9-041019.tar.gz +PKG_BUILD_DIR:=$(BUILD_DIR)/iproute2-2.6.9 +PKG_CAT:=zcat + +PKG_IP:=$(PACKAGE_DIR)/ip_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk +PKG_IP_DIR:=$(PKG_BUILD_DIR)/ipkg/ip + +PKG_TC:=$(PACKAGE_DIR)/tc_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk +PKG_TC_DIR:=$(PKG_BUILD_DIR)/ipkg/tc + +$(DL_DIR)/$(PKG_SOURCE): + $(WGET) -P $(DL_DIR) $(PKG_SOURCE_URL)/$(PKG_SOURCE) + +$(PKG_BUILD_DIR)/.patched: $(DL_DIR)/$(PKG_SOURCE) + $(PKG_CAT) $(DL_DIR)/$(PKG_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + $(PATCH) $(PKG_BUILD_DIR) ./patches + $(SED) "s:-O2:${TARGET_CFLAGS}:g" $(PKG_BUILD_DIR)/Makefile + touch $(PKG_BUILD_DIR)/.patched + +$(PKG_BUILD_DIR)/.configured: $(PKG_BUILD_DIR)/.patched + $(SED) "s,-I/usr/include/db3,," $(PKG_BUILD_DIR)/Makefile + $(SED) "s,^KERNEL_INCLUDE.*,KERNEL_INCLUDE=$(LINUX_DIR)/include," \ + $(PKG_BUILD_DIR)/Makefile + $(SED) "s,^LIBC_INCLUDE.*,LIBC_INCLUDE=$(STAGING_DIR)/include," \ + $(PKG_BUILD_DIR)/Makefile + # For now disable compiling of the misc directory because it seems to fail + rm -rf $(PKG_BUILD_DIR)/misc + $(SED) "s, misc,," $(PKG_BUILD_DIR)/Makefile + touch $(PKG_BUILD_DIR)/.configured + +$(PKG_BUILD_DIR)/tc/tc: $(PKG_BUILD_DIR)/.configured + $(MAKE) -C $(PKG_BUILD_DIR) $(TARGET_CONFIGURE_OPTS) KERNEL_INCLUDE=$(LINUX_DIR)/include all tc/tc + +$(PKG_BUILD_DIR)/ip/ip: $(PKG_BUILD_DIR)/.configured + $(MAKE) -C $(PKG_BUILD_DIR) $(TARGET_CONFIGURE_OPTS) KERNEL_INCLUDE=$(LINUX_DIR)/include all ip/ip + + +$(PKG_IP): $(PKG_BUILD_DIR)/ip/ip $(PACKAGE_DIR) + $(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_IP_DIR) ip.control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH) + mkdir -p $(PKG_IP_DIR)/usr/sbin + cp $< $(PKG_IP_DIR)/usr/sbin/ + $(STRIP) $(PKG_IP_DIR)/usr/sbin/* + $(IPKG_BUILD) $(PKG_IP_DIR) $(PACKAGE_DIR) + +$(PKG_TC): $(PKG_BUILD_DIR)/tc/tc $(PACKAGE_DIR) + $(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_TC_DIR) tc.control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH) + mkdir -p $(PKG_TC_DIR)/usr/sbin + cp $< $(PKG_TC_DIR)/usr/sbin/ + $(STRIP) $(PKG_TC_DIR)/usr/sbin/* + $(IPKG_BUILD) $(PKG_TC_DIR) $(PACKAGE_DIR) + +$(PACKAGE_DIR): + mkdir -p $(PACKAGE_DIR) + +TARGETS:= +ifneq ($(BR2_PACKAGE_IPROUTE2_IP),) +TARGETS += $(PKG_IP) +endif +ifneq ($(BR2_PACKAGE_IPROUTE2_TC),) +TARGETS += $(PKG_TC) +endif + +source: $(DL_DIR)/$(PKG_SOURCE) +prepare: $(PKG_BUILD_DIR)/.patched +compile: $(TARGETS) +install: +ifeq ($(BR2_PACKAGE_IPROUTE2_IP),y) + $(IPKG) install $(PKG_IP) +endif +ifeq ($(BR2_PACKAGE_IPROUTE2_TC),y) + $(IPKG) install $(PKG_TC) +endif + + +clean: + rm -rf $(PKG_BUILD_DIR) diff --git a/openwrt/package/iproute2/ip.control b/openwrt/package/iproute2/ip.control new file mode 100644 index 0000000000..fe150d53e5 --- /dev/null +++ b/openwrt/package/iproute2/ip.control @@ -0,0 +1,8 @@ +Package: ip +Architecture: mipsel +Version: 2.6.9-1 +Section: net +Priority: optional +Maintainer: Felix Fietkau +Source: buildroot internal +Description: iproute2 routing control utility diff --git a/openwrt/package/iproute2/patches/debian-patches-3.patch b/openwrt/package/iproute2/patches/debian-patches-3.patch new file mode 100644 index 0000000000..8a06f59988 --- /dev/null +++ b/openwrt/package/iproute2/patches/debian-patches-3.patch @@ -0,0 +1,1497 @@ +--- iproute-20041019.orig/ip/Makefile ++++ iproute-20041019/ip/Makefile +@@ -6,7 +6,7 @@ + RTMONOBJ=rtmon.o + + ALLOBJ=$(IPOBJ) $(RTMONOBJ) +-TARGETS=ip rtmon ifcfg rtpr ++TARGETS=ip rtmon + + all: $(TARGETS) + +--- iproute-20041019.orig/tc/q_htb.c ++++ iproute-20041019/tc/q_htb.c +@@ -1,3 +1,311 @@ ++#if 0 ++/* ++ * q_htb.c HTB. ++ * ++ * 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. ++ * ++ * Authors: Martin Devera, devik@cdi.cz ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "utils.h" ++#include "tc_util.h" ++ ++#define HTB_TC_VER 0x30003 ++#if HTB_TC_VER >> 16 != TC_HTB_PROTOVER ++#error "Different kernel and TC HTB versions" ++#endif ++ ++static void explain(void) ++{ ++ fprintf(stderr, "Usage: ... qdisc add ... htb [default N] [r2q N]\n" ++ " default minor id of class to which unclassified packets are sent {0}\n" ++ " r2q DRR quantums are computed as rate in Bps/r2q {10}\n" ++ " debug string of 16 numbers each 0-3 {0}\n\n" ++ "... class add ... htb rate R1 burst B1 [prio P] [slot S] [pslot PS]\n" ++ " [ceil R2] [cburst B2] [mtu MTU] [quantum Q]\n" ++ " rate rate allocated to this class (class can still borrow)\n" ++ " burst max bytes burst which can be accumulated during idle period {computed}\n" ++ " ceil definite upper class rate (no borrows) {rate}\n" ++ " cburst burst but for ceil {computed}\n" ++ " mtu max packet size we create rate map for {1600}\n" ++ " prio priority of leaf; lower are served first {0}\n" ++ " quantum how much bytes to serve from leaf at once {use r2q}\n" ++ "\nTC HTB version %d.%d\n",HTB_TC_VER>>16,HTB_TC_VER&0xffff ++ ); ++} ++ ++static void explain1(char *arg) ++{ ++ fprintf(stderr, "Illegal \"%s\"\n", arg); ++ explain(); ++} ++ ++ ++#define usage() return(-1) ++ ++static int htb_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n) ++{ ++ struct tc_htb_glob opt; ++ struct rtattr *tail; ++ unsigned i; char *p; ++ memset(&opt,0,sizeof(opt)); ++ opt.rate2quantum = 10; ++ opt.version = 3; ++ ++ while (argc > 0) { ++ if (matches(*argv, "r2q") == 0) { ++ NEXT_ARG(); ++ if (get_u32(&opt.rate2quantum, *argv, 10)) { ++ explain1("r2q"); return -1; ++ } ++ } else if (matches(*argv, "default") == 0) { ++ NEXT_ARG(); ++ if (get_u32(&opt.defcls, *argv, 16)) { ++ explain1("default"); return -1; ++ } ++ } else if (matches(*argv, "debug") == 0) { ++ NEXT_ARG(); p = *argv; ++ for (i=0; i<16; i++,p++) { ++ if (*p<'0' || *p>'3') break; ++ opt.debug |= (*p-'0')<<(2*i); ++ } ++ } else { ++ fprintf(stderr, "What is \"%s\"?\n", *argv); ++ explain(); ++ return -1; ++ } ++ argc--; argv++; ++ } ++ tail = (struct rtattr*)(((void*)n)+NLMSG_ALIGN(n->nlmsg_len)); ++ addattr_l(n, 1024, TCA_OPTIONS, NULL, 0); ++ addattr_l(n, 2024, TCA_HTB_INIT, &opt, NLMSG_ALIGN(sizeof(opt))); ++ tail->rta_len = (((void*)n)+NLMSG_ALIGN(n->nlmsg_len)) - (void*)tail; ++ return 0; ++} ++ ++static int htb_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n) ++{ ++ int ok=0; ++ struct tc_htb_opt opt; ++ __u32 rtab[256],ctab[256]; ++ unsigned buffer=0,cbuffer=0; ++ int cell_log=-1,ccell_log = -1,mtu; ++ struct rtattr *tail; ++ ++ memset(&opt, 0, sizeof(opt)); mtu = 1600; /* eth packet len */ ++ ++ while (argc > 0) { ++ if (matches(*argv, "prio") == 0) { ++ NEXT_ARG(); ++ if (get_u32(&opt.prio, *argv, 10)) { ++ explain1("prio"); return -1; ++ } ++ ok++; ++ } else if (matches(*argv, "mtu") == 0) { ++ NEXT_ARG(); ++ if (get_u32(&mtu, *argv, 10)) { ++ explain1("mtu"); return -1; ++ } ++ } else if (matches(*argv, "quantum") == 0) { ++ NEXT_ARG(); ++ if (get_u32(&opt.quantum, *argv, 10)) { ++ explain1("quantum"); return -1; ++ } ++ } else if (matches(*argv, "burst") == 0 || ++ strcmp(*argv, "buffer") == 0 || ++ strcmp(*argv, "maxburst") == 0) { ++ NEXT_ARG(); ++ if (get_size_and_cell(&buffer, &cell_log, *argv) < 0) { ++ explain1("buffer"); ++ return -1; ++ } ++ ok++; ++ } else if (matches(*argv, "cburst") == 0 || ++ strcmp(*argv, "cbuffer") == 0 || ++ strcmp(*argv, "cmaxburst") == 0) { ++ NEXT_ARG(); ++ if (get_size_and_cell(&cbuffer, &ccell_log, *argv) < 0) { ++ explain1("cbuffer"); ++ return -1; ++ } ++ ok++; ++ } else if (strcmp(*argv, "ceil") == 0) { ++ NEXT_ARG(); ++ if (opt.ceil.rate) { ++ fprintf(stderr, "Double \"ceil\" spec\n"); ++ return -1; ++ } ++ if (get_rate(&opt.ceil.rate, *argv)) { ++ explain1("ceil"); ++ return -1; ++ } ++ ok++; ++ } else if (strcmp(*argv, "rate") == 0) { ++ NEXT_ARG(); ++ if (opt.rate.rate) { ++ fprintf(stderr, "Double \"rate\" spec\n"); ++ return -1; ++ } ++ if (get_rate(&opt.rate.rate, *argv)) { ++ explain1("rate"); ++ return -1; ++ } ++ ok++; ++ } else if (strcmp(*argv, "help") == 0) { ++ explain(); ++ return -1; ++ } else { ++ fprintf(stderr, "What is \"%s\"?\n", *argv); ++ explain(); ++ return -1; ++ } ++ argc--; argv++; ++ } ++ ++/* if (!ok) ++ return 0;*/ ++ ++ if (opt.rate.rate == 0) { ++ fprintf(stderr, "\"rate\" is required.\n"); ++ return -1; ++ } ++ /* if ceil params are missing, use the same as rate */ ++ if (!opt.ceil.rate) opt.ceil = opt.rate; ++ ++ /* compute minimal allowed burst from rate; mtu is added here to make ++ sute that buffer is larger than mtu and to have some safeguard space */ ++ if (!buffer) buffer = opt.rate.rate / HZ + mtu; ++ if (!cbuffer) cbuffer = opt.ceil.rate / HZ + mtu; ++ ++ if ((cell_log = tc_calc_rtable(opt.rate.rate, rtab, cell_log, mtu, 0)) < 0) { ++ fprintf(stderr, "htb: failed to calculate rate table.\n"); ++ return -1; ++ } ++ opt.buffer = tc_calc_xmittime(opt.rate.rate, buffer); ++ opt.rate.cell_log = cell_log; ++ ++ if ((ccell_log = tc_calc_rtable(opt.ceil.rate, ctab, cell_log, mtu, 0)) < 0) { ++ fprintf(stderr, "htb: failed to calculate ceil rate table.\n"); ++ return -1; ++ } ++ opt.cbuffer = tc_calc_xmittime(opt.ceil.rate, cbuffer); ++ opt.ceil.cell_log = ccell_log; ++ ++ tail = (struct rtattr*)(((void*)n)+NLMSG_ALIGN(n->nlmsg_len)); ++ addattr_l(n, 1024, TCA_OPTIONS, NULL, 0); ++ addattr_l(n, 2024, TCA_HTB_PARMS, &opt, sizeof(opt)); ++ addattr_l(n, 3024, TCA_HTB_RTAB, rtab, 1024); ++ addattr_l(n, 4024, TCA_HTB_CTAB, ctab, 1024); ++ tail->rta_len = (((void*)n)+NLMSG_ALIGN(n->nlmsg_len)) - (void*)tail; ++ return 0; ++} ++ ++static int htb_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) ++{ ++ struct rtattr *tb[TCA_HTB_RTAB+1]; ++ struct tc_htb_opt *hopt; ++ struct tc_htb_glob *gopt; ++ double buffer,cbuffer; ++ SPRINT_BUF(b1); ++ SPRINT_BUF(b2); ++ ++ if (opt == NULL) ++ return 0; ++ ++ memset(tb, 0, sizeof(tb)); ++ parse_rtattr(tb, TCA_HTB_RTAB, RTA_DATA(opt), RTA_PAYLOAD(opt)); ++ ++ if (tb[TCA_HTB_PARMS]) { ++ ++ hopt = RTA_DATA(tb[TCA_HTB_PARMS]); ++ if (RTA_PAYLOAD(tb[TCA_HTB_PARMS]) < sizeof(*hopt)) return -1; ++ ++ if (!hopt->level) { ++ fprintf(f, "prio %d ", (int)hopt->prio); ++ if (show_details) ++ fprintf(f, "quantum %d ", (int)hopt->quantum); ++ } ++ fprintf(f, "rate %s ", sprint_rate(hopt->rate.rate, b1)); ++ buffer = ((double)hopt->rate.rate*tc_core_tick2usec(hopt->buffer))/1000000; ++ fprintf(f, "ceil %s ", sprint_rate(hopt->ceil.rate, b1)); ++ cbuffer = ((double)hopt->ceil.rate*tc_core_tick2usec(hopt->cbuffer))/1000000; ++ if (show_details) { ++ fprintf(f, "burst %s/%u mpu %s ", sprint_size(buffer, b1), ++ 1<rate.cell_log, sprint_size(hopt->rate.mpu, b2)); ++ fprintf(f, "cburst %s/%u mpu %s ", sprint_size(cbuffer, b1), ++ 1<ceil.cell_log, sprint_size(hopt->ceil.mpu, b2)); ++ fprintf(f, "level %d ", (int)hopt->level); ++ } else { ++ fprintf(f, "burst %s ", sprint_size(buffer, b1)); ++ fprintf(f, "cburst %s ", sprint_size(cbuffer, b1)); ++ } ++ if (show_raw) ++ fprintf(f, "buffer [%08x] cbuffer [%08x] ", ++ hopt->buffer,hopt->cbuffer); ++ } ++ if (tb[TCA_HTB_INIT]) { ++ gopt = RTA_DATA(tb[TCA_HTB_INIT]); ++ if (RTA_PAYLOAD(tb[TCA_HTB_INIT]) < sizeof(*gopt)) return -1; ++ ++ fprintf(f, "r2q %d default %x direct_packets_stat %u", ++ gopt->rate2quantum,gopt->defcls,gopt->direct_pkts); ++ if (show_details) ++ fprintf(f," ver %d.%d",gopt->version >> 16,gopt->version & 0xffff); ++ } ++ return 0; ++} ++ ++static int htb_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats) ++{ ++ struct tc_htb_xstats *st; ++ if (xstats == NULL) ++ return 0; ++ ++ if (RTA_PAYLOAD(xstats) < sizeof(*st)) ++ return -1; ++ ++ st = RTA_DATA(xstats); ++ fprintf(f, " lended: %u borrowed: %u giants: %u\n", ++ st->lends,st->borrows,st->giants); ++ fprintf(f, " tokens: %d ctokens: %d\n", st->tokens,st->ctokens); ++ return 0; ++} ++ ++struct qdisc_util htb_util = { ++ NULL, ++ "htb", ++ htb_parse_opt, ++ htb_print_opt, ++ htb_print_xstats, ++ htb_parse_class_opt, ++ htb_print_opt, ++}; ++ ++/* for testing of old one */ ++struct qdisc_util htb2_util = { ++ NULL, ++ "htb2", ++ htb_parse_opt, ++ htb_print_opt, ++ htb_print_xstats, ++ htb_parse_class_opt, ++ htb_print_opt, ++}; ++#endif + /* + * q_htb.c HTB. + * +--- iproute-20041019.orig/doc/Makefile ++++ iproute-20041019/doc/Makefile +@@ -14,6 +14,7 @@ + PAGESPERPAGE=2 + + HTMLFILES=$(subst .sgml,.html,$(shell echo *.sgml)) ++TXTFILES=$(subst .sgml,.txt,$(shell echo *.sgml)) + DVIFILES=$(subst .ps,.dvi,$(PSFILES)) + + +@@ -23,6 +24,8 @@ + + html: $(HTMLFILES) + ++txt: $(TXTFILES) ++ + dvi: $(DVIFILES) + + print: $(PSFILES) +@@ -42,16 +45,17 @@ + done + + %.ps: %.dvi +- $(DVIPS) $< -o $@.tmp +- ./do-psnup $@.tmp $@ $(PAGESIZE) $(PAGESPERPAGE) +- rm -f $@.tmp ++ $(DVIPS) $< -o $@ + + %.html: %.sgml + $(SGML2HTML) $< + ++%.txt: %.html ++ lynx -nolist -dump $< > $@ ++ + install: + install -m 0644 $(shell echo *.tex) $(DESTDIR)$(DOCDIR) + install -m 0644 $(shell echo *.sgml) $(DESTDIR)$(DOCDIR) + + clean: +- rm -f *.aux *.log *.toc $(PSFILES) $(DVIFILES) *.html ++ rm -f *.aux *.log *.toc $(PSFILES) $(DVIFILES) *.html $(TXTFILES) +--- iproute-20041019.orig/misc/Makefile ++++ iproute-20041019/misc/Makefile +@@ -1,7 +1,8 @@ + SSOBJ=ss.o ssfilter.o + LNSTATOBJ=lnstat.o lnstat_util.o + +-TARGETS=ss nstat ifstat rtacct arpd lnstat ++#TARGETS=ss nstat ifstat rtacct arpd lnstat ++TARGETS=ss nstat rtacct lnstat + + include ../Config + +--- iproute-20041019.orig/misc/netbug ++++ iproute-20041019/misc/netbug +@@ -1,23 +1,16 @@ + #! /bin/bash + ++set -e ++ + echo -n "Send network configuration summary to [ENTER means kuznet@ms2.inr.ac.ru] " + IFS="" read mail || exit 1 + [ -z "$mail" ] && mail=kuznet@ms2.inr.ac.ru + ++netbug=`mktemp -d -t netbug.XXXXXX` || {echo "$0: Cannot create temporary directory" >&2; exit 1; } ++netbugtar=`tempfile -d $netbug --suffix=tar.gz` || {echo "$0: Cannot create temporary file" >&2; exit 1; } ++tmppath=$netbug ++trap "/bin/rm -rf $netbug $netbugtar" 0 1 2 3 13 15 + +-netbug="" +-while [ "$netbug" = "" ]; do +- netbug=`echo netbug.$$.$RANDOM` +- if [ -e /tmp/$netbug ]; then +- netbug="" +- fi +-done +- +-tmppath=/tmp/$netbug +- +-trap "rm -rf $tmppath $tmppath.tar.gz" 0 SIGINT +- +-mkdir $tmppath + mkdir $tmppath/net + + cat /proc/slabinfo > $tmppath/slabinfo +@@ -44,9 +37,8 @@ + fi + + cd /tmp +-tar c $netbug | gzip -9c > $netbug.tar.gz +- +-uuencode $netbug.tar.gz $netbug.tar.gz | mail -s $netbug "$mail" ++tar c $tmppath | gzip -9c > $netbugtar ++uuencode $netbugtar $netbugtar | mail -s $netbug "$mail" + + echo "Sending to <$mail>; subject is $netbug" + +--- iproute-20041019.orig/Makefile ++++ iproute-20041019/Makefile +@@ -30,7 +30,7 @@ + LIBNETLINK=../lib/libnetlink.a ../lib/libutil.a + + all: Config +- @for i in $(SUBDIRS); \ ++ @set -e; for i in $(SUBDIRS); \ + do $(MAKE) $(MFLAGS) -C $$i; done + + Config: +@@ -45,7 +45,7 @@ + $(DESTDIR)$(DOCDIR)/examples + install -m 0644 $(shell find examples/diffserv -type f -maxdepth 1) \ + $(DESTDIR)$(DOCDIR)/examples/diffserv +- @for i in $(SUBDIRS) doc; do $(MAKE) -C $$i install; done ++ @set -e; for i in $(SUBDIRS) doc; do $(MAKE) -C $$i install; done + install -m 0644 $(shell find etc/iproute2 -type f -maxdepth 1) $(DESTDIR)$(CONFDIR) + install -m 0755 -d $(DESTDIR)$(MANDIR)/man8 + install -m 0644 $(shell find man/man8 -type f -maxdepth 1) $(DESTDIR)$(MANDIR)/man8 +@@ -53,7 +53,7 @@ + ln -sf $(MANDIR)/man8/tc-pbfifo.8 $(DESTDIR)$(MANDIR)/man8/tc-pfifo.8 + + clean: +- @for i in $(SUBDIRS) doc; \ ++ @set -e; for i in $(SUBDIRS) doc; \ + do $(MAKE) $(MFLAGS) -C $$i clean; done + + clobber: clean +--- iproute-20041019.orig/include/linux/pkt_sched.h ++++ iproute-20041019/include/linux/pkt_sched.h +@@ -1,3 +1,409 @@ ++#if 0 ++#ifndef __LINUX_PKT_SCHED_H ++#define __LINUX_PKT_SCHED_H ++ ++/* Logical priority bands not depending on specific packet scheduler. ++ Every scheduler will map them to real traffic classes, if it has ++ no more precise mechanism to classify packets. ++ ++ These numbers have no special meaning, though their coincidence ++ with obsolete IPv6 values is not occasional :-). New IPv6 drafts ++ preferred full anarchy inspired by diffserv group. ++ ++ Note: TC_PRIO_BESTEFFORT does not mean that it is the most unhappy ++ class, actually, as rule it will be handled with more care than ++ filler or even bulk. ++ */ ++ ++#define TC_PRIO_BESTEFFORT 0 ++#define TC_PRIO_FILLER 1 ++#define TC_PRIO_BULK 2 ++#define TC_PRIO_INTERACTIVE_BULK 4 ++#define TC_PRIO_INTERACTIVE 6 ++#define TC_PRIO_CONTROL 7 ++ ++#define TC_PRIO_MAX 15 ++ ++/* Generic queue statistics, available for all the elements. ++ Particular schedulers may have also their private records. ++ */ ++ ++struct tc_stats ++{ ++ __u64 bytes; /* NUmber of enqueues bytes */ ++ __u32 packets; /* Number of enqueued packets */ ++ __u32 drops; /* Packets dropped because of lack of resources */ ++ __u32 overlimits; /* Number of throttle events when this ++ * flow goes out of allocated bandwidth */ ++ __u32 bps; /* Current flow byte rate */ ++ __u32 pps; /* Current flow packet rate */ ++ __u32 qlen; ++ __u32 backlog; ++#ifdef __KERNEL__ ++ spinlock_t *lock; ++#endif ++}; ++ ++struct tc_estimator ++{ ++ char interval; ++ unsigned char ewma_log; ++}; ++ ++/* "Handles" ++ --------- ++ ++ All the traffic control objects have 32bit identifiers, or "handles". ++ ++ They can be considered as opaque numbers from user API viewpoint, ++ but actually they always consist of two fields: major and ++ minor numbers, which are interpreted by kernel specially, ++ that may be used by applications, though not recommended. ++ ++ F.e. qdisc handles always have minor number equal to zero, ++ classes (or flows) have major equal to parent qdisc major, and ++ minor uniquely identifying class inside qdisc. ++ ++ Macros to manipulate handles: ++ */ ++ ++#define TC_H_MAJ_MASK (0xFFFF0000U) ++#define TC_H_MIN_MASK (0x0000FFFFU) ++#define TC_H_MAJ(h) ((h)&TC_H_MAJ_MASK) ++#define TC_H_MIN(h) ((h)&TC_H_MIN_MASK) ++#define TC_H_MAKE(maj,min) (((maj)&TC_H_MAJ_MASK)|((min)&TC_H_MIN_MASK)) ++ ++#define TC_H_UNSPEC (0U) ++#define TC_H_ROOT (0xFFFFFFFFU) ++#define TC_H_INGRESS (0xFFFFFFF1U) ++ ++struct tc_ratespec ++{ ++ unsigned char cell_log; ++ unsigned char __reserved; ++ unsigned short feature; ++ short addend; ++ unsigned short mpu; ++ __u32 rate; ++}; ++ ++/* FIFO section */ ++ ++struct tc_fifo_qopt ++{ ++ __u32 limit; /* Queue length: bytes for bfifo, packets for pfifo */ ++}; ++ ++/* PRIO section */ ++ ++#define TCQ_PRIO_BANDS 16 ++ ++struct tc_prio_qopt ++{ ++ int bands; /* Number of bands */ ++ __u8 priomap[TC_PRIO_MAX+1]; /* Map: logical priority -> PRIO band */ ++}; ++ ++/* CSZ section */ ++ ++struct tc_csz_qopt ++{ ++ int flows; /* Maximal number of guaranteed flows */ ++ unsigned char R_log; /* Fixed point position for round number */ ++ unsigned char delta_log; /* Log of maximal managed time interval */ ++ __u8 priomap[TC_PRIO_MAX+1]; /* Map: logical priority -> CSZ band */ ++}; ++ ++struct tc_csz_copt ++{ ++ struct tc_ratespec slice; ++ struct tc_ratespec rate; ++ struct tc_ratespec peakrate; ++ __u32 limit; ++ __u32 buffer; ++ __u32 mtu; ++}; ++ ++enum ++{ ++ TCA_CSZ_UNSPEC, ++ TCA_CSZ_PARMS, ++ TCA_CSZ_RTAB, ++ TCA_CSZ_PTAB, ++}; ++ ++/* TBF section */ ++ ++struct tc_tbf_qopt ++{ ++ struct tc_ratespec rate; ++ struct tc_ratespec peakrate; ++ __u32 limit; ++ __u32 buffer; ++ __u32 mtu; ++}; ++ ++enum ++{ ++ TCA_TBF_UNSPEC, ++ TCA_TBF_PARMS, ++ TCA_TBF_RTAB, ++ TCA_TBF_PTAB, ++}; ++ ++ ++/* TEQL section */ ++ ++/* TEQL does not require any parameters */ ++ ++/* SFQ section */ ++ ++struct tc_sfq_qopt ++{ ++ unsigned quantum; /* Bytes per round allocated to flow */ ++ int perturb_period; /* Period of hash perturbation */ ++ __u32 limit; /* Maximal packets in queue */ ++ unsigned divisor; /* Hash divisor */ ++ unsigned flows; /* Maximal number of flows */ ++}; ++ ++/* ++ * NOTE: limit, divisor and flows are hardwired to code at the moment. ++ * ++ * limit=flows=128, divisor=1024; ++ * ++ * The only reason for this is efficiency, it is possible ++ * to change these parameters in compile time. ++ */ ++ ++/* RED section */ ++ ++enum ++{ ++ TCA_RED_UNSPEC, ++ TCA_RED_PARMS, ++ TCA_RED_STAB, ++}; ++ ++struct tc_red_qopt ++{ ++ __u32 limit; /* HARD maximal queue length (bytes) */ ++ __u32 qth_min; /* Min average length threshold (bytes) */ ++ __u32 qth_max; /* Max average length threshold (bytes) */ ++ unsigned char Wlog; /* log(W) */ ++ unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ ++ unsigned char Scell_log; /* cell size for idle damping */ ++ unsigned char flags; ++#define TC_RED_ECN 1 ++}; ++ ++struct tc_red_xstats ++{ ++ __u32 early; /* Early drops */ ++ __u32 pdrop; /* Drops due to queue limits */ ++ __u32 other; /* Drops due to drop() calls */ ++ __u32 marked; /* Marked packets */ ++}; ++ ++/* GRED section */ ++ ++#define MAX_DPs 16 ++ ++enum ++{ ++ TCA_GRED_UNSPEC, ++ TCA_GRED_PARMS, ++ TCA_GRED_STAB, ++ TCA_GRED_DPS, ++}; ++ ++#define TCA_SET_OFF TCA_GRED_PARMS ++struct tc_gred_qopt ++{ ++ __u32 limit; /* HARD maximal queue length (bytes) ++*/ ++ __u32 qth_min; /* Min average length threshold (bytes) ++*/ ++ __u32 qth_max; /* Max average length threshold (bytes) ++*/ ++ __u32 DP; /* upto 2^32 DPs */ ++ __u32 backlog; ++ __u32 qave; ++ __u32 forced; ++ __u32 early; ++ __u32 other; ++ __u32 pdrop; ++ ++ unsigned char Wlog; /* log(W) */ ++ unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ ++ unsigned char Scell_log; /* cell size for idle damping */ ++ __u8 prio; /* prio of this VQ */ ++ __u32 packets; ++ __u32 bytesin; ++}; ++/* gred setup */ ++struct tc_gred_sopt ++{ ++ __u32 DPs; ++ __u32 def_DP; ++ __u8 grio; ++}; ++ ++/* HTB section */ ++#define TC_HTB_NUMPRIO 8 ++#define TC_HTB_MAXDEPTH 8 ++#define TC_HTB_PROTOVER 3 /* the same as HTB and TC's major */ ++ ++struct tc_htb_opt ++{ ++ struct tc_ratespec rate; ++ struct tc_ratespec ceil; ++ __u32 buffer; ++ __u32 cbuffer; ++ __u32 quantum; ++ __u32 level; /* out only */ ++ __u32 prio; ++}; ++struct tc_htb_glob ++{ ++ __u32 version; /* to match HTB/TC */ ++ __u32 rate2quantum; /* bps->quantum divisor */ ++ __u32 defcls; /* default class number */ ++ __u32 debug; /* debug flags */ ++ ++ /* stats */ ++ __u32 direct_pkts; /* count of non shapped packets */ ++}; ++enum ++{ ++ TCA_HTB_UNSPEC, ++ TCA_HTB_PARMS, ++ TCA_HTB_INIT, ++ TCA_HTB_CTAB, ++ TCA_HTB_RTAB, ++}; ++struct tc_htb_xstats ++{ ++ __u32 lends; ++ __u32 borrows; ++ __u32 giants; /* too big packets (rate will not be accurate) */ ++ __u32 tokens; ++ __u32 ctokens; ++}; ++ ++/* CBQ section */ ++ ++#define TC_CBQ_MAXPRIO 8 ++#define TC_CBQ_MAXLEVEL 8 ++#define TC_CBQ_DEF_EWMA 5 ++ ++struct tc_cbq_lssopt ++{ ++ unsigned char change; ++ unsigned char flags; ++#define TCF_CBQ_LSS_BOUNDED 1 ++#define TCF_CBQ_LSS_ISOLATED 2 ++ unsigned char ewma_log; ++ unsigned char level; ++#define TCF_CBQ_LSS_FLAGS 1 ++#define TCF_CBQ_LSS_EWMA 2 ++#define TCF_CBQ_LSS_MAXIDLE 4 ++#define TCF_CBQ_LSS_MINIDLE 8 ++#define TCF_CBQ_LSS_OFFTIME 0x10 ++#define TCF_CBQ_LSS_AVPKT 0x20 ++ __u32 maxidle; ++ __u32 minidle; ++ __u32 offtime; ++ __u32 avpkt; ++}; ++ ++struct tc_cbq_wrropt ++{ ++ unsigned char flags; ++ unsigned char priority; ++ unsigned char cpriority; ++ unsigned char __reserved; ++ __u32 allot; ++ __u32 weight; ++}; ++ ++struct tc_cbq_ovl ++{ ++ unsigned char strategy; ++#define TC_CBQ_OVL_CLASSIC 0 ++#define TC_CBQ_OVL_DELAY 1 ++#define TC_CBQ_OVL_LOWPRIO 2 ++#define TC_CBQ_OVL_DROP 3 ++#define TC_CBQ_OVL_RCLASSIC 4 ++ unsigned char priority2; ++ __u32 penalty; ++}; ++ ++struct tc_cbq_police ++{ ++ unsigned char police; ++ unsigned char __res1; ++ unsigned short __res2; ++}; ++ ++struct tc_cbq_fopt ++{ ++ __u32 split; ++ __u32 defmap; ++ __u32 defchange; ++}; ++ ++struct tc_cbq_xstats ++{ ++ __u32 borrows; ++ __u32 overactions; ++ __s32 avgidle; ++ __s32 undertime; ++}; ++ ++enum ++{ ++ TCA_CBQ_UNSPEC, ++ TCA_CBQ_LSSOPT, ++ TCA_CBQ_WRROPT, ++ TCA_CBQ_FOPT, ++ TCA_CBQ_OVL_STRATEGY, ++ TCA_CBQ_RATE, ++ TCA_CBQ_RTAB, ++ TCA_CBQ_POLICE, ++}; ++ ++#define TCA_CBQ_MAX TCA_CBQ_POLICE ++ ++/* dsmark section */ ++ ++enum { ++ TCA_DSMARK_UNSPEC, ++ TCA_DSMARK_INDICES, ++ TCA_DSMARK_DEFAULT_INDEX, ++ TCA_DSMARK_SET_TC_INDEX, ++ TCA_DSMARK_MASK, ++ TCA_DSMARK_VALUE ++}; ++ ++#define TCA_DSMARK_MAX TCA_DSMARK_VALUE ++ ++/* ATM section */ ++ ++enum { ++ TCA_ATM_UNSPEC, ++ TCA_ATM_FD, /* file/socket descriptor */ ++ TCA_ATM_PTR, /* pointer to descriptor - later */ ++ TCA_ATM_HDR, /* LL header */ ++ TCA_ATM_EXCESS, /* excess traffic class (0 for CLP) */ ++ TCA_ATM_ADDR, /* PVC address (for output only) */ ++ TCA_ATM_STATE /* VC state (ATM_VS_*; for output only) */ ++}; ++ ++#define TCA_ATM_MAX TCA_ATM_STATE ++ ++#endif ++#endif + #ifndef __LINUX_PKT_SCHED_H + #define __LINUX_PKT_SCHED_H + +--- iproute-20010824/ip/iproute.c ++++ iproute-20010824/ip/iproute.c +@@ -57,7 +57,7 @@ + fprintf(stderr, "OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ]\n"); + fprintf(stderr, " [ rtt NUMBER ] [ rttvar NUMBER ]\n"); + fprintf(stderr, " [ window NUMBER] [ cwnd NUMBER ] [ ssthresh REALM ]\n"); +- fprintf(stderr, " [ realms REALM ]\n"); ++ fprintf(stderr, " [ realms REALM ] [ hoplimit NUMBER ] [ initcwnd NUMBER ]\n"); + fprintf(stderr, "TYPE := [ unicast | local | broadcast | multicast | throw |\n"); + fprintf(stderr, " unreachable | prohibit | blackhole | nat ]\n"); + fprintf(stderr, "TABLE_ID := [ local | main | default | all | NUMBER ]\n"); +@@ -481,6 +481,8 @@ + "cwnd", + "advmss", + "reordering", ++ "hoplimit", ++ "initcwnd", + }; + static int hz; + if (mxrta[i] == NULL) +@@ -750,6 +752,30 @@ + invarg("\"reordering\" value is invalid\n", *argv); + rta_addattr32(mxrta, sizeof(mxbuf), RTAX_REORDERING, reord); + #endif ++#ifdef RTAX_HOPLIMIT ++ } else if (strcmp(*argv, "hoplimit") == 0) { ++ unsigned hoplim; ++ NEXT_ARG(); ++ if (strcmp(*argv, "lock") == 0) { ++ mxlock |= (1<&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +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 -Nur old/man/man8/ip.8 new/man/man8/ip.8 +--- old/man/man8/ip.8 2005-01-05 22:40:29.000000000 +0000 ++++ new/man/man8/ip.8 2005-01-05 22:47:03.000000000 +0000 +@@ -1803,6 +1803,8 @@ + .RB "IP Command reference " ip-cref.ps + .br + .RB "IP tunnels " ip-cref.ps ++.br ++.RB http://lartc.org/ + + .SH AUTHOR + +diff -Nur old/man/man8/tc.8 new/man/man8/tc.8 +--- old/man/man8/tc.8 2004-10-19 20:49:02.000000000 +0000 ++++ new/man/man8/tc.8 2005-01-05 22:46:15.000000000 +0000 +@@ -341,7 +341,7 @@ + .BR tc-pfifo (8), + .BR tc-bfifo (8), + .BR tc-pfifo_fast (8), +-.BR tc-filters (8) ++.BR http://lartc.org/ + + .SH AUTHOR + Manpage maintained by bert hubert (ahu@ds9a.nl) +#! /bin/sh -e +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: fixes typo + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +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@ +--- iproute/ip/iptunnel.c.orig 2003-07-10 11:47:06.000000000 +1000 ++++ iproute/ip/iptunnel.c 2003-07-10 11:47:11.000000000 +1000 +@@ -221,7 +221,7 @@ + NEXT_ARG(); + p->i_flags |= GRE_KEY; + if (strchr(*argv, '.')) +- p->o_key = get_addr32(*argv); ++ p->i_key = get_addr32(*argv); + else { + if (get_unsigned(&uval, *argv, 0)<0) { + fprintf(stderr, "invalid value of \"ikey\"\n"); +#! /bin/sh -e +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: add the wrr qdisc scheduler, see #198414 + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi +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 -urN iproute-20041019.orig/include/linux/pkt_sched.h iproute-20041019/include/linux/pkt_sched.h +--- iproute-20041019.orig/include/linux/pkt_sched.h 2005-01-06 00:42:42.000000000 +0100 ++++ iproute-20041019/include/linux/pkt_sched.h 2005-01-06 00:38:06.000000000 +0100 +@@ -837,4 +837,116 @@ + + #define NETEM_DIST_SCALE 8192 + ++/* WRR section */ ++ ++/* Other includes */ ++#include ++ ++// A sub weight and of a class ++// All numbers are represented as parts of (2^64-1). ++struct tc_wrr_class_weight { ++ __u64 val; // Current value (0 is not valid) ++ __u64 decr; // Value pr bytes (2^64-1 is not valid) ++ __u64 incr; // Value pr seconds (2^64-1 is not valid) ++ __u64 min; // Minimal value (0 is not valid) ++ __u64 max; // Minimal value (0 is not valid) ++ ++// The time where the above information was correct: ++ time_t tim; ++}; ++ ++// Packet send when modifying a class: ++struct tc_wrr_class_modf { ++ // Not-valid values are ignored. ++ struct tc_wrr_class_weight weight1; ++ struct tc_wrr_class_weight weight2; ++}; ++ ++// Packet returned when quering a class: ++struct tc_wrr_class_stats { ++ char used; // If this is false the information below is invalid ++ ++ struct tc_wrr_class_modf class_modf; ++ ++ unsigned char addr[ETH_ALEN]; ++ char usemac; // True if addr is a MAC address, else it is an IP address ++ // (this value is only for convience, it is always the same ++ // value as in the qdisc) ++ int heappos; // Current heap position or 0 if not in heap ++ __u64 penal_ls; // Penalty value in heap (ls) ++ __u64 penal_ms; // Penalty value in heap (ms) ++}; ++ ++// Qdisc-wide penalty information (boolean values - 2 not valid) ++struct tc_wrr_qdisc_weight { ++ char weight_mode; // 0=No automatic change to weight ++ // 1=Decrease normally ++ // 2=Also multiply with number of machines ++ // 3=Instead multiply with priority divided ++ // with priority of the other. ++ // -1=no change ++}; ++ ++// Packet send when modifing a qdisc: ++struct tc_wrr_qdisc_modf { ++ // Not-valid values are ignored: ++ struct tc_wrr_qdisc_weight weight1; ++ struct tc_wrr_qdisc_weight weight2; ++}; ++ ++// Packet send when creating a qdisc: ++struct tc_wrr_qdisc_crt { ++ struct tc_wrr_qdisc_modf qdisc_modf; ++ ++ char srcaddr; // 1=lookup source, 0=lookup destination ++ char usemac; // 1=Classify on MAC addresses, 0=classify on IP ++ char usemasq; // 1=Classify based on masqgrading - only valid ++ // if usemac is zero ++ int bands_max; // Maximal number of bands (i.e.: classes) ++ int proxy_maxconn;// If differnt from 0 then we support proxy remapping ++ // of packets. And this is the number of maximal ++ // concurrent proxy connections. ++}; ++ ++// Packet returned when quering a qdisc: ++struct tc_wrr_qdisc_stats { ++ struct tc_wrr_qdisc_crt qdisc_crt; ++ int proxy_curconn; ++ int nodes_in_heap; // Current number of bands wanting to send something ++ int bands_cur; // Current number of bands used (i.e.: MAC/IP addresses seen) ++ int bands_reused; // Number of times this band has been reused. ++ int packets_requed; // Number of times packets have been requeued. ++ __u64 priosum; // Sum of priorities in heap where 1 is 2^32 ++}; ++ ++struct tc_wrr_qdisc_modf_std { ++ // This indicates which of the tc_wrr_qdisc_modf structers this is: ++ char proxy; // 0=This struct ++ ++ // Should we also change a class? ++ char change_class; ++ ++ // Only valid if change_class is false ++ struct tc_wrr_qdisc_modf qdisc_modf; ++ ++ // Only valid if change_class is true: ++ unsigned char addr[ETH_ALEN]; // Class to change (non-used bytes should be 0) ++ struct tc_wrr_class_modf class_modf; // The change ++}; ++ ++// Used for proxyrempping: ++struct tc_wrr_qdisc_modf_proxy { ++ // This indicates which of the tc_wrr_qdisc_modf structers this is: ++ char proxy; // 1=This struct ++ ++ // This is 1 if the proxyremap information should be reset ++ char reset; ++ ++ // changec is the number of elements in changes. ++ int changec; ++ ++ // This is an array of type ProxyRemapBlock: ++ long changes[0]; ++}; ++ + #endif +diff -urN iproute-20041019.orig/tc/Makefile iproute-20041019/tc/Makefile +--- iproute-20041019.orig/tc/Makefile 2004-10-19 22:49:02.000000000 +0200 ++++ iproute-20041019/tc/Makefile 2005-01-06 00:33:47.000000000 +0100 +@@ -10,6 +10,7 @@ + TCMODULES += q_prio.o + TCMODULES += q_tbf.o + TCMODULES += q_cbq.o ++TCMODULES += q_wrr.o + TCMODULES += f_rsvp.o + TCMODULES += f_u32.o + TCMODULES += f_route.o +diff -urN iproute-20041019.orig/tc/q_wrr.c iproute-20041019/tc/q_wrr.c +--- iproute-20041019.orig/tc/q_wrr.c 1970-01-01 01:00:00.000000000 +0100 ++++ iproute-20041019/tc/q_wrr.c 2005-01-06 00:34:06.000000000 +0100 +@@ -0,0 +1,322 @@ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "utils.h" ++#include "tc_util.h" ++ ++#define usage() return(-1) ++ ++// Returns -1 on error ++static int wrr_parse_qdisc_weight(int argc, char** argv, ++ struct tc_wrr_qdisc_modf* opt) { ++ int i; ++ ++ opt->weight1.weight_mode=-1; ++ opt->weight2.weight_mode=-1; ++ ++ for(i=0; iweight1.val=0; ++ modf->weight1.decr=(__u64)-1; ++ modf->weight1.incr=(__u64)-1; ++ modf->weight1.min=0; ++ modf->weight1.max=0; ++ modf->weight2.val=0; ++ modf->weight2.decr=(__u64)-1; ++ modf->weight2.incr=(__u64)-1; ++ modf->weight2.min=0; ++ modf->weight2.max=0; ++ ++ // And read values: ++ for(i=0; i=sizeof(arg)) { ++ fprintf(stderr,"Argument too long: %s\n",argv[i]); ++ return -1; ++ } ++ strcpy(arg,argv[i]); ++ ++ name=strtok(arg,"="); ++ if(name) value1=strtok(0,"/"); ++ if(value1) value2=strtok(0,""); ++ ++ if(!value1) { ++ fprintf(stderr,"No = found in argument: %s\n",argv[i]); ++ return -1; ++ } ++ ++ f_val1=atof(value1); ++ if(value2) f_val2=atof(value2); ++ ++ if(f_val2==0) { ++ fprintf(stderr,"Division by 0\n"); ++ return -1; ++ } ++ ++ value=f_val1/f_val2; ++ if(value>1) value=1; ++ if(value<0) value=0; ++ value*=((__u64)-1); ++ ++ // And find the value set ++ if(!strcmp(name,"weight1")) modf->weight1.val=value; ++ else if(!strcmp(name,"decr1")) modf->weight1.decr=value; ++ else if(!strcmp(name,"incr1")) modf->weight1.incr=value; ++ else if(!strcmp(name,"min1")) modf->weight1.min=value; ++ else if(!strcmp(name,"max1")) modf->weight1.max=value; ++ else if(!strcmp(name,"weight2")) modf->weight2.val=value; ++ else if(!strcmp(name,"decr2")) modf->weight2.decr=value; ++ else if(!strcmp(name,"incr2")) modf->weight2.incr=value; ++ else if(!strcmp(name,"min2")) modf->weight2.min=value; ++ else if(!strcmp(name,"max2")) modf->weight2.max=value; ++ else { ++ fprintf(stderr,"illegal value: %s\n",name); ++ return -1; ++ } ++ } ++ ++ return 0; ++} ++ ++static int wrr_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n) ++{ ++ if(n->nlmsg_flags & NLM_F_CREATE) { ++ // This is a create request: ++ struct tc_wrr_qdisc_crt opt; ++ ++ int sour,dest,ip,mac,masq; ++ ++ if(argc<4) { ++ fprintf(stderr, "Usage: ... wrr sour|dest ip|masq|mac maxclasses proxymaxcon [penalty-setup]\n"); ++ return -1; ++ } ++ ++ // Read sour/dest: ++ memset(&opt,0,sizeof(opt)); ++ sour=!strcmp(argv[0],"sour"); ++ dest=!strcmp(argv[0],"dest"); ++ ++ if(!sour && !dest) { ++ fprintf(stderr,"sour or dest must be specified\n"); ++ return -1; ++ } ++ ++ // Read ip/mac ++ ip=!strcmp(argv[1],"ip"); ++ mac=!strcmp(argv[1],"mac"); ++ masq=!strcmp(argv[1],"masq"); ++ ++ if(!ip && !mac && !masq) { ++ fprintf(stderr,"ip, masq or mac must be specified\n"); ++ return -1; ++ } ++ ++ opt.srcaddr=sour; ++ opt.usemac=mac; ++ opt.usemasq=masq; ++ opt.bands_max=atoi(argv[2]); ++ ++ opt.proxy_maxconn=atoi(argv[3]); ++ ++ // Read weights: ++ if(wrr_parse_qdisc_weight(argc-4,argv+4,&opt.qdisc_modf)<0) return -1; ++ if(opt.qdisc_modf.weight1.weight_mode==-1) opt.qdisc_modf.weight1.weight_mode=0; ++ if(opt.qdisc_modf.weight2.weight_mode==-1) opt.qdisc_modf.weight2.weight_mode=0; ++ ++ addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt)); ++ } else { ++ struct tc_wrr_qdisc_modf_std opt; ++ char qdisc,class; ++ ++ // This is a modify request: ++ if(argc<1) { ++ fprintf(stderr,"... qdisc ... or ... class ...\n"); ++ return -1; ++ } ++ ++ qdisc=!strcmp(argv[0],"qdisc"); ++ class=!strcmp(argv[0],"class"); ++ ++ if(!qdisc && !class) { ++ fprintf(stderr,"qdisc or class must be specified\n"); ++ return -1; ++ } ++ ++ argc--; ++ argv++; ++ ++ opt.proxy=0; ++ ++ if(qdisc) { ++ opt.change_class=0; ++ if(wrr_parse_qdisc_weight(argc, argv, &opt.qdisc_modf)<0) return -1; ++ } else { ++ int a0,a1,a2,a3,a4=0,a5=0; ++ ++ opt.change_class=1; ++ ++ if(argc<1) { ++ fprintf(stderr,"... || ...\n"); ++ return -1; ++ } ++ memset(opt.addr,0,sizeof(opt.addr)); ++ ++ if((sscanf(argv[0],"%i.%i.%i.%i",&a0,&a1,&a2,&a3)!=4) && ++ (sscanf(argv[0],"%x:%x:%x:%x:%x:%x",&a0,&a1,&a2,&a3,&a4,&a5)!=6)) { ++ fprintf(stderr,"Wrong format of mac or ip address\n"); ++ return -1; ++ } ++ ++ opt.addr[0]=a0; opt.addr[1]=a1; opt.addr[2]=a2; ++ opt.addr[3]=a3; opt.addr[4]=a4; opt.addr[5]=a5; ++ ++ if(wrr_parse_class_modf(argc-1, argv+1, &opt.class_modf)<0) return -1; ++ } ++ ++ addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt)); ++ } ++ return 0; ++} ++ ++static int wrr_parse_copt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n) { ++ struct tc_wrr_class_modf opt; ++ ++ memset(&opt,0,sizeof(opt)); ++ if(wrr_parse_class_modf(argc,argv,&opt)<0) return -1; ++ ++ addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt)); ++ return 0; ++} ++ ++static int wrr_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) ++{ ++ struct tc_wrr_qdisc_stats *qopt; ++ ++ if (opt == NULL) ++ return 0; ++ ++ if (RTA_PAYLOAD(opt) < sizeof(*qopt)) ++ return -1; ++ qopt = RTA_DATA(opt); ++ ++ fprintf(f,"\n (%s/%s) (maxclasses %i) (usedclasses %i) (reused classes %i)\n", ++ qopt->qdisc_crt.srcaddr ? "sour" : "dest", ++ qopt->qdisc_crt.usemac ? "mac" : (qopt->qdisc_crt.usemasq ? "masq" : "ip"), ++ qopt->qdisc_crt.bands_max, ++ qopt->bands_cur, ++ qopt->bands_reused ++ ); ++ ++ if(qopt->qdisc_crt.proxy_maxconn) { ++ fprintf(f," (proxy maxcon %i) (proxy curcon %i)\n", ++ qopt->qdisc_crt.proxy_maxconn,qopt->proxy_curconn); ++ } ++ ++ fprintf(f," (waiting classes %i) (packets requeued %i) (priosum: %Lg)\n", ++ qopt->nodes_in_heap, ++ qopt->packets_requed, ++ qopt->priosum/((long double)((__u32)-1)) ++ ); ++ ++ fprintf(f," (wmode1 %i) (wmode2 %i) \n", ++ qopt->qdisc_crt.qdisc_modf.weight1.weight_mode, ++ qopt->qdisc_crt.qdisc_modf.weight2.weight_mode); ++ ++ return 0; ++} ++ ++static int wrr_print_copt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) { ++ struct tc_wrr_class_stats *copt; ++ long double d=(__u64)-1; ++ ++ if (opt == NULL) return 0; ++ ++ if (RTA_PAYLOAD(opt) < sizeof(*copt)) ++ return -1; ++ copt = RTA_DATA(opt); ++ ++ if(!copt->used) { ++ fprintf(f,"(unused)"); ++ return 0; ++ } ++ ++ if(copt->usemac) { ++ fprintf(f,"\n (address: %.2X:%.2X:%.2X:%.2X:%.2X:%.2X)\n", ++ copt->addr[0],copt->addr[1],copt->addr[2], ++ copt->addr[3],copt->addr[4],copt->addr[5]); ++ } else { ++ fprintf(f,"\n (address: %i.%i.%i.%i)\n",copt->addr[0],copt->addr[1],copt->addr[2],copt->addr[3]); ++ } ++ ++ fprintf(f," (total weight: %Lg) (current position: %i) (counters: %u %u : %u %u)\n", ++ (copt->class_modf.weight1.val/d)*(copt->class_modf.weight2.val/d), ++ copt->heappos, ++ (unsigned)(copt->penal_ms>>32), ++ (unsigned)(copt->penal_ms & 0xffffffffU), ++ (unsigned)(copt->penal_ls>>32), ++ (unsigned)(copt->penal_ls & 0xffffffffU) ++ ); ++ ++ fprintf(f," Pars 1: (weight %Lg) (decr: %Lg) (incr: %Lg) (min: %Lg) (max: %Lg)\n", ++ copt->class_modf.weight1.val/d, ++ copt->class_modf.weight1.decr/d, ++ copt->class_modf.weight1.incr/d, ++ copt->class_modf.weight1.min/d, ++ copt->class_modf.weight1.max/d); ++ ++ fprintf(f," Pars 2: (weight %Lg) (decr: %Lg) (incr: %Lg) (min: %Lg) (max: %Lg)", ++ copt->class_modf.weight2.val/d, ++ copt->class_modf.weight2.decr/d, ++ copt->class_modf.weight2.incr/d, ++ copt->class_modf.weight2.min/d, ++ copt->class_modf.weight2.max/d); ++ ++ return 0; ++} ++ ++static int wrr_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats) ++{ ++ return 0; ++} ++ ++ ++struct qdisc_util wrr_qdisc_util = { ++ .id = "wrr", ++ .parse_qopt = wrr_parse_opt, ++ .print_qopt = wrr_print_opt, ++ .print_xstats = wrr_print_xstats, ++ .parse_copt = wrr_parse_copt, ++ .print_copt = wrr_print_copt ++}; diff --git a/openwrt/package/iproute2/patches/iproute2-ipxfrm_no_sctp.patch b/openwrt/package/iproute2/patches/iproute2-ipxfrm_no_sctp.patch new file mode 100644 index 0000000000..b35b72df77 --- /dev/null +++ b/openwrt/package/iproute2/patches/iproute2-ipxfrm_no_sctp.patch @@ -0,0 +1,18 @@ +--- iproute2-2.6.9.old/ip/ipxfrm.c 2005-01-30 19:09:32.000000000 +0100 ++++ iproute2-2.6.9/ip/ipxfrm.c 2005-01-30 19:10:31.000000000 +0100 +@@ -392,7 +392,6 @@ + switch (sel->proto) { + case IPPROTO_TCP: + case IPPROTO_UDP: +- case IPPROTO_SCTP: + default: /* XXX */ + if (sel->sport_mask) + fprintf(fp, "sport %u ", ntohs(sel->sport)); +@@ -787,7 +786,6 @@ + switch (sel->proto) { + case IPPROTO_TCP: + case IPPROTO_UDP: +- case IPPROTO_SCTP: + break; + default: + fprintf(stderr, "\"sport\" and \"dport\" are invalid with proto=%s\n", strxf_proto(sel->proto)); diff --git a/openwrt/package/iproute2/patches/iproute2-tc-make-fix.patch b/openwrt/package/iproute2/patches/iproute2-tc-make-fix.patch new file mode 100644 index 0000000000..322c2bc833 --- /dev/null +++ b/openwrt/package/iproute2/patches/iproute2-tc-make-fix.patch @@ -0,0 +1,11 @@ +--- iproute-2.6.9.old/tc/Makefile 2005-01-30 18:53:59.000000000 +0100 ++++ iproute-2.6.9/tc/Makefile 2005-01-30 18:54:07.000000000 +0100 +@@ -52,7 +52,7 @@ + ./$* >$@ + rm $* + +-all: libtc.a tc $(TCSO) $(NETEM_DIST) ++all: libtc.a tc $(TCSO) + + tc: $(TCOBJ) $(LIBNETLINK) $(LIBUTIL) $(TCLIB) + diff --git a/openwrt/package/iproute2/tc.control b/openwrt/package/iproute2/tc.control new file mode 100644 index 0000000000..387cbd9427 --- /dev/null +++ b/openwrt/package/iproute2/tc.control @@ -0,0 +1,9 @@ +Package: tc +Architecture: mipsel +Version: 2.6.9 +Section: net +Priority: optional +Maintainer: Felix Fietkau +Source: buildroot internal +Description: iproute2 traffic control utility +Depends: kmod-sched diff --git a/openwrt/package/iptables/Config.in b/openwrt/package/iptables/Config.in index 11fdc5ecd7..1244f10912 100644 --- a/openwrt/package/iptables/Config.in +++ b/openwrt/package/iptables/Config.in @@ -1,7 +1,24 @@ config BR2_PACKAGE_IPTABLES - bool "iptables" + tristate "iptables" default y help Linux kernel (2.4+) firewall, NAT, and packet mangling tools. http://www.iptables.org/ + +config BR2_PACKAGE_IPTABLES_EXTRA + tristate "extra modules" + default m + depends BR2_PACKAGE_IPTABLES + help + Extra modules for iptables (kernel and user space) + +config BR2_PACKAGE_IP6TABLES + tristate "ip6tables" + default m + depends BR2_PACKAGE_IPTABLES + select BR2_PACKAGE_KMOD_IPV6 + help + IPv6 firewalling + + diff --git a/openwrt/package/iptables/Makefile b/openwrt/package/iptables/Makefile new file mode 100644 index 0000000000..1a0c385f3f --- /dev/null +++ b/openwrt/package/iptables/Makefile @@ -0,0 +1,97 @@ +include $(TOPDIR)/rules.mk +include kernelconfig.mk + +PKG_NAME := iptables +PKG_VERSION := 1.2.11 +PKG_RELEASE := 1 + +PKG_SOURCE_SITE := http://www.netfilter.org/files +PKG_SOURCE_FILE := $(PKG_NAME)-$(PKG_VERSION).tar.bz2 +PKG_SOURCE_CAT := bzcat +PKG_SOURCE_DIR := $(PKG_NAME)-$(PKG_VERSION) + +PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_SOURCE_DIR) + +PKG_IPT := $(PACKAGE_DIR)/iptables_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk +PKG_IPT_EXTRA := $(PACKAGE_DIR)/iptables-extra_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk +PKG_IP6T := $(PACKAGE_DIR)/ip6tables_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk + +I_IPT := $(PKG_BUILD_DIR)/ipkg/iptables +I_IPT_EXTRA := $(PKG_BUILD_DIR)/ipkg/iptables-extra +I_IP6T := $(PKG_BUILD_DIR)/ipkg/ip6tables + +TARGETS := $(PKG_IPT) +ifneq ($(BR2_PACKAGE_IPTABLES_EXTRA),) +TARGETS += $(PKG_IPT_EXTRA) +endif +ifneq ($(BR2_PACKAGE_IP6TABLES),) +TARGETS += $(PKG_IP6T) +endif + +$(DL_DIR)/$(PKG_SOURCE_FILE): + mkdir -p $(DL_DIR) + $(WGET) -P $(DL_DIR) $(PKG_SOURCE_SITE)/$(PKG_SOURCE_FILE) + +$(PKG_BUILD_DIR)/.patched: $(DL_DIR)/$(PKG_SOURCE_FILE) + mkdir -p $(PKG_BUILD_DIR)/modules + $(PKG_SOURCE_CAT) $(DL_DIR)/$(PKG_SOURCE_FILE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + $(PATCH) $(PKG_BUILD_DIR) ./patches + touch $(PKG_BUILD_DIR)/.patched + +$(PKG_BUILD_DIR)/iptables: $(PKG_BUILD_DIR)/.patched + $(TARGET_CONFIGURE_OPTS) \ + $(MAKE) -C $(PKG_BUILD_DIR) \ + KERNEL_DIR=$(LINUX_DIR) PREFIX=/usr \ + CC=$(TARGET_CC) COPT_FLAGS="$(TARGET_CFLAGS)" + +$(PKG_IPT): $(PKG_BUILD_DIR)/iptables + $(SCRIPT_DIR)/make-ipkg-dir.sh $(I_IPT) control/iptables.control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH) + mkdir -p $(I_IPT)/usr/sbin + cp -af $(PKG_BUILD_DIR)/iptables $(I_IPT)/usr/sbin/ + $(STRIP) $(I_IPT)/usr/sbin/iptables + mkdir -p $(I_IPT)/usr/lib/iptables + (cd $(PKG_BUILD_DIR)/extensions; \ + cp $(patsubst %,libipt_%.so,$(ext-y)) $(I_IPT)/usr/lib/iptables) + -$(STRIP) $(I_IPT)/usr/lib/iptables/*.so + mkdir -p $(I_IPT_EXTRA)/$(MODULES_SUBDIR) + cp $(MODULES_DIR)/kernel/net/ipv6/netfilter/*.o $(I_IPT_EXTRA)/$(MODULES_SUBDIR) + mkdir -p $(PACKAGE_DIR) + $(IPKG_BUILD) $(I_IPT) $(PACKAGE_DIR) + +$(PKG_IPT_EXTRA): $(PKG_BUILD_DIR)/iptables + $(SCRIPT_DIR)/make-ipkg-dir.sh $(I_IPT_EXTRA) control/iptables-extra.control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH) + mkdir -p $(I_IPT_EXTRA)/usr/lib/iptables + (cd $(PKG_BUILD_DIR)/extensions; \ + cp $(patsubst %,libipt_%.so,$(ext-m)) $(I_IPT_EXTRA)/usr/lib/iptables) + -$(STRIP) $(I_IPT_EXTRA)/usr/lib/iptables/*.so + mkdir -p $(PACKAGE_DIR) + $(IPKG_BUILD) $(I_IPT_EXTRA) $(PACKAGE_DIR) + +$(PKG_IP6T): $(PKG_BUILD_DIR)/iptables + $(SCRIPT_DIR)/make-ipkg-dir.sh $(I_IP6T) control/ip6tables.control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH) + mkdir -p $(I_IP6T)/usr/sbin + cp -af $(PKG_BUILD_DIR)/ip6tables $(I_IP6T)/usr/sbin/ + $(STRIP) $(I_IP6T)/usr/sbin/ip6tables + mkdir -p $(I_IP6T)/usr/lib/iptables + (cd $(PKG_BUILD_DIR)/extensions; \ + cp libip6t_*.so $(I_IP6T)/usr/lib/iptables) + -$(STRIP) $(I_IP6T)/usr/lib/iptables/*.so + mkdir -p $(PACKAGE_DIR) + $(IPKG_BUILD) $(I_IP6T) $(PACKAGE_DIR) + + +source: $(DL_DIR)/$(PKG_SOURCE_FILE) +prepare: $(PKG_BUILD_DIR)/.patched +compile: $(TARGETS) +install: compile + $(IPKG) install $(PKG_IPT) +ifeq ($(BR2_PACKAGE_IPTABLES_EXTRA),y) + $(IPKG) install $(PKG_IPT_EXTRA) +endif +ifeq ($(BR2_PACKAGE_IP6TABLES),y) + $(IPKG) install $(PKG_IP6T) +endif + +clean: + rm -rf $(PKG_BUILD_DIR) + rm -f $(PKG_IPT) diff --git a/openwrt/package/iptables/control/ip6tables.control b/openwrt/package/iptables/control/ip6tables.control new file mode 100644 index 0000000000..4f7da5645a --- /dev/null +++ b/openwrt/package/iptables/control/ip6tables.control @@ -0,0 +1,9 @@ +Package: ip6tables +Priority: optional +Depends: kmod-ipv6 +Section: net +Version: 1.2.11-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: The netfilter firewalling software for IPv6 diff --git a/openwrt/package/iptables/control/iptables-extra.control b/openwrt/package/iptables/control/iptables-extra.control new file mode 100644 index 0000000000..2ce6044642 --- /dev/null +++ b/openwrt/package/iptables/control/iptables-extra.control @@ -0,0 +1,9 @@ +Package: iptables-extra +Priority: optional +Section: net +Version: 1.2.11-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: Extra plugins for iptables +Depends: kmod-iptables-extra diff --git a/openwrt/package/iptables/control/iptables.control b/openwrt/package/iptables/control/iptables.control new file mode 100644 index 0000000000..09a99b5b04 --- /dev/null +++ b/openwrt/package/iptables/control/iptables.control @@ -0,0 +1,8 @@ +Package: iptables +Priority: optional +Section: net +Version: 1.2.11-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: The netfilter firewalling software for IPv4 diff --git a/openwrt/package/iptables/iptables.mk b/openwrt/package/iptables/iptables.mk deleted file mode 100644 index e343a6122e..0000000000 --- a/openwrt/package/iptables/iptables.mk +++ /dev/null @@ -1,55 +0,0 @@ -############################################################# -# -# 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) - -ifeq ($(strip $(BR2_PACKAGE_IPTABLES)),y) -TARGETS+=iptables -endif diff --git a/openwrt/package/iptables/kernelconfig.mk b/openwrt/package/iptables/kernelconfig.mk new file mode 100644 index 0000000000..b04ba54c22 --- /dev/null +++ b/openwrt/package/iptables/kernelconfig.mk @@ -0,0 +1,35 @@ +include $(LINUX_DIR)/.config + +# translate linux kernel config to filenames +ext-$(CONFIG_IP_NF_MATCH_LIMIT) += limit +ext-$(CONFIG_IP_NF_MATCH_MAC) += mac +ext-$(CONFIG_IP_NF_MATCH_PKTTYPE) += pkttype +ext-$(CONFIG_IP_NF_MATCH_MARK) += mark +ext-$(CONFIG_IP_NF_MATCH_MULTIPORT) += multiport +ext-$(CONFIG_IP_NF_MATCH_TOS) += tos +ext-$(CONFIG_IP_NF_MATCH_RECENT) += recent +ext-$(CONFIG_IP_NF_MATCH_ECN) += ecn +ext-$(CONFIG_IP_NF_MATCH_IPP2P) += ipp2p +ext-$(CONFIG_IP_NF_MATCH_DSCP) += dscp +ext-$(CONFIG_IP_NF_MATCH_AH_ESP) += ah esp +ext-$(CONFIG_IP_NF_MATCH_LENGTH) += length +ext-$(CONFIG_IP_NF_MATCH_TTL) += ttl +ext-$(CONFIG_IP_NF_MATCH_TCPMSS) += tcpmss +ext-$(CONFIG_IP_NF_MATCH_HELPER) += helper +ext-$(CONFIG_IP_NF_MATCH_STATE) += state +ext-$(CONFIG_IP_NF_MATCH_CONNTRACK) += conntrack +ext-$(CONFIG_IP_NF_MATCH_UNCLEAN) += unclean +ext-$(CONFIG_IP_NF_MATCH_OWNER) += owner +ext-$(CONFIG_IP_NF_MATCH_PHYSDEV) += physdev +ext-$(CONFIG_IP_NF_TARGET_MASQUERADE) += MASQUERADE +ext-$(CONFIG_IP_NF_TARGET_REDIRECT) += REDIRECT +ext-$(CONFIG_IP_NF_TARGET_TOS) += TOS +ext-$(CONFIG_IP_NF_TARGET_ECN) += ECN +ext-$(CONFIG_IP_NF_TARGET_DSCP) += DSCP +ext-$(CONFIG_IP_NF_TARGET_MARK) += MARK +ext-$(CONFIG_IP_NF_TARGET_LOG) += LOG +ext-$(CONFIG_IP_NF_TARGET_ULOG) += ULOG +ext-$(CONFIG_IP_NF_TARGET_TCPMSS) += TCPMSS + + + diff --git a/openwrt/package/iptables/patches/ipp2p-0.7.1.patch b/openwrt/package/iptables/patches/ipp2p-0.7.1.patch new file mode 100644 index 0000000000..0da71947bc --- /dev/null +++ b/openwrt/package/iptables/patches/ipp2p-0.7.1.patch @@ -0,0 +1,538 @@ +diff -urN iptables-1.2.11.old/extensions/libipt_ipp2p.c iptables-1.2.11/extensions/libipt_ipp2p.c +--- iptables-1.2.11.old/extensions/libipt_ipp2p.c 1970-01-01 01:00:00.000000000 +0100 ++++ iptables-1.2.11/extensions/libipt_ipp2p.c 2005-03-01 17:49:59.000000000 +0100 +@@ -0,0 +1,482 @@ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++ ++ ++ ++ ++static void ++help(void) ++{ ++ printf( ++ "IPP2P v%s options:\n" ++ " --ipp2p Grab all known p2p packets\n" ++ " --ipp2p-data Identify all known p2p download commands (obsolete)\n\n" ++ " --edk [TCP&UDP] All known eDonkey/eMule/Overnet packets\n" ++ " --dc [TCP] All known Direct Connect packets\n" ++ " --kazaa [TCP&UDP] All known KaZaA packets\n" ++ " --gnu [TCP&UDP] All known Gnutella packets\n" ++ " --bit [TCP&UDP] All known BitTorrent packets\n" ++ " --apple [TCP] All known AppleJuice packets (beta - just a few tests until now)\n" ++ " --winmx [TCP] All known WinMX (beta - need feedback)\n" ++ " --soul [TCP] All known SoulSeek (beta - need feedback!)\n" ++ " --ares [TCP] All known Ares - use with DROP only (beta - need feedback!)\n\n" ++ " --edk-data [TCP] eDonkey/eMule/Overnet download commands (obsolete)\n" ++ " --dc-data [TCP] Direct Connect download command (obsolete)\n" ++ " --kazaa-data [TCP] KaZaA download command (obsolete)\n" ++ " --gnu-data [TCP] Gnutella download command (obsolete)\n" ++ "\nNote that the follwing options will have the same meaning:\n" ++ " '--ipp2p' is equal to '--edk --dc --kazaa --gnu'\n" ++ " '--ipp2p-data' is equal to '--edk-data --dc-data --kazaa-data --gnu-data'\n" ++ "\nIPP2P was intended for TCP only. Due to increasing usage of UDP we needed to change this:\n" ++ " --udp search UDP packets only\n" ++ " --tcp search TCP packets only\n" ++ " --udp --tcp search UDP and TCP packets\n" ++ "\nSee README included with this package for more details or visit http://www.ipp2p.org\n" ++ "\nExamples:\n" ++ " iptables -A FORWARD -m ipp2p --ipp2p -j MARK --set-mark 0x01\n" ++ " iptables -A FORWARD -m ipp2p --udp --kazaa --bit -j DROP\n" ++ " iptables -A FORWARD -m ipp2p --tcp --edk --soul -j DROP\n\n" ++ , IPP2P_VERSION); ++} ++ ++ ++ ++static struct option opts[] = { ++ { "ipp2p", 0, 0, '1' }, ++ { "edk", 0, 0, '2' }, ++ { "ipp2p-data", 0, 0, '3' }, ++ { "kazaa-data", 0, 0, '4' }, ++ { "edk-data", 0, 0, '5' }, ++ { "dc-data", 0, 0, '6' }, ++ { "dc", 0, 0, '7' }, ++ { "gnu-data", 0, 0, '8' }, ++ { "gnu", 0, 0, '9' }, ++ { "kazaa", 0, 0, 'a' }, ++ { "bit", 0, 0, 'b' }, ++ { "apple", 0, 0, 'c' }, ++ { "soul", 0, 0, 'd' }, ++ { "winmx", 0, 0, 'e' }, ++ { "ares", 0, 0, 'f' }, ++ { "debug", 0, 0, 'g' }, ++ { "udp", 0, 0, 'h' }, ++ { "tcp", 0, 0, 'i' }, ++ {0} ++}; ++ ++ ++ ++static void ++init(struct ipt_entry_match *m, unsigned int *nfcache) ++{ ++ struct ipt_p2p_info *info = (struct ipt_p2p_info *)m->data; ++ ++ *nfcache |= NFC_UNKNOWN; ++ ++ /*init the module with default values*/ ++ info->cmd = 0; ++ info->debug = 0; ++ info->proto = IPP2P_PROTO_DEFAULT; ++ ++} ++ ++ ++static int ++parse(int c, char **argv, int invert, unsigned int *flags, ++ const struct ipt_entry *entry, ++ unsigned int *nfcache, ++ struct ipt_entry_match **match) ++{ ++ struct ipt_p2p_info *info = (struct ipt_p2p_info *)(*match)->data; ++ ++ switch (c) { ++ case '1': /*cmd: ipp2p*/ ++ if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p' may only be " ++ "specified once!"); ++ if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p-data' may only be " ++ "specified alone!"); ++ if ((*flags) != 0) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p' may only be " ++ "specified alone!"); ++ if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!"); ++ *flags += SHORT_HAND_IPP2P; ++ info->cmd = *flags; ++ break; ++ ++ case '2': /*cmd: edk*/ ++ if ((*flags & IPP2P_EDK) == IPP2P_EDK) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--edk' may only be " ++ "specified once"); ++ if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p' may only be " ++ "specified alone!"); ++ if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p-data' may only be " ++ "specified alone!"); ++ if ((*flags & IPP2P_DATA_EDK) == IPP2P_DATA_EDK) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: use `--edk' OR `--edk-data' but not both of them!"); ++ if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!"); ++ *flags += IPP2P_EDK; ++ info->cmd = *flags; ++ break; ++ ++ case '3': /*cmd: ipp2p-data*/ ++ if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p-data' may only be " ++ "specified once!"); ++ if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p' may only be " ++ "specified alone!"); ++ if ((*flags) != 0) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p-data' may only be " ++ "specified alone!"); ++ if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!"); ++ *flags += SHORT_HAND_DATA; ++ info->cmd = *flags; ++ break; ++ ++ case '4': /*cmd: kazaa-data*/ ++ if ((*flags & IPP2P_DATA_KAZAA) == IPP2P_DATA_KAZAA) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--kazaa-data' may only be " ++ "specified once!"); ++ if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p' may only be " ++ "specified alone!"); ++ if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p-data' may only be " ++ "specified alone!"); ++ if ((*flags & IPP2P_KAZAA) == IPP2P_KAZAA) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: use `--kazaa' OR `--kazaa-data' but not both of them!"); ++ if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!"); ++ *flags += IPP2P_DATA_KAZAA; ++ info->cmd = *flags; ++ break; ++ ++ case '5': /*cmd: edk-data*/ ++ if ((*flags & IPP2P_DATA_EDK) == IPP2P_DATA_EDK) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--edk-data' may only be " ++ "specified once!"); ++ if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p' may only be " ++ "specified alone!"); ++ if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p-data' may only be " ++ "specified alone!"); ++ if ((*flags & IPP2P_EDK) == IPP2P_EDK) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: use `--edk' OR `--edk-data' but not both of them!"); ++ if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!"); ++ *flags += IPP2P_DATA_EDK; ++ info->cmd = *flags; ++ break; ++ ++ case '6': /*cmd: dc-data*/ ++ if ((*flags & IPP2P_DATA_DC) == IPP2P_DATA_DC) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--dc-data' may only be " ++ "specified once!"); ++ if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p-data' may only be " ++ "specified alone!"); ++ if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p' may only be " ++ "specified alone!"); ++ if ((*flags & IPP2P_DC) == IPP2P_DC) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: use `--dc' OR `--dc-data' but not both of them!"); ++ if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!"); ++ *flags += IPP2P_DATA_DC; ++ info->cmd = *flags; ++ break; ++ ++ case '7': /*cmd: dc*/ ++ if ((*flags & IPP2P_DC) == IPP2P_DC) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--dc' may only be " ++ "specified once!"); ++ if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p' may only be " ++ "specified alone!"); ++ if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p-data' may only be " ++ "specified alone!"); ++ if ((*flags & IPP2P_DATA_DC) == IPP2P_DATA_DC) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: use `--dc' OR `--dc-data' but not both of them!"); ++ if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!"); ++ *flags += IPP2P_DC; ++ info->cmd = *flags; ++ break; ++ ++ ++ case '8': /*cmd: gnu-data*/ ++ if ((*flags & IPP2P_DATA_GNU) == IPP2P_DATA_GNU) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--gnu-data' may only be " ++ "specified once!"); ++ if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p' may only be " ++ "specified alone!"); ++ if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p-data' may only be " ++ "specified alone!"); ++ if ((*flags & IPP2P_GNU) == IPP2P_GNU) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: use `--gnu' OR `--gnu-data' but not both of them!"); ++ if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!"); ++ *flags += IPP2P_DATA_GNU; ++ info->cmd = *flags; ++ break; ++ ++ case '9': /*cmd: gnu*/ ++ if ((*flags & IPP2P_GNU) == IPP2P_GNU) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--gnu' may only be " ++ "specified once!"); ++ if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p-data' may only be " ++ "specified alone!"); ++ if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p' may only be " ++ "specified alone!"); ++ if ((*flags & IPP2P_DATA_GNU) == IPP2P_DATA_GNU) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: use `--gnu' OR `--gnu-data' but not both of them!"); ++ if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!"); ++ *flags += IPP2P_GNU; ++ info->cmd = *flags; ++ break; ++ ++ case 'a': /*cmd: kazaa*/ ++ if ((*flags & IPP2P_KAZAA) == IPP2P_KAZAA) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--kazaa' may only be " ++ "specified once!"); ++ if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p-data' may only be " ++ "specified alone!"); ++ if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ipp2p' may only be " ++ "specified alone!"); ++ if ((*flags & IPP2P_DATA_KAZAA) == IPP2P_DATA_KAZAA) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: use `--kazaa' OR `--kazaa-data' but not both of them!"); ++ if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!"); ++ *flags += IPP2P_KAZAA; ++ info->cmd = *flags; ++ break; ++ ++ case 'b': /*cmd: bit*/ ++ if ((*flags & IPP2P_BIT) == IPP2P_BIT) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--bit' may only be " ++ "specified once!"); ++ if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!"); ++ *flags += IPP2P_BIT; ++ info->cmd = *flags; ++ break; ++ ++ case 'c': /*cmd: apple*/ ++ if ((*flags & IPP2P_APPLE) == IPP2P_APPLE) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--apple' may only be " ++ "specified once!"); ++ if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!"); ++ *flags += IPP2P_APPLE; ++ info->cmd = *flags; ++ break; ++ ++ ++ case 'd': /*cmd: soul*/ ++ if ((*flags & IPP2P_SOUL) == IPP2P_SOUL) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--soul' may only be " ++ "specified once!"); ++ if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!"); ++ *flags += IPP2P_SOUL; ++ info->cmd = *flags; ++ break; ++ ++ ++ case 'e': /*cmd: winmx*/ ++ if ((*flags & IPP2P_WINMX) == IPP2P_WINMX) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--winmx' may only be " ++ "specified once!"); ++ if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!"); ++ *flags += IPP2P_WINMX; ++ info->cmd = *flags; ++ break; ++ ++ case 'f': /*cmd: ares*/ ++ if ((*flags & IPP2P_ARES) == IPP2P_ARES) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: `--ares' may only be " ++ "specified once!"); ++ if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!"); ++ *flags += IPP2P_ARES; ++ info->cmd = *flags; ++ break; ++ ++ case 'g': /*cmd: debug*/ ++ if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!"); ++ info->debug = 1; ++ break; ++ ++ case 'h': /*cmd: udp*/ ++ if ((info->proto & IPP2P_PROTO_UDP) == IPP2P_PROTO_UDP) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: --udp may only be specified once!"); ++ ++ if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!"); ++ info->proto += IPP2P_PROTO_UDP; ++ break; ++ ++ ++ case 'i': /*cmd: tcp*/ ++ if ((info->proto & IPP2P_PROTO_TCP) == IPP2P_PROTO_TCP) ++ exit_error(PARAMETER_PROBLEM, ++ "ipp2p: --tcp may only be specified once!"); ++ if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!"); ++ info->proto += IPP2P_PROTO_TCP; ++ break; ++ ++ ++ default: ++ exit_error(PARAMETER_PROBLEM, ++ "\nipp2p-parameter problem: for ipp2p usage type: iptables -m ipp2p --help\n"); ++ return 0; ++ } ++ return 1; ++} ++ ++ ++static void ++final_check(unsigned int flags) ++{ ++ if (!flags) ++ exit_error(PARAMETER_PROBLEM, ++ "\nipp2p-parameter problem: for ipp2p usage type: iptables -m ipp2p --help\n"); ++} ++ ++ ++ ++static void ++print(const struct ipt_ip *ip, ++ const struct ipt_entry_match *match, ++ int numeric) ++{ ++ struct ipt_p2p_info *info = (struct ipt_p2p_info *)match->data; ++ ++ printf("ipp2p v%s", IPP2P_VERSION); ++ if ((info->cmd & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P) printf(" --ipp2p"); ++ if ((info->cmd & SHORT_HAND_DATA) == SHORT_HAND_DATA) printf(" --ipp2p-data"); ++ if ((info->cmd & IPP2P_KAZAA) == IPP2P_KAZAA) printf(" --kazaa"); ++ if ((info->cmd & IPP2P_DATA_KAZAA) == IPP2P_DATA_KAZAA) printf(" --kazaa-data"); ++ if ((info->cmd & IPP2P_DATA_GNU) == IPP2P_DATA_GNU) printf(" --gnu-data"); ++ if ((info->cmd & IPP2P_GNU) == IPP2P_GNU) printf(" --gnu"); ++ if ((info->cmd & IPP2P_EDK) == IPP2P_EDK) printf(" --edk"); ++ if ((info->cmd & IPP2P_DATA_EDK) == IPP2P_DATA_EDK) printf(" --edk-data"); ++ if ((info->cmd & IPP2P_DATA_DC) == IPP2P_DATA_DC) printf(" --dc-data"); ++ if ((info->cmd & IPP2P_DC) == IPP2P_DC) printf(" --dc"); ++ if ((info->cmd & IPP2P_BIT) == IPP2P_BIT) printf(" --bit"); ++ if ((info->cmd & IPP2P_APPLE) == IPP2P_APPLE) printf(" --apple"); ++ if ((info->cmd & IPP2P_SOUL) == IPP2P_SOUL) printf(" --soul"); ++ if ((info->cmd & IPP2P_WINMX) == IPP2P_WINMX) printf(" --winmx"); ++ if ((info->cmd & IPP2P_ARES) == IPP2P_ARES) printf(" --ares"); ++ if ((info->proto & IPP2P_PROTO_UDP) == IPP2P_PROTO_UDP) printf(" --udp"); ++ if ((info->proto & IPP2P_PROTO_TCP) == IPP2P_PROTO_TCP) printf(" --tcp"); ++ if (info->debug != 0) printf(" --debug"); ++ printf(" "); ++} ++ ++ ++ ++static void ++save(const struct ipt_ip *ip, const struct ipt_entry_match *match) ++{ ++ struct ipt_p2p_info *info = (struct ipt_p2p_info *)match->data; ++ ++ if ((info->cmd & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P) printf("--ipp2p "); ++ if ((info->cmd & SHORT_HAND_DATA) == SHORT_HAND_DATA) printf("--ipp2p-data "); ++ if ((info->cmd & IPP2P_KAZAA) == IPP2P_KAZAA) printf("--kazaa "); ++ if ((info->cmd & IPP2P_DATA_KAZAA) == IPP2P_DATA_KAZAA) printf("--kazaa-data "); ++ if ((info->cmd & IPP2P_DATA_GNU) == IPP2P_DATA_GNU) printf("--gnu-data "); ++ if ((info->cmd & IPP2P_GNU) == IPP2P_GNU) printf("--gnu "); ++ if ((info->cmd & IPP2P_EDK) == IPP2P_EDK) printf("--edk "); ++ if ((info->cmd & IPP2P_DATA_EDK) == IPP2P_DATA_EDK) printf("--edk-data "); ++ if ((info->cmd & IPP2P_DATA_DC) == IPP2P_DATA_DC) printf("--dc-data "); ++ if ((info->cmd & IPP2P_DC) == IPP2P_DC) printf("--dc "); ++ if ((info->cmd & IPP2P_BIT) == IPP2P_BIT) printf("--bit "); ++ if ((info->cmd & IPP2P_APPLE) == IPP2P_APPLE) printf("--apple "); ++ if ((info->cmd & IPP2P_SOUL) == IPP2P_SOUL) printf("--soul "); ++ if ((info->cmd & IPP2P_WINMX) == IPP2P_WINMX) printf("--winmx "); ++ if ((info->cmd & IPP2P_ARES) == IPP2P_ARES) printf("--ares "); ++ if ((info->proto & IPP2P_PROTO_UDP) == IPP2P_PROTO_UDP) printf("--udp "); ++ if ((info->proto & IPP2P_PROTO_TCP) == IPP2P_PROTO_TCP) printf("--tcp "); ++ if (info->debug != 0) printf("--debug "); ++} ++ ++ ++ ++ ++static ++struct iptables_match ipp2p ++= { NULL, ++ "ipp2p", ++ IPTABLES_VERSION, ++ IPT_ALIGN(sizeof(struct ipt_p2p_info)), ++ IPT_ALIGN(sizeof(struct ipt_p2p_info)), ++ &help, ++ &init, ++ &parse, ++ &final_check, ++ &print, ++ &save, ++ opts ++}; ++ ++ ++ ++void _init(void) ++{ ++ register_match(&ipp2p); ++} ++ +diff -urN iptables-1.2.11.old/extensions/Makefile iptables-1.2.11/extensions/Makefile +--- iptables-1.2.11.old/extensions/Makefile 2004-06-17 12:22:54.000000000 +0200 ++++ iptables-1.2.11/extensions/Makefile 2005-03-01 17:51:19.000000000 +0100 +@@ -8,6 +8,10 @@ + PF_EXT_SLIB:=ah connlimit connmark conntrack dscp ecn esp helper icmp iprange length limit mac mark multiport owner physdev pkttype realm rpc sctp standard state tcp tcpmss tos ttl udp unclean CLASSIFY CONNMARK DNAT DSCP ECN LOG MARK MASQUERADE MIRROR NETMAP NOTRACK REDIRECT REJECT SAME SNAT TARPIT TCPMSS TOS TRACE TTL ULOG + PF6_EXT_SLIB:=eui64 hl icmpv6 length limit mac mark multiport owner standard tcp udp HL LOG MARK TRACE + ++ ++# ipp2p ++PF_EXT_SLIB += ipp2p ++ + # Optionals + PF_EXT_SLIB_OPTS:=$(foreach T,$(wildcard extensions/.*-test),$(shell KERNEL_DIR=$(KERNEL_DIR) $(T))) + PF6_EXT_SLIB_OPTS:=$(foreach T,$(wildcard extensions/.*-test6),$(shell KERNEL_DIR=$(KERNEL_DIR) $(T))) +diff -urN iptables-1.2.11.old/include/linux/netfilter_ipv4/ipt_ipp2p.h iptables-1.2.11/include/linux/netfilter_ipv4/ipt_ipp2p.h +--- iptables-1.2.11.old/include/linux/netfilter_ipv4/ipt_ipp2p.h 1970-01-01 01:00:00.000000000 +0100 ++++ iptables-1.2.11/include/linux/netfilter_ipv4/ipt_ipp2p.h 2005-03-01 17:48:03.000000000 +0100 +@@ -0,0 +1,34 @@ ++#ifndef __IPT_IPP2P_H ++#define __IPT_IPP2P_H ++#define IPP2P_VERSION "0.7.1" ++ ++struct ipt_p2p_info { ++ int cmd; ++ int debug; ++ int proto; ++}; ++ ++#endif //__IPT_IPP2P_H ++ ++#define SHORT_HAND_IPP2P 1 /* --ipp2p switch*/ ++#define SHORT_HAND_DATA 4 /* --ipp2p-data switch*/ ++#define SHORT_HAND_NONE 5 /* no short hand*/ ++ ++#define IPP2P_EDK 2 ++#define IPP2P_DATA_KAZAA 8 ++#define IPP2P_DATA_EDK 16 ++#define IPP2P_DATA_DC 32 ++#define IPP2P_DC 64 ++#define IPP2P_DATA_GNU 128 ++#define IPP2P_GNU 256 ++#define IPP2P_KAZAA 512 ++#define IPP2P_BIT 1024 ++#define IPP2P_APPLE 2048 ++#define IPP2P_SOUL 4096 ++#define IPP2P_WINMX 8192 ++#define IPP2P_ARES 16384 ++ ++#define IPP2P_PROTO_DEFAULT 1 ++#define IPP2P_PROTO_UDP 2 ++#define IPP2P_PROTO_TCP 4 ++ diff --git a/openwrt/package/linksys-utils/Config.in b/openwrt/package/linksys-utils/Config.in new file mode 100644 index 0000000000..ed17c2e9ab --- /dev/null +++ b/openwrt/package/linksys-utils/Config.in @@ -0,0 +1,5 @@ +config BR2_PACKAGE_LINKSYS_UTILS + tristate "Linksys binary utilites" + default y + help + Binary-only utilities from Linksys (et, wl, nas) diff --git a/openwrt/package/linksys-utils/Makefile b/openwrt/package/linksys-utils/Makefile new file mode 100644 index 0000000000..7b831570ad --- /dev/null +++ b/openwrt/package/linksys-utils/Makefile @@ -0,0 +1,43 @@ +############################################################# +# +# ebtables +# +############################################################# +include $(TOPDIR)/rules.mk + +PKG_NAME:=linksys-utils +PKG_VERSION:=3.37.6 +PKG_RELEASE:=1 +PKG_SOURCE_URL:=http://mywrt.sourceforge.net/files +PKG_SOURCE:=linksys-utils-$(PKG_VERSION).tar.gz +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) +PKG_CAT:=zcat +PKG_IPK:=$(PACKAGE_DIR)/$(PKG_NAME)_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk +PKG_IPK_DIR:=$(PKG_BUILD_DIR)/ipkg + +$(DL_DIR)/$(PKG_SOURCE): + $(WGET) -P $(DL_DIR) $(PKG_SOURCE_URL)/$(PKG_SOURCE) + +$(PKG_BUILD_DIR)/.unpacked: $(DL_DIR)/$(PKG_SOURCE) + $(PKG_CAT) $(DL_DIR)/$(PKG_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + touch $(PKG_BUILD_DIR)/.unpacked + +$(PKG_IPK): $(PKG_BUILD_DIR)/.unpacked $(PACKAGE_DIR) + $(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_IPK_DIR) $(PKG_NAME).control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH) + mkdir -p $(PKG_IPK_DIR)/usr/sbin + cp $(PKG_BUILD_DIR)/et $(PKG_IPK_DIR)/usr/sbin/ + cp $(PKG_BUILD_DIR)/nas $(PKG_IPK_DIR)/usr/sbin/ + cp $(PKG_BUILD_DIR)/wl $(PKG_IPK_DIR)/usr/sbin/ + $(STRIP) $(PKG_IPK_DIR)/usr/sbin/* + $(IPKG_BUILD) $(PKG_IPK_DIR) $(PACKAGE_DIR) + +$(PACKAGE_DIR): + mkdir -p $(PACKAGE_DIR) + +source: $(DL_DIR)/$(PKG_SOURCE) +prepare: $(PKG_BUILD_DIR)/.unpacked +compile: $(PKG_IPK) +install: + $(IPKG) install $(PKG_IPK) +clean: + rm -rf $(PKG_BUILD_DIR) diff --git a/openwrt/package/linksys-utils/linksys-utils.control b/openwrt/package/linksys-utils/linksys-utils.control new file mode 100644 index 0000000000..620f12674c --- /dev/null +++ b/openwrt/package/linksys-utils/linksys-utils.control @@ -0,0 +1,8 @@ +Package: linksys-utils +Priority: optional +Section: libs +Version: 3.37.6-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: Linksys binary utils (et, wl, nas) diff --git a/openwrt/package/linux/Config.in b/openwrt/package/linux/Config.in index 22809cd7f3..e420f87899 100644 --- a/openwrt/package/linux/Config.in +++ b/openwrt/package/linux/Config.in @@ -1,7 +1,63 @@ -config BR2_PACKAGE_LINUX - bool "linux" - default y +config BR2_PACKAGE_KMOD_ARPT + tristate "ARP firewalling support" + default m help - The Linux kernel. + Kernel modules for ARP firewalling + +config BR2_PACKAGE_KMOD_EBT + tristate "Ethernet Bridge firewalling support" + default m + help + Kernel modules for bridge firewalling + +config BR2_PACKAGE_KMOD_IPT4 + tristate "Extra modules for iptables" + default m + help + Extra kernel modules for IPv4 firewalling + +config BR2_PACKAGE_KMOD_IPV6 + tristate "IPv6 support" + default m + help + Kernel modules for IPv6 protocol support + +config BR2_PACKAGE_KMOD_IPT6 + tristate "Kernel modules for ip6tables" + default m + depends BR2_PACKAGE_KMOD_IPV6 + help + IPv6 firewalling support + +config BR2_PACKAGE_KMOD_USB + tristate "USB/SCSI support" + default m + help + Kernel modules for USB/SCSI support + Includes usb-storage and printer + +config BR2_PACKAGE_KMOD_CRYPTO + tristate "CryptoAPI modules" + default m + help + Kernel modules for cryptographic algorithms + +config BR2_PACKAGE_KMOD_MPPE + tristate "PPP MPPE/MPPC module" + default m + select BR2_PACKAGE_KMOD_CRYPTO + help + Support for Microsoft PPP Encryption/Compression + +config BR2_PACKAGE_KMOD_TUN + tristate "Universal TUN/TAP driver" + default m + help + Kernel support for the TUN/TAP tunneling device + +config BR2_PACKAGE_KMOD_SCHED + tristate "Traffic schedulers" + default m + help + Kernel schedulers for IP traffic - http://www.kernel.org/ diff --git a/openwrt/package/linux/Makefile b/openwrt/package/linux/Makefile new file mode 100644 index 0000000000..90fb5ac77e --- /dev/null +++ b/openwrt/package/linux/Makefile @@ -0,0 +1,74 @@ +include $(TOPDIR)/rules.mk +include ./linux.mk + +PKG_BUILD_DIR := $(BUILD_DIR)/linux-modules +PKG_RELEASE := 1 + +TARGETS := +INSTALL_TARGETS := + +define KMOD_template +PKG_$(1) := $(PACKAGE_DIR)/kmod-$(2)_$(LINUX_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk +I_$(1) := $(PKG_BUILD_DIR)/ipkg/$(2) +ifneq ($(BR2_PACKAGE_KMOD_$(1)),) +TARGETS += $$(PKG_$(1)) +endif +ifeq ($(BR2_PACLAGE_KMOD_$(1)),y) +INSTALL_TARGETS += $$(PKG_$(1)) +endif + +$$(PKG_$(1)): $(LINUX_DIR)/.modules_done + mkdir -p $$(I_$(1))/lib/modules/$(LINUX_VERSION) + $(SCRIPT_DIR)/make-ipkg-dir.sh $$(I_$(1)) control/kmod-$(2).control $(LINUX_VERSION)-$(PKG_RELEASE) $(ARCH) + cp $(3) $$(I_$(1))/lib/modules/$(LINUX_VERSION) + $(IPKG_BUILD) $$(I_$(1)) $(PACKAGE_DIR) + +endef + +$(eval $(call KMOD_template,ARPT,arptables,\ + $(MODULES_DIR)/kernel/net/ipv4/netfilter/arp*.o \ +)) +$(eval $(call KMOD_template,EBT,ebtables,\ + $(MODULES_DIR)/kernel/net/bridge/netfilter/*.o \ +)) +$(eval $(call KMOD_template,IPT4,iptables-extra,\ + $(MODULES_DIR)/kernel/net/ipv4/netfilter/ip*.o \ +)) +$(eval $(call KMOD_template,IPT6,ip6tables,\ + $(MODULES_DIR)/kernel/net/ipv6/netfilter/ip*.o \ +)) +$(eval $(call KMOD_template,IPV6,ipv6,\ + $(MODULES_DIR)/kernel/net/ipv6/ipv6.o \ +)) +$(eval $(call KMOD_template,USB,usb,\ + $(MODULES_DIR)/kernel/drivers/scsi/*.o \ + $(MODULES_DIR)/kernel/drivers/usb/*.o \ + $(MODULES_DIR)/kernel/drivers/usb/*/*.o \ +)) +$(eval $(call KMOD_template,CRYPTO,crypto,\ + $(MODULES_DIR)/kernel/crypto/*.o \ +)) +$(eval $(call KMOD_template,MPPE,mppe,\ + $(MODULES_DIR)/kernel/drivers/net/ppp_mppe_mppc.o \ +)) +$(eval $(call KMOD_template,TUN,tun,\ + $(MODULES_DIR)/kernel/drivers/net/tun.o \ +)) +$(eval $(call KMOD_template,SCHED,sched,\ + $(MODULES_DIR)/kernel/net/sched/*.o \ +)) + +$(TARGETS): $(PACKAGE_DIR) + +$(PACKAGE_DIR): + mkdir -p $(PACKAGE_DIR) + +source: linux-source +prepare: $(LINUX_DIR)/.configured +compile: $(LINUX_DIR)/.modules_done $(TARGETS) + +install: compile $(TARGET_MODULES_DIR) + @[ "$(INSTALL_TARGETS)" != "" ] && $(IPKG) install $(INSTALL_TARGETS) || true + +clean: linux-dirclean + rm -f $(TARGETS) diff --git a/openwrt/package/linux/control/kmod-arptables.control b/openwrt/package/linux/control/kmod-arptables.control new file mode 100644 index 0000000000..0ce3feec49 --- /dev/null +++ b/openwrt/package/linux/control/kmod-arptables.control @@ -0,0 +1,8 @@ +Package: kmod-arptables +Priority: optional +Section: net +Version: 2.4.29-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: ARP firewalling kernel modules diff --git a/openwrt/package/linux/control/kmod-crypto.control b/openwrt/package/linux/control/kmod-crypto.control new file mode 100644 index 0000000000..01834bcd56 --- /dev/null +++ b/openwrt/package/linux/control/kmod-crypto.control @@ -0,0 +1,8 @@ +Package: kmod-crypto +Priority: optional +Section: sys +Version: 2.4.29-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: CryptoAPI kernel modules diff --git a/openwrt/package/linux/control/kmod-ebtables.control b/openwrt/package/linux/control/kmod-ebtables.control new file mode 100644 index 0000000000..011c7fe9aa --- /dev/null +++ b/openwrt/package/linux/control/kmod-ebtables.control @@ -0,0 +1,8 @@ +Package: kmod-ebtables +Priority: optional +Section: net +Version: 2.4.29-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: Ethernet bridge firewalling kernel modules diff --git a/openwrt/package/linux/control/kmod-ip6tables.control b/openwrt/package/linux/control/kmod-ip6tables.control new file mode 100644 index 0000000000..12153ea80d --- /dev/null +++ b/openwrt/package/linux/control/kmod-ip6tables.control @@ -0,0 +1,9 @@ +Package: kmod-ip6tables +Priority: optional +Section: net +Version: 2.4.29-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: Kernel modules for ip6tables +Depends: kmod-ipv6 diff --git a/openwrt/package/linux/control/kmod-iptables-extra.control b/openwrt/package/linux/control/kmod-iptables-extra.control new file mode 100644 index 0000000000..7adbd95272 --- /dev/null +++ b/openwrt/package/linux/control/kmod-iptables-extra.control @@ -0,0 +1,8 @@ +Package: kmod-iptables-extra +Priority: optional +Section: net +Version: 2.4.29-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: Extra kernel modules for iptables diff --git a/openwrt/package/linux/control/kmod-ipv6.control b/openwrt/package/linux/control/kmod-ipv6.control new file mode 100644 index 0000000000..ff14fc988b --- /dev/null +++ b/openwrt/package/linux/control/kmod-ipv6.control @@ -0,0 +1,8 @@ +Package: kmod-ipv6 +Priority: optional +Section: net +Version: 2.4.29-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: Kernel modules for the IPv6 protocol diff --git a/openwrt/package/linux/control/kmod-mppe.control b/openwrt/package/linux/control/kmod-mppe.control new file mode 100644 index 0000000000..a3c286a017 --- /dev/null +++ b/openwrt/package/linux/control/kmod-mppe.control @@ -0,0 +1,8 @@ +Package: kmod-mppe +Priority: optional +Section: net +Version: 2.4.29-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: Microsoft PPP Encryption/Compression support diff --git a/openwrt/package/linux/control/kmod-sched.control b/openwrt/package/linux/control/kmod-sched.control new file mode 100644 index 0000000000..00cff6e44e --- /dev/null +++ b/openwrt/package/linux/control/kmod-sched.control @@ -0,0 +1,8 @@ +Package: kmod-sched +Priority: optional +Section: sys +Version: 2.4.29-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: Kernel schedulers for IP traffic diff --git a/openwrt/package/linux/control/kmod-tun.control b/openwrt/package/linux/control/kmod-tun.control new file mode 100644 index 0000000000..551d41e407 --- /dev/null +++ b/openwrt/package/linux/control/kmod-tun.control @@ -0,0 +1,8 @@ +Package: kmod-tun +Priority: optional +Section: sys +Version: 2.4.29-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: Kernel TUN/TAP extension diff --git a/openwrt/package/linux/control/kmod-usb.control b/openwrt/package/linux/control/kmod-usb.control new file mode 100644 index 0000000000..ceda8ea7ae --- /dev/null +++ b/openwrt/package/linux/control/kmod-usb.control @@ -0,0 +1,8 @@ +Package: kmod-usb +Priority: optional +Section: sys +Version: 2.4.29-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: Kernel modules for USB/SCSI support diff --git a/openwrt/package/linux/kernel-patches/105-makefile-mkdep-fix.bz2 b/openwrt/package/linux/kernel-patches/105-makefile-mkdep-fix.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..aab973feb60452f5cdf74a8e68f93d5be1805caf GIT binary patch literal 445 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 GOmBJT|Fb6m literal 0 HcmV?d00001 diff --git a/openwrt/package/linux/linux.config b/openwrt/package/linux/linux.config index 761906ae5d..e5f449383f 100644 --- a/openwrt/package/linux/linux.config +++ b/openwrt/package/linux/linux.config @@ -324,6 +324,7 @@ CONFIG_IP_NF_QUEUE=m CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_LIMIT=m CONFIG_IP_NF_MATCH_MAC=m +CONFIG_IP_NF_MATCH_IPP2P=m CONFIG_IP_NF_MATCH_PKTTYPE=m CONFIG_IP_NF_MATCH_MARK=y CONFIG_IP_NF_MATCH_MULTIPORT=y @@ -829,7 +830,7 @@ 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_DEVPTS_FS=y # CONFIG_QNX4FS_FS is not set # CONFIG_QNX4FS_RW is not set # CONFIG_ROMFS_FS is not set diff --git a/openwrt/package/linux/linux.mk b/openwrt/package/linux/linux.mk index 6e3f7a4d27..15d401fcf3 100644 --- a/openwrt/package/linux/linux.mk +++ b/openwrt/package/linux/linux.mk @@ -11,7 +11,6 @@ # 4xx patches needed to integrate feature patches # ############################################################# -ifneq ($(filter $(TARGETS),linux),) LINUX_FORMAT=zImage LINUX_KARCH:=$(shell echo $(ARCH) | sed -e 's/i[3-9]86/i386/' \ @@ -20,16 +19,13 @@ LINUX_KARCH:=$(shell echo $(ARCH) | sed -e 's/i[3-9]86/i386/' \ -e 's/sh[234]/sh/' \ ) -LINUX_VERSION=2.4.29 -LINUX_DIR=$(BUILD_DIR)/linux-$(LINUX_VERSION) LINUX_SITE=http://www.kernel.org/pub/linux/kernel/v2.4 LINUX_SOURCE=linux-$(LINUX_VERSION).tar.bz2 -LINUX_KCONFIG=package/linux/linux.config -LINUX_KERNEL=$(BUILD_DIR)/buildroot-kernel -LINUX_PATCHES=$(PACKAGE_DIR)/linux/kernel-patches +LINUX_KCONFIG=./linux.config +LINUX_PATCHES=./kernel-patches LINUX_BINLOC=arch/$(LINUX_KARCH)/brcm-boards/bcm947xx/compressed/vmlinuz # Used by pcmcia-cs and others -LINUX_SOURCE_DIR=$(LINUX_DIR) +LINUX_SOURCE_DIR=$(LINUX_DIR)-$(LINUX_VERSION) # kernel stuff extracted from linksys firmware GPL sourcetree # WRT54GS_3_37_2_1109_US (shared,include,wl,et) @@ -46,17 +42,24 @@ $(LINUX_DIR)/.unpacked: $(DL_DIR)/$(LINUX_SOURCE) $(DL_DIR)/$(LINKSYS_KERNEL_TGZ bzcat $(DL_DIR)/$(LINUX_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - # extract linksys binary kernel stuff and include/shared files zcat $(DL_DIR)/$(LINKSYS_KERNEL_TGZ) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + ln -sf $(LINUX_DIR)-$(LINUX_VERSION) $(LINUX_DIR) touch $(LINUX_DIR)/.unpacked $(LINUX_DIR)/.patched: $(LINUX_DIR)/.unpacked $(PATCH) $(LINUX_DIR) $(LINUX_PATCHES) touch $(LINUX_DIR)/.patched -$(LINUX_DIR)/.configured: $(LINUX_DIR)/.patched +$(LINUX_DIR)/.configured: $(LINUX_DIR)/.patched -cp $(LINUX_KCONFIG) $(LINUX_DIR)/.config +#ifeq ($(BR2_TARGET_ROOTFS_SQUASHFS_LZMA),y) +# $(SED) "s,rootfstype=jffs2,rootfstype=squashfs," $(LINUX_DIR)/.config +#endif +#ifeq ($(BR2_TARGET_ROOTFS_SQUASHFS),y) +# $(SED) "s,rootfstype=jffs2,rootfstype=squashfs," $(LINUX_DIR)/.config +#endif $(SED) "s,^CROSS_COMPILE.*,CROSS_COMPILE=$(KERNEL_CROSS),g;" \ - $(LINUX_DIR)/Makefile \ - $(LINUX_DIR)/arch/mips/Makefile + $(LINUX_DIR)/Makefile \ + $(LINUX_DIR)/arch/mips/Makefile $(SED) "s,\-mcpu=,\-mtune=,g;" $(LINUX_DIR)/arch/mips/Makefile $(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_KARCH) oldconfig include/linux/version.h touch $(LINUX_DIR)/.configured @@ -76,7 +79,6 @@ $(LINUX_KERNEL): $(LINUX_DIR)/$(LINUX_BINLOC) $(LINUX_DIR)/.modules_done: $(LINUX_KERNEL) rm -rf $(BUILD_DIR)/modules $(MAKE) -C $(LINUX_DIR) DEPMOD=true INSTALL_MOD_PATH=$(BUILD_DIR)/modules modules_install - tar -C $(BUILD_DIR)/modules/lib -cjf openwrt-kmodules.tar.bz2 modules touch $(LINUX_DIR)/.modules_done $(STAGING_DIR)/include/linux/version.h: $(LINUX_DIR)/.configured @@ -100,15 +102,9 @@ linuxclean: clean -$(MAKE) -C $(LINUX_DIR) clean linux-dirclean: + rm -f $(BUILD_DIR)/openwrt-kmodules.tar.bz2 + rm -rf $(LINUX_DIR)-$(LINUX_VERSION) rm -rf $(LINUX_DIR) + rm -rf $(BUILD_DIR)/modules + rm -rf $(BUILD_DIR)/linksys-kernel -endif - -############################################################# -# -# Toplevel Makefile options -# -############################################################## -ifeq ($(strip $(BR2_PACKAGE_LINUX)),y) -TARGETS+=linux -endif diff --git a/openwrt/package/lzo/Config.in b/openwrt/package/lzo/Config.in new file mode 100644 index 0000000000..f8c043a339 --- /dev/null +++ b/openwrt/package/lzo/Config.in @@ -0,0 +1,7 @@ +config BR2_PACKAGE_LZO + tristate "lzo" + default m + help + A library implementing transparent compression/decompression + + http://www.oberhumer.com/opensource/lzo/ diff --git a/openwrt/package/lzo/Makefile b/openwrt/package/lzo/Makefile new file mode 100644 index 0000000000..8d7398194e --- /dev/null +++ b/openwrt/package/lzo/Makefile @@ -0,0 +1,69 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME := lzo +PKG_VERSION := 1.08 +PKG_RELEASE := 1 + +PKG_SOURCE_SITE := http://www.oberhumer.com/opensource/lzo/download/ +PKG_SOURCE_FILE := $(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_CAT := zcat +PKG_SOURCE_DIR := $(PKG_NAME)-$(PKG_VERSION) +PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_SOURCE_DIR) +PKG_IPK := $(PKG_NAME)_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk + + +$(DL_DIR)/$(PKG_SOURCE_FILE): + mkdir -p $(DL_DIR) + $(WGET) -P $(DL_DIR) $(PKG_SOURCE_SITE)/$(PKG_SOURCE_FILE) + +$(PKG_BUILD_DIR)/.patched: $(DL_DIR)/$(PKG_SOURCE_FILE) + mkdir -p $(TOOL_BUILD_DIR) + $(PKG_SOURCE_CAT) $(DL_DIR)/$(PKG_SOURCE_FILE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + $(PATCH) $(PKG_BUILD_DIR) . ./patches + touch $(PKG_BUILD_DIR)/.patched + +$(PKG_BUILD_DIR)/.configured: $(PKG_BUILD_DIR)/.patched + (cd $(PKG_BUILD_DIR); rm -rf config.cache; \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --target=$(GNU_TARGET_NAME) \ + --host=$(GNU_TARGET_NAME) \ + --build=$(GNU_HOST_NAME) \ + --prefix=/ \ + --exec-prefix=/ \ + --bindir=/bin \ + --sbindir=/sbin \ + --libexecdir=/lib \ + --sysconfdir=/etc \ + --localstatedir=/var \ + --enable-shared \ + ); + touch $(PKG_BUILD_DIR)/.configured + +$(PKG_BUILD_DIR)/src/liblzo.la: $(PKG_BUILD_DIR)/.configured + $(MAKE) -C $(PKG_BUILD_DIR) + +$(STAGING_DIR)/lib/liblzo.a: $(PKG_BUILD_DIR)/src/liblzo.la + $(MAKE) -C $(PKG_BUILD_DIR) \ + CC=$(TARGET_CC) \ + DESTDIR="$(STAGING_DIR)" \ + install + +$(PACKAGE_DIR)/$(PKG_IPK): $(STAGING_DIR)/lib/liblzo.a + mkdir -p $(PACKAGE_DIR) + $(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_BUILD_DIR)/ipkg/lzo lzo.control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH) + mkdir -p $(PKG_BUILD_DIR)/ipkg/lzo/usr/lib + cp -a $(STAGING_DIR)/lib/liblzo.so* $(PKG_BUILD_DIR)/ipkg/lzo/usr/lib + $(STRIP) $(PKG_BUILD_DIR)/ipkg/lzo/usr/lib/* + $(IPKG_BUILD) $(PKG_BUILD_DIR)/ipkg/lzo $(PACKAGE_DIR) + +source: $(DL_DIR)/$(PKG_SOURCE_FILE) +prepare: $(PKG_BUILD_DIR)/.patched +compile: $(STAGING_DIR)/lib/liblzo.a $(PACKAGE_DIR)/$(PKG_IPK) +install: $(PKG_ZLIB) + $(IPKG) install $(PACKAGE_DIR)/$(PKG_IPK) +clean: + rm -rf $(PKG_BUILD_DIR) + rm -f $(STAGING_DIR)/lib/liblzo* + rm -f $(PACKAGE_DIR)/lzo\*.ipk + diff --git a/openwrt/package/lzo/lzo.control b/openwrt/package/lzo/lzo.control new file mode 100644 index 0000000000..aa9992aa33 --- /dev/null +++ b/openwrt/package/lzo/lzo.control @@ -0,0 +1,8 @@ +Package: lzo +Priority: optional +Section: libs +Version: 1.0.8-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: an implementation of the deflate compression method (library) diff --git a/openwrt/package/lzo/patches/lzo-cross-compile.patch b/openwrt/package/lzo/patches/lzo-cross-compile.patch new file mode 100644 index 0000000000..68a3d0449e --- /dev/null +++ b/openwrt/package/lzo/patches/lzo-cross-compile.patch @@ -0,0 +1,43 @@ +For some reason the lzo autoconf script uses a local macro that does +a test for cross-compiles, and assumes that if the build target name +and the host target name are the same that --host was not specified to +the configure script. In the uClibc buildroot, this is not the case. + +--- lzo-1.08/aclocal.m4 2002-07-12 18:31:52.000000000 -0700 ++++ lzo-1.08/aclocal.m4.new 2004-03-10 15:32:42.000000000 -0700 +@@ -205,12 +205,6 @@ + [ + AC_REQUIRE([AC_PROG_CC]) + +-if test "X$cross_compiling" = Xyes; then +- if test "X$build" = "X$host"; then +- AC_MSG_ERROR([you are cross compiling - please use the \`--host=' option]) +- fi +-fi +- + ]) + + +--- lzo-1.08/configure-dist 2004-03-11 02:18:28.000000000 -0600 ++++ lzo-1.08/configure 2004-03-11 02:19:16.000000000 -0600 +@@ -2282,13 +2282,13 @@ + + + +-if test "X$cross_compiling" = Xyes; then +- if test "X$build" = "X$host"; then +- { { echo "$as_me:$LINENO: error: you are cross compiling - please use the \`--host=' option" >&5 +-echo "$as_me: error: you are cross compiling - please use the \`--host=' option" >&2;} +- { (exit 1); exit 1; }; } +- fi +-fi ++#if test "X$cross_compiling" = Xyes; then ++# if test "X$build" = "X$host"; then ++# { { echo "$as_me:$LINENO: error: you are cross compiling - please use the \`--host=' option" >&5 ++#echo "$as_me: error: you are cross compiling - please use the \`--host=' option" >&2;} ++# { (exit 1); exit 1; }; } ++# fi ++#fi + + + diff --git a/openwrt/package/openssl/Config.in b/openwrt/package/openssl/Config.in new file mode 100644 index 0000000000..8430cff940 --- /dev/null +++ b/openwrt/package/openssl/Config.in @@ -0,0 +1,7 @@ +config BR2_PACKAGE_OPENSSL + tristate "openssl" + default m + help + A library implementing the SSL and TLS protocols + + http://www.openssl.org/ diff --git a/openwrt/package/openssl/Makefile b/openwrt/package/openssl/Makefile new file mode 100644 index 0000000000..e5dd851856 --- /dev/null +++ b/openwrt/package/openssl/Makefile @@ -0,0 +1,73 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME := openssl +PKG_VERSION := 0.9.7e +PKG_RELEASE := 1 + +PKG_SOURCE_SITE := http://www.openssl.org/source +PKG_SOURCE_FILE := $(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_CAT := zcat +PKG_SOURCE_DIR := $(PKG_NAME)-$(PKG_VERSION) +PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_SOURCE_DIR) +PKG_IPK := $(PKG_NAME)_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk + +OPENSSL_NO_CIPHERS:=no-idea no-mdc2 no-rc5 no-rc2 no-md2 no-md4 + +$(DL_DIR)/$(PKG_SOURCE_FILE): + mkdir -p $(DL_DIR) + $(WGET) -P $(DL_DIR) $(PKG_SOURCE_SITE)/$(PKG_SOURCE_FILE) + +$(PKG_BUILD_DIR)/.patched: $(DL_DIR)/$(PKG_SOURCE_FILE) + mkdir -p $(TOOL_BUILD_DIR) + $(PKG_SOURCE_CAT) $(DL_DIR)/$(PKG_SOURCE_FILE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + $(PATCH) $(PKG_BUILD_DIR) ./patches + $(SED) 's,/CFLAG=,/CFLAG= $(TARGET_SOFT_FLOAT) ,g' \ + $(PKG_BUILD_DIR)/Configure + touch $(PKG_BUILD_DIR)/.patched + +$(PKG_BUILD_DIR)/.configured: $(PKG_BUILD_DIR)/.patched + (cd $(PKG_BUILD_DIR); \ + CFLAGS="-DOPENSSL_NO_KRB5 -DOPENSSL_NO_IDEA -DOPENSSL_NO_MDC2 -DOPENSSL_NO_RC5" \ + PATH=$(TARGET_PATH) ./Configure linux-$(ARCH) --prefix=/ \ + --openssldir=/usr/lib/ssl -L$(STAGING_DIR)/lib -ldl \ + -I$(STAGING_DIR)/include $(OPENSSL_NO_CIPHERS) \ + shared no-krb5 no-ec no-engine zlib-dynamic no-hw no-threads ) + touch $(PKG_BUILD_DIR)/.configured + +$(PKG_BUILD_DIR)/apps/openssl: $(PKG_BUILD_DIR)/.configured + $(MAKE) CC=$(TARGET_CC) -C $(PKG_BUILD_DIR) all build-shared + # Work around openssl build bug to link libssl.so with libcrypto.so. + -rm $(PKG_BUILD_DIR)/libssl.so.*.*.* + $(MAKE) CC=$(TARGET_CC) -C $(PKG_BUILD_DIR) do_linux-shared + +$(STAGING_DIR)/lib/libssl.so: $(PKG_BUILD_DIR)/apps/openssl + $(MAKE) CC=$(TARGET_CC) INSTALL_PREFIX=$(STAGING_DIR) -C $(PKG_BUILD_DIR) install_sw + cp -fa $(PKG_BUILD_DIR)/libcrypto.so* $(STAGING_DIR)/lib/ + chmod a-x $(STAGING_DIR)/lib/libcrypto.so.0.9.7 + (cd $(STAGING_DIR)/lib; ln -fs libcrypto.so.0.9.7 libcrypto.so) + (cd $(STAGING_DIR)/lib; ln -fs libcrypto.so.0.9.7 libcrypto.so.0) + cp -fa $(PKG_BUILD_DIR)/libssl.so* $(STAGING_DIR)/lib/ + chmod a-x $(STAGING_DIR)/lib/libssl.so.0.9.7 + (cd $(STAGING_DIR)/lib; ln -fs libssl.so.0.9.7 libssl.so) + (cd $(STAGING_DIR)/lib; ln -fs libssl.so.0.9.7 libssl.so.0) + +$(PACKAGE_DIR)/$(PKG_IPK): $(STAGING_DIR)/lib/libssl.so + mkdir -p $(PACKAGE_DIR) + $(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_BUILD_DIR)/ipkg/$(PKG_NAME) $(PKG_NAME).control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH) + mkdir -p $(PKG_BUILD_DIR)/ipkg/$(PKG_NAME)/usr/lib + cp -a $(STAGING_DIR)/lib/libssl.so* $(PKG_BUILD_DIR)/ipkg/$(PKG_NAME)/usr/lib + cp -a $(STAGING_DIR)/lib/libcrypto.so* $(PKG_BUILD_DIR)/ipkg/$(PKG_NAME)/usr/lib + $(STRIP) $(PKG_BUILD_DIR)/ipkg/$(PKG_NAME)/usr/lib/* + $(IPKG_BUILD) $(PKG_BUILD_DIR)/ipkg/$(PKG_NAME) $(PACKAGE_DIR) + +source: $(DL_DIR)/$(PKG_SOURCE_FILE) +prepare: $(PKG_BUILD_DIR)/.patched +compile: $(STAGING_DIR)/lib/libssl.so $(PACKAGE_DIR)/$(PKG_IPK) +install: $(PKG_ZLIB) + $(IPKG) install $(PACKAGE_DIR)/$(PKG_IPK) +clean: + rm -rf $(PKG_BUILD_DIR) + rm -f $(STAGING_DIR)/lib/libssl* + rm -f $(STAGING_DIR)/lib/libcrypto* + rm -f $(PACKAGE_DIR)/$(PKG_NAME)\*.ipk + diff --git a/openwrt/package/openssl/openssl.control b/openwrt/package/openssl/openssl.control new file mode 100644 index 0000000000..389a597778 --- /dev/null +++ b/openwrt/package/openssl/openssl.control @@ -0,0 +1,8 @@ +Package: openssl +Priority: optional +Section: libs +Version: 0.9.7e-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: OpenSSL Secure Socket Layer library diff --git a/openwrt/package/openssl/openssl.mk b/openwrt/package/openssl/openssl.mk new file mode 100644 index 0000000000..c9726a65a8 --- /dev/null +++ b/openwrt/package/openssl/openssl.mk @@ -0,0 +1,95 @@ +############################################################# +# +# openssl +# +############################################################# + +# TARGETS +OPENSSL_SITE:=http://www.openssl.org/source +OPENSSL_SOURCE:=openssl-0.9.7d.tar.gz +OPENSSL_DIR:=$(BUILD_DIR)/openssl-0.9.7d +OPENSSL_IPK_DIR=$(OPENWRT_IPK_DIR)/openssl +OPENSSL_PATCH=$(OPENSSL_IPK_DIR)/openssl.patch + +OPENSSL_IPK_BUILD_DIR=$(BUILD_DIR)/openssl-0.9.7d-ipk +LIBSSL_IPK=$(BUILD_DIR)/libssl_0.9.7d_mipsel.ipk + +$(DL_DIR)/$(OPENSSL_SOURCE): + $(WGET) -P $(DL_DIR) $(OPENSSL_SITE)/$(OPENSSL_SOURCE) + +$(OPENSSL_DIR)/.unpacked: $(DL_DIR)/$(OPENSSL_SOURCE) $(OPENSSL_PATCH) + gunzip -c $(DL_DIR)/$(OPENSSL_SOURCE) | tar -C $(BUILD_DIR) -xvf - + cat $(OPENSSL_PATCH) | patch -p1 -d $(OPENSSL_DIR) + # sigh... we have to resort to this just to set a gcc flag. + $(SED) 's,/CFLAG=,/CFLAG= $(TARGET_SOFT_FLOAT) ,g' \ + $(OPENSSL_DIR)/Configure + touch $(OPENSSL_DIR)/.unpacked + +$(OPENSSL_DIR)/Makefile: $(OPENSSL_DIR)/.unpacked + (cd $(OPENSSL_DIR); \ + CFLAGS="-DOPENSSL_NO_KRB5 -DOPENSSL_NO_IDEA -DOPENSSL_NO_MDC2 -DOPENSSL_NO_RC5" \ + PATH=$(TARGET_PATH) ./Configure linux-$(ARCH) --prefix=/ \ + --openssldir=/usr/lib/ssl -L$(STAGING_DIR)/lib -ldl \ + -I$(STAGING_DIR)/include $(OPENSSL_OPTS) no-threads \ + shared no-idea no-mdc2 no-rc5) + +$(OPENSSL_DIR)/apps/openssl: $(OPENSSL_DIR)/Makefile + $(MAKE) CC=$(TARGET_CC) -C $(OPENSSL_DIR) all build-shared + # Work around openssl build bug to link libssl.so with libcrypto.so. + -rm $(OPENSSL_DIR)/libssl.so.*.*.* + $(MAKE) CC=$(TARGET_CC) -C $(OPENSSL_DIR) do_linux-shared + +$(STAGING_DIR)/lib/libcrypto.a: $(OPENSSL_DIR)/apps/openssl + $(MAKE) CC=$(TARGET_CC) INSTALL_PREFIX=$(STAGING_DIR) -C $(OPENSSL_DIR) install + cp -fa $(OPENSSL_DIR)/libcrypto.so* $(STAGING_DIR)/lib/ + chmod a-x $(STAGING_DIR)/lib/libcrypto.so.0.9.7 + (cd $(STAGING_DIR)/lib; ln -fs libcrypto.so.0.9.7 libcrypto.so) + (cd $(STAGING_DIR)/lib; ln -fs libcrypto.so.0.9.7 libcrypto.so.0) + cp -fa $(OPENSSL_DIR)/libssl.so* $(STAGING_DIR)/lib/ + chmod a-x $(STAGING_DIR)/lib/libssl.so.0.9.7 + (cd $(STAGING_DIR)/lib; ln -fs libssl.so.0.9.7 libssl.so) + (cd $(STAGING_DIR)/lib; ln -fs libssl.so.0.9.7 libssl.so.0) + +$(TARGET_DIR)/usr/lib/libcrypto.so.0.9.7: $(STAGING_DIR)/lib/libcrypto.a + mkdir -p $(TARGET_DIR)/usr/lib + cp -fa $(STAGING_DIR)/lib/libcrypto.so* $(TARGET_DIR)/usr/lib/ + cp -fa $(STAGING_DIR)/lib/libssl.so* $(TARGET_DIR)/usr/lib/ + #cp -fa $(STAGING_DIR)/bin/openssl $(TARGET_DIR)/bin/ + -$(STRIP) $(TARGET_DIR)/usr/lib/libssl.so.0.9.7 + -$(STRIP) $(TARGET_DIR)/usr/lib/libcrypto.so.0.9.7 + +$(TARGET_DIR)/usr/lib/libssl.a: $(STAGING_DIR)/lib/libcrypto.a + mkdir -p $(TARGET_DIR)/usr/include + cp -a $(STAGING_DIR)/include/openssl $(TARGET_DIR)/usr/include/ + cp -dpf $(STAGING_DIR)/lib/libssl.a $(TARGET_DIR)/usr/lib/ + cp -dpf $(STAGING_DIR)/lib/libcrypto.a $(TARGET_DIR)/usr/lib/ + touch -c $(TARGET_DIR)/usr/lib/libssl.a + +openssl-headers: $(TARGET_DIR)/usr/lib/libssl.a + +openssl: uclibc $(TARGET_DIR)/usr/lib/libcrypto.so.0.9.7 + +$(LIBSSL_IPK): uclibc $(STAGING_DIR)/lib/libcrypto.a + mkdir -p $(OPENSSL_IPK_BUILD_DIR)/CONTROL + cp $(OPENSSL_IPK_DIR)/control $(OPENSSL_IPK_BUILD_DIR)/CONTROL/control + mkdir -p $(OPENSSL_IPK_BUILD_DIR)/usr/lib + cp -fa $(STAGING_DIR)/lib/libcrypto.so* $(OPENSSL_IPK_BUILD_DIR)/usr/lib/ + cp -fa $(STAGING_DIR)/lib/libssl.so* $(OPENSSL_IPK_BUILD_DIR)/usr/lib/ + -$(STRIP) $(OPENSSL_IPK_BUILD_DIR)/usr/lib/libssl.so.0.9.7 + -$(STRIP) $(OPENSSL_IPK_BUILD_DIR)/usr/lib/libcrypto.so.0.9.7 + cd $(BUILD_DIR); $(IPKG_BUILD) $(OPENSSL_IPK_BUILD_DIR) + +openssl-ipk: $(LIBSSL_IPK) + +openssl-source: $(DL_DIR)/$(OPENSSL_SOURCE) + +openssl-clean: + rm -f $(STAGING_DIR)/bin/openssl $(TARGET_DIR)/bin/openssl + rm -f $(STAGING_DIR)/lib/libcrypto.so* $(TARGET_DIR)/lib/libcrypto.so* + rm -f $(STAGING_DIR)/lib/libssl.so* $(TARGET_DIR)/lib/libssl.so* + rm -rf $(OPENSSL_IPK_BUILD_DIR) + $(MAKE) -C $(OPENSSL_DIR) clean + +openssl-dirclean: + rm -rf $(OPENSSL_DIR) + diff --git a/openwrt/package/openssl/patches/openssl.patch b/openwrt/package/openssl/patches/openssl.patch new file mode 100644 index 0000000000..2e8d50f1cb --- /dev/null +++ b/openwrt/package/openssl/patches/openssl.patch @@ -0,0 +1,238 @@ +--- openssl-0.9.7.orig/Configure ++++ openssl-0.9.7/Configure +@@ -1,4 +1,4 @@ +-: ++#!/usr/bin/perl + eval 'exec perl -S $0 ${1+"$@"}' + if $running_under_some_shell; + ## +@@ -373,6 +373,40 @@ + # assembler versions -- currently defunct: + ##"OpenBSD-alpha","gcc:-DTERMIOS -O3 -fomit-frame-pointer:::(unknown):SIXTY_FOUR_BIT_LONG DES_INT DES_PTR DES_RISC2:${alpha_asm}", + ++# Sane Linux configuration values, stolen from the Debian package.... ++"linux-alpha","gcc:-DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_UNROLL:${alpha_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-alpha-ev4","gcc:-DTERMIO -O3 -mcpu=ev4 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_UNROLL:${alpha_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-alpha-ev5","gcc:-DTERMIO -O3 -mcpu=ev5 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_UNROLL:${alpha_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-arm","gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-freebsd-alpha","gcc:-DTERMIOS -O -fomit-frame-pointer::(unknown):::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_PTR DES_RISC2::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-freebsd-i386", "gcc:-DTERMIOS -DL_ENDIAN -fomit-frame-pointer -O3 -m486 -Wall::-pthread -D_REENTRANT -D_THREAD_SAFE -D_THREADSAFE:::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-hppa","gcc:-DB_ENDIAN -DTERMIO -O2 -Wall::-D_REENTRANT::-ldl:BN_LLONG MD2_CHAR RC4_INDEX::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-hurd-i386","gcc:-DL_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -m486 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-ia64","gcc:-DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK RC4_CHAR:asm/ia64.o:::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++#"linux-i386","gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -m486 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::dlfcn:linux-shared:-fPIC", ++"linux-i386","gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-i386-i486","gcc:-DL_ENDIAN -DTERMIO -O3 -march=i486 -mcpu=i486 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-i386-i586","gcc:-DL_ENDIAN -DTERMIO -O3 -march=i586 -mcpu=i586 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-i386-i686/cmov","gcc:-DL_ENDIAN -DTERMIO -O3 -march=i686 -mcpu=i686 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-m68k","gcc:-DB_ENDIAN -DTERMIO -O2 -Wall::-D_REENTRANT::-ldl:BN_LLONG MD2_CHAR RC4_INDEX::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-mips", "gcc:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-mipsel", "gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-netbsd-i386", "gcc:-DL_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -m486 -Wall::(unknown):::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-netbsd-m68k", "gcc:-DB_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -Wall::(unknown):::BN_LLONG MD2_CHAR RC4_INDEX DES_UNROLL::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-netbsd-sparc", "gcc:-DB_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -mv8 -Wall::(unknown):::BN_LLONG MD2_CHAR RC4_INDEX DES_UNROLL::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-openbsd-alpha","gcc:-DTERMIOS -O3 -fomit-frame-pointer::(unknown):::SIXTY_FOUR_BIT_LONG DES_INT DES_PTR DES_RISC2::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-openbsd-i386", "gcc:-DL_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -m486::(unknown):::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_out_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-openbsd-mips","gcc:-O2 -DL_ENDIAN::(unknown)::BN_LLONG MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC2 DES_PTR BF_PTR:::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-powerpc","gcc:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_UNROLL DES_RISC2 DES_PTR MD2_CHAR RC4_INDEX::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-s390","gcc:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-sh3", "gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-sh4", "gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-sh3eb", "gcc:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-sh4eb", "gcc:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-sparc","gcc:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-sparc-v8","gcc:-DB_ENDIAN -DTERMIO -O3 -mcpu=v8 -fomit-frame-pointer -Wall -DBN_DIV2W::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:asm/sparcv8.o:::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-sparc-v9","gcc:-DB_ENDIAN -DTERMIO -O3 -mcpu=v9 -Wa,-Av8plus -fomit-frame-pointer -Wall -DULTRASPARC -DBN_DIV2W::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:asm/sparcv8plus.o:::asm/md5-sparcv8plus.o::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", ++"linux-cris", "gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fpic::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", + # The intel boxes :-), It would be worth seeing if bsdi-gcc can use the + # bn86-elf.o file file since it is hand tweaked assembler. + "linux-elf", "gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -m486 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", +--- openssl-0.9.7.orig/crypto/md5/asm/md5-sparcv9.S ++++ openssl-0.9.7/crypto/md5/asm/md5-sparcv9.S +@@ -72,14 +72,14 @@ + #define Dval R8 + + #if defined(MD5_BLOCK_DATA_ORDER) +-# if defined(OPENSSL_SYSNAME_ULTRASPARC) ++/*# if defined(OPENSSL_SYSNAME_ULTRASPARC)*/ + # define LOAD lda + # define X(i) [%i1+i*4]%asi + # define md5_block md5_block_asm_data_order_aligned + # define ASI_PRIMARY_LITTLE 0x88 +-# else ++/*# else + # error "MD5_BLOCK_DATA_ORDER is supported only on UltraSPARC!" +-# endif ++# endif*/ + #else + # define LOAD ld + # define X(i) [%i1+i*4] +--- openssl-0.9.7.orig/crypto/opensslconf.h ++++ openssl-0.9.7/crypto/opensslconf.h +@@ -4,17 +4,38 @@ + /* OpenSSL was configured with the following options: */ + #ifndef OPENSSL_DOING_MAKEDEPEND + ++#ifndef OPENSSL_NO_IDEA ++# define OPENSSL_NO_IDEA ++#endif ++#ifndef OPENSSL_NO_MDC2 ++# define OPENSSL_NO_MDC2 ++#endif ++#ifndef OPENSSL_NO_RC5 ++# define OPENSSL_NO_RC5 ++#endif + #ifndef OPENSSL_NO_KRB5 + # define OPENSSL_NO_KRB5 + #endif + + #endif /* OPENSSL_DOING_MAKEDEPEND */ ++#ifndef OPENSSL_THREADS ++# define OPENSSL_THREADS ++#endif + + /* The OPENSSL_NO_* macros are also defined as NO_* if the application + asks for it. This is a transient feature that is provided for those + who haven't had the time to do the appropriate changes in their + applications. */ + #ifdef OPENSSL_ALGORITHM_DEFINES ++# if defined(OPENSSL_NO_IDEA) && !defined(NO_IDEA) ++# define NO_IDEA ++# endif ++# if defined(OPENSSL_NO_MDC2) && !defined(NO_MDC2) ++# define NO_MDC2 ++# endif ++# if defined(OPENSSL_NO_RC5) && !defined(NO_RC5) ++# define NO_RC5 ++# endif + # if defined(OPENSSL_NO_KRB5) && !defined(NO_KRB5) + # define NO_KRB5 + # endif +@@ -27,7 +48,7 @@ + + #if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */ + #if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR) +-#define OPENSSLDIR "/usr/local/ssl" ++#define OPENSSLDIR "/usr/lib/ssl" + #endif + #endif + +@@ -79,7 +100,7 @@ + + #if defined(HEADER_BN_H) && !defined(CONFIG_HEADER_BN_H) + #define CONFIG_HEADER_BN_H +-#undef BN_LLONG ++#define BN_LLONG + + /* Should we define BN_DIV2W here? */ + +@@ -98,7 +119,7 @@ + #define CONFIG_HEADER_RC4_LOCL_H + /* if this is defined data[i] is used instead of *data, this is a %20 + * speedup on x86 */ +-#undef RC4_INDEX ++#define RC4_INDEX + #endif + + #if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H) +@@ -112,14 +133,14 @@ + /* the following is tweaked from a config script, that is why it is a + * protected undef/define */ + #ifndef DES_PTR +-#undef DES_PTR ++#define DES_PTR + #endif + + /* This helps C compiler generate the correct code for multiple functional + * units. It reduces register dependancies at the expense of 2 more + * registers */ + #ifndef DES_RISC1 +-#undef DES_RISC1 ++#define DES_RISC1 + #endif + + #ifndef DES_RISC2 +@@ -133,7 +154,7 @@ + /* Unroll the inner loop, this sometimes helps, sometimes hinders. + * Very mucy CPU dependant */ + #ifndef DES_UNROLL +-#undef DES_UNROLL ++#define DES_UNROLL + #endif + + /* These default values were supplied by +--- openssl-0.9.7.orig/ssl/ssl_algs.c ++++ openssl-0.9.7/ssl/ssl_algs.c +@@ -109,3 +109,8 @@ + return(1); + } + ++#undef SSLeay_add_ssl_algorithms ++int SSLeay_add_ssl_algorithms(void) ++ { ++ return SSL_library_init(); ++ } +--- openssl-0.9.7.orig/tools/c_rehash.in ++++ openssl-0.9.7/tools/c_rehash.in +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl ++#!/usr/bin/perl + + + # Perl c_rehash script, scan all files in a directory +--- openssl-0.9.7.orig/util/clean-depend.pl ++++ openssl-0.9.7/util/clean-depend.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl -w ++#!/usr/bin/perl + # Clean the dependency list in a makefile of standard includes... + # Written by Ben Laurie 19 Jan 1999 + +--- openssl-0.9.7.orig/util/extract-names.pl ++++ openssl-0.9.7/util/extract-names.pl +@@ -1,4 +1,4 @@ +-#!/usr/bin/perl ++#!/usr/bin/perl + + $/ = ""; # Eat a paragraph at once. + while() { +--- openssl-0.9.7.orig/util/mkdef.pl ++++ openssl-0.9.7/util/mkdef.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl -w ++#!/usr/bin/perl + # + # generate a .def file + # +--- openssl-0.9.7.orig/util/mkerr.pl ++++ openssl-0.9.7/util/mkerr.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl -w ++#!/usr/bin/perl + + my $config = "crypto/err/openssl.ec"; + my $debug = 0; +--- openssl-0.9.7.orig/util/mkstack.pl ++++ openssl-0.9.7/util/mkstack.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl -w ++#!/usr/bin/perl + + # This is a utility that searches out "DECLARE_STACK_OF()" + # declarations in .h and .c files, and updates/creates/replaces +--- openssl-0.9.7.orig/util/pod2man.pl ++++ openssl-0.9.7/util/pod2man.pl +@@ -1,4 +1,4 @@ +-: #!/usr/bin/perl-5.005 ++#!/usr/bin/perl + eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' + if $running_under_some_shell; + +--- openssl-0.9.7.orig/util/selftest.pl ++++ openssl-0.9.7/util/selftest.pl +@@ -1,4 +1,4 @@ +-#!/usr/local/bin/perl -w ++#!/usr/bin/perl + # + # Run the test suite and generate a report + # diff --git a/openwrt/package/openssl/patches/remove_fips.patch b/openwrt/package/openssl/patches/remove_fips.patch new file mode 100644 index 0000000000..6c0c6133bc --- /dev/null +++ b/openwrt/package/openssl/patches/remove_fips.patch @@ -0,0 +1,35 @@ +diff -urN openssl-0.9.7e.old/Makefile.org openssl-0.9.7e/Makefile.org +--- openssl-0.9.7e.old/Makefile.org 2004-09-28 22:52:14.000000000 +0200 ++++ openssl-0.9.7e/Makefile.org 2005-03-03 15:55:11.000000000 +0100 +@@ -175,8 +175,8 @@ + # we might set SHLIB_MARK to '$(SHARED_LIBS)'. + SHLIB_MARK= + +-DIRS= crypto fips ssl $(SHLIB_MARK) sigs apps test tools +-SHLIBDIRS= fips crypto ssl ++DIRS= crypto ssl $(SHLIB_MARK) sigs apps test tools ++SHLIBDIRS= crypto ssl + + # dirs in crypto to build + SDIRS= objects \ +@@ -229,7 +229,6 @@ + libcrypto.a.sha1: libcrypto.a + if egrep 'define OPENSSL_FIPS' $(TOP)/include/openssl/opensslconf.h > /dev/null; then \ + $(RANLIB) libcrypto.a; \ +- fips/sha1/fips_standalone_sha1 libcrypto.a > libcrypto.a.sha1; \ + fi + + sub_all: +--- openssl-0.9.7e/crypto/rand/rand_lib.c 2004-07-30 16:38:00.000000000 +0200 ++++ openssl-0.9.7e.patched/crypto/rand/rand_lib.c 2005-02-18 15:46:22.000000000 +0100 +@@ -63,8 +63,10 @@ + #ifndef OPENSSL_NO_ENGINE + #include + #endif ++#ifdef OPENSSL_FIPS + #include + #include ++#endif + + #ifndef OPENSSL_NO_ENGINE + /* non-NULL if default_RAND_meth is ENGINE-provided */ diff --git a/openwrt/package/openvpn/Config.in b/openwrt/package/openvpn/Config.in new file mode 100644 index 0000000000..442313fff6 --- /dev/null +++ b/openwrt/package/openvpn/Config.in @@ -0,0 +1,10 @@ +config BR2_PACKAGE_OPENVPN + tristate "OpenVPN" + default m + select BR2_PACKAGE_KMOD_TUN + select BR2_PACKAGE_OPENSSL + select BR2_PACKAGE_LZO + help + Open Source VPN solution using SSL + + http://openvpn.net/ diff --git a/openwrt/package/openvpn/Makefile b/openwrt/package/openvpn/Makefile new file mode 100644 index 0000000000..41f7d67594 --- /dev/null +++ b/openwrt/package/openvpn/Makefile @@ -0,0 +1,69 @@ +############################################################# +# +# ebtables +# +############################################################# +include $(TOPDIR)/rules.mk + +PKG_NAME:=openvpn +PKG_VERSION:=2.0_rc16 +PKG_RELEASE:=1 +PKG_SOURCE_URL:=http://puzzle.dl.sourceforge.net/sourceforge/openvpn +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) +PKG_CAT:=zcat +PKG_IPK:=$(PACKAGE_DIR)/$(PKG_NAME)_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk +PKG_IPK_DIR:=$(PKG_BUILD_DIR)/ipkg + +$(DL_DIR)/$(PKG_SOURCE): + $(WGET) -P $(DL_DIR) $(PKG_SOURCE_URL)/$(PKG_SOURCE) + +$(PKG_BUILD_DIR)/.unpacked: $(DL_DIR)/$(PKG_SOURCE) + $(PKG_CAT) $(DL_DIR)/$(PKG_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + touch $(PKG_BUILD_DIR)/.unpacked + +$(PKG_BUILD_DIR)/.configured: $(PKG_BUILD_DIR)/.unpacked + (cd $(PKG_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 \ + --program-prefix="" \ + --disable-pthread \ + --disable-debug \ + --disable-plugins \ + --disable-management \ + --disable-socks \ + --disable-http \ + ); + touch $(PKG_BUILD_DIR)/.configured + +$(PKG_BUILD_DIR)/usr/sbin/openvpn: $(PKG_BUILD_DIR)/.configured + $(MAKE) -C $(PKG_BUILD_DIR) + +$(PKG_IPK): $(PKG_BUILD_DIR)/usr/sbin/openvpn + $(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_IPK_DIR) $(PKG_NAME).control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH) + mkdir -p $(PKG_IPK_DIR)/usr/sbin + cp $(PKG_BUILD_DIR)/openvpn $(PKG_IPK_DIR)/usr/sbin/ + mkdir -p $(PACKAGE_DIR) + $(IPKG_BUILD) $(PKG_IPK_DIR) $(PACKAGE_DIR) + +source: $(DL_DIR)/$(PKG_SOURCE) +prepare: $(PKG_BUILD_DIR)/.unpacked +compile: $(PKG_IPK) +install: + $(IPKG) install $(PKG_IPK) +clean: + rm -rf $(PKG_BUILD_DIR) diff --git a/openwrt/package/openvpn/openvpn.control b/openwrt/package/openvpn/openvpn.control new file mode 100644 index 0000000000..95a576057b --- /dev/null +++ b/openwrt/package/openvpn/openvpn.control @@ -0,0 +1,9 @@ +Package: openvpn +Priority: optional +Section: net +Version: 2.0_rc16-1 +Architecture: mipsel +Maintainer: Felix Fietkau +Depends: lzo, openssl, kmod-tun +Source: buildroot internal +Description: Open Source VPN solution using SSL diff --git a/openwrt/package/openwrt/Makefile b/openwrt/package/openwrt/Makefile new file mode 100644 index 0000000000..424ae4f9a8 --- /dev/null +++ b/openwrt/package/openwrt/Makefile @@ -0,0 +1,9 @@ +include $(TOPDIR)/rules.mk + +include ./openwrt.mk + +source: openwrt-source +prepare: $(LINKSYS_SHARED_DIR)/.source +compile: $(TARGET_DIR)/$(LINKSYS_SHARED_TARGET_BINARY) +install: compile openwrt +clean: openwrt-dirclean diff --git a/openwrt/package/openwrt/openwrt.mk b/openwrt/package/openwrt/openwrt.mk index bc6e97e602..cc80bc4a01 100644 --- a/openwrt/package/openwrt/openwrt.mk +++ b/openwrt/package/openwrt/openwrt.mk @@ -97,11 +97,13 @@ linksys-wlconf-dirclean: rm -rf $(LINKSYS_WLCONF_DIR) # mtd tool -OPENWRT_MTD_SOURCE=package/openwrt/mtd.c +OPENWRT_MTD_SOURCE=./mtd.c OPENWRT_MTD_TARGET_BINARY:=sbin/mtd $(TARGET_DIR)/$(OPENWRT_MTD_TARGET_BINARY): - $(TARGET_CC) -o $(TARGET_DIR)/$(OPENWRT_MTD_TARGET_BINARY) $(OPENWRT_MTD_SOURCE) + $(TARGET_CC) -o $@ $(OPENWRT_MTD_SOURCE) + $(STRIP) $@ + openwrt-mtd: $(TARGET_DIR)/$(OPENWRT_MTD_TARGET_BINARY) @@ -109,58 +111,22 @@ openwrt-mtd-clean: rm $(TARGET_DIR)/$(OPENWRT_MTD_TARGET_BINARY) # jffs2root tool -OPENWRT_JFFS2ROOT_SOURCE=package/openwrt/jffs2root.c +OPENWRT_JFFS2ROOT_SOURCE=./jffs2root.c OPENWRT_JFFS2ROOT_TARGET_BINARY:=sbin/jffs2root -$(TARGET_DIR)/$(OPENWRT_JFFS2ROOT_TARGET_BINARY): openwrt - $(TARGET_CC) -o $(TARGET_DIR)/$(OPENWRT_JFFS2ROOT_TARGET_BINARY) $(OPENWRT_JFFS2ROOT_SOURCE) +$(TARGET_DIR)/$(OPENWRT_JFFS2ROOT_TARGET_BINARY): + $(TARGET_CC) -o $@ $(OPENWRT_JFFS2ROOT_SOURCE) + $(STRIP) $@ openwrt-jffs2root: $(TARGET_DIR)/$(OPENWRT_JFFS2ROOT_TARGET_BINARY) openwrt-jffs2root-clean: rm $(TARGET_DIR)/$(OPENWRT_JFFS2ROOT_TARGET_BINARY) -# trx tool -OPENWRT_TRX_SOURCE=package/openwrt/trx.c -OPENWRT_TRX_TARGET=$(STAGING_DIR)/bin/trx - -$(OPENWRT_TRX_TARGET): - $(CC) -o $(OPENWRT_TRX_TARGET) $(OPENWRT_TRX_SOURCE) - -openwrt-trx: $(OPENWRT_TRX_TARGET) - -openwrt-trx-clean: - rm $(OPENWRT_TRX_TARGET) - -# addpattern tool -OPENWRT_ADDPATTERN_SOURCE=package/openwrt/addpattern.c -OPENWRT_ADDPATTERN_TARGET=$(STAGING_DIR)/bin/addpattern - -$(OPENWRT_ADDPATTERN_TARGET): - $(CC) -o $(OPENWRT_ADDPATTERN_TARGET) $(OPENWRT_ADDPATTERN_SOURCE) - -openwrt-addpattern: $(OPENWRT_ADDPATTERN_TARGET) - -openwrt-addpattern-clean: - rm $(OPENWRT_ADDPATTERN_TARGET) - -# sstrip tool -OPENWRT_SSTRIP_SOURCE=package/openwrt/sstrip.c -OPENWRT_SSTRIP_TARGET=$(STAGING_DIR)/bin/sstrip - -$(OPENWRT_SSTRIP_TARGET): - $(CC) -o $(OPENWRT_SSTRIP_TARGET) $(OPENWRT_SSTRIP_SOURCE) - -openwrt-sstrip: $(OPENWRT_SSTRIP_TARGET) - -openwrt-sstrip-clean: - rm $(OPENWRT_SSTRIP_TARGET) - -SSTRIP=$(OPENWRT_SSTRIP_TARGET) linksys: linksys-shared linksys-nvram linksys-wlconf -openwrt: linksys openwrt-mtd openwrt-trx openwrt-addpattern openwrt-sstrip +openwrt: linksys openwrt-mtd openwrt-jffs2root openwrt-dirclean: linksys-shared-dirclean linksys-nvram-dirclean linksys-wlconf-dirclean diff --git a/openwrt/package/sed/Config.in b/openwrt/package/sed/Config.in deleted file mode 100644 index 5cfc12d41f..0000000000 --- a/openwrt/package/sed/Config.in +++ /dev/null @@ -1,9 +0,0 @@ -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/sed.mk b/openwrt/package/sed/sed.mk deleted file mode 100644 index e56df9a308..0000000000 --- a/openwrt/package/sed/sed.mk +++ /dev/null @@ -1,136 +0,0 @@ -############################################################# -# -# 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) -C $(SED_DIR1) clean - -host-sed-toolclean: - 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) -C $(SED_DIR2) clean - -sed-dirclean: - rm -rf $(SED_DIR2) - -ifeq ($(strip $(BR2_PACKAGE_SED)),y) -TARGETS+=sed -endif diff --git a/openwrt/package/sed/sedcheck.sh b/openwrt/package/sed/sedcheck.sh deleted file mode 100755 index 4d645b6ab0..0000000000 --- a/openwrt/package/sed/sedcheck.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/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/package/zlib/Config.in b/openwrt/package/zlib/Config.in index fef2324360..89cb1eb92a 100644 --- a/openwrt/package/zlib/Config.in +++ b/openwrt/package/zlib/Config.in @@ -1,5 +1,7 @@ config BR2_PACKAGE_ZLIB - bool "zlib" - default n + tristate "zlib" + default y help - zlib library + A library implementing the 'deflate' compression method + + http://www.zlib.net/ diff --git a/openwrt/package/zlib/Makefile b/openwrt/package/zlib/Makefile new file mode 100644 index 0000000000..522c1b675c --- /dev/null +++ b/openwrt/package/zlib/Makefile @@ -0,0 +1,62 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME := zlib +PKG_VERSION := 1.2.2 +PKG_RELEASE := 1 + +PKG_SOURCE_SITE := http://www.zlib.net/ +PKG_SOURCE_FILE := $(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_CAT := zcat +PKG_SOURCE_DIR := $(PKG_NAME)-$(PKG_VERSION) +PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_SOURCE_DIR) +PKG_IPK := zlib_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk + + +$(DL_DIR)/$(PKG_SOURCE_FILE): + mkdir -p $(DL_DIR) + $(WGET) -P $(DL_DIR) $(PKG_SOURCE_SITE)/$(PKG_SOURCE_FILE) + +$(PKG_BUILD_DIR)/.patched: $(DL_DIR)/$(PKG_SOURCE_FILE) + mkdir -p $(TOOL_BUILD_DIR) + $(PKG_SOURCE_CAT) $(DL_DIR)/$(PKG_SOURCE_FILE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) - + $(PATCH) $(PKG_BUILD_DIR) . $(PKG_NAME).patch + touch $(PKG_BUILD_DIR)/.patched + +$(PKG_BUILD_DIR)/.configured: $(PKG_BUILD_DIR)/.patched + (cd $(PKG_BUILD_DIR); \ + $(TARGET_CONFIGURE_OPTS) \ + ./configure \ + --prefix=/ \ + --shared) + touch $(PKG_BUILD_DIR)/.configured + +$(PKG_BUILD_DIR)/libz.so: $(PKG_BUILD_DIR)/.configured + $(MAKE) -C $(PKG_BUILD_DIR) \ + $(TARGET_CONFIGURE_OPTS) \ + CFLAGS="$(TARGET_CFLAGS) $(CFLAGS_LARGEFILE)" \ + libz.a libz.so + +$(STAGING_DIR)/lib/libz.so: $(PKG_BUILD_DIR)/libz.so + $(MAKE) -C $(PKG_BUILD_DIR) \ + DESTDIR="$(STAGING_DIR)" \ + install + +$(PACKAGE_DIR)/$(PKG_IPK): $(STAGING_DIR)/lib/libz.so + mkdir -p $(PACKAGE_DIR) + $(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_BUILD_DIR)/ipkg/zlib zlib.control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH) + mkdir -p $(PKG_BUILD_DIR)/ipkg/zlib/usr/lib + cp -a $(PKG_BUILD_DIR)/libz.so* $(PKG_BUILD_DIR)/ipkg/zlib/usr/lib + $(STRIP) $(PKG_BUILD_DIR)/ipkg/zlib/usr/lib/* + $(IPKG_BUILD) $(PKG_BUILD_DIR)/ipkg/zlib $(PACKAGE_DIR) + + +source: $(DL_DIR)/$(PKG_SOURCE_FILE) +prepare: $(PKG_BUILD_DIR)/.patched +compile: $(STAGING_DIR)/lib/libz.so $(PACKAGE_DIR)/$(PKG_IPK) +install: $(PKG_ZLIB) + $(IPKG) install $(PACKAGE_DIR)/$(PKG_IPK) +clean: + rm -rf $(PKG_BUILD_DIR) + rm -f $(STAGING_DIR)/lib/libz* $(STAGING_DIR)/include/zlib* + rm -f $(PACKAGE_DIR)/zlib\*.ipk + diff --git a/openwrt/package/zlib/zlib.control b/openwrt/package/zlib/zlib.control new file mode 100644 index 0000000000..b7ccf269e4 --- /dev/null +++ b/openwrt/package/zlib/zlib.control @@ -0,0 +1,8 @@ +Package: zlib +Priority: optional +Section: libs +Version: 1.2.2-3 +Architecture: mipsel +Maintainer: Felix Fietkau +Source: buildroot internal +Description: an implementation of the deflate compression method (library) diff --git a/openwrt/package/zlib/zlib.mk b/openwrt/package/zlib/zlib.mk deleted file mode 100644 index 6561ddd349..0000000000 --- a/openwrt/package/zlib/zlib.mk +++ /dev/null @@ -1,75 +0,0 @@ -############################################################# -# -# zlib -# -############################################################# -ZLIB_SOURCE=zlib-1.1.4.tar.bz2 -ZLIB_SITE=http://aleron.dl.sourceforge.net/sourceforge/libpng -ZLIB_DIR=$(BUILD_DIR)/zlib-1.1.4 -ZLIB_CFLAGS= $(TARGET_CFLAGS) -fPIC -ifeq ($(strip $(BUILD_WITH_LARGEFILE)),true) -ZLIB_CFLAGS+= -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -endif - -$(DL_DIR)/$(ZLIB_SOURCE): - $(WGET) -P $(DL_DIR) $(ZLIB_SITE)/$(ZLIB_SOURCE) - -$(ZLIB_DIR)/.source: $(DL_DIR)/$(ZLIB_SOURCE) - bzcat $(DL_DIR)/$(ZLIB_SOURCE) | tar -C $(BUILD_DIR) -xvf - - touch $(ZLIB_DIR)/.source - -$(ZLIB_DIR)/.configured: $(ZLIB_DIR)/.source - (cd $(ZLIB_DIR); \ - ./configure \ - --shared \ - --prefix=/usr \ - --exec-prefix=$(STAGING_DIR)/usr/bin \ - --libdir=$(STAGING_DIR)/lib \ - --includedir=$(STAGING_DIR)/include \ - ); - touch $(ZLIB_DIR)/.configured; - -$(ZLIB_DIR)/libz.so.1.1.4: $(ZLIB_DIR)/.configured - $(MAKE) LDSHARED="$(TARGET_CROSS)ld -shared -soname,libz.so.1" \ - CFLAGS="$(ZLIB_CFLAGS)" CC=$(TARGET_CC) -C $(ZLIB_DIR) all libz.a; - touch -c $(ZLIB_DIR)/libz.so.1.1.4 - -$(STAGING_DIR)/lib/libz.so.1.1.4: $(ZLIB_DIR)/libz.so.1.1.4 - cp -dpf $(ZLIB_DIR)/libz.a $(STAGING_DIR)/lib; - cp -dpf $(ZLIB_DIR)/zlib.h $(STAGING_DIR)/include; - cp -dpf $(ZLIB_DIR)/zconf.h $(STAGING_DIR)/include; - cp -dpf $(ZLIB_DIR)/libz.so* $(STAGING_DIR)/lib; - (cd $(STAGING_DIR)/lib; ln -fs libz.so.1.1.4 libz.so.1); - chmod a-x $(STAGING_DIR)/lib/libz.so.1.1.4 - touch -c $(STAGING_DIR)/lib/libz.so.1.1.4 - -$(TARGET_DIR)/lib/libz.so.1.1.4: $(STAGING_DIR)/lib/libz.so.1.1.4 - cp -dpf $(STAGING_DIR)/lib/libz.so* $(TARGET_DIR)/lib; - -$(STRIP) $(TARGET_DIR)/lib/libz.so* - touch -c $(TARGET_DIR)/lib/libz.so.1.1.4 - -$(TARGET_DIR)/usr/lib/libz.a: $(STAGING_DIR)/lib/libz.so.1.1.4 - mkdir -p $(TARGET_DIR)/usr/include - cp -dpf $(STAGING_DIR)/include/zlib.h $(TARGET_DIR)/usr/include/ - cp -dpf $(STAGING_DIR)/include/zconf.h $(TARGET_DIR)/usr/include/ - cp -dpf $(STAGING_DIR)/lib/libz.a $(TARGET_DIR)/usr/lib/ - rm -f $(TARGET_DIR)/lib/libz.so - (cd $(TARGET_DIR)/usr/lib; ln -fs /lib/libz.so.1.1.4 libz.so) - touch -c $(TARGET_DIR)/usr/lib/libz.a - -zlib-headers: $(TARGET_DIR)/usr/lib/libz.a - -zlib: uclibc $(TARGET_DIR)/lib/libz.so.1.1.4 - -zlib-source: $(DL_DIR)/$(ZLIB_SOURCE) - -zlib-clean: - rm -f $(TARGET_DIR)/lib/libz.so* - -$(MAKE) -C $(ZLIB_DIR) clean - -zlib-dirclean: - rm -rf $(ZLIB_DIR) - -ifeq ($(strip $(BR2_PACKAGE_ZLIB)),y) -TARGETS+=zlib -endif diff --git a/openwrt/package/zlib/zlib.patch b/openwrt/package/zlib/zlib.patch new file mode 100644 index 0000000000..8f5a9b5358 --- /dev/null +++ b/openwrt/package/zlib/zlib.patch @@ -0,0 +1,206 @@ +diff -ruN zlib-1.2.2-orig/Makefile.in zlib-1.2.2-2/Makefile.in +--- zlib-1.2.2-orig/Makefile.in 2004-09-15 16:27:20.000000000 +0200 ++++ zlib-1.2.2-2/Makefile.in 2004-11-13 13:38:12.000000000 +0100 +@@ -25,20 +25,23 @@ + # -Wstrict-prototypes -Wmissing-prototypes + + LDFLAGS=libz.a +-LDSHARED=$(CC) ++LDSHARED=$(CC) -shared -Wl,-soname,$(SHAREDLIBM) + CPP=$(CC) -E + +-LIBS=libz.a ++LIBS= ++STATICLIB=libz.a + SHAREDLIB=libz.so + SHAREDLIBV=libz.so.1.2.2 + SHAREDLIBM=libz.so.1 + +-AR=ar rc ++AR=ar + RANLIB=ranlib + TAR=tar + SHELL=/bin/sh + EXE= + ++DESTDIR = ++ + prefix = /usr/local + exec_prefix = ${prefix} + libdir = ${exec_prefix}/lib +@@ -67,8 +70,8 @@ + echo ' *** zlib test FAILED ***'; \ + fi + +-libz.a: $(OBJS) $(OBJA) +- $(AR) $@ $(OBJS) $(OBJA) ++$(STATICLIB): $(OBJS) $(OBJA) ++ $(AR) rc $@ $(OBJS) $(OBJA) + -@ ($(RANLIB) $@ || true) >/dev/null 2>&1 + + match.o: match.S +@@ -77,8 +80,10 @@ + mv _match.o match.o + rm -f _match.s + ++$(SHAREDLIB): $(SHAREDLIBV) ++ + $(SHAREDLIBV): $(OBJS) +- $(LDSHARED) -o $@ $(OBJS) ++ $(LDSHARED) -lc -o $@ $(OBJS) + rm -f $(SHAREDLIB) $(SHAREDLIBM) + ln -s $@ $(SHAREDLIB) + ln -s $@ $(SHAREDLIBM) +@@ -90,23 +95,23 @@ + $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS) + + install: $(LIBS) +- -@if [ ! -d $(exec_prefix) ]; then mkdir -p $(exec_prefix); fi +- -@if [ ! -d $(includedir) ]; then mkdir -p $(includedir); fi +- -@if [ ! -d $(libdir) ]; then mkdir -p $(libdir); fi +- -@if [ ! -d $(man3dir) ]; then mkdir -p $(man3dir); fi +- cp zlib.h zconf.h $(includedir) +- chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h +- cp $(LIBS) $(libdir) +- cd $(libdir); chmod 755 $(LIBS) +- -@(cd $(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1 +- cd $(libdir); if test -f $(SHAREDLIBV); then \ ++ -@if [ ! -d $(DESTDIR)$(exec_prefix) ]; then mkdir -p $(DESTDIR)$(exec_prefix); fi ++ -@if [ ! -d $(DESTDIR)$(includedir) ]; then mkdir -p $(DESTDIR)$(includedir); fi ++ -@if [ ! -d $(DESTDIR)$(libdir) ]; then mkdir -p $(DESTDIR)$(libdir); fi ++ -@if [ ! -d $(DESTDIR)$(man3dir) ]; then mkdir -p $(DESTDIR)$(man3dir); fi ++ cp zlib.h zconf.h $(DESTDIR)$(includedir) ++ chmod 644 $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h ++ cp $(STATICLIB) $(SHAREDLIBV) $(DESTDIR)$(libdir) ++ cd $(DESTDIR)$(libdir); chmod 755 $(LIBS) ++ -@(cd $(DESTDIR)$(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1 ++ cd $(DESTDIR)$(libdir); if test -f $(SHAREDLIBV); then \ + rm -f $(SHAREDLIB) $(SHAREDLIBM); \ + ln -s $(SHAREDLIBV) $(SHAREDLIB); \ + ln -s $(SHAREDLIBV) $(SHAREDLIBM); \ + (ldconfig || true) >/dev/null 2>&1; \ + fi +- cp zlib.3 $(man3dir) +- chmod 644 $(man3dir)/zlib.3 ++ cp zlib.3 $(DESTDIR)$(man3dir) ++ chmod 644 $(DESTDIR)$(man3dir)/zlib.3 + # The ranlib in install is needed on NeXTSTEP which checks file times + # ldconfig is for Linux + +diff -ruN zlib-1.2.2-orig/configure zlib-1.2.2-2/configure +--- zlib-1.2.2-orig/configure 2004-09-07 07:50:06.000000000 +0200 ++++ zlib-1.2.2-2/configure 2004-11-13 12:37:43.000000000 +0100 +@@ -23,7 +23,7 @@ + VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h` + VER2=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\)\\..*/\1/p' < zlib.h` + VER1=`sed -n -e '/VERSION "/s/.*"\([0-9]*\)\\..*/\1/p' < zlib.h` +-AR=${AR-"ar rc"} ++AR=${AR-"ar"} + RANLIB=${RANLIB-"ranlib"} + prefix=${prefix-/usr/local} + exec_prefix=${exec_prefix-'${prefix}'} +@@ -73,7 +73,7 @@ + + if test "$gcc" -eq 1 && ($cc -c $cflags $test.c) 2>/dev/null; then + CC="$cc" +- SFLAGS=${CFLAGS-"-fPIC -O3"} ++ SFLAGS=${CFLAGS-"-D_REENTRANT -fPIC -O3"} + CFLAGS="$cflags" + case `(uname -s || echo unknown) 2>/dev/null` in + Linux | linux | GNU | GNU/*) LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1"};; +@@ -408,6 +408,29 @@ + echo Checking for mmap support... No. + fi + ++cat > $test.c < ++int main() { char buf[10]; snprintf(buf, sizeof(buf), "%s", "F"); return 0; } ++EOF ++if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then ++ echo "Checking for snprintf... Yes." ++ CFLAGS="$CFLAGS -DHAS_snprintf" ++else ++ echo "Checking for snprintf.. No." ++fi ++ ++cat > $test.c < ++#include ++int main(void) { va_list a; vsnprintf(0, 0, "", a); return 0; } ++EOF ++if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then ++ echo "Checking for vsnprintf... Yes." ++ CFLAGS="$CFLAGS -DHAS_vsnprintf" ++else ++ echo "Checking for vsnprintf.. No." ++fi ++ + CPP=${CPP-"$CC -E"} + case $CFLAGS in + *ASMV*) +@@ -424,20 +447,21 @@ + # udpate Makefile + sed < Makefile.in " + /^CC *=/s#=.*#=$CC# +-/^CFLAGS *=/s#=.*#=$CFLAGS# +-/^CPP *=/s#=.*#=$CPP# +-/^LDSHARED *=/s#=.*#=$LDSHARED# +-/^LIBS *=/s#=.*#=$LIBS# +-/^SHAREDLIB *=/s#=.*#=$SHAREDLIB# +-/^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# +-/^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM# +-/^AR *=/s#=.*#=$AR# +-/^RANLIB *=/s#=.*#=$RANLIB# +-/^EXE *=/s#=.*#=$EXE# +-/^prefix *=/s#=.*#=$prefix# +-/^exec_prefix *=/s#=.*#=$exec_prefix# +-/^libdir *=/s#=.*#=$libdir# +-/^includedir *=/s#=.*#=$includedir# +-/^mandir *=/s#=.*#=$mandir# +-/^LDFLAGS *=/s#=.*#=$LDFLAGS# ++/^CC *=/s%=.*%= $CC% ++/^CFLAGS *=/s%=.*%= $CFLAGS% ++/^CPP *=/s%=.*%= $CPP% ++/^LDSHARED *=/s%=.*%= $LDSHARED% ++/^LIBS *=/s%=.*%= $LIBS% ++/^SHAREDLIB *=/s%=.*%= $SHAREDLIB% ++/^SHAREDLIBV *=/s%=.*%= $SHAREDLIBV% ++/^SHAREDLIBM *=/s%=.*%= $SHAREDLIBM% ++/^AR *=/s%=.*%= $AR% ++/^RANLIB *=/s%=.*%= $RANLIB% ++/^EXE *=/s%=.*%= $EXE% ++/^prefix *=/s%=.*%= $prefix% ++/^exec_prefix *=/s%=.*%= $exec_prefix% ++/^libdir *=/s%=.*%= $libdir% ++/^includedir *=/s%=.*%= $includedir% ++/^mandir *=/s%=.*%= $mandir% ++/^LDFLAGS *=/s%=.*%= $LDFLAGS% + " > Makefile +diff -ruN zlib-1.2.2-orig/contrib/minizip/Makefile zlib-1.2.2-2/contrib/minizip/Makefile +--- zlib-1.2.2-orig/contrib/minizip/Makefile 2003-09-10 20:00:16.000000000 +0200 ++++ zlib-1.2.2-2/contrib/minizip/Makefile 2004-11-13 12:37:43.000000000 +0100 +@@ -1,8 +1,8 @@ + CC=cc +-CFLAGS=-O -I../.. ++CFLAGS=-O2 -g -I../.. -Dunix + +-UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a +-ZIP_OBJS = minizip.o zip.o ioapi.o ../../libz.a ++UNZ_OBJS = miniunz.o unzip.o ioapi.o ++ZIP_OBJS = minizip.o zip.o ioapi.o + + .c.o: + $(CC) -c $(CFLAGS) $*.c +@@ -10,10 +10,10 @@ + all: miniunz minizip + + miniunz: $(UNZ_OBJS) +- $(CC) $(CFLAGS) -o $@ $(UNZ_OBJS) ++ $(CC) $(CFLAGS) -o $@ $(UNZ_OBJS) -L ../.. -lz + + minizip: $(ZIP_OBJS) +- $(CC) $(CFLAGS) -o $@ $(ZIP_OBJS) ++ $(CC) $(CFLAGS) -o $@ $(ZIP_OBJS) -L ../.. -lz + + test: miniunz minizip + ./minizip test readme.txt diff --git a/openwrt/rules.mk b/openwrt/rules.mk new file mode 100644 index 0000000000..681d4f9b1c --- /dev/null +++ b/openwrt/rules.mk @@ -0,0 +1,122 @@ +include $(TOPDIR)/.config +MAKE1=make +MAKE=make -j$(BR2_JLEVEL) + +# Strip off the annoying quoting +ARCH:=$(strip $(subst ",, $(BR2_ARCH))) +#" +WGET:=$(strip $(subst ",, $(BR2_WGET))) +#" + +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 ($(BR2_TAR_VERBOSITY),y) +TAR_OPTIONS=-xvf +else +TAR_OPTIONS=-xf +endif + +ifneq ($(BR2_LARGEFILE),y) +DISABLE_LARGEFILE= --disable-largefile +endif +TARGET_CFLAGS:=$(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING) + +OPTIMIZE_FOR_CPU=$(ARCH) +HOSTCC:=gcc +BASE_DIR:=$(TOPDIR) +DL_DIR:=$(BASE_DIR)/dl +BUILD_DIR:=$(BASE_DIR)/build_$(ARCH)$(ARCH_FPU_SUFFIX) +SCRIPT_DIR:=$(BASE_DIR)/scripts +BIN_DIR:=$(BASE_DIR)/bin +STAMP_DIR:=$(BUILD_DIR)/stamp +PACKAGE_DIR:=$(BIN_DIR)/packages +TARGET_DIR:=$(BUILD_DIR)/root +STAMP_DIR:=$(BUILD_DIR)/stamp +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)/usr/bin:$(STAGING_DIR)/bin:/bin:/sbin:/usr/bin:/usr/sbin +IMAGE:=$(BUILD_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 +STRIP:=$(STAGING_DIR)/bin/sstrip +PATCH=$(SCRIPT_DIR)/patch-kernel.sh +SED:=$(STAGING_DIR)/bin/sed -i -e +LINUX_VERSION=2.4.29 +LINUX_DIR:=$(BUILD_DIR)/linux +LINUX_HEADERS_DIR:=$(TOOL_BUILD_DIR)/linux +LINUX_KERNEL:=$(BUILD_DIR)/buildroot-kernel +MODULES_SUBDIR := lib/modules/$(LINUX_VERSION) +MODULES_DIR := $(BUILD_DIR)/modules/$(MODULES_SUBDIR) + + +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 + +ifeq ($(BR2_ENABLE_MULTILIB),y) +MULTILIB:=--enable-multilib +endif + + +# invoke ipkg with configuration in $(STAGING_DIR)/etc/ipkg.conf +IPKG := PATH="$(TARGET_PATH)" IPKG_CONF_DIR=$(STAGING_DIR)/etc ipkg -force-depends + +# invoke ipkg-build with some default options +IPKG_BUILD := PATH="$(TARGET_PATH)" ipkg-build -c -o root -g root + +# where to build (and put) .ipk packages +IPKG_TARGET_DIR := $(BUILD_DIR) + diff --git a/openwrt/scripts/configtest.pl b/openwrt/scripts/configtest.pl new file mode 100755 index 0000000000..01323a5211 --- /dev/null +++ b/openwrt/scripts/configtest.pl @@ -0,0 +1,12 @@ +#!/usr/bin/perl + +my %change = ( + 'BUSYBOX' => 'make -C package busybox-clean', + '' => 'make target_clean' +); + +foreach my $change (keys %change) { + my $v1 = `grep '$change' .config.test`; + my $v2 = `grep '$change' .config`; + $v1 eq $v2 or system($change{$change}); +} diff --git a/openwrt/scripts/gen_busybox_config.pl b/openwrt/scripts/gen_busybox_config.pl new file mode 100755 index 0000000000..1a84ab999d --- /dev/null +++ b/openwrt/scripts/gen_busybox_config.pl @@ -0,0 +1,22 @@ +#!/usr/bin/perl +use strict; + +my $line; +my $l1 = ''; +my $l2 = '=y'; +while (<>) { + chomp; + /^(# )BR2_LARGEFILE(.+)$/ and do { + $l1 = $1; + $l2 = $2; + }; + /^(# )?BUSYBOX_(.+)/ and do { + my $p1 = $1; + my $p2 = $2; + $p2 =~ /(CONFIG_LFS|FDISK_SUPPORT_LARGE_DISKS)/ and do { + $p1 = $l1; + $p2 = "$1$l2"; + }; + print "$p1$p2\n"; + } +} diff --git a/openwrt/scripts/gen_busybox_menuconfig.pl b/openwrt/scripts/gen_busybox_menuconfig.pl new file mode 100644 index 0000000000..6ce323bb13 --- /dev/null +++ b/openwrt/scripts/gen_busybox_menuconfig.pl @@ -0,0 +1,69 @@ +#!/usr/bin/perl +use strict; +my $PATH = $ARGV[0]; +($PATH and -d $PATH) or die 'invalid path'; +my $DEFCONFIG = $ARGV[1]; +($DEFCONFIG and -f $DEFCONFIG) or die 'invalid config file'; + +my %config; + +open CONFIG, $DEFCONFIG or die 'cannot open config file'; +while () { + /^([\w_]+)=([ym])/ and $config{$1} = $2; + /^([\w_]+)=(\d+)/ and $config{$1} = $2; + /^([\w_]+)=(".+")/ and $config{$1} = $2; +} +close CONFIG; + +open FIND, "find \"$PATH\" -name Config.in |"; +while () { + chomp; + my $input = $_; + s/^$PATH\///g; + s/sysdeps\/linux\///g; + my $output = $_; + print STDERR "$input => $output\n"; + $output =~ /^(.+)\/[^\/]+$/ and system("mkdir -p $1"); + + open INPUT, $input; + open OUTPUT, ">$output"; + my ($cur, $default_set, $line); + while ($line = ) { + next if $line =~ /^\s*mainmenu/; + + # FIXME: make this dynamic + $line =~ s/default CONFIG_FEATURE_BUFFERS_USE_MALLOC/default CONFIG_FEATURE_BUFFERS_GO_ON_STACK/; + $line =~ s/default BUSYBOX_CONFIG_FEATURE_SH_IS_NONE/default BUSYBOX_CONFIG_FEATURE_SH_IS_ASH/; + + if ($line =~ /^\s*config\s*([\w_]+)/) { + $cur = $1; + undef $default_set; + } + if ($line =~ /^\s*(menu|choice|end|source)/) { + undef $cur; + undef $default_set; + } + $line =~ s/^(\s*source\s+)/$1package\/busybox\/config\//; + + $line =~ s/(\s+)((CONFIG|FDISK|USING|CROSS|EXTRA|PREFIX|FEATURE|HAVE|BUSYBOX)[\w_]*)/$1BUSYBOX_$2/g; + + if ($cur) { + ($cur !~ /^CONFIG/ or $cur eq 'CONFIG_LFS') and do { + $line =~ s/^(\s*(bool|tristate|string))\s*".+"$/$1/; + }; + if ($line =~ /^\s*default/) { + my $c; + $default_set = 1; + $c = $config{$cur} or $c = 'n'; + + $line =~ s/^(\s*default\s*)(\w+|"[^"]*")(.*)/$1$c$3/; + } + } + + print OUTPUT $line; + } + close OUTPUT; + close INPUT; + +} +close FIND; diff --git a/openwrt/scripts/make-ipkg-dir.sh b/openwrt/scripts/make-ipkg-dir.sh new file mode 100755 index 0000000000..f725413ae3 --- /dev/null +++ b/openwrt/scripts/make-ipkg-dir.sh @@ -0,0 +1,11 @@ +#!/bin/bash +TARGET=$1 +CONTROL=$2 +VERSION=$3 +ARCH=$4 + +mkdir -p "$TARGET/CONTROL" +grep '^[^(Version|Architecture)]' "$CONTROL" > "$TARGET/CONTROL/control" +echo "Version: $VERSION" >> "$TARGET/CONTROL/control" +echo "Architecture: $ARCH" >> "$TARGET/CONTROL/control" +chmod 644 "$TARGET/CONTROL/control" diff --git a/openwrt/toolchain/patch-kernel.sh b/openwrt/scripts/patch-kernel.sh similarity index 100% rename from openwrt/toolchain/patch-kernel.sh rename to openwrt/scripts/patch-kernel.sh diff --git a/openwrt/target/Config.in b/openwrt/target/Config.in index 1a997da2a6..6453d54e72 100644 --- a/openwrt/target/Config.in +++ b/openwrt/target/Config.in @@ -1,6 +1,38 @@ -choice - prompt "Target Root Filesystem" - source "target/jffs2/Config.in" - source "target/squashfs-lzma/Config.in" -endchoice +menu "Target Root Filesystem" + config BR2_TARGET_ROOTFS_JFFS2 + bool "jffs2" + default y + help + Build a jffs2 root filesystem + + config BR2_TARGET_ROOTFS_SQUASHFS_LZMA + bool "squashfs-lzma" + default y + help + Build a squashfs-lzma root filesystem + +endmenu + +menu "Device Support" + + config BR2_TARGET_DEFAULT + default y + bool "Generic" + + config BR2_TARGET_WRT54G + default y + select BR2_TARGET_DEFAULT + bool "Linksys WRT54G" + + config BR2_TARGET_WRT54GS + default y + select BR2_TARGET_DEFAULT + bool "Linksys WRT54GS" + + config BR2_TARGET_MOTOROLA + default n + select BR2_TARGET_DEFAULT + bool "Motorola" + +endmenu diff --git a/openwrt/target/Makefile.in b/openwrt/target/Makefile.in deleted file mode 100644 index d40fd158d7..0000000000 --- a/openwrt/target/Makefile.in +++ /dev/null @@ -1,20 +0,0 @@ -# Default target skeleton stuff, may be overridden -EXTRAVERSION:= -TARGET_SKELETON=target/default/skel.tar.gz -TARGET_SKEL_DIR=target/default/target_skeleton - -include target/device/Makefile.in - -openwrt-linux.trx: openwrt-trx - PATH=$(TARGET_PATH) trx -o openwrt-linux$(EXTRAVERSION).trx \ - $(LINUX_DIR)/$(LINUX_BINLOC) $(JFFS2FLAGS) $(IMAGE).$(ROOTFS) - -openwrt-code.bin: openwrt-addpattern openwrt-linux.trx - PATH=$(TARGET_PATH) addpattern -2 -i openwrt-linux$(EXTRAVERSION).trx \ - -o openwrt-$(TAG)-code$(EXTRAVERSION).bin -g - @$(SED) "1s,^W54S,$(TAG)," openwrt-$(TAG)-code$(EXTRAVERSION).bin - -openwrt-image-clean: - @-rm openwrt-* 2>/dev/null - -openwrt-image-dirclean: openwrt-dirclean diff --git a/openwrt/target/default/Makefile.in b/openwrt/target/default/Makefile.in deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/openwrt/target/default/skel.tar.gz b/openwrt/target/default/skel.tar.gz deleted file mode 100644 index 86cefb1d24a81521856763fc61a4fa1a0fa2b5dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193 zcmV;y06za8iwFRIuNFc81MSsK4uUWcK;a&R8`#!P=RE$fG>`)7@ugL^ii;9W-nW^M zvVgo&QrC?;Qm!Z$-R{pVytYE}BLvKUXmd;~_PTxgGBx?rYQV zW_@{)W&Vkj`}e6kRon#M^bZ /proc/jffs2_bbc +rm -rf /var +ln -sf /tmp /var mkdir -p /var/run +mkdir -p /var/log +touch /var/log/wtmp +touch /var/log/lastlog [ "$(nvram get il0macaddr)" = "00:90:4c:5f:00:2a" ] && { # if default wifi mac, set two higher than the lan mac diff --git a/openwrt/target/default/target_skeleton/etc/nvram.overrides b/openwrt/target/default/target_skeleton/etc/nvram.overrides index addfedd257..206c90b0dd 100644 --- a/openwrt/target/default/target_skeleton/etc/nvram.overrides +++ b/openwrt/target/default/target_skeleton/etc/nvram.overrides @@ -3,6 +3,9 @@ # This file handles the NVRAM quirks of various hardware. # THIS FILE IS NOT A REPLACEMENT FOR NVRAM +# Load sysconf defaults +[ -f /etc/sysconf ] && . /etc/sysconf + [ "$(nvram get boardnum)" = "asusX" ] && \ [ "$(nvram get boardtype)" = "bcm94710dev" ] && { asus=1 @@ -67,9 +70,9 @@ NVRAM_lan_proto="static" echo "### YOU ARE IN FAILSAFE MODE ####" NVRAM_lan_ifname="br0" NVRAM_lan_ifnames=${FAILSAFE_ifnames:-"vlan0 vlan1 eth1"} - NVRAM_lan_ipaddr="192.168.1.1" - NVRAM_lan_netmask="255.255.255.0" - NVRAM_lan_hwaddr="00:0B:AD:0A:DD:00" + NVRAM_lan_ipaddr=${BR2_SYSCONF_FAILSAFE_IP:-"192.168.1.1"} + NVRAM_lan_netmask=${BR2_SYSCONF_FAILSAFE_NETMASK:-"255.255.255.0"} + NVRAM_lan_hwaddr=${BR2_SYSCONF_FAILSAFE_MAC:-"00:0B:AD:0A:DD:00"} NVRAM_wan_ifname="none" NVRAM_wifi_ifname="none" } diff --git a/openwrt/target/default/target_skeleton/etc/preinit b/openwrt/target/default/target_skeleton/etc/preinit index 6507d2319c..c6ad0d7065 100755 --- a/openwrt/target/default/target_skeleton/etc/preinit +++ b/openwrt/target/default/target_skeleton/etc/preinit @@ -8,7 +8,7 @@ if [ $(cat /proc/sys/reset) = 1 ] ; then while :; do { echo $(((X=(X+1)%8)%2)) > /proc/sys/diag; sleep $((X==0)); } done & else mount | grep jffs2 >&- - if [ $? = 0 ] ; then + if [ $? = 0 ] ; then mtd unlock rootfs [ $(cat /proc/mtd | wc -l) = 6 ] && { echo 5 > /proc/sys/diag @@ -27,4 +27,6 @@ else fi fi mount none /tmp -t ramfs +mkdir -p /dev/pts +mount none /dev/pts -t devpts exec /sbin/init diff --git a/openwrt/target/default/target_skeleton/etc/shells b/openwrt/target/default/target_skeleton/etc/shells new file mode 100644 index 0000000000..006aa38ced --- /dev/null +++ b/openwrt/target/default/target_skeleton/etc/shells @@ -0,0 +1 @@ +/bin/ash diff --git a/openwrt/target/device/Config.in b/openwrt/target/device/Config.in deleted file mode 100644 index 36d056cadf..0000000000 --- a/openwrt/target/device/Config.in +++ /dev/null @@ -1,17 +0,0 @@ -choice - prompt "Device Support" - default BR2_TARGET_ALL - -config BR2_TARGET_ALL - bool "Support for all devices" - -config BR2_TARGET_LINKSYS_WRT54G - bool "Linksys WRT54G Support" - -config BR2_TARGET_LINKSYS_WRT54GS - bool "Linksys WRT54GS Support" - -config BR2_TARGET_ASUS_WL500G - bool "Asus WL-500g Support" - -endchoice diff --git a/openwrt/target/device/Makefile.in b/openwrt/target/device/Makefile.in deleted file mode 100644 index 92d6e76bc7..0000000000 --- a/openwrt/target/device/Makefile.in +++ /dev/null @@ -1,2 +0,0 @@ --include target/device/*/*/Makefile.in --include target/device/all/Makefile.in diff --git a/openwrt/target/jffs2/Config.in b/openwrt/target/jffs2/Config.in deleted file mode 100644 index c51ffc1cba..0000000000 --- a/openwrt/target/jffs2/Config.in +++ /dev/null @@ -1,5 +0,0 @@ -config BR2_TARGET_ROOTFS_JFFS2 - bool "jffs2" - help - Build a jffs2 root filesystem - diff --git a/openwrt/target/jffs2/Makefile b/openwrt/target/jffs2/Makefile new file mode 100644 index 0000000000..ff63e6fc2a --- /dev/null +++ b/openwrt/target/jffs2/Makefile @@ -0,0 +1,36 @@ +include $(TOPDIR)/rules.mk + +include ./jffs2root.mk + +TARGETS:= $(BIN_DIR)/openwrt-generic-jffs2-4MB.trx $(BIN_DIR)/openwrt-generic-jffs2-8MB.trx + +prepare: $(MTD_DIR)/.unpacked +compile: mtd +install: compile $(TARGETS) +clean: jffs2root-dirclean + +$(BIN_DIR)/openwrt-generic-jffs2-4MB.trx: + $(MKFS_JFFS2) --pad --little-endian --squash -e 0x10000 \ + -d $(TARGET_DIR) -o $(IMAGE)-4MB.jffs2 + PATH=$(TARGET_PATH) trx -o $@ \ + $(LINUX_KERNEL) -a 0x10000 $(IMAGE)-4MB.jffs2 + +$(BIN_DIR)/openwrt-generic-jffs2-8MB.trx: + $(MKFS_JFFS2) --pad --little-endian --squash -e 0x20000 \ + -d $(TARGET_DIR) -o $(IMAGE)-8MB.jffs2 + PATH=$(TARGET_PATH) trx -o $@ \ + $(LINUX_KERNEL) -a 0x20000 $(IMAGE)-8MB.jffs2 + +$(BIN_DIR)/openwrt-wrt54g-jffs2.bin: $(BIN_DIR)/openwrt-generic-jffs2-4MB.trx + PATH=$(TARGET_PATH) addpattern -2 -i $< -o $@ -g + $(SED) "1s,^W54S,W54G," $@ + +$(BIN_DIR)/openwrt-wrt54gs-jffs2.bin: $(BIN_DIR)/openwrt-generic-jffs2-8MB.trx + PATH=$(TARGET_PATH) addpattern -2 -i $< -o $@ -g + +$(BIN_DIR)/openwrt-motorola-jffs2-4MB.bin: $(BIN_DIR)/openwrt-generic-jffs2-4MB.trx + PATH=$(TARGET_PATH) motorola-bin $< $@ + +$(BIN_DIR)/openwrt-motorola-jffs2-8MB.bin: $(BIN_DIR)/openwrt-generic-jffs2-8MB.trx + PATH=$(TARGET_PATH) motorola-bin $< $@ + diff --git a/openwrt/target/jffs2/jffs2root.mk b/openwrt/target/jffs2/jffs2root.mk index 5a0259b27c..1c7b962cfe 100644 --- a/openwrt/target/jffs2/jffs2root.mk +++ b/openwrt/target/jffs2/jffs2root.mk @@ -28,13 +28,6 @@ mtd: $(MKFS_JFFS2) # ############################################################# -jffs2root: mtd - -@find $(TARGET_DIR) -type f -perm +111 | xargs $(SSTRIP) 2>/dev/null || true; - @rm -rf $(TARGET_DIR)/usr/man - @rm -rf $(TARGET_DIR)/usr/info - $(MKFS_JFFS2) --pad --little-endian --squash -e $(JFFS2_BLOCK_SIZE) \ - -d $(TARGET_DIR) -o $(IMAGE).jffs2 - jffs2root-source: $(DL_DIR)/$(MTD_SOURCE) jffs2root-clean: @@ -42,15 +35,3 @@ jffs2root-clean: jffs2root-dirclean: rm -rf $(MTD_DIR) - -ifeq ($(strip $(BR2_TARGET_ROOTFS_JFFS2)),y) -TARGETS+=openwrt-jffs2root openwrt-image -ROOTFS=jffs2 -JFFS2FLAGS=-a $(JFFS2_BLOCK_SIZE) - -openwrt-image: openwrt - @make jffs2root openwrt-code.bin TAG=W54G \ - EXTRAVERSION=$(EXTRAVERSION)-JFFS2-4M JFFS2_BLOCK_SIZE=0x10000 - @make jffs2root openwrt-code.bin TAG=W54S \ - EXTRAVERSION=$(EXTRAVERSION)-JFFS2-8M JFFS2_BLOCK_SIZE=0x20000 -endif diff --git a/openwrt/target/squashfs-lzma/Config.in b/openwrt/target/squashfs-lzma/Config.in deleted file mode 100644 index cc46d102ad..0000000000 --- a/openwrt/target/squashfs-lzma/Config.in +++ /dev/null @@ -1,5 +0,0 @@ -config BR2_TARGET_ROOTFS_SQUASHFS_LZMA - bool "squashfs-lzma" - help - Build a squashfs-lzma root filesystem - diff --git a/openwrt/target/squashfs-lzma/Makefile b/openwrt/target/squashfs-lzma/Makefile new file mode 100644 index 0000000000..6c709952e4 --- /dev/null +++ b/openwrt/target/squashfs-lzma/Makefile @@ -0,0 +1,16 @@ +include $(TOPDIR)/rules.mk +include ./squashfslzmaroot.mk + +TARGETS:=$(BIN_DIR)/openwrt-generic-squashfs.trx + +prepare: $(SQUASHFSLZMA_DIR)/.unpacked +compile: squashfslzma +install: $(TARGETS) +clean: squashfslzmaroot-dirclean + +$(BIN_DIR)/openwrt-generic-squashfs.trx: + @mkdir -p $(TARGET_DIR)/jffs + $(SQUASHFSLZMA_DIR)/squashfs-tools/mksquashfs-lzma $(TARGET_DIR) $(IMAGE).squashfslzma -noappend -root-owned -le + PATH=$(TARGET_PATH) trx -o $@ \ + $(LINUX_KERNEL) $(IMAGE).squashfslzma + diff --git a/openwrt/target/squashfs-lzma/squashfslzmaroot.mk b/openwrt/target/squashfs-lzma/squashfslzmaroot.mk index 1aa80e0029..ee7ede84b0 100644 --- a/openwrt/target/squashfs-lzma/squashfslzmaroot.mk +++ b/openwrt/target/squashfs-lzma/squashfslzmaroot.mk @@ -36,27 +36,7 @@ squashfslzma-dirclean: # ############################################################# -squashfslzmaroot: squashfslzma - @rm -rf $(TARGET_DIR)/usr/man - @rm -rf $(TARGET_DIR)/usr/info - $(SQUASHFSLZMA_DIR)/squashfs-tools/mksquashfs-lzma \ - $(TARGET_DIR) $(IMAGE).squashfslzma -noappend -root-owned -le - squashfslzmaroot-source: squashfslzma-source -squashfslzmaroot-clean: - -$(MAKE) -C $(SQUASHFSLZMA_DIR) clean - squashfslzmaroot-dirclean: rm -rf $(SQUASHFSLZMA_DIR) - -ifeq ($(strip $(BR2_TARGET_ROOTFS_SQUASHFS_LZMA)),y) -TARGETS+=squashfslzmaroot openwrt-image -ROOTFS=squashfslzma - -openwrt-image: openwrt - @make openwrt-code.bin TAG=W54G \ - EXTRAVERSION=$(EXTRAVERSION)-SQUASHFSLZMA - @make openwrt-code.bin TAG=W54S \ - EXTRAVERSION=$(EXTRAVERSION)-SQUASHFSLZMA -endif diff --git a/openwrt/target/utils/Makefile b/openwrt/target/utils/Makefile new file mode 100644 index 0000000000..2a91cbbd59 --- /dev/null +++ b/openwrt/target/utils/Makefile @@ -0,0 +1,28 @@ +include $(TOPDIR)/rules.mk + +TARGETS := addpattern trx +ifeq ($(BR2_TARGET_BELKIN),y) +TARGETS += belkin-bin +endif +ifeq ($(BR2_TARGET_MOTOROLA),y) +TARGETS += motorola-bin +endif + +UTILS_BUILD_DIR:=$(BUILD_DIR)/target-utils + +prepare: $(UTILS_BUILD_DIR) +compile: prepare $(patsubst %,$(UTILS_BUILD_DIR)/%,$(TARGETS)) +install: compile + mkdir -p $(STAGING_DIR)/bin + cp -a $(UTILS_BUILD_DIR)/* $(STAGING_DIR)/bin/ +package: +clean: + rm -rf $(UTILS_BUILD_DIR) + +$(UTILS_BUILD_DIR): + mkdir -p $(UTILS_BUILD_DIR) + +$(UTILS_BUILD_DIR)/%: src/%.c + $(CC) -o $@ $(patsubst $(UTILS_BUILD_DIR)/%,src/%.c,$@) + chmod 755 $@ + diff --git a/openwrt/package/openwrt/addpattern.c b/openwrt/target/utils/src/addpattern.c similarity index 100% rename from openwrt/package/openwrt/addpattern.c rename to openwrt/target/utils/src/addpattern.c diff --git a/openwrt/target/utils/src/motorola-bin.c b/openwrt/target/utils/src/motorola-bin.c new file mode 100644 index 0000000000..476afe32f2 --- /dev/null +++ b/openwrt/target/utils/src/motorola-bin.c @@ -0,0 +1,109 @@ +/* + * motorola-bin.c + * + * Copyright (C) 2005 Mike Baker + * Openwrt.org + * + * $Id$ + * + * 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. + * + */ + +#include +#include +#include +#include +#include +#include +#include + +unsigned long *crc32; + +void init_crc32() +{ + unsigned long crc; + unsigned long poly = ntohl(0x2083b8ed); + int n, bit; + if ((crc32 = (unsigned long *) malloc(256 * sizeof(unsigned long))) == (void *)-1) { + perror("malloc"); + exit(1); + } + for (n = 0; n < 256; n++) { + crc = (unsigned long) n; + for (bit = 0; bit < 8; bit++) + crc = (crc & 1) ? (poly ^ (crc >> 1)) : (crc >> 1); + crc32[n] = crc; + } +} + +unsigned int crc32buf(char *buf, size_t len) +{ + unsigned int crc = 0xFFFFFFFF; + for (; len; len--, buf++) + crc = crc32[(crc ^ *buf) & 0xff] ^ (crc >> 8); + return crc; +} + +struct motorola { + unsigned int crc; // crc32 of the remainder + unsigned int flags; // unknown, 10577050 + char *trx; // standard trx +}; + +int main(int argc, char **argv) +{ + unsigned int len; + int fd; + void *trx; + struct motorola *firmware; + + if (argc<3) { + printf("%s \n",argv[0]); + exit(0); + } + + // mmap trx file + if (((fd = open(argv[1], O_RDONLY)) < 0) + || ((len = lseek(fd, 0, SEEK_END)) < 0) + || ((trx = mmap(0, len, PROT_READ, MAP_SHARED, fd, 0)) == (void *) (-1)) + || (close(fd) < 0)) { + perror("open/malloc"); + exit(-1); + } + + // create a firmware image in memory + // and copy the trx to it + firmware = malloc(len+8); + memcpy(&firmware->trx,trx,len); + munmap(trx,len); + + // setup the motorola headers + init_crc32(); + firmware->flags = ntohl(0x10577050); + firmware->crc = htonl(crc32buf((char *)&firmware->flags,len+4)); + + // write the firmware + if (((fd = open(argv[2], O_CREAT|O_WRONLY,0644)) < 0) + || (write(fd,firmware,len+8) != len+8) + || (close(fd) < 0)) { + perror("write"); + exit(-1); + } + + free(firmware); + + return 0; +} diff --git a/openwrt/package/openwrt/trx.c b/openwrt/target/utils/src/trx.c similarity index 100% rename from openwrt/package/openwrt/trx.c rename to openwrt/target/utils/src/trx.c diff --git a/openwrt/toolchain/Config.in b/openwrt/toolchain/Config.in index 7ceb7942eb..5b3fe70125 100644 --- a/openwrt/toolchain/Config.in +++ b/openwrt/toolchain/Config.in @@ -38,7 +38,7 @@ config BR2_SOFT_FLOAT config BR2_TARGET_OPTIMIZATION string "Target Optimizations" - default "-Os -pipe -mips2" + default "-Os -pipe -mips32 -mtune=mips32" help Optimizations to use when building for the target host. diff --git a/openwrt/toolchain/Makefile b/openwrt/toolchain/Makefile new file mode 100644 index 0000000000..0c06fe9ea0 --- /dev/null +++ b/openwrt/toolchain/Makefile @@ -0,0 +1,45 @@ +# Main makefile for the toolchain +include $(TOPDIR)/rules.mk +TARGETS:=sed utils binutils gcc uClibc ipkg-utils + +TARGETS_INSTALL:=$(patsubst %,%-install,$(TARGETS)) +TARGETS_CLEAN:=$(patsubst %,%-clean,$(TARGETS)) + +all: install +install: $(TARGETS_INSTALL) +clean: $(TARGETS_CLEAN) + +uClibc-prepare: kernel-headers-prepare sed-install utils-install +binutils-prepare: uClibc-prepare +gcc-prepare: binutils-install +uClibc-compile: gcc-prepare +gcc-install: uClibc-install + +$(STAMP_DIR): + mkdir -p $(STAMP_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 + +$(TOOL_BUILD_DIR): + @mkdir -p $(TOOL_BUILD_DIR) + +%-prepare: $(STAMP_DIR) $(STAGING_DIR) $(TOOL_BUILD_DIR) + @[ -f $(STAMP_DIR)/.toolchain_$@ ] || $(MAKE) -C $(patsubst %-prepare,%,$@) prepare + @touch $(STAMP_DIR)/.toolchain_$@ + +%-compile: %-prepare + @[ -f $(STAMP_DIR)/.toolchain_$@ ] || $(MAKE) -C $(patsubst %-compile,%,$@) compile + @touch $(STAMP_DIR)/.toolchain_$@ + +%-install: %-compile + @[ -f $(STAMP_DIR)/.toolchain_$@ ] || $(MAKE) -C $(patsubst %-install,%,$@) install + @touch $(STAMP_DIR)/.toolchain_$@ + +%-clean: + @$(MAKE) -C $(patsubst %-clean,%,$@) clean + @rm -f $(STAMP_DIR)/.toolchain_$(patsubst %-clean,%,$@)-* + diff --git a/openwrt/toolchain/Makefile.in b/openwrt/toolchain/Makefile.in deleted file mode 100644 index bc2d26dfb2..0000000000 --- a/openwrt/toolchain/Makefile.in +++ /dev/null @@ -1,10 +0,0 @@ -ifeq ($(BR2_ENABLE_MULTILIB),y) -MULTILIB:=--enable-multilib -endif - - -# FIXME -- this is temporary -OPTIMIZE_FOR_CPU=$(ARCH) - -# gcc has a bunch of needed stuff.... -include toolchain/gcc/Makefile.in diff --git a/openwrt/toolchain/binutils/2.14.90.0.6/002-max-pagesize.patch b/openwrt/toolchain/binutils/2.14.90.0.6/002-max-pagesize.patch new file mode 100644 index 0000000000..a8ae110e86 --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.6/002-max-pagesize.patch @@ -0,0 +1,12 @@ +diff -urN binutils-2.14.90.0.8.test/bfd/elf32-mips.c binutils-2.14.90.0.8/bfd/elf32-mips.c +--- binutils-2.14.90.0.8.test/bfd/elf32-mips.c 2004-01-14 22:07:43.000000000 +0100 ++++ binutils-2.14.90.0.8/bfd/elf32-mips.c 2005-03-03 23:44:00.000000000 +0100 +@@ -1611,7 +1611,7 @@ + + /* The SVR4 MIPS ABI says that this should be 0x10000, and Linux uses + page sizes of up to that limit, so we need to respect it. */ +-#define ELF_MAXPAGESIZE 0x10000 ++#define ELF_MAXPAGESIZE 0x1000 + #define elf32_bed elf32_tradbed + + /* Include the target file again for this target. */ diff --git a/openwrt/toolchain/binutils/2.14.90.0.7/002-max-pagesize.patch b/openwrt/toolchain/binutils/2.14.90.0.7/002-max-pagesize.patch new file mode 100644 index 0000000000..a8ae110e86 --- /dev/null +++ b/openwrt/toolchain/binutils/2.14.90.0.7/002-max-pagesize.patch @@ -0,0 +1,12 @@ +diff -urN binutils-2.14.90.0.8.test/bfd/elf32-mips.c binutils-2.14.90.0.8/bfd/elf32-mips.c +--- binutils-2.14.90.0.8.test/bfd/elf32-mips.c 2004-01-14 22:07:43.000000000 +0100 ++++ binutils-2.14.90.0.8/bfd/elf32-mips.c 2005-03-03 23:44:00.000000000 +0100 +@@ -1611,7 +1611,7 @@ + + /* The SVR4 MIPS ABI says that this should be 0x10000, and Linux uses + page sizes of up to that limit, so we need to respect it. */ +-#define ELF_MAXPAGESIZE 0x10000 ++#define ELF_MAXPAGESIZE 0x1000 + #define elf32_bed elf32_tradbed + + /* Include the target file again for this target. */ diff --git a/openwrt/toolchain/binutils/2.15/002-max-pagesize.patch b/openwrt/toolchain/binutils/2.15/002-max-pagesize.patch new file mode 100644 index 0000000000..a8ae110e86 --- /dev/null +++ b/openwrt/toolchain/binutils/2.15/002-max-pagesize.patch @@ -0,0 +1,12 @@ +diff -urN binutils-2.14.90.0.8.test/bfd/elf32-mips.c binutils-2.14.90.0.8/bfd/elf32-mips.c +--- binutils-2.14.90.0.8.test/bfd/elf32-mips.c 2004-01-14 22:07:43.000000000 +0100 ++++ binutils-2.14.90.0.8/bfd/elf32-mips.c 2005-03-03 23:44:00.000000000 +0100 +@@ -1611,7 +1611,7 @@ + + /* The SVR4 MIPS ABI says that this should be 0x10000, and Linux uses + page sizes of up to that limit, so we need to respect it. */ +-#define ELF_MAXPAGESIZE 0x10000 ++#define ELF_MAXPAGESIZE 0x1000 + #define elf32_bed elf32_tradbed + + /* Include the target file again for this target. */ diff --git a/openwrt/toolchain/binutils/Makefile b/openwrt/toolchain/binutils/Makefile new file mode 100644 index 0000000000..2bbb48727b --- /dev/null +++ b/openwrt/toolchain/binutils/Makefile @@ -0,0 +1,9 @@ +include $(TOPDIR)/rules.mk + +include ./binutils.mk + +source: binutils-source +prepare: $(BINUTILS_DIR)/.patched +compile: $(BINUTILS_DIR1)/binutils/objdump +install: binutils +clean: binutils-distclean binutils-toolclean diff --git a/openwrt/toolchain/binutils/Makefile.in b/openwrt/toolchain/binutils/Makefile.in deleted file mode 100644 index c6838bb053..0000000000 --- a/openwrt/toolchain/binutils/Makefile.in +++ /dev/null @@ -1 +0,0 @@ -BINUTILS_VERSION:=$(strip $(subst ",, $(BR2_BINUTILS_VERSION))) diff --git a/openwrt/toolchain/binutils/binutils.mk b/openwrt/toolchain/binutils/binutils.mk index 3097a4bf21..c0d504d6dc 100644 --- a/openwrt/toolchain/binutils/binutils.mk +++ b/openwrt/toolchain/binutils/binutils.mk @@ -33,7 +33,7 @@ $(BINUTILS_DIR)/.unpacked: $(DL_DIR)/$(BINUTILS_SOURCE) $(BINUTILS_DIR)/.patched: $(BINUTILS_DIR)/.unpacked # Apply appropriate binutils patches. - toolchain/patch-kernel.sh $(BINUTILS_DIR) toolchain/binutils/$(BINUTILS_VERSION) \*.patch + $(SCRIPT_DIR)/patch-kernel.sh $(BINUTILS_DIR) ./$(BINUTILS_VERSION) \*.patch touch $(BINUTILS_DIR)/.patched $(BINUTILS_DIR1)/.configured: $(BINUTILS_DIR)/.patched @@ -54,10 +54,10 @@ $(BINUTILS_DIR1)/binutils/objdump: $(BINUTILS_DIR1)/.configured # 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 +$(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-ld: $(BINUTILS_DIR1)/binutils/objdump $(MAKE) -C $(BINUTILS_DIR1) install -binutils-dependancies: +binutils-dependencies: @if ! which bison > /dev/null ; then \ echo -e "\n\nYou must install 'bison' on your build machine\n"; \ exit 1; \ @@ -71,7 +71,7 @@ binutils-dependancies: exit 1; \ fi; -binutils: binutils-dependancies $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/bin/ld +binutils: binutils-dependencies $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-ld binutils-source: $(DL_DIR)/$(BINUTILS_SOURCE) @@ -82,6 +82,8 @@ binutils-clean: binutils-toolclean: rm -rf $(BINUTILS_DIR1) +binutils-distclean: + rm -rf $(BINUTILS_DIR) ############################################################# diff --git a/openwrt/toolchain/gcc/2.95/050-debian-subset.patch.bz2 b/openwrt/toolchain/gcc/2.95/050-debian-subset.patch.bz2 deleted file mode 100644 index 6c2d518273b201e21e3dccc36e42e9aba09ab877..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125295 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 UNB!fukN^0)k}1N3fu_0tsCBsZH~;_u diff --git a/openwrt/toolchain/gcc/2.95/100-uclibc-conf.patch b/openwrt/toolchain/gcc/2.95/100-uclibc-conf.patch deleted file mode 100644 index f244387cc9..0000000000 --- a/openwrt/toolchain/gcc/2.95/100-uclibc-conf.patch +++ /dev/null @@ -1,291 +0,0 @@ -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 deleted file mode 100644 index fee65f9200..0000000000 --- a/openwrt/toolchain/gcc/2.95/STLport-4.5.3.patch +++ /dev/null @@ -1,407 +0,0 @@ -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 -+# -+# 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 - # endif - --# if defined (_STLP_UNIX) -+# if defined (_STLP_UNIX) && defined (_STLP_PTHREADS) && ! defined (_STLP_USE_UCLIBC) - # define _STLP_HAS_PERTHREAD_ALLOCATOR - # include - # 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 -+# include -+# endif -+ - # include - - #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/Config.in b/openwrt/toolchain/gcc/Config.in index c23cb39da6..2ad0b5e6b7 100644 --- a/openwrt/toolchain/gcc/Config.in +++ b/openwrt/toolchain/gcc/Config.in @@ -10,10 +10,6 @@ choice 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" diff --git a/openwrt/toolchain/gcc/Makefile b/openwrt/toolchain/gcc/Makefile new file mode 100644 index 0000000000..d060ab0b6c --- /dev/null +++ b/openwrt/toolchain/gcc/Makefile @@ -0,0 +1,9 @@ +include $(TOPDIR)/rules.mk + +include ./gcc-uclibc-3.x.mk + +source: gcc-source +prepare: gcc_initial +compile: $(GCC_BUILD_DIR2)/.compiled +install: gcc-install +clean: gcc_initial-clean gcc-clean diff --git a/openwrt/toolchain/gcc/gcc-uclibc-2.95.mk b/openwrt/toolchain/gcc/gcc-uclibc-2.95.mk deleted file mode 100644 index e5a36e4ccb..0000000000 --- a/openwrt/toolchain/gcc/gcc-uclibc-2.95.mk +++ /dev/null @@ -1,277 +0,0 @@ -# Makefile for to build a gcc/uClibc toolchain -# -# Copyright (C) 2002-2003 Erik Andersen -# Copyright (C) 2004 Manuel Novoa III -# -# 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 index d1d372ecfb..878a55d270 100644 --- a/openwrt/toolchain/gcc/gcc-uclibc-3.x.mk +++ b/openwrt/toolchain/gcc/gcc-uclibc-3.x.mk @@ -17,7 +17,6 @@ # 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) @@ -67,7 +66,7 @@ $(GCC_DIR)/.unpacked: $(DL_DIR)/$(GCC_SOURCE) $(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 + $(SCRIPT_DIR)/patch-kernel.sh $(GCC_DIR) ./$(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 @@ -75,10 +74,10 @@ $(GCC_DIR)/.patched: $(GCC_DIR)/.unpacked # 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 + $(SCRIPT_DIR)/patch-kernel.sh $(GCC_DIR) ./$(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 + $(SCRIPT_DIR)/patch-kernel.sh $(GCC_DIR) ./$(GCC_VERSION) arm-softfloat.patch.conditional endif # Not yet updated to 3.4.1. #ifeq ("$(strip $(ARCH))","i386") @@ -121,11 +120,10 @@ $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc: $(GCC_BUILD_DIR1)/.compiled #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: $(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-toolclean: rm -rf $(GCC_BUILD_DIR1) @@ -171,7 +169,7 @@ $(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 +gcc-install: $(GCC_BUILD_DIR2)/.compiled PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR2) install # Strip the host binaries ifeq ($(GCC_STRIP_HOST_BINARIES),true) @@ -193,7 +191,7 @@ endif 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 \ + if [ ! -f ./$(GCC_VERSION)/specs-$(ARCH)-soft-float ] ; then \ echo soft float configured but no specs file for this arch ; \ /bin/false ; \ fi; @@ -202,28 +200,24 @@ ifeq ($(findstring 3.3.,$(GCC_VERSION)),3.3.) 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 + cp ./$(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: gcc_initial $(LIBFLOAT_TARGET) \ + gcc-install $(GCC_TARGETS) gcc-source: $(DL_DIR)/$(GCC_SOURCE) gcc-clean: + rm -rf $(GCC_DIR) rm -rf $(GCC_BUILD_DIR2) - rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)* + rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gc* + rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-c* gcc-toolclean: rm -rf $(GCC_BUILD_DIR2) @@ -235,7 +229,7 @@ gcc-toolclean: ############################################################# GCC_BUILD_DIR3:=$(BUILD_DIR)/gcc-$(GCC_VERSION)-target -$(GCC_BUILD_DIR3)/.configured: $(GCC_BUILD_DIR2)/.installed +$(GCC_BUILD_DIR3)/.configured: gcc-install mkdir -p $(GCC_BUILD_DIR3) (cd $(GCC_BUILD_DIR3); PATH=$(TARGET_PATH) \ $(GCC_DIR)/configure \ @@ -282,7 +276,7 @@ $(TARGET_DIR)/usr/bin/gcc: $(GCC_BUILD_DIR3)/.compiled 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 + cp ./$(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 @@ -318,4 +312,3 @@ gcc_target-clean: gcc_target-toolclean: rm -rf $(GCC_BUILD_DIR3) -endif diff --git a/openwrt/toolchain/kernel-headers/Makefile b/openwrt/toolchain/kernel-headers/Makefile new file mode 100644 index 0000000000..2b590c8a09 --- /dev/null +++ b/openwrt/toolchain/kernel-headers/Makefile @@ -0,0 +1,10 @@ +include $(TOPDIR)/rules.mk + +include ./kernel-headers.mk + +source: kernel-headers-source +prepare: kernel-headers +compile: +install: +clean: kernel-headers-toolclean + diff --git a/openwrt/toolchain/kernel-headers/kernel-headers.mk b/openwrt/toolchain/kernel-headers/kernel-headers.mk index 9edf1a0f1b..9ef884ef4c 100644 --- a/openwrt/toolchain/kernel-headers/kernel-headers.mk +++ b/openwrt/toolchain/kernel-headers/kernel-headers.mk @@ -3,8 +3,7 @@ LINUX_HEADERS_VERSION=2.4.29 LINUX_HEADERS_SITE=http://www.kernel.org/pub/linux/kernel/v2.4 LINUX_HEADERS_SOURCE=linux-$(LINUX_HEADERS_VERSION).tar.bz2 -LINUX_HEADERS_CONFIG=toolchain/kernel-headers/linux.config -LINUX_HEADERS_DIR=$(TOOL_BUILD_DIR)/linux-$(LINUX_HEADERS_VERSION) +LINUX_HEADERS_CONFIG=./linux.config LINUX_HEADERS_ARCH:=$(shell echo $(ARCH) | sed -e 's/i[3-9]86/i386/' \ -e 's/mipsel/mips/' \ -e 's/powerpc/ppc/' \ @@ -26,6 +25,7 @@ $(LINUX_HEADERS_DIR)/.unpacked: $(DL_DIR)/$(LINUX_HEADERS_SOURCE) linux-$(LINUX_HEADERS_VERSION)/arch/$(LINUX_HEADERS_ARCH)/config*.in \ linux-$(LINUX_HEADERS_VERSION)/*/*/Config.in \ linux-$(LINUX_HEADERS_VERSION)/*/Config.in + ln -sf $(LINUX_HEADERS_DIR)-$(LINUX_HEADERS_VERSION) $(LINUX_HEADERS_DIR) touch $(LINUX_HEADERS_DIR)/.unpacked $(LINUX_HEADERS_DIR)/.configured: $(LINUX_HEADERS_DIR)/.unpacked diff --git a/openwrt/toolchain/uClibc/Makefile b/openwrt/toolchain/uClibc/Makefile new file mode 100644 index 0000000000..06d7487a4f --- /dev/null +++ b/openwrt/toolchain/uClibc/Makefile @@ -0,0 +1,10 @@ +include $(TOPDIR)/rules.mk + +include ./uclibc.mk + +source: uclibc-source +prepare: uclibc-configured +compile: $(UCLIBC_DIR)/lib/libc.a +install: uclibc + $(STRIP) $(TARGET_DIR)/lib/*.so +clean: uclibc-clean diff --git a/openwrt/toolchain/uClibc/uclibc.mk b/openwrt/toolchain/uClibc/uclibc.mk index 15cf6b2793..eec100f83b 100644 --- a/openwrt/toolchain/uClibc/uclibc.mk +++ b/openwrt/toolchain/uClibc/uclibc.mk @@ -11,8 +11,6 @@ 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 @@ -45,9 +43,9 @@ $(UCLIBC_DIR)/.unpacked: $(DL_DIR)/$(UCLIBC_SOURCE) $(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 + cp ./uClibc.config-locale $(UCLIBC_DIR)/.config else - cp toolchain/uClibc/uClibc.config $(UCLIBC_DIR)/.config + cp ./uClibc.config $(UCLIBC_DIR)/.config endif $(SED) 's,^.*TARGET_$(UCLIBC_TARGET_ARCH).*,TARGET_$(UCLIBC_TARGET_ARCH)=y,g' \ $(UCLIBC_DIR)/.config @@ -126,7 +124,7 @@ endif uclibc-configured: $(UCLIBC_DIR)/.configured -uclibc: $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc $(STAGING_DIR)/lib/libc.a \ +uclibc: $(STAGING_DIR)/lib/libc.a \ $(UCLIBC_TARGETS) uclibc-source: $(DL_DIR)/$(UCLIBC_SOURCE) diff --git a/openwrt/toolchain/utils/Makefile b/openwrt/toolchain/utils/Makefile new file mode 100644 index 0000000000..404a5e5fda --- /dev/null +++ b/openwrt/toolchain/utils/Makefile @@ -0,0 +1,21 @@ +include $(TOPDIR)/rules.mk + +TARGETS:=sstrip +UTILS_BUILD_DIR:=$(TOOL_BUILD_DIR)/utils + +prepare: $(UTILS_BUILD_DIR) +compile: prepare $(patsubst %,$(UTILS_BUILD_DIR)/%,$(TARGETS)) +install: compile + mkdir -p $(STAGING_DIR)/bin + cp -a $(UTILS_BUILD_DIR)/* $(STAGING_DIR)/bin/ +package: +clean: + rm -rf $(UTILS_BUILD_DIR) + +$(UTILS_BUILD_DIR): + mkdir -p $(UTILS_BUILD_DIR) + +$(UTILS_BUILD_DIR)/%: src/%.c + $(CC) -o $@ $(patsubst $(UTILS_BUILD_DIR)/%,src/%.c,$@) + chmod 755 $@ + diff --git a/openwrt/package/openwrt/sstrip.c b/openwrt/toolchain/utils/src/sstrip.c similarity index 100% rename from openwrt/package/openwrt/sstrip.c rename to openwrt/toolchain/utils/src/sstrip.c