From 95f81a5a5552ad42b188fc56f2c38eb8c17542de Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Wed, 3 Jul 2002 10:44:59 +0000 Subject: [PATCH] A number of updates --- Makefile | 19 ++-- make/ext2root.mk | 6 +- make/ncurses.mk | 4 +- make/tinylogin.mk | 1 + make/uclibc.mk | 88 +++++++++++++------ make/user-mode-linux.mk | 2 +- sources/busybox.patch | 190 ++++++++++++++++++++++++++++++++++++++++ sources/skel.tar.gz | Bin 5141 -> 4846 bytes 8 files changed, 273 insertions(+), 37 deletions(-) diff --git a/Makefile b/Makefile index 053a0f1cd3..220feabee9 100644 --- a/Makefile +++ b/Makefile @@ -33,15 +33,18 @@ ARCH:=i386 #ARCH:=arm #ARCH:=whatever +# enable to build a native gcc toolchain with uclibc support +USE_UCLIBC_TOOLCHAIN:=false + # Enable this to use the uClibc daily snapshot instead of a released # version. Daily snapshots may contain new features and bugfixes. Or -# they may not even compile at all... +# they may not even compile at all, depending on what Erik is doing... USE_UCLIBC_SNAPSHOT:=true # Enable this to use the busybox daily snapshot instead of a released # version. Daily snapshots may contain new features and bugfixes. Or # they may not even compile at all.... -USE_BUSYBOX_SNAPSHOT:=false +USE_BUSYBOX_SNAPSHOT:=true # Enable large file (files > 2 GB) support BUILD_WITH_LARGEFILE:=false @@ -51,7 +54,11 @@ BUILD_WITH_LARGEFILE:=false # The list of stuff to build for the target filesystem # ############################################################# -TARGETS:=user-mode-linux uclibc busybox tinylogin +ifeq ($(USE_UCLIBC_TOOLCHAIN),true) +TARGETS=uclibc_toolchain +endif + +TARGETS+=user-mode-linux busybox tinylogin #ncurses gdb strace valgrind # Pick your root filesystem type. TARGETS+=ext2root @@ -71,10 +78,10 @@ PATCH_DIR=$(SOURCE_DIR)/patches BUILD_DIR:=$(BASE_DIR)/build TARGET_DIR:=$(BUILD_DIR)/root STAGING_DIR:=$(BUILD_DIR)/staging_dir -TARGET_CC:=$(STAGING_DIR)/bin/gcc -TARGET_CROSS:=$(STAGING_DIR)/usr/bin/$(ARCH)-uclibc- +TARGET_CC:=$(STAGING_DIR)/usr/bin/gcc +TARGET_CROSS:=$(STAGING_DIR)/bin/$(ARCH)-uclibc- TARGET_CC1:=$(TARGET_CROSS)gcc -TARGET_PATH:=$(STAGING_DIR)/usr/bin:$(STAGING_DIR)/bin:/bin:/sbin:/usr/bin:/usr/sbin +TARGET_PATH:=$(STAGING_DIR)/bin:$(STAGING_DIR)/usr/bin:/bin:/sbin:/usr/bin:/usr/sbin STRIP:=$(TARGET_CROSS)strip --remove-section=.comment --remove-section=.note IMAGE:=$(BASE_DIR)/root_fs ifneq ($(strip $(ARCH)),i386) diff --git a/make/ext2root.mk b/make/ext2root.mk index 37a9da2c01..33ec01ba73 100644 --- a/make/ext2root.mk +++ b/make/ext2root.mk @@ -35,12 +35,12 @@ genext2fs: $(GENEXT2_DIR)/genext2fs # ############################################################# # FIXME -- calculate these numbers... -SIZE=4000 +SIZE=8000 INODES=1000 ext2root: genext2fs #$(shell find $(TARGET_DIR) -type f) - -@find $(TARGET_DIR)/lib -type f -name \*.so\* | xargs $(STRIP) --strip-unneeded 2>/dev/null || true; - -@find $(TARGET_DIR) -type f -perm +111 | xargs $(STRIP) 2>/dev/null || true; + #-@find $(TARGET_DIR)/lib -type f -name \*.so\* | xargs $(STRIP) --strip-unneeded 2>/dev/null || true; + #-@find $(TARGET_DIR) -type f -perm +111 | xargs $(STRIP) 2>/dev/null || true; $(GENEXT2_DIR)/genext2fs -i $(INODES) -b $(SIZE) -d $(TARGET_DIR) -D $(SOURCE_DIR)/device_table.txt $(IMAGE) ext2root-source: $(DL_DIR)/$(GENEXT2_SOURCE) diff --git a/make/ncurses.mk b/make/ncurses.mk index 8d612daa9d..52a7a7d3f6 100644 --- a/make/ncurses.mk +++ b/make/ncurses.mk @@ -5,7 +5,7 @@ # ############################################################# # Copyright (C) 2002 by Ken Restivo -# $Id: ncurses.mk,v 1.6 2002/06/10 15:32:56 andersen Exp $ +# $Id: ncurses.mk,v 1.7 2002/07/03 10:44:59 andersen Exp $ # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Library General Public License as @@ -64,7 +64,7 @@ $(STAGING_DIR)/lib/libncurses.so: $(NCURSES_DIR)/lib/libncurses.so $(TARGET_DIR)/lib/libncurses.so: $(STAGING_DIR)/lib/libncurses.so cp -a $(STAGING_DIR)/lib/libncurses.so* $(TARGET_DIR)/lib/ - cp -a $(STAGING_DIR)/usr/lib/terminfo $(TARGET_DIR)/usr/lib/ + -cp -a $(STAGING_DIR)/usr/lib/terminfo $(TARGET_DIR)/usr/lib/ for i in x/xterm x/xterm-color x/xterm-xfree86 v/vt100 v/vt200 a/ansi l/linux; do \ cd $(STAGING_DIR)/usr/share/; \ tar -cf - terminfo/$${i} | \ diff --git a/make/tinylogin.mk b/make/tinylogin.mk index 4068f31f0a..64292c73f7 100644 --- a/make/tinylogin.mk +++ b/make/tinylogin.mk @@ -19,6 +19,7 @@ $(TINYLOGIN_DIR)/Config.h: $(DL_DIR)/$(TINYLOGIN_SOURCE) perl -i -p -e "s/\`id -u\` -ne 0/0 == 1/;" \ -e "s/4755 --owner=root --group=root/755/" \ $(TINYLOGIN_DIR)/install.sh + perl -i -p -e "s/^DODEBUG.*/DODEBUG=true/g;" $(TINYLOGIN_DIR)/Makefile # date test this one touch $(TINYLOGIN_DIR)/Config.h diff --git a/make/uclibc.mk b/make/uclibc.mk index e8c38ef82f..4505971268 100644 --- a/make/uclibc.mk +++ b/make/uclibc.mk @@ -3,17 +3,36 @@ # uClibc (the C library) # ############################################################# +# Copyright (C) 2001, 2002 by Erik Andersen +# Copyright (C) 2002 by Tim Riker +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU Library 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library 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 ($(USE_UCLIBC_TOOLCHAIN),false) ifeq ($(USE_UCLIBC_SNAPSHOT),true) # Be aware that this changes daily.... UCLIBC_DIR=$(BUILD_DIR)/uClibc UCLIBC_SOURCE=uClibc-snapshot.tar.bz2 else -UCLIBC_DIR:=$(BUILD_DIR)/uClibc-0.9.11 -UCLIBC_SOURCE:=uClibc-0.9.11.tar.bz2 +UCLIBC_DIR:=$(BUILD_DIR)/uClibc-0.9.12 +UCLIBC_SOURCE:=uClibc-0.9.12.tar.bz2 endif -#UCLIBC_URI:=http://www.uclibc.org/downloads -UCLIBC_URI:=http://de.busybox.net/downloads/uClibc +#UCLIBC_PATCH=$(SOURCE_DIR)/uClibc.patch +UCLIBC_URI:=ftp://www.uclibc.org/uClibc ifeq ($(strip $(BUILD_WITH_LARGEFILE)),true) LARGEFILE=true else @@ -26,46 +45,63 @@ endif $(DL_DIR)/$(UCLIBC_SOURCE): wget -P $(DL_DIR) --passive-ftp $(UCLIBC_URI)/$(UCLIBC_SOURCE) -uclibc-source: $(DL_DIR)/$(UCLIBC_SOURCE) +uclibc-source: $(DL_DIR)/$(UCLIBC_SOURCE) #$(UCLIBC_PATCH) -$(UCLIBC_DIR)/.unpacked: $(DL_DIR)/$(UCLIBC_SOURCE) - rm -rf $(UCLIBC_DIR) - bzcat $(DL_DIR)/$(UCLIBC_SOURCE) | tar -C $(BUILD_DIR) -xvf - +$(UCLIBC_DIR)/.unpacked: $(DL_DIR)/$(UCLIBC_SOURCE) #$(UCLIBC_PATCH) + bzcat $(DL_DIR)/$(UCLIBC_SOURCE) | tar -C $(BUILD_DIR) -xvf - touch $(UCLIBC_DIR)/.unpacked -$(UCLIBC_DIR)/.configured: $(UCLIBC_DIR)/.unpacked +ifeq ($(LINUX_DIR),) +LINUX_DIR:=$(BUILD_DIR)/linux +endif + +$(UCLIBC_DIR)/Config: $(UCLIBC_DIR)/.unpacked + cp $(UCLIBC_DIR)/extra/Configs/Config.$(ARCH) $(UCLIBC_DIR)/Config~; + echo "TARGET_ARCH=$(ARCH)" >> $(UCLIBC_DIR)/Config~ $(UCLIBC_DIR)/extra/Configs/uClibc_config_fix.pl \ --arch=$(ARCH) \ $(CROSSARG) --c99_math=true \ --devel_prefix=$(STAGING_DIR) \ - --float=true \ --kernel_dir=$(LINUX_DIR) \ - --large_file=$(LARGEFILE) \ - --ldso_path="/lib" \ + --float=true \ + --c99_math=true \ --long_long=true \ - --rpc_support=true \ + --float=true \ --shadow=true \ - --shared_support=true \ --threads=true \ - --debug=true \ - --file=$(UCLIBC_DIR)/extra/Configs/Config.$(ARCH) \ + --rpc_support=true \ + --large_file=true \ + --mmu=true \ + --debug=false \ + --ldso_path="/lib" \ + --shared_support=true \ + --file=$(UCLIBC_DIR)/Config~ \ > $(UCLIBC_DIR)/Config; - perl -i -p -e 's,SYSTEM_DEVEL_PREFIX.*,SYSTEM_DEVEL_PREFIX=$(STAGING_DIR)/usr,g' \ + perl -i -p -e 's,^SYSTEM_DEVEL_PREFIX.*,SYSTEM_DEVEL_PREFIX=$(STAGING_DIR),g' \ $(UCLIBC_DIR)/Config - touch $(UCLIBC_DIR)/.configured + perl -i -p -e 's,^DEVEL_TOOL_PREFIX.*,DEVEL_TOOL_PREFIX=$(STAGING_DIR)/usr,g' \ + $(UCLIBC_DIR)/Config + perl -i -p -e 's,^HAS_WCHAR.*,HAS_WCHAR=true,g' $(UCLIBC_DIR)/Config -$(UCLIBC_DIR)/lib/libc.a: $(UCLIBC_DIR)/.configured +$(UCLIBC_DIR)/lib/libc.a: $(UCLIBC_DIR)/Config $(MAKE) -C $(UCLIBC_DIR) $(STAGING_DIR)/lib/libc.a: $(UCLIBC_DIR)/lib/libc.a - $(MAKE) -C $(UCLIBC_DIR) install + $(MAKE) -C $(UCLIBC_DIR) install_dev install_runtime install_toolchain + +$(STAGING_DIR)/bin/$(ARCH)-uclibc-gcc: $(STAGING_DIR)/lib/libc.a + $(MAKE) -C $(UCLIBC_DIR) install_toolchain + +$(TARGET_DIR)/lib/libc.so.0: $(STAGING_DIR)/bin/$(ARCH)-uclibc-gcc + $(MAKE) -C $(UCLIBC_DIR) DEVEL_PREFIX=$(TARGET_DIR) \ + SYSTEM_DEVEL_PREFIX=$(TARGET_DIR) \ + DEVEL_TOOL_PREFIX=$(TARGET_DIR)/usr \ + install_runtime -$(TARGET_DIR)/lib/libc.so.0: $(STAGING_DIR)/lib/libc.a - $(MAKE) -C $(UCLIBC_DIR) PREFIX=$(TARGET_DIR) \ - DEVEL_PREFIX=/ install_runtime install_target_utils - $(STRIP) --strip-unneeded $(TARGET_DIR)/lib/*.so* +$(TARGET_DIR)/usr/bin/ldd: $(TARGET_DIR)/lib/libc.so.0 + $(MAKE) -C $(UCLIBC_DIR) PREFIX=$(TARGET_DIR) install_target_utils -uclibc: $(LINUX_KERNEL) $(TARGET_DIR)/lib/libc.so.0 +uclibc: $(LINUX_KERNEL) $(STAGING_DIR)/lib/libc.a $(TARGET_DIR)/lib/libc.so.0 $(TARGET_DIR)/usr/bin/ldd uclibc-clean: rm -f $(TARGET_DIR)/lib/libc.so.0 @@ -74,3 +110,5 @@ uclibc-clean: uclibc-dirclean: rm -rf $(UCLIBC_DIR) + +endif diff --git a/make/user-mode-linux.mk b/make/user-mode-linux.mk index a09f28a8de..9cffa8b039 100644 --- a/make/user-mode-linux.mk +++ b/make/user-mode-linux.mk @@ -32,7 +32,7 @@ $(UMLINUX_DIR)/.set_arch: $(UMLINUX_DIR)/.patched $(UMLINUX_DIR)/.configured: $(UMLINUX_DIR)/.set_arch $(UMLINUX_KCONFIG) cp $(UMLINUX_KCONFIG) $(UMLINUX_DIR)/.config - make -C $(UMLINUX_DIR) oldconfig + make -C $(UMLINUX_DIR) oldconfig include/linux/version.h touch $(UMLINUX_DIR)/.configured $(UMLINUX_DIR)/.depend_done: $(UMLINUX_DIR)/.configured diff --git a/sources/busybox.patch b/sources/busybox.patch index e69de29bb2..99040baf82 100644 --- a/sources/busybox.patch +++ b/sources/busybox.patch @@ -0,0 +1,190 @@ +--- busybox/Config.h 6 Apr 2002 04:22:15 -0000 1.116 ++++ busybox/Config.h 30 May 2002 05:10:32 -0000 +@@ -7,8 +7,8 @@ + // + // + // BusyBox Applications +-//#define BB_ADJTIMEX +-//#define BB_AR ++#define BB_ADJTIMEX ++#define BB_AR + #define BB_ASH + #define BB_BASENAME + #define BB_CAT +@@ -37,12 +37,12 @@ + //#define BB_DUMPKMAP + #define BB_ECHO + #define BB_ENV +-//#define BB_EXPR ++#define BB_EXPR + //#define BB_FBSET + //#define BB_FDFLUSH + #define BB_FIND + #define BB_FREE +-//#define BB_FREERAMDISK ++#define BB_FREERAMDISK + //#define BB_FSCK_MINIX + //#define BB_GETOPT + #define BB_GREP +@@ -51,12 +51,12 @@ + #define BB_HALT + #define BB_HEAD + //#define BB_HOSTID +-//#define BB_HOSTNAME ++#define BB_HOSTNAME + //#define BB_HUSH + #define BB_ID +-//#define BB_IFCONFIG ++#define BB_IFCONFIG + #define BB_INIT +-//#define BB_INSMOD ++#define BB_INSMOD + #define BB_KILL + #define BB_KILLALL + #define BB_KLOGD +@@ -68,11 +68,11 @@ + //#define BB_LOADKMAP + #define BB_LOGGER + //#define BB_LOGNAME +-//#define BB_LOSETUP ++#define BB_LOSETUP + #define BB_LS + #define BB_LSMOD + //#define BB_MAKEDEVS +-//#define BB_MD5SUM ++#define BB_MD5SUM + #define BB_MKDIR + //#define BB_MKFIFO + //#define BB_MKFS_MINIX +@@ -85,11 +85,11 @@ + //#define BB_MSH + //#define BB_MT + #define BB_MV +-//#define BB_NC +-//#define BB_NSLOOKUP ++#define BB_NC ++#define BB_NSLOOKUP + #define BB_PIDOF +-//#define BB_PING +-//#define BB_PIVOT_ROOT ++#define BB_PING ++#define BB_PIVOT_ROOT + #define BB_POWEROFF + //#define BB_PRINTF + #define BB_PS +@@ -101,8 +101,8 @@ + #define BB_RESET + #define BB_RM + #define BB_RMDIR +-//#define BB_RMMOD +-//#define BB_ROUTE ++#define BB_RMMOD ++#define BB_ROUTE + //#define BB_RPM2CPIO + #define BB_SED + //#define BB_SETKEYCODES +@@ -115,13 +115,13 @@ + #define BB_TAIL + #define BB_TAR + //#define BB_TEE +-//#define BB_TEST ++#define BB_TEST + //#define BB_TELNET + //#define BB_TFTP +-//#define BB_TIME ++#define BB_TIME + #define BB_TOUCH + //#define BB_TR +-//#define BB_TRACEROUTE ++#define BB_TRACEROUTE + #define BB_TRUE_FALSE + #define BB_TTY + //#define BB_UNIX2DOS +@@ -133,10 +133,10 @@ + //#define BB_UPDATE + #define BB_UPTIME + //#define BB_USLEEP +-//#define BB_VI ++#define BB_VI + //#define BB_WATCHDOG + #define BB_WC +-//#define BB_WGET ++#define BB_WGET + #define BB_WHICH + #define BB_WHOAMI + #define BB_XARGS +@@ -217,7 +217,7 @@ + #define BB_FEATURE_USE_INITTAB + // + //Enable init being called as /linuxrc +-#define BB_FEATURE_LINUXRC ++//#define BB_FEATURE_LINUXRC + // + //Have init enable core dumping for child processes (for debugging only) + //#define BB_FEATURE_INIT_COREDUMPS +@@ -226,7 +226,7 @@ + //#define BB_FEATURE_EXTRA_QUIET + // + // enable syslogd -R remotehost +-#define BB_FEATURE_REMOTE_LOG ++//#define BB_FEATURE_REMOTE_LOG + // + // enable syslogd -C + //#define BB_FEATURE_IPC_SYSLOG +@@ -277,7 +277,7 @@ + #define BB_FEATURE_COMMAND_TAB_COMPLETION + // + // Attempts to match usernames in a ~-prefixed path +-//#define BB_FEATURE_COMMAND_USERNAME_COMPLETION ++#define BB_FEATURE_COMMAND_USERNAME_COMPLETION + // + //Allow the shell to invoke all the compiled in BusyBox applets as if they + //were shell builtins. Nice for staticly linking an emergency rescue shell, +@@ -298,7 +298,7 @@ + // current username and hostname. On systems that don't have usernames + // or hostnames, this can look hideous. + // Only relevant if a shell is enabled. +-//#define BB_FEATURE_SH_FANCY_PROMPT ++#define BB_FEATURE_SH_FANCY_PROMPT + // + // Uncomment this option to disable job control. Job control lets you + // run jobs in the background (which completely useless for is all you +@@ -314,7 +314,7 @@ + //#define BB_FEATURE_FBSET_READMODE + // + // Support insmod/lsmod/rmmod for post 2.1 kernels +-//#define BB_FEATURE_NEW_MODULE_INTERFACE ++#define BB_FEATURE_NEW_MODULE_INTERFACE + // + // Support insmod/lsmod/rmmod for pre 2.1 kernels + //#define BB_FEATURE_OLD_MODULE_INTERFACE +@@ -332,16 +332,16 @@ + //#define BB_FEATURE_MINIX2 + // + // Enable ifconfig status reporting output -- this feature adds 7k. +-//#define BB_FEATURE_IFCONFIG_STATUS ++#define BB_FEATURE_IFCONFIG_STATUS + // + // Enable ifconfig slip-specific options "keepalive" and "outfill" +-//#define BB_FEATURE_IFCONFIG_SLIP ++#define BB_FEATURE_IFCONFIG_SLIP + // + // Enable ifconfig options "mem_start", "io_addr", and "irq". +-//#define BB_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ ++#define BB_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ + // + // Enable ifconfig option "hw". Currently works for only with "ether". +-//#define BB_FEATURE_IFCONFIG_HW ++#define BB_FEATURE_IFCONFIG_HW + // + // Allows "broadcast +" to set broadcast automatically based on hostaddr + // and netmask, at a cost of about 100 bytes of code (i386). +@@ -379,7 +379,7 @@ + #define BB_FEATURE_FIND_NEWER + // + // Support for the -A -B and -C context flags in grep +-//#define BB_FEATURE_GREP_CONTEXT ++#define BB_FEATURE_GREP_CONTEXT + // + // Support for the EGREP applet (alias to the grep applet) + //#define BB_FEATURE_GREP_EGREP_ALIAS diff --git a/sources/skel.tar.gz b/sources/skel.tar.gz index a0c9d77ceccc1afa0479292f2e5ca52796dbe132..301c5cfa2852d476b11725d9a4a77f2d1c3a8ff0 100644 GIT binary patch literal 4846 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 KymaGqbpHo>QTcxW literal 5141 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