Serenity Operating System
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