c89c3cf3323369b7d335d861e3c40340685ede5a
[akaros.git] / GNUmakefile
1 #
2 # This makefile system follows the structuring conventions
3 # recommended by Peter Miller in his excellent paper:
4 #
5 #       Recursive Make Considered Harmful
6 #       http://aegis.sourceforge.net/auug97.pdf
7 #
8
9 -include Makelocal
10
11 OBJDIR := obj
12
13 TOP_DIR := .
14 ARCH_DIR := $(TOP_DIR)/kern/arch
15 INCLUDE_DIR := $(TOP_DIR)/kern/include
16 UNAME=$(shell uname -m)
17 V = @
18
19 # Cross-compiler ros toolchain
20 #
21 # This Makefile will automatically use the cross-compiler toolchain
22 # installed as 'i386-ros-elf-*', if one exists.  If the host tools ('gcc',
23 # 'objdump', and so forth) compile for a 32-bit x86 ELF target, that will
24 # be detected as well.  If you have the right compiler toolchain installed
25 # using a different name, set GCCPREFIX explicitly in conf/env.mk
26
27 # try to infer the correct GCCPREFIX
28 ifndef GCCPREFIX
29 GCCPREFIX := $(shell if i386-ros-elf-objdump -i 2>&1 | grep '^elf32-i386$$' >/dev/null 2>&1; \
30         then echo 'i386-ros-elf-'; \
31         elif objdump -i 2>&1 | grep 'elf32-i386' >/dev/null 2>&1; \
32         then echo ''; \
33         else echo "***" 1>&2; \
34         echo "*** Error: Couldn't find an i386-*-elf version of GCC/binutils." 1>&2; \
35         echo "*** Is the directory with i386-ros-elf-gcc in your PATH?" 1>&2; \
36         echo "*** If your i386-*-elf toolchain is installed with a command" 1>&2; \
37         echo "*** prefix other than 'i386-ros-elf-', set your GCCPREFIX" 1>&2; \
38         echo "*** environment variable to that prefix and run 'make' again." 1>&2; \
39         echo "*** To turn off this error, run 'gmake GCCPREFIX= ...'." 1>&2; \
40         echo "***" 1>&2; exit 1; fi)
41 endif
42
43 # Default programs for compilation
44 CC          := ivycc --deputy --gcc=$(GCCPREFIX)gcc
45 AS          := $(GCCPREFIX)as
46 AR          := $(GCCPREFIX)ar
47 LD          := $(GCCPREFIX)ld
48 OBJCOPY := $(GCCPREFIX)objcopy
49 OBJDUMP := $(GCCPREFIX)objdump
50 NM          := $(GCCPREFIX)nm
51 PERL    := perl
52
53 # User defined constants passed on the command line 
54 TARGET_ARCH ?= i386
55
56 # Universal compiler flags
57 # -fno-builtin is required to avoid refs to undefined functions in the kernel.
58 # Only optimize to -O1 to discourage inlining, which complicates backtraces.
59 CFLAGS := $(CFLAGS) -D$(TARGET_ARCH)
60 CFLAGS += -O2 -pipe -MD -fno-builtin -fno-stack-protector -gstabs
61 CFLAGS += -Wall -Wno-format -Wno-unused -Wno-attributes
62 CFLAGS += -nostdinc -Igccinclude/$(TARGET_ARCH)
63
64 # Universal loader flags
65 LDFLAGS := -nostdlib
66
67 # GCC Library path 
68 GCC_LIB := $(shell $(CC) -print-libgcc-file-name)
69
70 # 64 Bit specific flags / definitions
71 ifeq ($(TARGET_ARCH),i386)
72         ifeq ($(UNAME),x86_64)
73                 CFLAGS += -m32
74                 LDFLAGS += -melf_i386
75                 GCC_LIB = $(shell $(CC) -print-libgcc-file-name | sed 's/libgcc.a/32\/libgcc.a/')
76         endif
77 endif
78
79 # List of directories that the */Makefrag makefile fragments will add to
80 OBJDIRS :=
81
82 # Make sure that 'all' is the first target
83 all: symlinks
84
85 kern/boot/Makefrag: symlinks
86
87 symlinks:
88         -unlink kern/include/arch
89         ln -s ../arch/$(TARGET_ARCH)/ kern/include/arch
90         -unlink kern/src/arch
91         ln -s ../arch/$(TARGET_ARCH)/ kern/src/arch
92         -unlink kern/boot
93         ln -s arch/$(TARGET_ARCH)/boot/ kern/boot
94
95 # Include Makefrags for subdirectories
96 include user/Makefrag
97 include kern/Makefrag
98
99 # Eliminate default suffix rules
100 .SUFFIXES:
101
102 # Delete target files if there is an error (or make is interrupted)
103 .DELETE_ON_ERROR:
104
105 # This magic automatically generates makefile dependencies
106 # for header files included from C source files we compile,
107 # and keeps those dependencies up-to-date every time we recompile.
108 # See 'mergedep.pl' for more information.
109 $(OBJDIR)/.deps: $(foreach dir, $(OBJDIRS), $(wildcard $(OBJDIR)/$(dir)/*.d))
110         @mkdir -p $(@D)
111         @$(PERL) scripts/mergedep.pl $@ $^
112
113 -include $(OBJDIR)/.deps
114
115 # For deleting the build
116 clean:
117         rm -rf $(OBJDIR)
118
119 always:
120         @:
121
122 .PHONY: all always clean
123