You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			147 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Makefile
		
	
			
		
		
	
	
			147 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Makefile
		
	
| # Build the kernel
 | |
| 
 | |
| # Top Level Folder all generated files will be placed in.
 | |
| ROOTBUILDDIR =  build
 | |
| # Folder the generated files will be placed in.
 | |
| BUILDDIR ?= $(ROOTBUILDDIR)
 | |
| # Build folder suffixes
 | |
| OPTTAG = opt
 | |
| NOOPTTAG = noopt
 | |
| DBGTAG = dbg
 | |
| VERBOSETAG = verbose
 | |
| 
 | |
| # C++
 | |
| CXX ?= $(PREFIX)clang++
 | |
| # on macos the default compiler is called c++, switch to clang++
 | |
| ifeq ($(shell uname),Darwin)
 | |
| 	ifeq ($(CXX),c++)
 | |
| 		CXX := clang++
 | |
| 	endif
 | |
| endif
 | |
| 
 | |
| CXXFLAGS_ARCH = -m64
 | |
| CXXFLAGS_DEFAULT = -std=c++23 -ffreestanding -fno-pic -nodefaultlibs -nostdlib -nostdinc -I. -fno-rtti -fno-exceptions -Wno-write-strings -fno-stack-protector -mno-red-zone -g -gdwarf-2 -fno-use-cxa-atexit -no-pie -nostartfiles
 | |
| # Enable 16-byte compare-and-exchange instruction for debugging purposes (stack alignment)
 | |
| CXXFLAGS_DEFAULT += -mcx16
 | |
| CXXFLAGS_OPT = -O3 -fomit-frame-pointer
 | |
| CXXFLAGS_WARNING = -Wall -Wextra -Werror -Wno-error=unused-parameter -Wno-error=unused-variable -Wno-non-virtual-dtor
 | |
| CXXFLAGS_CLANG = -Wno-error=unused-private-field -Wno-implicit-exception-spec-mismatch -Wno-error=unused-const-variable -Wno-unused-command-line-argument -Wno-unused-const-variable -fno-strict-aliasing
 | |
| ifeq ($(shell uname),Darwin)
 | |
| 	CXXFLAGS_CLANG += -target x86_64-pc-linux-gnu -fuse-ld=lld
 | |
| endif
 | |
| CXXFLAGS_GCC = -fno-tree-loop-distribute-patterns -Wstack-usage=4096 -Wno-error=stack-usage=
 | |
| CXXFLAGS_NOFPU = -mno-mmx -mno-sse -mgeneral-regs-only
 | |
| CXXFLAGS = $(CXXFLAGS_ARCH) $(CXXFLAGS_DEFAULT) $(CXXFLAGS_OPT) $(CXXFLAGS_NOFPU) $(CXXFLAGS_WARNING)
 | |
| # Compiler specific flags
 | |
| ifneq (,$(findstring clang,$(CXX)))
 | |
| 	COMPILER := CLANG
 | |
| 	CXXFLAGS += $(CXXFLAGS_CLANG)
 | |
| else ifneq (,$(findstring g++,$(CXX)))
 | |
| 	COMPILER := GCC
 | |
| 	# g++ 6 does not support general-regs-only flag
 | |
| 	ifeq "$(shell expr `$(CXX) -dumpversion | cut -f1 -d.` \<= 6)" "1"
 | |
| 		CXXFLAGS := $(filter-out -mgeneral-regs-only,$(CXXFLAGS))
 | |
| 	endif
 | |
| 	# Configures -Warray-bounds warning to allow accessing in the NULL page
 | |
| 	# Necessary to read the Extended BIOS Data Area at 0x40e
 | |
| 	ifeq "$(shell expr `$(CXX) -dumpversion | cut -f1 -d.` \>= 12)" "1"
 | |
| 		CXXFLAGS += --param=min-pagesize=0x40e
 | |
| 	endif
 | |
| 	CXXFLAGS += $(CXXFLAGS_GCC)
 | |
| else
 | |
| 	COMPILER :=
 | |
| endif
 | |
| 
 | |
| # Assembly
 | |
| ASM = nasm
 | |
| ASMFLAGS = -f elf64
 | |
| 
 | |
| # Additional build utilities
 | |
| # If llvm tools are available, use them
 | |
| ifneq (,$(shell which llvm-objcopy 2>/dev/null))
 | |
| 	PREFIX = llvm-
 | |
| endif
 | |
| OBJCOPY = $(PREFIX)objcopy
 | |
| STRIP = $(PREFIX)strip
 | |
| AR = $(PREFIX)ar
 | |
| 
 | |
| # Subdirectories with sources
 | |
| VPATH = $(sort $(dir $(CC_SOURCES) $(ASM_SOURCES)))
 | |
| 
 | |
| # Lists of object files that are generated by compilation:
 | |
| # Note that the variables containing the input files are to be defined by
 | |
| # the Makefiles prior to including this common.mk.
 | |
| CC_OBJECTS = $(addprefix $(BUILDDIR)/,$(CC_SOURCES:.cc=.o))
 | |
| DEP_FILES = $(addprefix $(BUILDDIR)/,$(CC_SOURCES:.cc=.d) $(addsuffix .d,$(ASM_SOURCES)))
 | |
| ASM_OBJECTS = $(addprefix $(BUILDDIR)/,$(addsuffix .o,$(ASM_SOURCES)))
 | |
