Commit ffde94bd authored by Eric Andersen's avatar Eric Andersen
Browse files

Initial revision

parents
Loading
Loading
Loading
Loading

Makefile

0 → 100644
+206 −0
Original line number Diff line number Diff line
# Makefile for user-mode-linux with a simple busybox/uClibc root filesystem
#
# Copyright (C) 2001 by Erik Andersen <andersen@codepoet.org>
# Copyright (C) 2001 by Alcove, Julien Gaulmin <julien.gaulmin@fr.alcove.com>
# Copyright (C) 2001 by Jon Nelson <jnelson@boa.org>
#
# 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

# Known problems :
#  - genext2fs: couldn't allocate a block (no free space)
#    As genext2fs allocate only one group of blocks, the FS size
#    is limited to 8Mb.

# Update this stuff by hand :
ARCH = i386
# If you are running a cross compiler, you may want to set this
# to something more interesting, like "arm-linux-".
#CROSS = $(ARCH)-linux-

#IMAGE_SIZE=8192 # Max size
#IMAGE_INODES=500
IMAGE_SIZE=550 # library is 550K
IMAGE_INODES=300

LINUX_SOURCE=linux-2.4.14.tar.bz2
USERMODELINUX_PATCH=uml-patch-2.4.14-6.bz2
UCLIBC_SOURCE=uClibc-snapshot.tar.gz

LINUX_URI=http://www.kernel.org/pub/linux/kernel/v2.4
USERMODELINUX_URI=http://prdownloads.sourceforge.net/user-mode-linux
UCLIBC_URI=http://uclibc.org/downloads/

# Don't alter below this line unless you (think) you know
# what you are doing! Danger, Danger!

.SUFFIXES:            # Delete the default suffixes
.SUFFIXES: .c .o .h   # Define our suffix list

# Directories
BASE_DIR=${shell pwd}
TARGET_DIR=$(BASE_DIR)/root
STAGING_DIR=$(BASE_DIR)/staging_dir
SOURCE_DIR=$(BASE_DIR)/sources
LINUX_DIR=$(BASE_DIR)/linux
UCLIBC_DIR=$(BASE_DIR)/uClibc
GENEXT2FS_DIR=$(BASE_DIR)/genext2fs

TARGET_CC=$(STAGING_DIR)/bin/gcc
TARGET_CC1=$(STAGING_DIR)/usr/bin/$(ARCH)-uclibc-gcc
TARGET_CROSS=$(STAGING_DIR)/usr/bin/$(ARCH)-uclibc-
TARGET_PATH=$(STAGING_DIR)/usr/bin:$(STAGING_DIR)/bin:/bin:/sbin:/usr/bin:/usr/sbin

LINUX=$(BASE_DIR)/UMlinux
IMAGE=$(BASE_DIR)/root_fs

KCONFIG=$(SOURCE_DIR)/linux-uml.config

all:   world

#So what shall we build today?
TARGETS=

-include busybox.mk
-include boa.mk

world:	$(TARGETS) $(GENEXT2FS_DIR)/genext2fs $(TARGET_DIR)
	$(GENEXT2FS_DIR)/genext2fs \
	 -b `echo $(IMAGE_SIZE) | bc` \
	 -i `echo $(IMAGE_INODES) | bc` \
	 -d $(TARGET_DIR) \
	 -D $(SOURCE_DIR)/device_table.txt root_fs

$(STAGING_DIR):
	rm -rf $(STAGING_DIR)
	mkdir $(STAGING_DIR)

$(TARGET_DIR):
	rm -rf $(TARGET_DIR)
	tar -xf $(SOURCE_DIR)/skel.tar

# The kernel
$(SOURCE_DIR)/$(LINUX_SOURCE):
	while [ ! -f $(SOURCE_DIR)/$(LINUX_SOURCE) ] ; do \
		wget -P $(SOURCE_DIR) --passive $(LINUX_URI)/$(LINUX_SOURCE); \
	done

$(LINUX_DIR)/.unpacked:	$(SOURCE_DIR)/$(LINUX_SOURCE)
	bunzip2 -c $(SOURCE_DIR)/$(LINUX_SOURCE) | tar -xv
	touch $(LINUX_DIR)/.unpacked

