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.


one of these days I'll commit without breaking the build...
[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.2 $
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 := 0x100000
33
34 # Kernel entry point function
35 KERNEL_ENTRY = $(SYM_PFX)Main
36
37
38 PROJECT_ROOT := ..
39 VPATH := $(PROJECT_ROOT)/src
40
41 #when -DNDEBUG is set the kassert functions are disabled
42 #JRLDEBUG=-DNDEBUG
43 JRLDEBUG= -DSERIAL_PRINT_DEBUG=1 -DSERIAL_PRINT_DEBUG_LEVEL=1000 -DSERIAL_PRINT=1
44
45 #
46 #
47 #Peter's compile flags
48 PAD= 
49
50 # Figure out if we're compiling with cygwin, http://cygwin.com
51 SYSTEM_NAME := $(shell uname -s)
52 ifeq ($(findstring CYGWIN,$(SYSTEM_NAME)),CYGWIN)
53 SYM_PFX            := _
54 EXTRA_C_OPTS       := -DNEED_UNDERSCORE -DGNU_WIN32
55 EXTRA_NASM_OPTS    := -DNEED_UNDERSCORE
56 NON_ELF_SYSTEM     := yes
57 EXTRA_CC_USER_OPTS := -Dmain=geekos_main
58 endif
59
60
61
62 # ----------------------------------------------------------------------
63 # Configuration -
64 #   Various options specifying how GeekOS should be built,
65 #   what source files to build, which user programs to build,
66 #   etc.  This is generally the only section of the makefile
67 #   that will need to be modified.
68 # ----------------------------------------------------------------------
69
70 # List of targets to build by default.
71 # These targets encompass everything needed to boot
72 # and run GeekOS.
73 ALL_TARGETS := geekos/kernel.bin fd.img
74
75
76 # Kernel source files
77 KERNEL_C_SRCS := idt.c int.c trap.c irq.c io.c \
78         blockdev.c ide.c \
79         keyboard.c screen.c timer.c \
80         mem.c crc32.c \
81         gdt.c tss.c segment.c \
82         bget.c malloc.c \
83         synch.c kthread.c \
84         serial.c  reboot.c \
85         paging.c \
86         main.c
87
88 # Kernel object files built from C source files
89 KERNEL_C_OBJS := $(KERNEL_C_SRCS:%.c=geekos/%.o)
90
91 # Kernel assembly files
92 KERNEL_ASM_SRCS := lowlevel.asm
93
94 KERNEL_GAS_SRCS :=
95
96 # Kernel object files build from assembler source files
97 KERNEL_ASM_OBJS := $(KERNEL_ASM_SRCS:%.asm=geekos/%.o) 
98
99 KERNEL_GAS_OBJS := $(KERNEL_GAS_SRCS:%.s=geekos/%.o)
100
101
102 # All kernel object files
103 KERNEL_OBJS := $(KERNEL_C_OBJS) \
104   $(KERNEL_ASM_OBJS) $(KERNEL_GAS_OBJS)
105
106 # Common library source files.
107 # This library is linked into both the kernel and user programs.
108 # It provides string functions and generic printf()-style
109 # formatted output.
110 COMMON_C_SRCS := fmtout.c string.c memmove.c
111
112 # Common library object files.
113 COMMON_C_OBJS := $(COMMON_C_SRCS:%.c=common/%.o)
114
115
116
117
118 # ----------------------------------------------------------------------
119 # Tools -
120 #   This section defines programs that are used to build GeekOS.
121 # ----------------------------------------------------------------------
122
123 # Uncomment if cross compiling
124 #TARGET_CC_PREFIX := i386-elf-
125 TARGET_CC_PREFIX :=  $(PROJECT_ROOT)/../../devtools/i386/bin/i386-elf-
126
127 # Target C compiler.  gcc 2.95.2 or later should work.
128 TARGET_CC := $(TARGET_CC_PREFIX)gcc
129
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 guest_img: fd.img
245         cp fd.img guest.img
246         $(PAD) guest.img 1474560
247
248 geekos/test: geekos/test.o
249         $(CC) geekos/test.o -o geekos/test
250
251
252
253 # Floppy boot sector (first stage boot loader).
254 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm
255         $(NASM) -f bin \
256                 -I$(PROJECT_ROOT)/src/geekos/ \
257                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
258                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
259                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
260                 -o $@
261
262 # Setup program (second stage boot loader).
263 geekos/setup.bin : geekos/kernel.exe $(PROJECT_ROOT)/src/geekos/setup.asm
264         $(NASM) -f bin \
265                 -I$(PROJECT_ROOT)/src/geekos/ \
266                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
267                 $(PROJECT_ROOT)/src/geekos/setup.asm \
268                 -o $@
269         $(PAD) $@ 512
270
271
272 # Loadable (flat) kernel image.
273 geekos/kernel.bin : geekos/kernel.exe
274         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
275         $(PAD) $@ 512
276
277 # The kernel executable and symbol map.
278 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS)
279         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
280                 $(KERNEL_OBJS) $(COMMON_C_OBJS)
281         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
282
283
284
285
286
287 force:
288
289 # Clean build directories of generated files
290 clean :
291         for d in geekos common libc user tools; do \
292                 (cd $$d && rm -f *); \
293         done
294
295
296 # Build header file dependencies, so source files are recompiled when
297 # header files they depend on are modified.
298 depend : $(GENERATED_LIBC_SRCS)
299         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
300                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
301                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
302                 > depend.mak
303         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
304                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
305                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
306                 >> depend.mak
307
308 # By default, there are no header file dependencies.
309 depend.mak :
310         touch $@
311
312 include depend.mak