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.


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