Serenity Operating System
at hosted 179 lines 5.4 kB view raw
1MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) 2SERENITY_BASE_DIR := $(patsubst %/,%,$(dir $(MAKEFILE_PATH))) 3 4CXX_STANDARD_FLAGS = -std=c++2a 5CXX_WARNING_FLAGS = -Werror -Wextra -Wall -Wno-nonnull-compare -Wno-deprecated-copy -Wno-address-of-packed-member -Wundef -Wcast-qual -Wwrite-strings -Wimplicit-fallthrough -Wno-expansion-to-defined 6CXX_FLAVOR_FLAGS = -fno-exceptions -fno-rtti -fstack-protector 7#CXX_SUGGEST_FLAGS = -Wsuggest-final-types -Wsuggest-final-methods -Wsuggest-override #-Wsuggest-attribute=noreturn 8 9C_STANDARD_FLAGS = 10C_WARNING_FLAGS = -Werror -Wextra -Wall -Wno-nonnull-compare -Wno-address-of-packed-member -Wundef -Wcast-qual -Wwrite-strings -Wimplicit-fallthrough -Wno-expansion-to-defined 11C_FLAVOR_FLAGS = -fstack-protector 12 13ARCH_FLAGS = 14OPTIMIZATION_FLAGS = -Os 15 16INCLUDE_FLAGS += \ 17 -I. \ 18 -I$(SERENITY_BASE_DIR)/DevTools \ 19 -I$(SERENITY_BASE_DIR) \ 20 -I$(SERENITY_BASE_DIR)/Libraries \ 21 -I$(SERENITY_BASE_DIR)/Servers 22 23VERBOSE = 0 24 25ifeq ($(HOSTED),1) 26 USE_HOST_CXX= 27endif 28 29ifneq ($(USE_HOST_CXX),) 30 UNAME_S := $(shell uname -s) 31 ifeq ($(UNAME_S),OpenBSD) 32 HOST_CXX ?= clang++ 33 endif 34 35 ifeq '' '$(findstring clang++,$(CXX))' 36 C_WARNING_FLAGS += -Wno-unknown-warning-option 37 CXX_WARNING_FLAGS += -Wno-unknown-warning-option 38 endif 39 ifeq ($(HOST_CXX),) 40 CXX = $(PRE_CXX) g++ 41 else 42 CXX = $(HOST_CXX) 43 endif 44 AS = as 45 LINK = ld 46 OBJ_SUFFIX ?= .host 47 ARCH = $(shell arch -s) 48else 49 ifeq ($(HOSTED),1) 50 CXX = c++ 51 CC = cc 52 AS = gas 53 LINK = ld 54 RANLIB = ranlib 55 AR = ar 56 ARCH = $(shell arch -s) 57 58 # XXX: needed for clang 59 C_WARNING_FLAGS += -Wno-unknown-warning-option -Wno-unused-private-field 60 CXX_WARNING_FLAGS += -Wno-unknown-warning-option -Wno-unused-private-field 61 62 INCLUDE_FLAGS += \ 63 -I$(SERENITY_BASE_DIR)/Libraries/LibSerenity 64 else 65 TOOLCHAIN_PATH = $(SERENITY_BASE_DIR)/Toolchain/Local/bin 66 CXX = $(PRE_CXX) $(TOOLCHAIN_PATH)/i686-pc-serenity-g++ 67 CC = $(PRE_CC) $(TOOLCHAIN_PATH)/i686-pc-serenity-gcc 68 AS = $(TOOLCHAIN_PATH)/i686-pc-serenity-as 69 LINK = $(TOOLCHAIN_PATH)/i686-pc-serenity-ld 70 RANLIB = $(TOOLCHAIN_PATH)/i686-pc-serenity-ranlib 71 AR = $(TOOLCHAIN_PATH)/i686-pc-serenity-ar 72 ARCH = i386 73 74 INCLUDE_FLAGS += \ 75 -I$(SERENITY_BASE_DIR)/Libraries/LibC \ 76 -I$(SERENITY_BASE_DIR)/Libraries/LibM \ 77 -I$(SERENITY_BASE_DIR)/Libraries/LibPthread 78 endif 79 80 DEFINES += -DDEBUG 81 82 ifdef KERNEL 83 DEFINES += -DKERNEL 84 else ifdef BOOTSTRAPPER 85 DEFINES += -DBOOTSTRAPPER 86 else 87 # everything else gets -lc -lm 88 LIB_DEPS := C M $(LIB_DEPS) 89 endif 90 91 ifeq ($(HOSTED),1) 92 # use the host's libc, libm, and pthread, and include LibSerenity 93 LIB_DEPS := $(filter-out C M Pthread,$(LIB_DEPS)) Serenity 94 LDFLAGS += -lc -lm -pthread 95 ARCH_FLAGS += -g 96 endif 97 98 # turn "LIB_DEPS=C Core Thread" into "-lc -lcore -lthread -L.../LibC ..." 99 LDFLAGS += $(foreach lib,$(LIB_DEPS),\ 100 -l$(shell echo $(lib) | tr A-Z a-z)) 101 LDFLAGS += $(foreach lib,$(LIB_DEPS),\ 102 -L$(SERENITY_BASE_DIR)/Libraries/Lib$(lib)) 103 104 STATIC_LIB_DEPS = $(foreach lib,$(LIB_DEPS),\ 105 $(SERENITY_BASE_DIR)/Libraries/Lib$(lib)/lib$(shell echo $(lib) | tr A-Z a-z).a) 106 107 OBJ_SUFFIX ?= 108endif 109 110#CXX = clang $(CLANG_FLAGS) 111#CLANG_FLAGS = -Wconsumed -m32 -ffreestanding -march=i686 112 113CXXFLAGS = -MMD -MP $(CXX_WARNING_FLAGS) $(OPTIMIZATION_FLAGS) $(CXX_FLAVOR_FLAGS) $(ARCH_FLAGS) $(CXX_STANDARD_FLAGS) $(CXX_SUGGEST_FLAGS) $(INCLUDE_FLAGS) $(DEFINES) $(SUBPROJECT_CXXFLAGS) 114CFLAGS = -MMD -MP $(C_FLAVOR_FLAGS) $(ARCH_FLAGS) $(C_STANDARD_FLAGS) $(C_SUGGEST_FLAGS) $(INCLUDE_FLAGS) $(DEFINES) $(SUBPROJECT_CXXFLAGS) 115 116DEFINES += -DSANITIZE_PTRS 117 118SUFFIXED_OBJS = $(patsubst %.o,%$(OBJ_SUFFIX).o,$(OBJS)) 119 120ifeq ($(VERBOSE),1) 121 QUIET = 122else 123 QUIET = @ 124endif 125 126-include $(SUFFIXED_OBJS:%.o=%.d) 127 128.SUFFIXES: 129 130%$(OBJ_SUFFIX).o: %.cpp $(EXTRA_SOURCES) 131 @echo "$(notdir $(CURDIR)): C++ $@" 132 $(QUIET) $(CXX) $(CXXFLAGS) -o $@ -c $< 133 134%$(OBJ_SUFFIX).o: %.c 135 @echo "$(notdir $(CURDIR)): C $@" 136 $(QUIET) $(CC) $(CFLAGS) -o $@ -c $< 137 138%.ao: %.S 139 @echo "$(notdir $(CURDIR)): AS $@" 140 $(QUIET) $(AS) -o $@ $< 141 142$(PROGRAM): $(STATIC_LIB_DEPS) $(SUFFIXED_OBJS) $(EXTRA_OBJS) 143 @echo "$(notdir $(CURDIR)): LINK $(PROGRAM)" 144 $(QUIET) $(CXX) -o $(PROGRAM) $(EXTRA_OBJS) $(SUFFIXED_OBJS) $(LDFLAGS) 145 146$(LIBRARY): $(SUFFIXED_OBJS) $(EXTRA_OBJS) 147 @echo "$(notdir $(CURDIR)): LIB $@" 148 $(QUIET) $(AR) rcs $@ $(OBJS) $(EXTRA_OBJS) $(LIBS) 149 $(POST_LIBRARY_BUILD) 150 151#.PHONY: $(STATIC_LIB_DEPS) 152$(STATIC_LIB_DEPS): 153 @flock $(dir $(@)) $(MAKE) -C $(dir $(@)) 154 155IPCCOMPILER = $(SERENITY_BASE_DIR)/DevTools/IPCCompiler/IPCCompiler 156IPCCOMPILER: $(IPCCOMPILER) 157$(IPCCOMPILER): 158 $(QUIET) flock $(dir $(@)) $(MAKE) -C $(dir $(@)) 159 160FORMCOMPILER = $(SERENITY_BASE_DIR)/DevTools/FormCompiler/FormCompiler 161FORMCOMPILER: $(FORMCOMPILER) 162$(FORMCOMPILER): 163 $(QUIET) flock $(dir $(@)) $(MAKE) -C $(dir $(@)) 164 165.DEFAULT_GOAL := all 166 167all: $(PROGRAM) $(LIBRARY) 168 169EXTRA_CLEAN ?= 170 171clean: 172 @echo "$(notdir $(CURDIR)): CLEAN" 173 $(QUIET) rm -f $(PROGRAM) $(LIBRARY) $(SUFFIXED_OBJS) $(EXTRA_OBJS) $(patsubst %.o,%.d,$(SUFFIXED_OBJS) $(EXTRA_OBJS)) $(EXTRA_CLEAN) 174 175install: 176 177.DELETE_ON_ERROR: 178 179.PHONY: all clean install