/ 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