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
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