/ Common.mak
Common.mak
   1  
   2  # OS package maintainers: Please try invoking make with PACKAGE_REPOSITORY=1 to see if that meets your needs before patching out our optimizations entirely.
   3  PACKAGE_REPOSITORY ?= 0
   4  
   5  # Are we running from synthesis?
   6  SYNTHESIS := 0
   7  
   8  
   9  ##### Makefile Swiss army knife
  10  
  11  override empty :=
  12  override space := $(empty) $(empty)
  13  override comma := ,
  14  override paren_open := (
  15  override paren_close := )
  16  
  17  
  18  ##### Detect platform
  19  
  20  ifndef HOSTPLATFORM
  21      HOSTPLATFORM := UNKNOWN
  22      ifeq ($(findstring Windows,$(OS)),Windows)
  23          HOSTPLATFORM := WINDOWS
  24      else
  25          uname := $(strip $(shell uname -s))
  26          ifeq ($(findstring Linux,$(uname)),Linux)
  27              HOSTPLATFORM := LINUX
  28          else ifeq ($(findstring BSD,$(uname)),BSD)
  29              HOSTPLATFORM := BSD
  30          else ifeq ($(findstring MINGW,$(uname)),MINGW)
  31              HOSTPLATFORM := WINDOWS
  32          else ifeq ($(findstring MSYS,$(uname)),MSYS)
  33              HOSTPLATFORM := WINDOWS
  34          else ifeq ($(findstring Darwin,$(uname)),Darwin)
  35              HOSTPLATFORM := DARWIN
  36          else ifeq ($(findstring BeOS,$(uname)),BeOS)
  37              HOSTPLATFORM := BEOS
  38          endif
  39      endif
  40  endif
  41  ifndef PLATFORM
  42      PLATFORM := $(HOSTPLATFORM)
  43  endif
  44  
  45  ifndef SUBPLATFORM
  46      SUBPLATFORM :=
  47      ifeq ($(PLATFORM),$(filter $(PLATFORM),LINUX DINGOO GCW CAANOO))
  48          SUBPLATFORM := LINUX
  49      endif
  50  endif
  51  
  52  ifeq ($(HOSTPLATFORM),DARWIN)
  53      DARWINVERSION := $(word 1,$(subst ., ,$(strip $(shell uname -r))))
  54  
  55      DARWIN9 := 0
  56      DARWIN10 := 0
  57      ifneq (,$(filter 0 1 2 3 4 5 6 7 8 9 10,$(DARWINVERSION)))
  58          DARWIN10 := 1
  59          ifneq (,$(filter 0 1 2 3 4 5 6 7 8 9,$(DARWINVERSION)))
  60              DARWIN9 := 1
  61          endif
  62      endif
  63  endif
  64  
  65  HOSTEXESUFFIX :=
  66  ifeq ($(HOSTPLATFORM),WINDOWS)
  67      HOSTEXESUFFIX := .exe
  68  endif
  69  
  70  EXESUFFIX :=
  71  DLLSUFFIX := .so
  72  DOLSUFFIX := .dol
  73  ifeq ($(PLATFORM),DARWIN)
  74      DLLSUFFIX := .dylib
  75  endif
  76  ifeq ($(PLATFORM),WII)
  77      EXESUFFIX := .elf
  78  endif
  79  ifeq ($(PLATFORM),WINDOWS)
  80      EXESUFFIX := .exe
  81      DLLSUFFIX := .dll
  82  endif
  83  
  84  
  85  ##### Makefile meta-settings
  86  
  87  PRETTY_OUTPUT := 1
  88  
  89  NULLSTREAM := /dev/null
  90  
  91  ifeq ($(HOSTPLATFORM),WINDOWS)
  92  # MSYS2 lets you create files named NUL but has a /dev/null. Go figure.
  93      ifeq (,$(wildcard /dev/null))
  94          NULLSTREAM := NUL
  95      endif
  96  endif
  97  
  98  DONT_PRINT := > $(NULLSTREAM) 2>&1
  99  DONT_PRINT_STDERR := 2> $(NULLSTREAM)
 100  DONT_FAIL := ; exit 0
 101  ESCAPE=\\
 102  
 103  HAVE_SH := 1
 104  # when no sh.exe is found in PATH on Windows, no path is prepended to it
 105  ifeq (sh.exe,$(SHELL))
 106      HAVE_SH := 0
 107  endif
 108  
 109  define LL
 110      ls -l $1
 111  endef
 112  define MKDIR
 113      mkdir -p $1
 114  endef
 115  define RM
 116      rm -f $(filter-out / *,$1)
 117  endef
 118  define RMDIR
 119      rm -rf $(filter-out / *,$1)
 120  endef
 121  define CAT
 122      cat $1
 123  endef
 124  define RAW_ECHO
 125      echo '$1'
 126  endef
 127  
 128  ifeq (0,$(HAVE_SH))
 129      DONT_FAIL := & rem
 130      ESCAPE=^
 131  
 132      define LL
 133          dir $(subst /,\,$1)
 134      endef
 135      define MKDIR
 136          if not exist $(subst /,\,$1) mkdir $(subst /,\,$1)
 137      endef
 138      define RM
 139          del /f /q $(subst /,\,$(filter-out / *,$1)) $(DONT_PRINT_STDERR) $(DONT_FAIL)
 140      endef
 141      define RMDIR
 142          rmdir /s /q $(subst /,\,$(filter-out / *,$1)) $(DONT_PRINT_STDERR) $(DONT_FAIL)
 143      endef
 144      define CAT
 145          type $(subst /,\,$1)
 146      endef
 147      define RAW_ECHO
 148          echo $(subst ",$(ESCAPE)",$(subst $(paren_open),$(ESCAPE)$(paren_open),$(subst $(paren_close),$(ESCAPE)$(paren_close),$1)))
 149      endef
 150  
 151      # if, printf, exit, and ; are unavailable without sh
 152      PRETTY_OUTPUT := 0
 153  endif
 154  
 155  
 156  ##### Toolchain setup
 157  
 158  CROSS :=
 159  CROSS_SUFFIX :=
 160  
 161  CCFULLPATH = $(CC)
 162  
 163  ifeq ($(PLATFORM),WII)
 164      ifeq ($(strip $(DEVKITPPC)),)
 165          $(error "Please set DEVKITPPC in your environment. export DEVKITPPC := <path to>devkitPPC")
 166      endif
 167  
 168      ifeq ($(HOSTPLATFORM),WINDOWS)
 169          override DEVKITPRO := $(subst /c/,C:/,$(DEVKITPRO))
 170          override DEVKITPPC := $(subst /c/,C:/,$(DEVKITPPC))
 171      endif
 172  
 173      export PATH := $(DEVKITPPC)/bin:$(PATH)
 174  
 175      CROSS := powerpc-eabi-
 176  
 177      CCFULLPATH = $(DEVKITPPC)/bin/$(CC)
 178  else ifeq ($(PLATFORM),$(filter $(PLATFORM),DINGOO GCW))
 179      CROSS := mipsel-linux-
 180  endif
 181  
 182  CC := $(CROSS)gcc$(CROSS_SUFFIX)
 183  CXX := $(CROSS)g++$(CROSS_SUFFIX)
 184  
 185  ifeq ($(PLATFORM),DARWIN)
 186      CC := $(CROSS)clang$(CROSS_SUFFIX)
 187      CXX := $(CROSS)clang++$(CROSS_SUFFIX)
 188  endif
 189  
 190  COBJC := $(CC) -x objective-c
 191  COBJCXX := $(CXX) -x objective-c++
 192  L_CC := $(CC)
 193  L_CXX := $(CXX)
 194  
 195  AR := $(CROSS)ar$(CROSS_SUFFIX)
 196  RC := $(CROSS)windres$(CROSS_SUFFIX)
 197  RANLIB := $(CROSS)ranlib$(CROSS_SUFFIX)
 198  STRIP := $(CROSS)strip$(CROSS_SUFFIX)
 199  
 200  AS := nasm
 201  
 202  PKG_CONFIG := pkg-config
 203  
 204  ELF2DOL := elf2dol
 205  
 206  # Override defaults that absolutely will not work.
 207  ifeq ($(CC),cc)
 208      override CC := gcc
 209  endif
 210  ifeq ($(AS),as)
 211      override AS := nasm
 212  endif
 213  
 214  CLANG := 0
 215  ifeq ($(findstring clang,$(CC) $(MAKECMDGOALS)),clang)
 216      override CLANG := 1
 217      CLANGNAME := $(CC)
 218  else
 219      CLANGNAME := clang
 220  endif
 221  # detect clang symlinked as gcc, as in OS X
 222  CLANG_POTENTIAL_VERSION := $(shell $(CCFULLPATH) --version)
 223  ifeq ($(findstring clang,$(CLANG_POTENTIAL_VERSION)),clang)
 224      override CLANG := 1
 225      ifeq ($(findstring Apple,$(CLANG_POTENTIAL_VERSION)),Apple)
 226          override APPLE_CLANG := 1
 227          APPLE_CLANG_VER := $(word 4,$(CLANG_POTENTIAL_VERSION))
 228          override APPLE_CLANG_VER_SPLIT := $(subst ., ,$(APPLE_CLANG_VER))
 229          APPLE_CLANG_MAJOR := $(word 1,$(APPLE_CLANG_VER_SPLIT))
 230          APPLE_CLANG_MINOR := $(word 2,$(APPLE_CLANG_VER_SPLIT))
 231      else
 232          CLANG_VER := $(word 3,$(CLANG_POTENTIAL_VERSION))
 233          override CLANG_VER_SPLIT := $(subst ., ,$(CLANG_VER))
 234          CLANG_MAJOR := $(word 1,$(CLANG_VER_SPLIT))
 235          CLANG_MINOR := $(word 2,$(CLANG_VER_SPLIT))
 236      endif
 237  endif
 238  
 239  LLD := 0
 240  
 241  ifneq (0,$(CLANG))
 242      ifneq ($(PLATFORM),DARWIN)
 243          override LLD := 1
 244      endif
 245      CLANGXXNAME := $(subst clang,clang++,$(CLANGNAME))
 246      override CC := $(CLANGNAME) -x c
 247      override CXX := $(CLANGXXNAME) -x c++
 248      override COBJC := $(CLANGNAME) -x objective-c
 249      override COBJCXX := $(CLANGXXNAME) -x objective-c++
 250      override L_CC := $(CLANGNAME)
 251      override L_CXX := $(CLANGXXNAME)
 252  endif
 253  
 254  GCC_VER :=
 255  ifeq (0,$(CLANG))
 256      GCC_VER := $(strip $(shell $(CCFULLPATH) -dumpversion 2>&1))
 257  endif
 258  ifeq (,$(GCC_VER))
 259      GCC_VER := 4.9.0
 260  endif
 261  override GCC_VER_SPLIT := $(subst ., ,$(GCC_VER))
 262  GCC_MAJOR := $(word 1,$(GCC_VER_SPLIT))
 263  GCC_MINOR := $(word 2,$(GCC_VER_SPLIT))
 264  
 265  GCC_PREREQ_4 := 1
 266  
 267  ifneq (,$(filter 1 2 3,$(GCC_MAJOR)))
 268      ifeq (0,$(CLANG))
 269          GCC_PREREQ_4 := 0
 270          $(error How do you still have an old GCC in $$(CURRENT_YEAR)?)
 271      endif
 272  endif
 273  
 274  
 275  ##### Detect machine architecture
 276  
 277  BITS := 32
 278  
 279  ifeq ($(PLATFORM),WINDOWS)
 280      ifndef COMPILERTARGET
 281          COMPILERTARGET := $(strip $(shell $(CC) -dumpmachine))
 282      endif
 283  
 284      IMPLICIT_ARCH := i386
 285      ifeq ($(findstring x86_64,$(COMPILERTARGET)),x86_64)
 286          IMPLICIT_ARCH := x86_64
 287          BITS := 64
 288      endif
 289  else ifeq ($(PLATFORM),WII)
 290      IMPLICIT_ARCH := ppc
 291  else ifeq ($(PLATFORM),$(filter $(PLATFORM),DINGOO GCW))
 292      IMPLICIT_ARCH := mipsel
 293  else
 294      ifneq ($(ARCH),)
 295          override ARCH := $(subst i486,i386,$(subst i586,i386,$(subst i686,i386,$(strip $(ARCH)))))
 296          IMPLICIT_ARCH := $(ARCH)
 297      else
 298          IMPLICIT_ARCH := $(subst i486,i386,$(subst i586,i386,$(subst i686,i386,$(strip $(shell uname -m)))))
 299      endif
 300  
 301      ifeq ($(findstring x86_64,$(IMPLICIT_ARCH)),x86_64)
 302          BITS := 64
 303      endif
 304      ifeq ($(findstring arm64,$(IMPLICIT_ARCH)),arm64)
 305          BITS := 64
 306      endif
 307  endif
 308  
 309  
 310  ##### Toggles
 311  
 312  #  CPLUSPLUS - 1 := enable building C source as C++
 313  #  RELEASE - 1 := no debugging
 314  #  FORCEDEBUG:
 315  #    1 := Include debug symbols even when generating release code.
 316  #    2 := Also enable sanitizers with Clang. On the C side, make 'sprite' etc. be real arrays.
 317  #  KRANDDEBUG - 1 := include logging of krand() calls for debugging the demo system
 318  #  MEMMAP - 1 := produce .memmap file when linking
 319  #  OPTLEVEL - 0..3 := GCC optimization strategy
 320  #  LTO - 1 := enable link-time optimization
 321  
 322  # Optional overrides for text
 323  APPNAME ?=
 324  APPBASENAME ?=
 325  
 326  # Build toggles
 327  RELEASE := 1
 328  NOASM := 0
 329  MEMMAP := 0
 330  CPLUSPLUS := 1
 331  
 332  # Feature toggles
 333  STANDALONE ?= 0
 334  NETCODE ?= 1
 335  STARTUP_WINDOW ?= 1
 336  POLYMER ?= 1
 337  USE_OPENGL := 1
 338  SDL_STATIC ?= 0
 339  
 340  NOONE_EXTENSIONS ?= 1
 341  
 342  # Library toggles
 343  HAVE_GTK2 := 1
 344  USE_LIBVPX ?= 0
 345  HAVE_VORBIS := 1
 346  HAVE_FLAC := 1
 347  HAVE_XMP := 1
 348  RENDERTYPE := SDL
 349  SDL_TARGET := 2
 350  USE_PHYSFS := 0
 351  USE_MIMALLOC := 1
 352  
 353  ifneq (0,$(USE_PHYSFS))
 354      # PhysFS requires this to be off
 355      override CPLUSPLUS := 0
 356  endif
 357  
 358  # Debugging/Build options
 359  FORCEDEBUG := 0
 360  KRANDDEBUG := 0
 361  PROFILER := 0
 362  # Make allocache() a wrapper around malloc()? Useful for debugging
 363  # allocache()-allocated memory accesses with e.g. Valgrind.
 364  # For debugging with Valgrind + GDB, see
 365  # http://valgrind.org/docs/manual/manual-core-adv.html#manual-core-adv.gdbserver
 366  ALLOCACHE_AS_MALLOC := 0
 367  MICROPROFILE := 0
 368  
 369  ##### Settings overrides and implicit cascades
 370  
 371  ifneq (0,$(KRANDDEBUG))
 372      RELEASE := 0
 373  endif
 374  ifneq (100,$(RELEASE)$(PROFILER)$(ALLOCACHE_AS_MALLOC))
 375      # so that we have debug symbols
 376      FORCEDEBUG := 1
 377  endif
 378  
 379  ifeq ($(PLATFORM),WINDOWS)
 380      override HAVE_GTK2 := 0
 381  else ifeq ($(PLATFORM),DARWIN)
 382      HAVE_GTK2 := 0
 383  else ifeq ($(PLATFORM),WII)
 384      override USE_OPENGL := 0
 385      override NETCODE := 0
 386      override HAVE_GTK2 := 0
 387      override HAVE_FLAC := 0
 388      SDL_TARGET := 1
 389  else ifeq ($(PLATFORM),$(filter $(PLATFORM),DINGOO GCW))
 390      override USE_OPENGL := 0
 391      override NOASM := 1
 392  else ifeq ($(PLATFORM),$(filter $(PLATFORM),BEOS))
 393      override NOASM := 1
 394  endif
 395  
 396  ifneq (i386,$(strip $(IMPLICIT_ARCH)))
 397      override NOASM := 1
 398  endif
 399  
 400  ifeq (0,$(USE_OPENGL))
 401      override POLYMER := 0
 402      override USE_LIBVPX := 0
 403  endif
 404  
 405  ifeq ($(RELEASE),0)
 406      override STRIP :=
 407  endif
 408  ifneq ($(FORCEDEBUG),0)
 409      override STRIP :=
 410  endif
 411  
 412  DBGLEVEL :=
 413  ifeq ($(RELEASE),0)
 414      OPTLEVEL := 0
 415  
 416      # see if we can use -Og
 417      ifeq (1,$(APPLE_CLANG))
 418        # Apple clang >= 9.0
 419        ifeq (,$(filter 0 1 2 3 4 5 6 7 8,$(APPLE_CLANG_MAJOR)))
 420          OPTLEVEL := g
 421        endif
 422      else ifeq (1,$(CLANG))
 423        # clang >= 4.0
 424        ifeq (,$(filter 0 1 2 3,$(CLANG_MAJOR)))
 425          OPTLEVEL := g
 426        endif
 427      else
 428        # GCC >= 4.8
 429        ifeq (,$(filter 0 1 2 3 4,$(GCC_MAJOR)))
 430          OPTLEVEL := g
 431        else ifeq (4,$(GCC_MAJOR))
 432          ifeq (,$(filter 0 1 2 3 4 5 6 7,$(GCC_MINOR)))
 433            OPTLEVEL := g
 434          endif
 435        endif
 436      endif
 437  
 438      LTO := 0
 439  else
 440      OPTLEVEL := 2
 441      LTO := 1
 442  endif
 443  
 444  ifeq (0,$(CLANG))
 445      ifeq (0,$(GCC_PREREQ_4))
 446          override LTO := 0
 447      endif
 448      ifeq (4,$(GCC_MAJOR))
 449          ifeq ($(PLATFORM),WII)
 450              ifneq (,$(filter 0 1 2 3 4 5 6 7,$(GCC_MINOR)))
 451                  override LTO := 0
 452              endif
 453          else
 454              ifneq (,$(filter 0 1 2 3 4 5,$(GCC_MINOR)))
 455                  override LTO := 0
 456              endif
 457          endif
 458      endif
 459  endif
 460  
 461  
 462  ########## End Toggles, Begin Construction ##########
 463  
 464  
 465  ##### Instantiate variables
 466  
 467  COMMONFLAGS :=
 468  COMPILERFLAGS := -funsigned-char
 469  
 470  CSTD := -std=gnu11
 471  CXXSTD := -std=gnu++14
 472  ifneq (0,$(CLANG))
 473      CSTD := $(subst gnu,c,$(CSTD))
 474      CXXSTD := $(subst gnu,c,$(CXXSTD))
 475  endif
 476  CONLYFLAGS := $(CSTD)
 477  CXXONLYFLAGS := $(CXXSTD) -fno-exceptions -fno-rtti
 478  
 479  ASFLAGS := -s #-g
 480  
 481  LINKERFLAGS :=
 482  L_CXXONLYFLAGS :=
 483  
 484  LIBS :=
 485  GUI_LIBS :=
 486  LIBDIRS :=
 487  
 488  
 489  ##### Mandatory platform parameters
 490  
 491  ASFORMAT := elf$(BITS)
 492  ifeq ($(PLATFORM),WINDOWS)
 493      WINDOWS_MAJOR := 6
 494      WINDOWS_MINOR := 1
 495      LINKERFLAGS += -static -Wl,-subsystem,windows:$(WINDOWS_MAJOR).$(WINDOWS_MINOR),--major-os-version,$(WINDOWS_MAJOR),--minor-os-version,$(WINDOWS_MINOR)
 496      COMPILERFLAGS += -DUNDERSCORES
 497      COMPILERFLAGS += -mno-ms-bitfields
 498      ASFORMAT := win$(BITS)
 499      ASFLAGS += -DUNDERSCORES
 500  
 501      ifneq ($(RELEASE),0)
 502          ifeq ($(FORCEDEBUG),0)
 503              DYNAMICBASE := -Wl,--dynamicbase
 504              ifeq ($(findstring x86_64,$(COMPILERTARGET)),x86_64)
 505                  DYNAMICBASE := $(DYNAMICBASE),--high-entropy-va
 506              endif
 507          endif
 508      endif
 509      LINKERFLAGS += -Wl,--enable-auto-import,--nxcompat $(DYNAMICBASE)
 510      ifneq ($(findstring x86_64,$(COMPILERTARGET)),x86_64)
 511          LINKERFLAGS += -Wl,--large-address-aware
 512      endif
 513  else ifeq ($(PLATFORM),DARWIN)
 514      ifneq ($(ARCH),)
 515          ifneq ($(findstring -arch,$(ARCH)),-arch)
 516              override ARCH := -arch $(ARCH)
 517          endif
 518      endif
 519      COMMONFLAGS += $(ARCH)
 520  
 521      ifneq ($(findstring x86_64,$(IMPLICIT_ARCH)),x86_64)
 522          ifneq ($(findstring arm64,$(IMPLICIT_ARCH)),arm64)
 523              LINKERFLAGS += -read_only_relocs suppress
 524          endif
 525      endif
 526  
 527      COMPILERFLAGS += -DUNDERSCORES
 528      ASFORMAT := macho
 529      ASFLAGS += -DUNDERSCORES
 530  
 531      ifeq ($(BITS),64)
 532          ASFORMAT += 64
 533      endif
 534  else ifeq ($(PLATFORM),WII)
 535      LIBOGC_INC := $(DEVKITPRO)/libogc/include
 536      LIBOGC_LIB := $(DEVKITPRO)/libogc/lib/wii
 537  
 538      COMMONFLAGS += -mrvl -mcpu=750 -meabi -mhard-float
 539      LINKERFLAGS += -Wl,--gc-sections
 540      # -msdata=eabiexport
 541      COMPILERFLAGS += -DGEKKO -D__POWERPC__ -I$(LIBOGC_INC)
 542      LIBDIRS += -L$(LIBOGC_LIB)
 543  else ifeq ($(PLATFORM),$(filter $(PLATFORM),DINGOO GCW))
 544      COMPILERFLAGS += -D__OPENDINGUX__
 545  else ifeq ($(SUBPLATFORM),LINUX)
 546      # Locate .so files
 547      LINKERFLAGS += -Wl,-rpath,'$$ORIGIN' -Wl,-z,origin
 548  endif
 549  ASFLAGS += -f $(ASFORMAT)
 550  
 551  COMPILERFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
 552  
 553  
 554  ##### Optimizations
 555  
 556  ifndef OPTOPT
 557      ifeq ($(findstring x86_64, $(IMPLICIT_ARCH)),x86_64)
 558          ifeq ($(findstring x86_64h, $(IMPLICIT_ARCH)),x86_64h)
 559              OPTOPT := -march=haswell -msse4.1 -msse4.2 -mpopcnt -mpclmul -mavx -mrdrnd -mf16c -mfsgsbase -mavx2 -maes -mfma -mbmi -mbmi2
 560              # -mcrc32 -mmovbe
 561          else
 562              OPTOPT := -march=core2 -mno-ssse3
 563          endif
 564          OPTOPT += -mmmx -msse -msse2 -msse3 -mfpmath=sse
 565      endif
 566      ifeq ($(findstring i386, $(IMPLICIT_ARCH)),i386)
 567          ifeq ($(PLATFORM),DARWIN)
 568              OPTOPT := -march=nocona -mmmx -msse -msse2 -msse3
 569          else
 570              USE_SSE2 := 0
 571              ifneq (0,$(USE_SSE2))
 572                  OPTOPT := -march=pentium-m
 573              else
 574                  OPTOPT := -march=pentium3
 575              endif
 576              ifneq (0,$(GCC_PREREQ_4))
 577                  OPTOPT += -mtune=generic
 578                  # -mstackrealign
 579              endif
 580              OPTOPT += -mmmx -msse -mfpmath=sse
 581              ifneq (0,$(USE_SSE2))
 582                  OPTOPT += -msse2
 583              endif
 584          endif
 585      endif
 586      ifeq ($(PLATFORM),WII)
 587          OPTOPT := -mtune=750
 588      endif
 589  endif
 590  
 591  ifeq ($(PACKAGE_REPOSITORY),0)
 592      COMMONFLAGS += -O$(OPTLEVEL) $(OPTOPT)
 593  endif
 594  
 595  define LF
 596  -save-temps=obj -dumpdir $1
 597  endef
 598  
 599  ifneq (0,$(LTO))
 600      COMPILERFLAGS += -DUSING_LTO
 601      ifeq (1,$(LTO))
 602          ifeq (0,$(CLANG))
 603              COMMONFLAGS += -flto=12
 604          else
 605              COMMONFLAGS += -flto=thin
 606          endif
 607      else
 608          COMMONFLAGS += -flto=$(LTO)
 609      endif
 610  endif
 611  
 612  ifeq (1,$(LLD))
 613      COMMONFLAGS += -fuse-ld=lld
 614      LF :=
 615  endif
 616  
 617  ifeq ($(PLATFORM),DARWIN)
 618      LF :=
 619  endif
 620  
 621  ##### Debugging
 622  
 623  ifneq ($(RELEASE)$(FORCEDEBUG),10)
 624      ifeq ($(PACKAGE_REPOSITORY),0)
 625          COMMONFLAGS += -g$(DBGLEVEL)
 626          ifeq (0,$(CLANG))
 627              ifneq ($(PLATFORM),WII)
 628                  COMMONFLAGS += -fno-omit-frame-pointer
 629              endif
 630          endif
 631      endif
 632      ifeq ($(SUBPLATFORM),LINUX)
 633          # This option is needed to allow obtaining backtraces from within a program.
 634          LIBS += -rdynamic
 635      endif
 636  endif
 637  
 638  ifneq ($(ALLOCACHE_AS_MALLOC),0)
 639      COMPILERFLAGS += -DDEBUG_ALLOCACHE_AS_MALLOC
 640  endif
 641  
 642  # See https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
 643  # and https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html
 644  # for a list of possible ASan and UBsan options.
 645  
 646  ASAN_FLAGS := -fsanitize=address -fsanitize=bounds,enum,float-cast-overflow
 647  #ASAN_FLAGS := $(ASAN_FLAGS),signed-integer-overflow
 648  #ASAN_FLAGS := $(ASAN_FLAGS),undefined
 649  ASAN_FLAGS := $(ASAN_FLAGS),return,null,pointer-overflow
 650  #ASAN_FLAGS := $(ASAN_FLAGS) -fsanitize-undefined-trap-on-error
 651  
 652  ifeq (0,$(FORCEDEBUG))
 653      COMPILERFLAGS += -DNDEBUG
 654  else
 655      COMPILERFLAGS += -DDEBUGGINGAIDS=$(FORCEDEBUG)
 656  
 657      ifneq (0,$(CLANG))
 658          COMMONFLAGS += $(ASAN_FLAGS)
 659      else ifneq (,$(filter 1 2 3 4 5 6,$(GCC_MAJOR)))
 660          ifneq (,$(filter 0 1,$(GCC_MINOR)))
 661              COMMONFLAGS += $(ASAN_FLAGS)
 662          endif
 663      endif
 664  endif
 665  
 666  ifneq (0,$(KRANDDEBUG))
 667      COMPILERFLAGS += -DKRANDDEBUG=1
 668  endif
 669  
 670  ifneq (0,$(PROFILER))
 671      ifneq ($(PLATFORM),DARWIN)
 672          LIBS += -lprofiler
 673      endif
 674      COMMONFLAGS += -pg
 675  endif
 676  
 677  
 678  ##### -f stuff
 679  
 680  ifneq (0,$(GCC_PREREQ_4))
 681      F_NO_STACK_PROTECTOR := -fno-stack-protector
 682      ifeq (0,$(CLANG))
 683          F_JUMP_TABLES := -fjump-tables
 684      endif
 685  endif
 686  
 687  ifeq ($(PLATFORM),DARWIN)
 688      ifeq (1,$(DARWIN9))
 689          F_JUMP_TABLES :=
 690      endif
 691      ifeq ($(findstring ppc,$(IMPLICIT_ARCH))$(findstring i386,$(IMPLICIT_ARCH)),)
 692          F_NO_STACK_PROTECTOR :=
 693      endif
 694  endif
 695  
 696  ifeq (0,$(RELEASE))
 697      F_NO_STACK_PROTECTOR :=
 698  else
 699      ifeq (0,$(CLANG))
 700          COMMONFLAGS += -funswitch-loops
 701      endif
 702  
 703      ifeq (0,$(FORCEDEBUG))
 704          COMMONFLAGS += -fomit-frame-pointer
 705      endif
 706  endif
 707  
 708  ifneq (0,$(KRANDDEBUG))
 709      COMMONFLAGS += -fno-inline -fno-inline-functions -fno-inline-functions-called-once
 710  endif
 711  
 712  ifneq (0,$(CLANG))
 713      COMMONFLAGS += -frounding-math
 714  endif
 715  
 716  COMMONFLAGS += -fno-strict-aliasing -fno-threadsafe-statics $(F_JUMP_TABLES) $(F_NO_STACK_PROTECTOR)
 717  
 718  
 719  ##### Warnings
 720  
 721  W_STRICT_OVERFLOW := -Wno-strict-overflow
 722  
 723  ifeq ($(PLATFORM),DARWIN)
 724      ifneq (0,$(DARWIN9))
 725          W_STRICT_OVERFLOW :=
 726      endif
 727  endif
 728  
 729  W_UNINITIALIZED := -Wuninitialized
 730  W_GCC_4_1 := -Wno-attributes
 731  W_GCC_4_2 := $(W_STRICT_OVERFLOW)
 732  W_GCC_4_4 := -Wno-unused-result
 733  W_GCC_4_5 := -Wlogical-op -Wcast-qual
 734  W_GCC_6 := -Wduplicated-cond -Wnull-dereference
 735  W_GCC_7 := -Wduplicated-branches
 736  W_GCC_8 := -Warray-bounds=2
 737  W_GCC_9 := -Wmultistatement-macros
 738  W_CLANG := -Wno-unused-value -Wno-parentheses -Wno-unknown-warning-option -Wno-unused-function
 739  
 740  ifeq (0,$(CLANG))
 741      W_CLANG :=
 742  
 743      ifneq (,$(filter 4 5 6 7 8,$(GCC_MAJOR)))
 744          W_GCC_9 :=
 745          ifneq (,$(filter 4 5 6 7,$(GCC_MAJOR)))
 746              W_GCC_8 :=
 747              ifneq (,$(filter 4 5 6,$(GCC_MAJOR)))
 748                  W_GCC_7 :=
 749                  ifneq (,$(filter 4 5,$(GCC_MAJOR)))
 750                      W_GCC_6 :=
 751                  endif
 752              endif
 753          endif
 754      endif
 755  
 756      ifeq (0,$(GCC_PREREQ_4))
 757          W_GCC_9 :=
 758          W_GCC_8 :=
 759          W_GCC_7 :=
 760          W_GCC_6 :=
 761          W_GCC_4_5 :=
 762          W_GCC_4_4 :=
 763          ifeq (0,$(OPTLEVEL))
 764              W_UNINITIALIZED :=
 765          endif
 766          W_GCC_4_2 :=
 767          W_GCC_4_1 :=
 768      endif
 769  
 770      ifeq (4,$(GCC_MAJOR))
 771          ifneq (,$(filter 0 1 2 3 4,$(GCC_MINOR)))
 772              W_GCC_4_5 :=
 773              ifneq (,$(filter 0 1 2 3,$(GCC_MINOR)))
 774                  W_GCC_4_4 :=
 775                  ifeq (0,$(OPTLEVEL))
 776                      W_UNINITIALIZED :=
 777                  endif
 778                  ifneq (,$(filter 0 1,$(GCC_MINOR)))
 779                      W_GCC_4_2 :=
 780                      ifeq (0,$(GCC_MINOR))
 781                          W_GCC_4_1 :=
 782                      endif
 783                  endif
 784              endif
 785          endif
 786      endif
 787  endif
 788  
 789  CONLYWARNS := -Wimplicit -Werror-implicit-function-declaration
 790  
 791  CWARNS := -W -Wall \
 792      -Wextra \
 793      -Wpointer-arith \
 794      -Wno-char-subscripts \
 795      -Wno-missing-braces \
 796      -Wwrite-strings \
 797      $(W_UNINITIALIZED) \
 798      $(W_GCC_4_1) \
 799      $(W_GCC_4_2) \
 800      $(W_GCC_4_4) \
 801      $(W_GCC_4_5) \
 802      $(W_GCC_6) \
 803      $(W_GCC_7) \
 804      $(W_GCC_8) \
 805      $(W_GCC_9) \
 806      $(W_CLANG) \
 807      #-Wstrict-prototypes \
 808      #-Waggregate-return \
 809      #-Wcast-align \
 810      #-Waddress
 811  
 812  
 813  ##### Features
 814  
 815  ifneq (,$(APPNAME))
 816      COMPILERFLAGS += "-DAPPNAME=\"$(APPNAME)\""
 817  endif
 818  ifneq (,$(APPBASENAME))
 819      COMPILERFLAGS += "-DAPPBASENAME=\"$(APPBASENAME)\""
 820  endif
 821  
 822  ifneq (0,$(NOASM))
 823      COMPILERFLAGS += -DNOASM
 824  endif
 825  ifneq (0,$(MEMMAP))
 826      ifeq ($(PLATFORM),DARWIN)
 827          LINKERFLAGS += -Wl,-map -Wl,$@.memmap
 828      else
 829          LINKERFLAGS += -Wl,-Map=$@.memmap
 830      endif
 831  endif
 832  
 833  COMPILERFLAGS += -DRENDERTYPE$(RENDERTYPE)=1
 834  
 835  ifeq (0,$(NETCODE))
 836      COMPILERFLAGS += -DNETCODE_DISABLE
 837  endif
 838  ifneq (0,$(STARTUP_WINDOW))
 839      COMPILERFLAGS += -DSTARTUP_WINDOW
 840  endif
 841  ifneq (0,$(STANDALONE))
 842      COMPILERFLAGS += -DEDUKE32_STANDALONE
 843  endif
 844  ifneq (0,$(USE_OPENGL))
 845      COMPILERFLAGS += -DUSE_OPENGL
 846  endif
 847  ifneq (0,$(POLYMER))
 848      COMPILERFLAGS += -DPOLYMER
 849  endif
 850  ifneq (0,$(NOONE_EXTENSIONS))
 851      COMPILERFLAGS += -DNOONE_EXTENSIONS
 852  endif
 853  
 854  
 855  ##### External library paths
 856  
 857  ifeq ($(PLATFORM),WINDOWS)
 858      COMPILERFLAGS += -Iplatform/Windows/include
 859      LIBDIRS += -Lplatform/Windows/lib/$(BITS)
 860      ifeq ($(RENDERTYPE),SDL)
 861          ifeq ($(SDL_TARGET),2)
 862              COMPILERFLAGS += -Iplatform/Windows/include/SDL2
 863          endif
 864      endif
 865  else ifeq ($(PLATFORM),DARWIN)
 866      ifneq ($(shell port --version &>/dev/null; echo $$?),127)
 867          LIBDIRS += -L/opt/local/lib
 868          COMPILERFLAGS += -I/opt/local/include
 869      endif
 870      ifneq ($(shell brew --version &>/dev/null; echo $$?),127)
 871          ifneq (,$(wildcard /opt/homebrew/))
 872              LIBDIRS += -L/opt/homebrew/lib
 873              COMPILERFLAGS += -I/opt/homebrew/include
 874          else
 875              LIBDIRS += -L/usr/local/lib
 876              COMPILERFLAGS += -I/usr/local/include
 877          endif
 878      endif
 879      ifneq ($(shell fink --version &>/dev/null; echo $$?),127)
 880          LIBDIRS += -L/sw/lib
 881          COMPILERFLAGS += -I/sw/include
 882      endif
 883  else ifeq ($(PLATFORM),BSD)
 884      COMPILERFLAGS += -I/usr/local/include
 885  else ifeq ($(PLATFORM),WII)
 886      COMPILERFLAGS += -I$(PORTLIBS)/include -Iplatform/Wii/include
 887      LIBDIRS += -L$(PORTLIBS)/lib -Lplatform/Wii/lib
 888  endif
 889  
 890  
 891  ##### External libraries
 892  
 893  ifneq (0,$(USE_LIBVPX))
 894      COMPILERFLAGS += -DUSE_LIBVPX
 895      LIBS += -lvpx
 896  endif
 897  ifneq (0,$(USE_MIMALLOC))
 898      COMPILERFLAGS += -DUSE_MIMALLOC
 899  endif
 900  
 901  ifneq (0,$(HAVE_VORBIS))
 902      COMPILERFLAGS += -DHAVE_VORBIS
 903  endif
 904  ifneq (0,$(HAVE_FLAC))
 905      COMPILERFLAGS += -DHAVE_FLAC
 906  endif
 907  ifneq (0,$(HAVE_XMP))
 908      COMPILERFLAGS += -DHAVE_XMP
 909  endif
 910  
 911  ifeq ($(RENDERTYPE),SDL)
 912      ifeq ($(SDL_TARGET),2)
 913          SDLCONFIG := sdl2-config
 914          SDLNAME := SDL2
 915      else ifeq ($(SDL_TARGET),1)
 916          SDLCONFIG := sdl-config
 917          SDLNAME := SDL
 918          ifeq (0,$(RELEASE))
 919              COMPILERFLAGS += -DNOSDLPARACHUTE
 920          endif
 921      endif
 922  
 923      ifeq ($(PLATFORM), WINDOWS)
 924          SDLCONFIG :=
 925      endif
 926  
 927      ifeq ($(PLATFORM),WII)
 928          SDLCONFIG :=
 929      endif
 930  
 931      ifneq ($(strip $(SDLCONFIG)),)
 932          ifeq ($(strip $(shell $(SDLCONFIG) --version $(DONT_PRINT_STDERR))),)
 933              override SDLCONFIG :=
 934          endif
 935      endif
 936  
 937      COMPILERFLAGS += -DSDL_TARGET=$(SDL_TARGET)
 938  
 939      SDL_FRAMEWORK := 0
 940      ifneq ($(SDL_FRAMEWORK),0)
 941          ifeq ($(PLATFORM),DARWIN)
 942              APPLE_FRAMEWORKS := /Library/Frameworks
 943              LIBDIRS += -F$(APPLE_FRAMEWORKS)
 944              COMPILERFLAGS += -I$(APPLE_FRAMEWORKS)/$(SDLNAME).framework/Headers
 945              LIBS += -Wl,-framework,$(SDLNAME) -Wl,-rpath -Wl,"@loader_path/../Frameworks"
 946          endif
 947      else
 948          ifneq ($(SDLCONFIG),)
 949              ifeq ($(PLATFORM),DARWIN)
 950                  override SDL_STATIC := 0
 951              endif
 952              ifneq ($(SDL_STATIC),0)
 953                  override SDLCONFIG_LIBS := -Wl,-Bstatic -l$(SDLNAME) -Wl,-Bdynamic $(strip $(subst -l$(SDLNAME),,$(shell CC=$(CC) $(SDLCONFIG) --static-libs)))
 954                  # for some reason SteamRT has a GCC with --enable-default-pie but its SDL2 has it disabled. WTF?
 955                  LINKERFLAGS += -no-pie
 956              endif
 957  
 958              SDLCONFIG_CFLAGS := $(strip $(subst -Dmain=SDL_main,,$(shell $(SDLCONFIG) --cflags)))
 959              SDLCONFIG_LIBS := $(strip $(subst -mwindows,,$(shell $(SDLCONFIG) --libs)))
 960  
 961              COMPILERFLAGS += $(SDLCONFIG_CFLAGS)
 962              LIBS += $(SDLCONFIG_LIBS)
 963          else
 964              ifeq ($(SDL_TARGET),1)
 965                  COMPILERFLAGS += -D_GNU_SOURCE=1
 966              endif
 967              COMPILERFLAGS += -D_REENTRANT -DSDL_USEFOLDER
 968              LIBS += -l$(SDLNAME)
 969          endif
 970      endif
 971  endif
 972  
 973  ifneq (0,$(HAVE_GTK2))
 974      ifneq (No,$(shell $(PKG_CONFIG) --exists gtk+-2.0 || echo No))
 975          COMPILERFLAGS += -DHAVE_GTK2 $(shell $(PKG_CONFIG) --cflags gtk+-2.0)
 976      else
 977          override HAVE_GTK2 := 0
 978      endif
 979  endif
 980  
 981  
 982  ##### System libraries
 983  
 984  ifeq ($(PLATFORM),WINDOWS)
 985      ifneq (0,$(GCC_PREREQ_4))
 986          L_SSP := -lssp
 987      endif
 988      ifeq ($(RENDERTYPE),WIN)
 989          LIBS += -ldxguid
 990      else ifeq ($(SDL_TARGET),1)
 991          LIBS += -ldxguid
 992      else
 993          LIBS += -ldxguid_sdl
 994      endif
 995      LIBS += -lmingwex -lgdi32 -lcomctl32 -lwinmm $(L_SSP) -lwsock32 -lws2_32 -lshlwapi -luuid -lpsapi -ldinput -limm32 -lversion -lsetupapi -lole32 -loleaut32
 996      # -lshfolder
 997  else ifeq ($(PLATFORM),WII)
 998      LIBS += -laesnd_tueidj -lfat -lwiiuse -lbte -lwiikeyboard -logc
 999  else ifeq ($(SUBPLATFORM),LINUX)
