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