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