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.


*** empty log message ***
[palacios.git] / palacios / 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.18 $
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
23 # Base address of kernel
24 #
25 # Note: at top of memory minus three pages (GDT/TSS/IDT) 
26 # minus maximum size
27 #
28 #
29 # Note that the code will initially load at 0x10000
30 #
31 # The setup code needs to copy it up to this address and jump there
32 #
33 KERNEL_BASE_ADDR := 0x00010000
34
35 # Kernel entry point function
36 KERNEL_ENTRY = $(SYM_PFX)Main
37
38
39 PROJECT_ROOT := ..
40 VPATH := $(PROJECT_ROOT)/src
41
42 #when -DNDEBUG is set the kassert functions are disabled
43 #JRLDEBUG=-DNDEBUG
44 JRLDEBUG= -DSERIAL_PRINT_DEBUG=1 -DSERIAL_PRINT_DEBUG_LEVEL=10 -DSERIAL_PRINT=1
45
46 #
47 #
48 #Peter's compile flags
49 PADFLAGS =
50
51 # Figure out if we're compiling with cygwin, http://cygwin.com
52 SYSTEM_NAME := $(shell uname -s)
53 ifeq ($(findstring CYGWIN,$(SYSTEM_NAME)),CYGWIN)
54 SYM_PFX            := _
55 EXTRA_C_OPTS       := -DNEED_UNDERSCORE -DGNU_WIN32
56 EXTRA_NASM_OPTS    := -DNEED_UNDERSCORE
57 NON_ELF_SYSTEM     := yes
58 EXTRA_CC_USER_OPTS := -Dmain=geekos_main
59 endif
60
61
62
63
64 # ----------------------------------------------------------------------
65 # Configuration -
66 #   Various options specifying how GeekOS should be built,
67 #   what source files to build, which user programs to build,
68 #   etc.  This is generally the only section of the makefile
69 #   that will need to be modified.
70 # ----------------------------------------------------------------------
71
72 # List of targets to build by default.
73 # These targets encompass everything needed to boot
74 # and run GeekOS.
75 ALL_TARGETS := fd.img vm_kernel
76
77
78 # Kernel source files
79 KERNEL_C_SRCS := idt.c int.c trap.c irq.c io.c \
80         blockdev.c ide.c \
81         keyboard.c screen.c timer.c \
82         mem.c crc32.c \
83         gdt.c tss.c segment.c \
84         bget.c malloc.c \
85         synch.c kthread.c \
86         serial.c  reboot.c \
87         paging.c vmx.c vmcs_gen.c vmcs.c \
88          svm.c svm_handler.c vmm.c vmm_util.c vmm_stubs.c svm_ctrl_regs.c \
89         vmcb.c vmm_mem.c vm_guest.c vmm_paging.c vmm_io.c vmm_debug.c \
90         debug.c\
91         main.c
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 vmx_lowlevel.asm svm_lowlevel.asm
98
99 KERNEL_GAS_SRCS := testvm.s
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 :=  $(PROJECT_ROOT)/../devtools/i386/bin/i386-elf-
130 #TARGET_CC_PREFIX :=  i386-elf-
131
132 # Target C compiler.  gcc 2.95.2 or later should work.
133 TARGET_CC := $(TARGET_CC_PREFIX)gcc
134 #TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
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 := /opt/vmm-tools/bin/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 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(JRLDEBUG) $(PADFLAGS) -fPIC
186 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
187
188 # Flags used for kernel C source files
189 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
190
191 # Flags user for kernel assembly files
192 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
193
194 # Flags used for common library and libc source files
195 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
196         $(EXTRA_CC_USER_OPTS)
197
198 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
199 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
200
201 # ----------------------------------------------------------------------
202 # Rules -
203 #   Describes how to compile the source files.
204 # ----------------------------------------------------------------------
205
206 # Compilation of kernel C source files
207
208 geekos/%.o : geekos/%.c
209         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
210
211
212 # Compilation of kernel assembly source files
213 geekos/%.o : geekos/%.asm
214         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
215
216 # Compilation of test VM
217 geekos/%.o : geekos/%.s
218         $(AS) $< -o geekos/$*.o
219
220 geekos/%.o : geekos/%.S
221         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
222
223 # Compilation of common library C source files
224 common/%.o : common/%.c
225         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
226
227 # ----------------------------------------------------------------------
228 # Targets -
229 #   Specifies files to be built
230 # ----------------------------------------------------------------------
231
232 # Default target - see definition of ALL_TARGETS in Configuration section
233 all : $(ALL_TARGETS)
234
235
236 geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
237         $(NASM) -O99 \
238         -f elf \
239                 -I$(PROJECT_ROOT)/src/geekos/ \
240                 $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
241         -o $@
242
243
244 geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
245         $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
246
247 # Standard floppy image - just boots the kernel
248 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin vm_kernel
249         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > _temp
250         $(PAD) _temp 512
251         cat _temp vm_kernel > $@
252
253 # make ready to boot over PXE
254 pxe:    fd.img
255         cp fd.img /tftpboot/vmm.img
256         $(PAD) /tftpboot/vmm.img 1474560
257
258
259
260 # Floppy boot sector (first stage boot loader).
261 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm vm_kernel
262         $(NASM) -f bin \
263                 -I$(PROJECT_ROOT)/src/geekos/ \
264                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
265                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
266                 -DNUM_VM_KERNEL_SECTORS=`$(NUMSECS) vm_kernel` \
267                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
268                 -o $@
269
270 # Setup program (second stage boot loader).
271 geekos/setup.bin : geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/setup.asm
272         $(NASM) -f bin \
273                 -I$(PROJECT_ROOT)/src/geekos/ \
274                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
275                 -DVMM_SIZE=`$(NUMSECS) geekos/kernel.bin` \
276                 -DGUEST_SIZE=`$(NUMSECS) vm_kernel` \
277                 $(PROJECT_ROOT)/src/geekos/setup.asm \
278                 -o $@
279         $(PAD) $@ 512
280
281 # Loadable (flat) kernel image.
282 geekos/kernel.bin : geekos/kernel.exe
283         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
284         $(PAD) $@ 512
285
286 # The kernel executable and symbol map.
287 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS)
288         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
289                 $(KERNEL_OBJS) $(COMMON_C_OBJS)
290         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
291
292
293 force:
294
295
296 vm_kernel: force
297         $(PAD) vm_kernel 512
298         @echo "VM kernel lives at 0x100000 and is" `$(NUMSECS) vm_kernel` "sectors long"
299
300
301
302 vmm_mem_test: geekos/vmm_mem.c
303         $(HOST_CC) -m32 -o mem_test -DVMM_MEM_TEST -I../include ../src/geekos/vmm_mem.c 
304
305
306 # Clean build directories of generated files
307 clean :
308         for d in geekos common libc user tools; do \
309                 (cd $$d && rm -f *); \
310         done
311
312
313 # Build header file dependencies, so source files are recompiled when
314 # header files they depend on are modified.
315 depend : $(GENERATED_LIBC_SRCS)
316         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
317                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
318                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
319                 > depend.mak
320         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
321                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
322                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
323                 >> depend.mak
324
325 # By default, there are no header file dependencies.
326 depend.mak :
327         touch $@
328
329 include depend.mak