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