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