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.


code restructuring
[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.22 $
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 \
88         debug.c vmm_stubs.c  vm.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 svm_ctrl_regs.c \
126                 vmcb.c vmm_mem.c vmm_paging.c vmm_io.c vmm_debug.c svm_io.c \
127                 vmm_shadow_paging.c vm_guest_mem.c #\
128 #               vmx.c vmcs_gen.c vmcs.c
129
130 VMM_C_OBJS := $(VMM_C_SRCS:%.c=palacios/%.o)
131
132 VMM_OBJS := $(VMM_C_OBJS) $(VMM_ASM_OBJS)
133
134
135
136 # ----------------------------------------------------------------------
137 # Tools -
138 #   This section defines programs that are used to build GeekOS.
139 # ----------------------------------------------------------------------
140
141 # Uncomment if cross compiling
142 TARGET_CC_PREFIX :=  $(PROJECT_ROOT)/../devtools/i386/bin/i386-elf-
143 #TARGET_CC_PREFIX :=  i386-elf-
144
145 # Target C compiler.  gcc 2.95.2 or later should work.
146 TARGET_CC := $(TARGET_CC_PREFIX)gcc
147 #TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
148
149 # Host C compiler.  This is used to compile programs to execute on
150 # the host platform, not the target (x86) platform.  On x86/ELF
151 # systems, such as Linux and FreeBSD, it can generally be the same
152 # as the target C compiler.
153 HOST_CC := gcc
154
155 # Target linker.  GNU ld is probably to only one that will work.
156 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
157
158 # Target archiver
159 TARGET_AR := $(TARGET_CC_PREFIX)ar
160
161 # Target ranlib
162 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
163
164 # Target nm
165 TARGET_NM := $(TARGET_CC_PREFIX)nm
166
167 # Target objcopy
168 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
169
170 # Nasm (http://nasm.sourceforge.net)
171 NASM := $(PROJECT_ROOT)/../devtools/bin/nasm
172 #NASM := /opt/vmm-tools/bin/nasm
173
174 AS = as --32
175
176 # Tool to build PFAT filesystem images.
177 BUILDFAT := tools/builtFat.exe
178
179 # Perl5 or later
180 PERL := perl
181
182 # Pad a file so its size is a multiple of some unit (i.e., sector size)
183 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
184
185 # Create a file filled with zeroes.
186 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
187
188 # Calculate size of file in sectors
189 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
190
191
192 # ----------------------------------------------------------------------
193 # Definitions -
194 #   Options passed to the tools.
195 # ----------------------------------------------------------------------
196
197 # Flags used for all C source files
198 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(JRLDEBUG) $(PADFLAGS) -fPIC
199 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
200
201 # Flags used for kernel C source files
202 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
203
204 # Flags used for VMM C source files
205 CC_VMM_OPTS := -g -I$(PROJECT_ROOT)/include
206
207 # Flags used for VMM C ASM files
208 NASM_VMM_OPTS := -I$(PROJECT_ROOT)/src/palacios/ -f elf $(EXTRA_NASM_OPTS)
209
210 # Flags user for kernel assembly files
211 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
212
213 # Flags used for common library and libc source files
214 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
215         $(EXTRA_CC_USER_OPTS)
216
217 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
218 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
219
220 # ----------------------------------------------------------------------
221 # Rules -
222 #   Describes how to compile the source files.
223 # ----------------------------------------------------------------------
224
225 # Compilation of kernel C source files
226
227 geekos/%.o : geekos/%.c
228         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
229
230
231 # Compilation of kernel assembly source files
232 geekos/%.o : geekos/%.asm
233         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
234
235 # Compilation of test VM
236 geekos/%.o : geekos/%.s
237         $(AS) $< -o geekos/$*.o
238
239 geekos/%.o : geekos/%.S
240         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
241
242 # Compilation of common library C source files
243 common/%.o : common/%.c
244         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
245
246 palacios/%.o : palacios/%.c
247         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o palacios/$*.o
248
249 palacios/%.o : palacios/%.asm
250         $(NASM) $(NASM_VMM_OPTS) $< -o palacios/$*.o
251
252 # ----------------------------------------------------------------------
253 # Targets -
254 #   Specifies files to be built
255 # ----------------------------------------------------------------------
256
257 # Default target - see definition of ALL_TARGETS in Configuration section
258 all : $(ALL_TARGETS)
259
260
261 #geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
262 #       $(NASM) -O99 \
263 #       -f elf \
264 #               -I$(PROJECT_ROOT)/src/geekos/ \
265 #               $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
266 #       -o $@
267
268
269 #geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
270 #       $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
271
272 # Standard floppy image - just boots the kernel
273 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin vm_kernel
274         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > _temp
275         $(PAD) _temp 512
276         cat _temp vm_kernel > $@
277
278 # make ready to boot over PXE
279 pxe:    fd.img
280         cp fd.img /tftpboot/vmm.img
281         $(PAD) /tftpboot/vmm.img 1474560
282
283
284
285 # Floppy boot sector (first stage boot loader).
286 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm vm_kernel
287         $(NASM) -f bin \
288                 -I$(PROJECT_ROOT)/src/geekos/ \
289                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
290                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
291                 -DNUM_VM_KERNEL_SECTORS=`$(NUMSECS) vm_kernel` \
292                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
293                 -o $@
294
295 # Setup program (second stage boot loader).
296 geekos/setup.bin : geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/setup.asm
297         $(NASM) -f bin \
298                 -I$(PROJECT_ROOT)/src/geekos/ \
299                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
300                 -DVMM_SIZE=`$(NUMSECS) geekos/kernel.bin` \
301                 -DGUEST_SIZE=`$(NUMSECS) vm_kernel` \
302                 $(PROJECT_ROOT)/src/geekos/setup.asm \
303                 -o $@
304         $(PAD) $@ 512
305
306 # Loadable (flat) kernel image.
307 geekos/kernel.bin : geekos/kernel.exe
308         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
309         $(PAD) $@ 512
310
311 # The kernel executable and symbol map.
312 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS)
313         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
314                 $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS)
315         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
316
317
318 force:
319
320
321 vm_kernel: force
322         $(PAD) vm_kernel 512
323         @echo "VM kernel lives at 0x100000 and is" `$(NUMSECS) vm_kernel` "sectors long"
324
325
326
327
328 # Clean build directories of generated files
329 clean :
330         for d in geekos common libc user tools palacios; do \
331                 (cd $$d && rm -f *); \
332         done
333
334
335 # Build header file dependencies, so source files are recompiled when
336 # header files they depend on are modified.
337 depend : $(GENERATED_LIBC_SRCS)
338         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
339                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
340                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
341                 > depend.mak
342         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
343                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
344                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
345                 >> depend.mak
346         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
347                 $(VMM_C_SRCS:%.c=$(PROJECT_ROOT)/src/palacios/%.c) \
348                 | $(PERL) -n -e 's,^(\S),palacios/$$1,;print' \
349                 >> depend.mak
350
351 # By default, there are no header file dependencies.
352 depend.mak :
353         touch $@
354
355 include depend.mak