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.


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