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