2020-06-15 14:18:57 +00:00
|
|
|
#-*-mode:makefile-gmake;indent-tabs-mode:t;tab-width:8;coding:utf-8-*-┐
|
|
|
|
#───vi: set et ft=make ts=8 tw=8 fenc=utf-8 :vi───────────────────────┘
|
|
|
|
|
|
|
|
# Default Mode
|
|
|
|
#
|
|
|
|
# - `make`
|
|
|
|
# - Backtraces
|
|
|
|
# - Function tracing
|
|
|
|
# - Reasonably small
|
|
|
|
# - Reasonably optimized
|
|
|
|
# - Reasonably debuggable
|
|
|
|
|
|
|
|
ifeq ($(MODE),)
|
|
|
|
|
|
|
|
CONFIG_CCFLAGS += \
|
|
|
|
$(BACKTRACES) \
|
|
|
|
$(FTRACE) \
|
|
|
|
-Og
|
|
|
|
|
|
|
|
TARGET_ARCH ?= \
|
2020-09-28 08:13:56 +00:00
|
|
|
-msse3
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
RAGELFLAGS ?= -G2
|
|
|
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
# Optimized Mode
|
|
|
|
#
|
|
|
|
# - `make MODE=opt`
|
|
|
|
# - Backtraces
|
|
|
|
# - More optimized
|
|
|
|
# - Reasonably small
|
|
|
|
# - No memory corruption detection
|
|
|
|
# - assert() / CHECK_xx() may leak code into binary for debuggability
|
|
|
|
# - GCC 8+ hoists check fails into .text.cold, thus minimizing impact
|
|
|
|
|
|
|
|
ifeq ($(MODE), opt)
|
|
|
|
|
|
|
|
CONFIG_CPPFLAGS += \
|
|
|
|
-DNDEBUG \
|
|
|
|
-msse2avx \
|
|
|
|
-Wa,-msse2avx
|
|
|
|
|
|
|
|
CONFIG_CCFLAGS += \
|
|
|
|
$(BACKTRACES) \
|
|
|
|
-O3
|
|
|
|
|
|
|
|
TARGET_ARCH ?= \
|
|
|
|
-march=native
|
|
|
|
|
|
|
|
RAGELFLAGS ?= -G2
|
|
|
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
# Release Mode
|
|
|
|
#
|
|
|
|
# - `make MODE=rel`
|
|
|
|
# - More optimized
|
|
|
|
# - Reasonably small
|
|
|
|
# - Numeric backtraces
|
|
|
|
# - Toilsome debuggability
|
|
|
|
# - assert() statements removed
|
|
|
|
# - DCHECK_xx() statements removed
|
|
|
|
# - No memory corruption detection
|
|
|
|
# - CHECK_xx() won't leak strings into binary
|
|
|
|
|
|
|
|
ifeq ($(MODE), rel)
|
|
|
|
|
|
|
|
CONFIG_CPPFLAGS += \
|
|
|
|
-DNDEBUG
|
|
|
|
|
|
|
|
CONFIG_CCFLAGS += \
|
|
|
|
$(BACKTRACES) \
|
2020-08-25 11:23:25 +00:00
|
|
|
-O2
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
RAGELFLAGS = -G2
|
|
|
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
# Debug Mode
|
|
|
|
#
|
|
|
|
# - `make MODE=dbg`
|
|
|
|
# - Backtraces
|
|
|
|
# - Zero optimization
|
|
|
|
# - Enables sanitization
|
|
|
|
# - Enables stack canaries
|
|
|
|
# - Enormous binaries (b/c ubsan suboptimalities)
|
|
|
|
|
|
|
|
ifeq ($(MODE), dbg)
|
|
|
|
|
|
|
|
CONFIG_CPPFLAGS += \
|
|
|
|
-DMODE_DBG
|
|
|
|
|
|
|
|
CONFIG_CCFLAGS += \
|
|
|
|
$(BACKTRACES) \
|
|
|
|
$(FTRACE) \
|
|
|
|
-fno-inline
|
|
|
|
|
|
|
|
CONFIG_COPTS += \
|
|
|
|
$(SECURITY_BLANKETS) \
|
|
|
|
$(SANITIZER)
|
|
|
|
|
2020-08-25 11:23:25 +00:00
|
|
|
CONFIG_COPTS += \
|
|
|
|
-ftrapv
|
|
|
|
|
|
|
|
TARGET_ARCH ?= \
|
|
|
|
-march=k8-sse3
|
|
|
|
|
2020-06-15 14:18:57 +00:00
|
|
|
OVERRIDE_CCFLAGS += \
|
|
|
|
-fno-pie
|
|
|
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
# Tiny Mode
|
|
|
|
#
|
|
|
|
# - `make MODE=tiny`
|
|
|
|
# - No checks
|
|
|
|
# - No asserts
|
|
|
|
# - No canaries
|
|
|
|
# - No paranoia
|
|
|
|
# - No avx hooks
|
|
|
|
# - No backtraces
|
|
|
|
# - No algorithmics
|
|
|
|
# - YOLO
|
|
|
|
|
|
|
|
ifeq ($(MODE), tiny)
|
|
|
|
|
|
|
|
CONFIG_CPPFLAGS += \
|
|
|
|
-DTINY \
|
|
|
|
-DNDEBUG \
|
|
|
|
-DTRUSTWORTHY
|
|
|
|
|
|
|
|
CONFIG_CCFLAGS += \
|
|
|
|
-Os \
|
|
|
|
-fno-align-functions \
|
|
|
|
-fno-align-jumps \
|
|
|
|
-fno-align-labels \
|
|
|
|
-fno-align-loops
|
|
|
|
|
|
|
|
TARGET_ARCH ?= \
|
2020-08-25 11:23:25 +00:00
|
|
|
-march=k8-sse3
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
# ANSI Mode
|
|
|
|
#
|
2020-06-21 07:10:11 +00:00
|
|
|
# These flags cause GCC to predefine __STRICT_ANSI__. Please be warned
|
|
|
|
# that Cosmopolitan headers are written to comply with that request if
|
|
|
|
# it's possible to do so. Consider the following example:
|
|
|
|
#
|
|
|
|
# make -j12 -O o//tool/viz/printvideo.i
|
|
|
|
# clang-format-10 -i o//tool/viz/printvideo.i
|
|
|
|
# less o//tool/viz/printvideo.i
|
|
|
|
#
|
|
|
|
# You'll notice functions like memcpy(), ioctl(), etc. get expanded into
|
|
|
|
# wild-eyed gnu-style performance hacks. You can turn it off as follows:
|
|
|
|
#
|
|
|
|
# make -j12 -O MODE=ansi o/ansi/tool/viz/printvideo.i
|
|
|
|
# clang-format-10 -i o/ansi/tool/viz/printvideo.i
|
|
|
|
# less o/ansi/tool/viz/printvideo.i
|
|
|
|
#
|
|
|
|
# Here it becomes clear that ANSI mode can help you decouple your source
|
|
|
|
# from Cosmopolitan, by turning it into plain ordinary textbook C code.
|
|
|
|
#
|
|
|
|
# Another potential use case is distributing code to folks using tools
|
|
|
|
# such as MSVC or XCode. You can run your binary objects through a tool
|
|
|
|
# like objconv to convert them to COFF or MachO. Then use ANSI mode to
|
|
|
|
# rollup one header file that'll enable linkage with minimal issues.
|
|
|
|
#
|
|
|
|
# Lastly note that in some cases, such as gc(), there simply isn't any
|
|
|
|
# ANSI workaround available. It's only in cases like that when we'll use
|
|
|
|
# the __asm__() header workaround, rather than simply removing it. We do
|
|
|
|
# however try to do that much less often than mainstream C libraries.
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
ifeq ($(MODE), ansi)
|
|
|
|
|
2020-06-21 07:10:11 +00:00
|
|
|
CONFIG_CFLAGS += -std=c11
|
2020-08-25 11:23:25 +00:00
|
|
|
#CONFIG_CPPFLAGS += -ansi
|
2020-06-21 07:10:11 +00:00
|
|
|
CONFIG_CXXFLAGS += -std=c++11
|
2020-08-25 11:23:25 +00:00
|
|
|
TARGET_ARCH ?= -march=k8-sse3
|
2020-06-15 14:18:57 +00:00
|
|
|
|
|
|
|
endif
|