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.


ccd3f0efffd9a6315ae4b05d6627b26554d750ab
[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.71 $
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 net.c ring_buffer.c \
234         main.c
235
236
237 # Kernel object files built from C source files
238 KERNEL_C_OBJS := $(KERNEL_C_SRCS:%.c=geekos/%.o)
239
240 # Kernel assembly files
241 KERNEL_ASM_SRCS := lowlevel.asm
242
243 KERNEL_GAS_SRCS := testvm.s udivdi3.s
244
245 # Kernel object files build from assembler source files
246 KERNEL_ASM_OBJS := $(KERNEL_ASM_SRCS:%.asm=geekos/%.o) 
247
248 KERNEL_GAS_OBJS := $(KERNEL_GAS_SRCS:%.s=geekos/%.o)
249
250
251 # All kernel object files
252 KERNEL_OBJS := $(KERNEL_C_OBJS) \
253   $(KERNEL_ASM_OBJS) $(KERNEL_GAS_OBJS)
254
255 # Common library source files.
256 # This library is linked into both the kernel and user programs.
257 # It provides string functions and generic printf()-style
258 # formatted output.
259 COMMON_C_SRCS := fmtout.c string.c memmove.c
260
261 # Common library object files.
262 COMMON_C_OBJS := $(COMMON_C_SRCS:%.c=common/%.o)
263
264 VMM_ASM_SRCS :=  svm_lowlevel.asm \
265 #                       vmx_lowlevel.asm
266
267 VMM_ASM_OBJS := $(VMM_ASM_SRCS:%.asm=palacios/%.o)
268
269
270 VMM_C_SRCS :=   vm_guest.c \
271                 svm.c svm_handler.c vmm.c vmm_util.c vmm_ctrl_regs.c \
272                 vmcb.c vmm_mem.c vmm_paging.c vmm_io.c vmm_debug.c svm_io.c \
273                 vmm_intr.c vmm_time.c \
274                 vmm_shadow_paging.c vm_guest_mem.c  \
275                 vm_dev.c vmm_dev_mgr.c vmm_decoder.c \
276                 svm_halt.c svm_pause.c svm_wbinvd.c \
277                 vmm_config.c vmm_hashtable.c \
278                 vmm_string.c vmm_emulator.c vmm_queue.c\
279                  $(DECODER_SRCS)
280 #               vmx.c vmcs_gen.c vmcs.c
281
282 VMM_C_OBJS := $(VMM_C_SRCS:%.c=palacios/%.o)
283
284 VMM_OBJS := $(VMM_C_OBJS) $(VMM_ASM_OBJS)
285
286
287
288
289 DEVICE_C_SRCS := generic.c keyboard.c nvram.c timer.c simple_pic.c 8259a.c 8254.c serial.c $(RAMDISK_SRCS)
290
291 DEVICE_C_OBJS := $(DEVICE_C_SRCS:%.c=devices/%.o)
292
293 DEVICE_OBJS := $(DEVICE_C_OBJS)
294
295 V3LIBS := $(DECODER_LIBS)
296
297
298 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
299
300 TCPSTACK_C_OBJS := $(TCPSTACK_C_SRCS:%.c=net/%.o)
301
302 TCPSTACK_OBJS := $(TCPSTACK_C_OBJS)
303
304
305
306
307 # ----------------------------------------------------------------------
308 # Tools -
309 #   This section defines programs that are used to build GeekOS.
310 # ----------------------------------------------------------------------
311
312 # Uncomment if cross compiling
313 TARGET_CC_PREFIX :=  $(PROJECT_ROOT)/../devtools/i386/bin/i386-elf-
314 #TARGET_CC_PREFIX :=  i386-elf-
315
316 # Target C compiler.  gcc 2.95.2 or later should work.
317 TARGET_CC := $(TARGET_CC_PREFIX)gcc
318 #TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
319
320 # Host C compiler.  This is used to compile programs to execute on
321 # the host platform, not the target (x86) platform.  On x86/ELF
322 # systems, such as Linux and FreeBSD, it can generally be the same
323 # as the target C compiler.
324 HOST_CC := gcc
325
326 # Target linker.  GNU ld is probably to only one that will work.
327 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
328
329 # Target archiver
330 TARGET_AR := $(TARGET_CC_PREFIX)ar
331
332 # Target ranlib
333 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
334
335 # Target nm
336 TARGET_NM := $(TARGET_CC_PREFIX)nm
337
338 # Target objcopy
339 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
340
341 # Nasm (http://nasm.sourceforge.net)
342 NASM := $(PROJECT_ROOT)/../devtools/bin/nasm
343 #NASM := /opt/vmm-tools/bin/nasm
344
345 AS = as --32
346
347 # Tool to build PFAT filesystem images.
348 BUILDFAT := tools/builtFat.exe
349
350 # Perl5 or later
351 PERL := perl
352
353 # Pad a file so its size is a multiple of some unit (i.e., sector size)
354 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
355
356 # Create a file filled with zeroes.
357 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
358
359 # Calculate size of file in sectors
360 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
361
362
363 FD_SECTORS_PER_TRACK := $(PERL) $(PROJECT_ROOT)/scripts/numsecs_per_track
364
365
366 # ----------------------------------------------------------------------
367 # Definitions -
368 #   Options passed to the tools.
369 # ----------------------------------------------------------------------
370
371 # Flags used for all C source files
372 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(VMM_FLAGS) $(BOOT_FLAGS) -fPIC
373 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
374
375 # Flags used for kernel C source files
376 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
377
378 # Flags used for VMM C source files
379 CC_VMM_OPTS := -g -I$(PROJECT_ROOT)/include -D__V3VEE__ -D__V3_32BIT__ $(DECODER_FLAGS) $(JRLDEBUG)
380
381 # Flags used for VMM C ASM files
382 NASM_VMM_OPTS := -I$(PROJECT_ROOT)/src/palacios/ -f elf $(EXTRA_NASM_OPTS)
383
384 # Flags user for kernel assembly files
385 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
386
387 # Flags used for common library and libc source files
388 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
389         $(EXTRA_CC_USER_OPTS)
390
391 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
392 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
393
394 # ----------------------------------------------------------------------
395 # Rules -
396 #   Describes how to compile the source files.
397 # ----------------------------------------------------------------------
398
399 # Compilation of kernel C source files
400
401 geekos/%.o : geekos/%.c
402         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
403
404
405 # Compilation of kernel assembly source files
406 geekos/%.o : geekos/%.asm
407         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
408
409 # Compilation of test VM
410 geekos/%.o : geekos/%.s
411         $(AS) $< -o geekos/$*.o
412
413 geekos/%.o : geekos/%.S
414         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
415
416 # Compilation of common library C source files
417 common/%.o : common/%.c
418         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
419
420 palacios/%.o : palacios/%.c
421         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o palacios/$*.o
422
423 palacios/%.o : palacios/%.asm
424         $(NASM) $(NASM_VMM_OPTS) $< -o palacios/$*.o
425
426 devices/%.o : devices/%.c
427         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS) $< -o devices/$*.o
428
429 devices/%.o : devices/%.asm
430         $(NASM) $(NASM_VMM_OPTS) $< -o devices/$*.o
431
432 net/%.o : net/%.c
433         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_VMM_OPTS)  $(CC_USER_OPTS) $< -o net/$*.o
434
435 # ----------------------------------------------------------------------
436 # Targets -
437 #   Specifies files to be built
438 # ----------------------------------------------------------------------
439
440 # Default target - see definition of ALL_TARGETS in Configuration section
441 all : $(ALL_TARGETS)
442
443
444 #geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
445 #       $(NASM) -O99 \
446 #       -f elf \
447 #               -I$(PROJECT_ROOT)/src/geekos/ \
448 #               $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
449 #       -o $@
450
451
452 #geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
453 #       $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
454
455 # Standard floppy image - just boots the kernel
456 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin
457         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > _temp
458         $(PAD) _temp 512
459         cp _temp fd.img
460
461 vmm.img : fd.img
462         cp fd.img vmm.img
463         $(PAD) vmm.img 1474560
464
465 rombios_link:
466         ln -s -f ../src/vmboot/rombios/BIOS-bochs-latest rombios
467
468 vgabios_link:
469         ln -s -f ../src/vmboot/vgabios/VGABIOS-lgpl-latest.bin vgabios
470
471 force_rombios: rombios_link
472         (cd ../src/vmboot/rombios; make clean; make)
473
474 force_vgabios: vgabios_link
475         (cd ../src/vmboot/vgabios; make clean; make)
476
477 force_payload: force_rombios force_vgabios
478         ../scripts/make_payload.pl payload_layout.txt vm_kernel
479
480 inter1: force_payload
481         -make clean
482
483 world: inter1 vmm.img
484
485 # make ready to boot over PXE
486 pxe:    vmm.img
487         cp vmm.img /tftpboot/vmm.img
488
489 run: vmm.img
490         /usr/local/qemu/bin/qemu-system-x86_64 -m 1024 -serial file:serial.out -cdrom puppy.iso -fda vmm.img 
491
492
493
494
495 # Floppy boot sector (first stage boot loader).
496 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm
497         $(NASM) -f bin \
498                 -I$(PROJECT_ROOT)/src/geekos/ \
499                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
500                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
501                 -DSECTORS_PER_TRACK=`$(FD_SECTORS_PER_TRACK) geekos/kernel.bin geekos/setup.bin` \
502                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
503                 -o $@
504
505 # Setup program (second stage boot loader).
506 geekos/setup.bin : geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/setup.asm
507         $(NASM) -f bin \
508                 -I$(PROJECT_ROOT)/src/geekos/ \
509                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
510                 -DVMM_SIZE=`$(NUMSECS) geekos/kernel.bin` \
511                 $(PROJECT_ROOT)/src/geekos/setup.asm \
512                 -o $@
513         $(PAD) $@ 2048
514
515 # Loadable (flat) kernel image.
516 geekos/kernel.bin : geekos/kernel.exe
517         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
518         $(PAD) $@ 512
519
520 # The kernel executable and symbol map.
521 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS) $(TCPSTACK_OBJS) vm_kernel
522         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
523                 $(DECODER_FLAGS) \
524                 $(KERNEL_OBJS) $(COMMON_C_OBJS) $(VMM_OBJS) $(DEVICE_OBJS) $(V3LIBS) $(TCPSTACK_OBJS) -b binary vm_kernel
525         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
526
527
528 force:
529
530
531 #vm_kernel: force
532 #       $(PAD) vm_kernel 512
533 #       @echo "VM kernel lives at 0x100000 and is" `$(NUMSECS) vm_kernel` "sectors long"
534
535
536
537
538 # Clean build directories of generated files
539 clean :
540         for d in geekos common libc user tools palacios devices net; do \
541                 (cd $$d && rm -f *); \
542         done
543
544
545 # Build header file dependencies, so source files are recompiled when
546 # header files they depend on are modified.
547 depend : $(GENERATED_LIBC_SRCS)
548         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
549                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
550                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
551                 > depend.mak
552         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
553                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
554                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
555                 >> depend.mak
556         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
557                 $(VMM_C_SRCS:%.c=$(PROJECT_ROOT)/src/palacios/%.c) \
558                 | $(PERL) -n -e 's,^(\S),palacios/$$1,;print' \
559                 >> depend.mak
560         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
561                 $(DEVICE_C_SRCS:%.c=$(PROJECT_ROOT)/src/devices/%.c) \
562                 | $(PERL) -n -e 's,^(\S),devices/$$1,;print' \
563                 >> depend.mak
564
565 # By default, there are no header file dependencies.
566 depend.mak :
567         touch $@
568
569 include depend.mak