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.


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