1# vim: set expandtab tabstop=4 softtabstop=2 shiftwidth=2:
2# Platforms:
3# Linux/Cygwin native
4#   (don't need to do anything)
5# Linux 64-bit
6#   make NATIVE=linux64
7# Linux 32-bit
8#   make NATIVE=linux32
9# Linux cross-compile to Win32
10#   make CROSS=i686-pc-mingw32-
11#   or make CROSS=i586-mingw32msvc-
12#   or whichever prefix your crosscompiler uses
13#      as long as its name contains mingw32
14# Linux cross-compile to OSX with osxcross
15#   make CROSS=x86_64-apple-darwin15-
16#        NATIVE=osx
17#        CLANG=1
18#        OSXCROSS=1
19#        LIBSDIR=../libs
20#        FRAMEWORKSDIR=../Frameworks
21# Win32 (non-Cygwin)
22#   Run: make NATIVE=win32
23# OS X
24#   Run: make NATIVE=osx OSX_MIN=10.12
25#     It is highly recommended to supply OSX_MIN > 10.11
26#     otherwise optimizations are automatically disabled with -O0
27
28# Build types:
29# Debug (no optimizations)
30#  Default
31# ccache (use compilation caches)
32#  make CCACHE=1
33# Release (turn on optimizations)
34#  make RELEASE=1
35# Tiles (uses SDL rather than ncurses)
36#  make TILES=1
37# Sound (requires SDL, so TILES must be enabled)
38#  make TILES=1 SOUND=1
39# Disable gettext, on some platforms the dependencies are hard to wrangle.
40#  make LOCALIZE=0
41# Disable backtrace support, not available on all platforms
42#  make BACKTRACE=0
43# Use libbacktrace. Only has effect if BACKTRACE=1. (currently only for MinGW builds)
44#  make LIBBACKTRACE=1
45# Compile localization files for specified languages
46#  make localization LANGUAGES="<lang_id_1>[ lang_id_2][ ...]"
47#  (for example: make LANGUAGES="zh_CN zh_TW" for Chinese)
48#  make localization LANGUAGES=all
49#  (for every .po file in lang/po)
50#  Special note for MinGW: due to a libintl bug (https://savannah.gnu.org/bugs/index.php?58006),
51#  using English without a `.mo` file would cause significant slow down on MinGW
52#  targets. In such case you can compile a `.mo` file for English using `make LANGUAGES="en"`.
53#  `make LANGUAGE="all"` also compiles a `.mo` file for English in addition to other languages.
54# Enable sanitizer (address, undefined, etc.)
55#  make SANITIZE=address
56# Change mapsize (reality bubble size)
57#  make MAPSIZE=<size>
58# Enable the string id debugging helper
59#  make STRING_ID_DEBUG=1
60# Adjust names of build artifacts (for example to allow easily toggling between build types).
61#  make BUILD_PREFIX="release-"
62# Generate a build artifact prefix from the other build flags.
63#  make AUTO_BUILD_PREFIX=1
64# Install to system directories.
65#  make install
66# Install to $DIR ($DIR will contain bin and share directories).
67#  make PREFIX=$DIR
68#  make PREFIX=$DIR install
69# Use user's XDG base directories for save files and configs.
70#  make USE_XDG_DIR=1
71# Use user's home directory for save files.
72#  make USE_HOME_DIR=1
73# Use dynamic linking (requires system libraries).
74#  make DYNAMIC_LINKING=1
75# Use MSYS2 as the build environment on Windows
76#  make MSYS2=1
77# Turn off all optimizations, even debug-friendly optimizations
78#  make NOOPT=1
79# Astyle all source files.
80#  make astyle
81# Check if source files are styled properly.
82#  make astyle-check
83# Style the whitelisted json files (maintain the current level of styling).
84#  make style-json
85# Style all json files using the current rules (don't PR this, it's too many changes at once).
86#  make style-all-json
87# Disable astyle of source files.
88# make ASTYLE=0
89# Disable format check of whitelisted json files.
90# make LINTJSON=0
91# Disable building and running tests.
92# make RUNTESTS=0
93
94# comment these to toggle them as one sees fit.
95# DEBUG is best turned on if you plan to debug in gdb -- please do!
96# PROFILE is for use with gprof or a similar program -- don't bother generally.
97# RELEASE_FLAGS is flags for release builds.
98RELEASE_FLAGS =
99WARNINGS = \
100   -Wall -Wextra \
101  -Wformat-signedness \
102  -Wlogical-op \
103  -Wmissing-declarations \
104  -Wmissing-noreturn \
105  -Wnon-virtual-dtor \
106  -Wold-style-cast \
107  -Woverloaded-virtual \
108  -Wpedantic \
109  -Wsuggest-override \
110  -Wunused-macros \
111  -Wzero-as-null-pointer-constant \
112  -Wno-unknown-warning-option
113# Uncomment below to disable warnings
114#WARNINGS = -w
115DEBUGSYMS = -g
116#PROFILE = -pg
117#OTHERS = -O3
118#DEFINES = -DNDEBUG
119
120# Tells ccache to keep comments, as they can be meaningful to the compiler (as to suppress warnings).
121export CCACHE_COMMENTS=1
122
123# Disable debug. Comment this out to get logging.
124#DEFINES = -DENABLE_LOGGING
125
126# Limit debug to level. Comment out all for all levels.
127#DEFINES += -DDEBUG_INFO
128#DEFINES += -DDEBUG_WARNING
129#DEFINES += -DDEBUG_ERROR
130#DEFINES += -DDEBUG_PEDANTIC_INFO
131
132# Limit debug to section. Comment out all for all levels.
133#DEFINES += -DDEBUG_ENABLE_MAIN
134#DEFINES += -DDEBUG_ENABLE_MAP
135#DEFINES += -DDEBUG_ENABLE_MAP_GEN
136#DEFINES += -DDEBUG_ENABLE_GAME
137
138# Explicitly let 'char' to be 'signed char' to fix #18776
139OTHERS += -fsigned-char
140
141VERSION = 0.F
142
143TARGET_NAME = cataclysm
144TILES_TARGET_NAME = $(TARGET_NAME)-tiles
145
146TARGET = $(BUILD_PREFIX)$(TARGET_NAME)
147TILESTARGET = $(BUILD_PREFIX)$(TILES_TARGET_NAME)
148ifeq ($(TILES), 1)
149  APPTARGET = $(TILESTARGET)
150else
151  APPTARGET = $(TARGET)
152endif
153W32TILESTARGET = $(BUILD_PREFIX)$(TILES_TARGET_NAME).exe
154W32TARGET = $(BUILD_PREFIX)$(TARGET_NAME).exe
155CHKJSON_BIN = $(BUILD_PREFIX)chkjson
156BINDIST_DIR = $(BUILD_PREFIX)bindist
157BUILD_DIR = $(CURDIR)
158SRC_DIR = src
159LOCALIZE = 1
160ASTYLE_BINARY = astyle
161
162# Enable debug by default
163ifndef RELEASE
164  RELEASE = 0
165endif
166ifneq ($(findstring DragonFly,$(OS)),)
167  BSD = 1
168endif
169
170# Enable astyle by default
171ifndef ASTYLE
172  ASTYLE = 1
173endif
174
175# Enable json format check by default
176ifndef LINTJSON
177  LINTJSON = 1
178endif
179
180# Enable running tests by default
181ifndef RUNTESTS
182  RUNTESTS = 1
183endif
184
185ifndef PCH
186  PCH = 1
187endif
188
189# Auto-detect MSYS2
190ifdef MSYSTEM
191  MSYS2 = 1
192endif
193
194ifneq (,$(findstring clang,$(COMPILER)))
195  CLANG = $(COMPILER)
196endif
197
198OS = $(shell uname -s)
199
200ifneq ($(findstring Darwin,$(OS)),)
201  ifndef NATIVE
202    NATIVE = osx
203  endif
204  ifndef CLANG
205    CLANG = 1
206  endif
207endif
208
209# Default to disabling clang
210ifndef CLANG
211  CLANG = 0
212endif
213
214# Determine JSON formatter binary name
215JSON_FORMATTER_BIN=tools/format/json_formatter.cgi
216ifeq ($(MSYS2), 1)
217  JSON_FORMATTER_BIN=tools/format/json_formatter.exe
218endif
219ifneq (,$(findstring mingw32,$(CROSS)))
220  JSON_FORMATTER_BIN=tools/format/json_formatter.exe
221endif
222
223# Enable backtrace by default
224ifndef BACKTRACE
225  # ...except not on native Windows builds, because the relevant headers are
226  # probably not available
227  ifneq ($(MSYS2), 1)
228    BACKTRACE = 1
229  endif
230endif
231ifeq ($(BACKTRACE), 1)
232  # Also enable libbacktrace on cross-compilation to Windows
233  ifndef LIBBACKTRACE
234    ifneq (,$(findstring mingw32,$(CROSS)))
235      LIBBACKTRACE = 1
236    endif
237  endif
238endif
239
240ifeq ($(RUNTESTS), 1)
241  TESTS = tests
242endif
243
244# tiles object directories are because gcc gets confused
245# Appears that the default value of $LD is unsuitable on most systems
246
247# when preprocessor defines change, but the source doesn't
248ODIR = $(BUILD_PREFIX)obj
249ODIRTILES = $(BUILD_PREFIX)obj/tiles
250W32ODIR = $(BUILD_PREFIX)objwin
251W32ODIRTILES = $(W32ODIR)/tiles
252
253ifdef AUTO_BUILD_PREFIX
254  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 $(MAPSIZE),map-$(MAPSIZE)-)$(if $(USE_XDG_DIR),xdg-)$(if $(USE_HOME_DIR),home-)$(if $(DYNAMIC_LINKING),dynamic-)$(if $(MSYS2),msys2-)
255  export BUILD_PREFIX
256endif
257
258# if $(OS) contains 'BSD'
259ifneq ($(findstring BSD,$(OS)),)
260  BSD = 1
261endif
262
263ifeq ($(PCH), 1)
264	CCACHEBIN = CCACHE_SLOPPINESS=pch_defines,time_macros ccache
265else
266	CCACHEBIN = ccache
267endif
268
269ifeq ($(STRING_ID_DEBUG), 1)
270	DEFINES += -DCATA_STRING_ID_DEBUGGING
271endif
272
273# This sets CXX and so must be up here
274ifneq ($(CLANG), 0)
275  # Allow setting specific CLANG version
276  ifeq ($(CLANG), 1)
277    CLANGCMD = clang++
278  else
279    CLANGCMD = $(CLANG)
280  endif
281  ifeq ($(NATIVE), osx)
282    USE_LIBCXX = 1
283  endif
284  ifeq ($(BSD), 1)
285    ifndef USE_LIBCXX
286      USE_LIBCXX = 1
287    endif
288  endif
289  ifdef USE_LIBCXX
290    OTHERS += -stdlib=libc++
291    LDFLAGS += -stdlib=libc++
292  else
293    # clang with glibc 2.31+ will cause linking error on math functions
294    # this is a workaround (see https://github.com/google/filament/issues/2146)
295    CXXFLAGS += -fno-builtin
296  endif
297  ifeq ($(CCACHE), 1)
298    CXX = CCACHE_CPP2=1 $(CCACHEBIN) $(CROSS)$(CLANGCMD)
299    LD  = CCACHE_CPP2=1 $(CCACHEBIN) $(CROSS)$(CLANGCMD)
300  else
301    CXX = $(CROSS)$(CLANGCMD)
302    LD  = $(CROSS)$(CLANGCMD)
303  endif
304else
305  # Compiler version & target machine - used later for MXE ICE workaround
306  ifdef CROSS
307    CXXVERSION := $(shell $(CROSS)$(CXX) --version | grep -i gcc | sed 's/^.* //g')
308    CXXMACHINE := $(shell $(CROSS)$(CXX) -dumpmachine)
309  endif
310
311  # Expand at reference time to avoid recursive reference
312  ifneq ($(COMPILER),)
313    OS_COMPILER := $(COMPILER)
314    OS_LINKER := $(COMPILER)
315  else
316    OS_COMPILER := $(CXX)
317    OS_LINKER := $(CXX)
318  endif
319  # Appears that the default value of $LD is unsuitable on most systems
320  ifeq ($(CCACHE), 1)
321    CXX = $(CCACHEBIN) $(CROSS)$(OS_COMPILER)
322    LD  = $(CCACHEBIN) $(CROSS)$(OS_LINKER)
323  else
324    CXX = $(CROSS)$(OS_COMPILER)
325    LD  = $(CROSS)$(OS_LINKER)
326  endif
327endif
328
329STRIP = $(CROSS)strip
330RC  = $(CROSS)windres
331AR  = $(CROSS)ar
332
333# We don't need scientific precision for our math functions, this lets them run much faster.
334CXXFLAGS += -ffast-math
335LDFLAGS += $(PROFILE)
336
337ifneq ($(SANITIZE),)
338  SANITIZE_FLAGS := -fsanitize=$(SANITIZE) -fno-sanitize-recover=all -fno-omit-frame-pointer
339  CXXFLAGS += $(SANITIZE_FLAGS)
340  LDFLAGS += $(SANITIZE_FLAGS)
341endif
342
343# enable optimizations. slow to build
344ifeq ($(RELEASE), 1)
345  ifeq ($(NATIVE), osx)
346    ifeq ($(shell $(CXX) -E -Os - < /dev/null > /dev/null 2>&1 && echo fos),fos)
347      OPTLEVEL = -Os
348    else
349      OPTLEVEL = -O3
350    endif
351  else
352    # MXE ICE Workaround
353    # known bad on 4.9.3 and 4.9.4, if it gets fixed this could include a version test too
354    ifeq ($(CXXMACHINE), x86_64-w64-mingw32.static)
355      OPTLEVEL = -O3
356    else
357      OPTLEVEL = -Os
358    endif
359  endif
360
361  ifeq ($(LTO), 1)
362    ifneq ($(CLANG), 0)
363      # LLVM's LTO will complain if the optimization level isn't between O0 and
364      # O3 (inclusive)
365      OPTLEVEL = -O3
366    endif
367  endif
368  CXXFLAGS += $(OPTLEVEL)
369
370  ifeq ($(LTO), 1)
371    ifeq ($(NATIVE), osx)
372      ifneq ($(CLANG), 0)
373        LTOFLAGS += -flto=full
374      endif
375    else
376      LDFLAGS += -fuse-ld=gold # This breaks in OS X because gold can only produce ELF binaries, not Mach
377    endif
378
379    ifneq ($(CLANG), 0)
380      LTOFLAGS += -flto
381    else
382      LTOFLAGS += -flto=jobserver -flto-odr-type-merging
383    endif
384  endif
385  LTOFLAGS += -Wodr
386  CXXFLAGS += $(LTOFLAGS)
387
388  # OTHERS += -mmmx -m3dnow -msse -msse2 -msse3 -mfpmath=sse -mtune=native
389  # OTHERS += -march=native # Uncomment this to build an optimized binary for your machine only
390
391  # Strip symbols, generates smaller executable.
392  OTHERS += $(RELEASE_FLAGS)
393  DEBUG =
394  ifndef DEBUG_SYMBOLS
395    DEBUGSYMS =
396  endif
397  DEFINES += -DRELEASE
398  # Check for astyle or JSON regressions on release builds.
399  ifeq ($(ASTYLE), 1)
400    CHECKS += astyle-check
401  endif
402  ifeq ($(LINTJSON), 1)
403    CHECKS += style-json
404  endif
405else
406  ifeq ($(NOOPT), 1)
407    # While gcc claims to include all information required for
408    # debugging at -Og, at least with gcc 8.3, control flow
409    # doesn't move line-by-line at -Og.  Provide a command-line
410    # way to turn off optimization (make NOOPT=1) entirely.
411    OPTLEVEL = -O0
412  else
413    ifeq ($(shell $(CXX) -E -Og - < /dev/null > /dev/null 2>&1 && echo fog),fog)
414      OPTLEVEL = -Og
415    else
416      OPTLEVEL = -O0
417    endif
418  endif
419  CXXFLAGS += $(OPTLEVEL)
420endif
421
422ifeq ($(shell sh -c 'uname -o 2>/dev/null || echo not'),Cygwin)
423  OTHERS += -std=gnu++14
424else
425  OTHERS += -std=c++14
426endif
427
428ifeq ($(CYGWIN),1)
429WARNINGS += -Wimplicit-fallthrough=0
430endif
431
432ifeq ($(PCH), 1)
433  PCHFLAGS = -Ipch -Winvalid-pch
434  PCH_H = pch/main-pch.hpp
435
436  ifeq ($(CLANG), 0)
437    PCHFLAGS += -fpch-preprocess -include main-pch.hpp
438    PCH_P = $(PCH_H).gch
439  else
440    PCH_P = $(PCH_H).pch
441    PCHFLAGS += -include-pch $(PCH_P)
442
443    # FIXME: dirty hack ahead
444    # ccache won't wort with clang unless it supports -fno-pch-timestamp
445    ifeq ($(CCACHE), 1)
446      CLANGVER := $(shell echo 'int main(void){return 0;}'|$(CXX) -Xclang -fno-pch-timestamp -x c++ -o _clang_ver.o -c - 2>&1 || echo fail)
447      ifneq ($(CLANGVER),)
448        PCHFLAGS = ""
449        PCH_H = ""
450        PCH_P = ""
451        PCH = 0
452        $(warning your clang version does not support -fno-pch-timestamp: $(CLANGVER) ($(.SHELLSTATUS)))
453      else
454        CXXFLAGS += -Xclang -fno-pch-timestamp
455      endif
456    endif
457
458  endif
459endif
460
461CXXFLAGS += $(WARNINGS) $(DEBUG) $(DEBUGSYMS) $(PROFILE) $(OTHERS) -MMD -MP
462TOOL_CXXFLAGS = -DCATA_IN_TOOL
463
464BINDIST_EXTRAS += README.md data doc LICENSE.txt LICENSE-OFL-Terminus-Font.txt VERSION.txt $(JSON_FORMATTER_BIN)
465BINDIST    = $(BUILD_PREFIX)cataclysmdda-$(VERSION).tar.gz
466W32BINDIST = $(BUILD_PREFIX)cataclysmdda-$(VERSION).zip
467BINDIST_CMD    = tar --transform=s@^$(BINDIST_DIR)@cataclysmdda-$(VERSION)@ -czvf $(BINDIST) $(BINDIST_DIR)
468W32BINDIST_CMD = cd $(BINDIST_DIR) && zip -r ../$(W32BINDIST) * && cd $(BUILD_DIR)
469
470
471# Check if called without a special build target
472ifeq ($(NATIVE),)
473  ifeq ($(CROSS),)
474    ifeq ($(shell sh -c 'uname -o 2>/dev/null || echo not'),Cygwin)
475      DEFINES += -DCATA_NO_CPP11_STRING_CONVERSIONS
476      TARGETSYSTEM=CYGWIN
477    else
478      TARGETSYSTEM=LINUX
479    endif
480  endif
481endif
482
483# Linux 64-bit
484ifeq ($(NATIVE), linux64)
485  CXXFLAGS += -m64
486  LDFLAGS += -m64
487  TARGETSYSTEM=LINUX
488  ifdef GOLD
489    CXXFLAGS += -fuse-ld=gold
490    LDFLAGS += -fuse-ld=gold -Wl,--detect-odr-violations
491  endif
492else
493  # Linux 32-bit
494  ifeq ($(NATIVE), linux32)
495    CXXFLAGS += -m32
496    LDFLAGS += -m32
497    TARGETSYSTEM=LINUX
498    ifdef GOLD
499      CXXFLAGS += -fuse-ld=gold
500      LDFLAGS += -fuse-ld=gold -Wl,--detect-odr-violations
501    endif
502  endif
503endif
504
505# OSX
506ifeq ($(NATIVE), osx)
507  ifeq ($(OSX_MIN),)
508    ifneq ($(findstring Darwin,$(OS)),)
509      OSX_MIN = $(shell sw_vers -productVersion | awk -F '.' '{print $$1 "." $$2}')
510    else
511      ifneq ($(CLANG), 0)
512        ifneq ($(SANITIZE),)
513          # sanitizers does not function properly (e.g. false positive errors) if OSX_MIN < 10.9
514          # https://github.com/llvm/llvm-project/blob/release/11.x/compiler-rt/CMakeLists.txt#L183
515          OSX_MIN = 10.9
516        else
517          OSX_MIN = 10.7
518        endif
519      else
520        OSX_MIN = 10.5
521      endif
522    endif
523  endif
524  DEFINES += -DMACOSX
525  CXXFLAGS += -mmacosx-version-min=$(OSX_MIN)
526  LDFLAGS += -mmacosx-version-min=$(OSX_MIN) -framework CoreFoundation
527  ifdef FRAMEWORK
528    ifeq ($(FRAMEWORKSDIR),)
529      FRAMEWORKSDIR := $(strip $(if $(shell [ -d $(HOME)/Library/Frameworks ] && echo 1), \
530                             $(if $(shell find $(HOME)/Library/Frameworks -name 'SDL2.*'), \
531                               $(HOME)/Library/Frameworks,),))
532    endif
533    ifeq ($(FRAMEWORKSDIR),)
534      FRAMEWORKSDIR := $(strip $(if $(shell find /Library/Frameworks -name 'SDL2.*'), \
535                                 /Library/Frameworks,))
536    endif
537    ifeq ($(FRAMEWORKSDIR),)
538      $(error "SDL2 framework not found")
539    endif
540  endif
541  ifeq ($(LOCALIZE), 1)
542    LDFLAGS += -lintl
543    ifdef OSXCROSS
544      LDFLAGS += -L$(LIBSDIR)/gettext/lib
545      CXXFLAGS += -I$(LIBSDIR)/gettext/include
546    endif
547    # link to gettext from Homebrew if it exists
548    # Homebrew may be installed in /usr/local or /opt/homebrew
549    ifneq ("$(wildcard /usr/local/opt/gettext)", "")
550      LDFLAGS += -L/usr/local/opt/gettext/lib
551      CXXFLAGS += -I/usr/local/opt/gettext/include
552    else
553      ifneq ("$(wildcard /opt/homebrew/opt/gettext)", "")
554        LDFLAGS += -L/opt/homebrew/opt/gettext/lib
555        CXXFLAGS += -I/opt/homebrew/opt/gettext/include
556      endif
557    endif
558    ifeq ($(MACPORTS), 1)
559      ifneq ($(TILES), 1)
560        CXXFLAGS += -I$(shell ncursesw6-config --includedir)
561        LDFLAGS += -L$(shell ncursesw6-config --libdir)
562      endif
563    endif
564  endif
565  TARGETSYSTEM=LINUX
566  ifneq ($(OS), Linux)
567    BINDIST_CMD = tar -s"@^$(BINDIST_DIR)@cataclysmdda-$(VERSION)@" -czvf $(BINDIST) $(BINDIST_DIR)
568  endif
569endif
570
571# Win32 (MinGW32 or MinGW-w64(32bit)?)
572ifeq ($(NATIVE), win32)
573# Any reason not to use -m32 on MinGW32?
574  TARGETSYSTEM=WINDOWS
575else
576  # Win64 (MinGW-w64?)
577  ifeq ($(NATIVE), win64)
578    CXXFLAGS += -m64
579    LDFLAGS += -m64
580    TARGETSYSTEM=WINDOWS
581  endif
582endif
583
584# MSYS2
585ifeq ($(MSYS2), 1)
586  TARGETSYSTEM=WINDOWS
587endif
588
589# Cygwin
590ifeq ($(NATIVE), cygwin)
591  TARGETSYSTEM=CYGWIN
592endif
593
594# MXE cross-compile to win32
595ifneq (,$(findstring mingw32,$(CROSS)))
596  DEFINES += -DCROSS_LINUX
597  TARGETSYSTEM=WINDOWS
598endif
599
600ifneq ($(TARGETSYSTEM),WINDOWS)
601  WARNINGS += -Wredundant-decls
602endif
603
604# Global settings for Windows targets
605ifeq ($(TARGETSYSTEM),WINDOWS)
606  CHKJSON_BIN = chkjson.exe
607  TARGET = $(W32TARGET)
608  BINDIST = $(W32BINDIST)
609  BINDIST_CMD = $(W32BINDIST_CMD)
610  ODIR = $(W32ODIR)
611  ifeq ($(DYNAMIC_LINKING), 1)
612    # Windows isn't sold with programming support, these are static to remove MinGW dependency.
613    LDFLAGS += -static-libgcc -static-libstdc++
614  else
615    LDFLAGS += -static
616  endif
617  ifeq ($(LOCALIZE), 1)
618    LDFLAGS += -L/usr/local/lib -lintl
619  endif
620  W32FLAGS += -Wl,-stack,12000000,-subsystem,windows
621  RFLAGS = -J rc -O coff
622  ifeq ($(NATIVE), win64)
623    RFLAGS += -F pe-x86-64
624  endif
625endif
626
627ifdef MAPSIZE
628    CXXFLAGS += -DMAPSIZE=$(MAPSIZE)
629endif
630
631ifeq ($(shell git rev-parse --is-inside-work-tree),true)
632  # We have a git repository, use git version
633  DEFINES += -DGIT_VERSION
634endif
635
636PKG_CONFIG = $(CROSS)pkg-config
637
638ifeq ($(SOUND), 1)
639  ifneq ($(TILES),1)
640    $(error "SOUND=1 only works with TILES=1")
641  endif
642  ifeq ($(NATIVE),osx)
643    ifdef FRAMEWORK
644      CXXFLAGS += -I$(FRAMEWORKSDIR)/SDL2_mixer.framework/Headers
645      LDFLAGS += -F$(FRAMEWORKSDIR)/SDL2_mixer.framework/Frameworks \
646		 -framework SDL2_mixer -framework Vorbis -framework Ogg
647    else # libsdl build
648      ifeq ($(MACPORTS), 1)
649        LDFLAGS += -lSDL2_mixer -lvorbisfile -lvorbis -logg
650      else # homebrew
651        CXXFLAGS += $(shell $(PKG_CONFIG) --cflags SDL2_mixer)
652        LDFLAGS += $(shell $(PKG_CONFIG) --libs SDL2_mixer)
653        LDFLAGS += -lvorbisfile -lvorbis -logg
654      endif
655    endif
656  else # not osx
657    CXXFLAGS += $(shell $(PKG_CONFIG) --cflags SDL2_mixer)
658    LDFLAGS += $(shell $(PKG_CONFIG) --libs SDL2_mixer)
659    LDFLAGS += -lpthread
660  endif
661
662  ifeq ($(MSYS2),1)
663    LDFLAGS += -lmpg123 -lshlwapi -lvorbisfile -lvorbis -logg -lflac
664  endif
665
666  CXXFLAGS += -DSDL_SOUND
667endif
668
669ifeq ($(SDL), 1)
670  TILES = 1
671endif
672
673ifeq ($(TILES), 1)
674  SDL = 1
675  BINDIST_EXTRAS += gfx
676  ifeq ($(NATIVE),osx)
677    ifdef FRAMEWORK
678      OSX_INC = -F$(FRAMEWORKSDIR) \
679		-I$(FRAMEWORKSDIR)/SDL2.framework/Headers \
680		-I$(FRAMEWORKSDIR)/SDL2_image.framework/Headers \
681		-I$(FRAMEWORKSDIR)/SDL2_ttf.framework/Headers
682			ifdef SOUND
683				OSX_INC += -I$(FRAMEWORKSDIR)/SDL2_mixer.framework/Headers
684			endif
685      LDFLAGS += -F$(FRAMEWORKSDIR) \
686		 -framework SDL2 -framework SDL2_image -framework SDL2_ttf -framework Cocoa
687		 ifdef SOUND
688		 	LDFLAGS += -framework SDL2_mixer
689		 endif
690      CXXFLAGS += $(OSX_INC)
691    else # libsdl build
692      DEFINES += -DOSX_SDL2_LIBS
693      # handle #include "SDL2/SDL.h" and "SDL.h"
694      CXXFLAGS += $(shell sdl2-config --cflags) \
695		  -I$(shell dirname $(shell sdl2-config --cflags | sed 's/-I\(.[^ ]*\) .*/\1/'))
696      LDFLAGS += -framework Cocoa $(shell sdl2-config --libs) -lSDL2_ttf
697      LDFLAGS += -lSDL2_image
698      ifdef SOUND
699        LDFLAGS += -lSDL2_mixer
700      endif
701    endif
702  else # not osx
703    CXXFLAGS += $(shell $(PKG_CONFIG) --cflags sdl2 SDL2_image SDL2_ttf)
704
705    ifeq ($(STATIC), 1)
706      LDFLAGS += $(shell $(PKG_CONFIG) sdl2 --static --libs)
707    else
708      LDFLAGS += $(shell $(PKG_CONFIG) sdl2 --libs)
709    endif
710
711    LDFLAGS += -lSDL2_ttf -lSDL2_image
712
713    # We don't use SDL_main -- we have proper main()/WinMain()
714    CXXFLAGS := $(filter-out -Dmain=SDL_main,$(CXXFLAGS))
715    LDFLAGS := $(filter-out -lSDL2main,$(LDFLAGS))
716  endif
717
718  DEFINES += -DTILES
719
720  ifeq ($(TARGETSYSTEM),WINDOWS)
721    ifndef DYNAMIC_LINKING
722      # These differ depending on what SDL2 is configured to use.
723      ifneq (,$(findstring mingw32,$(CROSS)))
724        # We use pkg-config to find out which libs are needed with MXE
725        LDFLAGS += $(shell $(PKG_CONFIG) --libs SDL2_image SDL2_ttf)
726      else
727        ifeq ($(MSYS2),1)
728          LDFLAGS += -Wl,--start-group -lharfbuzz -lfreetype -Wl,--end-group -lgraphite2 -lpng -lz -ltiff -lbz2 -lglib-2.0 -llzma -lws2_32 -lintl -liconv -lwebp -ljpeg -luuid
729        else
730          LDFLAGS += -lfreetype -lpng -lz -ljpeg -lbz2
731        endif
732      endif
733    else
734      # Currently none needed by the game itself (only used by SDL2 layer).
735      # Placeholder for future use (savegame compression, etc).
736      LDFLAGS +=
737    endif
738    TARGET = $(W32TILESTARGET)
739    ODIR = $(W32ODIRTILES)
740  else
741    TARGET = $(TILESTARGET)
742    ODIR = $(ODIRTILES)
743  endif
744else
745  ifeq ($(LOCALIZE),1)
746    NCURSES_PREFIX = ncursesw
747  else
748    NCURSES_PREFIX = ncurses
749  endif
750  ifdef OSXCROSS
751    NCURSES_PREFIX = ncurses
752  endif
753  # ONLY when not cross-compiling, check for pkg-config or ncurses5-config
754  # When doing a cross-compile, we can't rely on the host machine's -configs
755  ifeq ($(CROSS),)
756      ifeq ($(OSXCROSS),)
757        ifneq ($(shell pkg-config --libs $(NCURSES_PREFIX) 2>/dev/null),)
758          HAVE_PKGCONFIG = 1
759        endif
760        ifneq ($(shell which $(NCURSES_PREFIX)5-config 2>/dev/null),)
761          HAVE_NCURSES5CONFIG = 1
762        endif
763      endif
764  endif
765
766  # Link to ncurses if we're using a non-tiles, Linux build
767  ifeq ($(HAVE_PKGCONFIG),1)
768    CXXFLAGS += $(shell $(PKG_CONFIG) --cflags $(NCURSES_PREFIX))
769    LDFLAGS += $(shell $(PKG_CONFIG) --libs $(NCURSES_PREFIX))
770  else
771    ifeq ($(HAVE_NCURSES5CONFIG),1)
772      CXXFLAGS += $(shell $(NCURSES_PREFIX)5-config --cflags)
773      LDFLAGS += $(shell $(NCURSES_PREFIX)5-config --libs)
774    else
775      ifneq ($(TARGETSYSTEM),WINDOWS)
776        LDFLAGS += -l$(NCURSES_PREFIX)
777      endif
778
779      ifdef OSXCROSS
780        LDFLAGS += -L$(LIBSDIR)/$(NCURSES_PREFIX)/lib
781        CXXFLAGS += -I$(LIBSDIR)/$(NCURSES_PREFIX)/include
782      endif # OSXCROSS
783    endif # HAVE_NCURSES5CONFIG
784  endif # HAVE_PKGCONFIG
785endif # TILES
786
787ifeq ($(TARGETSYSTEM),CYGWIN)
788  ifeq ($(LOCALIZE),1)
789    # Work around Cygwin not including gettext support in glibc
790    LDFLAGS += -L/usr/local/lib -lintl
791  endif
792endif
793
794ifeq ($(BSD), 1)
795  # BSDs have backtrace() and friends in a separate library
796  ifeq ($(BACKTRACE), 1)
797    LDFLAGS += -lexecinfo
798    # ...which requires the frame pointer
799    CXXFLAGS += -fno-omit-frame-pointer
800  endif
801
802  # And similarly, their libcs don't have gettext built in
803  ifeq ($(LOCALIZE),1)
804    LDFLAGS += -L/usr/local/lib -lintl
805  endif
806
807  # libexecinfo, libintl and libiconv may be located in /usr/local on BSD
808  CXXFLAGS += -I/usr/local/include
809  LDFLAGS += -L/usr/local/lib
810endif
811
812# Global settings for Windows targets (at end)
813ifeq ($(TARGETSYSTEM),WINDOWS)
814  LDFLAGS += -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lversion
815  ifeq ($(BACKTRACE),1)
816    LDFLAGS += -ldbghelp
817    ifeq ($(LIBBACKTRACE),1)
818      LDFLAGS += -lbacktrace
819    endif
820  endif
821endif
822
823ifeq ($(BACKTRACE),1)
824  DEFINES += -DBACKTRACE
825  ifeq ($(LIBBACKTRACE),1)
826      DEFINES += -DLIBBACKTRACE
827  endif
828endif
829
830ifeq ($(LOCALIZE),1)
831  DEFINES += -DLOCALIZE
832endif
833
834ifeq ($(TARGETSYSTEM),LINUX)
835  BINDIST_EXTRAS += cataclysm-launcher
836  ifeq ($(BACKTRACE),1)
837    # -rdynamic needed for symbols in backtraces
838    LDFLAGS += -rdynamic
839  endif
840endif
841
842ifeq ($(TARGETSYSTEM),CYGWIN)
843  BINDIST_EXTRAS += cataclysm-launcher
844  DEFINES += -D_GLIBCXX_USE_C99_MATH_TR1
845endif
846
847ifeq ($(MSYS2),1)
848  DEFINES += -D_GLIBCXX_USE_C99_MATH_TR1
849  CXXFLAGS += -DMSYS2
850endif
851
852# Enumerations of all the source files and headers.
853SOURCES := $(wildcard $(SRC_DIR)/*.cpp)
854HEADERS := $(wildcard $(SRC_DIR)/*.h)
855TESTSRC := $(wildcard tests/*.cpp)
856TESTHDR := $(wildcard tests/*.h)
857JSON_FORMATTER_SOURCES := tools/format/format.cpp tools/format/format_main.cpp src/json.cpp
858CHKJSON_SOURCES := src/chkjson/chkjson.cpp src/json.cpp
859CLANG_TIDY_PLUGIN_SOURCES := \
860  $(wildcard tools/clang-tidy-plugin/*.cpp tools/clang-tidy-plugin/*/*.cpp)
861TOOLHDR := $(wildcard tools/*/*.h)
862# Using sort here because it has the side-effect of deduplicating the list
863ASTYLE_SOURCES := $(sort \
864  $(SOURCES) \
865  $(HEADERS) \
866  $(TESTSRC) \
867  $(TESTHDR) \
868  $(JSON_FORMATTER_SOURCES) \
869  $(CHKJSON_SOURCES) \
870  $(CLANG_TIDY_PLUGIN_SOURCES) \
871  $(TOOLHDR))
872
873_OBJS = $(SOURCES:$(SRC_DIR)/%.cpp=%.o)
874ifeq ($(TARGETSYSTEM),WINDOWS)
875  RSRC = $(wildcard $(SRC_DIR)/*.rc)
876  _OBJS += $(RSRC:$(SRC_DIR)/%.rc=%.o)
877endif
878OBJS = $(sort $(patsubst %,$(ODIR)/%,$(_OBJS)))
879
880ifdef LANGUAGES
881  L10N = localization
882endif
883
884ifeq ($(TARGETSYSTEM), LINUX)
885  ifneq ($(PREFIX),)
886    DEFINES += -DPREFIX="$(PREFIX)" -DDATA_DIR_PREFIX
887  endif
888endif
889
890ifeq ($(TARGETSYSTEM), CYGWIN)
891  ifneq ($(PREFIX),)
892    DEFINES += -DPREFIX="$(PREFIX)" -DDATA_DIR_PREFIX
893  endif
894endif
895
896ifeq ($(USE_HOME_DIR),1)
897  ifeq ($(USE_XDG_DIR),1)
898    $(error "USE_HOME_DIR=1 does not work with USE_XDG_DIR=1")
899  endif
900  DEFINES += -DUSE_HOME_DIR
901endif
902
903ifeq ($(USE_XDG_DIR),1)
904  ifeq ($(USE_HOME_DIR),1)
905    $(error "USE_HOME_DIR=1 does not work with USE_XDG_DIR=1")
906  endif
907  DEFINES += -DUSE_XDG_DIR
908endif
909
910ifeq ($(LTO), 1)
911  # Depending on the compiler version, LTO usually requires all the
912  # optimization flags to be specified on the link line, and requires them to
913  # match the original invocations.
914  LDFLAGS += $(CXXFLAGS)
915
916  # If GCC or CLANG, use a wrapper for AR (if it exists) else test fails to build
917  ifeq ($(CLANG), 0)
918    GCCAR := $(shell command -v gcc-ar 2> /dev/null)
919    ifdef GCCAR
920      ifneq (,$(findstring gcc version,$(shell $(CXX) -v </dev/null 2>&1)))
921        AR = gcc-ar
922      endif
923    endif
924  else
925    LLVMAR := $(shell command -v llvm-ar 2> /dev/null)
926    ifdef LLVMAR
927      ifneq (,$(findstring clang version,$(shell $(CXX) -v </dev/null 2>&1)))
928        AR = llvm-ar
929      endif
930    endif
931  endif
932endif
933
934all: version $(CHECKS) $(TARGET) $(L10N) $(TESTS)
935	@
936
937$(TARGET): $(OBJS)
938	+$(LD) $(W32FLAGS) -o $(TARGET) $(OBJS) $(LDFLAGS)
939ifeq ($(RELEASE), 1)
940  ifndef DEBUG_SYMBOLS
941    ifneq ($(BACKTRACE),1)
942	$(STRIP) $(TARGET)
943    endif
944  endif
945endif
946
947$(PCH_P): $(PCH_H)
948	-$(CXX) $(CPPFLAGS) $(DEFINES) $(subst ,,$(CXXFLAGS)) -c $(PCH_H) -o $(PCH_P)
949
950$(BUILD_PREFIX)$(TARGET_NAME).a: $(OBJS)
951	$(AR) rcs $(BUILD_PREFIX)$(TARGET_NAME).a $(filter-out $(ODIR)/main.o $(ODIR)/messages.o,$(OBJS))
952
953.PHONY: version
954version:
955	@( VERSION_STRING=$(VERSION) ; \
956            [ -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 ; \
957            [ -e "$(SRC_DIR)/version.h" ] && OLDVERSION=$$(grep VERSION $(SRC_DIR)/version.h|cut -d '"' -f2) ; \
958            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 \
959         )
960
961# Unconditionally create the object dir on every invocation.
962$(shell mkdir -p $(ODIR))
963
964$(ODIR)/%.o: $(SRC_DIR)/%.cpp $(PCH_P)
965	$(CXX) $(CPPFLAGS) $(DEFINES) $(CXXFLAGS) $(PCHFLAGS) -c $< -o $@
966
967$(ODIR)/%.o: $(SRC_DIR)/%.rc
968	$(RC) $(RFLAGS) $< -o $@
969
970src/version.h: version
971
972src/version.cpp: src/version.h
973
974localization:
975	lang/compile_mo.sh $(LANGUAGES)
976
977$(CHKJSON_BIN): $(CHKJSON_SOURCES)
978	$(CXX) $(CXXFLAGS) $(TOOL_CXXFLAGS) -Isrc/chkjson -Isrc $(CHKJSON_SOURCES) -o $(CHKJSON_BIN)
979
980json-check: $(CHKJSON_BIN)
981	./$(CHKJSON_BIN)
982
983clean: clean-tests clean-object_creator clean-pch
984	rm -rf *$(TARGET_NAME) *$(TILES_TARGET_NAME)
985	rm -rf *$(TILES_TARGET_NAME).exe *$(TARGET_NAME).exe *$(TARGET_NAME).a
986	rm -rf *obj *objwin
987	rm -rf *$(BINDIST_DIR) *cataclysmdda-*.tar.gz *cataclysmdda-*.zip
988	rm -f $(SRC_DIR)/version.h
989	rm -f $(CHKJSON_BIN)
990
991distclean:
992	rm -rf *$(BINDIST_DIR)
993	rm -rf save
994	rm -rf lang/mo
995	rm -f data/options.txt
996	rm -f data/keymap.txt
997	rm -f data/auto_pickup.txt
998	rm -f data/fontlist.txt
999
1000bindist: $(BINDIST)
1001
1002ifeq ($(TARGETSYSTEM), LINUX)
1003DATA_PREFIX=$(DESTDIR)$(PREFIX)/share/cataclysm-dda/
1004BIN_PREFIX=$(DESTDIR)$(PREFIX)/bin
1005LOCALE_DIR=$(DESTDIR)$(PREFIX)/share/locale
1006SHARE_DIR=$(DESTDIR)$(PREFIX)/share
1007install: version $(TARGET)
1008	mkdir -p $(DATA_PREFIX)
1009	mkdir -p $(BIN_PREFIX)
1010	install -m 755 $(TARGET) $(BIN_PREFIX)
1011	cp -R  data/core $(DATA_PREFIX)
1012	cp -R  data/font $(DATA_PREFIX)
1013	cp -R  data/json $(DATA_PREFIX)
1014	cp -R  data/mods $(DATA_PREFIX)
1015	cp -R  data/names $(DATA_PREFIX)
1016	cp -R  data/raw $(DATA_PREFIX)
1017	cp -R  data/motd $(DATA_PREFIX)
1018	cp -R  data/credits $(DATA_PREFIX)
1019	cp -R  data/title $(DATA_PREFIX)
1020	cp -R  data/help $(DATA_PREFIX)
1021ifeq ($(TILES), 1)
1022	cp -R  gfx $(DATA_PREFIX)
1023	mkdir -p $(SHARE_DIR)/applications/
1024	install -m 755 data/xdg/org.cataclysmdda.CataclysmDDA.desktop $(SHARE_DIR)/applications/
1025	mkdir -p $(SHARE_DIR)/metainfo/
1026	install -m 644 data/xdg/org.cataclysmdda.CataclysmDDA.appdata.xml $(SHARE_DIR)/metainfo/
1027	mkdir -p $(SHARE_DIR)/icons/hicolor/scalable/apps/
1028	install -m 644 data/xdg/org.cataclysmdda.CataclysmDDA.svg $(SHARE_DIR)/icons/hicolor/scalable/apps/
1029endif
1030ifeq ($(SOUND), 1)
1031	cp -R  data/sound $(DATA_PREFIX)
1032endif
1033	install -m 644 data/changelog.txt data/cataicon.ico data/fontdata.json \
1034                   LICENSE.txt LICENSE-OFL-Terminus-Font.txt $(DATA_PREFIX)
1035	mkdir -p $(LOCALE_DIR)
1036ifdef LANGUAGES
1037	LOCALE_DIR=$(LOCALE_DIR) lang/compile_mo.sh $(LANGUAGES)
1038endif
1039endif
1040
1041ifeq ($(TARGETSYSTEM), CYGWIN)
1042DATA_PREFIX=$(DESTDIR)$(PREFIX)/share/cataclysm-dda/
1043BIN_PREFIX=$(DESTDIR)$(PREFIX)/bin
1044LOCALE_DIR=$(DESTDIR)$(PREFIX)/share/locale
1045SHARE_DIR=$(DESTDIR)$(PREFIX)/share
1046install: version $(TARGET)
1047	mkdir -p $(DATA_PREFIX)
1048	mkdir -p $(BIN_PREFIX)
1049	install -m 755 $(TARGET) $(BIN_PREFIX)
1050	cp -R  data/core $(DATA_PREFIX)
1051	cp -R  data/font $(DATA_PREFIX)
1052	cp -R  data/json $(DATA_PREFIX)
1053	cp -R  data/mods $(DATA_PREFIX)
1054	cp -R  data/names $(DATA_PREFIX)
1055	cp -R  data/raw $(DATA_PREFIX)
1056	cp -R  data/motd $(DATA_PREFIX)
1057	cp -R  data/credits $(DATA_PREFIX)
1058	cp -R  data/title $(DATA_PREFIX)
1059	cp -R  data/help $(DATA_PREFIX)
1060ifeq ($(TILES), 1)
1061	cp -R  gfx $(DATA_PREFIX)
1062	install -Dm755 $(SHARE_DIR)/applications/ data/xdg/org.cataclysmdda.CataclysmDDA.desktop
1063	install -Dm644 $(SHARE_DIR)/metainfo/ data/xdg/org.cataclysmdda.CataclysmDDA.appdata.xml
1064	install -Dm644 $(SHARE_DIR)/icons/hicolor/scalable/apps/ data/xdg/org.cataclysmdda.CataclysmDDA.svg
1065endif
1066ifeq ($(SOUND), 1)
1067	cp -R  data/sound $(DATA_PREFIX)
1068endif
1069	install -m 644 data/changelog.txt data/cataicon.ico data/fontdata.json \
1070                   LICENSE.txt LICENSE-OFL-Terminus-Font.txt $(DATA_PREFIX)
1071	mkdir -p $(LOCALE_DIR)
1072ifdef LANGUAGES
1073	LOCALE_DIR=$(LOCALE_DIR) lang/compile_mo.sh $(LANGUAGES)
1074endif
1075endif
1076
1077
1078ifeq ($(NATIVE), osx)
1079APPTARGETDIR=Cataclysm.app
1080APPRESOURCESDIR=$(APPTARGETDIR)/Contents/Resources
1081APPDATADIR=$(APPRESOURCESDIR)/data
1082ifndef FRAMEWORK
1083  SDLLIBSDIR=$(shell sdl2-config --libs | sed -n 's/.*-L\([^ ]*\) .*/\1/p')
1084endif  # ifndef FRAMEWORK
1085
1086appclean:
1087	rm -rf $(APPTARGETDIR)
1088	rm -f data/options.txt
1089	rm -f data/keymap.txt
1090	rm -f data/auto_pickup.txt
1091	rm -f data/fontlist.txt
1092
1093build-data/osx/AppIcon.icns: build-data/osx/AppIcon.iconset
1094	iconutil -c icns $<
1095
1096ifdef OSXCROSS
1097app: appclean version $(APPTARGET)
1098else
1099app: appclean version build-data/osx/AppIcon.icns $(APPTARGET)
1100endif
1101	mkdir -p $(APPTARGETDIR)/Contents
1102	cp build-data/osx/Info.plist $(APPTARGETDIR)/Contents/
1103	mkdir -p $(APPTARGETDIR)/Contents/MacOS
1104	cp build-data/osx/Cataclysm.sh $(APPTARGETDIR)/Contents/MacOS/
1105	mkdir -p $(APPRESOURCESDIR)
1106	cp $(APPTARGET) $(APPRESOURCESDIR)/
1107	cp build-data/osx/AppIcon.icns $(APPRESOURCESDIR)/
1108	mkdir -p $(APPDATADIR)
1109	cp data/fontdata.json $(APPDATADIR)
1110	cp -R data/core $(APPDATADIR)
1111	cp -R data/font $(APPDATADIR)
1112	cp -R data/json $(APPDATADIR)
1113	cp -R data/mods $(APPDATADIR)
1114	cp -R data/names $(APPDATADIR)
1115	cp -R data/raw $(APPDATADIR)
1116	cp -R data/motd $(APPDATADIR)
1117	cp -R data/credits $(APPDATADIR)
1118	cp -R data/title $(APPDATADIR)
1119	cp -R data/help $(APPDATADIR)
1120ifdef LANGUAGES
1121	lang/compile_mo.sh $(LANGUAGES)
1122	mkdir -p $(APPRESOURCESDIR)/lang/mo/
1123	cp -pR lang/mo/* $(APPRESOURCESDIR)/lang/mo/
1124endif
1125ifeq ($(LOCALIZE), 1)
1126	LIBINTL=$$($(CROSS)otool -L $(APPTARGET) | grep libintl | sed -n 's/\(.*\.dylib\).*/\1/p') && if [ -f $$LIBINTL ]; then cp $$LIBINTL $(APPRESOURCESDIR)/; fi; \
1127		if [ ! -z "$$OSXCROSS" ]; then LIBINTL=$$(basename $$LIBINTL) && if [ ! -z "$$LIBINTL" ]; then cp $(LIBSDIR)/gettext/lib/$$LIBINTL $(APPRESOURCESDIR)/; fi; fi
1128endif
1129ifeq ($(TILES), 1)
1130ifeq ($(SOUND), 1)
1131	cp -R data/sound $(APPDATADIR)
1132endif  # ifdef SOUND
1133	cp -R gfx $(APPRESOURCESDIR)/
1134ifdef FRAMEWORK
1135	cp -R $(FRAMEWORKSDIR)/SDL2.framework $(APPRESOURCESDIR)/
1136	cp -R $(FRAMEWORKSDIR)/SDL2_image.framework $(APPRESOURCESDIR)/
1137	cp -R $(FRAMEWORKSDIR)/SDL2_ttf.framework $(APPRESOURCESDIR)/
1138ifeq ($(SOUND), 1)
1139	cp -R $(FRAMEWORKSDIR)/SDL2_mixer.framework $(APPRESOURCESDIR)/
1140	cd $(APPRESOURCESDIR)/ && ln -s SDL2_mixer.framework/Frameworks/Vorbis.framework Vorbis.framework
1141	cd $(APPRESOURCESDIR)/ && ln -s SDL2_mixer.framework/Frameworks/Ogg.framework Ogg.framework
1142	cd $(APPRESOURCESDIR)/SDL2_mixer.framework/Frameworks && find . -maxdepth 1 -type d -not -name '*Vorbis.framework' -not -name '*Ogg.framework' -not -name '.' | xargs rm -rf
1143endif  # ifdef SOUND
1144else # libsdl build
1145	cp $(SDLLIBSDIR)/libSDL2.dylib $(APPRESOURCESDIR)/
1146	cp $(SDLLIBSDIR)/libSDL2_image.dylib $(APPRESOURCESDIR)/
1147	cp $(SDLLIBSDIR)/libSDL2_ttf.dylib $(APPRESOURCESDIR)/
1148ifeq ($(SOUND), 1)
1149	cp $(SDLLIBSDIR)/libSDL2_mixer.dylib $(APPRESOURCESDIR)/
1150endif  # ifdef SOUND
1151endif  # ifdef FRAMEWORK
1152
1153endif  # ifdef TILES
1154
1155dmgdistclean:
1156	rm -rf Cataclysm
1157	rm -f Cataclysm.dmg
1158	rm -rf lang/mo
1159
1160dmgdist: dmgdistclean $(L10N) app
1161ifdef OSXCROSS
1162	mkdir Cataclysm
1163	cp -a $(APPTARGETDIR) Cataclysm/$(APPTARGETDIR)
1164	cp build-data/osx/DS_Store Cataclysm/.DS_Store
1165	cp build-data/osx/dmgback.png Cataclysm/.background.png
1166	ln -s /Applications Cataclysm/Applications
1167	genisoimage -quiet -D -V "Cataclysm DDA" -no-pad -r -apple -o Cataclysm-uncompressed.dmg Cataclysm/
1168	dmg dmg Cataclysm-uncompressed.dmg Cataclysm.dmg
1169	rm Cataclysm-uncompressed.dmg
1170else
1171	plutil -convert binary1 Cataclysm.app/Contents/Info.plist
1172	dmgbuild -s build-data/osx/dmgsettings.py "Cataclysm DDA" Cataclysm.dmg
1173endif
1174
1175endif  # ifeq ($(NATIVE), osx)
1176
1177$(BINDIST): distclean version $(TARGET) $(L10N) $(BINDIST_EXTRAS) $(BINDIST_LOCALE)
1178	mkdir -p $(BINDIST_DIR)
1179	cp -R $(TARGET) $(BINDIST_EXTRAS) $(BINDIST_DIR)
1180ifdef LANGUAGES
1181	cp -R --parents lang/mo $(BINDIST_DIR)
1182endif
1183	$(BINDIST_CMD)
1184
1185export ODIR _OBJS LDFLAGS CXX W32FLAGS DEFINES CXXFLAGS TARGETSYSTEM CLANG PCH PCHFLAGS
1186
1187ctags: $(ASTYLE_SOURCES)
1188	ctags $^
1189	./tools/json_tools/cddatags.py
1190
1191etags: $(ASTYLE_SOURCES)
1192	etags $^
1193	./tools/json_tools/cddatags.py
1194
1195astyle: $(ASTYLE_SOURCES)
1196	$(ASTYLE_BINARY) --options=.astylerc -n $(ASTYLE_SOURCES)
1197
1198# Test whether the system has a version of astyle that supports --dry-run
1199ifeq ($(shell if $(ASTYLE_BINARY) -Q -X --dry-run src/game.h > /dev/null; then echo foo; fi),foo)
1200  ASTYLE_CHECK=$(shell $(ASTYLE_BINARY) --options=.astylerc --dry-run -X -Q --ascii $(ASTYLE_SOURCES))
1201endif
1202
1203astyle-check:
1204ifdef ASTYLE_CHECK
1205	$(info $(ASTYLE_BINARY) -V: $(shell $(ASTYLE_BINARY) -V))
1206	@if [ "$(findstring Formatted,$(ASTYLE_CHECK))" = "" ]; then echo "no astyle regressions";\
1207        else printf "astyle regressions found.\n$(ASTYLE_CHECK)\n" && false; fi
1208else
1209	@echo Cannot run an astyle check, your system either does not have astyle, or it is too old.
1210endif
1211
1212style-json: json_blacklist $(JSON_FORMATTER_BIN)
1213ifndef CROSS
1214	find data gfx -name "*.json" -print0 | grep -v -z -F -f json_blacklist | \
1215	  xargs -0 -L 1 $(JSON_FORMATTER_BIN)
1216else
1217	@echo Cannot run json formatter in cross compiles.
1218endif
1219
1220style-all-json: $(JSON_FORMATTER_BIN)
1221	find data -name "*.json" -print0 | xargs -0 -L 1 $(JSON_FORMATTER_BIN)
1222
1223$(JSON_FORMATTER_BIN): $(JSON_FORMATTER_SOURCES)
1224	$(CXX) $(CXXFLAGS) $(TOOL_CXXFLAGS) -Itools/format -Isrc \
1225	  $(JSON_FORMATTER_SOURCES) -o $(JSON_FORMATTER_BIN)
1226
1227python-check:
1228	flake8
1229
1230tests: version $(BUILD_PREFIX)cataclysm.a
1231	$(MAKE) -C tests
1232
1233check: version $(BUILD_PREFIX)cataclysm.a
1234	$(MAKE) -C tests check
1235
1236clean-tests:
1237	$(MAKE) -C tests clean
1238
1239object_creator: version $(BUILD_PREFIX)cataclysm.a
1240	$(MAKE) -C object_creator
1241
1242clean-object_creator:
1243	$(MAKE) -C object_creator clean
1244
1245clean-pch:
1246	rm -f pch/*pch.hpp.gch
1247	rm -f pch/*pch.hpp.pch
1248	rm -f pch/*pch.hpp.d
1249
1250.PHONY: tests check ctags etags clean-tests clean-object_creator clean-pch install lint
1251
1252-include $(SOURCES:$(SRC_DIR)/%.cpp=$(DEPDIR)/%.P)
1253-include ${OBJS:.o=.d}
1254