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.


Merge branch 'devel' into ide
[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
42
43 ifeq ($(SERIAL_DEBUG), 1)
44 JRLDEBUG= -DDEBUG_SERIAL
45 else 
46 JRLDEBUG= 
47 endif
48
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         vm_cons.c debug.c \
85         pci.c \
86         serial.c  reboot.c \
87         paging.c \
88         main.c
89
90 # Kernel object files built from C source files
91 KERNEL_C_OBJS := $(KERNEL_C_SRCS:%.c=geekos/%.o)
92
93 # Kernel assembly files
94 KERNEL_ASM_SRCS := lowlevel.asm
95
96 KERNEL_GAS_SRCS :=
97
98 # Kernel object files build from assembler source files
99 KERNEL_ASM_OBJS := $(KERNEL_ASM_SRCS:%.asm=geekos/%.o) 
100
101 KERNEL_GAS_OBJS := $(KERNEL_GAS_SRCS:%.s=geekos/%.o)
102
103
104 # All kernel object files
105 KERNEL_OBJS := $(KERNEL_C_OBJS) \
106   $(KERNEL_ASM_OBJS) $(KERNEL_GAS_OBJS)
107
108 # Common library source files.
109 # This library is linked into both the kernel and user programs.
110 # It provides string functions and generic printf()-style
111 # formatted output.
112 COMMON_C_SRCS := fmtout.c string.c memmove.c
113
114 # Common library object files.
115 COMMON_C_OBJS := $(COMMON_C_SRCS:%.c=common/%.o)
116
117
118
119
120 # ----------------------------------------------------------------------
121 # Tools -
122 #   This section defines programs that are used to build GeekOS.
123 # ----------------------------------------------------------------------
124
125 # Uncomment if cross compiling
126 #TARGET_CC_PREFIX := i386-elf-
127 TARGET_CC_PREFIX :=  $(PROJECT_ROOT)/../../devtools/i386/bin/i386-elf-
128
129 # Target C compiler.  gcc 2.95.2 or later should work.
130 TARGET_CC := $(TARGET_CC_PREFIX)gcc
131
132
133 # Host C compiler.  This is used to compile programs to execute on
134 # the host platform, not the target (x86) platform.  On x86/ELF
135 # systems, such as Linux and FreeBSD, it can generally be the same
136 # as the target C compiler.
137 HOST_CC := gcc
138
139 # Target linker.  GNU ld is probably to only one that will work.
140 TARGET_LD := $(TARGET_CC_PREFIX)ld -melf_i386
141
142 # Target archiver
143 TARGET_AR := $(TARGET_CC_PREFIX)ar
144
145 # Target ranlib
146 TARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib
147
148 # Target nm
149 TARGET_NM := $(TARGET_CC_PREFIX)nm
150
151 # Target objcopy
152 TARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy
153
154 # Nasm (http://nasm.sourceforge.net)
155 NASM := $(PROJECT_ROOT)/../../devtools/bin/nasm
156 #NASM := /opt/vmm-tools/bin/nasm
157
158 AS = as --32
159
160 # Tool to build PFAT filesystem images.
161 BUILDFAT := tools/builtFat.exe
162
163 # Perl5 or later
164 PERL := perl
165
166 # Pad a file so its size is a multiple of some unit (i.e., sector size)
167 PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad
168
169 # Create a file filled with zeroes.
170 ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile
171
172 # Calculate size of file in sectors
173 NUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs
174
175
176 # ----------------------------------------------------------------------
177 # Definitions -
178 #   Options passed to the tools.
179 # ----------------------------------------------------------------------
180
181 # Flags used for all C source files
182
183 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) $(JRLDEBUG)
184 CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror 
185
186 # Flags used for kernel C source files
187 CC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include
188
189 # Flags user for kernel assembly files
190 NASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)
191
192 # Flags used for common library and libc source files
193 CC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \
194         $(EXTRA_CC_USER_OPTS)
195
196 # Flags passed to objcopy program (strip unnecessary sections from kernel.exe)
197 OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment
198
199 # ----------------------------------------------------------------------
200 # Rules -
201 #   Describes how to compile the source files.
202 # ----------------------------------------------------------------------
203
204 # Compilation of kernel C source files
205
206 geekos/%.o : geekos/%.c
207         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
208
209
210 # Compilation of kernel assembly source files
211 geekos/%.o : geekos/%.asm
212         $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.o
213
214 # Compilation of test VM
215 geekos/%.o : geekos/%.s
216         $(AS) $< -o geekos/$*.o
217
218 geekos/%.o : geekos/%.S
219         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o
220
221 # Compilation of common library C source files
222 common/%.o : common/%.c
223         $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o
224
225 # ----------------------------------------------------------------------
226 # Targets -
227 #   Specifies files to be built
228 # ----------------------------------------------------------------------
229
230 # Default target - see definition of ALL_TARGETS in Configuration section
231 all : $(ALL_TARGETS)
232
233 # Standard floppy image - just boots the kernel
234 fd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin
235         cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > $@
236
237
238
239 guest-img: fd.img
240         cp fd.img guest.img
241         $(PAD) guest.img 1474560
242
243 guest-iso: guest-img
244         mkisofs -pad -b guest.img -R -o guest.iso guest.img
245
246
247
248 # Floppy boot sector (first stage boot loader).
249 geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm
250         $(NASM) -f bin \
251                 -I$(PROJECT_ROOT)/src/geekos/ \
252                 -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \
253                 -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \
254                 $(PROJECT_ROOT)/src/geekos/fd_boot.asm \
255                 -o $@
256
257 # Setup program (second stage boot loader).
258 geekos/setup.bin : geekos/kernel.exe $(PROJECT_ROOT)/src/geekos/setup.asm
259         $(NASM) -f bin \
260                 -I$(PROJECT_ROOT)/src/geekos/ \
261                 -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \
262                 $(PROJECT_ROOT)/src/geekos/setup.asm \
263                 -o $@
264         $(PAD) $@ 512
265
266
267 # Loadable (flat) kernel image.
268 geekos/kernel.bin : geekos/kernel.exe
269         $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin
270         $(PAD) $@ 512
271
272 # The kernel executable and symbol map.
273 geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS)
274         $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \
275                 $(KERNEL_OBJS) $(COMMON_C_OBJS)
276         $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms
277
278
279
280
281
282 force:
283
284 # Clean build directories of generated files
285 clean :
286         for d in geekos common libc user tools; do \
287                 (cd $$d && rm -f *); \
288         done
289
290
291 # Build header file dependencies, so source files are recompiled when
292 # header files they depend on are modified.
293 depend : $(GENERATED_LIBC_SRCS)
294         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \
295                 $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \
296                 | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \
297                 > depend.mak
298         $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \
299                 $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \
300                 | $(PERL) -n -e 's,^(\S),common/$$1,;print' \
301                 >> depend.mak
302
303 # By default, there are no header file dependencies.
304 depend.mak :
305         touch $@
306
307 include depend.mak