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.


tried to reduce compiler warnings, and cut down on debugging output
[palacios.git] / palacios / build / Makefile
1 # Makefile for GeekOS kernel, userspace, and tools
2 #
3 #  Northwestern University 
4 # (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
5 # (c) 2008, Peter Dinda <pdinda@northwestern.edu> 
6 # (c) 2008, Lei Xia <xiaxlei@gmail.com>
7 # (c) 2008, The V3VEE Project <http://www.v3vee.org> 
8 #
9 # Based on GeekOS Makefile:
10 # Copyright (c) 2004,2005 David H. Hovemeyer <daveho@cs.umd.edu>
11 # $Revision: 1.71 $
12
13
14 # This is free software.  You are permitted to use,
15 # redistribute, and modify it as specified in the file "COPYING".
16
17 # Required software to build GeekOS:
18 # - GNU Make (http://www.gnu.org/software/make)
19 # - gcc 2.95.2 generating code for target (i386/ELF) and host platforms
20 # - nasm (http://nasm.sourceforge.net)
21 # - Perl5, AWK (any version), egrep
22 #
23 # Cygwin (http://cygwin.com) may be used to build GeekOS.
24 # Make sure that gcc, binutils, nasm, and perl are installed.
25
26 # NOTES:
27 # - This makefile has been written carefully to work correctly
28 #   with the -j (parallel make) option.  I regularly use "make -j 2"
29 #   to speed the build process on 2 processor systems.
30
31
32 # Base address of kernel
33 #
34 # Note: at top of memory minus three pages (GDT/TSS/IDT) 
35 # minus maximum size
36 #
37 #
38 # Note that the code will initially load at 0x10000
39 #
40 # The setup code needs to copy it up to this address and jump there
41 #
42
43
44
45
46 PROJECT_ROOT := ..
47 VPATH := $(PROJECT_ROOT)/src
48
49 #when -DNDEBUG is set the kassert functions are disabled
50 #JRLDEBUG=-DNDEBUG
51
52 # DEBUG=1 means VMM_DEBUG, VMM_INFO, and VMM_TRACE are enabled
53 # as are SERIAL_PRINT_DEBUG
54
55 DEBUG=1
56 DEBUG_SECTIONS= 
57
58 ifeq ($(DEBUG_ALL),1)
59   DEBUG_SECTIONS:= $(DEBUG_SECTIONS) -DDEBUG_SHADOW_PAGING -DDEBUG_CTRL_REGS -DDEBUG_INTERRUPTS -DDEBUG_IO -DDEBUG_KEYBOARD -DDEBUG_PIC -DDEBUG_PIT -DDEBUG_NVRAM -DDEBUG_EMULATOR -DDEBUG_GENERIC -DDEBUG_RAMDISK
60 endif
61
62 ifeq ($(DEBUG_SHADOW_PAGING),1)
63 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_SHADOW_PAGING
64 else 
65 ifeq ($(DEBUG_SHADOW_PAGING),0) 
66 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_SHADOW_PAGING
67 endif
68 endif
69
70 ifeq ($(DEBUG_CTRL_REGS),1)
71 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_CTRL_REGS
72 else 
73 ifeq ($(DEBUG_CTRL_REGS),0) 
74 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_CTRL_REGS
75 endif
76 endif
77
78 ifeq ($(DEBUG_INTERRUPTS),1)
79 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_INTERRUPTS
80 else 
81 ifeq ($(DEBUG_INTERRUPTS),0) 
82 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_INTERRUPTS
83 endif
84 endif
85
86 ifeq ($(DEBUG_IO),1)
87 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_IO
88 else 
89 ifeq ($(DEBUG_IO),0) 
90 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_IO
91 endif
92 endif
93
94 ifeq ($(DEBUG_KEYBOARD),1)
95 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_KEYBOARD
96 else 
97 ifeq ($(DEBUG_KEYBOARD),0) 
98 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_KEYBOARD
99 endif
100 endif
101
102 ifeq ($(DEBUG_PIC),1)
103 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_PIC
104 else 
105 ifeq ($(DEBUG_PIC),0) 
106 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_PIC
107 endif
108 endif
109
110 ifeq ($(DEBUG_PIT),1)
111 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_PIT
112 else 
113 ifeq ($(DEBUG_PIT),0) 
114 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_PIT
115 endif
116 endif
117
118 ifeq ($(DEBUG_NVRAM),1)
119 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_NVRAM
120 else 
121 ifeq ($(DEBUG_NVRAM),0) 
122 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_NVRAM
123 endif
124 endif
125
126 ifeq ($(DEBUG_GENERIC),1)
127 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_GENERIC
128 else 
129 ifeq ($(DEBUG_GENERIC),0) 
130 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_GENERIC
131 endif
132 endif
133
134 ifeq ($(DEBUG_EMULATOR),1)
135 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_EMULATOR
136 else 
137 ifeq ($(DEBUG_EMULATOR),0) 
138 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_EMULATOR
139 endif
140 endif
141
142 ifeq ($(DEBUG_RAMDISK),1)
143 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_RAMDISK
144 else 
145 ifeq ($(DEBUG_RAMDISK),0) 
146 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_RAMDISK
147 endif
148 endif
149
150 ifeq ($(TRACE_RAMDISK),1)
151 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DTRACE_RAMDISK
152 else
153 ifeq ($(TRACE_RAMDSK),0)
154 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UTRACE_RAMDISK
155 endif
156 endif
157
158 ifeq ($(DEBUG_XED),1)
159 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_XED
160 else 
161 ifeq ($(DEBUG_XED),0) 
162 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_XED
163 endif
164 endif
165
166 ifeq ($(DEBUG_HALT),1)
167 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_HALT
168 else 
169 ifeq ($(DEBUG_HALT),0) 
170 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_HALT
171 endif
172 endif
173
174
175 #DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DTEST_NE2K
176
177 ifeq ($(DEBUG),1)
178   JRLDEBUG= -DSERIAL_PRINT_DEBUG=1 -DSERIAL_PRINT_DEBUG_LEVEL=10 -DSERIAL_PRINT=1 -DVMM_DEBUG=1 -DVMM_INFO=1 -DVMM_TRACE=1 $(DEBUG_SECTIONS)
179
180 else
181   JRLDEBUG= -DSERIAL_PRINT_DEBUG=0 -DSERIAL_PRINT_DEBUG_LEVEL=999999 -DSERIAL_PRINT=0 -DVMM_DEBUG=0 -DVMM_INFO=0 -DVMM_TRACE=0
182 endif
183
184
185 #
186 # DECODER is the decoder that will be used 
187 # currently we only support xed
188 #
189 DECODER=XED
190
191 DECODER_FLAGS=
192 DECODER_SRCS=
193 DECODER_LIBS=
194
195 ifeq ($(DECODER),XED)
196 DECODER_SRCS := vmm_xed.c
197 DECODER_FLAGS :=  -L../lib/xed
198 DECODER_LIBS := $(PROJECT_ROOT)/lib/xed/libxed.a
199 else
200 # This is an error
201 endif
202
203
204
205
206
207
208 #
209 # This is wrong for current cygwin - no changes needed
210 #
211 # Figure out if we're compiling with cygwin, http://cygwin.com
212 #
213
214 #SYSTEM_NAME := $(shell uname -s)
215 #ifeq ($(findstring CYGWIN,$(SYSTEM_NAME)),CYGWIN)
216 #SYM_PFX            := _
217 #EXTRA_C_OPTS       := -DNEED_UNDERSCORE -DGNU_WIN32
218 #EXTRA_NASM_OPTS    := -DNEED_UNDERSCORE
219 #NON_ELF_SYSTEM     := yes
220 #EXTRA_CC_USER_OPTS := -Dmain=geekos_main
221 #endif
222
223
224
225
226 # ----------------------------------------------------------------------
227 # Configuration -
228 #   Various options specifying how GeekOS should be built,
229 #   what source files to build, which user programs to build,
230 #   etc.  This is generally the only section of the makefile
231 #   that will need to be modified.
232 # ----------------------------------------------------------------------
233
234 # List of targets to build by default.
235 # These targets encompass everything needed to boot
236 # and run GeekOS.
237 ALL_TARGETS := vmm vm_kernel
238
239
240
241
242
243
244 VMM_ASM_SRCS :=  svm_lowlevel.asm vmm_lowlevel.asm\
245 #                       vmx_lowlevel.asm
246
247 VMM_ASM_OBJS := $(VMM_ASM_SRCS:%.asm=palacios/%.o)
248
249
250 VMM_C_SRCS :=   vm_guest.c \
251                 svm.c svm_handler.c vmm.c vmm_util.c vmm_ctrl_regs.c \
252                 vmcb.c vmm_mem.c vmm_paging.c vmm_io.c vmm_debug.c svm_io.c \
253                 vmm_intr.c vmm_time.c \
254                 vmm_shadow_paging.c vm_guest_mem.c  \
255                 vm_dev.c vmm_dev_mgr.c vmm_decoder.c \
256                 svm_halt.c svm_pause.c svm_wbinvd.c \
257                 vmm_config.c vmm_hashtable.c \
258                 vmm_string.c vmm_emulator.c vmm_queue.c\
259                 vmm_host_events.c \
260                  $(DECODER_SRCS)
261 #               vmx.c vmcs_gen.c vmcs.c
262
263 VMM_C_OBJS := $(VMM_C_SRCS:%.c=palacios/%.o)
264
265 VMM_OBJS := $(VMM_C_OBJS) $(VMM_ASM_OBJS)
266
267
268
269 XED_C_SRCS := v3-xed-compat.c
270
271 XED_C_OBJS := $(XED_C_SRCS:%.c=xed/%.o)
272
273 XED_GAS_SRCS := v3-udiv-compat.s
274
275 XED_GAS_OBJS := $(XED_GAS_SRCS:%.s=xed/%.o)
276
277 XED_OBJS := $(XED_C_OBJS) $(XED_GAS_OBJS)
278
279
280
281 DEVICE_C_SRCS := generic.c keyboard.c nvram.c timer.c simple_pic.c 8259a.c 8254.c serial.c ramdisk.c cdrom.c
282
283 DEVICE_C_OBJS := $(DEVICE_C_SRCS:%.c=devices/%.o)
284
285 DEVICE_OBJS := $(DEVICE_C_OBJS)
286
287 V3LIBS := $(DECODER_LIBS)
288
289
290
291
292
293 # ----------------------------------------------------------------------
294 # Tools -
295 #   This section defines programs that are used to build GeekOS.
296 # ----------------------------------------------------------------------
297
298
299 V3_ARCH := __V3_32BIT__
300 #V3_ARCH := __V3_64BIT__
301
302 # Uncomment if cross compiling
303 #TARGET_CC_PREFIX :=  $(PROJECT_ROOT)/../devtools/i386/bin/i386-elf-
304 #TARGET_CC_PREFIX :=  i386-elf-
305
306 # Target C compiler.  gcc 2.95.2 or later should work.
307 TARGET_CC := $(TARGET_CC_PREFIX)gcc -m32
308 #TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
309
310
311 # Target linker.  GNU ld is probably to only one that will work.
312 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
313
314 # Target archiver
315 TARGET_AR := $(TARGET_CC_PREFIX)ar
316
317 # Target ranlib
318 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
319
320 # Target nm
321 TARGET_NM := $(TARGET_CC_PREFIX)nm
322
323 # Target objcopy
324 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
325
326 # Nasm (http://nasm.sourceforge.net)
327 NASM := $(PROJECT_ROOT)/../devtools/bin/nasm
328 #NASM := /opt/vmm-tools/bin/nasm
329
330 AS = as --32
331
332 # Tool to build PFAT filesystem images.
333 BUILDFAT := tools/builtFat.exe
334
335 # Perl5 or later
336 PERL := perl
337
338 # Pad a file so its size is a multiple of some unit (i.e., sector size)
339 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
340
341 # Create a file filled with zeroes.
342 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
343
344 # Calculate size of file in sectors
345 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
346
347
348 FD_SECTORS_PER_TRACK := $(PERL) $(PROJECT_ROOT)/scripts/numsecs_per_track
349
350
351 # ----------------------------------------------------------------------
352 # Definitions -
353 #   Options passed to the tools.
354 # ----------------------------------------------------------------------
355
356 # Flags used for all C source files
357 #GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(VMM_FLAGS) -fPIC #-fvisibility=hidden
358 GENERAL_OPTS :=  -O -Wall  $(EXTRA_C_OPTS) $(VMM_FLAGS) -fPIC -Werror#-fvisibility=hidden
359 CC_GENERAL_OPTS := $(GENERAL_OPTS) 
360
361 # Flags used for VMM C source files
362 CC_VMM_OPTS := -g -I$(PROJECT_ROOT)/include -D__V3VEE__ -D$(V3_ARCH) $(DECODER_FLAGS) $(JRLDEBUG)
363
364 # Flags used for VMM C ASM files
365 NASM_VMM_OPTS := -I$(PROJECT_ROOT)/src/palacios/ -f elf $(EXTRA_NASM_OPTS)
366
367
368
369
370
371 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
372 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
373
374 # ----------------------------------------------------------------------
375 # Rules -
376 #   Describes how to compile the source files.
377 # ----------------------------------------------------------------------
378
379
380
381 palacios/%.o : palacios/%.c
382         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o palacios/$*.o
383
384 palacios/%.o : palacios/%.asm
385         $(NASM) $(NASM_VMM_OPTS) $< -o palacios/$*.o
386
387 devices/%.o : devices/%.c
388         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o devices/$*.o
389
390 devices/%.o : devices/%.asm
391         $(NASM) $(NASM_VMM_OPTS) $< -o devices/$*.o
392
393
394 xed/%.o : xed/%.c
395         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o xed/$*.o
396
397 xed/%.o : xed/%.s
398         $(AS) $< -o xed/$*.o
399
400
401 # ----------------------------------------------------------------------
402 # Targets -
403 #   Specifies files to be built
404 # ----------------------------------------------------------------------
405
406 # Default target - see definition of ALL_TARGETS in Configuration section
407 all : $(ALL_TARGETS)
408
409
410 #geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
411 #       $(NASM) -O99 \
412 #       -f elf \
413 #               -I$(PROJECT_ROOT)/src/geekos/ \
414 #               $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
415 #       -o $@
416
417
418 #geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
419 #       $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
420
421
422
423 rombios_link:
424         ln -s -f ../src/vmboot/rombios/BIOS-bochs-latest rombios
425
426 vgabios_link:
427         ln -s -f ../src/vmboot/vgabios/VGABIOS-lgpl-latest.bin vgabios
428
429
430 force_rombios: rombios_link
431         (cd ../src/vmboot/rombios; make clean; make)
432
433 force_vgabios: vgabios_link
434         (cd ../src/vmboot/vgabios; make clean; make)
435
436 force_payload: force_rombios force_vgabios
437         ../scripts/make_payload.pl payload_layout.txt vm_kernel
438
439 inter1: force_payload
440         -make clean
441
442 world: inter1 vmm
443
444 vmm: palacios/vmm.lib 
445
446
447
448
449 # Loadable (flat) kernel image.
450 palacios/vmm.bin : palacios/vmm.lib
451         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary palacios/vmm.lib palacios/vmm.bin
452
453
454 # The kernel executable and symbol map.
455 palacios/vmm.lib: $(VMM_OBJS) $(DEVICE_OBJS) $(XED_OBJS) vm_kernel
456 #       $(TARGET_LD) -o palacios/vmm.lib  \
457 #               $(DECODER_FLAGS) \
458 #                $(VMM_OBJS) $(DEVICE_OBJS) $(XED_OBJS) $(V3LIBS) -b binary vm_kernel
459 #       $(TARGET_NM) palacios/vmm.lib > palacios/vmm.syms
460         $(TARGET_AR) rcs libv3vee.a  \
461                  $(VMM_OBJS) $(DEVICE_OBJS) $(XED_OBJS)
462
463
464
465 force:
466
467
468
469
470
471 # Clean build directories of generated files
472 clean :
473         for d in palacios devices; do \
474                 (cd $$d && rm -f *); \
475         done
476
477
478 # Build header file dependencies, so source files are recompiled when
479 # header files they depend on are modified.
480 depend : $(GENERATED_LIBC_SRCS)
481
482         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
483                 $(VMM_C_SRCS:%.c=$(PROJECT_ROOT)/src/palacios/%.c) \
484                 | $(PERL) -n -e 's,^(\S),palacios/$$1,;print' \
485                 >> depend.mak
486         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
487                 $(DEVICE_C_SRCS:%.c=$(PROJECT_ROOT)/src/devices/%.c) \
488                 | $(PERL) -n -e 's,^(\S),devices/$$1,;print' \
489                 >> depend.mak
490
491 # By default, there are no header file dependencies.
492 depend.mak :
493         touch $@
494
495 include depend.mak