📄 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# 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 \ 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)# Base address of kernelKERNEL_BASE_ADDR := 0x00010000# Kernel entry point functionKERNEL_ENTRY = $(SYM_PFX)Main# ----------------------------------------------------------------------# 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# ----------------------------------------------------------------------# 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# ----------------------------------------------------------------------# 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 > $@# 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# 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) \ $(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 + -