mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 11:37:35 +00:00
514 lines
11 KiB
Makefile
514 lines
11 KiB
Makefile
#-*-mode:makefile-gmake;indent-tabs-mode:t;tab-width:8;coding:utf-8-*-┐
|
|
#── vi: set et ft=make ts=8 sw=8 fenc=utf-8 :vi ──────────────────────┘
|
|
|
|
# Default Mode
|
|
#
|
|
# - `make`
|
|
# - Optimized
|
|
# - Backtraces
|
|
# - Syscall tracing
|
|
# - Function tracing
|
|
#
|
|
ifeq ($(MODE),)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
CONFIG_CCFLAGS += -O2 $(BACKTRACES)
|
|
CONFIG_CPPFLAGS += -DSYSDEBUG
|
|
endif
|
|
ifeq ($(MODE), x86_64)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
CONFIG_CCFLAGS += -O2 $(BACKTRACES)
|
|
CONFIG_CPPFLAGS += -DSYSDEBUG
|
|
endif
|
|
ifeq ($(MODE), aarch64)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
CONFIG_CCFLAGS += -O2 $(BACKTRACES)
|
|
CONFIG_CPPFLAGS += -DSYSDEBUG
|
|
endif
|
|
|
|
# Zero Optimization Mode
|
|
#
|
|
# - Goes 2x slower
|
|
# - Supports --strace
|
|
# - Unsupports --ftrace
|
|
# - Better GDB debugging
|
|
#
|
|
ifeq ($(MODE), zero)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
OVERRIDE_CFLAGS += -O0
|
|
OVERRIDE_CXXFLAGS += -O0
|
|
CONFIG_CPPFLAGS += -DSYSDEBUG
|
|
endif
|
|
ifeq ($(MODE), aarch64-zero)
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
OVERRIDE_CFLAGS += -O0 -fdce
|
|
OVERRIDE_CXXFLAGS += -O0 -fdce
|
|
CONFIG_CPPFLAGS += -DSYSDEBUG
|
|
endif
|
|
|
|
# Fast Build Mode
|
|
#
|
|
# - `make MODE=fastbuild`
|
|
# - No debugging
|
|
# - Syscall tracing
|
|
# - Function tracing
|
|
# - Some optimizations
|
|
# - Limited Backtraces
|
|
#
|
|
ifeq ($(MODE), fastbuild)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_CCFLAGS += $(BACKTRACES) -O
|
|
CONFIG_CPPFLAGS += -DSYSDEBUG -DDWARFLESS
|
|
CONFIG_LDFLAGS += -S
|
|
endif
|
|
|
|
# Optimized Mode
|
|
#
|
|
# - `make MODE=opt`
|
|
# - Backtraces
|
|
# - More optimized
|
|
# - Syscall tracing
|
|
# - Function tracing
|
|
# - 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)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
CONFIG_CPPFLAGS += -DNDEBUG -DSYSDEBUG
|
|
CONFIG_CCFLAGS += $(BACKTRACES) -O3 -fmerge-all-constants
|
|
CONFIG_TARGET_ARCH ?= -march=native
|
|
endif
|
|
|
|
# Optimized Linux Mode
|
|
# The Fastest Mode of All
|
|
#
|
|
# - `make MODE=optlinux`
|
|
# - Turns on red zone
|
|
# - Turns off backtraces
|
|
# - Turns off function tracing
|
|
# - Turns off support for older cpu models
|
|
# - Turns off support for other operating systems
|
|
#
|
|
ifeq ($(MODE), optlinux)
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
CONFIG_CPPFLAGS += -DNDEBUG -DSYSDEBUG -DSUPPORT_VECTOR=1
|
|
CONFIG_CCFLAGS += -O3 -fmerge-all-constants
|
|
CONFIG_COPTS += -mred-zone
|
|
CONFIG_TARGET_ARCH ?= -march=native
|
|
endif
|
|
ifeq ($(MODE), x86_64-optlinux)
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
CONFIG_CPPFLAGS += -DNDEBUG -DSYSDEBUG -DSUPPORT_VECTOR=1
|
|
CONFIG_CCFLAGS += -O3 -fmerge-all-constants
|
|
CONFIG_COPTS += -mred-zone
|
|
CONFIG_TARGET_ARCH ?= -march=native
|
|
endif
|
|
ifeq ($(MODE), aarch64-optlinux)
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
CONFIG_CPPFLAGS += -DNDEBUG -DSYSDEBUG -DSUPPORT_VECTOR=1
|
|
CONFIG_CCFLAGS += -O3 -fmerge-all-constants
|
|
CONFIG_COPTS += -mred-zone
|
|
endif
|
|
|
|
# Release Mode
|
|
#
|
|
# Follows traditional closed source release binary norms.
|
|
#
|
|
# - `make MODE=rel`
|
|
# - More optimized
|
|
# - Reasonably small
|
|
# - Numeric backtraces
|
|
# - No DWARF data bloat
|
|
# - 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 -DDWARFLESS
|
|
CONFIG_CCFLAGS += $(BACKTRACES) -O2
|
|
PYFLAGS += -O1
|
|
endif
|
|
|
|
# Debug Mode
|
|
#
|
|
# - `make MODE=dbg`
|
|
# - Backtraces
|
|
# - Enables ubsan
|
|
# - Stack canaries
|
|
# - No optimization
|
|
# - Enormous binaries
|
|
#
|
|
ifeq ($(MODE), dbg)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
OVERRIDE_CFLAGS += -O0
|
|
OVERRIDE_CXXFLAGS += -O0
|
|
CONFIG_CPPFLAGS += -DMODE_DBG -D__SANITIZE_UNDEFINED__ -Wno-unused-variable -Wno-unused-but-set-variable
|
|
CONFIG_CCFLAGS += $(BACKTRACES) -DSYSDEBUG
|
|
CONFIG_COPTS += -fsanitize=undefined
|
|
OVERRIDE_CCFLAGS += -fno-pie
|
|
QUOTA ?= -C64 -L300
|
|
endif
|
|
ifeq ($(MODE), x86_64-dbg)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
OVERRIDE_CFLAGS += -O0
|
|
OVERRIDE_CXXFLAGS += -O0
|
|
CONFIG_CPPFLAGS += -DMODE_DBG -D__SANITIZE_UNDEFINED__ -Wno-unused-variable -Wno-unused-but-set-variable
|
|
CONFIG_CCFLAGS += $(BACKTRACES) -DSYSDEBUG
|
|
CONFIG_COPTS += -fsanitize=undefined
|
|
OVERRIDE_CCFLAGS += -fno-pie
|
|
QUOTA ?= -C64 -L300
|
|
endif
|
|
ifeq ($(MODE), aarch64-dbg)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
OVERRIDE_CFLAGS += -O0 -fdce
|
|
OVERRIDE_CXXFLAGS += -O0 -fdce
|
|
CONFIG_CPPFLAGS += -DMODE_DBG -D__SANITIZE_UNDEFINED__ -Wno-unused-variable -Wno-unused-but-set-variable
|
|
CONFIG_CCFLAGS += $(BACKTRACES) -DSYSDEBUG
|
|
CONFIG_COPTS += -fsanitize=undefined
|
|
QUOTA ?= -C64 -L300
|
|
endif
|
|
|
|
# System Five Mode
|
|
#
|
|
# - `make MODE=sysv`
|
|
# - Optimized
|
|
# - Backtraces
|
|
# - Debuggable
|
|
# - Syscall tracing
|
|
# - Function tracing
|
|
# - No Windows bloat!
|
|
#
|
|
ifeq ($(MODE), sysv)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_OFLAGS ?= -g -ggdb
|
|
CONFIG_CCFLAGS += $(BACKTRACES) -O2
|
|
CONFIG_CPPFLAGS += -DSYSDEBUG -DSUPPORT_VECTOR=121
|
|
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 \
|
|
-fschedule-insns2 \
|
|
-momit-leaf-frame-pointer \
|
|
-foptimize-sibling-calls \
|
|
-DDWARFLESS
|
|
PYFLAGS += \
|
|
-O2 \
|
|
-B
|
|
endif
|
|
ifeq ($(MODE), x86_64-tiny)
|
|
CONFIG_CPPFLAGS += \
|
|
-DTINY \
|
|
-DNDEBUG \
|
|
-DTRUSTWORTHY
|
|
CONFIG_CCFLAGS += \
|
|
-Os \
|
|
-fno-align-functions \
|
|
-fno-align-jumps \
|
|
-fno-align-labels \
|
|
-fno-align-loops \
|
|
-fschedule-insns2 \
|
|
-momit-leaf-frame-pointer \
|
|
-foptimize-sibling-calls \
|
|
-DDWARFLESS
|
|
PYFLAGS += \
|
|
-O2 \
|
|
-B
|
|
endif
|
|
ifeq ($(MODE), aarch64-tiny)
|
|
# TODO(jart): -mcmodel=tiny
|
|
CONFIG_CPPFLAGS += \
|
|
-DTINY \
|
|
-DNDEBUG \
|
|
-DTRUSTWORTHY
|
|
CONFIG_CCFLAGS += \
|
|
-Os \
|
|
-fno-align-functions \
|
|
-fno-align-jumps \
|
|
-fno-align-labels \
|
|
-fno-align-loops \
|
|
-fschedule-insns2 \
|
|
-momit-leaf-frame-pointer \
|
|
-foptimize-sibling-calls \
|
|
-DDWARFLESS
|
|
PYFLAGS += \
|
|
-O2 \
|
|
-B
|
|
endif
|
|
|
|
# Linux-Only Tiny Mode
|
|
#
|
|
# - `make MODE=tinylinux`
|
|
# - No checks
|
|
# - No asserts
|
|
# - No canaries
|
|
# - No paranoia
|
|
# - No avx hooks
|
|
# - No backtraces
|
|
# - No portability
|
|
# - No algorithmics
|
|
# - YOLO
|
|
#
|
|
ifeq ($(MODE), tinylinux)
|
|
CONFIG_CPPFLAGS += \
|
|
-DTINY \
|
|
-DNDEBUG \
|
|
-DTRUSTWORTHY \
|
|
-DSUPPORT_VECTOR=1 \
|
|
-DDWARFLESS
|
|
CONFIG_CCFLAGS += \
|
|
-Os \
|
|
-fno-align-functions \
|
|
-fno-align-jumps \
|
|
-fno-align-labels \
|
|
-fno-align-loops
|
|
endif
|
|
|
|
# Linux+BSD Tiny Mode
|
|
#
|
|
# - `make MODE=tinylinuxbsd`
|
|
# - No apple
|
|
# - No checks
|
|
# - No asserts
|
|
# - No canaries
|
|
# - No paranoia
|
|
# - No microsoft
|
|
# - No avx hooks
|
|
# - No backtraces
|
|
# - No algorithmics
|
|
# - YOLO
|
|
#
|
|
ifeq ($(MODE), tinylinuxbsd)
|
|
CONFIG_CPPFLAGS += \
|
|
-DTINY \
|
|
-DNDEBUG \
|
|
-DTRUSTWORTHY \
|
|
-DSUPPORT_VECTOR=113 \
|
|
-DDWARFLESS
|
|
CONFIG_CCFLAGS += \
|
|
-Os \
|
|
-fno-align-functions \
|
|
-fno-align-jumps \
|
|
-fno-align-labels \
|
|
-fno-align-loops
|
|
endif
|
|
|
|
# Unix Tiny Mode
|
|
#
|
|
# - `make MODE=tinysysv`
|
|
# - No checks
|
|
# - No asserts
|
|
# - No canaries
|
|
# - No paranoia
|
|
# - No microsoft
|
|
# - No avx hooks
|
|
# - No backtraces
|
|
# - No algorithmics
|
|
# - YOLO
|
|
#
|
|
ifeq ($(MODE), tinysysv)
|
|
CONFIG_CPPFLAGS += \
|
|
-DTINY \
|
|
-DNDEBUG \
|
|
-DTRUSTWORTHY \
|
|
-DSUPPORT_VECTOR=121 \
|
|
-DDWARFLESS
|
|
CONFIG_CCFLAGS += \
|
|
-Os \
|
|
-fno-align-functions \
|
|
-fno-align-jumps \
|
|
-fno-align-labels \
|
|
-fno-align-loops
|
|
endif
|
|
|
|
# Tiny Metallic Unix Mode
|
|
#
|
|
# - `make MODE=tinynowin`
|
|
# - No checks
|
|
# - No asserts
|
|
# - No canaries
|
|
# - No paranoia
|
|
# - No microsoft
|
|
# - No avx hooks
|
|
# - No backtraces
|
|
# - No algorithmics
|
|
# - YOLO
|
|
#
|
|
ifeq ($(MODE), tinynowin)
|
|
CONFIG_CPPFLAGS += \
|
|
-DTINY \
|
|
-DNDEBUG \
|
|
-DTRUSTWORTHY \
|
|
-DSUPPORT_VECTOR=251 \
|
|
-DDWARFLESS
|
|
CONFIG_CCFLAGS += \
|
|
-Os \
|
|
-fno-align-functions \
|
|
-fno-align-jumps \
|
|
-fno-align-labels \
|
|
-fno-align-loops
|
|
endif
|
|
|
|
# no x87 instructions mode
|
|
#
|
|
# export MODE=nox87
|
|
# make -j8 toolchain
|
|
# cosmocc -o /tmp/hello.com hello.c
|
|
#
|
|
# lets you shave ~23kb off blink
|
|
#
|
|
# git clone https://github.com/jart/blink
|
|
# cd blink
|
|
# ./configure --disable-x87
|
|
# make -j8
|
|
# o//blink/blink /tmp/hello.com
|
|
#
|
|
ifeq ($(MODE), nox87)
|
|
ENABLE_FTRACE = 1
|
|
CONFIG_COPTS += -mlong-double-64
|
|
CONFIG_CCFLAGS += $(BACKTRACES) -O2
|
|
CONFIG_CPPFLAGS += -DSYSDEBUG -DNOX87
|
|
endif
|
|
|
|
# LLVM Mode
|
|
#
|
|
# We aim to support:
|
|
#
|
|
# make -j8 m=llvm o/llvm/libc
|
|
#
|
|
# The rest of the monorepo may not work with llvm.
|
|
#
|
|
ifeq ($(MODE), llvm)
|
|
.STRICT = 0
|
|
CONFIG_CCFLAGS += $(BACKTRACES) -DSYSDEBUG -O2
|
|
AS = clang
|
|
CC = clang
|
|
CXX = clang++
|
|
CXXFILT = llvm-c++filt
|
|
LD = ld.lld
|
|
NM = llvm-nm
|
|
GCC = clang
|
|
STRIP = llvm-strip
|
|
OBJCOPY = llvm-objcopy
|
|
OBJDUMP = llvm-objdump
|
|
ADDR2LINE = llvm-addr2line
|
|
endif
|
|
|
|
# ANSI Mode
|
|
#
|
|
# 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.
|
|
ifeq ($(MODE), ansi)
|
|
CONFIG_CFLAGS += -std=c11
|
|
#CONFIG_CPPFLAGS += -ansi
|
|
CONFIG_CXXFLAGS += -std=c++11
|
|
endif
|
|
|
|
ifneq ($(ENABLE_FTRACE),)
|
|
CONFIG_CPPFLAGS += -DFTRACE
|
|
FTRACE_CCFLAGS = -fno-inline-functions-called-once
|
|
OVERRIDE_CFLAGS += $(FTRACE_CCFLAGS)
|
|
OVERRIDE_CXXFLAGS += $(FTRACE_CCFLAGS)
|
|
# function prologue nops for --ftrace
|
|
ifeq ($(ARCH), x86_64)
|
|
# this flag causes gcc to generate functions like this
|
|
#
|
|
# nop nop nop nop nop nop nop nop nop
|
|
# func:
|
|
# nop nop
|
|
# ...
|
|
#
|
|
# which tool/build/fixupobj.c improves at build time like this
|
|
#
|
|
# nop nop nop nop nop nop nop nop nop
|
|
# func:
|
|
# xchg %ax,%ax
|
|
# ...
|
|
#
|
|
# which --ftrace morphs at runtime like this
|
|
#
|
|
# ud2 # 2 bytes
|
|
# call ftrace_hook # 5 bytes
|
|
# jmp +2 # 2 bytes
|
|
# func:
|
|
# jmp -7 # 2 bytes
|
|
# ...
|
|
#
|
|
CONFIG_CCFLAGS += -fpatchable-function-entry=18,16
|
|
endif
|
|
ifeq ($(ARCH), aarch64)
|
|
# this flag causes gcc to generate functions like this
|
|
#
|
|
# nop nop nop nop nop nop
|
|
# func:
|
|
# nop
|
|
# ...
|
|
#
|
|
# which --ftrace morphs at runtime like this
|
|
#
|
|
# brk #31337
|
|
# stp x29,x30,[sp,#-16]!
|
|
# mov x29,sp
|
|
# bl ftrace_hook
|
|
# ldp x29,x30,[sp],#16
|
|
# b +1
|
|
# func:
|
|
# b -5
|
|
# ...
|
|
#
|
|
CONFIG_CCFLAGS += -fpatchable-function-entry=7,6
|
|
endif
|
|
endif
|
|
|
|
TARGET_ARCH ?= $(CONFIG_TARGET_ARCH)
|