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.


87bc7dfeb9aefc94b97ab8e7d9fcd1297169a684
[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.6 $
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=1000 -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_linux_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         main.c
102
103 # Kernel object files built from C source files
104 KERNEL_C_OBJS := $(KERNEL_C_SRCS:%.c=geekos/%.o)
105
106 # Kernel assembly files
107 KERNEL_ASM_SRCS := lowlevel.asm vmx_lowlevel.asm
108
109 KERNEL_GAS_SRCS := testvm.s
110
111 # Kernel object files build from assembler source files
112 KERNEL_ASM_OBJS := $(KERNEL_ASM_SRCS:%.asm=geekos/%.o) 
113
114 KERNEL_GAS_OBJS := $(KERNEL_GAS_SRCS:%.s=geekos/%.o)
115
116
117 # All kernel object files
118 KERNEL_OBJS := $(KERNEL_C_OBJS) \
119   $(KERNEL_ASM_OBJS) $(KERNEL_GAS_OBJS)
120
121 # Common library source files.
122 # This library is linked into both the kernel and user programs.
123 # It provides string functions and generic printf()-style
124 # formatted output.
125 COMMON_C_SRCS := fmtout.c string.c memmove.c
126
127 # Common library object files.
128 COMMON_C_OBJS := $(COMMON_C_SRCS:%.c=common/%.o)
129
130
131
132
133 # ----------------------------------------------------------------------
134 # Tools -
135 #   This section defines programs that are used to build GeekOS.
136 # ----------------------------------------------------------------------
137
138 # Uncomment if cross compiling
139 #TARGET_CC_PREFIX := i386-elf-
140
141 # Target C compiler.  gcc 2.95.2 or later should work.
142 #TARGET_CC := $(TARGET_CC_PREFIX)gcc
143 TARGET_CC := $(TARGET_CC_PREFIX)gcc34 -m32
144
145 # Host C compiler.  This is used to compile programs to execute on
146 # the host platform, not the target (x86) platform.  On x86/ELF
147 # systems, such as Linux and FreeBSD, it can generally be the same
148 # as the target C compiler.
149 HOST_CC := gcc
150
151 # Target linker.  GNU ld is probably to only one that will work.
152 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
153
154 # Target archiver
155 TARGET_AR := $(TARGET_CC_PREFIX)ar
156
157 # Target ranlib
158 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
159
160 # Target nm
161 TARGET_NM := $(TARGET_CC_PREFIX)nm
162
163 # Target objcopy
164 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
165
166 # Nasm (http://nasm.sourceforge.net)
167 #NASM := $(PROJECT_ROOT)/../devtools/bin/nasm
168 NASM := /opt/vmm-tools/bin/nasm
169
170 AS = as --32
171
172 # Tool to build PFAT filesystem images.
173 BUILDFAT := tools/builtFat.exe
174
175 # Perl5 or later
176 PERL := perl
177
178 # Pad a file so its size is a multiple of some unit (i.e., sector size)
179 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
180
181 # Create a file filled with zeroes.
182 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
183
184 # Calculate size of file in sectors
185 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
186
187
188 # ----------------------------------------------------------------------
189 # Definitions -
190 #   Options passed to the tools.
191 # ----------------------------------------------------------------------
192
193 # Flags used for all C source files
194 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(JRLDEBUG) $(PADFLAGS)
195 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
196
197 # Flags used for kernel C source files
198 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
199
200 # Flags user for kernel assembly files
201 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
202
203 # Flags used for common library and libc source files
204 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
205         $(EXTRA_CC_USER_OPTS)
206
207 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
208 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
209
210 # ----------------------------------------------------------------------
211 # Rules -
212 #   Describes how to compile the source files.
213 # ----------------------------------------------------------------------
214
215 # Compilation of kernel C source files
216
217 geekos/%.o : geekos/%.c
218         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
219
220
221 # Compilation of kernel assembly source files
222 geekos/%.o : geekos/%.asm
223         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
224
225 # Compilation of test VM
226 geekos/%.o : geekos/%.s
227         $(AS) $< -o geekos/$*.o
228
229 geekos/%.o : geekos/%.S
230         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
231
232 # Compilation of common library C source files
233 common/%.o : common/%.c
234         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
235
236 # ----------------------------------------------------------------------
237 # Targets -
238 #   Specifies files to be built
239 # ----------------------------------------------------------------------
240
241 # Default target - see definition of ALL_TARGETS in Configuration section
242 all : $(ALL_TARGETS)
243
244
245 geekos/vmx_lowlevel.o: $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm
246         $(NASM) -O99 \
247         -f elf \
248                 -I$(PROJECT_ROOT)/src/geekos/ \
249                 $(PROJECT_ROOT)/src/geekos/vmx_lowlevel.asm \
250         -o $@
251
252
253 geekos/test: geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o 
254         $(CC) geekos/test.o geekos/vmcs.o geekos/vmx_lowlevel.o  -o geekos/test
255
256 # Standard floppy image - just boots the kernel
257 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin VM_linux_kernel
258         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > _temp
259         $(PAD) _temp 512
260         cat _temp VM_linux_kernel > $@
261
262 # make ready to boot over PXE
263 pxe:    fd.img
264         cp fd.img /tftpboot/vmm.img
265         $(PAD) /tftpboot/vmm.img 1474560
266
267
268 pxe-discovery-pdinda:   fd.img
269         cp fd.img geekos.img
270         $(PAD) geekos.img 1474560
271         /usr/local/vmm-util/pxe_cp geekos.img
272         /usr/local/vmm-util/tty_perm pdinda
273         echo "Copied file to PXE boot area and set serial permissions for pdinda"
274
275
276 pxe-discovery-bjp600:   fd.img
277         cp fd.img geekos.img
278         $(PAD) geekos.img 1474560
279         /usr/local/vmm-util/pxe_cp geekos.img
280         /usr/local/vmm-util/tty_perm bjp600
281         echo "Copied file to PXE boot area and set serial permissions for pdinda"
282
283
284 # Floppy boot sector (first stage boot loader).
285 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm VM_linux_kernel
286         $(NASM) -f bin \
287                 -I$(PROJECT_ROOT)/src/geekos/ \
288                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
289                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
290                 -DNUM_VM_KERNEL_SECTORS=`$(NUMSECS) VM_linux_kernel` \
291                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
292                 -o $@
293
294 # Setup program (second stage boot loader).
295 geekos/setup.bin : geekos/kernel.exe $(PROJECT_ROOT)/src/geekos/setup.asm
296         $(NASM) -f bin \
297                 -I$(PROJECT_ROOT)/src/geekos/ \
298                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
299                 -DVMM_FINAL_ADDR=$(KERNEL_BASE_ADDR) \
300                 -DVMM_SIZE=$(MAX_VMM) \
301                 $(PROJECT_ROOT)/src/geekos/setup.asm \
302                 -o $@
303         $(PAD) $@ 512
304
305 # Loadable (flat) kernel image.
306 geekos/kernel.bin : geekos/kernel.exe
307         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
308         $(PAD) $@ 512
309
310 # The kernel executable and symbol map.
311 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS)
312         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
313                 $(KERNEL_OBJS) $(COMMON_C_OBJS)
314         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
315
316
317 generate_sizes: force
318         echo "#ifndef __vmm_sizes" > $(VMM_SIZES)
319         echo "#define __vmm_sizes" >> $(VMM_SIZES)
320         echo "#define KERNEL_LOAD_ADDRESS " $(KERNEL_BASE_ADDR)  >> $(VMM_SIZES) 
321
322         echo "#define KERNEL_START (KERNEL_LOAD_ADDRESS)" >> $(VMM_SIZES)
323         echo "#define KERNEL_CORE_LENGTH (" `$(NUMSECS) geekos/kernel.bin` "*512)" >> $(VMM_SIZES) 
324         echo "#define KERNEL_END (KERNEL_LOAD_ADDRESS+KERNEL_CORE_LENGTH-1)" >> $(VMM_SIZES)
325
326         echo "#define VM_KERNEL_LENGTH (" `$(NUMSECS) VM_linux_kernel` "*512)" >> $(VMM_SIZES)
327         echo "#define VM_KERNEL_START (KERNEL_LOAD_ADDRESS + KERNEL_CORE_LENGTH)" >> $(VMM_SIZES)
328         echo "#define VM_BOOT_PACKAGE_START (VM_KERNEL_START) " >> $(VMM_SIZES)
329         echo "#define VM_BOOT_PACKAGE_END  (VM_KERNEL_START+VM_KERNEL_LENGTH-1) " >> $(VMM_SIZES)
330         echo "#endif" >> $(VMM_SIZES)
331
332 make_show_sizes: generate_sizes ../src/geekos/show_sizes.c
333         $(HOST_CC) -I../include/geekos ../src/geekos/show_sizes.c -o show_sizes
334
335 show_sizes: make_show_sizes
336         ./show_sizes
337
338
339 get_kernel_size: make_show_sizes
340         ./show_sizes | grep 
341
342 force:
343
344
345 VM_linux_kernel: force
346         $(PAD) VM_linux_kernel 512
347         @echo "VM kernel lives at 0x100000 and is" `$(NUMSECS) VM_linux_kernel` "sectors long"
348
349
350 # Clean build directories of generated files
351 clean :
352         for d in geekos common libc user tools; do \
353                 (cd $$d && rm -f *); \
354         done
355
356
357 # Build header file dependencies, so source files are recompiled when
358 # header files they depend on are modified.
359 depend : $(GENERATED_LIBC_SRCS)
360         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
361                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
362                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
363                 > depend.mak
364         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
365                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
366                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
367                 >> depend.mak
368
369 # By default, there are no header file dependencies.
370 depend.mak :
371         touch $@
372
373 include depend.mak