1e8ed6f55664228ac535edabf2cf3ffa0fffe9e7
[akaros.git] / Makefile
1 # Top-level Makefile for Akaros
2 # Barret Rhoden
3 #
4 #
5 # Notes:
6 #       - I downloaded the kbuild guts from git://github.com/lacombar/kconfig.git,
7 #       and added things from a recent linux makefile.  It is from aug 2011, so
8 #       some things might not match up.
9 #       - Kernel output in obj/: So Linux has the ability to output into another
10 #       directory, via the KBUILD_OUTPUT variable.  This induces a recursive make
11 #       in the output directory.  I mucked with it for a little, but didn't get it
12 #       to work quite right.  Also, there will be other Akaros issues since this
13 #       makefile is also used for userspace and tests.  For now, I'm leaving things
14 #       the default Linux way.
15 #       - Kconfig wants to use include/ in the root directory.  We can change some
16 #       of the default settings that silentoldconfig uses, but I'll leave it as-is
17 #       for now, and just symlink that into kern/include.  It'll be easier for us,
18 #       and also potentially easier if we ever move kern/ up a level.  Similarly,
19 #       there are default Kconfigs in arch/, not in kern/arch.  I just symlinked
20 #       arch->kern/arch to keep everything simple.
21 #
22 # TODO:
23 #       - Consider merging the two target-detection bits (Linux's config, mixed, or
24 #       dot target, and the symlink handling).  Also, could consider moving around
25 #       the KFS and EXT2 targets.  Clean doesn't need to know about them, for
26 #       instance.
27 #
28 #       - Review, with an eye for being better about $(srctree).  It might only be
29 #       necessary in this file, if we every do the KBUILD_OUTPUT option.  But we
30 #       don't always want it (like for the implicit rule for Makefile)
31 #
32 #       - It's a bit crazy that we build symlinks for parlib, instead of it
33 #       managing its own links based on $(ARCH)
34 #
35 #       - Consider using Kbuild to build userspace and tests
36 #
37 #       - There are a few other TODOs sprinkled throughout the makefile.
38
39 # Do not:
40 # o  use make's built-in rules and variables
41 #    (this increases performance and avoids hard-to-debug behaviour);
42 # o  print "Entering directory ...";
43 MAKEFLAGS += -rR --no-print-directory
44
45 # That's our default target when none is given on the command line
46 # This can be overriden with a Makelocal
47 PHONY := all
48 all: akaros-kernel
49
50 # Symlinks
51 # =========================================================================
52 # We have a few symlinks so that code can include <arch/whatever.h>.  This
53 # section builds and maintains those, as best we can.
54 #
55 # When invoking make, we can pass in ARCH=some-arch.  This value gets 'saved'
56 # in the symlink, so that later invocations do not need ARCH=.  If this value
57 # differs from the symlink, it appears like we are changing arches, which
58 # triggers a clean and symlink reconstruction.
59 #
60 # When the user changes from one arch to another, they ought to reconfig, since
61 # many of the CONFIG_ vars will depend on the arch.  If they try anything other
62 # than one of the "non-build-goals" (cleans or configs), we'll abort.
63 #
64 # Make targets that need these symlinks (like building userspace, the kernel,
65 # configs, etc, should depend on symlinks.
66
67 clean-goals := clean mrproper realclean userclean testclean doxyclean objclean
68 non-build-goals := %config $(clean-goals)
69 ifeq ($(filter $(non-build-goals), $(MAKECMDGOALS)),)
70 goals-has-build-targets := 1
71 endif
72
73 PHONY += symlinks clean_symlinks
74 clean_symlinks:
75         @-rm -f kern/include/arch kern/boot user/parlib/include/arch
76
77 arch-link := $(notdir $(shell readlink kern/include/arch))
78 valid-arches := $(notdir $(wildcard kern/arch/*))
79
80 ifneq ($(ARCH),)
81     ifeq ($(filter $(valid-arches), $(ARCH)),)
82         $(error ARCH $(ARCH) invalid, must be one of: $(valid-arches))
83     endif
84     ifneq ($(ARCH),$(arch-link))
85         ifeq ($(goals-has-build-targets),1)
86             $(error Attempted to make [$(MAKECMDGOALS)] while changing ARCH. \
87                     You need to make *config.)
88         endif
89 symlinks: clean_symlinks
90         @echo Making symlinks...
91         $(Q)ln -fs ../arch/$(ARCH) kern/include/arch
92         $(Q)ln -fs arch/$(ARCH)/boot kern/boot
93         $(Q)ln -fs $(ARCH) user/parlib/include/arch
94         $(Q)$(MAKE) -f $(srctree)/Makefile clean
95
96     else
97 symlinks:
98
99     endif # ifneq ($(ARCH),$(arch-link))
100 else # $(ARCH) is empty
101     ifneq ($(arch-link),)
102         ARCH := $(arch-link)
103 symlinks:
104
105     else
106         # Only allow a clean
107         ifeq ($(filter $(clean-goals), $(MAKECMDGOALS)),)
108             $(error No arch saved or specified.  Make *config with ARCH=arch. \
109                     'arch' must be one of: $(valid-arches))
110         endif
111         ARCH := none # catch bugs
112     endif # ifneq ($(arch-link),)
113 endif # ifeq ($(ARCH),)
114
115 SRCARCH := $(ARCH)
116 export ARCH SRCARCH
117
118 # Generic Kbuild Environment
119 # =========================================================================
120
121 # To put more focus on warnings, be less verbose as default
122 # Use 'make V=1' to see the full commands
123
124 ifeq ("$(origin V)", "command line")
125   KBUILD_VERBOSE = $(V)
126 endif
127 ifndef KBUILD_VERBOSE
128   KBUILD_VERBOSE = 0
129 endif
130
131 srctree         := $(if $(KBUILD_SRC),$(KBUILD_SRC),$(CURDIR))
132 objtree         := $(CURDIR)
133
134 export srctree objtree
135
136 CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
137           else if [ -x /bin/bash ]; then echo /bin/bash; \
138           else echo sh; fi ; fi)
139
140 HOSTCC       = gcc
141 HOSTCXX      = g++
142 HOSTCFLAGS   = -Wall -Wno-char-subscripts -Wmissing-prototypes \
143                -Wstrict-prototypes -O2 -fomit-frame-pointer
144 HOSTCXXFLAGS = -O2
145
146 export CONFIG_SHELL HOSTCC HOSTCXX HOSTCFLAGS HOSTCXXFLAGS
147
148 # Beautify output
149 # ---------------------------------------------------------------------------
150 #
151 # Normally, we echo the whole command before executing it. By making
152 # that echo $($(quiet)$(cmd)), we now have the possibility to set
153 # $(quiet) to choose other forms of output instead, e.g.
154 #
155 #         quiet_cmd_cc_o_c = Compiling $(RELDIR)/$@
156 #         cmd_cc_o_c       = $(CC) $(c_flags) -c -o $@ $<
157 #
158 # If $(quiet) is empty, the whole command will be printed.
159 # If it is set to "quiet_", only the short version will be printed. 
160 # If it is set to "silent_", nothing will be printed at all, since
161 # the variable $(silent_cmd_cc_o_c) doesn't exist.
162 #
163 # A simple variant is to prefix commands with $(Q) - that's useful
164 # for commands that shall be hidden in non-verbose mode.
165 #
166 #       $(Q)ln $@ :<
167 #
168 # If KBUILD_VERBOSE equals 0 then the above command will be hidden.
169 # If KBUILD_VERBOSE equals 1 then the above command is displayed.
170
171 ifeq ($(KBUILD_VERBOSE),1)
172   quiet =
173   Q =
174 else
175   quiet=quiet_
176   Q = @
177 endif
178 export quiet Q KBUILD_VERBOSE
179
180 # We need some generic definitions (do not try to remake the file).
181 $(srctree)/scripts/Kbuild.include: ;
182 include $(srctree)/scripts/Kbuild.include
183
184 # Akaros Build Environment
185 # =========================================================================
186 AKAROSINCLUDE   := -I$(srctree)/kern/include/
187
188 # CROSS_COMPILE is defined per-arch.  Each arch can set other makeflags, kbuild
189 # directories, etc. 
190 include $(srctree)/kern/arch/$(ARCH)/Makefile
191
192 CC          := $(CROSS_COMPILE)gcc 
193 CPP         := $(CROSS_COMPILE)g++
194 AS          := $(CROSS_COMPILE)as
195 AR          := $(CROSS_COMPILE)ar
196 LD          := $(CROSS_COMPILE)ld
197 OBJCOPY := $(CROSS_COMPILE)objcopy
198 OBJDUMP := $(CROSS_COMPILE)objdump
199 NM          := $(CROSS_COMPILE)nm
200 STRIP   := $(CROSS_COMPILE)strip
201
202 ifeq ($(goals-has-build-targets),1)
203 ifeq ($(shell which $(CROSS_COMPILE)gcc 2>/dev/null ),)
204 $(error Could not find a $(CROSS_COMPILE) version of GCC/binutils. \
205         Be sure to build the cross-compiler and update your PATH)
206 endif
207 # Computing these without a cross compiler complains loudly
208 gcc-lib := $(shell $(CC) -print-libgcc-file-name)
209 NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
210 # Note: calling this GCC_ROOT interferes with the host tools
211 XCC_ROOT := $(dir $(shell which $(CC)))../
212 endif
213
214 CFLAGS_KERNEL += -O2 -pipe -MD -gstabs
215 CFLAGS_KERNEL += -std=gnu99 -fgnu89-inline
216 CFLAGS_KERNEL += -fno-strict-aliasing -fno-omit-frame-pointer
217 CFLAGS_KERNEL += -fno-stack-protector
218 CFLAGS_KERNEL += -Wall -Wno-format -Wno-unused
219 CFLAGS_KERNEL += -DROS_KERNEL 
220 CFLAGS_KERNEL += -include include/generated/autoconf.h
221
222 # TODO: do we need this, or can we rely on the compiler's defines?
223 CFLAGS_KERNEL += -D$(ARCH)
224
225 # TODO: this requires our own strchr (kern/src/stdio.c), which is a potential
226 # source of bugs/problems.
227 # note we still pull in stdbool and stddef from the compiler
228 CFLAGS_KERNEL += -fno-builtin
229
230 AFLAGS_KERNEL := $(CFLAGS_KERNEL)
231
232 KBUILD_BUILTIN := 1
233 KBUILD_CHECKSRC := 0
234
235 export AKAROSINCLUDE CROSS_COMPILE
236 export CC CPP AS AR LD OBJCOPY OBJDUMP NM STRIP
237 export CFLAGS_KERNEL AFLAGS_KERNEL
238 export NOSTDINC_FLAGS XCC_ROOT
239 export KBUILD_BUILTIN KBUILD_CHECKSRC
240
241 CFLAGS_USER += -O2 -std=gnu99 -fno-stack-protector -fgnu89-inline
242 CXXFLAGS_USER += -O2
243
244 export CFLAGS_USER CXXFLAGS_USER
245
246 # Kbuild Target/Goals Parsing
247 # =========================================================================
248 # Need to figure out if we're a config or not, and whether or not to include
249 # our .config / auto.conf.  Configs are basically their own makefile, (ifeq),
250 # and cleans are allowed to proceed without worrying about the dot-config.
251
252 # Basic helpers built in scripts/
253 PHONY += scripts_basic
254 scripts_basic:
255         $(Q)$(MAKE) $(build)=scripts/basic
256
257 PHONY += scripts
258
259 scripts: scripts_basic include/config/auto.conf include/config/tristate.conf
260         $(Q)$(MAKE) $(build)=$(@)
261
262 config-targets := 0
263 mixed-targets  := 0
264 dot-config     := 1
265
266 no-dot-config-targets := $(clean-goals)
267
268 ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
269     ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
270         dot-config := 0
271     endif
272 endif
273
274 ifneq ($(filter config %config,$(MAKECMDGOALS)),)
275     config-targets := 1
276     ifneq ($(filter-out config %config,$(MAKECMDGOALS)),)
277         mixed-targets := 1
278     endif
279 endif
280
281 ifeq ($(mixed-targets),1)
282 # ===========================================================================
283 # We're called with mixed targets (*config and build targets).
284 # Handle them one by one.
285
286 %:: FORCE
287         $(Q)$(MAKE) -C $(srctree) KBUILD_SRC= $@
288
289 else
290 ifeq ($(config-targets),1)
291 # ===========================================================================
292 # *config targets only - make sure prerequisites are updated, and descend
293 # in scripts/kconfig to make the *config target
294
295 # Default config file, per arch.  This path will resolve to
296 # arch/$ARCH/configs/defconfig (arch -> kern/arch).  Each arch can override
297 # this if they want, or just symlink to one in the main root directory.
298 KBUILD_DEFCONFIG := defconfig
299 export KBUILD_DEFCONFIG
300
301 config: scripts_basic symlinks FORCE
302         $(Q)mkdir -p include/config
303         $(Q)$(MAKE) $(build)=scripts/kconfig $@
304
305 %config: scripts_basic symlinks FORCE
306         $(Q)mkdir -p include/config
307         $(Q)$(MAKE) $(build)=scripts/kconfig $@
308
309 else
310 # ===========================================================================
311 # Build targets only - this includes vmlinux, arch specific targets, clean
312 # targets and others. In general all targets except *config targets.
313
314 ifeq ($(dot-config),1)
315 KCONFIG_CONFIG ?= .config
316 export KCONFIG_CONFIG
317
318 # Read in config
319 -include include/config/auto.conf
320
321 # Read in dependencies to all Kconfig* files, make sure to run
322 # oldconfig if changes are detected.
323 -include include/config/auto.conf.cmd
324
325 # To avoid any implicit rule to kick in, define an empty command
326 $(KCONFIG_CONFIG) include/config/auto.conf.cmd: ;
327
328 # If .config is newer than include/config/auto.conf, someone tinkered
329 # with it and forgot to run make oldconfig.
330 # if auto.conf.cmd is missing then we are probably in a cleaned tree so
331 # we execute the config step to be sure to catch updated Kconfig files
332 include/config/%.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd
333         $(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
334
335 else
336 # Dummy target needed, because used as prerequisite
337 include/config/auto.conf: ;
338 endif # $(dot-config)
339
340 # Akaros include stuff (includes custom make targets and user overrides)
341 # =========================================================================
342
343 # The user can override this, though it won't apply for any of the in-tree
344 # kernel build output.  Right now, it's only passed down to tests/
345 OBJDIR ?= obj
346 dummy-1 := $(shell mkdir -p $(OBJDIR)/kern/)
347
348 # Don't need to export these, since the Makelocal is included.
349 KERNEL_OBJ := $(OBJDIR)/kern/akaros-kernel
350 CMP_KERNEL_OBJ := $(KERNEL_OBJ).gz
351
352 # Since we're doing this outside of the dot-config part, some targets, such as
353 # clean, won't read in our .config/auto.conf, and won't know about the
354 # KFS_PATH.  Future rules related to KFS will have issues (mkdir with no
355 # argument, or a find of the entire pwd).  It's also possible someone provided
356 # an empty path.  To deal with both, we'll just have a sensible default.
357 kfs-paths :=  $(patsubst "%",%,$(CONFIG_KFS_PATHS))
358 ifeq ($(kfs-paths),)
359 kfs-paths := kern/kfs
360 endif
361
362 FIRST_KFS_PATH = $(firstword $(kfs-paths))
363
364 export OBJDIR FIRST_KFS_PATH
365
366 # Avoiding implicit rules
367 $(srctree)/Makelocal: ;
368 # TODO: one issue is that we import all types of targets: build, clean, etc.
369 # That makes it a bit tougher to reorganize with ifeqs.
370 -include $(srctree)/Makelocal
371
372 # Akaros Kernel Build
373 # =========================================================================
374 # Add top level directories, either to an existing entry (core-y) or to its
375 # own. 
376 #
377 # From these, we determine deps and dirs.  We recursively make through the
378 # dirs, generating built-in.o at each step, which are the deps from which we
379 # link akaros.
380 #
381 # We have all-arch-dirs and all-dirs, so that we can still clean even without
382 # an arch symlink.
383
384 core-y += kern/src/ kern/drivers/
385 arch-y += kern/arch/$(ARCH)/
386
387 akaros-dirs     := $(patsubst %/,%,$(filter %/, $(core-y) $(arch-y)))
388
389 all-arch-dirs   := $(patsubst %,kern/arch/%/,$(valid-arches))
390 akaros-all-dirs := $(patsubst %/,%,$(filter %/, $(core-y) $(all-arch-dirs)))
391
392 core-y          := $(patsubst %/, %/built-in.o, $(core-y))
393 arch-y          := $(patsubst %/, %/built-in.o, $(arch-y))
394
395 kbuild_akaros_main := $(core-y) $(arch-y)
396 akaros-deps := $(kbuild_akaros_main)  kern/arch/$(ARCH)/kernel.ld
397
398 kern_cpio := $(OBJDIR)/kern/initramfs.cpio
399 kern_cpio_obj := $(kern_cpio).o
400
401 # ext2 will crash at runtime if we don't have a block device.  try to catch the
402 # errors now.  if it is a bad one, you're just out of luck.
403 ifneq ($(CONFIG_EXT2FS),)
404 ext2-bdev := $(patsubst "%",%,$(CONFIG_EXT2_BDEV))
405 ifeq ($(ext2-bdev),)
406 $(error EXT2 selected with no block device [$(ext2-bdev)], fix your .config)
407 endif
408 ext2_bdev_obj = $(OBJDIR)/kern/$(shell basename $(ext2-bdev)).o
409 endif
410
411 kern_initramfs_files := $(shell mkdir -p $(kfs-paths); \
412                           find $(kfs-paths))
413
414 $(kern_cpio) initramfs: $(kern_initramfs_files)
415         @echo "  Building initramfs:"
416         @if [ "$(CONFIG_KFS_CPIO_BIN)" != "" ]; then \
417         sh $(CONFIG_KFS_CPIO_BIN); \
418     fi
419         $(Q)for i in $(kfs-paths); do cd $$i; \
420         echo "    Adding $$i to initramfs..."; \
421         find -L . | cpio --quiet -oH newc > \
422                         $(CURDIR)/$(kern_cpio); \
423         cd $$OLDPWD; \
424     done;
425
426 ld_emulation = $(shell $(OBJDUMP) -i | grep -v BFD | grep ^[a-z] |head -n1)
427 ld_arch = $(shell $(OBJDUMP) -i | grep -v BFD | grep "^  [a-z]" | head -n1)
428
429 $(kern_cpio_obj): $(kern_cpio)
430         $(Q)$(OBJCOPY) -I binary -B $(ld_arch) -O $(ld_emulation) $^ $@
431
432 # If no ext2, this will be (empty) : (empty)
433 $(ext2_bdev_obj): $(ext2-bdev)
434         $(Q)$(OBJCOPY) -I binary -B $(ld_arch) -O $(ld_emulation) $^ $@
435
436 quiet_cmd_link-akaros = LINK    $@
437       cmd_link-akaros = $(LD) -T kern/arch/$(ARCH)/kernel.ld -o $@ \
438                               $(akaros-deps) \
439                               $(gcc-lib) \
440                               $(kern_cpio_obj) \
441                               $(ext2_bdev_obj) ; \
442                               $(OBJDUMP) -S $@ > $@.asm
443
444 # For some reason, the if_changed doesn't work with FORCE (like it does in
445 # Linux).  It looks like it can't find the .cmd file or something (also
446 # complaints of $(targets), so that all is probably messed up).
447 $(KERNEL_OBJ): $(akaros-deps) $(kern_cpio_obj) $(ext2_bdev_obj)
448         $(call if_changed,link-akaros)
449
450 akaros-kernel: $(KERNEL_OBJ)
451
452 $(sort $(akaros-deps)): $(akaros-dirs) ;
453
454 # Recursively Kbuild all of our directories.  If we're changing arches
455 # mid-make, we might have issues ( := on akaros-dirs, etc).
456 PHONY += $(akaros-dirs)
457 $(akaros-dirs): scripts symlinks
458         $(Q)$(MAKE) $(build)=$@
459
460 $(CMP_KERNEL_OBJ): $(KERNEL_OBJ)
461         @echo "Compressing kernel image"
462         $(Q)gzip -c $^ > $@
463
464 # TODO: not sure what all we want to have available for config targets
465 # (anything after this is allowed.  We currently need clean targets available
466 # (config->symlinks->clean).
467 endif #ifeq ($(config-targets),1)
468 endif #ifeq ($(mixed-targets),1)
469
470 # Akaros Userspace Building and Misc Helpers
471 # =========================================================================
472 # Recursively make user libraries and tests.
473 #
474 # User library makefiles are built to expect to be called from their own
475 # directories.  The test code can be called from the root directory.
476
477 # List all userspace directories here, and state any dependencies between them,
478 # such as how pthread depends on parlib.
479
480 user-dirs = parlib pthread benchutil
481 pthread: parlib
482
483 PHONY += install-libs $(user-dirs)
484 install-libs: $(user-dirs) symlinks
485
486 $(user-dirs):
487         @cd user/$@ && $(MAKE) && $(MAKE) install
488
489
490 PHONY += userclean $(clean-user-dirs)
491 clean-user-dirs := $(addprefix _clean_user_,$(user-dirs))
492 userclean: $(clean-user-dirs) testclean
493
494 $(clean-user-dirs):
495         @cd user/$(patsubst _clean_user_%,%,$@) && $(MAKE) clean
496
497 tests/: tests
498 tests: install-libs
499         @$(MAKE) -f tests/Makefile
500
501 testclean:
502         @$(MAKE) -f tests/Makefile clean
503
504 install-tests:
505         @$(MAKE) -f tests/Makefile install
506
507 # TODO: cp -u all of the .sos, but flush it on an arch change (same with tests)
508 fill-kfs: install-libs install-tests
509         @mkdir -p $(FIRST_KFS_PATH)/lib
510         @cp $(addprefix $(XCC_ROOT)/$(ARCH)-ros/lib/, \
511           libc.so.6 ld.so.1 libm.so libgcc_s.so.1) $(FIRST_KFS_PATH)/lib
512         $(Q)$(STRIP) --strip-debug $(addprefix $(FIRST_KFS_PATH)/lib/, \
513                                                libc.so.6 ld.so.1)
514
515 # Use doxygen to make documentation for ROS (Untested since 2010 or so)
516 doxygen-dir := $(CUR_DIR)/Documentation/doxygen
517 docs: 
518         @echo "  Making doxygen"
519         @doxygen-dir=$(doxygen-dir) doxygen $(doxygen-dir)/rosdoc.cfg
520         @if [ ! -d $(doxygen-dir)/rosdoc/html/img ]; \
521          then \
522                 ln -s ../../img $(doxygen-dir)/rosdoc/html; \
523          fi
524
525 doxyclean:
526         @echo + clean [ROSDOC]
527         @rm -rf $(doxygen-dir)/rosdoc
528
529 objclean:
530         @echo + clean [OBJDIR]
531         @rm -rf $(OBJDIR)/*
532
533 realclean: userclean mrproper doxyclean objclean
534
535 # Cleaning
536 # =========================================================================
537 # This is mostly the Linux kernel cleaning.  We could hook in to the userspace
538 # cleaning with the 'userclean' target attached to clean, though historically
539 # 'clean' means the kernel.
540
541 # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj=dir
542 # Usage:
543 # $(Q)$(MAKE) $(clean)=dir
544 clean := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.clean obj
545
546 # clean - Delete all generated files
547 #
548 clean-dirs         := $(addprefix _clean_,$(akaros-all-dirs))
549
550 PHONY += $(clean-dirs) clean
551 $(clean-dirs):
552         $(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)
553
554 RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS \
555                    -o -name .pc -o -name .hg -o -name .git \) -prune -o
556 clean: $(clean-dirs)
557         @find $(patsubst _clean_%,%,$(clean-dirs)) $(RCS_FIND_IGNORE) \
558             \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
559             -o -name '*.ko.*' \
560             -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
561             -o -name '*.symtypes' -o -name 'modules.order' \
562             -o -name modules.builtin -o -name '.tmp_*.o.*' \
563             -o -name '*.gcno' \) -type f -print | xargs rm -f
564
565 # Could add in an archclean if we need arch-specific cleanup, or a userclean if
566 # we want to start cleaning that too.
567 #clean: archclean
568 #clean: userclean
569
570 # mrproper - Delete all generated files, including .config, and reset ARCH
571 #
572 mrproper-dirs      := $(addprefix _mrproper_,scripts)
573
574 PHONY += $(mrproper-dirs) mrproper
575 $(mrproper-dirs):
576         $(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)
577
578 mrproper: $(mrproper-dirs) clean clean_symlinks
579         @-rm -f .config
580         @find $(patsubst _mrproper_%,%,$(mrproper-dirs)) $(RCS_FIND_IGNORE) \
581             \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
582             -o -name '*.ko.*' \
583             -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
584             -o -name '*.symtypes' -o -name 'modules.order' \
585             -o -name modules.builtin -o -name '.tmp_*.o.*' \
586             -o -name '*.gcno' \) -type f -print | xargs rm -f
587
588 # Epilogue
589 # =========================================================================
590
591 PHONY += FORCE
592 FORCE:
593
594 # Don't put the srctree on this, make is looking for Makefile, not
595 # /full/path/to/Makefile.
596 Makefile: ; # avoid implicit rule on Makefile
597
598 # Declare the contents of the .PHONY variable as phony.  We keep that
599 # information in a variable so we can use it in if_changed and friends.
600 .PHONY: $(PHONY)