mirror of
https://github.com/mupen64plus/mupen64plus-ui-console.git
synced 2025-04-02 10:52:34 -04:00
SDL needs to overwrite the main function to initialize the inner state on some operating systems. Not doing it this way will cause random crashes and undefined behaviour. Systems which need a special main function are for example Apple MacOS, Android, iPhone or Win32. SDL will handle it automatically and keep systems without such requirement with an untouched main function.
325 lines
10 KiB
Makefile
325 lines
10 KiB
Makefile
#/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
# * Mupen64plus - Makefile *
|
|
# * Mupen64Plus homepage: http://code.google.com/p/mupen64plus/ *
|
|
# * Copyright (C) 2009 Richard42 *
|
|
# * *
|
|
# * This program is free software; you can redistribute it and/or modify *
|
|
# * it under the terms of the GNU General Public License as published by *
|
|
# * the Free Software Foundation; either version 2 of the License, or *
|
|
# * (at your option) any later version. *
|
|
# * *
|
|
# * This program is distributed in the hope that it will be useful, *
|
|
# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
|
# * GNU General Public License for more details. *
|
|
# * *
|
|
# * You should have received a copy of the GNU General Public License *
|
|
# * along with this program; if not, write to the *
|
|
# * Free Software Foundation, Inc., *
|
|
# * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
|
|
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
# Makefile for Mupen64plus-ui-console
|
|
|
|
# detect operation system
|
|
UNAME ?= $(shell uname -s)
|
|
OS := NONE
|
|
ifeq ("$(UNAME)","Linux")
|
|
OS = LINUX
|
|
endif
|
|
ifeq ("$(UNAME)","linux")
|
|
OS = LINUX
|
|
endif
|
|
ifneq ("$(filter GNU hurd,$(UNAME))","")
|
|
OS = LINUX
|
|
endif
|
|
ifeq ("$(UNAME)","Darwin")
|
|
OS = OSX
|
|
endif
|
|
ifeq ("$(UNAME)","FreeBSD")
|
|
OS = FREEBSD
|
|
endif
|
|
ifeq ("$(UNAME)","OpenBSD")
|
|
OS = FREEBSD
|
|
$(warning OS type "$(UNAME)" not officially supported.')
|
|
endif
|
|
ifneq ("$(filter GNU/kFreeBSD kfreebsd,$(UNAME))","")
|
|
OS = LINUX
|
|
endif
|
|
ifeq ("$(patsubst MINGW%,MINGW,$(UNAME))","MINGW")
|
|
OS = MINGW
|
|
endif
|
|
ifeq ("$(OS)","NONE")
|
|
$(error OS type "$(UNAME)" not supported. Please file bug report at 'http://code.google.com/p/mupen64plus/issues')
|
|
endif
|
|
|
|
# detect system architecture
|
|
HOST_CPU ?= $(shell uname -m)
|
|
NO_ASM ?= 1
|
|
CPU := NONE
|
|
ifneq ("$(filter x86_64 amd64,$(HOST_CPU))","")
|
|
CPU := X86
|
|
ifeq ("$(BITS)", "32")
|
|
ARCH_DETECTED := 64BITS_32
|
|
else
|
|
ARCH_DETECTED := 64BITS
|
|
endif
|
|
endif
|
|
ifneq ("$(filter pentium i%86,$(HOST_CPU))","")
|
|
CPU := X86
|
|
ARCH_DETECTED := 32BITS
|
|
endif
|
|
ifneq ("$(filter ppc macppc socppc powerpc,$(HOST_CPU))","")
|
|
CPU := PPC
|
|
ARCH_DETECTED := 32BITS
|
|
BIG_ENDIAN := 1
|
|
$(warning Architecture "$(HOST_CPU)" not officially supported.')
|
|
endif
|
|
ifneq ("$(filter ppc64 powerpc64,$(HOST_CPU))","")
|
|
CPU := PPC
|
|
ARCH_DETECTED := 64BITS
|
|
BIG_ENDIAN := 1
|
|
$(warning Architecture "$(HOST_CPU)" not officially supported.')
|
|
endif
|
|
ifneq ("$(filter arm%,$(HOST_CPU))","")
|
|
ifeq ("$(filter arm%b,$(HOST_CPU))","")
|
|
CPU := ARM
|
|
ARCH_DETECTED := 32BITS
|
|
$(warning Architecture "$(HOST_CPU)" not officially supported.')
|
|
endif
|
|
endif
|
|
ifeq ("$(CPU)","NONE")
|
|
$(error CPU type "$(HOST_CPU)" not supported. Please file bug report at 'http://code.google.com/p/mupen64plus/issues')
|
|
endif
|
|
|
|
# base CFLAGS, LDLIBS, and LDFLAGS
|
|
OPTFLAGS ?= -O3 -flto
|
|
WARNFLAGS ?= -Wall
|
|
|
|
CFLAGS += $(OPTFLAGS) $(WARNFLAGS) -ffast-math -fno-strict-aliasing -I../../src
|
|
ifeq ($(OS), MINGW)
|
|
CFLAGS += -lpthread
|
|
LDLIBS += -lpthread
|
|
else
|
|
CFLAGS += -pthread
|
|
LDLIBS += -pthread
|
|
endif
|
|
|
|
ifeq ($(PIE), 1)
|
|
CFLAGS += -fPIE
|
|
LDFLAGS += -pie
|
|
else
|
|
CFLAGS += -fno-PIE
|
|
endif
|
|
|
|
# set special flags per-system
|
|
ifeq ($(OS), LINUX)
|
|
LDLIBS += -ldl
|
|
endif
|
|
ifeq ($(OS), OSX)
|
|
# Select the proper SDK
|
|
# Also, SDKs are stored in a different location since XCode 4.3
|
|
OSX_SDK ?= $(shell sw_vers -productVersion | cut -f1 -f2 -d .)
|
|
OSX_XCODEMAJ = $(shell xcodebuild -version | grep '[0-9]*\.[0-9]*' | cut -f2 -d ' ' | cut -f1 -d .)
|
|
OSX_XCODEMIN = $(shell xcodebuild -version | grep '[0-9]*\.[0-9]*' | cut -f2 -d ' ' | cut -f2 -d .)
|
|
OSX_XCODEGE43 = $(shell echo "`expr $(OSX_XCODEMAJ) \>= 4``expr $(OSX_XCODEMIN) \>= 3`")
|
|
ifeq ($(OSX_XCODEGE43), 11)
|
|
OSX_SYSROOT := /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
|
|
else
|
|
OSX_SYSROOT := /Developer/SDKs
|
|
endif
|
|
|
|
ifeq ($(CPU), X86)
|
|
ifeq ($(ARCH_DETECTED), 64BITS)
|
|
CFLAGS += -pipe -arch x86_64 -mmacosx-version-min=$(OSX_SDK) -isysroot $(OSX_SYSROOT)/MacOSX$(OSX_SDK).sdk
|
|
else
|
|
CFLAGS += -pipe -mmmx -msse -fomit-frame-pointer -arch i686 -mmacosx-version-min=$(OSX_SDK) -isysroot $(OSX_SYSROOT)/MacOSX$(OSX_SDK).sdk
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
# test for presence of SDL
|
|
ifeq ($(origin SDL_CFLAGS) $(origin SDL_LDLIBS), undefined undefined)
|
|
SDL_CONFIG = $(CROSS_COMPILE)sdl-config
|
|
ifeq ($(shell which $(SDL_CONFIG) 2>/dev/null),)
|
|
$(error No SDL development libraries found!)
|
|
endif
|
|
SDL_CFLAGS += $(shell $(SDL_CONFIG) --cflags)
|
|
SDL_LDLIBS += $(shell $(SDL_CONFIG) --libs)
|
|
endif
|
|
CFLAGS += $(SDL_CFLAGS)
|
|
LDLIBS += $(SDL_LDLIBS)
|
|
|
|
ifeq ($(OS), MINGW)
|
|
LDLIBS += -mconsole
|
|
endif
|
|
|
|
ifeq ($(BIG_ENDIAN), 1)
|
|
CFLAGS += -DM64P_BIG_ENDIAN
|
|
endif
|
|
|
|
# tweak flags for 32-bit build on 64-bit system
|
|
ifeq ($(ARCH_DETECTED), 64BITS_32)
|
|
ifeq ($(OS), FREEBSD)
|
|
$(error Do not use the BITS=32 option with FreeBSD, use -m32 and -m elf_i386)
|
|
endif
|
|
CFLAGS += -m32
|
|
LDFLAGS += -Wl,-m,elf_i386
|
|
endif
|
|
|
|
# set mupen64plus core API header path
|
|
ifneq ("$(APIDIR)","")
|
|
CFLAGS += "-I$(APIDIR)"
|
|
else
|
|
TRYDIR = ../../../mupen64plus-core/src/api
|
|
ifneq ("$(wildcard $(TRYDIR)/m64p_types.h)","")
|
|
CFLAGS += -I$(TRYDIR)
|
|
else
|
|
TRYDIR = /usr/local/include/mupen64plus
|
|
ifneq ("$(wildcard $(TRYDIR)/m64p_types.h)","")
|
|
CFLAGS += -I$(TRYDIR)
|
|
else
|
|
TRYDIR = /usr/include/mupen64plus
|
|
ifneq ("$(wildcard $(TRYDIR)/m64p_types.h)","")
|
|
CFLAGS += -I$(TRYDIR)
|
|
else
|
|
$(error Mupen64Plus API header files not found! Use makefile parameter APIDIR to force a location.)
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
# reduced compile output when running make without V=1
|
|
ifneq ($(findstring $(MAKEFLAGS),s),s)
|
|
ifndef V
|
|
Q_CC = @echo ' CC '$@;
|
|
Q_LD = @echo ' LD '$@;
|
|
endif
|
|
endif
|
|
|
|
# set base program pointers and flags
|
|
CC = $(CROSS_COMPILE)gcc
|
|
CXX = $(CROSS_COMPILE)g++
|
|
RM ?= rm -f
|
|
INSTALL ?= install
|
|
MKDIR ?= mkdir -p
|
|
COMPILE.c = $(Q_CC)$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c
|
|
LINK.o = $(Q_LD)$(CC) $(CFLAGS) $(LDFLAGS) $(TARGET_ARCH)
|
|
|
|
# set special flags for given Makefile parameters
|
|
# note: COREDIR _must_ end in a slash if you want it to work; not necessary for the others
|
|
ifneq ($(PLUGINDIR),)
|
|
CFLAGS += '-DPLUGINDIR="$(PLUGINDIR)"'
|
|
endif
|
|
ifneq ($(COREDIR),)
|
|
CFLAGS += '-DCOREDIR="$(COREDIR)"'
|
|
endif
|
|
ifneq ($(SHAREDIR),)
|
|
CFLAGS += '-DSHAREDIR="$(SHAREDIR)"'
|
|
endif
|
|
ifeq ($(DEBUG),1)
|
|
CFLAGS += -g
|
|
INSTALL_STRIP_FLAG ?=
|
|
else
|
|
INSTALL_STRIP_FLAG ?= -s
|
|
endif
|
|
|
|
# set installation options
|
|
ifeq ($(PREFIX),)
|
|
PREFIX := /usr/local
|
|
endif
|
|
ifeq ($(BINDIR),)
|
|
BINDIR := $(PREFIX)/bin
|
|
endif
|
|
ifeq ($(MANDIR),)
|
|
MANDIR := $(PREFIX)/share/man
|
|
endif
|
|
|
|
SRCDIR = ../../src
|
|
OBJDIR = _obj$(POSTFIX)
|
|
|
|
ifeq ("$(OS)","MINGW")
|
|
EXEEXT = .exe
|
|
else
|
|
EXEEXT =
|
|
endif
|
|
|
|
# list of source files to compile
|
|
SOURCE = \
|
|
$(SRCDIR)/cheat.c \
|
|
$(SRCDIR)/compare_core.c \
|
|
$(SRCDIR)/core_interface.c \
|
|
$(SRCDIR)/main.c \
|
|
$(SRCDIR)/plugin.c
|
|
|
|
ifeq ($(OS), MINGW)
|
|
SOURCE += \
|
|
$(SRCDIR)/osal_dynamiclib_win32.c \
|
|
$(SRCDIR)/osal_files_win32.c
|
|
else
|
|
SOURCE += \
|
|
$(SRCDIR)/osal_dynamiclib_unix.c \
|
|
$(SRCDIR)/osal_files_unix.c
|
|
endif
|
|
|
|
# generate a list of object files build, make a temporary directory for them
|
|
OBJECTS := $(patsubst $(SRCDIR)/%.c, $(OBJDIR)/%.o, $(filter %.c, $(SOURCE)))
|
|
OBJDIRS = $(dir $(OBJECTS))
|
|
$(shell $(MKDIR) $(OBJDIRS))
|
|
|
|
# build targets
|
|
TARGET = mupen64plus$(POSTFIX)$(EXEEXT)
|
|
|
|
targets:
|
|
@echo "Mupen64Plus-ui-console makefile."
|
|
@echo " Targets:"
|
|
@echo " all == Build Mupen64Plus console front-end application"
|
|
@echo " clean == remove object files and build products"
|
|
@echo " rebuild == clean and re-build all"
|
|
@echo " install == Install Mupen64Plus console front-end application"
|
|
@echo " uninstall == Uninstall Mupen64Plus console front-end application"
|
|
@echo " Options:"
|
|
@echo " COREDIR=path == default path to search for Mupen64Plus Core (must end with slash)"
|
|
@echo " PLUGINDIR=path == default path to search for plugins"
|
|
@echo " SHAREDIR=path == default path to search for shared data files"
|
|
@echo " APIDIR=path == path to find Mupen64Plus Core headers"
|
|
@echo " OPTFLAGS=flags == compiler optimization (default: -O3 -flto)"
|
|
@echo " WARNFLAGS=flag == compiler warning levels (default: -Wall)"
|
|
@echo " PIE=(1|0) == Force enable/disable of position independent executables"
|
|
@echo " POSTFIX=name == String added to the name of the the build (default: '')"
|
|
@echo " Install Options:"
|
|
@echo " PREFIX=path == install/uninstall prefix (default: /usr/local/)"
|
|
@echo " BINDIR=path == path to install mupen64plus binary (default: PREFIX/bin/)"
|
|
@echo " MANDIR=path == path to install mupen64plus manual page (default: PREFIX/share/man)"
|
|
@echo " DESTDIR=path == path to prepend to all installation paths (only for packagers)"
|
|
@echo " Debugging Options:"
|
|
@echo " DEBUG=1 == add debugging symbols to application binary"
|
|
@echo " V=1 == show verbose compiler output"
|
|
|
|
all: $(TARGET)
|
|
|
|
clean:
|
|
$(RM) -r $(OBJDIR) $(TARGET)
|
|
|
|
rebuild: clean all
|
|
|
|
install: $(TARGET)
|
|
$(INSTALL) -d "$(DESTDIR)$(BINDIR)"
|
|
$(INSTALL) -m 0755 $(INSTALL_STRIP_FLAG) $(TARGET) "$(DESTDIR)$(BINDIR)"
|
|
$(INSTALL) -d "$(DESTDIR)$(MANDIR)/man6"
|
|
$(INSTALL) -m 0644 ../../doc/mupen64plus.6 "$(DESTDIR)$(MANDIR)/man6"
|
|
|
|
uninstall:
|
|
$(RM) "$(DESTDIR)$(BINDIR)/$(TARGET)" "$(DESTDIR)$(MANDIR)/man6/mupen64plus.6"
|
|
|
|
# build dependency files
|
|
CFLAGS += -MD
|
|
-include $(OBJECTS:.o=.d)
|
|
|
|
# standard build rules
|
|
$(OBJDIR)/%.o: $(SRCDIR)/%.c
|
|
$(COMPILE.c) -o $@ $<
|
|
|
|
$(TARGET): $(OBJECTS)
|
|
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
|
|
|
|
.PHONY: all clean install uninstall targets
|