diff options
Diffstat (limited to 'Makefile')
-rw-r--r-- | Makefile | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..d19b25124 --- /dev/null +++ b/Makefile @@ -0,0 +1,206 @@ +# 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 |