Eric Andersen | ffde94b | 2001-12-22 00:56:11 +0000 | [diff] [blame^] | 1 | # Makefile for user-mode-linux with a simple busybox/uClibc root filesystem |
| 2 | # |
| 3 | # Copyright (C) 2001 by Erik Andersen <andersen@codepoet.org> |
| 4 | # Copyright (C) 2001 by Alcove, Julien Gaulmin <julien.gaulmin@fr.alcove.com> |
| 5 | # Copyright (C) 2001 by Jon Nelson <jnelson@boa.org> |
| 6 | # |
| 7 | # This program is free software; you can redistribute it and/or modify it under |
| 8 | # the terms of the GNU Library General Public License as published by the Free |
| 9 | # Software Foundation; either version 2 of the License, or (at your option) any |
| 10 | # later version. |
| 11 | # |
| 12 | # This program is distributed in the hope that it will be useful, but WITHOUT |
| 13 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
| 14 | # FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more |
| 15 | # details. |
| 16 | # |
| 17 | # You should have received a copy of the GNU Library General Public License |
| 18 | # along with this program; if not, write to the Free Software Foundation, Inc., |
| 19 | # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 20 | |
| 21 | # Known problems : |
| 22 | # - genext2fs: couldn't allocate a block (no free space) |
| 23 | # As genext2fs allocate only one group of blocks, the FS size |
| 24 | # is limited to 8Mb. |
| 25 | |
| 26 | # Update this stuff by hand : |
| 27 | ARCH = i386 |
| 28 | # If you are running a cross compiler, you may want to set this |
| 29 | # to something more interesting, like "arm-linux-". |
| 30 | #CROSS = $(ARCH)-linux- |
| 31 | |
| 32 | #IMAGE_SIZE=8192 # Max size |
| 33 | #IMAGE_INODES=500 |
| 34 | IMAGE_SIZE=550 # library is 550K |
| 35 | IMAGE_INODES=300 |
| 36 | |
| 37 | LINUX_SOURCE=linux-2.4.14.tar.bz2 |
| 38 | USERMODELINUX_PATCH=uml-patch-2.4.14-6.bz2 |
| 39 | UCLIBC_SOURCE=uClibc-snapshot.tar.gz |
| 40 | |
| 41 | LINUX_URI=http://www.kernel.org/pub/linux/kernel/v2.4 |
| 42 | USERMODELINUX_URI=http://prdownloads.sourceforge.net/user-mode-linux |
| 43 | UCLIBC_URI=http://uclibc.org/downloads/ |
| 44 | |
| 45 | # Don't alter below this line unless you (think) you know |
| 46 | # what you are doing! Danger, Danger! |
| 47 | |
| 48 | .SUFFIXES: # Delete the default suffixes |
| 49 | .SUFFIXES: .c .o .h # Define our suffix list |
| 50 | |
| 51 | # Directories |
| 52 | BASE_DIR=${shell pwd} |
| 53 | TARGET_DIR=$(BASE_DIR)/root |
| 54 | STAGING_DIR=$(BASE_DIR)/staging_dir |
| 55 | SOURCE_DIR=$(BASE_DIR)/sources |
| 56 | LINUX_DIR=$(BASE_DIR)/linux |
| 57 | UCLIBC_DIR=$(BASE_DIR)/uClibc |
| 58 | GENEXT2FS_DIR=$(BASE_DIR)/genext2fs |
| 59 | |
| 60 | TARGET_CC=$(STAGING_DIR)/bin/gcc |
| 61 | TARGET_CC1=$(STAGING_DIR)/usr/bin/$(ARCH)-uclibc-gcc |
| 62 | TARGET_CROSS=$(STAGING_DIR)/usr/bin/$(ARCH)-uclibc- |
| 63 | TARGET_PATH=$(STAGING_DIR)/usr/bin:$(STAGING_DIR)/bin:/bin:/sbin:/usr/bin:/usr/sbin |
| 64 | |
| 65 | LINUX=$(BASE_DIR)/UMlinux |
| 66 | IMAGE=$(BASE_DIR)/root_fs |
| 67 | |
| 68 | KCONFIG=$(SOURCE_DIR)/linux-uml.config |
| 69 | |
| 70 | all: world |
| 71 | |
| 72 | #So what shall we build today? |
| 73 | TARGETS= |
| 74 | |
| 75 | -include busybox.mk |
| 76 | -include boa.mk |
| 77 | |
| 78 | world: $(TARGETS) $(GENEXT2FS_DIR)/genext2fs $(TARGET_DIR) |
| 79 | $(GENEXT2FS_DIR)/genext2fs \ |
| 80 | -b `echo $(IMAGE_SIZE) | bc` \ |
| 81 | -i `echo $(IMAGE_INODES) | bc` \ |
| 82 | -d $(TARGET_DIR) \ |
| 83 | -D $(SOURCE_DIR)/device_table.txt root_fs |
| 84 | |
| 85 | $(STAGING_DIR): |
| 86 | rm -rf $(STAGING_DIR) |
| 87 | mkdir $(STAGING_DIR) |
| 88 | |
| 89 | $(TARGET_DIR): |
| 90 | rm -rf $(TARGET_DIR) |
| 91 | tar -xf $(SOURCE_DIR)/skel.tar |
| 92 | |
| 93 | # The kernel |
| 94 | $(SOURCE_DIR)/$(LINUX_SOURCE): |
| 95 | while [ ! -f $(SOURCE_DIR)/$(LINUX_SOURCE) ] ; do \ |
| 96 | wget -P $(SOURCE_DIR) --passive $(LINUX_URI)/$(LINUX_SOURCE); \ |
| 97 | done |
| 98 | |
| 99 | $(LINUX_DIR)/.unpacked: $(SOURCE_DIR)/$(LINUX_SOURCE) |
| 100 | bunzip2 -c $(SOURCE_DIR)/$(LINUX_SOURCE) | tar -xv |
| 101 | touch $(LINUX_DIR)/.unpacked |
| 102 | |
| 103 | $(SOURCE_DIR)/$(USERMODELINUX_PATCH): |
| 104 | while [ ! -f $(SOURCE_DIR)/$(USERMODELINUX_PATCH) ] ; do \ |
| 105 | wget -P $(SOURCE_DIR) --passive $(USERMODELINUX_URI)/$(USERMODELINUX_PATCH); \ |
| 106 | done |
| 107 | |
| 108 | $(LINUX_DIR)/.patched: $(LINUX_DIR)/.unpacked $(SOURCE_DIR)/$(USERMODELINUX_PATCH) |
| 109 | bzcat $(SOURCE_DIR)/$(USERMODELINUX_PATCH) | patch -d $(LINUX_DIR) -p1 |
| 110 | touch $(LINUX_DIR)/.patched |
| 111 | |
| 112 | $(LINUX_DIR)/.um: $(LINUX_DIR)/.patched |
| 113 | sed -e 's/^ARCH :=.*/ARCH=um/g' < $(LINUX_DIR)/Makefile > $(LINUX_DIR)/Makefile.new && mv -f $(LINUX_DIR)/Makefile.new $(LINUX_DIR)/Makefile |
| 114 | touch $(LINUX_DIR)/.um |
| 115 | |
| 116 | $(LINUX_DIR)/.configdone: $(LINUX_DIR)/.um |
| 117 | cp -f $(KCONFIG) $(LINUX_DIR)/.config |
| 118 | make -C $(LINUX_DIR) oldconfig menuconfig |
| 119 | touch $(LINUX_DIR)/.configdone |
| 120 | |
| 121 | $(LINUX_DIR)/.dep: $(LINUX_DIR)/.configdone |
| 122 | make -C $(LINUX_DIR) dep |
| 123 | touch $(LINUX_DIR)/.dep |
| 124 | |
| 125 | $(LINUX_DIR)/linux: $(LINUX_DIR)/.dep |
| 126 | (cd $(LINUX_DIR); make linux) |
| 127 | |
| 128 | $(LINUX): $(LINUX_DIR)/linux |
| 129 | ln -sf $(LINUX_DIR)/linux $(LINUX) |
| 130 | |
| 131 | # uClibc |
| 132 | $(SOURCE_DIR)/$(UCLIBC_SOURCE): |
| 133 | while [ ! -f $(SOURCE_DIR)/$(UCLIBC_SOURCE) ] ; do \ |
| 134 | wget -P $(SOURCE_DIR) --passive $(UCLIBC_URI)/$(UCLIBC_SOURCE) ; \ |
| 135 | done; |
| 136 | |
| 137 | $(UCLIBC_DIR)/Config: $(SOURCE_DIR)/$(UCLIBC_SOURCE) |
| 138 | tar -xzf $(SOURCE_DIR)/$(UCLIBC_SOURCE) |
| 139 | for p in `find $(SOURCE_DIR) -name uClibc-*.patch | sort -g`;do \ |
| 140 | patch -p0 < $$p ; \ |
| 141 | done |
| 142 | awk 'BEGIN { FS=" ="; REG="DODEBUG|DOLFS|INCLUDE_RPC|DOPIC";} \ |
| 143 | { if ($$0 ~ "^" REG) { print $$1 " = false" } else { print $$0 } }' < \ |
| 144 | $(UCLIBC_DIR)/extra/Configs/Config.$(ARCH) > $(UCLIBC_DIR)/Config; |
| 145 | |
| 146 | $(UCLIBC_DIR)/lib/libc.a: $(LINUX) $(UCLIBC_DIR)/Config |
| 147 | $(MAKE) CROSS=$(CROSS) \ |
| 148 | DEVEL_PREFIX=$(STAGING_DIR) \ |
| 149 | SYSTEM_DEVEL_PREFIX=$(STAGING_DIR)/usr \ |
| 150 | SHARED_LIB_LOADER_PATH=/lib \ |
| 151 | KERNEL_SOURCE=$(LINUX_DIR) \ |
| 152 | -C $(UCLIBC_DIR) |
| 153 | |
| 154 | uclibc: $(UCLIBC_DIR)/lib/libc.a $(STAGING_DIR) $(TARGET_DIR) |
| 155 | @A=`cksum $(STAGING_DIR)/lib/libuClibc-0.9.5.so 2>/dev/null | awk '{ print $$1 }'`; \ |
| 156 | B=`cksum $(UCLIBC_DIR)/lib/libuClibc-0.9.5.so 2>/dev/null | awk '{ print $$1 }'`; \ |
| 157 | if [ "$$A" != "$$B" ] ; then \ |
| 158 | set -x; \ |
| 159 | $(MAKE) \ |
| 160 | DEVEL_PREFIX=$(STAGING_DIR) \ |
| 161 | SYSTEM_DEVEL_PREFIX=$(STAGING_DIR)/usr \ |
| 162 | SHARED_LIB_LOADER_PATH=$(STAGING_DIR)/lib \ |
| 163 | -C $(UCLIBC_DIR) install; \ |
| 164 | fi; |
| 165 | @A=`cksum $(TARGET_DIR)/lib/libuClibc-0.9.5.so 2>/dev/null | awk '{ print $$1 }'`; \ |
| 166 | B=`cksum $(UCLIBC_DIR)/lib/libuClibc-0.9.5.so 2>/dev/null | awk '{ print $$1 }'`; \ |
| 167 | if [ "$$A" != "$$B" ] ; then \ |
| 168 | set -x; \ |
| 169 | $(MAKE) \ |
| 170 | PREFIX=$(TARGET_DIR) \ |
| 171 | DEVEL_PREFIX=/ \ |
| 172 | SYSTEM_DEVEL_PREFIX=/usr \ |
| 173 | SHARED_LIB_LOADER_PATH=/lib \ |
| 174 | -C $(UCLIBC_DIR) install_runtime; \ |
| 175 | fi |
| 176 | |
| 177 | # genext2fs |
| 178 | $(GENEXT2FS_DIR)/genext2fs: |
| 179 | $(MAKE) -C $(GENEXT2FS_DIR) |
| 180 | |
| 181 | # others |
| 182 | clean: $(TARGETS_CLEAN) |
| 183 | make -C $(GENEXT2FS_DIR) clean |
| 184 | @if [ -d $(UCLIBC_DIR) ] ; then \ |
| 185 | make -C $(UCLIBC_DIR) clean; \ |
| 186 | fi; |
| 187 | @if [ -d $(LINUX_DIR) ] ; then \ |
| 188 | make -C $(UCLIBC_DIR) clean; \ |
| 189 | fi; |
| 190 | rm -rf $(STAGING_DIR) $(TARGET_DIR) $(IMAGE) |
| 191 | rm -f *~ |
| 192 | |
| 193 | mrproper: $(TARGETS_MRPROPER) |
| 194 | rm -rf $(UCLIBC_DIR); |
| 195 | rm -rf $(LINUX_DIR); |
| 196 | rm -f root_fs $(LINUX) |
| 197 | make -C $(GENEXT2FS_DIR) clean |
| 198 | rm -rf $(STAGING_DIR) $(TARGET_DIR) $(IMAGE) |
| 199 | rm -f *~ |
| 200 | |
| 201 | distclean: mrproper $(TARGETS_DISTCLEAN) |
| 202 | rm -f $(SOURCE_DIR)/$(UCLIBC_SOURCE) |
| 203 | rm -f $(SOURCE_DIR)/$(USERMODELINUX_PATCH) |
| 204 | rm -f $(SOURCE_DIR)/$(LINUX_SOURCE) |
| 205 | |
| 206 | .PHONY: uclibc $(TARGETS) world test clean mrproper distclean |