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.68 $
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 := 0x00100000
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
45 # DEBUG=1 means VMM_DEBUG, VMM_INFO, and VMM_TRACE are enabled
46 # as are SERIAL_PRINT_DEBUG
47
48 DEBUG=1
49 DEBUG_SECTIONS= 
50
51 ifeq ($(DEBUG_ALL),1)
52   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
53 endif
54
55 ifeq ($(DEBUG_SHADOW_PAGING),1)
56 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_SHADOW_PAGING
57 else 
58 ifeq ($(DEBUG_SHADOW_PAGING),0) 
59 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_SHADOW_PAGING
60 endif
61 endif
62
63 ifeq ($(DEBUG_CTRL_REGS),1)
64 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_CTRL_REGS
65 else 
66 ifeq ($(DEBUG_CTRL_REGS),0) 
67 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_CTRL_REGS
68 endif
69 endif
70
71 ifeq ($(DEBUG_INTERRUPTS),1)
72 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_INTERRUPTS
73 else 
74 ifeq ($(DEBUG_DEBUG_INTERRUPTS),0) 
75 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_INTERRUPTS
76 endif
77 endif
78
79 ifeq ($(DEBUG_IO),1)
80 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_IO
81 else 
82 ifeq ($(DEBUG_IO),0) 
83 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_IO
84 endif
85 endif
86
87 ifeq ($(DEBUG_KEYBOARD),1)
88 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_KEYBOARD
89 else 
90 ifeq ($(DEBUG_KEYBOARD),0) 
91 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_KEYBOARD
92 endif
93 endif
94
95 ifeq ($(DEBUG_PIC),1)
96 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_PIC
97 else 
98 ifeq ($(DEBUG_PIC),0) 
99 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_PIC
100 endif
101 endif
102
103 ifeq ($(DEBUG_PIT),1)
104 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_PIT
105 else 
106 ifeq ($(DEBUG_PIT),0) 
107 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_PIT
108 endif
109 endif
110
111 ifeq ($(DEBUG_NVRAM),1)
112 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_NVRAM
113 else 
114 ifeq ($(DEBUG_NVRAM),0) 
115 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_NVRAM
116 endif
117 endif
118
119 ifeq ($(DEBUG_GENERIC),1)
120 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_GENERIC
121 else 
122 ifeq ($(DEBUG_GENERIC),0) 
123 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_GENERIC
124 endif
125 endif
126
127 ifeq ($(DEBUG_EMULATOR),1)
128 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_EMULATOR
129 else 
130 ifeq ($(DEBUG_EMULATOR),0) 
131 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_EMULATOR
132 endif
133 endif
134
135 ifeq ($(DEBUG_RAMDISK),1)
136 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -DDEBUG_RAMDISK
137 else 
138 ifeq ($(DEBUG_RAMDISK),0) 
139 DEBUG_SECTIONS := $(DEBUG_SECTIONS) -UDEBUG_RAMDISK
140 endif
141 endif
142
143
144 ifeq ($(DEBUG),1)
145   JRLDEBUG= -DSERIAL_PRINT_DEBUG=1 -DSERIAL_PRINT_DEBUG_LEVEL=10 -DSERIAL_PRINT=1 -DVMM_DEBUG=1 -DVMM_INFO=1 -DVMM_TRACE=1 $(DEBUG_SECTIONS)
146
147 else
148   JRLDEBUG= -DSERIAL_PRINT_DEBUG=0 -DSERIAL_PRINT_DEBUG_LEVEL=999999 -DSERIAL_PRINT=0 -DVMM_DEBUG=0 -DVMM_INFO=0 -DVMM_TRACE=0
149 endif
150
151
152 #
153 # DECODER is the decoder that will be used 
154 # currently we only support xed
155 #
156 DECODER=XED
157
158 DECODER_FLAGS=
159 DECODER_SRCS=
160 DECODER_LIBS=
161
162 ifeq ($(DECODER),XED)
163 DECODER_SRCS := vmm_xed.c
164 DECODER_FLAGS :=  -L../lib/xed
165 DECODER_LIBS := -lxed
166 else
167 # This is an error
168 endif
169
170 #
171 #TCPSTACK, uIP is used currently
172 #
173 TCPSTACK=UIP
174
175 #
176 #RAMDISK
177 #
178 RAMDISK_SRCS=
179 BOOT_FLAGS=
180
181 ifeq ($(RAMDISK_BOOT),1)
182 BOOT_FLAGS := $(BOOT_FLAGS) -DRAMDISK_BOOT
183 RAMDISK_SRCS := ramdisk.c cdrom.c
184 endif
185
186
187
188 #
189 # This is wrong for current cygwin - no changes needed
190 #
191 # Figure out if we're compiling with cygwin, http://cygwin.com
192 #
193
194 #SYSTEM_NAME := $(shell uname -s)
195 #ifeq ($(findstring CYGWIN,$(SYSTEM_NAME)),CYGWIN)
196 #SYM_PFX            := _
197 #EXTRA_C_OPTS       := -DNEED_UNDERSCORE -DGNU_WIN32
198 #EXTRA_NASM_OPTS    := -DNEED_UNDERSCORE
199 #NON_ELF_SYSTEM     := yes
200 #EXTRA_CC_USER_OPTS := -Dmain=geekos_main
201 #endif
202
203
204
205
206 # ----------------------------------------------------------------------
207 # Configuration -
208 #   Various options specifying how GeekOS should be built,
209 #   what source files to build, which user programs to build,
210 #   etc.  This is generally the only section of the makefile
211 #   that will need to be modified.
212 # ----------------------------------------------------------------------
213
214 # List of targets to build by default.
215 # These targets encompass everything needed to boot
216 # and run GeekOS.
217 ALL_TARGETS := vmm.img vm_kernel
218
219
220 # Kernel source files
221 KERNEL_C_SRCS := idt.c int.c trap.c irq.c io.c \
222         blockdev.c ide.c ne2k.c \
223         keyboard.c screen.c timer.c \
224         mem.c crc32.c \
225         gdt.c tss.c segment.c \
226         bget.c malloc.c \
227         synch.c kthread.c \
228         serial.c  reboot.c \
229         paging.c \
230         debug.c vmm_stubs.c  vm.c  pci.c\
231         queue.c socket.c ring_buffer.c \
232         main.c
233
234 # Kernel object files built from C source files
235 KERNEL_C_OBJS := $(KERNEL_C_SRCS:%.c=geekos/%.o)
236
237 # Kernel assembly files
238 KERNEL_ASM_SRCS := lowlevel.asm
239
240 KERNEL_GAS_SRCS := testvm.s udivdi3.s
241
242 # Kernel object files build from assembler source files
243 KERNEL_ASM_OBJS := $(KERNEL_ASM_SRCS:%.asm=geekos/%.o) 
244
245 KERNEL_GAS_OBJS := $(KERNEL_GAS_SRCS:%.s=geekos/%.o)
246
247
248 # All kernel object files
249 KERNEL_OBJS := $(KERNEL_C_OBJS) \
250   $(KERNEL_ASM_OBJS) $(KERNEL_GAS_OBJS)
251
252 # Common library source files.
253 # This library is linked into both the kernel and user programs.
254 # It provides string functions and generic printf()-style
255 # formatted output.
256 COMMON_C_SRCS := fmtout.c string.c memmove.c
257
258 # Common library object files.
259 COMMON_C_OBJS := $(COMMON_C_SRCS:%.c=common/%.o)
260
261 VMM_ASM_SRCS :=  svm_lowlevel.asm \
262 #                       vmx_lowlevel.asm
263
264 VMM_ASM_OBJS := $(VMM_ASM_SRCS:%.asm=palacios/%.o)
265
266
267 VMM_C_SRCS :=   vm_guest.c \
268                 svm.c svm_handler.c vmm.c vmm_util.c vmm_ctrl_regs.c \
269                 vmcb.c vmm_mem.c vmm_paging.c vmm_io.c vmm_debug.c svm_io.c \
270                 vmm_intr.c vmm_time.c \
271                 vmm_shadow_paging.c vm_guest_mem.c  \
272                 vm_dev.c vmm_dev_mgr.c vmm_decoder.c \
273                 svm_halt.c svm_pause.c svm_wbinvd.c \
274                 vmm_config.c vmm_hashtable.c \
275                 vmm_string.c vmm_emulator.c vmm_queue.c\
276                  $(DECODER_SRCS)
277 #               vmx.c vmcs_gen.c vmcs.c
278
279 VMM_C_OBJS := $(VMM_C_SRCS:%.c=palacios/%.o)
280
281 VMM_OBJS := $(VMM_C_OBJS) $(VMM_ASM_OBJS)
282
283
284
285
286 DEVICE_C_SRCS := generic.c keyboard.c nvram.c timer.c simple_pic.c 8259a.c 8254.c serial.c $(RAMDISK_SRCS)
287
288 DEVICE_C_OBJS := $(DEVICE_C_SRCS:%.c=devices/%.o)
289
290 DEVICE_OBJS := $(DEVICE_C_OBJS)
291
292 V3LIBS := $(DECODER_LIBS)
293
294
295 TCPSTACK_C_SRCS := psock.c timer.c uip_arp.c uip.c uip-fw.c uiplib.c uip-neighbor.c uip-split.c resolv.c
296
297 TCPSTACK_C_OBJS := $(TCPSTACK_C_SRCS:%.c=net/%.o)
298
299 TCPSTACK_OBJS := $(TCPSTACK_C_OBJS)
300
301
302
303
304 # ----------------------------------------------------------------------
305 # Tools -
306 #   This section defines programs that are used to build GeekOS.
307 # ----------------------------------------------------------------------
308
309 # Uncomment if cross compiling
310 TARGET_CC_PREFIX :=  $(PROJECT_ROOT)/../devtools/i386/bin/i386-elf-
311 #TARGET_CC_PREFIX :=  i386-elf-
312
313 # Target C compiler.  gcc 2.95.2 or later should work.
314 TARGET_CC := $(TARGET_CC_PREFIX)gcc
315 #TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
316
317 # Host C compiler.  This is used to compile programs to execute on
318 # the host platform, not the target (x86) platform.  On x86/ELF
319 # systems, such as Linux and FreeBSD, it can generally be the same
320 # as the target C compiler.
321 HOST_CC := gcc
322
323 # Target linker.  GNU ld is probably to only one that will work.
324 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
325
326 # Target archiver
327 TARGET_AR := $(TARGET_CC_PREFIX)ar
328
329 # Target ranlib
330 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
331
332 # Target nm
333 TARGET_NM := $(TARGET_CC_PREFIX)nm
334
335 # Target objcopy
336 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
337
338 # Nasm (http://nasm.sourceforge.net)
339 NASM := $(PROJECT_ROOT)/../devtools/bin/nasm
340 #NASM := /opt/vmm-tools/bin/nasm
341
342 AS = as --32
343
344 # Tool to build PFAT filesystem images.
345 BUILDFAT := tools/builtFat.exe
346
347 # Perl5 or later
348 PERL := perl
349
350 # Pad a file so its size is a multiple of some unit (i.e., sector size)
351 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
352
353 # Create a file filled with zeroes.
354 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
355
356 # Calculate size of file in sectors
357 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
358
359
360 FD_SECTORS_PER_TRACK := $(PERL) $(PROJECT_ROOT)/scripts/numsecs_per_track
361
362
363 # ----------------------------------------------------------------------
364 # Definitions -
365 #   Options passed to the tools.
366 # ----------------------------------------------------------------------
367
368 # Flags used for all C source files
369 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(VMM_FLAGS) $(BOOT_FLAGS) -fPIC
370 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
371
372 # Flags used for kernel C source files
373 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
374
375 # Flags used for VMM C source files
376 CC_VMM_OPTS := -g -I$(PROJECT_ROOT)/include -D__V3VEE__ -D__V3_32BIT__ $(DECODER_FLAGS) $(JRLDEBUG)
377
378 # Flags used for VMM C ASM files
379 NASM_VMM_OPTS := -I$(PROJECT_ROOT)/src/palacios/ -f elf $(EXTRA_NASM_OPTS)
380
381 # Flags user for kernel assembly files
382 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
383
384 # Flags used for common library and libc source files
385 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
386         $(EXTRA_CC_USER_OPTS)
387
388 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
389 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
390
391 # ----------------------------------------------------------------------
392 # Rules -
393 #   Describes how to compile the source files.
394 # ----------------------------------------------------------------------
395
396 # Compilation of kernel C source files
397
398 geekos/%.o : geekos/%.c
399         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
400
401
402 # Compilation of kernel assembly source files
403 geekos/%.o : geekos/%.asm
404         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
405
406 # Compilation of test VM
407 geekos/%.o : geekos/%.s
408         $(AS) $< -o geekos/$*.o
409
410 geekos/%.o : geekos/%.S
411         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
412
413 # Compilation of common library C source files
414 common/%.o : common/%.c
415         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
416
417 palacios/%.o : palacios/%.c
418         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o palacios/$*.o
419
420 palacios/%.o : palacios/%.asm
421         $(NASM) $(NASM_VMM_OPTS) $< -o palacios/$*.o
422
423 devices/%.o : devices/%.c
424         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o devices/$*.o
425
426 devices/%.o : devices/%.asm
427         $(NASM) $(NASM_VMM_OPTS) $< -o devices/$*.o
428
429 net/%.o : net/%.c
430         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS)  $(CC_USER_OPTS) $< -o net/$*.o
431
432 # ----------------------------------------------------------------------
433 # Targets -
434 #   Specifies files to be built
435 # ----------------------------------------------------------------------
436
437 # Default target - see definition of ALL_TARGETS in Configuration section
438 all : $(ALL_TARGETS)
439
440
441 #geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
442 #       $(NASM) -O99 \
443 #       -f elf \
444 #               -I$(PROJECT_ROOT)/src/geekos/ \
445 #               $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
446 #       -o $@
447
448
449 #geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
450 #       $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
451
452 # Standard floppy image - just boots the kernel
453 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin
454         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > _temp
455         $(PAD) _temp 512
456         cp _temp fd.img
457
458 vmm.img : fd.img
459         cp fd.img vmm.img
460         $(PAD) vmm.img 1474560
461
462 force_rombios: 
463         (cd ../src/vmboot/rombios; make clean; make)
464
465 force_vgabios:
466         (cd ../src/vmboot/vgabios; make clean; make)
467
468 force_payload: force_rombios force_vgabios
469         ../scripts/make_payload.pl payload_layout.txt vm_kernel
470
471 inter1: force_payload
472         -make clean
473
474 world: inter1 vmm.img
475
476 # make ready to boot over PXE
477 pxe:    vmm.img
478         cp vmm.img /tftpboot/vmm.img
479
480 run: vmm.img
481         /usr/local/qemu/bin/qemu-system-x86_64 -m 1024 -serial file:serial.out -cdrom puppy.iso -fda vmm.img 
482
483
484
485
486 # Floppy boot sector (first stage boot loader).
487 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm
488         $(NASM) -f bin \
489                 -I$(PROJECT_ROOT)/src/geekos/ \
490                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
491                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
492                 -DSECTORS_PER_TRACK=`$(FD_SECTORS_PER_TRACK) geekos/kernel.bin geekos/setup.bin` \
493                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
494                 -o $@
495
496 # Setup program (second stage boot loader).
497 geekos/setup.bin : geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/setup.asm
498         $(NASM) -f bin \
499                 -I$(PROJECT_ROOT)/src/geekos/ \
500                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
501                 -DVMM_SIZE=`$(NUMSECS) geekos/kernel.bin` \
502                 $(PROJECT_ROOT)/src/geekos/setup.asm \
503                 -o $@
504         $(PAD) $@ 2048
505
506 # Loadable (flat) kernel image.
507 geekos/kernel.bin : geekos/kernel.exe
508         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
509         $(PAD) $@ 512
510
511 # The kernel executable and symbol map.
512 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS) $(TCPSTACK_OBJS) vm_kernel
513         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
514                 $(DECODER_FLAGS) \
515                 $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS) $(V3LIBS) $(TCPSTACK_OBJS) -b binary vm_kernel
516         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
517
518
519 force:
520
521
522 #vm_kernel: force
523 #       $(PAD) vm_kernel 512
524 #       @echo "VM kernel lives at 0x100000 and is" `$(NUMSECS) vm_kernel` "sectors long"
525
526
527
528
529 # Clean build directories of generated files
530 clean :
531         for d in geekos common libc user tools palacios devices net; do \
532                 (cd $$d && rm -f *); \
533         done
534
535
536 # Build header file dependencies, so source files are recompiled when
537 # header files they depend on are modified.
538 depend : $(GENERATED_LIBC_SRCS)
539         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
540                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
541                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
542                 > depend.mak
543         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
544                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
545                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
546                 >> depend.mak
547         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
548                 $(VMM_C_SRCS:%.c=$(PROJECT_ROOT)/src/palacios/%.c) \
549                 | $(PERL) -n -e 's,^(\S),palacios/$$1,;print' \
550                 >> depend.mak
551         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
552                 $(DEVICE_C_SRCS:%.c=$(PROJECT_ROOT)/src/devices/%.c) \
553                 | $(PERL) -n -e 's,^(\S),devices/$$1,;print' \
554                 >> depend.mak
555
556 # By default, there are no header file dependencies.
557 depend.mak :
558         touch $@
559
560 include depend.mak