OSDN Git Service

2013.10.24
[uclinux-h8/uClinux-dist.git] / Makefile
1 ############################################################################
2
3 #
4 # Makefile -- Top level dist makefile.
5 #
6 # Copyright (c) 2001-2007, SnapGear (www.snapgear.com)
7 # Copyright (c) 2001, Lineo
8 #
9
10 ############################################################################
11 #
12 # Lets work out what the user wants, and if they have configured us yet
13 #
14
15 ifeq (.config,$(wildcard .config))
16 all: tools automake subdirs romfs image
17 else
18 all: config_error
19 endif
20
21 ROOTDIR = $(shell pwd)
22
23 include vendors/config/common/config.arch
24
25 ############################################################################
26
27 DIRS    = $(VENDOR_TOPDIRS) include lib include user
28
29
30 .PHONY: tools
31 tools: ucfront cksum
32         chmod +x tools/romfs-inst.sh tools/modules-alias.sh tools/build-udev-perms.sh
33
34 .PHONY: ucfront
35 ucfront: tools/ucfront/*.c
36         $(MAKE) -C tools/ucfront
37         ln -sf $(ROOTDIR)/tools/ucfront/ucfront tools/ucfront-gcc
38         ln -sf $(ROOTDIR)/tools/ucfront/ucfront tools/ucfront-g++
39         ln -sf $(ROOTDIR)/tools/ucfront/ucfront-ld tools/ucfront-ld
40         ln -sf $(ROOTDIR)/tools/ucfront/jlibtool tools/jlibtool
41
42 .PHONY: cksum
43 cksum: tools/cksum
44 tools/cksum: tools/sg-cksum/*.c
45         $(MAKE) -C tools/sg-cksum
46         ln -sf $(ROOTDIR)/tools/sg-cksum/cksum tools/cksum
47
48 .PHONY: automake
49 automake:
50         $(MAKE) -C config automake
51
52 ############################################################################
53
54 #
55 # Config stuff, we recall ourselves to load the new config.arch before
56 # running the kernel and other config scripts
57 #
58
59 .PHONY: Kconfig
60 Kconfig:
61         @chmod u+x config/mkconfig
62         config/mkconfig > Kconfig
63
64 include config/Makefile.conf
65
66 SCRIPTS_BINARY_config     = conf
67 SCRIPTS_BINARY_menuconfig = mconf
68 SCRIPTS_BINARY_qconfig    = qconf
69 SCRIPTS_BINARY_gconfig    = gconf
70 SCRIPTS_BINARY_xconfig    = gconf
71 .PHONY: config menuconfig qconfig gconfig xconfig
72 menuconfig: mconf
73 qconfig: qconf
74 gconfig: gconf
75 xconfig: $(SCRIPTS_BINARY_xconfig)
76 config menuconfig qconfig gconfig xconfig: Kconfig conf
77         KCONFIG_NOTIMESTAMP=1 $(SCRIPTSDIR)/$(SCRIPTS_BINARY_$@) Kconfig
78         @if [ ! -f .config ]; then \
79                 echo; \
80                 echo "You have not saved your config, please re-run 'make $@'"; \
81                 echo; \
82                 exit 1; \
83          fi
84         @chmod u+x config/setconfig
85         @config/setconfig defaults
86         @if egrep "^CONFIG_DEFAULTS_KERNEL=y" .config > /dev/null; then \
87                 $(MAKE) linux_$@; \
88          fi
89         @if egrep "^CONFIG_DEFAULTS_MODULES=y" .config > /dev/null; then \
90                 $(MAKE) modules_$@; \
91          fi
92         @if egrep "^CONFIG_DEFAULTS_VENDOR=y" .config > /dev/null; then \
93                 $(MAKE) myconfig_$@; \
94          fi
95         @config/setconfig final
96
97 .PHONY: oldconfig
98 oldconfig: Kconfig conf
99         KCONFIG_NOTIMESTAMP=1 $(SCRIPTSDIR)/conf -o Kconfig
100         @chmod u+x config/setconfig
101         @config/setconfig defaults
102         @$(MAKE) oldconfig_linux
103         @$(MAKE) oldconfig_modules
104         @$(MAKE) oldconfig_config
105         @$(MAKE) oldconfig_uClibc
106         @config/setconfig final
107
108 .PHONY: generated_headers
109 generated_headers:
110         if [ ! -f $(LINUXDIR)/include/linux/autoconf.h ] ; then \
111                 ln -sf $(ROOTDIR)/$(LINUXDIR)/include/generated/autoconf.h $(LINUXDIR)/include/linux/autoconf.h ; \
112         fi
113
114 .PHONY: modules
115 modules: generated_headers
116         . $(LINUXDIR)/.config; if [ "$$CONFIG_MODULES" = "y" ]; then \
117                 [ -d $(LINUXDIR)/modules ] || mkdir $(LINUXDIR)/modules; \
118                 $(MAKEARCH_KERNEL) -j$(HOST_NCPU) -C $(LINUXDIR) modules || exit 1; \
119         fi
120
121 .PHONY: modules_install
122 modules_install:
123         . $(LINUX_CONFIG); \
124         . $(CONFIG_CONFIG); \
125         if [ "$$CONFIG_MODULES" = "y" ]; then \
126                 [ -d $(ROMFSDIR)/lib/modules ] || mkdir -p $(ROMFSDIR)/lib/modules; \
127                 $(MAKEARCH_KERNEL) -C $(LINUXDIR) INSTALL_MOD_CMD="$(ROMFSINST) -S -r \"\"" INSTALL_MOD_PATH=$(ROMFSDIR) DEPMOD=$(ROOTDIR)/tools/depmod.sh modules_install; \
128                 rm -f $(ROMFSDIR)/lib/modules/*/build; \
129                 rm -f $(ROMFSDIR)/lib/modules/*/source; \
130                 find $(ROMFSDIR)/lib/modules -type f -name "*o" | xargs -r $(STRIP) -R .comment -R .note -g --strip-unneeded; \
131         fi
132
133 linux_%:
134         KCONFIG_NOTIMESTAMP=1 $(MAKEARCH_KERNEL) -C $(LINUXDIR) $(patsubst linux_%,%,$@)
135 modules_%:
136         [ ! -d modules ] || KCONFIG_NOTIMESTAMP=1 $(MAKEARCH) -C modules $(patsubst modules_%,%,$@)
137 myconfig_%:
138         KCONFIG_NOTIMESTAMP=1 $(MAKEARCH) -C config $(patsubst myconfig_%,%,$@)
139 oldconfig_config: myconfig_oldconfig
140 oldconfig_modules: modules_oldconfig
141 oldconfig_linux: linux_oldconfig
142 oldconfig_uClibc:
143         [ -z "$(findstring uClibc,$(LIBCDIR))" ] || KCONFIG_NOTIMESTAMP=1 $(MAKEARCH) -C $(LIBCDIR) oldconfig
144
145 ############################################################################
146 #
147 # normal make targets
148 #
149
150 .PHONY: romfs
151 romfs: romfs.newlog romfs.subdirs modules_install romfs.post
152
153 .PHONY: romfs.newlog
154 romfs.newlog:
155         rm -f $(IMAGEDIR)/romfs-inst.log
156
157 .PHONY: romfs.subdirs
158 romfs.subdirs:
159         for dir in vendors $(DIRS) ; do [ ! -d $$dir ] || $(MAKEARCH) -C $$dir romfs || exit 1 ; done
160
161 .PHONY: romfs.post
162 romfs.post:
163         $(MAKEARCH) -C vendors romfs.post
164         -find $(ROMFSDIR)/. -name CVS | xargs -r rm -rf
165         . $(LINUXDIR)/.config; if [ "$$CONFIG_INITRAMFS_SOURCE" != "" ]; then \
166                 $(MAKEARCH_KERNEL) -j$(HOST_NCPU) -C $(LINUXDIR) $(LINUXTARGET) || exit 1; \
167         fi
168
169 .PHONY: image
170 image:
171         [ -d $(IMAGEDIR) ] || mkdir $(IMAGEDIR)
172         $(MAKEARCH) -C vendors image
173
174 .PHONY: release
175 release:
176         $(MAKE) -C release release
177
178 .PHONY: single
179 single:
180         $(MAKE) NON_SMP_BUILD=1
181
182 %_fullrelease:
183         @echo "This target no longer works"
184         @echo "Do a make -C release $@"
185         exit 1
186 #
187 # fancy target that allows a vendor to have other top level
188 # make targets,  for example "make vendor_flash" will run the
189 # vendor_flash target in the vendors directory
190 #
191
192 vendor_%:
193         $(MAKEARCH) -C vendors $@
194
195 .PHONY: linux
196 linux:
197         . $(LINUXDIR)/.config; if [ "$$CONFIG_INITRAMFS_SOURCE" != "" ]; then \
198                 mkdir -p `dirname $$CONFIG_INITRAMFS_SOURCE`; \
199                 touch $$CONFIG_INITRAMFS_SOURCE || exit 1; \
200         fi
201         @if expr "$(LINUXDIR)" : 'linux-2\.[0-4].*' > /dev/null && \
202                          [ ! -f $(LINUXDIR)/.depend ] ; then \
203                 echo "ERROR: you need to do a 'make dep' first" ; \
204                 exit 1 ; \
205         fi
206         $(MAKEARCH_KERNEL) -j$(HOST_NCPU) -C $(LINUXDIR) $(LINUXTARGET) || exit 1
207         @if ! expr "$(LINUXDIR)" : 'linux-2.[01234].*' > /dev/null ; then \
208                 : ignore failure in headers_install; \
209                 $(MAKEARCH_KERNEL) -j$(HOST_NCPU) -C $(LINUXDIR) headers_install || true; \
210         fi
211         if [ -f $(LINUXDIR)/vmlinux ]; then \
212                 ln -f $(LINUXDIR)/vmlinux $(LINUXDIR)/linux ; \
213         fi
214
215 linux%_only: linux
216
217 .PHONY: sparse
218 sparse:
219         $(MAKEARCH_KERNEL) -C $(LINUXDIR) C=1 $(LINUXTARGET) || exit 1
220
221 .PHONY: sparseall
222 sparseall:
223         $(MAKEARCH_KERNEL) -C $(LINUXDIR) C=2 $(LINUXTARGET) || exit 1
224
225 .PHONY: subdirs
226 subdirs: linux modules
227         for dir in $(DIRS) ; do [ ! -d $$dir ] || $(MAKEARCH) -C $$dir || exit 1 ; done
228
229 dep:
230         @if [ ! -f $(LINUXDIR)/.config ] ; then \
231                 echo "ERROR: you need to do a 'make config' first" ; \
232                 exit 1 ; \
233         fi
234         $(MAKEARCH_KERNEL) -C $(LINUXDIR) dep
235
236 # This one removes all executables from the tree and forces their relinking
237 .PHONY: relink
238 relink:
239         find user prop vendors -type f -name '*.gdb' | sed 's/^\(.*\)\.gdb/\1 \1.gdb/' | xargs rm -f
240
241 clean: modules_clean
242         for dir in $(LINUXDIR) $(DIRS); do [ ! -d $$dir ] || $(MAKEARCH) -C $$dir clean ; done
243         rm -rf $(ROMFSDIR)/*
244         rm -rf $(STAGEDIR)/*
245         rm -rf $(IMAGEDIR)/*
246         rm -f $(LINUXDIR)/linux
247         rm -f $(LINUXDIR)/include/asm
248         rm -f $(LINUXDIR)/include/linux/autoconf.h
249         rm -f $(LINUXDIR)/usr/include/linux/autoconf.h
250         rm -rf $(LINUXDIR)/net/ipsec/alg/libaes $(LINUXDIR)/net/ipsec/alg/perlasm
251         rm -f $(LINUXDIR)/net/ipsec/.linked
252
253 real_clean mrproper: clean
254         [ -d "$(LINUXDIR)" ] && $(MAKEARCH_KERNEL) -C $(LINUXDIR) mrproper || :
255         [ -d uClibc ] && $(MAKEARCH) -C uClibc distclean || :
256         [ -d modules ] && $(MAKEARCH) -C modules distclean || :
257         [ -d "$(RELDIR)" ] && $(MAKEARCH) -C $(RELDIR) clean || :
258         -$(MAKEARCH) -C config clean
259         rm -rf romfs Kconfig config.arch images
260         rm -rf .config .config.old .oldconfig autoconf.h auto.conf
261
262 linux_distclean:
263         -$(MAKEARCH_KERNEL) -C $(LINUXDIR) distclean
264
265 distclean: mrproper linux_distclean
266         -rm -f user/tinylogin/applet_source_list user/tinylogin/config.h
267         -rm -f lib/uClibc lib/glibc
268         -$(MAKE) -C tools/ucfront clean
269         -rm -f tools/ucfront-gcc tools/ucfront-g++ tools/ucfront-ld tools/jlibtool
270         -$(MAKE) -C tools/sg-cksum clean
271         -rm -f tools/cksum
272
273 .PHONY: bugreport
274 bugreport:
275         rm -rf ./bugreport.tar.gz ./bugreport
276         mkdir bugreport
277         $(HOSTCC) -v 2> ./bugreport/host_vers
278         $(CROSS_COMPILE)gcc -v 2> ./bugreport/toolchain_vers
279         cp .config bugreport/
280         mkdir bugreport/$(LINUXDIR)
281         cp $(LINUXDIR)/.config bugreport/$(LINUXDIR)/
282         if [ -f $(LIBCDIR)/.config ] ; then \
283                 set -e ; \
284                 mkdir bugreport/$(LIBCDIR) ; \
285                 cp $(LIBCDIR)/.config bugreport/$(LIBCDIR)/ ; \
286         fi
287         mkdir bugreport/config
288         cp config/.config bugreport/config/
289         tar czf bugreport.tar.gz bugreport
290         rm -rf ./bugreport
291
292 %_only:
293         @case "$(@)" in \
294         single*) $(MAKE) NON_SMP_BUILD=1 `expr $(@) : 'single[_]*\(.*\)'` ;; \
295         */*) d=`expr $(@) : '\([^/]*\)/.*'`; \
296              t=`expr $(@) : '[^/]*/\(.*\)'`; \
297              $(MAKEARCH) -C $$d $$t;; \
298         *)   $(MAKEARCH) -C $(*);; \
299         esac
300
301 %_clean:
302         @case "$(@)" in \
303         single*) $(MAKE) NON_SMP_BUILD=1 `expr $(@) : 'single[_]*\(.*\)'` ;; \
304         */*) d=`expr $(@) : '\([^/]*\)/.*'`; \
305              t=`expr $(@) : '[^/]*/\(.*\)'`; \
306              $(MAKEARCH) -C $$d $$t;; \
307         *)   $(MAKEARCH) -C $(*) clean;; \
308         esac
309
310 %_romfs:
311         @case "$(@)" in \
312         single*) $(MAKE) NON_SMP_BUILD=1 `expr $(@) : 'single[_]*\(.*\)'` ;; \
313         */*) d=`expr $(@) : '\([^/]*\)/.*'`; \
314              t=`expr $(@) : '[^/]*/\(.*\)'`; \
315              $(MAKEARCH) -C $$d $$t;; \
316         *)   $(MAKEARCH) -C $(*) romfs;; \
317         esac
318
319 vendors/%_defconfig:
320         $(MAKE) $(*)_defconfig
321
322 %_defconfig: conf
323         @if [ ! -f "vendors/$(*)/config.device" ]; then \
324                 echo "vendors/$(*)/config.device must exist first"; \
325                 exit 1; \
326          fi
327         -$(MAKE) clean > /dev/null 2>&1
328         cp vendors/$(*)/config.device .config
329         chmod u+x config/setconfig
330         yes "" | config/setconfig defaults
331         config/setconfig final
332         $(MAKE) dep
333
334 %_default: conf
335         $(MAKE) $(*)_defconfig
336         $(MAKE)
337
338 config_error:
339         @echo "*************************************************"
340         @echo "You have not run make config."
341         @echo "The build sequence for this source tree is:"
342         @echo "1. 'make config' or 'make xconfig'"
343         @echo "2. 'make dep'"
344         @echo "3. 'make'"
345         @echo "*************************************************"
346         @exit 1
347
348 prune: ucfront
349         @for i in `ls -d linux-* | grep -v $(LINUXDIR)`; do \
350                 rm -fr $$i; \
351         done
352         $(MAKE) -C lib prune
353         $(MAKE) -C user prune
354         $(MAKE) -C vendors prune
355
356 dist-prep:
357         -find $(ROOTDIR) -name 'Makefile*.bin' | while read t; do \
358                 $(MAKEARCH) -C `dirname $$t` -f `basename $$t` $@; \
359          done
360
361 help:
362         @echo "Quick reference for various supported make commands."
363         @echo "----------------------------------------------------"
364         @echo ""
365         @echo "make xconfig               Configure the target etc"
366         @echo "make config                \""
367         @echo "make menuconfig            \""
368         @echo "make qconfig               \""
369         @echo "make gconfig               \""
370         @echo "make dep                   2.4 and earlier kernels need this step"
371         @echo "make                       build the entire tree and final images"
372         @echo "make clean                 clean out compiled files, but not config"
373         @echo "make distclean             clean out all non-distributed files"
374         @echo "make oldconfig             re-run the config without interaction"
375         @echo "make linux                 compile the selected kernel only"
376         @echo "make romfs                 install all files to romfs directory"
377         @echo "make image                 combine romfs and kernel into final image"
378         @echo "make modules               build all modules"
379         @echo "make modules_install       install modules into romfs"
380         @echo "make DIR_only              build just the directory DIR"
381         @echo "make DIR_romfs             install files from directory DIR to romfs"
382         @echo "make DIR_clean             clean just the directory DIR"
383         @echo "make single                non-parallelised build"
384         @echo "make single[make-target]   non-parallelised build of \"make-target\""
385         @echo "make V/P_default           full default build for V=Vendor/P=Product"
386         @echo "make prune                 clean out uncompiled source (be careful)"
387         @echo ""
388         @echo "Typically you want to start with this sequence before experimenting."
389         @echo ""
390         @echo "make config                select platform, kernel, etc, customise nothing."
391         @echo "make dep                   optional but safe even on newer kernels."
392         @echo "make                       build it as the creators intended."
393         @exit 0
394         
395
396 ############################################################################