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.


a91719cab3a1c65d7c359442a7df274d43fec7d7
[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.8 $
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
24 # THESE MUST MATCH WHAT IS DEFINED IN defs.h and defs.asm exactly
25 # MUST BE INTEGRAL NUMBER OF PAGES
26 TOP_OF_MEM := 0x40000000
27 VM_SIZE    := 0x20000000
28 VM_START   := 0x0
29
30 #
31 # THE KERNEL, SETUP, BOOTPACKAGE MUST BE SMALLER THAN THIS
32 # MUST BE INTEGRAL NUMBER OF PAGES
33 # define 
34 MAX_VMM := 0x160000
35
36 # Base address of kernel
37 #
38 # Note: at top of memory minus three pages (GDT/TSS/IDT) 
39 # minus maximum size
40 #
41 #
42 # Note that the code will initially load at 0x10000
43 #
44 # The setup code needs to copy it up to this address and jump there
45 #
46 KERNEL_BASE_ADDR := $(shell perl -e 'print sprintf("0x%x",$(TOP_OF_MEM)-4096*3-$(MAX_VMM));')
47
48 # Kernel entry point function
49 KERNEL_ENTRY = $(SYM_PFX)Main
50
51
52 PROJECT_ROOT := ..
53 VPATH := $(PROJECT_ROOT)/src
54
55 #when -DNDEBUG is set the kassert functions are disabled
56 #JRLDEBUG=-DNDEBUG
57 JRLDEBUG= -DSERIAL_PRINT_DEBUG=1 -DSERIAL_PRINT_DEBUG_LEVEL=10 -DSERIAL_PRINT=1
58
59 #
60 #
61 #Peter's compile flags
62 PADFLAGS = -DMAX_VMM=$(MAX_VMM)
63
64 # Figure out if we're compiling with cygwin, http://cygwin.com
65 SYSTEM_NAME := $(shell uname -s)
66 ifeq ($(findstring CYGWIN,$(SYSTEM_NAME)),CYGWIN)
67 SYM_PFX            := _
68 EXTRA_C_OPTS       := -DNEED_UNDERSCORE -DGNU_WIN32
69 EXTRA_NASM_OPTS    := -DNEED_UNDERSCORE
70 NON_ELF_SYSTEM     := yes
71 EXTRA_CC_USER_OPTS := -Dmain=geekos_main
72 endif
73
74 VMM_SIZES = ../include/geekos/vmm_sizes.h
75
76
77 # ----------------------------------------------------------------------
78 # Configuration -
79 #   Various options specifying how GeekOS should be built,
80 #   what source files to build, which user programs to build,
81 #   etc.  This is generally the only section of the makefile
82 #   that will need to be modified.
83 # ----------------------------------------------------------------------
84
85 # List of targets to build by default.
86 # These targets encompass everything needed to boot
87 # and run GeekOS.
88 ALL_TARGETS := fd.img vm_kernel
89
90
91 # Kernel source files
92 KERNEL_C_SRCS := idt.c int.c trap.c irq.c io.c \
93         blockdev.c ide.c \
94         keyboard.c screen.c timer.c \
95         mem.c crc32.c \
96         gdt.c tss.c segment.c \
97         bget.c malloc.c \
98         synch.c kthread.c \
99         serial.c  reboot.c \
100         paging.c vmx.c vmcs_gen.c vmcs.c\
101          svm.c \
102         main.c
103
104 # Kernel object files built from C source files
105 KERNEL_C_OBJS := $(KERNEL_C_SRCS:%.c=geekos/%.o)
106
107 # Kernel assembly files
108 KERNEL_ASM_SRCS := lowlevel.asm vmx_lowlevel.asm svm_lowlevel.asm
109
110 KERNEL_GAS_SRCS := testvm.s
111
112 # Kernel object files build from assembler source files
113 KERNEL_ASM_OBJS := $(KERNEL_ASM_SRCS:%.asm=geekos/%.o) 
114
115 KERNEL_GAS_OBJS := $(KERNEL_GAS_SRCS:%.s=geekos/%.o)
116
117
118 # All kernel object files
119 KERNEL_OBJS := $(KERNEL_C_OBJS) \
120   $(KERNEL_ASM_OBJS) $(KERNEL_GAS_OBJS)
121
122 # Common library source files.
123 # This library is linked into both the kernel and user programs.
124 # It provides string functions and generic printf()-style
125 # formatted output.
126 COMMON_C_SRCS := fmtout.c string.c memmove.c
127
128 # Common library object files.
129 COMMON_C_OBJS := $(COMMON_C_SRCS:%.c=common/%.o)
130
131
132
133
134 # ----------------------------------------------------------------------
135 # Tools -
136 #   This section defines programs that are used to build GeekOS.
137 # ----------------------------------------------------------------------
138
139 # Uncomment if cross compiling
140 #TARGET_CC_PREFIX := i386-elf-
141
142 # Target C compiler.  gcc 2.95.2 or later should work.
143 TARGET_CC := $(TARGET_CC_PREFIX)gcc
144 #TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
145
146 # Host C compiler.  This is used to compile programs to execute on
147 # the host platform, not the target (x86) platform.  On x86/ELF
148 # systems, such as Linux and FreeBSD, it can generally be the same
149 # as the target C compiler.
150 HOST_CC := gcc
151
152 # Target linker.  GNU ld is probably to only one that will work.
153 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
154
155 # Target archiver
156 TARGET_AR := $(TARGET_CC_PREFIX)ar
157
158 # Target ranlib
159 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
160
161 # Target nm
162 TARGET_NM := $(TARGET_CC_PREFIX)nm
163
164 # Target objcopy
165 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
166
167 # Nasm (http://nasm.sourceforge.net)
168 NASM := $(PROJECT_ROOT)/../devtools/bin/nasm
169 #NASM := /opt/vmm-tools/bin/nasm
170
171 AS = as --32
172
173 # Tool to build PFAT filesystem images.
174 BUILDFAT := tools/builtFat.exe
175
176 # Perl5 or later
177 PERL := perl
178
179 # Pad a file so its size is a multiple of some unit (i.e., sector size)
180 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
181
182 # Create a file filled with zeroes.
183 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
184
185 # Calculate size of file in sectors
186 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
187
188
189 # ----------------------------------------------------------------------
190 # Definitions -
191 #   Options passed to the tools.
192 # ----------------------------------------------------------------------
193
194 # Flags used for all C source files
195 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(JRLDEBUG) $(PADFLAGS)
196 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
197
198 # Flags used for kernel C source files
199 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
200
201 # Flags user for kernel assembly files
202 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
203
204 # Flags used for common library and libc source files
205 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
206         $(EXTRA_CC_USER_OPTS)
207
208 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
209 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
210
211 # ----------------------------------------------------------------------
212 # Rules -
213 #   Describes how to compile the source files.
214 # ----------------------------------------------------------------------
215
216 # Compilation of kernel C source files
217
218 geekos/%.o : geekos/%.c
219         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
220
221
222 # Compilation of kernel assembly source files
223 geekos/%.o : geekos/%.asm
224         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
225
226 # Compilation of test VM
227 geekos/%.o : geekos/%.s
228         $(AS) $< -o geekos/$*.o
229
230 geekos/%.o : geekos/%.S
231         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
232
233 # Compilation of common library C source files
234 common/%.o : common/%.c
235         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
236
237 # ----------------------------------------------------------------------
238 # Targets -
239 #   Specifies files to be built
240 # ----------------------------------------------------------------------
241
242 # Default target - see definition of ALL_TARGETS in Configuration section
243 all : $(ALL_TARGETS)
244
245
246 geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
247         $(NASM) -O99 \
248         -f elf \
249                 -I$(PROJECT_ROOT)/src/geekos/ \
250                 $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
251         -o $@
252
253
254 geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
255         $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
256
257 # Standard floppy image - just boots the kernel
258 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin vm_kernel
259         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > _temp
260         $(PAD) _temp 512
261         cat _temp vm_kernel > $@
262
263 # make ready to boot over PXE
264 pxe:    fd.img
265         cp fd.img /tftpboot/vmm.img
266         $(PAD) /tftpboot/vmm.img 1474560
267
268
269 pxe-discovery-pdinda:   fd.img
270         cp fd.img geekos.img
271         $(PAD) geekos.img 1474560
272         /usr/local/vmm-util/pxe_cp geekos.img
273         /usr/local/vmm-util/tty_perm pdinda
274         echo "Copied file to PXE boot area and set serial permissions for pdinda"
275
276
277 pxe-discovery-bjp600:   fd.img
278         cp fd.img geekos.img
279         $(PAD) geekos.img 1474560
280         /usr/local/vmm-util/pxe_cp geekos.img
281         /usr/local/vmm-util/tty_perm bjp600
282         echo "Copied file to PXE boot area and set serial permissions for pdinda"
283
284
285 # Floppy boot sector (first stage boot loader).
286 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm vm_kernel
287         $(NASM) -f bin \
288                 -I$(PROJECT_ROOT)/src/geekos/ \
289                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
290                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
291                 -DNUM_VM_KERNEL_SECTORS=`$(NUMSECS) vm_kernel` \
292                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
293                 -o $@
294
295 # Setup program (second stage boot loader).
296 geekos/setup.bin : geekos/kernel.exe $(PROJECT_ROOT)/src/geekos/setup.asm
297         $(NASM) -f bin \
298                 -I$(PROJECT_ROOT)/src/geekos/ \
299                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
300                 -DVMM_FINAL_ADDR=$(KERNEL_BASE_ADDR) \
301                 -DVMM_SIZE=$(MAX_VMM) \
302                 $(PROJECT_ROOT)/src/geekos/setup.asm \
303                 -o $@
304         $(PAD) $@ 512
305
306 # Loadable (flat) kernel image.
307 geekos/kernel.bin : geekos/kernel.exe
308         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
309         $(PAD) $@ 512
310
311 # The kernel executable and symbol map.
312 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS)
313         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
314                 $(KERNEL_OBJS) $(COMMON_C_OBJS)
315         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
316
317
318 generate_sizes: force
319         echo "#ifndef __vmm_sizes" > $(VMM_SIZES)
320         echo "#define __vmm_sizes" >> $(VMM_SIZES)
321         echo "#define KERNEL_LOAD_ADDRESS " $(KERNEL_BASE_ADDR)  >> $(VMM_SIZES) 
322
323         echo "#define KERNEL_START (KERNEL_LOAD_ADDRESS)" >> $(VMM_SIZES)
324         echo "#define KERNEL_CORE_LENGTH (" `$(NUMSECS) geekos/kernel.bin` "*512)" >> $(VMM_SIZES) 
325         echo "#define KERNEL_END (KERNEL_LOAD_ADDRESS+KERNEL_CORE_LENGTH-1)" >> $(VMM_SIZES)
326
327         echo "#define VM_KERNEL_LENGTH (" `$(NUMSECS) vm_kernel` "*512)" >> $(VMM_SIZES)
328         echo "#define VM_KERNEL_START (KERNEL_LOAD_ADDRESS + KERNEL_CORE_LENGTH)" >> $(VMM_SIZES)
329         echo "#define VM_BOOT_PACKAGE_START (VM_KERNEL_START) " >> $(VMM_SIZES)
330         echo "#define VM_BOOT_PACKAGE_END  (VM_KERNEL_START+VM_KERNEL_LENGTH-1) " >> $(VMM_SIZES)
331         echo "#endif" >> $(VMM_SIZES)
332
333 make_show_sizes: generate_sizes ../src/geekos/show_sizes.c
334         $(HOST_CC) -I../include/geekos ../src/geekos/show_sizes.c -o show_sizes
335
336 show_sizes: make_show_sizes
337         ./show_sizes
338
339
340 get_kernel_size: make_show_sizes
341         ./show_sizes | grep 
342
343 force:
344
345
346 vm_kernel: force
347         $(PAD) vm_kernel 512
348         @echo "VM kernel lives at 0x100000 and is" `$(NUMSECS) vm_kernel` "sectors long"
349
350
351 # Clean build directories of generated files
352 clean :
353         for d in geekos common libc user tools; do \
354                 (cd $$d && rm -f *); \
355         done
356
357
358 # Build header file dependencies, so source files are recompiled when
359 # header files they depend on are modified.
360 depend : $(GENERATED_LIBC_SRCS)
361         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
362                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
363                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
364                 > depend.mak
365         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
366                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
367                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
368                 >> depend.mak
369
370 # By default, there are no header file dependencies.
371 depend.mak :
372         touch $@
373
374 include depend.mak