Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


geekos test kernel build fixes
[palacios.git] / test / geekos_test_vm / build / Makefile
1 # Makefile for GeekOS kernel, userspace, and tools
2 # Copyright (c) 2004,2005 David H. Hovemeyer <daveho@cs.umd.edu>
3 # $Revision: 1.2 $
4
5 # This is free software.  You are permitted to use,
6 # redistribute, and modify it as specified in the file "COPYING".
7
8 # Required software to build GeekOS:
9 # - GNU Make (http://www.gnu.org/software/make)
10 # - gcc 2.95.2 generating code for target (i386/ELF) and host platforms
11 # - nasm (http://nasm.sourceforge.net)
12 # - Perl5, AWK (any version), egrep
13 #
14 # Cygwin (http://cygwin.com) may be used to build GeekOS.
15 # Make sure that gcc, binutils, nasm, and perl are installed.
16
17 # NOTES:
18 # - This makefile has been written carefully to work correctly
19 #   with the -j (parallel make) option.  I regularly use "make -j 2"
20 #   to speed the build process on 2 processor systems.
21
22 # Base address of kernel
23 #
24 # Note: at top of memory minus three pages (GDT/TSS/IDT) 
25 # minus maximum size
26 #
27 #
28 # Note that the code will initially load at 0x10000
29 #
30 # The setup code needs to copy it up to this address and jump there
31 #
32 KERNEL_BASE_ADDR := 0x100000
33
34 # Kernel entry point function
35 KERNEL_ENTRY = $(SYM_PFX)Main
36
37
38 PROJECT_ROOT := ..
39 VPATH := $(PROJECT_ROOT)/src
40
41
42
43 ifeq ($(SERIAL_DEBUG), 1)
44 JRLDEBUG= -DDEBUG_SERIAL
45 else 
46 JRLDEBUG= 
47 endif
48
49
50 # Figure out if we're compiling with cygwin, http://cygwin.com
51 SYSTEM_NAME := $(shell uname -s)
52 ifeq ($(findstring CYGWIN,$(SYSTEM_NAME)),CYGWIN)
53 SYM_PFX            := _
54 EXTRA_C_OPTS       := -DNEED_UNDERSCORE -DGNU_WIN32
55 EXTRA_NASM_OPTS    := -DNEED_UNDERSCORE
56 NON_ELF_SYSTEM     := yes
57 EXTRA_CC_USER_OPTS := -Dmain=geekos_main
58 endif
59
60
61
62 # ----------------------------------------------------------------------
63 # Configuration -
64 #   Various options specifying how GeekOS should be built,
65 #   what source files to build, which user programs to build,
66 #   etc.  This is generally the only section of the makefile
67 #   that will need to be modified.
68 # ----------------------------------------------------------------------
69
70 # List of targets to build by default.
71 # These targets encompass everything needed to boot
72 # and run GeekOS.
73 ALL_TARGETS := geekos/kernel.bin fd.img
74
75
76 # Kernel source files
77 KERNEL_C_SRCS := idt.c int.c trap.c irq.c io.c \
78         blockdev.c ide.c \
79         keyboard.c screen.c timer.c \
80         mem.c crc32.c \
81         gdt.c tss.c segment.c \
82         bget.c malloc.c \
83         synch.c kthread.c \
84          debug.c \
85         vm_cons.c \
86         pci.c \
87         serial.c  reboot.c \
88         paging.c \
89         main.c
90
91  # 
92
93 # Kernel object files built from C source files
94 KERNEL_C_OBJS := $(KERNEL_C_SRCS:%.c=geekos/%.o)
95
96 # Kernel assembly files
97 KERNEL_ASM_SRCS := lowlevel.asm
98
99 KERNEL_GAS_SRCS :=
100
101 # Kernel object files build from assembler source files
102 KERNEL_ASM_OBJS := $(KERNEL_ASM_SRCS:%.asm=geekos/%.o) 
103
104 KERNEL_GAS_OBJS := $(KERNEL_GAS_SRCS:%.s=geekos/%.o)
105
106
107 # All kernel object files
108 KERNEL_OBJS := $(KERNEL_C_OBJS) \
109   $(KERNEL_ASM_OBJS) $(KERNEL_GAS_OBJS)
110
111 # Common library source files.
112 # This library is linked into both the kernel and user programs.
113 # It provides string functions and generic printf()-style
114 # formatted output.
115 COMMON_C_SRCS := fmtout.c string.c memmove.c
116
117 # Common library object files.
118 COMMON_C_OBJS := $(COMMON_C_SRCS:%.c=common/%.o)
119
120
121
122
123 # ----------------------------------------------------------------------
124 # Tools -
125 #   This section defines programs that are used to build GeekOS.
126 # ----------------------------------------------------------------------
127
128 # Uncomment if cross compiling
129 #TARGET_CC_PREFIX := i386-elf-
130 #TARGET_CC_PREFIX :=  $(PROJECT_ROOT)/../../devtools/i386/bin/i386-elf-
131
132 # Target C compiler.  gcc 2.95.2 or later should work.
133 TARGET_CC := $(TARGET_CC_PREFIX)gcc -m32
134
135
136 # Host C compiler.  This is used to compile programs to execute on
137 # the host platform, not the target (x86) platform.  On x86/ELF
138 # systems, such as Linux and FreeBSD, it can generally be the same
139 # as the target C compiler.
140 HOST_CC := gcc 
141
142 # Target linker.  GNU ld is probably to only one that will work.
143 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
144
145 # Target archiver
146 TARGET_AR := $(TARGET_CC_PREFIX)ar
147
148 # Target ranlib
149 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
150
151 # Target nm
152 TARGET_NM := $(TARGET_CC_PREFIX)nm
153
154 # Target objcopy
155 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
156
157 # Nasm (http://nasm.sourceforge.net)
158 #NASM := $(PROJECT_ROOT)/../../devtools/bin/nasm
159 NASM := nasm
160
161 AS = as --32
162
163 # Tool to build PFAT filesystem images.
164 BUILDFAT := tools/builtFat.exe
165
166 # Perl5 or later
167 PERL := perl
168
169 # Pad a file so its size is a multiple of some unit (i.e., sector size)
170 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
171
172 # Create a file filled with zeroes.
173 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
174
175 # Calculate size of file in sectors
176 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
177
178
179 # ----------------------------------------------------------------------
180 # Definitions -
181 #   Options passed to the tools.
182 # ----------------------------------------------------------------------
183
184 # Flags used for all C source files
185
186 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(JRLDEBUG)
187 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
188
189 # Flags used for kernel C source files
190 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
191
192 # Flags user for kernel assembly files
193 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
194
195 # Flags used for common library and libc source files
196 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
197         $(EXTRA_CC_USER_OPTS)
198
199 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
200 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
201
202 # ----------------------------------------------------------------------
203 # Rules -
204 #   Describes how to compile the source files.
205 # ----------------------------------------------------------------------
206
207 # Compilation of kernel C source files
208
209 geekos/%.o : geekos/%.c
210         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
211
212
213 # Compilation of kernel assembly source files
214 geekos/%.o : geekos/%.asm
215         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
216
217 # Compilation of test VM
218 geekos/%.o : geekos/%.s
219         $(AS) $< -o geekos/$*.o
220
221 geekos/%.o : geekos/%.S
222         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
223
224 # Compilation of common library C source files
225 common/%.o : common/%.c
226         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
227
228 # ----------------------------------------------------------------------
229 # Targets -
230 #   Specifies files to be built
231 # ----------------------------------------------------------------------
232
233 # Default target - see definition of ALL_TARGETS in Configuration section
234 all : $(ALL_TARGETS)
235
236 # Standard floppy image - just boots the kernel
237 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin
238         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > $@
239
240
241
242 guest-img: fd.img
243         cp fd.img guest.img
244         $(PAD) guest.img 1474560
245
246 guest-iso: guest-img
247         mkisofs -pad -b guest.img -R -o guest.iso guest.img
248
249
250
251 # Floppy boot sector (first stage boot loader).
252 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm
253         $(NASM) -f bin \
254                 -I$(PROJECT_ROOT)/src/geekos/ \
255                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
256                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
257                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
258                 -o $@
259
260 # Setup program (second stage boot loader).
261 geekos/setup.bin : geekos/kernel.exe $(PROJECT_ROOT)/src/geekos/setup.asm
262         $(NASM) -f bin \
263                 -I$(PROJECT_ROOT)/src/geekos/ \
264                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
265                 $(PROJECT_ROOT)/src/geekos/setup.asm \
266                 -o $@
267         $(PAD) $@ 512
268
269
270 # Loadable (flat) kernel image.
271 geekos/kernel.bin : geekos/kernel.exe
272         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
273         $(PAD) $@ 512
274
275 # The kernel executable and symbol map.
276 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS)
277         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
278                 $(KERNEL_OBJS) $(COMMON_C_OBJS)
279         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
280
281
282
283
284
285 force:
286
287 # Clean build directories of generated files
288 clean :
289         for d in geekos common libc user tools; do \
290                 (cd $$d && rm -f *); \
291         done
292
293
294 # Build header file dependencies, so source files are recompiled when
295 # header files they depend on are modified.
296 depend : $(GENERATED_LIBC_SRCS)
297         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
298                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
299                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
300                 > depend.mak
301         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
302                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
303                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
304                 >> depend.mak
305
306 # By default, there are no header file dependencies.
307 depend.mak :
308         touch $@
309
310 include depend.mak