1000      LIBS += -lrt -latomic
1001  endif
1002  
1003  ifeq (,$(filter $(PLATFORM),WINDOWS WII))
1004      ifneq ($(PLATFORM),BSD)
1005          LIBS += -ldl
1006      endif
1007      ifneq ($(PLATFORM),DARWIN)
1008          LIBS += -pthread
1009      endif
1010  endif
1011  
1012  LIBS += -lm
1013  
1014  
1015  ##### Detect version control revision, if applicable
1016  
1017  VC_REV :=
1018  VC_HASH :=
1019  VC_BRANCH :=
1020  
1021  -include EDUKE32_REVISION.mak
1022  ifneq (,$(wildcard .git))
1023      ifeq (,$(VC_REV))
1024          VC_REV := $(shell git rev-list --count HEAD 2>&1)
1025      endif
1026      ifeq (,$(VC_HASH))
1027          VC_HASH := $(shell git rev-parse --short=9 HEAD 2>&1)
1028      endif
1029      ifeq (,$(VC_BRANCH))
1030          VC_BRANCH := $(shell git rev-parse --abbrev-ref HEAD 2>&1)
1031          ifneq (master,$(VC_BRANCH))
1032              VC_REV := $(VC_REV)[$(VC_BRANCH)]
1033          endif
1034      endif
1035  endif
1036  ifneq (,$(VC_REV)$(VC_HASH)$(VC_REV_CUSTOM))
1037      REVFLAG := -DREV="r$(VC_REV)-$(VC_HASH)$(VC_REV_CUSTOM)"
1038  endif
1039  
1040  ##### Allow standard environment variables to take precedence, to help package maintainers.
1041  
1042  ifneq (,$(CFLAGS))
1043      COMMONFLAGS += $(CFLAGS)
1044  endif
1045  ifneq (,$(CXXFLAGS))
1046      CXXONLYFLAGS += $(CXXFLAGS)
1047  endif
1048  ifneq (,$(LDFLAGS))
1049      LINKERFLAGS += $(LDFLAGS)
1050  endif
1051  
1052  
1053  ##### Final assembly of commands
1054  
1055  COMPILER_C=$(CC) $(CONLYFLAGS) $(COMMONFLAGS) $(CWARNS) $(CONLYWARNS) $(COMPILERFLAGS) $(CUSTOMOPT)
1056  COMPILER_CXX=$(CXX) $(CXXONLYFLAGS) $(COMMONFLAGS) $(CWARNS) $(COMPILERFLAGS) $(CUSTOMOPT)
1057  COMPILER_OBJC=$(COBJC) $(CONLYFLAGS) $(COMMONFLAGS) $(CWARNS) $(CONLYWARNS) $(COMPILERFLAGS) $(CUSTOMOPT)
1058  COMPILER_OBJCXX=$(COBJCXX) $(CXXONLYFLAGS) $(COMMONFLAGS) $(CWARNS) $(COMPILERFLAGS) $(CUSTOMOPT)
1059  LINKER=$(L_CXX) $(CXXONLYFLAGS) $(L_CXXONLYFLAGS) $(COMMONFLAGS) $(LINKERFLAGS) $(CUSTOMOPT)
1060  ifneq ($(CPLUSPLUS),0)
1061      COMPILER_C=$(COMPILER_CXX)
1062      COMPILER_OBJC=$(COMPILER_OBJCXX)
1063  endif
1064  
1065  
1066  ##### Pretty-printing
1067  
1068  ifeq ($(PRETTY_OUTPUT),1)
1069  RECIPE_IF = if
1070  BUILD_STARTED = printf "\033[K\033[1;36mBuilding: \033[0;36m$(MAKE) $(MAKECMDGOALS) -$(MAKEFLAGS)\033[0m\n"
1071  COMPILE_STATUS = printf "\033[K\033[0mBuilding object \033[1m$@\033[0m...\033[0m\r"
1072  COMPILE_OK = printf "\033[K\033[0;32mBuilt object \033[1;32m$@\033[0;32m \033[0m\n"
1073  COMPILE_FAILED = printf "\033[K\033[0;31mFailed building \033[1;31m$@\033[0;31m from\033[0m \033[1;31m$<\033[0;31m!\033[0m\n"; exit 1
1074  RECIPE_RESULT_COMPILE = ; then $(COMPILE_OK); else $(COMPILE_FAILED); fi
1075  ONESTEP_STATUS = printf "\033[K\033[0mBuilding \033[1m$@\033[0m...\033[0m\r"
1076  ONESTEP_OK = printf "\033[K\033[0;32mBuilt \033[1;32m$@\033[0;32m \033[0m\n"
1077  ONESTEP_FAILED = printf "\033[K\033[0;31mFailed building \033[1;31m$@\033[0;31m!\033[0m\n"; exit 1
1078  RECIPE_RESULT_ONESTEP = ; then $(ONESTEP_OK); else $(ONESTEP_FAILED); fi
1079  ARCHIVE_STATUS = printf "\033[K\033[0mCreating library archive \033[1m$@\033[0m...\033[0m\r"
1080  ARCHIVE_OK = printf "\033[K\033[0;32mCreated library archive \033[1;32m$@\033[0;32m \033[0m\n"
1081  ARCHIVE_FAILED = printf "\033[K\033[0;31mFailed creating library archive \033[1;31m$@\033[0;31m from\033[0m \033[1;31m$<\033[0;31m!\033[0m\n"; exit 1
1082  RECIPE_RESULT_ARCHIVE = ; then $(ARCHIVE_OK); else $(ARCHIVE_FAILED); fi
1083  LINK_STATUS = printf "\033[K\033[0;0mLinking \033[1m$@\033[0;0m...\033[0m\r"
1084  LINK_OK = printf "\033[K\033[0;32mLinked \033[1;32m$@\033[0;32m \033[0m\n"
1085  LINK_FAILED = printf "\033[K\033[0;31mFailed linking \033[1;31m$@\033[0;31m!\nIf the build options, environment, or system packages have changed, run '\033[1;31mmake clean\033[0;31m' and try again.\033[0m\n"; exit 1
1086  RECIPE_RESULT_LINK = ; then $(LINK_OK); else $(LINK_FAILED); fi
1087  else
1088  RECIPE_IF =
1089  BUILD_STARTED =
1090  COMPILE_STATUS =
1091  COMPILE_OK = true
1092  COMPILE_FAILED = false; exit 1
1093  RECIPE_RESULT_COMPILE =
1094  ONESTEP_STATUS =
1095  ONESTEP_OK = true
1096  ONESTEP_FAILED = false; exit 1
1097  RECIPE_RESULT_ONESTEP =
1098  ARCHIVE_STATUS =
1099  ARCHIVE_OK = true
1100  ARCHIVE_FAILED = false; exit 1
1101  RECIPE_RESULT_ARCHIVE =
1102  LINK_STATUS =
1103  LINK_OK = true
1104  LINK_FAILED = false; exit 1
1105  RECIPE_RESULT_LINK =
1106  endif