$(SOURCE_DIR)/$(USERMODELINUX_PATCH):
	while [ ! -f $(SOURCE_DIR)/$(USERMODELINUX_PATCH) ] ; do \
		wget -P $(SOURCE_DIR) --passive $(USERMODELINUX_URI)/$(USERMODELINUX_PATCH); \
	done
        
$(LINUX_DIR)/.patched:	$(LINUX_DIR)/.unpacked $(SOURCE_DIR)/$(USERMODELINUX_PATCH)
	bzcat $(SOURCE_DIR)/$(USERMODELINUX_PATCH) | patch -d $(LINUX_DIR) -p1
	touch $(LINUX_DIR)/.patched

$(LINUX_DIR)/.um:	$(LINUX_DIR)/.patched
	sed -e 's/^ARCH :=.*/ARCH=um/g' < $(LINUX_DIR)/Makefile > $(LINUX_DIR)/Makefile.new && mv -f $(LINUX_DIR)/Makefile.new $(LINUX_DIR)/Makefile
	touch $(LINUX_DIR)/.um

$(LINUX_DIR)/.configdone:	$(LINUX_DIR)/.um
	cp -f $(KCONFIG) $(LINUX_DIR)/.config
	make -C $(LINUX_DIR) oldconfig menuconfig
	touch $(LINUX_DIR)/.configdone

$(LINUX_DIR)/.dep:	$(LINUX_DIR)/.configdone
	make -C $(LINUX_DIR) dep
	touch $(LINUX_DIR)/.dep

$(LINUX_DIR)/linux:	$(LINUX_DIR)/.dep
	(cd $(LINUX_DIR); make linux)
        
$(LINUX): $(LINUX_DIR)/linux
	ln -sf $(LINUX_DIR)/linux $(LINUX)

# uClibc
$(SOURCE_DIR)/$(UCLIBC_SOURCE):
	while [ ! -f $(SOURCE_DIR)/$(UCLIBC_SOURCE) ] ; do \
	    wget -P $(SOURCE_DIR) --passive $(UCLIBC_URI)/$(UCLIBC_SOURCE) ; \
	done;

$(UCLIBC_DIR)/Config:	$(SOURCE_DIR)/$(UCLIBC_SOURCE)
	tar -xzf $(SOURCE_DIR)/$(UCLIBC_SOURCE)
	for p in `find $(SOURCE_DIR) -name uClibc-*.patch | sort -g`;do \
		patch -p0 < $$p ; \
	done
	awk 'BEGIN { FS=" ="; REG="DODEBUG|DOLFS|INCLUDE_RPC|DOPIC";} \
	{  if ($$0 ~ "^" REG) { print $$1 " = false" } else { print $$0 } }' < \
	$(UCLIBC_DIR)/extra/Configs/Config.$(ARCH) > $(UCLIBC_DIR)/Config;

$(UCLIBC_DIR)/lib/libc.a:	$(LINUX) $(UCLIBC_DIR)/Config
	$(MAKE) CROSS=$(CROSS) \
		DEVEL_PREFIX=$(STAGING_DIR) \
		SYSTEM_DEVEL_PREFIX=$(STAGING_DIR)/usr \
		SHARED_LIB_LOADER_PATH=/lib \
		KERNEL_SOURCE=$(LINUX_DIR) \
		-C $(UCLIBC_DIR)

