Initial revision
[avatt.git] / Makefile
blobd19b251248d3ecd1edfb45fcb1a99dfa70e7a7bc
1 # Makefile for user-mode-linux with a simple busybox/uClibc root filesystem
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>
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.
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.
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
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.
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-
32 #IMAGE_SIZE=8192 # Max size
33 #IMAGE_INODES=500
34 IMAGE_SIZE=550 # library is 550K
35 IMAGE_INODES=300
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
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/
45 # Don't alter below this line unless you (think) you know
46 # what you are doing! Danger, Danger!
48 .SUFFIXES: # Delete the default suffixes
49 .SUFFIXES: .c .o .h # Define our suffix list
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
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
65 LINUX=$(BASE_DIR)/UMlinux
66 IMAGE=$(BASE_DIR)/root_fs
68 KCONFIG=$(SOURCE_DIR)/linux-uml.config
70 all: world
72 #So what shall we build today?
73 TARGETS=
75 -include busybox.mk
76 -include boa.mk
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
85 $(STAGING_DIR):
86 rm -rf $(STAGING_DIR)
87 mkdir $(STAGING_DIR)
89 $(TARGET_DIR):
90 rm -rf $(TARGET_DIR)
91 tar -xf $(SOURCE_DIR)/skel.tar
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
99 $(LINUX_DIR)/.unpacked: $(SOURCE_DIR)/$(LINUX_SOURCE)
100 bunzip2 -c $(SOURCE_DIR)/$(LINUX_SOURCE) | tar -xv
101 touch $(LINUX_DIR)/.unpacked
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
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
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
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
121 $(LINUX_DIR)/.dep: $(LINUX_DIR)/.configdone
122 make -C $(LINUX_DIR) dep
123 touch $(LINUX_DIR)/.dep
125 $(LINUX_DIR)/linux: $(LINUX_DIR)/.dep
126 (cd $(LINUX_DIR); make linux)
128 $(LINUX): $(LINUX_DIR)/linux
129 ln -sf $(LINUX_DIR)/linux $(LINUX)
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;
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;
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)
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; \
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; \
177 # genext2fs
178 $(GENEXT2FS_DIR)/genext2fs:
179 $(MAKE) -C $(GENEXT2FS_DIR)
181 # others
182 clean: $(TARGETS_CLEAN)
183 make -C $(GENEXT2FS_DIR) clean
184 @if [ -d $(UCLIBC_DIR) ] ; then \
185 make -C $(UCLIBC_DIR) clean; \
187 @if [ -d $(LINUX_DIR) ] ; then \
188 make -C $(UCLIBC_DIR) clean; \
190 rm -rf $(STAGING_DIR) $(TARGET_DIR) $(IMAGE)
191 rm -f *~
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 *~
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)
206 .PHONY: uclibc $(TARGETS) world test clean mrproper distclean