?? makefile
字號:
# Makefile for GeekOS kernel, userspace, and tools# Copyright (c) 2004,2005 David H. Hovemeyer <daveho@cs.umd.edu># $Revision: 1.45 $# This is free software. You are permitted to use,# redistribute, and modify it as specified in the file "COPYING".# Required software to build GeekOS:# - GNU Make (http://www.gnu.org/software/make)# - gcc 2.95.2 generating code for target (i386/ELF) and host platforms# - nasm (http://nasm.sourceforge.net)# - Perl5, AWK (any version), egrep## Cygwin (http://cygwin.com) may be used to build GeekOS.# Make sure that gcc, binutils, nasm, and perl are installed.# NOTES:# - This makefile has been written carefully to work correctly# with the -j (parallel make) option. I regularly use "make -j 2"# to speed the build process on 2 processor systems.PROJECT_ROOT := ..VPATH := $(PROJECT_ROOT)/src# Figure out if we're compiling with cygwin, http://cygwin.comSYSTEM_NAME := $(shell uname -s)ifeq ($(findstring CYGWIN,$(SYSTEM_NAME)),CYGWIN)SYM_PFX := _EXTRA_C_OPTS := -DNEED_UNDERSCORE -DGNU_WIN32EXTRA_NASM_OPTS := -DNEED_UNDERSCORENON_ELF_SYSTEM := yesEXTRA_CC_USER_OPTS := -Dmain=geekos_mainendif# ----------------------------------------------------------------------# Configuration -# Various options specifying how GeekOS should be built,# what source files to build, which user programs to build,# etc. This is generally the only section of the makefile# that will need to be modified.# ----------------------------------------------------------------------# List of targets to build by default.# These targets encompass everything needed to boot# and run GeekOS.ALL_TARGETS := fd.img diskc.img# Kernel source file containing implementation of user address space supportUSER_IMP_C := userseg.c# Kernel source filesKERNEL_C_SRCS := idt.c int.c trap.c irq.c io.c \ keyboard.c screen.c timer.c \ mem.c crc32.c \ gdt.c tss.c segment.c \ bget.c malloc.c \ synch.c kthread.c \ user.c $(USER_IMP_C) argblock.c syscall.c dma.c floppy.c \ elf.c blockdev.c ide.c \ vfs.c pfat.c bitset.c \ main.c# Kernel object files built from C source filesKERNEL_C_OBJS := $(KERNEL_C_SRCS:%.c=geekos/%.o)# Kernel assembly filesKERNEL_ASM_SRCS := lowlevel.asm# Kernel object files build from assembler source filesKERNEL_ASM_OBJS := \ $(KERNEL_ASM_SRCS:%.asm=geekos/%.o)# All kernel object filesKERNEL_OBJS := $(KERNEL_C_OBJS) \ $(KERNEL_ASM_OBJS)# Common library source files.# This library is linked into both the kernel and user programs.# It provides string functions and generic printf()-style# formatted output.COMMON_C_SRCS := fmtout.c string.c memmove.c# Common library object files.COMMON_C_OBJS := $(COMMON_C_SRCS:%.c=common/%.o)# User libc source files.LIBC_C_SRCS := \ sched.c sema.c \ compat.c process.c\ conio.c # User libc object files.LIBC_C_OBJS := $(LIBC_C_SRCS:%.c=libc/%.o)# Generated libc source filesGENERATED_LIBC_SRCS := libc/errno.c# User program source files.USER_C_SRCS := \ workload.c \ semtest1.c semtest2.c p1.c p2.c p3.c \ schedtest.c sched1.c sched2.c sched3.c \ ping.c pong.c long.c \ shell.c b.c c.c# User executablesUSER_PROGS := $(USER_C_SRCS:%.c=user/%.exe)# Base address of kernelKERNEL_BASE_ADDR := 0x00010000# Kernel entry point functionKERNEL_ENTRY = $(SYM_PFX)Main# Base address of user programsUSER_BASE_ADDR := 0x1000# User program (libc) entry point functionUSER_ENTRY = $(SYM_PFX)_Entry# ----------------------------------------------------------------------# Tools -# This section defines programs that are used to build GeekOS.# ----------------------------------------------------------------------# Uncomment if cross compiling#TARGET_CC_PREFIX := i386-elf-# Target C compiler. gcc 2.95.2 or later should work.TARGET_CC := $(TARGET_CC_PREFIX)gcc# Host C compiler. This is used to compile programs to execute on# the host platform, not the target (x86) platform. On x86/ELF# systems, such as Linux and FreeBSD, it can generally be the same# as the target C compiler.HOST_CC := gcc# Target linker. GNU ld is probably to only one that will work.TARGET_LD := $(TARGET_CC_PREFIX)ld# Target archiverTARGET_AR := $(TARGET_CC_PREFIX)ar# Target ranlibTARGET_RANLIB := $(TARGET_CC_PREFIX)ranlib# Target nmTARGET_NM := $(TARGET_CC_PREFIX)nm# Target objcopyTARGET_OBJCOPY := $(TARGET_CC_PREFIX)objcopy# Nasm (http://nasm.sourceforge.net)NASM := nasm# Tool to build PFAT filesystem images.BUILDFAT := tools/builtFat.exe# Perl5 or laterPERL := perl# Pad a file so its size is a multiple of some unit (i.e., sector size)PAD := $(PERL) $(PROJECT_ROOT)/scripts/pad# Create a file filled with zeroes.ZEROFILE := $(PERL) $(PROJECT_ROOT)/scripts/zerofile# Calculate size of file in sectorsNUMSECS := $(PERL) $(PROJECT_ROOT)/scripts/numsecs# Generate C file containing table of error strings from <geekos/errno.h>GENERRS := $(PERL) $(PROJECT_ROOT)/scripts/generrs# ----------------------------------------------------------------------# Definitions -# Options passed to the tools.# ----------------------------------------------------------------------# Flags used for all C source filesGENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS)CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror # Flags used for kernel C source filesCC_KERNEL_OPTS := -g -DGEEKOS -I$(PROJECT_ROOT)/include# Flags user for kernel assembly filesNASM_KERNEL_OPTS := -I$(PROJECT_ROOT)/src/geekos/ -f elf $(EXTRA_NASM_OPTS)# Flags used for common library and libc source filesCC_USER_OPTS := -I$(PROJECT_ROOT)/include -I$(PROJECT_ROOT)/include/libc \ $(EXTRA_CC_USER_OPTS)# Flags passed to objcopy program (strip unnecessary sections from kernel.exe)OBJCOPY_FLAGS := -R .dynamic -R .note -R .comment# ----------------------------------------------------------------------# Rules -# Describes how to compile the source files.# ----------------------------------------------------------------------# Compilation of kernel C source filesgeekos/%.o : geekos/%.c $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o# Compilation of kernel assembly source filesgeekos/%.o : geekos/%.asm $(NASM) $(NASM_KERNEL_OPTS) $< -o geekos/$*.ogeekos/%.o : geekos/%.S $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) $< -o geekos/$*.o# Compilation of common library C source filescommon/%.o : common/%.c $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o common/$*.o# Compilation of libc source fileslibc/%.o : libc/%.c $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o libc/$*.o# Compilation of user programsuser/%.exe : user/%.c libc/libc.a libc/entry.o $(TARGET_CC) -c $(CC_GENERAL_OPTS) $(CC_USER_OPTS) $< -o user/$*.o $(TARGET_LD) -o $@ -Ttext $(USER_BASE_ADDR) -e $(USER_ENTRY) \ libc/entry.o user/$*.o libc/libc.aifeq ($(NON_ELF_SYSTEM),yes) $(TARGET_OBJCOPY) -O elf32-i386 $@ $@endif# ----------------------------------------------------------------------# Targets -# Specifies files to be built# ----------------------------------------------------------------------# Default target - see definition of ALL_TARGETS in Configuration sectionall : $(ALL_TARGETS)# Standard floppy image - just boots the kernelfd.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > $@# Augmented floppy image - contains kernel and user executables on PFAT filesystemfd_aug.img : geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin $(USER_PROGS) $(BUILDFAT) $(ZEROFILE) $@ 2880 $(BUILDFAT) -b geekos/fd_boot.bin $@ geekos/setup.bin geekos/kernel.bin $(USER_PROGS) $(BUILDFAT)# First hard drive image (10 MB).# This contains a PFAT filesystem with the user programs on it.diskc.img : $(USER_PROGS) $(BUILDFAT) $(ZEROFILE) $@ 20480 $(BUILDFAT) $@ $(USER_PROGS)# Tool to build PFAT filesystem images$(BUILDFAT) : $(PROJECT_ROOT)/src/tools/buildFat.c $(PROJECT_ROOT)/include/geekos/pfat.h $(HOST_CC) $(CC_GENERAL_OPTS) -I$(PROJECT_ROOT)/include $(PROJECT_ROOT)/src/tools/buildFat.c -o $@# Floppy boot sector (first stage boot loader).geekos/fd_boot.bin : geekos/setup.bin geekos/kernel.bin $(PROJECT_ROOT)/src/geekos/fd_boot.asm $(NASM) -f bin \ -I$(PROJECT_ROOT)/src/geekos/ \ -DNUM_SETUP_SECTORS=`$(NUMSECS) geekos/setup.bin` \ -DNUM_KERN_SECTORS=`$(NUMSECS) geekos/kernel.bin` \ $(PROJECT_ROOT)/src/geekos/fd_boot.asm \ -o $@# Setup program (second stage boot loader).geekos/setup.bin : geekos/kernel.exe $(PROJECT_ROOT)/src/geekos/setup.asm $(NASM) -f bin \ -I$(PROJECT_ROOT)/src/geekos/ \ -DENTRY_POINT=0x`egrep 'Main$$' geekos/kernel.syms |awk '{print $$1}'` \ $(PROJECT_ROOT)/src/geekos/setup.asm \ -o $@ $(PAD) $@ 512# Loadable (flat) kernel image.geekos/kernel.bin : geekos/kernel.exe $(TARGET_OBJCOPY) $(OBJCOPY_FLAGS) -S -O binary geekos/kernel.exe geekos/kernel.bin $(PAD) $@ 512# The kernel executable and symbol map.geekos/kernel.exe : $(KERNEL_OBJS) $(COMMON_C_OBJS) $(TARGET_LD) -o geekos/kernel.exe -Ttext $(KERNEL_BASE_ADDR) -e $(KERNEL_ENTRY) \ $(KERNEL_OBJS) $(COMMON_C_OBJS) $(TARGET_NM) geekos/kernel.exe > geekos/kernel.syms# C library for user mode programslibc/libc.a : $(LIBC_C_OBJS) libc/errno.o $(COMMON_C_OBJS) $(TARGET_AR) ruv $@ $(LIBC_C_OBJS) libc/errno.o $(COMMON_C_OBJS) $(TARGET_RANLIB) $@# Source file containing the table of error strings for each error code.# This is derived automatically from the comments in <geekos/errno.h>.libc/errno.c : $(PROJECT_ROOT)/include/geekos/errno.h $(PROJECT_ROOT)/scripts/generrs $(GENERRS) $(PROJECT_ROOT)/include/geekos/errno.h > $@# Clean build directories of generated filesclean : for d in geekos common libc user tools; do \ (cd $$d && rm -f *); \ done# Build header file dependencies, so source files are recompiled when# header files they depend on are modified.depend : $(GENERATED_LIBC_SRCS) $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_KERNEL_OPTS) \ $(KERNEL_C_SRCS:%.c=$(PROJECT_ROOT)/src/geekos/%.c) \ | $(PERL) -n -e 's,^(\S),geekos/$$1,;print' \ > depend.mak $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \ $(LIBC_C_SRCS:%.c=$(PROJECT_ROOT)/src/libc/%.c) libc/errno.c \ | $(PERL) -n -e 's,^(\S),libc/$$1,;print' \ >> depend.mak $(TARGET_CC) -M $(CC_GENERAL_OPTS) $(CC_USER_OPTS) \ $(COMMON_C_SRCS:%.c=$(PROJECT_ROOT)/src/common/%.c) \ | $(PERL) -n -e 's,^(\S),common/$$1,;print' \ >> depend.mak# By default, there are no header file dependencies.depend.mak : touch $@include depend.mak
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -