2 # This makefile system follows the structuring conventions
3 # recommended by Peter Miller in his excellent paper:
5 # Recursive Make Considered Harmful
6 # http://aegis.sourceforge.net/auug97.pdf
32 # Cross-compiler jos toolchain
34 # This Makefile will automatically use the cross-compiler toolchain
35 # installed as 'i386-jos-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
40 # try to infer the correct GCCPREFIX
42 GCCPREFIX
:= $(shell if i386-jos-elf-objdump
-i
2>&1 | grep
'^elf32-i386$$' >/dev
/null
2>&1; \
43 then echo
'i386-jos-elf-'; \
44 elif objdump
-i
2>&1 | grep
'elf32-i386' >/dev
/null
2>&1; \
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-jos-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-jos-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
)
56 CC
:= $(GCCPREFIX
)gcc
-pipe
60 OBJCOPY
:= $(GCCPREFIX
)objcopy
61 OBJDUMP
:= $(GCCPREFIX
)objdump
65 NCC
:= gcc
$(CC_VER
) -pipe
70 # -fno-builtin is required to avoid refs to undefined functions in the kernel.
71 # Only optimize to -O1 to discourage inlining, which complicates backtraces.
72 CFLAGS
:= $(CFLAGS
) $(DEFS
) $(LABDEFS
) -O1
-fno-builtin
-I
$(TOP
) -MD
73 CFLAGS
+= -Wall
-Wno-format
-Wno-unused
-Werror
-gstabs
-m32
75 # Add -fno-stack-protector if the option exists.
76 CFLAGS
+= $(shell $(CC
) -fno-stack-protector
-E
-x c
/dev
/null
>/dev
/null
2>&1 && echo
-fno-stack-protector
)
79 LDFLAGS
:= -m elf_i386
81 # Linker flags for JOS user programs
82 ULDFLAGS
:= -T user
/user.
ld
84 GCC_LIB
:= $(shell $(CC
) $(CFLAGS
) -print-libgcc-file-name
)
86 # Lists that the */Makefrag makefile fragments will add to
89 # Make sure that 'all' is the first target
92 # Eliminate default suffix rules
95 # Delete target files if there is an error (or make is interrupted)
98 # make it so that no intermediate .o files are ever deleted
99 .PRECIOUS
: %.o
$(OBJDIR
)/boot
/%.o
$(OBJDIR
)/kern
/%.o \
100 $(OBJDIR
)/lib
/%.o
$(OBJDIR
)/fs
/%.o
$(OBJDIR
)/user
/%.o
102 KERN_CFLAGS
:= $(CFLAGS
) -DJOS_KERNEL
-gstabs
103 USER_CFLAGS
:= $(CFLAGS
) -DJOS_USER
-gstabs
108 # Include Makefrags for subdirectories
109 include boot
/Makefrag
110 include kern
/Makefrag
113 IMAGES
= $(OBJDIR
)/kern
/bochs.img
116 bochs
'display_library: nogui'
118 # For deleting the build
123 rm -rf lab
$(LAB
).
tar.gz bochs.out bochs.log
128 grade
: $(LABSETUP
)grade.sh
129 $(V
)$(MAKE
) clean >/dev
/null
2>/dev
/null
131 sh
$(LABSETUP
)grade.sh
134 @echo Please visit http
://pdos.csail.mit.edu
/cgi-bin
/828handin
135 @echo and upload lab
$(LAB
)-handin.
tar.gz. Thanks
!
138 tar cf
- `find . -type f | grep -v '^\.*$$' | grep -v '/CVS/' | grep -v '/\.svn/' | grep -v 'lab[0-9].*\.tar\.gz'` | gzip
> lab
$(LAB
)-handin.
tar.gz
142 $(V
)rm -f
$(OBJDIR
)/kern
/init.o
$(IMAGES
)
143 $(V
)$(MAKE
) "DEFS=-DTEST=_binary_obj_user_$*_start -DTESTSIZE=_binary_obj_user_$*_size" $(IMAGES
)
144 bochs
-q
'display_library: nogui'
147 $(V
)rm -f
$(OBJDIR
)/kern
/init.o
$(IMAGES
)
148 $(V
)$(MAKE
) "DEFS=-DTEST=_binary_obj_user_$*_start -DTESTSIZE=_binary_obj_user_$*_size" $(IMAGES
)
151 # This magic automatically generates makefile dependencies
152 # for header files included from C source files we compile,
153 # and keeps those dependencies up-to-date every time we recompile.
154 # See 'mergedep.pl' for more information.
155 $(OBJDIR
)/.deps
: $(foreach dir, $(OBJDIRS
), $(wildcard $(OBJDIR
)/$(dir)/*.d
))
157 @
$(PERL
) mergedep.pl
$@
$^
159 -include $(OBJDIR
)/.deps
165 handin tarball
clean realclean clean-labsetup
distclean grade labsetup