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.


d41af2e0a2a11774814ca2bc5ad5e42316f32293
[palacios.git] / geekos / 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 V3_ROOT := $(PROJECT_ROOT)/../palacios
50 VPATH := $(PROJECT_ROOT)/src
51
52
53
54 #
55 #TCPSTACK, uIP is used currently
56 #
57 TCPSTACK=UIP
58
59 #
60 #TCPSTACK, uIP is used currently
61 #
62 UIP=OFF
63
64 #
65 #LWIP, ON -- used, OFF -- not used
66 #
67 LWIP=ON
68
69
70 #
71 # This is wrong for current cygwin - no changes needed
72 #
73 # Figure out if we're compiling with cygwin, http://cygwin.com
74 #
75
76 #SYSTEM_NAME := $(shell uname -s)
77 #ifeq ($(findstring CYGWIN,$(SYSTEM_NAME)),CYGWIN)
78 #SYM_PFX            := _
79 #EXTRA_C_OPTS       := -DNEED_UNDERSCORE -DGNU_WIN32
80 #EXTRA_NASM_OPTS    := -DNEED_UNDERSCORE
81 #NON_ELF_SYSTEM     := yes
82 #EXTRA_CC_USER_OPTS := -Dmain=geekos_main
83 #endif
84
85
86
87
88 # ----------------------------------------------------------------------
89 # Configuration -
90 #   Various options specifying how GeekOS should be built,
91 #   what source files to build, which user programs to build,
92 #   etc.  This is generally the only section of the makefile
93 #   that will need to be modified.
94 # ----------------------------------------------------------------------
95
96 # List of targets to build by default.
97 # These targets encompass everything needed to boot
98 # and run GeekOS.
99 ALL_TARGETS := vmm.img
100
101
102 # Kernel source files
103 KERNEL_C_SRCS := idt.c int.c trap.c irq.c io.c \
104         blockdev.c ide.c ne2k.c \
105         keyboard.c screen.c timer.c \
106         mem.c crc32.c \
107         gdt.c tss.c segment.c \
108         bget.c malloc.c \
109         synch.c kthread.c \
110         serial.c  reboot.c \
111         paging.c \
112         debug.c vmm_stubs.c  vm.c  pci.c\
113         queue.c  socket.c net.c ring_buffer.c \
114         main.c
115
116
117 # Kernel object files built from C source files
118 KERNEL_C_OBJS := $(KERNEL_C_SRCS:%.c=geekos/%.o)
119
120 # Kernel assembly files
121 KERNEL_ASM_SRCS := lowlevel.asm
122
123 KERNEL_GAS_SRCS := 
124
125 # Kernel object files build from assembler source files
126 KERNEL_ASM_OBJS := $(KERNEL_ASM_SRCS:%.asm=geekos/%.o) 
127
128 KERNEL_GAS_OBJS := $(KERNEL_GAS_SRCS:%.s=geekos/%.o)
129
130
131 # All kernel object files
132 KERNEL_OBJS := $(KERNEL_C_OBJS) \
133   $(KERNEL_ASM_OBJS) $(KERNEL_GAS_OBJS)
134
135 # Common library source files.
136 # This library is linked into both the kernel and user programs.
137 # It provides string functions and generic printf()-style
138 # formatted output.
139 COMMON_C_SRCS := fmtout.c string.c memmove.c
140
141 # Common library object files.
142 COMMON_C_OBJS := $(COMMON_C_SRCS:%.c=common/%.o)
143
144
145
146
147 V3_LD_FLAGS := -L./palacios/
148 #V3_LIBS := -lxed -lv3vee
149 V3_LIBS := ./palacios/libxed.a ./palacios/libv3vee.a ./palacios/libxed.a ./palacios/libv3vee.a
150
151
152
153
154
155
156 ifeq ($(UIP),ON)
157         UIP_C_SRCS := psock.c timer.c uip_arp.c uip.c uip-fw.c uiplib.c uip-neighbor.c uip-split.c resolv.c
158         UIP_C_OBJS := $(UIP_C_SRCS:%.c=net/%.o)
159 else
160         UIP_C_SRCS :=
161         UIP_C_OBJS :=   
162 endif
163
164 ifeq ($(LWIP),ON)
165         LWIP_OBJS := lwip/*.o
166         CC_LWIP_OPTS := -I$(PROJECT_ROOT)/include/lwip  -I$(PROJECT_ROOT)/include/lwip/ipv4 -I$(PROJECT_ROOT)/include/libc -DLWIP_DEBUG
167 else
168         LWIP_OBJS := 
169         CC_LWIP_OPTS :=
170 endif
171
172 TCPSTACK_OBJS := $(UIP_C_OBJS) $(LWIP_OBJS)
173
174
175 # ----------------------------------------------------------------------
176 # Tools -
177 #   This section defines programs that are used to build GeekOS.
178 # ----------------------------------------------------------------------
179
180 # Uncomment if cross compiling
181 TARGET_CC_PREFIX :=  $(PROJECT_ROOT)/../devtools/i386/bin/i386-elf-
182 #TARGET_CC_PREFIX :=  i386-elf-
183
184 # Target C compiler.  gcc 2.95.2 or later should work.
185 TARGET_CC := $(TARGET_CC_PREFIX)gcc
186 #TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
187
188 # Host C compiler.  This is used to compile programs to execute on
189 # the host platform, not the target (x86) platform.  On x86/ELF
190 # systems, such as Linux and FreeBSD, it can generally be the same
191 # as the target C compiler.
192 HOST_CC := gcc
193
194 # Target linker.  GNU ld is probably to only one that will work.
195 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
196
197 # Target archiver
198 TARGET_AR := $(TARGET_CC_PREFIX)ar
199
200 # Target ranlib
201 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
202
203 # Target nm
204 TARGET_NM := $(TARGET_CC_PREFIX)nm
205
206 # Target objcopy
207 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
208
209 # Nasm (http://nasm.sourceforge.net)
210 NASM := $(PROJECT_ROOT)/../devtools/bin/nasm
211 #NASM := /opt/vmm-tools/bin/nasm
212
213 AS = as --32
214
215 # Tool to build PFAT filesystem images.
216 BUILDFAT := tools/builtFat.exe
217
218 # Perl5 or later
219 PERL := perl
220
221 # Pad a file so its size is a multiple of some unit (i.e., sector size)
222 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
223
224 # Create a file filled with zeroes.
225 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
226
227 # Calculate size of file in sectors
228 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
229
230
231 FD_SECTORS_PER_TRACK := $(PERL) $(PROJECT_ROOT)/scripts/numsecs_per_track
232
233
234 # ----------------------------------------------------------------------
235 # Definitions -
236 #   Options passed to the tools.
237 # ----------------------------------------------------------------------
238
239 # Flags used for all C source files
240 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(BOOT_FLAGS) -fPIC
241 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
242
243 # Flags used for kernel C source files
244 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include -I$(V3_ROOT)/include
245
246
247 # Flags user for kernel assembly files
248 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
249
250 # Flags used for common library and libc source files
251 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
252         $(EXTRA_CC_USER_OPTS) -I$(V3_ROOT)/include
253
254 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
255 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
256
257 # ----------------------------------------------------------------------
258 # Rules -
259 #   Describes how to compile the source files.
260 # ----------------------------------------------------------------------
261
262 # Compilation of kernel C source files
263
264 geekos/%.o : geekos/%.c
265         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS)  $(CC_LWIP_OPTS) $< -o geekos/$*.o
266
267
268 # Compilation of kernel assembly source files
269 geekos/%.o : geekos/%.asm
270         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
271
272
273 # Compilation of common library C source files
274 common/%.o : common/%.c
275         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
276
277
278 net/%.o : net/%.c
279         $(TARGET_CC) -c $(CC_GENERAL_OPTS)  $(CC_USER_OPTS) $< -o net/$*.o
280
281 # ----------------------------------------------------------------------
282 # Targets -
283 #   Specifies files to be built
284 # ----------------------------------------------------------------------
285
286 # Default target - see definition of ALL_TARGETS in Configuration section
287 all : $(ALL_TARGETS)
288
289
290 #geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
291 #       $(NASM) -O99 \
292 #       -f elf \
293 #               -I$(PROJECT_ROOT)/src/geekos/ \
294 #               $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
295 #       -o $@
296
297
298 #geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
299 #       $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
300
301 # Standard floppy image - just boots the kernel
302 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin
303         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > _temp
304         $(PAD) _temp 512
305         cp _temp fd.img
306
307
308 vmm.img: fd.img
309         cp fd.img vmm.img
310         $(PAD) vmm.img 1474560
311
312
313
314
315
316
317 # Floppy boot sector (first stage boot loader).
318 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm
319         $(NASM) -f bin \
320                 -I$(PROJECT_ROOT)/src/geekos/ \
321                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
322                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
323                 -DSECTORS_PER_TRACK=`$(FD_SECTORS_PER_TRACK) geekos/kernel.bin geekos/setup.bin` \
324                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
325                 -o $@
326
327 # Setup program (second stage boot loader).
328 geekos/setup.bin : geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/setup.asm
329         $(NASM) -f bin \
330                 -I$(PROJECT_ROOT)/src/geekos/ \
331                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
332                 -DVMM_SIZE=`$(NUMSECS) geekos/kernel.bin` \
333                 $(PROJECT_ROOT)/src/geekos/setup.asm \
334                 -o $@
335         $(PAD) $@ 2048
336
337 # Loadable (flat) kernel image.
338 geekos/kernel.bin : geekos/kernel.exe
339         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
340         $(PAD) $@ 512
341
342 # The kernel executable and symbol map.
343 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS) $(TCPSTACK_OBJS)
344         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
345                 $(V3_LD_FLAGS) \
346                 $(KERNEL_OBJS) $(COMMON_C_OBJS) $(TCPSTACK_OBJS) $(V3_LIBS) -b binary ./palacios/vm_kernel
347         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
348
349
350 force:
351
352
353 #vm_kernel: force
354 #       $(PAD) vm_kernel 512
355 #       @echo "VM kernel lives at 0x100000 and is" `$(NUMSECS) vm_kernel` "sectors long"
356
357
358
359
360 # Clean build directories of generated files
361 clean :
362         for d in geekos common libc user tools net; do \
363                 (cd $$d && rm -f *); \
364         done
365
366
367 # Build header file dependencies, so source files are recompiled when
368 # header files they depend on are modified.
369 depend : $(GENERATED_LIBC_SRCS)
370         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
371                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
372                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
373                 > depend.mak
374         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
375                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
376                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
377                 >> depend.mak
378
379
380 # By default, there are no header file dependencies.
381 depend.mak :
382         touch $@
383
384 include depend.mak