Serenity Operating System
at portability 151 lines 4.6 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 25ifneq ($(USE_HOST_CXX),) 26 UNAME_S := $(shell uname -s) 27 ifeq ($(UNAME_S),OpenBSD) 28 HOST_CXX ?= clang++ 29 endif 30 31 ifeq '' '$(findstring clang++,$(CXX))' 32 C_WARNING_FLAGS += -Wno-unknown-warning-option 33 CXX_WARNING_FLAGS += -Wno-unknown-warning-option 34 endif 35 ifeq ($(HOST_CXX),) 36 CXX = $(PRE_CXX) g++ 37 else 38 CXX = $(HOST_CXX) 39 endif 40 AS = as 41 LINK = ld 42 OBJ_SUFFIX ?= .host 43 ARCH = $(shell arch -s) 44else 45 TOOLCHAIN_PATH = $(SERENITY_BASE_DIR)/Toolchain/Local/bin 46 CXX = $(PRE_CXX) $(TOOLCHAIN_PATH)/i686-pc-serenity-g++ 47 CC = $(PRE_CC) $(TOOLCHAIN_PATH)/i686-pc-serenity-gcc 48 AS = $(TOOLCHAIN_PATH)/i686-pc-serenity-as 49 LINK = $(TOOLCHAIN_PATH)/i686-pc-serenity-ld 50 RANLIB = $(TOOLCHAIN_PATH)/i686-pc-serenity-ranlib 51 AR = $(TOOLCHAIN_PATH)/i686-pc-serenity-ar 52 ARCH = i386 53 54 DEFINES += -DDEBUG 55 56 INCLUDE_FLAGS += \ 57 -I$(SERENITY_BASE_DIR)/Libraries/LibC \ 58 -I$(SERENITY_BASE_DIR)/Libraries/LibM \ 59 -I$(SERENITY_BASE_DIR)/Libraries/LibPthread 60 61 ifdef KERNEL 62 DEFINES += -DKERNEL 63 else ifdef BOOTSTRAPPER 64 DEFINES += -DBOOTSTRAPPER 65 else 66 # everything else gets -lc -lm 67 LIB_DEPS := C M $(LIB_DEPS) 68 endif 69 70 # turn "LIB_DEPS=C Core Thread" into "-lc -lcore -lthread -L.../LibC ..." 71 LDFLAGS += $(foreach lib,$(LIB_DEPS),\ 72 -l$(shell echo $(lib) | tr A-Z a-z)) 73 LDFLAGS += $(foreach lib,$(LIB_DEPS),\ 74 -L$(SERENITY_BASE_DIR)/Libraries/Lib$(lib)) 75 76 STATIC_LIB_DEPS = $(foreach lib,$(LIB_DEPS),\ 77 $(SERENITY_BASE_DIR)/Libraries/Lib$(lib)/lib$(shell echo $(lib) | tr A-Z a-z).a) 78 79 OBJ_SUFFIX ?= 80endif 81 82#CXX = clang $(CLANG_FLAGS) 83#CLANG_FLAGS = -Wconsumed -m32 -ffreestanding -march=i686 84 85CXXFLAGS = -MMD -MP $(CXX_WARNING_FLAGS) $(OPTIMIZATION_FLAGS) $(CXX_FLAVOR_FLAGS) $(ARCH_FLAGS) $(CXX_STANDARD_FLAGS) $(CXX_SUGGEST_FLAGS) $(INCLUDE_FLAGS) $(DEFINES) $(SUBPROJECT_CXXFLAGS) 86CFLAGS = -MMD -MP $(C_FLAVOR_FLAGS) $(ARCH_FLAGS) $(C_STANDARD_FLAGS) $(C_SUGGEST_FLAGS) $(INCLUDE_FLAGS) $(DEFINES) $(SUBPROJECT_CXXFLAGS) 87 88DEFINES += -DSANITIZE_PTRS 89 90SUFFIXED_OBJS = $(patsubst %.o,%$(OBJ_SUFFIX).o,$(OBJS)) 91 92ifeq ($(VERBOSE),1) 93 QUIET = 94else 95 QUIET = @ 96endif 97 98-include $(SUFFIXED_OBJS:%.o=%.d) 99 100.SUFFIXES: 101 102%$(OBJ_SUFFIX).o: %.cpp $(EXTRA_SOURCES) 103 @echo "$(notdir $(CURDIR)): C++ $@" 104 $(QUIET) $(CXX) $(CXXFLAGS) -o $@ -c $< 105 106%$(OBJ_SUFFIX).o: %.c 107 @echo "$(notdir $(CURDIR)): C $@" 108 $(QUIET) $(CC) $(CFLAGS) -o $@ -c $< 109 110%.ao: %.S 111 @echo "$(notdir $(CURDIR)): AS $@" 112 $(QUIET) $(AS) -o $@ $< 113 114$(PROGRAM): $(STATIC_LIB_DEPS) $(SUFFIXED_OBJS) $(EXTRA_OBJS) 115 @echo "$(notdir $(CURDIR)): LINK $(PROGRAM)" 116 $(QUIET) $(CXX) -o $(PROGRAM) $(EXTRA_OBJS) $(SUFFIXED_OBJS) $(LDFLAGS) 117 118$(LIBRARY): $(SUFFIXED_OBJS) $(EXTRA_OBJS) 119 @echo "$(notdir $(CURDIR)): LIB $@" 120 $(QUIET) $(AR) rcs $@ $(OBJS) $(EXTRA_OBJS) $(LIBS) 121 $(POST_LIBRARY_BUILD) 122 123#.PHONY: $(STATIC_LIB_DEPS) 124$(STATIC_LIB_DEPS): 125 @flock $(dir $(@)) $(MAKE) -C $(dir $(@)) 126 127IPCCOMPILER = $(SERENITY_BASE_DIR)/DevTools/IPCCompiler/IPCCompiler 128IPCCOMPILER: $(IPCCOMPILER) 129$(IPCCOMPILER): 130 @flock $(dir $(@)) $(MAKE) -C $(dir $(@)) 131 132FORMCOMPILER = $(SERENITY_BASE_DIR)/DevTools/FormCompiler/FormCompiler 133FORMCOMPILER: $(FORMCOMPILER) 134$(FORMCOMPILER): 135 @flock $(dir $(@)) $(MAKE) -C $(dir $(@)) 136 137.DEFAULT_GOAL := all 138 139all: $(PROGRAM) $(LIBRARY) 140 141EXTRA_CLEAN ?= 142 143clean: 144 @echo "$(notdir $(CURDIR)): CLEAN" 145 $(QUIET) rm -f $(PROGRAM) $(LIBRARY) $(SUFFIXED_OBJS) $(EXTRA_OBJS) $(patsubst %.o,%.d,$(SUFFIXED_OBJS) $(EXTRA_OBJS)) $(EXTRA_CLEAN) 146 147install: 148 149.DELETE_ON_ERROR: 150 151.PHONY: all clean install