1HAVE_FILE_LOGGER=1
2NEED_CXX_LINKER?=0
3NEED_GOLD_LINKER?=0
4MISSING_DECLS   =0
5
6ifneq ($(C90_BUILD),)
7   C89_BUILD=1
8endif
9
10include config.mk
11
12# Put your favorite compile flags in this file, if you want different defaults than upstream.
13# Do not attempt to create that file upstream.
14# (It'd be better to put this comment in that file, but .gitignore doesn't work on files that exist in the repo.)
15-include Makefile.local
16
17ifeq ($(HAVE_ANGLE), 1)
18TARGET = retroarch_angle
19else
20TARGET = retroarch
21endif
22
23OBJ :=
24LIBS :=
25DEF_FLAGS := -I.
26ASFLAGS :=
27DEFINES := -DHAVE_CONFIG_H -DRARCH_INTERNAL -D_FILE_OFFSET_BITS=64
28DEFINES += -DGLOBAL_CONFIG_DIR='"$(GLOBAL_CONFIG_DIR)"'
29
30OBJDIR_BASE := obj-unix
31
32ifeq ($(NEED_GOLD_LINKER), 1)
33   LDFLAGS += -fuse-ld=gold
34endif
35
36ifeq ($(DEBUG), 1)
37   OBJDIR := $(OBJDIR_BASE)/debug
38   CFLAGS ?= -O0 -g
39   CXXFLAGS ?= -O0 -g
40   DEFINES += -DDEBUG -D_DEBUG
41else
42   OBJDIR := $(OBJDIR_BASE)/release
43   CFLAGS ?= -O3
44   CXXFLAGS ?= -O3
45   DEF_FLAGS += -ffast-math
46endif
47
48DEF_FLAGS += -Wall
49
50ifneq ($(findstring BSD,$(OS)),)
51   DEF_FLAGS += -DBSD
52   LDFLAGS += -L/usr/local/lib
53   UDEV_CFLAGS += -I/usr/local/include/libepoll-shim
54   UDEV_LIBS += -lepoll-shim
55endif
56
57ifneq ($(findstring DOS,$(OS)),)
58   DEF_FLAGS += -march=i386
59   LDFLAGS += -lemu
60endif
61
62ifneq ($(findstring FPGA,$(OS)),)
63   DEFINES += -DHAVE_FPGA
64endif
65
66ifneq ($(findstring Win32,$(OS)),)
67   LDFLAGS += -static-libgcc -lwinmm
68endif
69
70include Makefile.common
71
72ifeq ($(shell $(CC) -v 2>&1 | grep -c "clang"),1)
73   DEF_FLAGS += -Wno-invalid-source-encoding -Wno-incompatible-ms-struct
74endif
75
76ifeq ($(shell $(CC) -v 2>&1 | grep -c "tcc"),1)
77   MD = -MD
78else
79   MD = -MMD
80endif
81
82HEADERS = $(wildcard */*/*.h) $(wildcard */*.h) $(wildcard *.h)
83
84ifeq ($(MISSING_DECLS), 1)
85   DEF_FLAGS += -Werror=missing-declarations
86endif
87
88ifeq ($(HAVE_DYLIB), 1)
89   LIBS += $(DYLIB_LIB)
90endif
91
92ifeq ($(HAVE_DYNAMIC), 1)
93   LIBS += $(DYLIB_LIB)
94else
95   LIBS += $(libretro)
96endif
97
98ifneq ($(V),1)
99   Q := @
100endif
101
102ifeq ($(HAVE_DRMINGW), 1)
103   DEF_FLAGS += -DHAVE_DRMINGW
104   LDFLAGS += $(DRMINGW_LIBS)
105endif
106
107ifneq ($(findstring Win32,$(OS)),)
108   LDFLAGS += -mwindows
109endif
110
111ifneq ($(CXX_BUILD), 1)
112   ifneq ($(C89_BUILD),)
113      CFLAGS += -std=c89 -ansi -pedantic -Werror=pedantic -Wno-long-long
114   else ifeq ($(HAVE_C99), 1)
115      CFLAGS += $(C99_CFLAGS)
116   endif
117
118   CFLAGS += -D_GNU_SOURCE
119endif
120
121DEF_FLAGS += $(INCLUDE_DIRS) -Ideps -Ideps/stb
122
123CFLAGS += $(DEF_FLAGS)
124CXXFLAGS += $(DEF_FLAGS) -D__STDC_CONSTANT_MACROS
125OBJCFLAGS :=  $(CFLAGS) -D__STDC_CONSTANT_MACROS
126
127ifeq ($(HAVE_CXX), 1)
128   ifeq ($(CXX_BUILD), 1)
129      LINK = $(CXX)
130      CFLAGS   := $(CXXFLAGS) -xc++
131      CFLAGS   += -DCXX_BUILD
132      CXXFLAGS += -DCXX_BUILD
133   else ifeq ($(NEED_CXX_LINKER),1)
134      LINK = $(CXX)
135   else
136      LINK = $(CC)
137   endif
138else
139   LINK = $(CC)
140endif
141
142RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ))
143
144ifneq ($(X86),)
145   CFLAGS += -m32
146   CXXFLAGS += -m32
147   LDFLAGS += -m32
148endif
149
150ifneq ($(SANITIZER),)
151   CFLAGS   := -fsanitize=$(SANITIZER) $(CFLAGS)
152   CXXFLAGS := -fsanitize=$(SANITIZER) $(CXXFLAGS)
153   LDFLAGS  := -fsanitize=$(SANITIZER) $(LDFLAGS)
154endif
155
156ifneq ($(findstring $(GPERFTOOLS),profiler),)
157   LIBS += -lprofiler
158endif
159ifneq ($(findstring $(GPERFTOOLS),tcmalloc),)
160   LIBS += -ltcmalloc
161endif
162
163# Qt MOC generation, required for QObject-derived classes
164ifneq ($(MOC_HEADERS),)
165    # prefix moc_ to base filename of paths and change extension from h to cpp, so a/b/foo.h becomes a/b/moc_foo.cpp
166    MOC_SRC := $(join $(addsuffix moc_,$(addprefix $(OBJDIR)/,$(dir $(MOC_HEADERS)))), $(notdir $(MOC_HEADERS:.h=.cpp)))
167    MOC_OBJ := $(patsubst %.cpp,%.o,$(MOC_SRC))
168    RARCH_OBJ += $(MOC_OBJ)
169endif
170
171all: $(TARGET) config.mk
172
173$(MOC_SRC):
174	@$(if $(Q), $(shell echo echo MOC $<),)
175	$(eval MOC_TMP := $(patsubst %.h,%_moc.cpp,$@))
176	$(Q)QT_SELECT=$(QT_VERSION) $(MOC) -o $(MOC_TMP) $<
177
178$(foreach x,$(join $(addsuffix :,$(MOC_SRC)),$(MOC_HEADERS)),$(eval $x))
179
180$(MOC_OBJ):
181	@$(if $(Q), $(shell echo echo CXX $<),)
182	$(Q)$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(DEFINES) -MMD -c -o $@ $<
183
184$(foreach x,$(join $(addsuffix :,$(MOC_OBJ)),$(MOC_SRC)),$(eval $x))
185
186ifeq ($(MAKECMDGOALS),clean)
187config.mk:
188else
189-include $(RARCH_OBJ:.o=.d)
190ifeq ($(HAVE_CONFIG_MK),)
191config.mk: configure qb/*
192	@echo "config.mk is outdated or non-existing. Run ./configure again."
193	@exit 1
194endif
195endif
196
197SYMBOL_MAP := -Wl,-Map=output.map
198
199$(TARGET): $(RARCH_OBJ)
200	@$(if $(Q), $(shell echo echo LD $@),)
201	$(Q)$(LINK) -o $@ $(RARCH_OBJ) $(LIBS) $(LDFLAGS) $(LIBRARY_DIRS)
202
203$(OBJDIR)/%.o: %.c config.h config.mk
204	@mkdir -p $(dir $@)
205	@$(if $(Q), $(shell echo echo CC $<),)
206	$(Q)$(CC) $(CPPFLAGS) $(CFLAGS) $(DEFINES) $(MD) -c -o $@ $<
207
208$(OBJDIR)/%.o: %.cpp config.h config.mk
209	@mkdir -p $(dir $@)
210	@$(if $(Q), $(shell echo echo CXX $<),)
211	$(Q)$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(DEFINES) -MMD -c -o $@ $<
212
213$(OBJDIR)/%.o: %.m
214	@mkdir -p $(dir $@)
215	@$(if $(Q), $(shell echo echo OBJC $<),)
216	$(Q)$(CXX) $(OBJCFLAGS) $(DEFINES) -MMD -c -o $@ $<
217
218$(OBJDIR)/%.o: %.S config.h config.mk $(HEADERS)
219	@mkdir -p $(dir $@)
220	@$(if $(Q), $(shell echo echo AS $<),)
221	$(Q)$(CC) $(CFLAGS) $(ASFLAGS) $(DEFINES) -c -o $@ $<
222
223$(OBJDIR)/%.o: %.rc $(HEADERS)
224	@mkdir -p $(dir $@)
225	@$(if $(Q), $(shell echo echo WINDRES $<),)
226	$(Q)$(WINDRES) -o $@ $<
227
228install: $(TARGET)
229	mkdir -p $(DESTDIR)$(BIN_DIR) 2>/dev/null || /bin/true
230	mkdir -p $(DESTDIR)$(GLOBAL_CONFIG_DIR) 2>/dev/null || /bin/true
231	mkdir -p $(DESTDIR)$(DATA_DIR)/applications 2>/dev/null || /bin/true
232	mkdir -p $(DESTDIR)$(DATA_DIR)/metainfo 2>/dev/null || /bin/true
233	mkdir -p $(DESTDIR)$(DOC_DIR) 2>/dev/null || /bin/true
234	mkdir -p $(DESTDIR)$(MAN_DIR)/man6 2>/dev/null || /bin/true
235	mkdir -p $(DESTDIR)$(DATA_DIR)/pixmaps 2>/dev/null || /bin/true
236	cp $(TARGET) $(DESTDIR)$(BIN_DIR)
237	cp tools/cg2glsl.py $(DESTDIR)$(BIN_DIR)/retroarch-cg2glsl
238	cp retroarch.cfg $(DESTDIR)$(GLOBAL_CONFIG_DIR)
239	cp com.libretro.RetroArch.appdata.xml $(DESTDIR)$(DATA_DIR)/metainfo
240	cp retroarch.desktop $(DESTDIR)$(DATA_DIR)/applications
241	cp docs/retroarch.6 $(DESTDIR)$(MAN_DIR)/man6
242	cp docs/retroarch-cg2glsl.6 $(DESTDIR)$(MAN_DIR)/man6
243	cp media/retroarch.svg $(DESTDIR)$(DATA_DIR)/pixmaps
244	cp COPYING $(DESTDIR)$(DOC_DIR)
245	cp README.md $(DESTDIR)$(DOC_DIR)
246	chmod 755 $(DESTDIR)$(BIN_DIR)/$(TARGET)
247	chmod 755 $(DESTDIR)$(BIN_DIR)/retroarch-cg2glsl
248	chmod 644 $(DESTDIR)$(GLOBAL_CONFIG_DIR)/retroarch.cfg
249	chmod 644 $(DESTDIR)$(DATA_DIR)/applications/retroarch.desktop
250	chmod 644 $(DESTDIR)$(DATA_DIR)/metainfo/com.libretro.RetroArch.appdata.xml
251	chmod 644 $(DESTDIR)$(MAN_DIR)/man6/retroarch.6
252	chmod 644 $(DESTDIR)$(MAN_DIR)/man6/retroarch-cg2glsl.6
253	chmod 644 $(DESTDIR)$(DATA_DIR)/pixmaps/retroarch.svg
254	@if test -d media/assets && test $(HAVE_ASSETS); then \
255		echo "Installing media assets..."; \
256		mkdir -p $(DESTDIR)$(ASSETS_DIR)/assets; \
257		if test $(HAVE_MATERIALUI) = 1; then \
258			cp -r media/assets/glui/ $(DESTDIR)$(ASSETS_DIR)/assets; \
259		fi; \
260		if test $(HAVE_XMB) = 1; then \
261			cp -r media/assets/xmb/ $(DESTDIR)$(ASSETS_DIR)/assets; \
262		fi; \
263		if test $(HAVE_OZONE) = 1; then \
264			cp -r media/assets/ozone/ $(DESTDIR)$(ASSETS_DIR)/assets; \
265		fi; \
266		cp media/assets/COPYING $(DESTDIR)$(DOC_DIR)/COPYING.assets; \
267		echo "Asset copying done."; \
268	fi
269
270uninstall:
271	rm -f $(DESTDIR)$(BIN_DIR)/$(TARGET)
272	rm -f $(DESTDIR)$(BIN_DIR)/retroarch-cg2glsl
273	rm -f $(DESTDIR)$(GLOBAL_CONFIG_DIR)/retroarch.cfg
274	rm -f $(DESTDIR)$(DATA_DIR)/applications/retroarch.desktop
275	rm -f $(DESTDIR)$(DATA_DIR)/metainfo/com.libretro.RetroArch.appdata.xml
276	rm -f $(DESTDIR)$(DATA_DIR)/pixmaps/retroarch.svg
277	rm -f $(DESTDIR)$(DOC_DIR)/COPYING
278	rm -f $(DESTDIR)$(DOC_DIR)/COPYING.assets
279	rm -f $(DESTDIR)$(DOC_DIR)/README.md
280	rm -f $(DESTDIR)$(MAN_DIR)/man6/retroarch.6
281	rm -f $(DESTDIR)$(MAN_DIR)/man6/retroarch-cg2glsl.6
282	rm -rf $(DESTDIR)$(ASSETS_DIR)
283
284clean:
285	rm -rf $(OBJDIR_BASE)
286	rm -f $(TARGET)
287	rm -f *.d
288
289.PHONY: all install uninstall clean
290
291print-%:
292	@echo '$*=$($*)'
293