Beginnings of getting user apps to compile against newlib
[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 ifdef LAB
11 SETTINGLAB := true
12 else
13 -include conf/lab.mk
14 endif
15
16 -include conf/env.mk
17
18 ifndef SOL
19 SOL := 0
20 endif
21 ifndef LABADJUST
22 LABADJUST := 0
23 endif
24
25 ifndef LABSETUP
26 LABSETUP := ./
27 endif
28
29
30 TOP = .
31
32 # Cross-compiler ros toolchain
33 #
34 # This Makefile will automatically use the cross-compiler toolchain
35 # installed as 'i386-ros-elf-*', if one exists.  If the host tools ('gcc',
36 # 'objdump', and so forth) compile for a 32-bit x86 ELF target, that will
37 # be detected as well.  If you have the right compiler toolchain installed
38 # using a different name, set GCCPREFIX explicitly in conf/env.mk
39
40 # try to infer the correct GCCPREFIX
41 ifndef GCCPREFIX
42 GCCPREFIX := $(shell if i386-ros-elf-objdump -i 2>&1 | grep '^elf32-i386$$' >/dev/null 2>&1; \
43         then echo 'i386-ros-elf-'; \
44         elif objdump -i 2>&1 | grep 'elf32-i386' >/dev/null 2>&1; \
45         then echo ''; \
46         else echo "***" 1>&2; \
47         echo "*** Error: Couldn't find an i386-*-elf version of GCC/binutils." 1>&2; \
48         echo "*** Is the directory with i386-ros-elf-gcc in your PATH?" 1>&2; \
49         echo "*** If your i386-*-elf toolchain is installed with a command" 1>&2; \
50         echo "*** prefix other than 'i386-ros-elf-', set your GCCPREFIX" 1>&2; \
51         echo "*** environment variable to that prefix and run 'make' again." 1>&2; \
52         echo "*** To turn off this error, run 'gmake GCCPREFIX= ...'." 1>&2; \
53         echo "***" 1>&2; exit 1; fi)
54 endif
55
56 CC      := $(GCCPREFIX)gcc -pipe
57 GCC_LIB := $(shell $(CC) -print-libgcc-file-name)
58 AS      := $(GCCPREFIX)as
59 AR      := $(GCCPREFIX)ar
60 LD      := $(GCCPREFIX)ld
61 OBJCOPY := $(GCCPREFIX)objcopy
62 OBJDUMP := $(GCCPREFIX)objdump
63 NM      := $(GCCPREFIX)nm
64 ARCH ?= NONE
65
66 # Native commands
67 NCC     := gcc $(CC_VER) -pipe
68 TAR     := gtar
69 PERL    := perl
70
71 # Compiler flags
72 # -fno-builtin is required to avoid refs to undefined functions in the kernel.
73 # Only optimize to -O1 to discourage inlining, which complicates backtraces.
74 CFLAGS  := $(CFLAGS) $(DEFS) $(LABDEFS) -D$(ARCH) -O -fno-builtin -fno-stack-protector -I$(TOP) -MD -Wall -Wno-format -Wno-unused -gstabs #-save-temps
75
76 # 64 Bit machines need these settings to compile and link
77 UNAME=$(shell uname -m)
78 ifeq ($(UNAME),x86_64)
79         LD += -melf_i386
80         CFLAGS += -m32
81         GCC_LIB = $(shell $(CC) -print-libgcc-file-name | sed 's/libgcc.a/32\/libgcc.a/')
82 endif
83
84 # Linker flags for ROS user programs
85 ULDFLAGS := -T user/user.ld -nostdlib
86 ULDFLAGS := -T user_newlib/user_newlib.ld -nostdlib
87
88 # Lists that the */Makefrag makefile fragments will add to
89 OBJDIRS :=
90
91 # Make sure that 'all' is the first target
92 all:
93
94 # Eliminate default suffix rules
95 .SUFFIXES:
96
97 # Delete target files if there is an error (or make is interrupted)
98 .DELETE_ON_ERROR:
99
100 # make it so that no intermediate .o files are ever deleted
101 .PRECIOUS: %.o $(OBJDIR)/boot/%.o $(OBJDIR)/kern/%.o \
102         $(OBJDIR)/lib/%.o $(OBJDIR)/fs/%.o $(OBJDIR)/user/%.o \
103         $(OBJDIR)/newlib/%.o $(OBJDIR)/user_newlib/%.o
104
105 KERN_CFLAGS := $(CFLAGS) -DROS_KERNEL -gstabs -nostdinc
106 USER_CFLAGS := $(CFLAGS) -DROS_USER -gstabs
107
108 # Include Makefrags for subdirectories
109 include boot/Makefrag
110 include lib/Makefrag
111 include newlib/Makefrag
112 include ivylib/Makefrag
113 include kern/Makefrag
114 include user/Makefrag
115 include user_newlib/Makefrag
116 -include Makelocal
117
118 IMAGES = $(OBJDIR)/kern/bochs.img
119
120 # For deleting the build
121 clean:
122         rm -rf $(OBJDIR)
123
124 realclean: clean
125         rm -rf lab$(LAB).tar.gz bochs.out bochs.log
126
127 distclean: realclean
128         rm -rf conf/gcc.mk
129
130 usb: $(IMAGES)
131         sudo mount /dev/sde4 /media/usb
132         sudo cp obj/kern/kernel /media/usb/
133         sudo umount /media/usb
134
135 # This magic automatically generates makefile dependencies
136 # for header files included from C source files we compile,
137 # and keeps those dependencies up-to-date every time we recompile.
138 # See 'mergedep.pl' for more information.
139 $(OBJDIR)/.deps: $(foreach dir, $(OBJDIRS), $(wildcard $(OBJDIR)/$(dir)/*.d))
140         @mkdir -p $(@D)
141         @$(PERL) mergedep.pl $@ $^
142
143 -include $(OBJDIR)/.deps
144
145 always:
146         @:
147
148 .PHONY: all always \
149         handin tarball clean realclean clean-labsetup distclean grade labsetup