Cataclysm-DDA/Makefile

1277 lines
37 KiB
Makefile

# vim: set expandtab tabstop=4 softtabstop=2 shiftwidth=2:
# Platforms:
# Linux/Cygwin native
# (don't need to do anything)
# Linux 64-bit
# make NATIVE=linux64
# Linux 32-bit
# make NATIVE=linux32
# Linux cross-compile to Win32
# make CROSS=i686-pc-mingw32-
# or make CROSS=i586-mingw32msvc-
# or whichever prefix your crosscompiler uses
# as long as its name contains mingw32
# Linux cross-compile to OSX with osxcross
# make CROSS=x86_64-apple-darwin15-
# NATIVE=osx
# CLANG=1
# OSXCROSS=1
# LIBSDIR=../libs
# FRAMEWORKSDIR=../Frameworks
# Win32 (non-Cygwin)
# Run: make NATIVE=win32
# OS X
# Run: make NATIVE=osx OSX_MIN=10.12
# It is highly recommended to supply OSX_MIN > 10.11
# otherwise optimizations are automatically disabled with -O0
# Build types:
# Debug (no optimizations)
# Default
# ccache (use compilation caches)
# make CCACHE=1
# Release (turn on optimizations)
# make RELEASE=1
# Tiles (uses SDL rather than ncurses)
# make TILES=1
# Sound (requires SDL, so TILES must be enabled)
# make TILES=1 SOUND=1
# Disable gettext, on some platforms the dependencies are hard to wrangle.
# make LOCALIZE=0
# Disable backtrace support, not available on all platforms
# make BACKTRACE=0
# Use libbacktrace. Only has effect if BACKTRACE=1. (currently only for MinGW and Linux builds)
# make LIBBACKTRACE=1
# Compile localization files for specified languages
# make localization LANGUAGES="<lang_id_1>[ lang_id_2][ ...]"
# (for example: make LANGUAGES="zh_CN zh_TW" for Chinese)
# make localization LANGUAGES=all
# (for every .po file in lang/po)
# Enable sanitizer (address, undefined, etc.)
# make SANITIZE=address
# Enable the string id debugging helper
# make STRING_ID_DEBUG=1
# Adjust names of build artifacts (for example to allow easily toggling between build types).
# make BUILD_PREFIX="release-"
# Generate a build artifact prefix from the other build flags.
# make AUTO_BUILD_PREFIX=1
# Install to system directories.
# make install
# Install to $DIR ($DIR will contain bin and share directories).
# make PREFIX=$DIR
# make PREFIX=$DIR install
# Use user's XDG base directories for save files and configs.
# make USE_XDG_DIR=1
# Use user's home directory for save files.
# make USE_HOME_DIR=1
# Use dynamic linking (requires system libraries).
# make DYNAMIC_LINKING=1
# Use MSYS2 as the build environment on Windows
# make MSYS2=1
# Turn off all optimizations, even debug-friendly optimizations
# make NOOPT=1
# Astyle all source files.
# make astyle
# Astyle all source files as fast as possible.
# make astyle-fast
# Check if source files are styled properly.
# make astyle-check
# Style the whitelisted json files (maintain the current level of styling).
# make style-json
# Style all json files using the current rules (don't PR this, it's too many changes at once).
# make style-all-json
# Style all json files in parallel using all available CPU cores (don't make -jX on this, just make)
# make style-all-json-parallel
# Disable astyle of source files.
# make ASTYLE=0
# Disable format check of whitelisted json files.
# make LINTJSON=0
# Disable building and running tests.
# make RUNTESTS=0
# comment these to toggle them as one sees fit.
# DEBUG is best turned on if you plan to debug in gdb -- please do!
# PROFILE is for use with gprof or a similar program -- don't bother generally.
# RELEASE_FLAGS is flags for release builds.
RELEASE_FLAGS =
WARNINGS = \
-Werror -Wall -Wextra \
-Wformat-signedness \
-Wlogical-op \
-Wmissing-declarations \
-Wmissing-noreturn \
-Wnon-virtual-dtor \
-Wold-style-cast \
-Woverloaded-virtual \
-Wpedantic \
-Wsuggest-override \
-Wunused-macros \
-Wzero-as-null-pointer-constant \
-Wno-unknown-warning-option
# Uncomment below to disable warnings
#WARNINGS = -w
DEBUGSYMS = -g
#PROFILE = -pg
#OTHERS = -O3
#DEFINES = -DNDEBUG
# Tells ccache to keep comments, as they can be meaningful to the compiler (as to suppress warnings).
export CCACHE_COMMENTS=1
# Disable debug. Comment this out to get logging.
#DEFINES = -DENABLE_LOGGING
# Limit debug to level. Comment out all for all levels.
#DEFINES += -DDEBUG_INFO
#DEFINES += -DDEBUG_WARNING
#DEFINES += -DDEBUG_ERROR
#DEFINES += -DDEBUG_PEDANTIC_INFO
# Limit debug to section. Comment out all for all levels.
#DEFINES += -DDEBUG_ENABLE_MAIN
#DEFINES += -DDEBUG_ENABLE_MAP
#DEFINES += -DDEBUG_ENABLE_MAP_GEN
#DEFINES += -DDEBUG_ENABLE_GAME
# Explicitly let 'char' to be 'signed char' to fix #18776
OTHERS += -fsigned-char
VERSION = 0.F
TARGET_NAME = cataclysm
TILES_TARGET_NAME = $(TARGET_NAME)-tiles
TARGET = $(BUILD_PREFIX)$(TARGET_NAME)
TILESTARGET = $(BUILD_PREFIX)$(TILES_TARGET_NAME)
ifeq ($(TILES), 1)
APPTARGET = $(TILESTARGET)
else
APPTARGET = $(TARGET)
endif
W32TILESTARGET = $(BUILD_PREFIX)$(TILES_TARGET_NAME).exe
W32TARGET = $(BUILD_PREFIX)$(TARGET_NAME).exe
CHKJSON_BIN = $(BUILD_PREFIX)chkjson
BINDIST_DIR = $(BUILD_PREFIX)bindist
BUILD_DIR = $(CURDIR)
SRC_DIR = src
LOCALIZE = 1
ASTYLE_BINARY = astyle
# Enable debug by default
ifndef RELEASE
RELEASE = 0
endif
# Enable astyle by default
ifndef ASTYLE
ASTYLE = 1
endif
# Enable json format check by default
ifndef LINTJSON
LINTJSON = 1
endif
# Enable running tests by default
ifndef RUNTESTS
RUNTESTS = 1
endif
ifndef PCH
PCH = 1
endif
ifndef GOLD
ifeq ($(LTO), 1)
GOLD = 1
else
GOLD = 0
endif
endif
# Auto-detect MSYS2
ifdef MSYSTEM
MSYS2 = 1
endif
ifneq (,$(findstring clang,$(COMPILER)))
CLANG = $(COMPILER)
endif
# Windows sets the OS environment variable so we can cheaply test for it.
ifneq (,$(findstring Windows_NT,$(OS)))
IS_WINDOWS_HOST = 1
else
IS_WINDOWS_HOST = 0
endif
OS = $(shell uname -s)
ifneq ($(findstring Darwin,$(OS)),)
ifndef NATIVE
NATIVE = osx
endif
ifndef CLANG
CLANG = 1
endif
endif
# Default to disabling clang
ifndef CLANG
CLANG = 0
endif
# Determine JSON formatter binary name
JSON_FORMATTER_BIN=tools/format/json_formatter.cgi
ifeq ($(MSYS2), 1)
JSON_FORMATTER_BIN=tools/format/json_formatter.exe
endif
ifneq (,$(findstring mingw32,$(CROSS)))
JSON_FORMATTER_BIN=tools/format/json_formatter.exe
endif
# Enable backtrace by default
ifndef BACKTRACE
# ...except not on native Windows builds, because the relevant headers are
# probably not available
ifneq ($(MSYS2), 1)
BACKTRACE = 1
endif
endif
ifeq ($(BACKTRACE), 1)
# Also enable libbacktrace on cross-compilation to Windows
ifndef LIBBACKTRACE
ifneq (,$(findstring mingw32,$(CROSS)))
LIBBACKTRACE = 1
endif
endif
endif
ifeq ($(RUNTESTS), 1)
TESTS = tests
endif
# tiles object directories are because gcc gets confused
# Appears that the default value of $LD is unsuitable on most systems
# when preprocessor defines change, but the source doesn't
ODIR = $(BUILD_PREFIX)obj
ODIRTILES = $(BUILD_PREFIX)obj/tiles
W32ODIR = $(BUILD_PREFIX)objwin
W32ODIRTILES = $(W32ODIR)/tiles
ifdef AUTO_BUILD_PREFIX
BUILD_PREFIX = $(if $(RELEASE),release-)$(if $(DEBUG_SYMBOLS),symbol-)$(if $(TILES),tiles-)$(if $(SOUND),sound-)$(if $(LOCALIZE),local-)$(if $(BACKTRACE),back-$(if $(LIBBACKTRACE),libbacktrace-))$(if $(SANITIZE),sanitize-)$(if $(USE_XDG_DIR),xdg-)$(if $(USE_HOME_DIR),home-)$(if $(DYNAMIC_LINKING),dynamic-)$(if $(MSYS2),msys2-)
export BUILD_PREFIX
endif
# if $(OS) contains 'BSD'
ifneq ($(findstring BSD,$(OS)),)
BSD = 1
endif
ifeq ($(PCH), 1)
CCACHEBIN = CCACHE_SLOPPINESS=pch_defines,time_macros,include_file_ctime,include_file_mtime ccache
else
CCACHEBIN = ccache
endif
ifeq ($(STRING_ID_DEBUG), 1)
DEFINES += -DCATA_STRING_ID_DEBUGGING
endif
# This sets CXX and so must be up here
ifneq ($(CLANG), 0)
# Allow setting specific CLANG version
ifeq ($(CLANG), 1)
CLANGCMD = clang++
else
CLANGCMD = $(CLANG)
endif
ifeq ($(NATIVE), osx)
USE_LIBCXX = 1
endif
ifeq ($(BSD), 1)
ifndef USE_LIBCXX
USE_LIBCXX = 1
endif
endif
ifdef USE_LIBCXX
OTHERS += -stdlib=libc++
LDFLAGS += -stdlib=libc++
endif
ifeq ($(CCACHE), 1)
CXX = CCACHE_CPP2=1 $(CCACHEBIN) $(CROSS)$(CLANGCMD)
LD = CCACHE_CPP2=1 $(CCACHEBIN) $(CROSS)$(CLANGCMD)
else
CXX = $(CROSS)$(CLANGCMD)
LD = $(CROSS)$(CLANGCMD)
endif
else
# Compiler version & target machine - used later for MXE ICE workaround
ifdef CROSS
CXXVERSION := $(shell $(CROSS)$(CXX) --version | grep -i gcc | sed 's/^.* //g')
CXXMACHINE := $(shell $(CROSS)$(CXX) -dumpmachine)
endif
# Expand at reference time to avoid recursive reference
ifneq ($(COMPILER),)
OS_COMPILER := $(COMPILER)
OS_LINKER := $(COMPILER)
else
OS_COMPILER := $(CXX)
OS_LINKER := $(CXX)
endif
# Appears that the default value of $LD is unsuitable on most systems
ifeq ($(CCACHE), 1)
CXX = $(CCACHEBIN) $(CROSS)$(OS_COMPILER)
LD = $(CCACHEBIN) $(CROSS)$(OS_LINKER)
else
CXX = $(CROSS)$(OS_COMPILER)
LD = $(CROSS)$(OS_LINKER)
endif
endif
STRIP = $(CROSS)strip
RC = $(CROSS)windres
AR = $(CROSS)ar
LDFLAGS += $(PROFILE)
ifneq ($(SANITIZE),)
SANITIZE_FLAGS := -fsanitize=$(SANITIZE) -fno-sanitize-recover=all -fno-omit-frame-pointer
CXXFLAGS += $(SANITIZE_FLAGS)
LDFLAGS += $(SANITIZE_FLAGS)
endif
# enable optimizations. slow to build
ifeq ($(RELEASE), 1)
ifeq ($(NATIVE), osx)
ifeq ($(shell $(CXX) -E -Os - < /dev/null > /dev/null 2>&1 && echo fos),fos)
OPTLEVEL = -Os
else
OPTLEVEL = -O3
endif
else
# MXE ICE Workaround
# known bad on 4.9.3 and 4.9.4, if it gets fixed this could include a version test too
ifeq ($(CXXMACHINE), x86_64-w64-mingw32.static)
OPTLEVEL = -O3
else
OPTLEVEL = -Os
endif
endif
ifeq ($(LTO), 1)
ifneq ($(CLANG), 0)
# LLVM's LTO will complain if the optimization level isn't between O0 and
# O3 (inclusive)
OPTLEVEL = -O3
endif
endif
CXXFLAGS += $(OPTLEVEL)
ifeq ($(LTO), 1)
ifeq ($(NATIVE), osx)
ifneq ($(CLANG), 0)
LTOFLAGS += -flto=full
endif
else
ifeq ($(GOLD), 1)
LDFLAGS += -fuse-ld=gold # This breaks in OS X because gold can only produce ELF binaries, not Mach
endif
endif
ifneq ($(CLANG), 0)
LTOFLAGS += -flto
else
LTOFLAGS += -flto=jobserver -flto-odr-type-merging
endif
endif
LTOFLAGS += -Wodr
CXXFLAGS += $(LTOFLAGS)
# OTHERS += -mmmx -m3dnow -msse -msse2 -msse3 -mfpmath=sse -mtune=native
# OTHERS += -march=native # Uncomment this to build an optimized binary for your machine only
# Strip symbols, generates smaller executable.
OTHERS += $(RELEASE_FLAGS)
DEBUG =
ifndef DEBUG_SYMBOLS
ifeq ($(LIBBACKTRACE), 1)
DEBUGSYMS = -g1
else
DEBUGSYMS =
endif
endif
DEFINES += -DRELEASE
# Check for astyle or JSON regressions on release builds.
ifeq ($(ASTYLE), 1)
CHECKS += astyle-check
endif
ifeq ($(LINTJSON), 1)
CHECKS += style-json
endif
else
ifeq ($(NOOPT), 1)
# While gcc claims to include all information required for
# debugging at -Og, at least with gcc 8.3, control flow
# doesn't move line-by-line at -Og. Provide a command-line
# way to turn off optimization (make NOOPT=1) entirely.
OPTLEVEL = -O0
else
ifeq ($(shell $(CXX) -E -Og - < /dev/null > /dev/null 2>&1 && echo fog),fog)
OPTLEVEL = -Og
else
OPTLEVEL = -O0
endif
endif
CXXFLAGS += $(OPTLEVEL)
endif
ifeq ($(shell sh -c 'uname -o 2>/dev/null || echo not'),Cygwin)
OTHERS += -std=gnu++14
else
OTHERS += -std=c++14
endif
ifeq ($(CYGWIN),1)
WARNINGS += -Wimplicit-fallthrough=0
endif
ifeq ($(PCH), 1)
PCHFLAGS = -Winvalid-pch
PCH_H = pch/main-pch.hpp
ifeq ($(CLANG), 0)
PCHFLAGS += -include pch/main-pch.hpp
PCH_P = $(PCH_H).gch
else
PCH_P = $(PCH_H).pch
PCHFLAGS += -include-pch $(PCH_P)
# FIXME: dirty hack ahead
# ccache won't wort with clang unless it supports -fno-pch-timestamp
ifeq ($(CCACHE), 1)
CLANGVER := $(shell echo 'int main(void){return 0;}'|$(CXX) -Xclang -fno-pch-timestamp -x c++ -o _clang_ver.o -c - 2>&1 || echo fail)
ifneq ($(CLANGVER),)
PCHFLAGS = ""
PCH_H = ""
PCH_P = ""
PCH = 0
$(warning your clang version does not support -fno-pch-timestamp: $(CLANGVER) ($(.SHELLSTATUS)))
else
CXXFLAGS += -Xclang -fno-pch-timestamp
endif
endif
endif
endif
CPPFLAGS += -Isrc -isystem ${SRC_DIR}/third-party
CXXFLAGS += $(WARNINGS) $(DEBUG) $(DEBUGSYMS) $(PROFILE) $(OTHERS)
TOOL_CXXFLAGS = -DCATA_IN_TOOL
BINDIST_EXTRAS += README.md data doc LICENSE.txt LICENSE-OFL-Terminus-Font.txt VERSION.txt $(JSON_FORMATTER_BIN)
BINDIST = $(BUILD_PREFIX)cataclysmdda-$(VERSION).tar.gz
W32BINDIST = $(BUILD_PREFIX)cataclysmdda-$(VERSION).zip
BINDIST_CMD = tar --transform=s@^$(BINDIST_DIR)@cataclysmdda-$(VERSION)@ -czvf $(BINDIST) $(BINDIST_DIR)
W32BINDIST_CMD = cd $(BINDIST_DIR) && zip -r ../$(W32BINDIST) * && cd $(BUILD_DIR)
# Check if called without a special build target
ifeq ($(NATIVE),)
ifeq ($(CROSS),)
ifeq ($(shell sh -c 'uname -o 2>/dev/null || echo not'),Cygwin)
DEFINES += -DCATA_NO_CPP11_STRING_CONVERSIONS
TARGETSYSTEM=CYGWIN
else
TARGETSYSTEM=LINUX
endif
endif
endif
# Linux 64-bit
ifeq ($(NATIVE), linux64)
CXXFLAGS += -m64
LDFLAGS += -m64
TARGETSYSTEM=LINUX
ifeq ($(GOLD), 1)
CXXFLAGS += -fuse-ld=gold
LDFLAGS += -fuse-ld=gold -Wl,--detect-odr-violations
endif
else
# Linux 32-bit
ifeq ($(NATIVE), linux32)
CXXFLAGS += -m32
LDFLAGS += -m32
TARGETSYSTEM=LINUX
ifeq ($(GOLD), 1)
CXXFLAGS += -fuse-ld=gold
LDFLAGS += -fuse-ld=gold -Wl,--detect-odr-violations
endif
endif
endif
# OSX
ifeq ($(NATIVE), osx)
ifeq ($(OSX_MIN),)
ifneq ($(findstring Darwin,$(OS)),)
OSX_MIN = $(shell sw_vers -productVersion | awk -F '.' '{print $$1 "." $$2}')
else
ifneq ($(CLANG), 0)
ifneq ($(SANITIZE),)
# sanitizers does not function properly (e.g. false positive errors) if OSX_MIN < 10.9
# https://github.com/llvm/llvm-project/blob/release/11.x/compiler-rt/CMakeLists.txt#L183
OSX_MIN = 10.9
else
OSX_MIN = 10.7
endif
else
OSX_MIN = 10.5
endif
endif
endif
DEFINES += -DMACOSX
CXXFLAGS += -mmacosx-version-min=$(OSX_MIN)
LDFLAGS += -mmacosx-version-min=$(OSX_MIN) -framework CoreFoundation -Wl,-headerpad_max_install_names
ifdef FRAMEWORK
ifeq ($(FRAMEWORKSDIR),)
FRAMEWORKSDIR := $(strip $(if $(shell [ -d $(HOME)/Library/Frameworks ] && echo 1), \
$(if $(shell find $(HOME)/Library/Frameworks -name 'SDL2.*'), \
$(HOME)/Library/Frameworks,),))
endif
ifeq ($(FRAMEWORKSDIR),)
FRAMEWORKSDIR := $(strip $(if $(shell find /Library/Frameworks -name 'SDL2.*'), \
/Library/Frameworks,))
endif
ifeq ($(FRAMEWORKSDIR),)
$(error "SDL2 framework not found")
endif
endif
ifeq ($(LOCALIZE), 1)
ifeq ($(MACPORTS), 1)
ifneq ($(TILES), 1)
CXXFLAGS += -I$(shell ncursesw6-config --includedir)
LDFLAGS += -L$(shell ncursesw6-config --libdir)
endif
endif
endif
TARGETSYSTEM=LINUX
ifneq ($(OS), Linux)
BINDIST_CMD = tar -s"@^$(BINDIST_DIR)@cataclysmdda-$(VERSION)@" -czvf $(BINDIST) $(BINDIST_DIR)
endif
endif
# Win32 (MinGW32 or MinGW-w64(32bit)?)
ifeq ($(NATIVE), win32)
# Any reason not to use -m32 on MinGW32?
TARGETSYSTEM=WINDOWS
else
# Win64 (MinGW-w64?)
ifeq ($(NATIVE), win64)
CXXFLAGS += -m64
LDFLAGS += -m64
TARGETSYSTEM=WINDOWS
endif
endif
# MSYS2
ifeq ($(MSYS2), 1)
TARGETSYSTEM=WINDOWS
endif
# Cygwin
ifeq ($(NATIVE), cygwin)
TARGETSYSTEM=CYGWIN
endif
# MXE cross-compile to win32
ifneq (,$(findstring mingw32,$(CROSS)))
DEFINES += -DCROSS_LINUX
TARGETSYSTEM=WINDOWS
endif
ifneq ($(TARGETSYSTEM),WINDOWS)
WARNINGS += -Wredundant-decls
endif
# Global settings for Windows targets
ifeq ($(TARGETSYSTEM),WINDOWS)
DEFINES += -DWIN32_LEAN_AND_MEAN
CHKJSON_BIN = chkjson.exe
TARGET = $(W32TARGET)
BINDIST = $(W32BINDIST)
BINDIST_CMD = $(W32BINDIST_CMD)
ODIR = $(W32ODIR)
ifeq ($(DYNAMIC_LINKING), 1)
# Windows isn't sold with programming support, these are static to remove MinGW dependency.
LDFLAGS += -static-libgcc -static-libstdc++
else
LDFLAGS += -static
endif
W32FLAGS += -Wl,-stack,12000000,-subsystem,windows
RFLAGS = -J rc -O coff
ifeq ($(NATIVE), win64)
RFLAGS += -F pe-x86-64
endif
endif
ifeq ($(shell git rev-parse --is-inside-work-tree),true)
# We have a git repository, use git version
DEFINES += -DGIT_VERSION
endif
PKG_CONFIG = $(CROSS)pkg-config
ifeq ($(SOUND), 1)
ifneq ($(TILES),1)
$(error "SOUND=1 only works with TILES=1")
endif
ifeq ($(NATIVE),osx)
ifdef FRAMEWORK
CXXFLAGS += -I$(FRAMEWORKSDIR)/SDL2_mixer.framework/Headers
LDFLAGS += -F$(FRAMEWORKSDIR)/SDL2_mixer.framework/Frameworks \
-framework SDL2_mixer -framework Vorbis -framework Ogg
else # libsdl build
ifeq ($(MACPORTS), 1)
LDFLAGS += -lSDL2_mixer -lvorbisfile -lvorbis -logg
else # homebrew
CXXFLAGS += $(shell $(PKG_CONFIG) --cflags SDL2_mixer)
LDFLAGS += $(shell $(PKG_CONFIG) --libs SDL2_mixer)
LDFLAGS += -lvorbisfile -lvorbis -logg
endif
endif
else # not osx
CXXFLAGS += $(shell $(PKG_CONFIG) --cflags SDL2_mixer)
LDFLAGS += $(shell $(PKG_CONFIG) --libs SDL2_mixer)
LDFLAGS += -lpthread
endif
ifeq ($(MSYS2),1)
LDFLAGS += -lmpg123 -lshlwapi -lvorbisfile -lvorbis -logg -lflac
endif
CXXFLAGS += -DSDL_SOUND
endif
ifeq ($(SDL), 1)
TILES = 1
endif
ifeq ($(TILES), 1)
SDL = 1
BINDIST_EXTRAS += gfx
ifeq ($(NATIVE),osx)
ifdef FRAMEWORK
OSX_INC = -F$(FRAMEWORKSDIR) \
-I$(FRAMEWORKSDIR)/SDL2.framework/Headers \
-I$(FRAMEWORKSDIR)/SDL2_image.framework/Headers \
-I$(FRAMEWORKSDIR)/SDL2_ttf.framework/Headers
ifdef SOUND
OSX_INC += -I$(FRAMEWORKSDIR)/SDL2_mixer.framework/Headers
endif
LDFLAGS += -F$(FRAMEWORKSDIR) \
-framework SDL2 -framework SDL2_image -framework SDL2_ttf -framework Cocoa
ifdef SOUND
LDFLAGS += -framework SDL2_mixer
endif
CXXFLAGS += $(OSX_INC)
else # libsdl build
DEFINES += -DOSX_SDL2_LIBS
# handle #include "SDL2/SDL.h" and "SDL.h"
CXXFLAGS += $(shell sdl2-config --cflags) \
-I$(shell dirname $(shell sdl2-config --cflags | sed 's/-I\(.[^ ]*\) .*/\1/'))
LDFLAGS += -framework Cocoa $(shell sdl2-config --libs) -lSDL2_ttf
LDFLAGS += -lSDL2_image
ifdef SOUND
LDFLAGS += -lSDL2_mixer
endif
endif
else # not osx
CXXFLAGS += $(shell $(PKG_CONFIG) --cflags sdl2 SDL2_image SDL2_ttf)
ifeq ($(STATIC), 1)
LDFLAGS += $(shell $(PKG_CONFIG) sdl2 --static --libs)
else
LDFLAGS += $(shell $(PKG_CONFIG) sdl2 --libs)
endif
LDFLAGS += -lSDL2_ttf -lSDL2_image
# We don't use SDL_main -- we have proper main()/WinMain()
CXXFLAGS := $(filter-out -Dmain=SDL_main,$(CXXFLAGS))
LDFLAGS := $(filter-out -lSDL2main,$(LDFLAGS))
endif
DEFINES += -DTILES
ifeq ($(TARGETSYSTEM),WINDOWS)
ifndef DYNAMIC_LINKING
# These differ depending on what SDL2 is configured to use.
ifneq (,$(findstring mingw32,$(CROSS)))
# We use pkg-config to find out which libs are needed with MXE
LDFLAGS += $(shell $(PKG_CONFIG) --libs SDL2_image SDL2_ttf)
else
ifeq ($(MSYS2),1)
LDFLAGS += -Wl,--start-group -lharfbuzz -lfreetype -Wl,--end-group -lgraphite2 -lpng -lz -ltiff -lbz2 -lglib-2.0 -llzma -lws2_32 -lwebp -ljpeg -luuid
else
LDFLAGS += -lfreetype -lpng -lz -ljpeg -lbz2
endif
endif
else
# Currently none needed by the game itself (only used by SDL2 layer).
# Placeholder for future use (savegame compression, etc).
LDFLAGS +=
endif
TARGET = $(W32TILESTARGET)
ODIR = $(W32ODIRTILES)
else
TARGET = $(TILESTARGET)
ODIR = $(ODIRTILES)
endif
else
NCURSES_PREFIX = ncursesw
# ONLY when not cross-compiling, check for pkg-config or ncurses5-config
# When doing a cross-compile, we can't rely on the host machine's -configs
ifeq ($(CROSS),)
ifeq ($(OSXCROSS),)
ifneq ($(shell pkg-config --libs $(NCURSES_PREFIX) 2>/dev/null),)
HAVE_PKGCONFIG = 1
endif
ifneq ($(shell which $(NCURSES_PREFIX)5-config 2>/dev/null),)
HAVE_NCURSES5CONFIG = 1
endif
endif
endif
# Link to ncurses if we're using a non-tiles, Linux build
ifeq ($(HAVE_PKGCONFIG),1)
CXXFLAGS += $(shell $(PKG_CONFIG) --cflags $(NCURSES_PREFIX))
LDFLAGS += $(shell $(PKG_CONFIG) --libs $(NCURSES_PREFIX))
else
ifeq ($(HAVE_NCURSES5CONFIG),1)
CXXFLAGS += $(shell $(NCURSES_PREFIX)5-config --cflags)
LDFLAGS += $(shell $(NCURSES_PREFIX)5-config --libs)
else
ifneq ($(TARGETSYSTEM),WINDOWS)
LDFLAGS += -l$(NCURSES_PREFIX)
endif
ifdef OSXCROSS
LDFLAGS += -L$(LIBSDIR)/$(NCURSES_PREFIX)/lib
CXXFLAGS += -I$(LIBSDIR)/$(NCURSES_PREFIX)/include
endif # OSXCROSS
endif # HAVE_NCURSES5CONFIG
endif # HAVE_PKGCONFIG
endif # TILES
ifeq ($(BSD), 1)
# BSDs have backtrace() and friends in a separate library
ifeq ($(BACKTRACE), 1)
LDFLAGS += -lexecinfo
# ...which requires the frame pointer
CXXFLAGS += -fno-omit-frame-pointer
endif
# libexecinfo may be located in /usr/local on BSD
CXXFLAGS += -I/usr/local/include
LDFLAGS += -L/usr/local/lib
endif
# Global settings for Windows targets (at end)
ifeq ($(TARGETSYSTEM),WINDOWS)
LDFLAGS += -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lversion
ifeq ($(BACKTRACE),1)
LDFLAGS += -ldbghelp
endif
endif
ifeq ($(BACKTRACE),1)
DEFINES += -DBACKTRACE
ifeq ($(LIBBACKTRACE),1)
DEFINES += -DLIBBACKTRACE
LDFLAGS += -lbacktrace
endif
endif
ifeq ($(LOCALIZE),1)
DEFINES += -DLOCALIZE
LOCALIZE_TEST_DEPS = localization $(TEST_MO)
endif
ifeq ($(TARGETSYSTEM),LINUX)
BINDIST_EXTRAS += cataclysm-launcher
ifeq ($(BACKTRACE),1)
# -rdynamic needed for symbols in backtraces
LDFLAGS += -rdynamic
endif
endif
ifeq ($(TARGETSYSTEM),CYGWIN)
BINDIST_EXTRAS += cataclysm-launcher
DEFINES += -D_GLIBCXX_USE_C99_MATH_TR1
endif
ifeq ($(MSYS2),1)
DEFINES += -D_GLIBCXX_USE_C99_MATH_TR1
CXXFLAGS += -DMSYS2
endif
# Enumerations of all the source files and headers.
SOURCES := $(wildcard $(SRC_DIR)/*.cpp)
THIRD_PARTY_SOURCES := $(wildcard $(SRC_DIR)/third-party/flatbuffers/*.cpp)
HEADERS := $(wildcard $(SRC_DIR)/*.h)
TESTSRC := $(wildcard tests/*.cpp)
TESTHDR := $(wildcard tests/*.h)
JSON_FORMATTER_SOURCES := $(wildcard tools/format/*.cpp) src/json.cpp
JSON_FORMATTER_HEADERS := $(wildcard tools/format/*.h)
CHKJSON_SOURCES := $(wildcard src/chkjson/*.cpp) src/json.cpp
CLANG_TIDY_PLUGIN_SOURCES := \
$(wildcard tools/clang-tidy-plugin/*.cpp tools/clang-tidy-plugin/*/*.cpp)
CLANG_TIDY_PLUGIN_HEADERS := \
$(wildcard tools/clang-tidy-plugin/*.h tools/clang-tidy-plugin/*/*.h)
# Using sort here because it has the side-effect of deduplicating the list
ASTYLE_SOURCES := $(sort \
$(SOURCES) \
$(HEADERS) \
$(TESTSRC) \
$(TESTHDR) \
$(JSON_FORMATTER_SOURCES) \
$(JSON_FORMATTER_HEADERS) \
$(CHKJSON_SOURCES) \
$(CLANG_TIDY_PLUGIN_SOURCES) \
$(CLANG_TIDY_PLUGIN_HEADERS))
# Third party sources should not be astyle'd
SOURCES += $(THIRD_PARTY_SOURCES)
_OBJS = $(SOURCES:$(SRC_DIR)/%.cpp=%.o)
ifeq ($(TARGETSYSTEM),WINDOWS)
RSRC = $(wildcard $(SRC_DIR)/*.rc)
_OBJS += $(RSRC:$(SRC_DIR)/%.rc=%.o)
endif
OBJS = $(sort $(patsubst %,$(ODIR)/%,$(_OBJS)))
ifdef LANGUAGES
export LOCALE_DIR
L10N = localization
endif
ifeq ($(TARGETSYSTEM), LINUX)
ifneq ($(PREFIX),)
DEFINES += -DPREFIX="$(PREFIX)" -DDATA_DIR_PREFIX
endif
endif
ifeq ($(TARGETSYSTEM), CYGWIN)
ifneq ($(PREFIX),)
DEFINES += -DPREFIX="$(PREFIX)" -DDATA_DIR_PREFIX
endif
endif
ifeq ($(USE_HOME_DIR),1)
ifeq ($(USE_XDG_DIR),1)
$(error "USE_HOME_DIR=1 does not work with USE_XDG_DIR=1")
endif
DEFINES += -DUSE_HOME_DIR
endif
ifeq ($(USE_XDG_DIR),1)
ifeq ($(USE_HOME_DIR),1)
$(error "USE_HOME_DIR=1 does not work with USE_XDG_DIR=1")
endif
DEFINES += -DUSE_XDG_DIR
endif
ifeq ($(LTO), 1)
# Depending on the compiler version, LTO usually requires all the
# optimization flags to be specified on the link line, and requires them to
# match the original invocations.
LDFLAGS += $(CXXFLAGS)
# If GCC or CLANG, use a wrapper for AR (if it exists) else test fails to build
ifeq ($(CLANG), 0)
GCCAR := $(shell command -v gcc-ar 2> /dev/null)
ifdef GCCAR
ifneq (,$(findstring gcc version,$(shell $(CXX) -v </dev/null 2>&1)))
AR = gcc-ar
endif
endif
else
LLVMAR := $(shell command -v llvm-ar 2> /dev/null)
ifdef LLVMAR
ifneq (,$(findstring clang version,$(shell $(CXX) -v </dev/null 2>&1)))
AR = llvm-ar
endif
endif
endif
endif
LDFLAGS += -lz
all: version prefix $(CHECKS) $(TARGET) $(L10N) $(TESTS)
@
$(TARGET): $(OBJS)
+$(LD) $(W32FLAGS) -o $(TARGET) $(OBJS) $(LDFLAGS)
ifeq ($(RELEASE), 1)
ifndef DEBUG_SYMBOLS
ifneq ($(BACKTRACE),1)
$(STRIP) $(TARGET)
endif
endif
endif
$(PCH_P): $(PCH_H)
-$(CXX) $(CPPFLAGS) $(DEFINES) $(CXXFLAGS) -MMD -MP -Wno-error -c $(PCH_H) -o $(PCH_P)
$(BUILD_PREFIX)$(TARGET_NAME).a: $(OBJS)
$(AR) rcs $(BUILD_PREFIX)$(TARGET_NAME).a $(filter-out $(ODIR)/main.o $(ODIR)/messages.o,$(OBJS))
.PHONY: version prefix
version:
@( VERSION_STRING=$(VERSION) ; \
[ -e ".git" ] && GITVERSION=$$( git describe --tags --always --match "[0-9A-Z]*.[0-9A-Z]*" ) && DIRTYFLAG=$$( [ -z "$$(git diff --numstat | grep -v lang/po/)" ] || echo "-dirty") && VERSION_STRING=$$GITVERSION$$DIRTYFLAG ; \
[ -e "$(SRC_DIR)/version.h" ] && OLDVERSION=$$(grep VERSION $(SRC_DIR)/version.h|cut -d '"' -f2) ; \
if [ "x$$VERSION_STRING" != "x$$OLDVERSION" ]; then printf '// NOLINT(cata-header-guard)\n#define VERSION "%s"\n' "$$VERSION_STRING" | tee $(SRC_DIR)/version.h ; fi \
)
prefix:
@( PREFIX_STRING=$(PREFIX) ; \
[ -e "$(SRC_DIR)/prefix.h" ] && OLDPREFIX=$$(grep PREFIX $(SRC_DIR)/PREFIX.h|cut -d '"' -f2) ; \
if [ "x$$PREFIX_STRING" != "x$$OLDPREFIX" ]; then printf '// NOLINT(cata-header-guard)\n#define PREFIX "%s"\n' "$$PREFIX_STRING" | tee $(SRC_DIR)/prefix.h ; fi \
)
# Unconditionally create the object dirs on every invocation.
DIRS = $(sort $(dir $(OBJS)))
$(shell mkdir -p $(DIRS))
$(ODIR)/%.inc: $(SRC_DIR)/%.cpp
$(CXX) $(CPPFLAGS) $(DEFINES) $(CXXFLAGS) -H -E $< -o /dev/null 2> $@
.PHONY: includes
includes: $(OBJS:.o=.inc)
+make -C tests includes
$(ODIR)/%.o: $(SRC_DIR)/%.cpp $(PCH_P)
$(CXX) $(CPPFLAGS) $(DEFINES) $(CXXFLAGS) -MMD -MP $(PCHFLAGS) -c $< -o $@
$(ODIR)/%.o: $(SRC_DIR)/%.rc
$(RC) $(RFLAGS) $< -o $@
$(ODIR)/resource.o: data/cataicon.ico data/application_manifest.xml
src/version.h: version
src/version.cpp: src/version.h
TEST_MO := data/mods/TEST_DATA/lang/mo/ru/LC_MESSAGES/TEST_DATA.mo
$(TEST_MO): data/mods/TEST_DATA/lang/po/ru.po
mkdir -p $(dir $@)
msgfmt -f -o $@ $<
MO_DEPS := \
$(wildcard lang/*.sh lang/*.py src/*.cpp src/*.h) \
$(shell find data/raw data/json data/mods data/core data/help -type f -name '*.json')
lang/mo_built.stamp: $(MO_DEPS)
$(MAKE) -C lang
touch $@
localization: lang/mo_built.stamp
$(CHKJSON_BIN): $(CHKJSON_SOURCES)
$(CXX) $(CXXFLAGS) $(TOOL_CXXFLAGS) -Isrc/chkjson -Isrc -isystem src/third-party $(CHKJSON_SOURCES) -o $(CHKJSON_BIN)
json-check: $(CHKJSON_BIN)
./$(CHKJSON_BIN)
clean: clean-tests clean-object_creator clean-pch
rm -rf *$(TARGET_NAME) *$(TILES_TARGET_NAME)
rm -rf *$(TILES_TARGET_NAME).exe *$(TARGET_NAME).exe *$(TARGET_NAME).a
rm -rf *obj *objwin
rm -rf *$(BINDIST_DIR) *cataclysmdda-*.tar.gz *cataclysmdda-*.zip
rm -f $(SRC_DIR)/version.h
rm -f $(CHKJSON_BIN)
rm -f $(TEST_MO)
distclean:
rm -rf *$(BINDIST_DIR)
rm -rf save
rm -rf lang/mo lang/mo_built.stamp
rm -f data/options.txt
rm -f data/keymap.txt
rm -f data/auto_pickup.txt
rm -f data/fontlist.txt
bindist: $(BINDIST)
ifeq ($(TARGETSYSTEM), LINUX)
DATA_PREFIX=$(DESTDIR)$(PREFIX)/share/cataclysm-dda/
BIN_PREFIX=$(DESTDIR)$(PREFIX)/bin
LOCALE_DIR=$(DESTDIR)$(PREFIX)/share/locale
SHARE_DIR=$(DESTDIR)$(PREFIX)/share
install: version $(TARGET)
mkdir -p $(DATA_PREFIX)
mkdir -p $(BIN_PREFIX)
install --mode=755 $(TARGET) $(BIN_PREFIX)
cp -R --no-preserve=ownership data/core $(DATA_PREFIX)
cp -R --no-preserve=ownership data/font $(DATA_PREFIX)
cp -R --no-preserve=ownership data/json $(DATA_PREFIX)
cp -R --no-preserve=ownership data/mods $(DATA_PREFIX)
cp -R --no-preserve=ownership data/names $(DATA_PREFIX)
cp -R --no-preserve=ownership data/raw $(DATA_PREFIX)
cp -R --no-preserve=ownership data/motd $(DATA_PREFIX)
cp -R --no-preserve=ownership data/credits $(DATA_PREFIX)
cp -R --no-preserve=ownership data/title $(DATA_PREFIX)
cp -R --no-preserve=ownership data/help $(DATA_PREFIX)
ifeq ($(TILES), 1)
cp -R --no-preserve=ownership gfx $(DATA_PREFIX)
install -Dm755 -t $(SHARE_DIR)/applications/ data/xdg/org.cataclysmdda.CataclysmDDA.desktop
install -Dm644 -t $(SHARE_DIR)/metainfo/ data/xdg/org.cataclysmdda.CataclysmDDA.appdata.xml
install -Dm644 -t $(SHARE_DIR)/icons/hicolor/scalable/apps/ data/xdg/org.cataclysmdda.CataclysmDDA.svg
endif
ifeq ($(SOUND), 1)
cp -R --no-preserve=ownership data/sound $(DATA_PREFIX)
endif
install --mode=644 data/changelog.txt data/cataicon.ico data/fontdata.json \
LICENSE.txt LICENSE-OFL-Terminus-Font.txt -t $(DATA_PREFIX)
ifdef LANGUAGES
$(MAKE) -C lang install
endif
endif
ifeq ($(TARGETSYSTEM), CYGWIN)
DATA_PREFIX=$(DESTDIR)$(PREFIX)/share/cataclysm-dda/
BIN_PREFIX=$(DESTDIR)$(PREFIX)/bin
LOCALE_DIR=$(DESTDIR)$(PREFIX)/share/locale
SHARE_DIR=$(DESTDIR)$(PREFIX)/share
install: version $(TARGET)
mkdir -p $(DATA_PREFIX)
mkdir -p $(BIN_PREFIX)
install --mode=755 $(TARGET) $(BIN_PREFIX)
cp -R --no-preserve=ownership data/core $(DATA_PREFIX)
cp -R --no-preserve=ownership data/font $(DATA_PREFIX)
cp -R --no-preserve=ownership data/json $(DATA_PREFIX)
cp -R --no-preserve=ownership data/mods $(DATA_PREFIX)
cp -R --no-preserve=ownership data/names $(DATA_PREFIX)
cp -R --no-preserve=ownership data/raw $(DATA_PREFIX)
cp -R --no-preserve=ownership data/motd $(DATA_PREFIX)
cp -R --no-preserve=ownership data/credits $(DATA_PREFIX)
cp -R --no-preserve=ownership data/title $(DATA_PREFIX)
cp -R --no-preserve=ownership data/help $(DATA_PREFIX)
ifeq ($(TILES), 1)
cp -R --no-preserve=ownership gfx $(DATA_PREFIX)
install -Dm755 -t $(SHARE_DIR)/applications/ data/xdg/org.cataclysmdda.CataclysmDDA.desktop
install -Dm644 -t $(SHARE_DIR)/metainfo/ data/xdg/org.cataclysmdda.CataclysmDDA.appdata.xml
install -Dm644 -t $(SHARE_DIR)/icons/hicolor/scalable/apps/ data/xdg/org.cataclysmdda.CataclysmDDA.svg
endif
ifeq ($(SOUND), 1)
cp -R --no-preserve=ownership data/sound $(DATA_PREFIX)
endif
install --mode=644 data/changelog.txt data/cataicon.ico data/fontdata.json \
LICENSE.txt LICENSE-OFL-Terminus-Font.txt -t $(DATA_PREFIX)
ifdef LANGUAGES
$(MAKE) -C lang install
endif
endif
ifeq ($(NATIVE), osx)
APPTARGETDIR=Cataclysm.app
APPRESOURCESDIR=$(APPTARGETDIR)/Contents/Resources
APPDATADIR=$(APPRESOURCESDIR)/data
ifndef FRAMEWORK
SDLLIBSDIR=$(shell sdl2-config --libs | sed -n 's/.*-L\([^ ]*\) .*/\1/p')
endif # ifndef FRAMEWORK
appclean:
rm -rf $(APPTARGETDIR)
rm -f data/options.txt
rm -f data/keymap.txt
rm -f data/auto_pickup.txt
rm -f data/fontlist.txt
build-data/osx/AppIcon.icns: build-data/osx/AppIcon.iconset
iconutil -c icns $<
ifdef OSXCROSS
app: appclean version $(APPTARGET)
else
app: appclean version build-data/osx/AppIcon.icns $(APPTARGET)
endif
mkdir -p $(APPTARGETDIR)/Contents
cp build-data/osx/Info.plist $(APPTARGETDIR)/Contents/
mkdir -p $(APPTARGETDIR)/Contents/MacOS
cp build-data/osx/Cataclysm.sh $(APPTARGETDIR)/Contents/MacOS/
mkdir -p $(APPRESOURCESDIR)
cp $(APPTARGET) $(APPRESOURCESDIR)/
cp build-data/osx/AppIcon.icns $(APPRESOURCESDIR)/
mkdir -p $(APPDATADIR)
cp data/fontdata.json $(APPDATADIR)
cp -R data/core $(APPDATADIR)
cp -R data/font $(APPDATADIR)
cp -R data/json $(APPDATADIR)
cp -R data/mods $(APPDATADIR)
cp -R data/names $(APPDATADIR)
cp -R data/raw $(APPDATADIR)
cp -R data/motd $(APPDATADIR)
cp -R data/credits $(APPDATADIR)
cp -R data/title $(APPDATADIR)
cp -R data/help $(APPDATADIR)
ifdef LANGUAGES
$(MAKE) -C lang
mkdir -p $(APPRESOURCESDIR)/lang/mo/
cp -pR lang/mo/* $(APPRESOURCESDIR)/lang/mo/
endif
ifeq ($(TILES), 1)
ifeq ($(SOUND), 1)
cp -R data/sound $(APPDATADIR)
endif # ifdef SOUND
cp -R gfx $(APPRESOURCESDIR)/
ifdef FRAMEWORK
cp -R $(FRAMEWORKSDIR)/SDL2.framework $(APPRESOURCESDIR)/
cp -R $(FRAMEWORKSDIR)/SDL2_image.framework $(APPRESOURCESDIR)/
cp -R $(FRAMEWORKSDIR)/SDL2_ttf.framework $(APPRESOURCESDIR)/
ifeq ($(SOUND), 1)
cp -R $(FRAMEWORKSDIR)/SDL2_mixer.framework $(APPRESOURCESDIR)/
cd $(APPRESOURCESDIR)/ && ln -s SDL2_mixer.framework/Frameworks/Vorbis.framework Vorbis.framework
cd $(APPRESOURCESDIR)/ && ln -s SDL2_mixer.framework/Frameworks/Ogg.framework Ogg.framework
cd $(APPRESOURCESDIR)/SDL2_mixer.framework/Frameworks && find . -maxdepth 1 -type d -not -name '*Vorbis.framework' -not -name '*Ogg.framework' -not -name '.' | xargs rm -rf
endif # ifdef SOUND
endif # ifdef FRAMEWORK
endif # ifdef TILES
ifndef FRAMEWORK
python3 ./tools/copy_mac_libs.py $(APPRESOURCESDIR)/$(APPTARGET)
endif # ifndef FRAMEWORK
dmgdistclean:
rm -rf Cataclysm
rm -f Cataclysm.dmg
rm -rf lang/mo
dmgdist: dmgdistclean $(L10N) app
ifdef OSXCROSS
mkdir Cataclysm
cp -a $(APPTARGETDIR) Cataclysm/$(APPTARGETDIR)
cp build-data/osx/DS_Store Cataclysm/.DS_Store
cp build-data/osx/dmgback.png Cataclysm/.background.png
ln -s /Applications Cataclysm/Applications
genisoimage -quiet -D -V "Cataclysm DDA" -no-pad -r -apple -o Cataclysm-uncompressed.dmg Cataclysm/
dmg dmg Cataclysm-uncompressed.dmg Cataclysm.dmg
rm Cataclysm-uncompressed.dmg
else
plutil -convert binary1 Cataclysm.app/Contents/Info.plist
dmgbuild -s build-data/osx/dmgsettings.py "Cataclysm DDA" Cataclysm.dmg
endif
endif # ifeq ($(NATIVE), osx)
$(BINDIST): distclean version $(TARGET) $(L10N) $(BINDIST_EXTRAS) $(BINDIST_LOCALE)
mkdir -p $(BINDIST_DIR)
cp -R $(TARGET) $(BINDIST_EXTRAS) $(BINDIST_DIR)
ifdef LANGUAGES
cp -R --parents lang/mo $(BINDIST_DIR)
endif
$(BINDIST_CMD)
export ODIR _OBJS LDFLAGS CXX W32FLAGS DEFINES CXXFLAGS TARGETSYSTEM CLANG PCH PCHFLAGS
ctags: $(ASTYLE_SOURCES)
ctags $^
./tools/json_tools/cddatags.py
etags: $(ASTYLE_SOURCES)
etags $^
./tools/json_tools/cddatags.py
ifneq ($(IS_WINDOWS_HOST),1)
# Parallel astyle for posix hosts where fork and filesystem are cheap.
ASTYLE_CHECK_STAMPS = $(sort $(patsubst %,$(ODIR)/%.astyle-check-stamp,$(ASTYLE_SOURCES)))
astyle: $(ASTYLE_CHECK_STAMPS)
$(ASTYLE_CHECK_STAMPS): $(ODIR)/%.astyle-check-stamp : %
$(ASTYLE_BINARY) --options=.astylerc -n $< && mkdir -p $(@D) && touch $@
else
# Serial astyle for Windows hosts which processes all files in one invocation.
astyle: $(ODIR)/.astyle-check-stamp
$(ODIR)/.astyle-check-stamp: $(ASTYLE_SOURCES)
$(ASTYLE_BINARY) --options=.astylerc -n $?
mkdir -p $(@D) && touch $@
endif
astyle-fast: $(ASTYLE_SOURCES)
$(ASTYLE_BINARY) --options=.astylerc -n $(ASTYLE_SOURCES)
astyle-all: $(ASTYLE_SOURCES)
$(ASTYLE_BINARY) --options=.astylerc -n $(ASTYLE_SOURCES)
mkdir -p $(ODIR) && touch $(ODIR)/.astyle-check-stamp
# Test whether the system has a version of astyle that supports --dry-run
ifeq ($(shell $(ASTYLE_BINARY) -Q -X --dry-run src/game.h >/dev/null 2>/dev/null && echo foo),foo)
ASTYLE_CHECK=$(shell $(ASTYLE_BINARY) --options=.astylerc --dry-run -X -Q --ascii $(ASTYLE_SOURCES) | sed -E "s/Formatted[[:space:]]+(.*)/Needs formatting: \1\\\n/" | tr -d '\n')
endif
astyle-check:
ifdef ASTYLE_CHECK
$(info $(ASTYLE_BINARY) -V: $(shell $(ASTYLE_BINARY) -V))
@if [ "$(findstring Needs formatting:,$(ASTYLE_CHECK))" = "" ]; then echo "no astyle regressions";\
else printf "astyle regressions found.\n$(ASTYLE_CHECK)" && false; fi
else
@echo Cannot run an astyle check, your system either does not have astyle, or it is too old.
endif
JSON_SOURCES := $(shell find data -name '* *' -prune -o -name "*.json" -print)
JSON_CHECK_STAMPS = $(sort $(patsubst %,$(ODIR)/%,$(JSON_SOURCES:.json=.jstyle-check-stamp)))
style-json : $(JSON_CHECK_STAMPS) $(JSON_FORMATTER_BIN)
$(JSON_CHECK_STAMPS) : $(ODIR)/%.jstyle-check-stamp : %.json $(JSON_FORMATTER_BIN)
ifndef CROSS
$(JSON_FORMATTER_BIN) $< && mkdir -p $(@D) && touch $@
else
@echo Cannot run json formatter in cross compiles.
endif
style-all-json: $(JSON_FORMATTER_BIN)
find data -name "*.json" -print0 | xargs -0 -L 1 $(JSON_FORMATTER_BIN)
style-all-json-parallel: $(JSON_FORMATTER_BIN)
find data -name "*.json" -print0 | xargs -0 -L 1 -P $$(nproc) $(JSON_FORMATTER_BIN)
$(JSON_FORMATTER_BIN): $(JSON_FORMATTER_SOURCES)
$(CXX) $(CXXFLAGS) -MMD -MP $(TOOL_CXXFLAGS) -Itools/format -Isrc -isystem src/third-party \
$(JSON_FORMATTER_SOURCES) -o $(JSON_FORMATTER_BIN)
python-check:
flake8
tests: version $(BUILD_PREFIX)cataclysm.a $(LOCALIZE_TEST_DEPS)
$(MAKE) -C tests
check: version $(BUILD_PREFIX)cataclysm.a $(LOCALIZE_TEST_DEPS)
$(MAKE) -C tests check
clean-tests:
$(MAKE) -C tests clean
object_creator: version $(BUILD_PREFIX)cataclysm.a
$(MAKE) -C object_creator
clean-object_creator:
$(MAKE) -C object_creator clean
clean-pch:
rm -f pch/*pch.hpp.gch
rm -f pch/*pch.hpp.pch
rm -f pch/*pch.hpp.d
.PHONY: tests check ctags etags clean-tests clean-object_creator clean-pch install lint
-include ${OBJS:.o=.d}