uclibc:	$(UCLIBC_DIR)/lib/libc.a $(STAGING_DIR) $(TARGET_DIR)
	@A=`cksum $(STAGING_DIR)/lib/libuClibc-0.9.5.so 2>/dev/null | awk '{ print $$1 }'`; \
	B=`cksum $(UCLIBC_DIR)/lib/libuClibc-0.9.5.so 2>/dev/null | awk '{ print $$1 }'`; \
	if [ "$$A" != "$$B" ] ; then \
		set -x; \
		$(MAKE) \
		DEVEL_PREFIX=$(STAGING_DIR) \
		SYSTEM_DEVEL_PREFIX=$(STAGING_DIR)/usr \
		SHARED_LIB_LOADER_PATH=$(STAGING_DIR)/lib \
		-C $(UCLIBC_DIR) install; \
	fi;
	@A=`cksum $(TARGET_DIR)/lib/libuClibc-0.9.5.so 2>/dev/null | awk '{ print $$1 }'`; \
	B=`cksum $(UCLIBC_DIR)/lib/libuClibc-0.9.5.so 2>/dev/null | awk '{ print $$1 }'`; \
	if [ "$$A" != "$$B" ] ; then \
		set -x; \
		$(MAKE) \
		PREFIX=$(TARGET_DIR) \
		DEVEL_PREFIX=/ \
		SYSTEM_DEVEL_PREFIX=/usr \
		SHARED_LIB_LOADER_PATH=/lib \
		-C $(UCLIBC_DIR) install_runtime; \
	fi
        
# genext2fs
$(GENEXT2FS_DIR)/genext2fs:
	$(MAKE) -C $(GENEXT2FS_DIR)

# others
clean:	$(TARGETS_CLEAN)
	make -C $(GENEXT2FS_DIR) clean
	@if [ -d $(UCLIBC_DIR) ] ; then \
		make -C $(UCLIBC_DIR) clean; \
	fi;
	@if [ -d $(LINUX_DIR) ] ; then \
		make -C $(UCLIBC_DIR) clean; \
	fi;
	rm -rf $(STAGING_DIR) $(TARGET_DIR) $(IMAGE)
	rm -f *~

mrproper: $(TARGETS_MRPROPER)
	rm -rf $(UCLIBC_DIR);
	rm -rf $(LINUX_DIR);
	rm -f root_fs $(LINUX)
	make -C $(GENEXT2FS_DIR) clean
	rm -rf $(STAGING_DIR) $(TARGET_DIR) $(IMAGE)
	rm -f *~

distclean: mrproper $(TARGETS_DISTCLEAN)
	rm -f $(SOURCE_DIR)/$(UCLIBC_SOURCE)
	rm -f $(SOURCE_DIR)/$(USERMODELINUX_PATCH)
	rm -f $(SOURCE_DIR)/$(LINUX_SOURCE)

.PHONY: uclibc $(TARGETS) world test clean mrproper distclean

README

0 → 100644
+28 −0
Original line number Diff line number Diff line
To build and use the buildroot stuff, do the following:

1) run 'make'
2) wait while it compiles 
3) run './UMlinux' to test out your root filesystem using User Mode Linux.

You do not need to be root to build or run this system.  Each Virtual Terminal
will be opened in its own window.  You must be running X and have xterm
installed for this to work -- otherwise you see a few errors on bootup as it
tries to launch xterms.   It will still work on a console, but you will not
have access to the other Virtual Terminals.

Also, you the uClibc and busybox source trees that
are downloaded are fully set up for anonymous CVS access.  You may need to set
up your system for anonymous CVS access by running the following command:

    cvs -d:pserver:anonymous@busybox.net:/var/cvs login

Then just hit Enter when it prompts you for a password.  You only need to do
this once.  Then, whenever you want to update your system, just go into the
busybox or uClibc directory and run 'cvs update'.

Have fun!

 -Erik

Please feed suggestions, bug reports, insults, and bribes back to:
	Erik Andersen <andersen@codepoet.org>

boa.mk

0 → 100644
+78 −0
Original line number Diff line number Diff line
# 
TARGETS += boa
TARGETS_CLEAN += boa_clean
TARGETS_MRPROPER += boa_mrproper
TARGETS_DISTCLEAN += boa_distclean

# Don't alter below this line unless you (think) you know
# what you are doing! Danger, Danger!

BOA_DIR=$(BASE_DIR)/${shell basename $(BOA_SOURCE) .tar.gz}
BOA_WORKDIR=$(BASE_DIR)/boa_workdir
BOA_URI=http://www.boa.org
BOA_SOURCE=boa-0.94.12pre1.tar.gz

IMAGE_SIZE += +100

