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