| 
 | |
| # Dependency files
 | |
| $(BUILDDIR)/%.d : %.cc $(MAKEFILE_LIST)
 | |
| 	@echo "DEP		$<"
 | |
| 	@mkdir -p $(@D)
 | |
| 	$(VERBOSE) $(CXX) $(CXXFLAGS) -MM -MT $(BUILDDIR)/$*.o -MF $@ $<
 | |
| 
 | |
| $(BUILDDIR)/%.asm.d : %.asm $(MAKEFILE_LIST)
 | |
| 	@echo "DEP		$<"
 | |
| 	@mkdir -p $(@D)
 | |
| 	$(VERBOSE) $(ASM) $(ASMFLAGS) -M -MT $(BUILDDIR)/$*.asm.o -MF $@ $<
 | |
| 
 | |
| # Object files
 | |
| $(BUILDDIR)/%.o : %.cc $(MAKEFILE_LIST)
 | |
| 	@echo "CXX		$<"
 | |
| 	@mkdir -p $(@D)
 | |
| 	$(VERBOSE) $(CXX) -c $(CXXFLAGS) -o $@ $<
 | |
| 
 | |
| $(BUILDDIR)/%.asm.o : %.asm $(MAKEFILE_LIST)
 | |
| 	@echo "ASM		$<"
 | |
| 	@mkdir -p $(@D)
 | |
| 	$(VERBOSE) $(ASM) $(ASMFLAGS) -o $@ $<
 | |
| 
 | |
| # The standard target 'clean' removes the whole generated system, the object files, and the dependency files.
 | |
| clean::
 | |
| 	rm -rf "$(BUILDDIR)"
 | |
| 
 | |
| # Target issuing a nested call to make generating a fully optimized systems without assertions.
 | |
| %-$(OPTTAG):
 | |
| 	$(VERBOSE) $(MAKE) BUILDDIR="$(BUILDDIR)/$(OPTTAG)" ISODIR="$(ISODIR)/$(OPTTAG)" CXXFLAGS_OPT="-Ofast -fomit-frame-pointer -flto -march=westmere -DNDEBUG" $*
 | |
| 
 | |
| # Target issuing a nested call to make generating a non-optimized system.
 | |
| %-$(NOOPTTAG):
 | |
| 	$(VERBOSE) $(MAKE) BUILDDIR="$(BUILDDIR)/$(NOOPTTAG)" ISODIR="$(ISODIR)/$(NOOPTTAG)" CXXFLAGS_OPT="-O0" $*
 | |
| 
 | |
| # Target issuing a nested call to make generating a system optimized for debugging.
 | |
| %-$(DBGTAG):
 | |
| 	$(VERBOSE) $(MAKE) BUILDDIR="$(BUILDDIR)/$(DBGTAG)" ISODIR="$(ISODIR)/$(DBGTAG)" CXXFLAGS_OPT="-Og -fno-omit-frame-pointer" $*
 | |
| 
 | |
| # Target issuing a nested call to make generating a system with verbose output.
 | |
| %-$(VERBOSETAG):
 | |
| 	$(VERBOSE) $(MAKE) BUILDDIR="$(BUILDDIR)/$(VERBOSETAG)" ISODIR="$(ISODIR)/$(VERBOSETAG)" CXXFLAGS_OPT="-DVERBOSE" $*
 | |
| 
 | |
| # Documentation
 | |
| help::
 | |
| 	@$(echo) "" \
 | |
| 		"All targets exist in different flavours in addition to \e[2;3m<name>\e[0m:\n" \
 | |
| 		"\e[2;3m<name>\e[0;3m-noopt\e[0m, \e[2;3m<name>\e[0;3m-opt\e[0m, \e[2;3m<name>\e[0;3m-dbg\e[0m, and \e[2;3m<name>\e[0;3m-verbose\e[0m.\n" \
 | |
| 		"Targets suffixed with \e[3m-noopt\e[0m are compiled without optimizations,\n" \
 | |
| 		"\e[3m-opt\e[0m targets produce a highly optimized binary, while\n" \
 | |
| 		"\e[3m-dbg\e[0m targets only use optimizations not hindering debugging.\n" \
 | |
| 		"Targets suffixed with \e[3m-verbose\e[0m generate binaries including\n" \
 | |
| 		"verbose output (via \e[3mDBG_VERBOSE\e[0m), making such targets useful for debugging.\n" \
 | |
| 		"To get a verbose make output, clear VERBOSE, e.g. \e[3mmake VERBOSE=\e[0m.\n" \
 | |
| 		"The following targets are available (each target can be suffixed by \e[3m-noopt\e[0m\n" \
 | |
| 		"and \e[3m-verbose\e[0m):\n\n" \
 | |
| 		"	\e[3mall\e[0m      Builds $(PROJECT), generating an ELF binary\n\n"
 | |
| 
 | |
| # Print warnings, if appropriate
 | |
| ifeq (,$(COMPILER))
 | |
| $(warning Unknown (and potentially unsupported) compiler "$(CXX)"!)
 | |
| endif
 | |
| 
 | |
| # Include dependency files (generated via gcc flag -MM)
 | |
| ifneq ($(MAKECMDGOALS),clean)
 | |
| -include $(DEP_FILES)
 | |
| endif
 | |
| 
 | |
| # Phony targets
 | |
| .PHONY: clean help
 |