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