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.


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