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.releases.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.30 $
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\
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_intr.c vmm_irq.c\
128                 vmm_shadow_paging.c vm_guest_mem.c  \
129                 vm_dev.c vmm_dev_mgr.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 :=  nvram.c timer.c simple_pic.c 8259a.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
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)
299
300 world: force_rombios
301         ../scripts/make_payload.pl payload_layout.txt vm_kernel
302         make clean
303         make vmm.img
304
305 # make ready to boot over PXE
306 pxe:    vmm.img
307         cp vmm.img /tftpboot/vmm.img
308
309
310
311 # Floppy boot sector (first stage boot loader).
312 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm vm_kernel
313         $(NASM) -f bin \
314                 -I$(PROJECT_ROOT)/src/geekos/ \
315                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
316                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
317                 -DNUM_VM_KERNEL_SECTORS=`$(NUMSECS) vm_kernel` \
318                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
319                 -o $@
320
321 # Setup program (second stage boot loader).
322 geekos/setup.bin : geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/setup.asm
323         $(NASM) -f bin \
324                 -I$(PROJECT_ROOT)/src/geekos/ \
325                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
326                 -DVMM_SIZE=`$(NUMSECS) geekos/kernel.bin` \
327                 -DGUEST_SIZE=`$(NUMSECS) vm_kernel` \
328                 $(PROJECT_ROOT)/src/geekos/setup.asm \
329                 -o $@
330         $(PAD) $@ 512
331
332 # Loadable (flat) kernel image.
333 geekos/kernel.bin : geekos/kernel.exe
334         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
335         $(PAD) $@ 512
336
337 # The kernel executable and symbol map.
338 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS)
339         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
340                 $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS)
341         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
342
343
344 force:
345
346
347 vm_kernel: force
348         $(PAD) vm_kernel 512
349         @echo "VM kernel lives at 0x100000 and is" `$(NUMSECS) vm_kernel` "sectors long"
350
351
352
353
354 # Clean build directories of generated files
355 clean :
356         for d in geekos common libc user tools palacios devices; do \
357                 (cd $$d && rm -f *); \
358         done
359
360
361 # Build header file dependencies, so source files are recompiled when
362 # header files they depend on are modified.
363 depend : $(GENERATED_LIBC_SRCS)
364         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
365                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
366                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
367                 > depend.mak
368         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
369                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
370                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
371                 >> depend.mak
372         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
373                 $(VMM_C_SRCS:%.c=$(PROJECT_ROOT)/src/palacios/%.c) \
374                 | $(PERL) -n -e 's,^(\S),palacios/$$1,;print' \
375                 >> depend.mak
376         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
377                 $(DEVICE_C_SRCS:%.c=$(PROJECT_ROOT)/src/devices/%.c) \
378                 | $(PERL) -n -e 's,^(\S),devices/$$1,;print' \
379                 >> depend.mak
380
381 # By default, there are no header file dependencies.
382 depend.mak :
383         touch $@
384
385 include depend.mak