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.


d871a383251df0ef117826a4e3ebb7f4c00becc6
[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.39 $
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 := vmm.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 \
88         debug.c vmm_stubs.c  vm.c  pci.c\
89         main.c
90
91 # Kernel object files built from C source files
92 KERNEL_C_OBJS := $(KERNEL_C_SRCS:%.c=geekos/%.o)
93
94 # Kernel assembly files
95 KERNEL_ASM_SRCS := lowlevel.asm
96
97 KERNEL_GAS_SRCS := testvm.s
98
99 # Kernel object files build from assembler source files
100 KERNEL_ASM_OBJS := $(KERNEL_ASM_SRCS:%.asm=geekos/%.o) 
101
102 KERNEL_GAS_OBJS := $(KERNEL_GAS_SRCS:%.s=geekos/%.o)
103
104
105 # All kernel object files
106 KERNEL_OBJS := $(KERNEL_C_OBJS) \
107   $(KERNEL_ASM_OBJS) $(KERNEL_GAS_OBJS)
108
109 # Common library source files.
110 # This library is linked into both the kernel and user programs.
111 # It provides string functions and generic printf()-style
112 # formatted output.
113 COMMON_C_SRCS := fmtout.c string.c memmove.c
114
115 # Common library object files.
116 COMMON_C_OBJS := $(COMMON_C_SRCS:%.c=common/%.o)
117
118 VMM_ASM_SRCS :=  svm_lowlevel.asm \
119 #                       vmx_lowlevel.asm
120
121 VMM_ASM_OBJS := $(VMM_ASM_SRCS:%.asm=palacios/%.o)
122
123
124 VMM_C_SRCS :=   vm_guest.c \
125                 svm.c svm_handler.c vmm.c vmm_util.c vmm_ctrl_regs.c \
126                 vmcb.c vmm_mem.c vmm_paging.c vmm_io.c vmm_debug.c svm_io.c \
127                 vmm_intr.c vmm_time.c\
128                 vmm_shadow_paging.c vm_guest_mem.c  \
129                 vm_dev.c vmm_dev_mgr.c vmm_decoder.c \
130 #\
131 #               vmx.c vmcs_gen.c vmcs.c
132
133 VMM_C_OBJS := $(VMM_C_SRCS:%.c=palacios/%.o)
134
135 VMM_OBJS := $(VMM_C_OBJS) $(VMM_ASM_OBJS)
136
137 DEVICE_C_SRCS :=  generic.c keyboard.c nvram.c timer.c simple_pic.c 8259a.c 8254.c
138
139 DEVICE_C_OBJS := $(DEVICE_C_SRCS:%.c=devices/%.o)
140
141 DEVICE_OBJS := $(DEVICE_C_OBJS)
142
143
144
145 # ----------------------------------------------------------------------
146 # Tools -
147 #   This section defines programs that are used to build GeekOS.
148 # ----------------------------------------------------------------------
149
150 # Uncomment if cross compiling
151 TARGET_CC_PREFIX :=  $(PROJECT_ROOT)/../devtools/i386/bin/i386-elf-
152 #TARGET_CC_PREFIX :=  i386-elf-
153
154 # Target C compiler.  gcc 2.95.2 or later should work.
155 TARGET_CC := $(TARGET_CC_PREFIX)gcc
156 #TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
157
158 # Host C compiler.  This is used to compile programs to execute on
159 # the host platform, not the target (x86) platform.  On x86/ELF
160 # systems, such as Linux and FreeBSD, it can generally be the same
161 # as the target C compiler.
162 HOST_CC := gcc
163
164 # Target linker.  GNU ld is probably to only one that will work.
165 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
166
167 # Target archiver
168 TARGET_AR := $(TARGET_CC_PREFIX)ar
169
170 # Target ranlib
171 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
172
173 # Target nm
174 TARGET_NM := $(TARGET_CC_PREFIX)nm
175
176 # Target objcopy
177 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
178
179 # Nasm (http://nasm.sourceforge.net)
180 NASM := $(PROJECT_ROOT)/../devtools/bin/nasm
181 #NASM := /opt/vmm-tools/bin/nasm
182
183 AS = as --32
184
185 # Tool to build PFAT filesystem images.
186 BUILDFAT := tools/builtFat.exe
187
188 # Perl5 or later
189 PERL := perl
190
191 # Pad a file so its size is a multiple of some unit (i.e., sector size)
192 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
193
194 # Create a file filled with zeroes.
195 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
196
197 # Calculate size of file in sectors
198 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
199
200
201 # ----------------------------------------------------------------------
202 # Definitions -
203 #   Options passed to the tools.
204 # ----------------------------------------------------------------------
205
206 # Flags used for all C source files
207 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(JRLDEBUG) $(PADFLAGS) -fPIC
208 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
209
210 # Flags used for kernel C source files
211 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
212
213 # Flags used for VMM C source files
214 CC_VMM_OPTS := -g -I$(PROJECT_ROOT)/include -D__V3VEE__ -D__V3_32BIT__
215
216 # Flags used for VMM C ASM files
217 NASM_VMM_OPTS := -I$(PROJECT_ROOT)/src/palacios/ -f elf $(EXTRA_NASM_OPTS)
218
219 # Flags user for kernel assembly files
220 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
221
222 # Flags used for common library and libc source files
223 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
224         $(EXTRA_CC_USER_OPTS)
225
226 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
227 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
228
229 # ----------------------------------------------------------------------
230 # Rules -
231 #   Describes how to compile the source files.
232 # ----------------------------------------------------------------------
233
234 # Compilation of kernel C source files
235
236 geekos/%.o : geekos/%.c
237         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
238
239
240 # Compilation of kernel assembly source files
241 geekos/%.o : geekos/%.asm
242         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
243
244 # Compilation of test VM
245 geekos/%.o : geekos/%.s
246         $(AS) $< -o geekos/$*.o
247
248 geekos/%.o : geekos/%.S
249         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
250
251 # Compilation of common library C source files
252 common/%.o : common/%.c
253         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
254
255 palacios/%.o : palacios/%.c
256         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o palacios/$*.o
257
258 palacios/%.o : palacios/%.asm
259         $(NASM) $(NASM_VMM_OPTS) $< -o palacios/$*.o
260
261 devices/%.o : devices/%.c
262         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o devices/$*.o
263
264 devices/%.o : devices/%.asm
265         $(NASM) $(NASM_VMM_OPTS) $< -o devices/$*.o
266
267 # ----------------------------------------------------------------------
268 # Targets -
269 #   Specifies files to be built
270 # ----------------------------------------------------------------------
271
272 # Default target - see definition of ALL_TARGETS in Configuration section
273 all : $(ALL_TARGETS)
274
275
276 #geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
277 #       $(NASM) -O99 \
278 #       -f elf \
279 #               -I$(PROJECT_ROOT)/src/geekos/ \
280 #               $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
281 #       -o $@
282
283
284 #geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
285 #       $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
286
287 # Standard floppy image - just boots the kernel
288 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin vm_kernel
289         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > _temp
290         $(PAD) _temp 512
291         cat _temp vm_kernel > $@
292
293 vmm.img : fd.img
294         cp fd.img vmm.img
295         $(PAD) vmm.img 1474560
296
297 force_rombios: 
298         (cd ../src/vmboot/rombios; make clean; make)
299 #       cp ../src/vmboot/rombios/BIOS-bochs-latest rombios
300
301 force_vgabios:
302         (cd ../src/vmboot/vgabios; make clean; make)
303
304 world: force_rombios force_vgabios
305         ../scripts/make_payload.pl payload_layout.txt vm_kernel
306         - make clean
307         make vmm.img
308
309 # make ready to boot over PXE
310 pxe:    vmm.img
311         cp vmm.img /tftpboot/vmm.img
312
313
314
315 # Floppy boot sector (first stage boot loader).
316 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm vm_kernel
317         $(NASM) -f bin \
318                 -I$(PROJECT_ROOT)/src/geekos/ \
319                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
320                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
321                 -DNUM_VM_KERNEL_SECTORS=`$(NUMSECS) vm_kernel` \
322                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
323                 -o $@
324
325 # Setup program (second stage boot loader).
326 geekos/setup.bin : geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/setup.asm
327         $(NASM) -f bin \
328                 -I$(PROJECT_ROOT)/src/geekos/ \
329                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
330                 -DVMM_SIZE=`$(NUMSECS) geekos/kernel.bin` \
331                 -DGUEST_SIZE=`$(NUMSECS) vm_kernel` \
332                 $(PROJECT_ROOT)/src/geekos/setup.asm \
333                 -o $@
334         $(PAD) $@ 512
335
336 # Loadable (flat) kernel image.
337 geekos/kernel.bin : geekos/kernel.exe
338         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
339         $(PAD) $@ 512
340
341 # The kernel executable and symbol map.
342 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS)
343         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
344                 $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS)
345         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
346
347
348 force:
349
350
351 vm_kernel: force
352         $(PAD) vm_kernel 512
353         @echo "VM kernel lives at 0x100000 and is" `$(NUMSECS) vm_kernel` "sectors long"
354
355
356
357
358 # Clean build directories of generated files
359 clean :
360         for d in geekos common libc user tools palacios devices; do \
361                 (cd $$d && rm -f *); \
362         done
363
364
365 # Build header file dependencies, so source files are recompiled when
366 # header files they depend on are modified.
367 depend : $(GENERATED_LIBC_SRCS)
368         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
369                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
370                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
371                 > depend.mak
372         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
373                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
374                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
375                 >> depend.mak
376         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
377                 $(VMM_C_SRCS:%.c=$(PROJECT_ROOT)/src/palacios/%.c) \
378                 | $(PERL) -n -e 's,^(\S),palacios/$$1,;print' \
379                 >> depend.mak
380         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
381                 $(DEVICE_C_SRCS:%.c=$(PROJECT_ROOT)/src/devices/%.c) \
382                 | $(PERL) -n -e 's,^(\S),devices/$$1,;print' \
383                 >> depend.mak
384
385 # By default, there are no header file dependencies.
386 depend.mak :
387         touch $@
388
389 include depend.mak