mirror of https://github.com/stella-emu/stella.git
364 lines
13 KiB
Makefile
364 lines
13 KiB
Makefile
##============================================================================
|
|
##
|
|
## SSSS tt lll lll
|
|
## SS SS tt ll ll
|
|
## SS tttttt eeee ll ll aaaa
|
|
## SSSS tt ee ee ll ll aa
|
|
## SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
|
|
## SS SS tt ee ll ll aa aa
|
|
## SSSS ttt eeeee llll llll aaaaa
|
|
##
|
|
## Copyright (c) 1995-2022 by Bradford W. Mott, Stephen Anthony
|
|
## and the Stella Team
|
|
##
|
|
## See the file "License.txt" for information on usage and redistribution of
|
|
## this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
|
##============================================================================
|
|
|
|
#######################################################################
|
|
# Default compilation parameters. Normally don't edit these #
|
|
#######################################################################
|
|
|
|
srcdir ?= .
|
|
|
|
DEFINES := -DSDL_SUPPORT -D_GLIBCXX_USE_CXX11_ABI=1
|
|
LDFLAGS := -pthread
|
|
INCLUDES :=
|
|
LIBS :=
|
|
OBJS :=
|
|
PROF :=
|
|
|
|
MODULES :=
|
|
MODULE_DIRS :=
|
|
|
|
DISTNAME := stella-snapshot
|
|
|
|
# Load the make rules generated by configure
|
|
include config.mak
|
|
|
|
# Uncomment this for stricter compile time code verification
|
|
# CXXFLAGS+= -Werror
|
|
|
|
ifdef CXXFLAGS
|
|
CFLAGS:= $(CXXFLAGS)
|
|
CXXFLAGS:= $(CXXFLAGS) -x c++
|
|
else
|
|
CXXFLAGS:= -O2 -x c++
|
|
CFLAGS:= -O2
|
|
endif
|
|
|
|
CXXFLAGS+= -Wall -Wextra -Wno-unused-parameter
|
|
CFLAGS+= -Wall -Wextra -Wno-unused-parameter
|
|
|
|
ifdef HAVE_GCC
|
|
CXXFLAGS+= -Wno-multichar -Wunused -Woverloaded-virtual -Wnon-virtual-dtor -std=c++17
|
|
CFLAGS+= -Wno-multichar -Wunused
|
|
endif
|
|
|
|
ifdef HAVE_CLANG
|
|
CXXFLAGS+= -Wno-multichar -Wunused -Woverloaded-virtual -Wnon-virtual-dtor -std=c++17
|
|
CFLAGS+= -Wno-multichar -Wunused
|
|
endif
|
|
|
|
ifdef CLANG_WARNINGS
|
|
EXTRA_WARN=-Weverything -Wno-c++98-compat-pedantic -Wno-unknown-warning-option \
|
|
-Wno-switch-enum -Wno-conversion -Wno-covered-switch-default \
|
|
-Wno-inconsistent-missing-destructor-override -Wno-float-equal \
|
|
-Wno-exit-time-destructors -Wno-global-constructors -Wno-weak-vtables \
|
|
-Wno-four-char-constants -Wno-padded -Wno-reserved-identifier \
|
|
-Wno-duplicate-enum -Wno-unsafe-buffer-usage
|
|
|
|
CXXFLAGS+= $(EXTRA_WARN)
|
|
CFLAGS+= $(EXTRA_WARN)
|
|
endif
|
|
|
|
ifdef PROFILE
|
|
PROF:= -pg -fprofile-arcs -ftest-coverage
|
|
CXXFLAGS+= $(PROF)
|
|
CFLAGS+= $(PROF)
|
|
endif
|
|
|
|
ifdef DEBUG
|
|
CXXFLAGS += -g -Wp,-D_GLIBCXX_DEBUG
|
|
CFLAGS += -g -Wp,-D_GLIBCXX_DEBUG
|
|
else
|
|
ifdef HAVE_GCC
|
|
CXXFLAGS+= -fomit-frame-pointer
|
|
CFLAGS+= -fomit-frame-pointer
|
|
endif
|
|
|
|
ifdef HAVE_CLANG
|
|
CXXFLAGS+= -fomit-frame-pointer
|
|
CFLAGS+= -fomit-frame-pointer
|
|
endif
|
|
endif
|
|
|
|
ifdef RELEASE
|
|
CXXFLAGS += -flto -fno-rtti
|
|
CFLAGS += -flto
|
|
LDFLAGS += -flto -fno-rtti
|
|
endif
|
|
|
|
#######################################################################
|
|
# Misc stuff - you should never have to edit this #
|
|
#######################################################################
|
|
|
|
ifdef STELLA_BUILD_ROOT
|
|
OBJECT_ROOT := $(STELLA_BUILD_ROOT)/stella-out
|
|
else
|
|
OBJECT_ROOT := out
|
|
endif
|
|
OBJECT_ROOT_PROFILE_GENERERATE := out.pgen
|
|
OBJECT_ROOT_PROFILE_USE := out.pgo
|
|
|
|
EXECUTABLE := stella$(EXEEXT)
|
|
EXECUTABLE_PROFILE_GENERATE := stella-pgo-generate$(EXEEXT)
|
|
EXECUTABLE_PROFILE_USE := stella-pgo$(EXEEXT)
|
|
|
|
PROFILE_DIR = $(CURDIR)/test/roms/profile
|
|
PROFILE_OUT = $(PROFILE_DIR)/out
|
|
PROFILE_STAMP = profile.stamp
|
|
|
|
CXXFLAGS_PROFILE_GENERATE = $(CXXFLAGS)
|
|
CXXFLAGS_PROFILE_USE = $(CXXFLAGS)
|
|
CFLAGS_PROFILE_GENERATE = $(CFLAGS)
|
|
CFLAGS_PROFILE_USE = $(CFLAGS)
|
|
LDFLAGS_PROFILE_GENERATE = $(LDFLAGS)
|
|
STELLA_PROFILE_GENERATE = $(BINARY_LOADER) ./$(EXECUTABLE_PROFILE_GENERATE) -profile \
|
|
$(PROFILE_DIR)/128.bin:10 \
|
|
$(PROFILE_DIR)/catharsis_theory.bin:60
|
|
|
|
ifdef HAVE_CLANG
|
|
CXXFLAGS_PROFILE_GENERATE += -fprofile-generate=$(PROFILE_OUT)
|
|
CXXFLAGS_PROFILE_USE += -fprofile-use=$(PROFILE_OUT)
|
|
CFLAGS_PROFILE_GENERATE += -fprofile-generate=$(PROFILE_OUT)
|
|
CFLAGS_PROFILE_USE += -fprofile-use=$(PROFILE_OUT)
|
|
LDFLAGS_PROFILE_GENERATE += -fprofile-generate
|
|
STELLA_PROFILE_GENERATE := \
|
|
LLVM_PROFILE_FILE="$(PROFILE_OUT)/default.profraw" $(STELLA_PROFILE_GENERATE) && \
|
|
$(LLVM_PROFDATA) merge -o $(PROFILE_OUT)/default.profdata $(PROFILE_OUT)/default.profraw
|
|
endif
|
|
|
|
ifdef HAVE_GCC
|
|
CXXFLAGS_PROFILE_GENERATE += -fprofile-generate -fprofile-dir=$(PROFILE_OUT)
|
|
CXXFLAGS_PROFILE_USE += -fprofile-use -fprofile-dir=$(PROFILE_OUT)
|
|
CFLAGS_PROFILE_GENERATE += -fprofile-generate -fprofile-dir=$(PROFILE_OUT)
|
|
CFLAGS_PROFILE_USE += -fprofile-use -fprofile-dir=$(PROFILE_OUT)
|
|
LDFLAGS_PROFILE_GENERATE += -fprofile-generate
|
|
STELLA_PROFILE_GENERATE := $(STELLA_PROFILE_GENERATE) && \
|
|
(rm -fr $(PROFILE_OUT)/$(OBJECT_ROOT_PROFILE_USE) || true) && \
|
|
(mv $(PROFILE_OUT)/$(OBJECT_ROOT_PROFILE_GENERERATE) $(PROFILE_OUT)/$(OBJECT_ROOT_PROFILE_USE) || true)
|
|
endif
|
|
|
|
all: $(EXECUTABLE)
|
|
|
|
pgo: $(EXECUTABLE_PROFILE_USE)
|
|
|
|
######################################################################
|
|
# Various minor settings
|
|
######################################################################
|
|
|
|
# The name for the directory used for dependency tracking
|
|
DEPDIR := .deps
|
|
|
|
|
|
######################################################################
|
|
# Module settings
|
|
######################################################################
|
|
|
|
MODULES := $(MODULES)
|
|
|
|
# After the game specific modules follow the shared modules
|
|
MODULES += \
|
|
src/common \
|
|
src/common/audio \
|
|
src/common/tv_filters \
|
|
src/emucore \
|
|
src/emucore/tia \
|
|
src/emucore/tia/frame-manager \
|
|
src/common/repository/sqlite
|
|
|
|
######################################################################
|
|
# The build rules follow - normally you should have no need to
|
|
# touch whatever comes after here.
|
|
######################################################################
|
|
|
|
# Concat DEFINES and INCLUDES to form the CPPFLAGS
|
|
CPPFLAGS:= $(DEFINES) $(INCLUDES)
|
|
|
|
# Include the build instructions for all modules
|
|
-include $(addprefix $(srcdir)/, $(addsuffix /module.mk,$(MODULES)))
|
|
|
|
# Depdir information
|
|
DEPDIRS = $(addsuffix /$(DEPDIR),$(MODULE_DIRS))
|
|
DEPFILES =
|
|
|
|
OBJ=$(addprefix $(OBJECT_ROOT)/,$(OBJS))
|
|
OBJ_PROFILE_GENERATE=$(addprefix $(OBJECT_ROOT_PROFILE_GENERERATE)/,$(OBJS))
|
|
OBJ_PROFILE_USE=$(addprefix $(OBJECT_ROOT_PROFILE_USE)/,$(OBJS))
|
|
|
|
# The build rule for the Stella executable
|
|
$(EXECUTABLE): $(OBJ)
|
|
$(LD) $(LDFLAGS) $(PRE_OBJS_FLAGS) $+ $(POST_OBJS_FLAGS) $(LIBS) $(PROF) -o $@
|
|
|
|
$(EXECUTABLE_PROFILE_GENERATE): $(OBJ_PROFILE_GENERATE)
|
|
$(LD) $(LDFLAGS_PROFILE_GENERATE) $(PRE_OBJS_FLAGS) $+ $(POST_OBJS_FLAGS) $(LIBS) $(PROF) -o $@
|
|
|
|
$(EXECUTABLE_PROFILE_USE): $(OBJ_PROFILE_USE)
|
|
$(LD) $(LDFLAGS) $(PRE_OBJS_FLAGS) $+ $(POST_OBJS_FLAGS) $(LIBS) $(PROF) -o $@
|
|
|
|
distclean: clean
|
|
$(RM_REC) $(DEPDIRS)
|
|
$(RM) build.rules config.h config.mak config.log
|
|
|
|
clean:
|
|
-$(RM) -fr \
|
|
$(OBJECT_ROOT) $(OBJECT_ROOT_PROFILE_GENERERATE) $(OBJECT_ROOT_PROFILE_USE) \
|
|
$(EXECUTABLE) $(EXECUTABLE_PROFILE_GENERATE) $(EXECUTABLE_PROFILE_USE) \
|
|
$(PROFILE_OUT) $(PROFILE_STAMP)
|
|
|
|
.PHONY: all clean dist distclean
|
|
|
|
.SUFFIXES: .cxx
|
|
|
|
define create_dir
|
|
$(MKDIR) -p $(*D)/$(DEPDIR)
|
|
$(MKDIR) -p $(@D)
|
|
endef
|
|
|
|
define merge_dep
|
|
$(ECHO) "$(*D)/" > $(*D)/$(DEPDIR)/$(*F).d
|
|
$(CAT) "$(*D)/$(DEPDIR)/$(*F).d2" >> "$(*D)/$(DEPDIR)/$(*F).d"
|
|
$(RM) "$(*D)/$(DEPDIR)/$(*F).d2"
|
|
endef
|
|
|
|
ifndef CXX_UPDATE_DEP_FLAG
|
|
# If you use GCC, disable the above and enable this for intelligent
|
|
# dependency tracking.
|
|
CXX_UPDATE_DEP_FLAG = -Wp,-MMD,"$(*D)/$(DEPDIR)/$(*F).d2"
|
|
|
|
$(OBJECT_ROOT)/%.o: %.cxx
|
|
$(create_dir)
|
|
$(CXX) $(CXX_UPDATE_DEP_FLAG) $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $@
|
|
$(merge_dep)
|
|
|
|
$(OBJECT_ROOT)/%.o: %.c
|
|
$(create_dir)
|
|
$(CC) $(CXX_UPDATE_DEP_FLAG) $(CFLAGS) $(CPPFLAGS) -c $(<) -o $@
|
|
$(merge_dep)
|
|
|
|
$(OBJECT_ROOT_PROFILE_GENERERATE)/%.pgen.o: %.cxx
|
|
$(create_dir)
|
|
$(CXX) $(CXX_UPDATE_DEP_FLAG) $(CXXFLAGS_PROFILE_GENERATE) $(CPPFLAGS) -c $(<) -o $@
|
|
$(merge_dep)
|
|
|
|
$(OBJECT_ROOT_PROFILE_GENERERATE)/%.pgen.o: %.c
|
|
$(create_dir)
|
|
$(CC) $(CXX_UPDATE_DEP_FLAG) $(CFLAGS_PROFILE_GENERATE) $(CPPFLAGS) -c $(<) -o $@
|
|
$(merge_dep)
|
|
|
|
$(OBJECT_ROOT_PROFILE_USE)/%.pgo.o: %.cxx $(PROFILE_STAMP)
|
|
$(create_dir)
|
|
$(CXX) $(CXX_UPDATE_DEP_FLAG) $(CXXFLAGS_PROFILE_USE) $(CPPFLAGS) -c $(<) -o $@
|
|
$(merge_dep)
|
|
|
|
$(OBJECT_ROOT_PROFILE_USE)/%.pgo.o: %.c $(PROFILE_STAMP)
|
|
$(create_dir)
|
|
$(CC) $(CXX_UPDATE_DEP_FLAG) $(CFLAGS_PROFILE_USE) $(CPPFLAGS) -c $(<) -o $@
|
|
$(merge_dep)
|
|
|
|
else
|
|
# If you even have GCC 3.x, you can use this build rule, which is safer; the above
|
|
# rule can get you into a bad state if you Ctrl-C at the wrong moment.
|
|
# Also, with this GCC inserts additional dummy rules for the involved headers,
|
|
# which ensures a smooth compilation even if said headers become obsolete.
|
|
$(OBJECT_ROOT)/%.o: %.cxx
|
|
$(create_dir)
|
|
$(CXX) $(CXX_UPDATE_DEP_FLAG) $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $@
|
|
|
|
$(OBJECT_ROOT)/%.o: %.c
|
|
$(create_dir)
|
|
$(CC) $(CXX_UPDATE_DEP_FLAG) $(CFLAGS) $(CPPFLAGS) -c $(<) -o $@
|
|
|
|
$(OBJECT_ROOT_PROFILE_GENERERATE)/%.o: %.cxx
|
|
$(create_dir)
|
|
$(CXX) $(CXX_UPDATE_DEP_FLAG) $(CXXFLAGS_PROFILE_GENERATE) $(CPPFLAGS) -c $(<) -o $@
|
|
|
|
$(OBJECT_ROOT_PROFILE_GENERERATE)/%.o: %.c
|
|
$(create_dir)
|
|
$(CC) $(CXX_UPDATE_DEP_FLAG) $(CFLAGS_PROFILE_GENERATE) $(CPPFLAGS) -c $(<) -o $@
|
|
|
|
$(OBJECT_ROOT_PROFILE_USE)/%.o: %.cxx $(PROFILE_STAMP)
|
|
$(create_dir)
|
|
$(CXX) $(CXX_UPDATE_DEP_FLAG) $(CXXFLAGS_PROFILE_USE) $(CPPFLAGS) -c $(<) -o $@
|
|
|
|
$(OBJECT_ROOT_PROFILE_USE)/%.o: %.c $(PROFILE_STAMP)
|
|
$(create_dir)
|
|
$(CC) $(CXX_UPDATE_DEP_FLAG) $(CFLAGS_PROFILE_USE) $(CPPFLAGS) -c $(<) -o $@
|
|
|
|
endif
|
|
|
|
# Include the dependency tracking files. We add /dev/null at the end
|
|
# of the list to avoid a warning/error if no .d file exist
|
|
-include $(wildcard $(addsuffix /*.d,$(DEPDIRS))) /dev/null
|
|
|
|
$(PROFILE_STAMP): $(EXECUTABLE_PROFILE_GENERATE)
|
|
-rm -fr $(PROFILE_OUT)
|
|
$(STELLA_PROFILE_GENERATE)
|
|
touch $(PROFILE_STAMP)
|
|
|
|
# check if configure has been run or has been changed since last run
|
|
config.mak: $(srcdir)/configure
|
|
@echo "You need to run ./configure before you can run make"
|
|
@echo "Either you haven't run it before or it has changed."
|
|
@exit 1
|
|
|
|
install: all
|
|
$(INSTALL) -d "$(DESTDIR)$(BINDIR)"
|
|
$(INSTALL) -c -m 755 "$(srcdir)/stella$(EXEEXT)" "$(DESTDIR)$(BINDIR)/stella$(EXEEXT)"
|
|
$(INSTALL) -d "$(DESTDIR)$(DOCDIR)"
|
|
$(INSTALL) -c -m 644 "$(srcdir)/Announce.txt" "$(srcdir)/Changes.txt" "$(srcdir)/Copyright.txt" "$(srcdir)/License.txt" "$(srcdir)/README-SDL.txt" "$(srcdir)/README.md" "$(srcdir)/Todo.txt" "$(srcdir)/docs/index.html" "$(srcdir)/docs/debugger.html" "$(DESTDIR)$(DOCDIR)/"
|
|
$(INSTALL) -d "$(DESTDIR)$(DOCDIR)/graphics"
|
|
$(INSTALL) -c -m 644 $(wildcard $(srcdir)/docs/graphics/*.png) "$(DESTDIR)$(DOCDIR)/graphics"
|
|
$(INSTALL) -d "$(DESTDIR)$(DATADIR)/applications"
|
|
$(INSTALL) -c -m 644 "$(srcdir)/src/os/unix/stella.desktop" "$(DESTDIR)$(DATADIR)/applications"
|
|
$(INSTALL) -d "$(DESTDIR)$(DATADIR)/icons/hicolor/16x16/apps"
|
|
$(INSTALL) -d "$(DESTDIR)$(DATADIR)/icons/hicolor/22x22/apps"
|
|
$(INSTALL) -d "$(DESTDIR)$(DATADIR)/icons/hicolor/24x24/apps"
|
|
$(INSTALL) -d "$(DESTDIR)$(DATADIR)/icons/hicolor/32x32/apps"
|
|
$(INSTALL) -d "$(DESTDIR)$(DATADIR)/icons/hicolor/48x48/apps"
|
|
$(INSTALL) -d "$(DESTDIR)$(DATADIR)/icons/hicolor/64x64/apps"
|
|
$(INSTALL) -d "$(DESTDIR)$(DATADIR)/icons/hicolor/128x128/apps"
|
|
$(INSTALL) -c -m 644 "$(srcdir)/src/common/stella-16x16.png" "$(DESTDIR)$(DATADIR)/icons/hicolor/16x16/apps/stella.png"
|
|
$(INSTALL) -c -m 644 "$(srcdir)/src/common/stella-22x22.png" "$(DESTDIR)$(DATADIR)/icons/hicolor/22x22/apps/stella.png"
|
|
$(INSTALL) -c -m 644 "$(srcdir)/src/common/stella-24x24.png" "$(DESTDIR)$(DATADIR)/icons/hicolor/24x24/apps/stella.png"
|
|
$(INSTALL) -c -m 644 "$(srcdir)/src/common/stella-32x32.png" "$(DESTDIR)$(DATADIR)/icons/hicolor/32x32/apps/stella.png"
|
|
$(INSTALL) -c -m 644 "$(srcdir)/src/common/stella-48x48.png" "$(DESTDIR)$(DATADIR)/icons/hicolor/48x48/apps/stella.png"
|
|
$(INSTALL) -c -m 644 "$(srcdir)/src/common/stella-64x64.png" "$(DESTDIR)$(DATADIR)/icons/hicolor/64x64/apps/stella.png"
|
|
$(INSTALL) -c -m 644 "$(srcdir)/src/common/stella-128x128.png" "$(DESTDIR)$(DATADIR)/icons/hicolor/128x128/apps/stella.png"
|
|
|
|
install-strip: install
|
|
$(STRIP) stella$(EXEEXT)
|
|
|
|
uninstall:
|
|
rm -f "$(DESTDIR)$(BINDIR)/stella$(EXEEXT)"
|
|
rm -rf "$(DESTDIR)$(DOCDIR)/"
|
|
rm -f "$(DESTDIR)$(DATADIR)/applications/stella.desktop"
|
|
rm -f "$(DESTDIR)$(DATADIR)/icons/hicolor/16x16/apps/stella.png"
|
|
rm -f "$(DESTDIR)$(DATADIR)/icons/hicolor/22x22/apps/stella.png"
|
|
rm -f "$(DESTDIR)$(DATADIR)/icons/hicolor/24x24/apps/stella.png"
|
|
rm -f "$(DESTDIR)$(DATADIR)/icons/hicolor/32x32/apps/stella.png"
|
|
rm -f "$(DESTDIR)$(DATADIR)/icons/hicolor/48x48/apps/stella.png"
|
|
rm -f "$(DESTDIR)$(DATADIR)/icons/hicolor/64x64/apps/stella.png"
|
|
rm -f "$(DESTDIR)$(DATADIR)/icons/hicolor/128x128/apps/stella.png"
|
|
|
|
# Special rule for M6502.ins, generated from m4 (there's probably a better way to do this ...)
|
|
src/emucore/M6502.ins: src/emucore/M6502.m4
|
|
m4 src/emucore/M6502.m4 > src/emucore/M6502.ins
|
|
|
|
# Special rule for windows icon stuff (there's probably a better way to do this ...)
|
|
src/os/windows/stella_icon.o: src/os/windows/stella.ico src/os/windows/stella.rc
|
|
windres --include-dir src/os/windows src/os/windows/stella.rc src/os/windows/stella_icon.o
|
|
|
|
.PHONY: deb bundle test install uninstall
|