$(SOURCE_DIR)/$(BOA_SOURCE):
	while [ ! -f $(SOURCE_DIR)/$(BOA_SOURCE) ] ; do \
		wget -P $(SOURCE_DIR) --passive-ftp $(BOA_URI)/$(BOA_SOURCE); \
	done

$(BOA_DIR)/.unpacked:	$(SOURCE_DIR)/$(BOA_SOURCE)
	tar -xzf $(SOURCE_DIR)/$(BOA_SOURCE)
	touch $(BOA_DIR)/.unpacked

$(BOA_WORKDIR)/Makefile: uclibc $(BOA_DIR)/.unpacked
	mkdir -p $(BOA_WORKDIR)
	if [ -f $(SOURCE_DIR)/boa-config.site-$(ARCH) ]; then \
		(cd $(BOA_WORKDIR) && CONFIG_SITE=$(SOURCE_DIR)/boa-config.site-$(ARCH) CC=$(TARGET_CC) $(BOA_DIR)/src/configure); \
	else \
		(cd $(BOA_WORKDIR) && CC=$(TARGET_CC) $(BOA_DIR)/src/configure); \
	fi

$(BOA_WORKDIR)/.built:	$(BOA_WORKDIR)/Makefile
	touch $(BOA_WORKDIR)/.depend
	make VPATH=$(BOA_DIR)/src/ -C $(BOA_WORKDIR)
	(cd $(BOA_WORKDIR) && strip --strip-all boa boa_indexer)
	touch $(BOA_WORKDIR)/.built

boa_install_dirs = /usr/sbin /etc/boa /usr/lib/boa /var/www /usr/lib/cgi-bin

TARGET_DIRS = $(foreach dir,$(boa_install_dirs),$(TARGET_DIR)/$(dir))

$(TARGET_DIRS):
	mkdir -p $@

boa:	$(BOA_WORKDIR)/.built $(TARGET_DIRS) 
	@A=`cksum $(TARGET_DIR)/usr/sbin/boa 2>/dev/null | awk '{ print $$1 }'`; \
	B=`cksum $(BOA_WORKDIR)/boa 2>/dev/null | awk '{ print $$1 }'`; \
	if [ "$$A" != "$$B" ] ; then \
		cp -f $(BOA_WORKDIR)/boa $(TARGET_DIR)/usr/sbin/boa ; \
	fi;
	@A=`cksum $(TARGET_DIR)/usr/lib/boa/boa_indexer 2>/dev/null | awk '{ print $$1 }'`; \
	B=`cksum $(BOA_WORKDIR)/boa_indexer 2>/dev/null | awk '{ print $$1 }'`; \
	if [ "$$A" != "$$B" ] ; then \
		cp -f $(BOA_WORKDIR)/boa_indexer $(TARGET_DIR)/usr/lib/boa/boa_indexer ; \
	fi;
	@A=`cksum $(TARGET_DIR)/etc/boa/boa.conf 2>/dev/null | awk '{ print $$1 }'`; \
	B=`cksum $(SOURCE_DIR)/boa.conf 2>/dev/null | awk '{ print $$1 }'`; \
	if [ "$$A" != "$$B" ] ; then \
		cp -f $(SOURCE_DIR)/boa.conf $(TARGET_DIR)/etc/boa ; \
	fi;
	@A=`cksum $(TARGET_DIR)/etc/mime.types 2>/dev/null | awk '{ print $$1 }'`; \
	B=`cksum $(SOURCE_DIR)/mime.types 2>/dev/null | awk '{ print $$1 }'`; \
	if [ "$$A" != "$$B" ] ; then \
		cp -f $(SOURCE_DIR)/mime.types $(TARGET_DIR)/etc/mime.types ; \
	fi;

boa_clean:
	@if [ -d $(BOA_WORKDIR)/Makefile ] ; then \
		make -C $(BOA_WORKDIR) clean ; \
	fi;

boa_mrproper:
	rm -rf $(BOA_DIR) $(BOA_WORKDIR)

boa_distclean:	boa_mrproper
	rm -f $(SOURCE_DIR)/$(BOA_SOURCE)

busybox.mk

