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.


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