0 → 100644
+63 −0
Original line number Diff line number Diff line
TARGETS += busybox
TARGETS_CLEAN += busybox_clean
TARGETS_MRPROPER += busybox_mrproper
TARGETS_DISTCLEAN += busybox_distclean

# Don't alter below this line unless you (think) you know
# what you are doing! Danger, Danger!

BUSYBOX_DIR=$(BASE_DIR)/${shell basename $(BUSYBOX_SOURCE) .tar.gz}
BUSYBOX_WORKDIR=$(BASE_DIR)/busybox_workdir
BUSYBOX_URI=http://busybox.net/downloads/
BUSYBOX_SOURCE=busybox-0.60.2.tar.gz

IMAGE_SIZE += +500

$(SOURCE_DIR)/$(BUSYBOX_SOURCE):
	while [ ! -f $(SOURCE_DIR)/$(BUSYBOX_SOURCE) ] ; do \
	    wget -P $(SOURCE_DIR) --passive $(BUSYBOX_URI)/$(BUSYBOX_SOURCE) ; \
	done

$(BUSYBOX_DIR)/.unpacked:	$(SOURCE_DIR)/$(BUSYBOX_SOURCE)
	tar -xzf $(SOURCE_DIR)/$(BUSYBOX_SOURCE)
	touch $(BUSYBOX_DIR)/.unpacked
	
$(BUSYBOX_WORKDIR)/.config:	$(BUSYBOX_DIR)/.unpacked
	rm -rf $(BUSYBOX_WORKDIR)
	mkdir -p $(BUSYBOX_WORKDIR)
	(cd $(BUSYBOX_WORKDIR) && sh $(BUSYBOX_DIR)/pristine_setup.sh)
	@perl -i -p \
		-e 's|//(#define\s+BB_)(?!FEATURE)|$$1|;' \
		-e 's|//(#define\s+BB_FEATURE_VERBOSE_USAGE)|$$1|;' \
		-e 's|//(#define\s+BB_FEATURE_NEW_MODULE_INTERFACE)|$$1|;' \
		-e 's|//(#define\s+BB_FEATURE_COMMAND_USERNAME_COMPLETION)|$$1|;' \
		-e 's|//(#define\s+BB_FEATURE_SH_FANCY_PROMPT)|$$1|;' \
		-e 's|//(#define\s+BB_FEATURE_INSMOD_VERSION_CHECKING)|$$1|;' \
		-e 's|//(#define\s+BB_FEATURE_IFCONFIG)|$$1|;' \
		-e 's|//(#define\s+BB_FEATURE_DEVFS)|$$1|;' \
		$(BUSYBOX_WORKDIR)/Config.h
	touch $(BUSYBOX_WORKDIR)/.config

$(BUSYBOX_WORKDIR)/busybox:	uclibc $(BUSYBOX_WORKDIR)/.config
	make CROSS="$(TARGET_CROSS)" -C $(BUSYBOX_WORKDIR)

$(TARGET_DIR)/bin/busybox:	$(BUSYBOX_WORKDIR)/busybox
	@A=`cksum $(TARGET_DIR)/bin/busybox 2>/dev/null | awk '{ print $$1 }'`; \
	B=`cksum $(BUSYBOX_WORKDIR)/busybox 2>/dev/null | awk '{ print $$1 }'`; \
	if [ "$$A" != "$$B" ] ; then \
		make CROSS="$(TARGET_CROSS)" PREFIX=$(TARGET_DIR) \
		-C $(BUSYBOX_WORKDIR) install; \
	fi;

busybox: uclibc $(TARGET_DIR)/bin/busybox

busybox_clean:
	@if [ -d $(BUSYBOX_WORKDIR)/Makefile ] ; then \
		make -C $(BUSYBOX_WORKDIR) clean ; \
	fi;

busybox_mrproper:
	rm -rf $(BUSYBOX_DIR) $(BUSYBOX_WORKDIR)

busybox_distclean:	busybox_mrproper
	rm -f $(SOURCE_DIR)/$(BUSYBOX_SOURCE)
+1 −0
Original line number Diff line number Diff line
ac_cv_func_setvbuf_reversed=no