Makefile 38.9 KB
Newer Older
Kevin Modzelewski's avatar
Kevin Modzelewski committed
1 2 3 4 5 6
# Disable builtin rules:
.SUFFIXES:

USE_TEST_LLVM := 0
DEPS_DIR := $(HOME)/pyston_deps

7
LLVM_REVISION_FILE := llvm_revision.txt
Kevin Modzelewski's avatar
Kevin Modzelewski committed
8 9 10 11 12 13
LLVM_REVISION := $(shell cat $(LLVM_REVISION_FILE))

USE_CLANG  := 1
USE_CCACHE := 1
USE_DISTCC := 0

14 15
ENABLE_VALGRIND := 0

Kevin Modzelewski's avatar
Kevin Modzelewski committed
16 17 18 19
GDB := gdb
GCC_DIR := $(DEPS_DIR)/gcc-4.8.2-install
GTEST_DIR := $(DEPS_DIR)/gtest-1.7.0

20 21
USE_DEBUG_LIBUNWIND := 0

Kevin Modzelewski's avatar
Kevin Modzelewski committed
22 23 24 25 26 27 28 29 30 31 32 33 34 35
PYTHON_MAJOR_VERSION := 2
PYTHON_MINOR_VERSION := 7
PYTHON_MICRO_VERSION := 3

MAX_MEM_KB := 500000
MAX_DBG_MEM_KB := 500000

TEST_THREADS := 4

ERROR_LIMIT := 10
COLOR := 1

VERBOSE := 0

36 37
ENABLE_INTEL_JIT_EVENTS := 0

Kevin Modzelewski's avatar
Kevin Modzelewski committed
38 39 40 41 42 43
# Setting this to 1 will set the Makefile to use binaries from the trunk
# directory, even if USE_TEST_LLVM is set to 1.
# This is useful if clang isn't installed into the test directory, ex due
# to disk space concerns.
FORCE_TRUNK_BINARIES := 0

44 45 46
USE_CMAKE := 0
NINJA := ninja

Kevin Modzelewski's avatar
Kevin Modzelewski committed
47 48 49 50
# Put any overrides in here:
-include Makefile.local


51 52 53
TOOLS_DIR := ./tools
TEST_DIR := ./test
TESTS_DIR := ./test/tests
Kevin Modzelewski's avatar
Kevin Modzelewski committed
54 55

GPP := $(GCC_DIR)/bin/g++
56
GCC := $(GCC_DIR)/bin/gcc
Kevin Modzelewski's avatar
Kevin Modzelewski committed
57

58 59 60
ifeq ($(V),1)
	VERBOSE := 1
endif
Kevin Modzelewski's avatar
Kevin Modzelewski committed
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
ifeq ($(VERBOSE),1)
	VERB :=
	ECHO := @\#
else
	VERB := @
	ECHO := @ echo pyston:
endif

LLVM_TRUNK_SRC := $(DEPS_DIR)/llvm-trunk
LLVM_TEST_SRC := $(DEPS_DIR)/llvm-test
LLVM_TRUNK_BUILD := $(DEPS_DIR)/llvm-trunk-build
LLVM_TEST_BUILD := $(DEPS_DIR)/llvm-test-build
ifneq ($(USE_TEST_LLVM),0)
	LLVM_SRC := $(LLVM_TEST_SRC)
	LLVM_BUILD := $(LLVM_TEST_BUILD)
else
	LLVM_SRC := $(LLVM_TRUNK_SRC)
	LLVM_BUILD := $(LLVM_TRUNK_BUILD)
endif

ifeq ($(FORCE_TRUNK_BINARIES),1)
	LLVM_BIN := $(LLVM_TRUNK_BUILD)/Release/bin
else
	LLVM_BIN := $(LLVM_BUILD)/Release/bin
endif

87
LLVM_LINK_LIBS := core mcjit native bitreader ipo irreader debuginfo instrumentation
88 89 90 91
ifneq ($(ENABLE_INTEL_JIT_EVENTS),0)
LLVM_LINK_LIBS += inteljitevents
endif

92 93 94 95 96
NEED_OLD_JIT := $(shell if [ $(LLVM_REVISION) -le 216982 ]; then echo 1; else echo 0; fi )
ifeq ($(NEED_OLD_JIT),1)
	LLVM_LINK_LIBS += jit
endif

Kevin Modzelewski's avatar
Kevin Modzelewski committed
97
LLVM_CXXFLAGS := $(shell $(LLVM_BUILD)/Release+Asserts/bin/llvm-config --cxxflags)
98
LLVM_LDFLAGS := $(shell $(LLVM_BUILD)/Release+Asserts/bin/llvm-config --ldflags --system-libs --libs $(LLVM_LINK_LIBS))
Kevin Modzelewski's avatar
Kevin Modzelewski committed
99 100
LLVM_LIB_DEPS := $(wildcard $(LLVM_BUILD)/Release+Asserts/lib/*)

101
LLVM_DEBUG_LDFLAGS := $(shell $(LLVM_BUILD)/Debug+Asserts/bin/llvm-config --ldflags --system-libs --libs $(LLVM_LINK_LIBS))
Kevin Modzelewski's avatar
Kevin Modzelewski committed
102 103 104 105 106
LLVM_DEBUG_LIB_DEPS := $(wildcard $(LLVM_BUILD)/Debug+Asserts/lib/*)

LLVM_CONFIG_RELEASE := $(LLVM_BUILD)/Release/bin/llvm-config
ifneq ($(wildcard $(LLVM_CONFIG_RELEASE)),)
LLVM_RELEASE_CXXFLAGS := $(shell $(LLVM_BUILD)/Release/bin/llvm-config --cxxflags)
107
LLVM_RELEASE_LDFLAGS := $(shell $(LLVM_BUILD)/Release/bin/llvm-config --ldflags --system-libs --libs $(LLVM_LINK_LIBS))
Kevin Modzelewski's avatar
Kevin Modzelewski committed
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
LLVM_RELEASE_LIB_DEPS := $(wildcard $(LLVM_BUILD)/Release/lib/*)
else
LLVM_RELEASE_CXXFLAGS := RELEASE_NOT_BUILT
LLVM_RELEASE_LDFLAGS := RELEASE_NOT_BUILT
LLVM_RELEASE_LIB_DEPS := RELEASE_NOT_BUILT
endif

ifneq ($(wildcard /usr/local/include/llvm),)
# Global include files can screw up the build, since if llvm moves a header file,
# the compiler will silently fall back to the global one that still exists.
# These include files are persistent because llvm's "make uninstall" does *not*
# delete them if the uninstall command is run on a revision that didn't include
# those files.
# This could probably be handled (somehow blacklist this particular folder?),
# but for now just error out:
$(error "Error: global llvm include files detected")
endif

# Note: use lazy-expansion for these profile targets, since calling the profile llvm-config will
# actually generate a gmon.out file!
LLVM_PROFILE_CXXFLAGS = $(shell $(LLVM_BUILD)/Release+Profile/bin/llvm-config --cxxflags) -UNDEBUG
129
LLVM_PROFILE_LDFLAGS = $(shell $(LLVM_BUILD)/Release+Profile/bin/llvm-config --ldflags --system-libs --libs $(LLVM_LINK_LIBS))
Kevin Modzelewski's avatar
Kevin Modzelewski committed
130 131
LLVM_PROFILE_LIB_DEPS := $(wildcard $(LLVM_BUILD)/Release+Profile/lib/*)

132 133
CLANG_EXE := $(LLVM_BIN)/clang
CLANGPP_EXE := $(LLVM_BIN)/clang++
Kevin Modzelewski's avatar
Kevin Modzelewski committed
134

135
COMMON_CFLAGS := -g -Werror -Wreturn-type -Wall -Wno-sign-compare -Wno-unused -Isrc -I./include -fno-omit-frame-pointer
136 137 138
COMMON_CFLAGS += -Wextra -Wno-sign-compare
COMMON_CFLAGS += -Wno-unused-parameter # should use the "unused" attribute
COMMON_CXXFLAGS := $(COMMON_CFLAGS)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
139
COMMON_CXXFLAGS += -std=c++11
140
COMMON_CXXFLAGS += -Woverloaded-virtual
141
COMMON_CXXFLAGS += -fexceptions -fno-rtti
142
COMMON_CXXFLAGS += -Wno-invalid-offsetof # allow the use of "offsetof", and we'll just have to make sure to only use it legally.
143
COMMON_CXXFLAGS += -DENABLE_INTEL_JIT_EVENTS=$(ENABLE_INTEL_JIT_EVENTS)
Vinzenz Feenstra's avatar
Vinzenz Feenstra committed
144
COMMON_CXXFLAGS += -I$(DEPS_DIR)/pypa-install/include
145 146 147 148 149

ifeq ($(ENABLE_VALGRIND),0)
	COMMON_CXXFLAGS += -DNVALGRIND
	VALGRIND := false
else
150 151
	COMMON_CXXFLAGS += -I$(DEPS_DIR)/valgrind-3.10.0/include
	VALGRIND := VALGRIND_LIB=$(DEPS_DIR)/valgrind-3.10.0-install/lib/valgrind $(DEPS_DIR)/valgrind-3.10.0-install/bin/valgrind
152 153
endif

Kevin Modzelewski's avatar
Kevin Modzelewski committed
154 155 156 157
COMMON_CXXFLAGS += -DGITREV=$(shell git rev-parse HEAD | head -c 12) -DLLVMREV=$(LLVM_REVISION)
COMMON_CXXFLAGS += -DDEFAULT_PYTHON_MAJOR_VERSION=$(PYTHON_MAJOR_VERSION) -DDEFAULT_PYTHON_MINOR_VERSION=$(PYTHON_MINOR_VERSION) -DDEFAULT_PYTHON_MICRO_VERSION=$(PYTHON_MICRO_VERSION)

# Use our "custom linker" that calls gold if available
158
COMMON_LDFLAGS := -B$(TOOLS_DIR)/build_system -L/usr/local/lib -lpthread -lm -lunwind -llzma -L$(DEPS_DIR)/gcc-4.8.2-install/lib64 -lreadline -lgmp
Vinzenz Feenstra's avatar
Vinzenz Feenstra committed
159
COMMON_LDFLAGS += $(DEPS_DIR)/pypa-install/lib/libpypa.a
160 161

# Conditionally add libtinfo if available - otherwise nothing will be added
162
COMMON_LDFLAGS += `pkg-config tinfo 2>/dev/null && pkg-config tinfo --libs || echo ""`
163

Kevin Modzelewski's avatar
Kevin Modzelewski committed
164 165 166
# Make sure that we put all symbols in the dynamic symbol table so that MCJIT can load them;
# TODO should probably do the linking before MCJIT
COMMON_LDFLAGS += -Wl,-E
167

168 169
# We get multiple shared libraries (libstdc++, libgcc_s) from the gcc installation:
COMMON_LDFLAGS += -Wl,-rpath $(GCC_DIR)/lib64
170

171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
ifneq ($(USE_DEBUG_LIBUNWIND),0)
	COMMON_LDFLAGS += -L$(DEPS_DIR)/libunwind-trunk-debug-install/lib

	# libunwind's include files warn on -Wextern-c-compat, so turn that off;
	# ideally would just turn it off for header files in libunwind, maybe by
	# having an internal libunwind.h that pushed/popped the diagnostic state,
	# but it doesn't seem like that important a warning so just turn it off.
	COMMON_CXXFLAGS += -I$(DEPS_DIR)/libunwind-trunk-debug-install/include -Wno-extern-c-compat
else
	COMMON_LDFLAGS += -L$(DEPS_DIR)/libunwind-trunk-install/lib
	COMMON_CXXFLAGS += -I$(DEPS_DIR)/libunwind-trunk-install/include -Wno-extern-c-compat
endif


EXTRA_CXXFLAGS ?=
Kevin Modzelewski's avatar
Kevin Modzelewski committed
186
CXXFLAGS_DBG := $(LLVM_CXXFLAGS) $(COMMON_CXXFLAGS) -O0 -DBINARY_SUFFIX= -DBINARY_STRIPPED_SUFFIX=_stripped $(EXTRA_CXXFLAGS)
187
CXXFLAGS_PROFILE = $(LLVM_PROFILE_CXXFLAGS) $(COMMON_CXXFLAGS) -pg -O3 -DNDEBUG -DNVALGRIND -DBINARY_SUFFIX=_release -DBINARY_STRIPPED_SUFFIX= -fno-function-sections $(EXTRA_CXXFLAGS)
188
CXXFLAGS_RELEASE := $(LLVM_RELEASE_CXXFLAGS) $(COMMON_CXXFLAGS) -O3 -fstrict-aliasing -DNDEBUG -DNVALGRIND -DBINARY_SUFFIX=_release -DBINARY_STRIPPED_SUFFIX= $(EXTRA_CXXFLAGS)
189

Kevin Modzelewski's avatar
Kevin Modzelewski committed
190 191 192 193 194 195 196 197
LDFLAGS := $(LLVM_LDFLAGS) $(COMMON_LDFLAGS)
LDFLAGS_DEBUG := $(LLVM_DEBUG_LDFLAGS) $(COMMON_LDFLAGS)
LDFLAGS_PROFILE = $(LLVM_PROFILE_LDFLAGS) -pg $(COMMON_LDFLAGS)
LDFLAGS_RELEASE := $(LLVM_RELEASE_LDFLAGS) $(COMMON_LDFLAGS)
LDFLAGS_RELEASE := $(LLVM_RELEASE_LDFLAGS) $(COMMON_LDFLAGS)
# Can't add this, because there are functions in the compiler that look unused but are hooked back from the runtime:
# LDFLAGS_RELEASE += -Wl,--gc-sections

198

Kevin Modzelewski's avatar
Kevin Modzelewski committed
199
BUILD_SYSTEM_DEPS := Makefile Makefile.local $(wildcard build_system/*)
200
CLANG_DEPS := $(CLANGPP_EXE) $(abspath $(dir $(CLANGPP_EXE))/../../built_release)
201
$(CLANGPP_EXE) $(CLANG_EXE): $(abspath $(dir $(CLANGPP_EXE))/../../built_release)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
202 203 204

# settings to make clang and ccache play nicely:
CLANG_CCACHE_FLAGS := -Qunused-arguments
Kevin Modzelewski's avatar
Kevin Modzelewski committed
205
CLANG_EXTRA_FLAGS := -enable-tbaa -ferror-limit=$(ERROR_LIMIT) $(CLANG_CCACHE_FLAGS)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
206 207 208 209 210
ifeq ($(COLOR),1)
	CLANG_EXTRA_FLAGS += -fcolor-diagnostics
else
	CLANG_EXTRA_FLAGS += -fno-color-diagnostics
endif
Kevin Modzelewski's avatar
Kevin Modzelewski committed
211
CLANGFLAGS := $(CXXFLAGS_DBG) $(CLANG_EXTRA_FLAGS)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
212 213
CLANGFLAGS_RELEASE := $(CXXFLAGS_RELEASE) $(CLANG_EXTRA_FLAGS)

214
EXT_CFLAGS := $(COMMON_CFLAGS) -fPIC -Wimplicit -O2 -I../include
215
EXT_CFLAGS += -Wno-missing-field-initializers
216 217 218
ifneq ($(USE_CLANG),0)
	EXT_CFLAGS += $(CLANG_EXTRA_FLAGS)
endif
219

220 221 222 223 224 225 226 227 228 229 230
# Extra flags to enable soon:
CLANGFLAGS += -Wno-sign-conversion -Wnon-virtual-dtor -Winit-self -Wimplicit-int -Wmissing-include-dirs -Wstrict-overflow=5 -Wundef -Wpointer-arith -Wtype-limits -Wwrite-strings -Wempty-body -Waggregate-return -Wstrict-prototypes -Wold-style-definition -Wmissing-field-initializers -Wredundant-decls -Wnested-externs -Winline -Wint-to-pointer-cast -Wpointer-to-int-cast -Wlong-long -Wvla
# Want this one but there's a lot of places that I haven't followed it:
# CLANGFLAGS += -Wold-style-cast
# llvm headers fail on this one:
# CLANGFLAGS += -Wswitch-enum
# Not sure about these:
# CLANGFLAGS += -Wbad-function-cast -Wcast-qual -Wcast-align -Wmissing-prototypes -Wunreachable-code -Wfloat-equal -Wunused -Wunused-variable
# Or everything:
# CLANGFLAGS += -Weverything -Wno-c++98-compat-pedantic -Wno-shadow -Wno-padded -Wno-zero-length-array

Kevin Modzelewski's avatar
Kevin Modzelewski committed
231
CXX := $(GPP)
232
CC := $(GCC)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
233
CXX_PROFILE := $(GPP)
234
CLANG_CXX := $(CLANGPP_EXE)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
235 236 237

ifneq ($(USE_CLANG),0)
	CXX := $(CLANG_CXX)
238
	CC := $(CLANG_EXE)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
239

Kevin Modzelewski's avatar
Kevin Modzelewski committed
240
	CXXFLAGS_DBG := $(CLANGFLAGS)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
	CXXFLAGS_RELEASE := $(CLANGFLAGS_RELEASE)

	BUILD_SYSTEM_DEPS := $(BUILD_SYSTEM_DEPS) $(CLANG_DEPS)
endif

ifeq ($(USE_CCACHE),1)
	CXX := ccache $(CXX)
	CXX_PROFILE := ccache $(CXX_PROFILE)
	CLANG_CXX := ccache $(CLANG_CXX)
	ifeq ($(USE_DISTCC),1)
		CXX_ENV += CCACHE_PREFIX=distcc
	endif
else ifeq ($(USE_DISTCC),1)
	CXX := distcc $(CXX)
	CXX_PROFILE := distcc $(CXX_PROFILE)
	CLANG_CXX := distcc $(CLANG_CXX)
	LLVM_BUILD_VARS += CXX='distcc $(GPP)'
endif
ifeq ($(USE_DISTCC),1)
	LLVM_BUILD_ENV += CCACHE_PREFIX=distcc
endif
ifeq ($(USE_CCACHE),1)
	LLVM_BUILD_VARS += CXX='ccache $(GPP)'
endif
CXX := $(CXX_ENV) $(CXX)
CXX_PROFILE := $(CXX_ENV) $(CXX_PROFILE)
CLANG_CXX := $(CXX_ENV) $(CLANG_CXX)
# Not sure if ccache_basedir actually helps at all (I think the generated files make them different?)
LLVM_BUILD_ENV += CCACHE_DIR=$(HOME)/.ccache_llvm CCACHE_BASEDIR=$(LLVM_SRC)

271 272 273
BASE_SRCS := $(wildcard src/codegen/*.cpp) $(wildcard src/asm_writing/*.cpp) $(wildcard src/codegen/irgen/*.cpp) $(wildcard src/codegen/opt/*.cpp) $(wildcard src/analysis/*.cpp) $(wildcard src/core/*.cpp) src/codegen/profiling/profiling.cpp src/codegen/profiling/dumprof.cpp $(wildcard src/runtime/*.cpp) $(wildcard src/runtime/builtin_modules/*.cpp) $(wildcard src/gc/*.cpp) $(wildcard src/capi/*.cpp)
MAIN_SRCS := $(BASE_SRCS) src/jit.cpp
STDLIB_SRCS := $(wildcard src/runtime/inline/*.cpp)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
274 275 276
SRCS := $(MAIN_SRCS) $(STDLIB_SRCS)
STDLIB_OBJS := stdlib.bc.o stdlib.stripped.bc.o
STDLIB_RELEASE_OBJS := stdlib.release.bc.o
277

Marius Wachtler's avatar
Marius Wachtler committed
278
STDMODULE_SRCS := errnomodule.c shamodule.c sha256module.c sha512module.c _math.c mathmodule.c md5.c md5module.c _randommodule.c _sre.c operator.c binascii.c $(EXTRA_STDMODULE_SRCS)
279
FROM_CPYTHON_SRCS := $(addprefix lib_python/2.7_Modules/,$(STDMODULE_SRCS)) $(wildcard src/capi/*.c)
280

Kevin Modzelewski's avatar
Kevin Modzelewski committed
281 282
# The stdlib objects have slightly longer dependency chains,
# so put them first in the list:
283
OBJS := $(STDLIB_OBJS) $(SRCS:.cpp=.o) $(FROM_CPYTHON_SRCS:.c=.o)
284
ASTPRINT_OBJS := $(STDLIB_OBJS) $(BASE_SRCS:.cpp=.o) $(FROM_CPYTHON_SRCS:.c=.o)
285 286
PROFILE_OBJS := $(STDLIB_RELEASE_OBJS) $(MAIN_SRCS:.cpp=.prof.o) $(STDLIB_SRCS:.cpp=.release.o) $(FROM_CPYTHON_SRCS:.c=.release.o)
OPT_OBJS := $(STDLIB_RELEASE_OBJS) $(SRCS:.cpp=.release.o) $(FROM_CPYTHON_SRCS:.c=.release.o)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
287

288
OPTIONAL_SRCS := src/codegen/profiling/oprofile.cpp src/codegen/profiling/pprof.cpp
Kevin Modzelewski's avatar
Kevin Modzelewski committed
289
TOOL_SRCS := $(wildcard $(TOOLS_DIR)/*.cpp)
290

291
UNITTEST_DIR := $(TEST_DIR)/unittests
292 293 294
UNITTEST_SRCS := $(wildcard $(UNITTEST_DIR)/*.cpp)

NONSTDLIB_SRCS := $(MAIN_SRCS) $(OPTIONAL_SRCS) $(TOOL_SRCS) $(UNITTEST_SRCS)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
295

296 297 298
.DEFAULT_GOAL := pyston_dbg
# _ :
	# $(MAKE) pyston_dbg || (clear; $(MAKE) pyston_dbg -j1 ERROR_LIMIT=1)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
299 300

.PHONY: all _all
Kevin Modzelewski's avatar
Kevin Modzelewski committed
301 302 303 304 305
# all: llvm
	# @# have to do this in a recursive make so that dependency is enforced:
	# $(MAKE) pyston_all
# all: pyston_dbg pyston_release pyston_oprof pyston_prof $(OPTIONAL_SRCS:.cpp=.o) ext_python ext_pyston
all: pyston_dbg pyston_release pyston_prof ext_python ext_pyston unittests
Kevin Modzelewski's avatar
Kevin Modzelewski committed
306

307
ALL_HEADERS := $(wildcard src/*/*.h) $(wildcard src/*/*/*.h) $(wildcard ./include/*.h)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
308
tags: $(SRCS) $(OPTIONAL_SRCS) $(ALL_HEADERS)
309
	$(ECHO) Calculating tags...
Kevin Modzelewski's avatar
Kevin Modzelewski committed
310 311
	$(VERB) ctags $^

312
NON_ENTRY_OBJS := $(filter-out src/jit.o,$(OBJS))
313 314 315

define add_unittest
$(eval \
316
$1: $(GTEST_DIR)/src/gtest-all.o $(NON_ENTRY_OBJS) $(BUILD_SYSTEM_DEPS) $(UNITTEST_DIR)/$1.o
317 318
	$(ECHO) Linking $$@
	$(VERB) $(CXX) $(NON_ENTRY_OBJS) $(GTEST_DIR)/src/gtest-all.o $(GTEST_DIR)/src/gtest_main.o $(UNITTEST_DIR)/$1.o $(LDFLAGS) -o $$@
319 320 321 322 323
dbg_$1_unittests: $1
	zsh -c 'ulimit -v $(MAX_MEM_KB); ulimit -d $(MAX_MEM_KB); time $(GDB) $(GDB_CMDS) --args ./$1 --gtest_break_on_failure $(ARGS)'
unittests:: $1
run_$1_unittests: $1
	zsh -c 'ulimit -v $(MAX_MEM_KB); ulimit -d $(MAX_MEM_KB); time ./$1 $(ARGS)'
324 325 326 327
run_unittests:: run_$1_unittests
)
endef

328
override GDB_CMDS ?=
329
override GDB_CMDS := --ex "set confirm off" --ex "handle SIGUSR2 pass nostop noprint" --ex run --ex "bt 20" $(GDB_CMDS)
330 331 332 333 334
BR ?=
ARGS ?=
ifneq ($(BR),)
	override GDB_CMDS := --ex "break $(BR)" $(GDB_CMDS)
endif
335 336 337
$(call add_unittest,gc)
$(call add_unittest,analysis)

Kevin Modzelewski's avatar
Kevin Modzelewski committed
338

339 340 341 342
define checksha
	test "$$($1 | sha1sum)" = "$2  -"
endef

343 344
.PHONY: format check_format
format:
345
	cd src && find \( -name '*.cpp' -o -name '*.h' \) -print0 | xargs -0 $(LLVM_BIN)/clang-format -style=file -i
346
check_format:
347
	$(ECHO) checking formatting...
348
	$(VERB) cd src && ../tools/check_format.sh $(LLVM_BIN)/clang-format
349

350 351 352 353
.PHONY: analyze
analyze:
	$(MAKE) clean
	PATH=$$PATH:$(DEPS_DIR)/llvm-trunk/tools/clang/tools/scan-view $(DEPS_DIR)/llvm-trunk/tools/clang/tools/scan-build/scan-build \
354
		 --use-analyzer $(CLANGPP_EXE) --use-c++ $(CLANGPP_EXE) -V \
355 356
		$(MAKE) pyston_dbg USE_DISTCC=0 USE_CCACHE=0

357 358 359
.PHONY: lint cpplint
lint:
	$(ECHO) linting...
360
	$(VERB) cd src && python ../tools/lint.py
361
cpplint:
362
	$(VERB) cd src && python $(TOOLS_DIR)/cpplint.py --filter=-whitespace,-build/header_guard,-build/include_order,-readability/todo $(SRCS)
363

Kevin Modzelewski's avatar
Kevin Modzelewski committed
364
.PHONY: check quick_check
365
check:
Kevin Modzelewski's avatar
Kevin Modzelewski committed
366
	@# These are ordered roughly in decreasing order of (chance will expose issue) / (time to run test)
367
	$(MAKE) lint
368
	$(MAKE) ext_python ext_pyston pyston_dbg
Kevin Modzelewski's avatar
Kevin Modzelewski committed
369

Kevin Modzelewski's avatar
Kevin Modzelewski committed
370
	$(MAKE) check_dbg
Kevin Modzelewski's avatar
Kevin Modzelewski committed
371

Kevin Modzelewski's avatar
Kevin Modzelewski committed
372
	$(MAKE) check_format
Kevin Modzelewski's avatar
Kevin Modzelewski committed
373 374
	$(MAKE) run_unittests

Kevin Modzelewski's avatar
Kevin Modzelewski committed
375 376
	@# jit_prof forces the use of GCC as the compiler, which can expose other errors, so just build it and see what happens:
	$(MAKE) pyston_prof
377
	@# and run some basic tests to make sure it works:
378 379 380
	$(call checksha,./pyston_prof -cq  $(TESTS_DIR)/raytrace_small.py,0544f4621dd45fe94205219488a2576b84dc044d)
	$(call checksha,./pyston_prof -cqn $(TESTS_DIR)/raytrace_small.py,0544f4621dd45fe94205219488a2576b84dc044d)
	$(call checksha,./pyston_prof -cqO $(TESTS_DIR)/raytrace_small.py,0544f4621dd45fe94205219488a2576b84dc044d)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
381

Kevin Modzelewski's avatar
Kevin Modzelewski committed
382
	$(MAKE) check_release
Kevin Modzelewski's avatar
Kevin Modzelewski committed
383 384
	echo "All tests passed"

385
quick_check:
Kevin Modzelewski's avatar
Kevin Modzelewski committed
386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412
	$(MAKE) pyston_dbg
	$(call checksha,./pyston_dbg -cq  $(TESTS_DIR)/raytrace_small.py,0544f4621dd45fe94205219488a2576b84dc044d)
	$(call checksha,./pyston_dbg -cqn $(TESTS_DIR)/raytrace_small.py,0544f4621dd45fe94205219488a2576b84dc044d)
	$(call checksha,./pyston_dbg -cqO $(TESTS_DIR)/raytrace_small.py,0544f4621dd45fe94205219488a2576b84dc044d)
	$(MAKE) pyston
	$(call checksha,./pyston -cq  $(TESTS_DIR)/raytrace_small.py,0544f4621dd45fe94205219488a2576b84dc044d)
	$(call checksha,./pyston -cqn $(TESTS_DIR)/raytrace_small.py,0544f4621dd45fe94205219488a2576b84dc044d)
	$(call checksha,./pyston -cqO $(TESTS_DIR)/raytrace_small.py,0544f4621dd45fe94205219488a2576b84dc044d)
	$(MAKE) pyston_prof
	$(call checksha,./pyston_prof -cq  $(TESTS_DIR)/raytrace_small.py,0544f4621dd45fe94205219488a2576b84dc044d)
	$(call checksha,./pyston_prof -cqn $(TESTS_DIR)/raytrace_small.py,0544f4621dd45fe94205219488a2576b84dc044d)
	$(call checksha,./pyston_prof -cqO $(TESTS_DIR)/raytrace_small.py,0544f4621dd45fe94205219488a2576b84dc044d)

Makefile.local:
	echo "Creating default Makefile.local"
	python -c 'import sys; v = sys.version_info; print "PYTHON_MAJOR_VERSION:=%d\nPYTHON_MINOR_VERSION:=%d\nPYTHON_MICRO_VERSION:=%d" % (v[0], v[1], v[2])' > Makefile.local || (rm $@; false)

#################
# LLVM rules:

#
# This is probably my worst makefile hackery:
# - if you change the patch, the llvm_* targets should be rebuilt when you build a pyston target that depends on them
# - they shouldn't be rebuilt if the built_* rule doesn't indicate it
# - should rebuild the pyston targets *if and only if* one of their dependencies actually changes in the rebuild
# -- make should report them as "up to date"

413
LLVM_CONFIGURATION := $(LLVM_BUILD)/Makefile.config
Kevin Modzelewski's avatar
Kevin Modzelewski committed
414
# First, specify when we need to rebuild the different targets:
415
$(LLVM_BUILD)/built_quick: $(LLVM_SRC)/_patched $(LLVM_CONFIGURATION)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
416
	$(MAKE) llvm_quick
417
$(LLVM_BUILD)/built_debug: $(LLVM_SRC)/_patched $(LLVM_CONFIGURATION)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
418
	$(MAKE) llvm_debug
419
$(LLVM_BUILD)/built_release: $(LLVM_SRC)/_patched $(LLVM_CONFIGURATION)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
420
	$(MAKE) llvm_release
421
$(LLVM_BUILD)/built_profile: $(LLVM_SRC)/_patched $(LLVM_CONFIGURATION)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
422 423 424 425 426
	$(MAKE) llvm_profile
# Now, specify that we shouldn't check the timestamps of dependencies until after
# the llvm rebuild finishes, if one is happening, but do it with order-only
# dependencies so that make doesn't consider the libraries out of date
# if they didn't get updated in the llvm rebuild:
427
# $(CLANGPP_EXE): | $(LLVM_TRUNK)/built_release
Kevin Modzelewski's avatar
Kevin Modzelewski committed
428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461
$(LLVM_LIB_DEPS): | $(LLVM_BUILD)/built_quick
$(LLVM_DEBUG_LIB_DEPS): | $(LLVM_BUILD)/built_debug
$(LLVM_RELEASE_LIB_DEPS): | $(LLVM_BUILD)/built_release
$(LLVM_PROFILE_LIB_DEPS): | $(LLVM_BUILD)/built_profile
# Now, put together some variables for later; pyston targets will have to depend on the lib_deps
# so they can be rebuilt properly, but also the built_* targets to force a rebuild if appropriate
# (because the lib_deps dependency won't cause a rebuild on their own)
LLVM_DEPS := $(LLVM_LIB_DEPS) $(LLVM_BUILD)/built_quick
LLVM_DEBUG_DEPS := $(LLVM_DEBUG_LIB_DEPS) $(LLVM_BUILD)/built_debug
LLVM_RELEASE_DEPS := $(LLVM_RELEASE_LIB_DEPS) $(LLVM_BUILD)/built_release
LLVM_PROFILE_DEPS := $(LLVM_PROFILE_LIB_DEPS) $(LLVM_BUILD)/built_profile
# end worst makefile hackery

LLVM_BUILDS := quick release debug profile
# Tools for all builds (note: don't include llvm-config)
LLVM_TOOLS := llc opt

ifneq (,$(findstring llvm_debug,$(MAKECMDGOALS)))
FIRST_LLVM_BUILD := debug
else ifneq (,$(findstring llvm_quick,$(MAKECMDGOALS)))
FIRST_LLVM_BUILD := quick
else
FIRST_LLVM_BUILD := release
endif
NONFIRST_LLVM_BUILDS := $(filter-out $(FIRST_LLVM_BUILD),$(LLVM_BUILDS))
.PHONY: llvm llvm_configs $(patsubst %,llvm_%,$(LLVM_BUILDS)) llvm/% llvm_up
llvm: llvm_configs $(LLVM_BUILDS:%=llvm_%)
llvm_configs: $(LLVM_BUILDS:%=llvm/%/tools/llvm-config)
# Use the configure-created Makefile as evidence that llvm has been configured:
.PHONY: llvm_configure
llvm_configure:
	rm -f $(LLVM_BUILD)/Makefile.config
	$(MAKE) $(LLVM_CONFIGURATION)

462 463 464 465 466 467 468 469 470 471
# Put the llvm_configure line in its own file, so that we can force an llvm reconfigure
# if we change the configuration parameters.
# (All non-llvm build targets get rebuilt if the main Makefile is touched, but that is too
# expensive to do for the llvm ones.)
LLVM_CONFIG_INCL := Makefile.llvmconfig
# Sets LLVM_CONFIGURE_LINE:
include $(LLVM_CONFIG_INCL)
ifeq (,$(LLVM_CONFIGURE_LINE))
$(error "did not set configure line")
endif
472 473 474
ifneq ($(ENABLE_INTEL_JIT_EVENTS),0)
LLVM_CONFIGURE_LINE += --with-intel-jitevents
endif
475

476
$(LLVM_CONFIGURATION): $(LLVM_SRC)/configure $(LLVM_CONFIG_INCL)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
477 478
	mkdir -p $(LLVM_BUILD)
	cd $(LLVM_BUILD) ; \
479
	$(LLVM_CONFIGURE_LINE)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
480 481 482 483 484 485 486 487 488 489
	# CXX=ccache\ g++ ./configure --enable-targets=host
	# CXX='env CCACHE_PREFIX=distcc ccache g++' ./configure --enable-targets=host

# Use "Static Pattern Rules" instead of implicit rules to avoid needing to reuse the same implicit rule in a single chain:
define add_llvm_dep
$(eval \
$(LLVM_BUILDS:%=llvm/%/$1): llvm/%/$1: llvm/%/$2
)
endef

490 491
###
# LLVM build dependency management:
Kevin Modzelewski's avatar
Kevin Modzelewski committed
492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510
$(call add_llvm_dep,lib/TableGen,lib/Support)
$(call add_llvm_dep,utils/TableGen,lib/TableGen)
$(call add_llvm_dep,lib/IR,utils/TableGen)
$(call add_llvm_dep,lib/Target,lib/IR)
$(call add_llvm_dep,lib/Target,utils/TableGen)
# There are some shared targets in the Target subdirectory, which will make a parallel make fail
# if you try to build multiple llvm builds at the same time.  Work around this by
# serializing the non-release Target builds to after the release one:
$(NONFIRST_LLVM_BUILDS:%=llvm/%/lib/Target): llvm/%/lib/Target: llvm/$(FIRST_LLVM_BUILD)/lib/Target
$(NONFIRST_LLVM_BUILDS:%=llvm/%/tools/llvm-config): llvm/%/tools/llvm-config: llvm/$(FIRST_LLVM_BUILD)/tools/llvm-config
$(call add_llvm_dep,lib,lib/Target)
$(call add_llvm_dep,tools/llvm-config,lib/Support)
$(call add_llvm_dep,tools,lib)
$(call add_llvm_dep,tools,utils/unittest)
$(call add_llvm_dep,utils,lib)
# The tools need to individually depend on the lib directory:
$(foreach tool,$(LLVM_TOOLS),$(foreach build,$(LLVM_BUILDS),$(eval \
llvm/$(build)/tools/$(tool): llvm/$(build)/lib \
)))
511 512 513 514

##
# LLVM build subset specifications:
$(LLVM_BUILDS:%=llvm_%): llvm_%: llvm/%/lib llvm/%/tools/llvm-config
Kevin Modzelewski's avatar
Kevin Modzelewski committed
515 516
	touch $(LLVM_BUILD)/$(patsubst llvm_%,built_%,$@)
llvm_release: llvm/release/tools llvm/release/utils
517 518 519
llvm_quick: $(LLVM_TOOLS:%=llvm/quick/tools/%)
llvm_debug: $(LLVM_TOOLS:%=llvm/debug/tools/%)

Kevin Modzelewski's avatar
Kevin Modzelewski committed
520 521 522 523 524 525 526 527 528 529 530 531 532 533 534
llvm_quick_clean:
	$(MAKE) -C $(LLVM_BUILD) ENABLE_OPTIMIZED=1 clean
llvm_release_%:
	$(MAKE) -C $(LLVM_BUILD) ENABLE_OPTIMIZED=1 DISABLE_ASSERTIONS=1 $(patsubst llvm_release_%,%,$@)
llvm_debug_clean:
	$(MAKE) -C $(LLVM_BUILD) DEBUG_RUNTIME=1 DEBUG_SYMBOLS=1 ENABLE_OPTIMIZED=0 clean
llvm_profile_clean:
	$(MAKE) -C $(LLVM_BUILD) ENABLE_PROFILING=1 ENABLE_OPTIMIZED=1 DISABLE_ASSERTIONS=1 clean
llvm_allclean: $(patsubst %,llvm_%_clean,$(LLVM_BUILDS))
	cd $(LLVM_SRC) ; git checkout .
	rm -rfv $(LLVM_BUILD)/*
llvm_install: llvm_release
	sudo $(MAKE) -C $(LLVM_SRC)/tools ENABLE_OPTIMIZED=1 DISABLE_ASSERTIONS=1 install

# Clear OPTIONAL_DIRS and OPTIONAL_PARALLEL_DIRS to make sure that clang doesn't get built+tested
535
llvm_test: llvm_test_quick
536
llvm_test_quick: llvm_quick llvm/quick/tools/opt
Kevin Modzelewski's avatar
Kevin Modzelewski committed
537
	$(MAKE) -C $(LLVM_BUILD) OPTIONAL_DIRS= OPTIONAL_PARALLEL_DIRS= ENABLE_OPTIMIZED=1 check
538 539
llvm_test_release: llvm_release
	$(MAKE) -C $(LLVM_BUILD) OPTIONAL_DIRS= OPTIONAL_PARALLEL_DIRS= ENABLE_OPTIMIZED=1 DISABLE_ASSERTIONS=1 check
Kevin Modzelewski's avatar
Kevin Modzelewski committed
540 541 542
llvm_test_all: llvm_release
	$(MAKE) -C $(LLVM_BUILD) ENABLE_OPTIMIZED=1 DISABLE_ASSERTIONS=1 check-all

543
llvm/quick/%: $(LLVM_SRC)/_patched $(LLVM_CONFIGURATION)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
544 545 546
	mkdir -p $(patsubst llvm/quick/%,$(LLVM_BUILD)/%,$@)
	$(VERB) if [ ! -f $(patsubst llvm/quick/%,$(LLVM_BUILD)/%/Makefile,$@) ]; then cp $(patsubst llvm/quick/%,$(LLVM_SRC)/%/Makefile,$@) $(patsubst llvm/quick/%,$(LLVM_BUILD)/%/,$@); fi
	$(LLVM_BUILD_ENV) $(MAKE) -C $(patsubst llvm/quick/%,$(LLVM_BUILD)/%,$@) $(LLVM_BUILD_VARS) ENABLE_OPTIMIZED=1 DEBUG_RUNTIME=0 NO_DEBUG_SYMBOLS=1
547
llvm/release/%: $(LLVM_SRC)/_patched $(LLVM_CONFIGURATION)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
548 549 550
	mkdir -p $(patsubst llvm/release/%,$(LLVM_BUILD)/%,$@)
	$(VERB) if [ ! -f $(patsubst llvm/release/%,$(LLVM_BUILD)/%/Makefile,$@) ]; then cp $(patsubst llvm/release/%,$(LLVM_SRC)/%/Makefile,$@) $(patsubst llvm/release/%,$(LLVM_BUILD)/%/,$@); fi
	$(LLVM_BUILD_ENV) $(MAKE) -C $(patsubst llvm/release/%,$(LLVM_BUILD)/%,$@) $(LLVM_BUILD_VARS) ENABLE_OPTIMIZED=1 DISABLE_ASSERTIONS=1
551
llvm/debug/%: $(LLVM_SRC)/_patched $(LLVM_CONFIGURATION)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
552 553 554
	mkdir -p $(patsubst llvm/debug/%,$(LLVM_BUILD)/%,$@)
	$(VERB) if [ ! -f $(patsubst llvm/debug/%,$(LLVM_BUILD)/%/Makefile,$@) ]; then cp $(patsubst llvm/debug/%,$(LLVM_SRC)/%/Makefile,$@) $(patsubst llvm/debug/%,$(LLVM_BUILD)/%/,$@); fi
	$(LLVM_BUILD_ENV) $(MAKE) -C $(patsubst llvm/debug/%,$(LLVM_BUILD)/%,$@) $(LLVM_BUILD_VARS) DEBUG_RUNTIME=1 DEBUG_SYMBOLS=1 ENABLE_OPTIMIZED=0
555
llvm/profile/%: $(LLVM_SRC)/_patched $(LLVM_CONFIGURATION)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
556 557 558 559
	mkdir -p $(patsubst llvm/profile/%,$(LLVM_BUILD)/%,$@)
	$(VERB) if [ ! -f $(patsubst llvm/profile/%,$(LLVM_BUILD)/%/Makefile,$@) ]; then cp $(patsubst llvm/profile/%,$(LLVM_SRC)/%/Makefile,$@) $(patsubst llvm/profile/%,$(LLVM_BUILD)/%/,$@); fi
	$(LLVM_BUILD_ENV) $(MAKE) -C $(patsubst llvm/profile/%,$(LLVM_BUILD)/%,$@) $(LLVM_BUILD_VARS) CXXFLAGS="-fno-omit-frame-pointer -fno-function-sections" ENABLE_PROFILING=1 ENABLE_OPTIMIZED=1 DISABLE_ASSERTIONS=1 $(LLVM_MAKE_ARGS)

560
$(LLVM_SRC)/_patched: $(wildcard ./llvm_patches/*) $(wildcard ./clang_patches/*) $(LLVM_REVISION_FILE)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
561 562
	$(MAKE) llvm_up
llvm_up:
563 564
	python $(TOOLS_DIR)/git_svn_gotorev.py $(LLVM_SRC) $(LLVM_REVISION) ./llvm_patches
	python $(TOOLS_DIR)/git_svn_gotorev.py $(LLVM_SRC)/tools/clang $(LLVM_REVISION) ./clang_patches
565
	$(MAKE) $(LLVM_CONFIGURATION)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593
	touch $(LLVM_SRC)/_patched

# end of llvm rules
########

## TOOLS:

$(TOOLS_DIR)/demangle: $(TOOLS_DIR)/demangle.cpp $(BUILD_SYSTEM_DEPS)
	$(CXX) $< -o $@
.PHONY: demangle
demangle: $(TOOLS_DIR)/demangle
	$(TOOLS_DIR)/demangle $(ARGS)

$(TOOLS_DIR)/mcjitcache: $(TOOLS_DIR)/mcjitcache.o $(LLVM_DEPS) $(BUILD_SYSTEM_DEPS)
	$(CXX) $< $(LDFLAGS) -o $@
# Build a version of mcjitcache off the llvm_release repo mostly to avoid a dependence of the opt builds
# on the llvm_quick build.
$(TOOLS_DIR)/mcjitcache_release: $(TOOLS_DIR)/mcjitcache.release.o $(LLVM_RELEASE_DEPS) $(BUILD_SYSTEM_DEPS)
	$(CXX) $< $(LDFLAGS_RELEASE) -o $@

$(TOOLS_DIR)/publicize: $(TOOLS_DIR)/publicize.o $(LLVM_DEPS) $(BUILD_SYSTEM_DEPS)
	$(ECHO) Linking $(TOOLS_DIR)/publicize
	$(VERB) $(CXX) $< $(LDFLAGS) -o $@ -lLLVMBitWriter

$(TOOLS_DIR)/publicize_release: $(TOOLS_DIR)/publicize.release.o $(LLVM_RELEASE_DEPS) $(BUILD_SYSTEM_DEPS)
	$(ECHO) Linking $(TOOLS_DIR)/publicize_release
	$(VERB) $(CXX) $< $(LDFLAGS_RELEASE) -o $@ -lLLVMBitWriter

594 595 596 597
$(TOOLS_DIR)/astprint: $(TOOLS_DIR)/astprint.cpp $(BUILD_SYSTEM_DEPS) $(LLVM_DEPS) $(ASTPRINT_OBJS)
	$(ECHO) Linking $(TOOLS_DIR)/astprint
	$(VERB) $(CXX) $< -o $@ $(LLVM_LIB_DEPS) $(ASTPRINT_OBJS) $(LDFLAGS) $(STDLIB_SRCS:.cpp=.o) $(CXXFLAGS_DBG)

Vinzenz Feenstra's avatar
Vinzenz Feenstra committed
598
.PHONY: astprint astcompare
599 600 601

astprint: $(TOOLS_DIR)/astprint

Vinzenz Feenstra's avatar
Vinzenz Feenstra committed
602 603 604 605
astcompare: astprint
	$(ECHO) Running libpypa vs CPython AST result comparison test
	$(TOOLS_DIR)/astprint_test.sh && echo "Success" || echo "Failure"

Kevin Modzelewski's avatar
Kevin Modzelewski committed
606 607 608
## END OF TOOLS


609
CODEGEN_SRCS := $(wildcard src/codegen/*.cpp) $(wildcard src/codegen/*/*.cpp)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
610 611 612 613 614 615 616 617 618 619 620 621 622

# args: suffix (ex: ".release"), CXXFLAGS
define make_compile_config
$(eval \
$$(NONSTDLIB_SRCS:.cpp=$1.o): CXXFLAGS:=$2
$$(SRCS:.cpp=$1.o.bc): CXXFLAGS:=$2

## Need to set CXXFLAGS so that this rule doesn't inherit the '-include' rule from the
## thing that's calling it:
%$1.h.pch: CXXFLAGS:=$(2)
%$1.h.pch: %.h $$(BUILD_SYSTEM_DEPS)
	$$(ECHO) Compiling $$@
	$$(VERB) rm -f $$@-*
623
	$$(VERB) $$(CLANGPP_EXE) $$(CXXFLAGS) -MMD -MP -MF $$<.d -x c++-header $$< -o $$@
624 625
$$(CODEGEN_SRCS:.cpp=$1.o): CXXFLAGS += -include src/codegen/irgen$1.h
$$(CODEGEN_SRCS:.cpp=$1.o): src/codegen/irgen$1.h.pch
Kevin Modzelewski's avatar
Kevin Modzelewski committed
626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642

$$(NONSTDLIB_SRCS:.cpp=$1.o): %$1.o: %.cpp $$(BUILD_SYSTEM_DEPS)
	$$(ECHO) Compiling $$@
	$$(VERB) $$(CXX) $$(CXXFLAGS) -MMD -MP -MF $$(patsubst %.o,%.d,$$@) $$< -c -o $$@

# For STDLIB sources, first compile to bitcode:
$$(STDLIB_SRCS:.cpp=$1.o.bc): %$1.o.bc: %.cpp $$(BUILD_SYSTEM_DEPS) $$(CLANG_DEPS)
	$$(ECHO) Compiling $$@
	$$(VERB) $$(CLANG_CXX) $$(CXXFLAGS) $$(CLANG_EXTRA_FLAGS) -MMD -MP -MF $$(patsubst %.bc,%.d,$$@) $$< -c -o $$@ -emit-llvm -g

stdlib$1.unopt.bc: $$(STDLIB_SRCS:.cpp=$1.o.pub.bc)
	$$(ECHO) Linking $$@
	$$(VERB) $$(LLVM_BIN)/llvm-link $$^ -o $$@

)
endef

Kevin Modzelewski's avatar
Kevin Modzelewski committed
643 644 645
PASS_SRCS := codegen/opt/aa.cpp
PASS_OBJS := $(PASS_SRCS:.cpp=.standalone.o)

Kevin Modzelewski's avatar
Kevin Modzelewski committed
646 647 648
$(call make_compile_config,,$(CXXFLAGS_DBG))
$(call make_compile_config,.release,$(CXXFLAGS_RELEASE))
$(call make_compile_config,.grwl,$(CXXFLAGS_RELEASE) -DTHREADING_USE_GRWL=1 -DTHREADING_USE_GIL=0 -UBINARY_SUFFIX -DBINARY_SUFFIX=_grwl)
649
$(call make_compile_config,.grwl_dbg,$(CXXFLAGS_DBG) -DTHREADING_USE_GRWL=1 -DTHREADING_USE_GIL=0 -UBINARY_SUFFIX -DBINARY_SUFFIX=_grwl_dbg -UBINARY_STRIPPED_SUFFIX -DBINARY_STRIPPED_SUFFIX=)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
650
$(call make_compile_config,.nosync,$(CXXFLAGS_RELEASE) -DTHREADING_USE_GRWL=0 -DTHREADING_USE_GIL=0 -UBINARY_SUFFIX -DBINARY_SUFFIX=_nosync)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
651 652

$(UNITTEST_SRCS:.cpp=.o): CXXFLAGS += -isystem $(GTEST_DIR)/include
653

Kevin Modzelewski's avatar
Kevin Modzelewski committed
654 655
$(PASS_SRCS:.cpp=.standalone.o): %.standalone.o: %.cpp $(BUILD_SYSTEM_DEPS)
	$(ECHO) Compiling $@
Kevin Modzelewski's avatar
Kevin Modzelewski committed
656
	$(VERB) $(CXX) $(CXXFLAGS_DBG) -DSTANDALONE -MMD -MP -MF $(patsubst %.o,%.d,$@) $< -c -o $@
Kevin Modzelewski's avatar
Kevin Modzelewski committed
657 658 659 660 661 662 663 664 665
$(NONSTDLIB_SRCS:.cpp=.prof.o): %.prof.o: %.cpp $(BUILD_SYSTEM_DEPS)
	$(ECHO) Compiling $@
	$(VERB) $(CXX_PROFILE) $(CXXFLAGS_PROFILE) -MMD -MP -MF $(patsubst %.o,%.d,$@) $< -c -o $@

# Then, publicize symbols:
%.pub.bc: %.bc $(TOOLS_DIR)/publicize
	$(ECHO) Publicizing $<
	$(VERB) $(TOOLS_DIR)/publicize $< -o $@

Kevin Modzelewski's avatar
Kevin Modzelewski committed
666 667
# Then, compile the publicized bitcode into normal .o files
%.o: %.o.pub.bc $(BUILD_SYSTEM_DEPS) $(CLANG_DEPS)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
668 669 670 671
	$(ECHO) Compiling bitcode to $@
	$(VERB) $(LLVM_BIN)/clang $(CLANGFLAGS) -O3 -c $< -o $@


Kevin Modzelewski's avatar
Kevin Modzelewski committed
672

Kevin Modzelewski's avatar
Kevin Modzelewski committed
673 674 675 676 677 678 679 680 681 682 683
passes.so: $(PASS_OBJS) $(BUILD_SYSTEM_DEPS)
	$(CXX) -shared $(PASS_OBJS) -o $@ -shared -rdynamic
test_opt: passes.so
	$(LLVM_BUILD)/Release+Asserts/bin/opt -load passes.so test.ll -S -o test.opt.ll $(ARGS)
test_dbg_opt: passes.so
	$(GDB) --args $(LLVM_BUILD)/Release+Asserts/bin/opt -O3 -load passes.so test.ll -S -o test.opt.ll $(ARGS)


# Optimize and/or strip it:
stdlib.bc: OPT_OPTIONS=-O3
stdlib.release.bc: OPT_OPTIONS=-O3 -strip-debug
Kevin Modzelewski's avatar
Kevin Modzelewski committed
684
.PRECIOUS: %.bc %.stripped.bc
Kevin Modzelewski's avatar
Kevin Modzelewski committed
685
%.bc: %.unopt.bc
Kevin Modzelewski's avatar
Kevin Modzelewski committed
686
	$(ECHO) Optimizing $< -\> $@
Kevin Modzelewski's avatar
Kevin Modzelewski committed
687 688
	$(VERB) $(LLVM_BIN)/opt $(OPT_OPTIONS) $< -o $@
%.stripped.bc: %.bc
Kevin Modzelewski's avatar
Kevin Modzelewski committed
689
	$(ECHO) Stripping $< -\> $@
Kevin Modzelewski's avatar
Kevin Modzelewski committed
690 691 692
	$(VERB) $(LLVM_BIN)/opt -strip-debug $< -o $@

# Then do "ld -b binary" to create a .o file for embedding into the executable
Kevin Modzelewski's avatar
Kevin Modzelewski committed
693 694 695
# $(STDLIB_OBJS) $(STDLIB_RELEASE_OBJS): %.o: % $(BUILD_SYSTEM_DEPS)
stdli%.bc.o: stdli%.bc $(BUILD_SYSTEM_DEPS)
	$(ECHO) Embedding $<
Kevin Modzelewski's avatar
Kevin Modzelewski committed
696 697 698 699 700 701 702 703 704 705 706 707
	$(VERB) ld -r -b binary $< -o $@

# Optionally, disassemble the bitcode files:
%.ll: %.bc
	$(LLVM_BIN)/llvm-dis $<

# Not used currently, but here's how to pre-jit the stdlib bitcode:
%.release.cache: %.release.bc mcjitcache_release
	./mcjitcache_release -p $< -o $@
%.cache: %.bc mcjitcache
	./mcjitcache -p $< -o $@

Kevin Modzelewski's avatar
Kevin Modzelewski committed
708 709 710 711 712 713 714 715 716
# args: output suffx (ex: _release), objects to link, LDFLAGS, other deps
define link
$(eval \
pyston$1: $2 $4
	$$(ECHO) Linking $$@
	$$(VERB) $$(CXX) $2 $3 -o $$@
)
endef

Kevin Modzelewski's avatar
Kevin Modzelewski committed
717 718

# Finally, link it all together:
Kevin Modzelewski's avatar
Kevin Modzelewski committed
719
$(call link,_grwl,stdlib.grwl.bc.o $(SRCS:.cpp=.grwl.o),$(LDFLAGS_RELEASE),$(LLVM_RELEASE_DEPS))
720
$(call link,_grwl_dbg,stdlib.grwl_dbg.bc.o $(SRCS:.cpp=.grwl_dbg.o),$(LDFLAGS),$(LLVM_DEPS))
Kevin Modzelewski's avatar
Kevin Modzelewski committed
721
$(call link,_nosync,stdlib.nosync.bc.o $(SRCS:.cpp=.nosync.o),$(LDFLAGS_RELEASE),$(LLVM_RELEASE_DEPS))
Kevin Modzelewski's avatar
Kevin Modzelewski committed
722 723 724 725 726 727
pyston_oprof: $(OPT_OBJS) codegen/profiling/oprofile.o $(LLVM_DEPS)
	$(ECHO) Linking $@
	$(VERB) $(CXX) $(OPT_OBJS) codegen/profiling/oprofile.o $(LDFLAGS_RELEASE) -lopagent -o $@
pyston_pprof: $(OPT_OBJS) codegen/profiling/pprof.release.o $(LLVM_DEPS)
	$(ECHO) Linking $@
	$(VERB) $(CXX) $(OPT_OBJS) codegen/profiling/pprof.release.o $(LDFLAGS_RELEASE) -lprofiler -o $@
Kevin Modzelewski's avatar
Kevin Modzelewski committed
728
pyston_prof: $(PROFILE_OBJS) $(LLVM_DEPS)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
729 730 731 732 733 734
	$(ECHO) Linking $@
	$(VERB) $(CXX) $(PROFILE_OBJS) $(LDFLAGS) -pg -o $@
pyston_profile: $(PROFILE_OBJS) $(LLVM_PROFILE_DEPS)
	$(ECHO) Linking $@
	$(VERB) $(CXX) $(PROFILE_OBJS) $(LDFLAGS_PROFILE) -o $@

735 736 737 738 739 740 741 742
ifneq ($(USE_CMAKE),1)
$(call link,_dbg,$(OBJS),$(LDFLAGS),$(LLVM_DEPS))
$(call link,_debug,$(OBJS),$(LDFLAGS_DEBUG),$(LLVM_DEBUG_DEPS))
$(call link,_release,$(OPT_OBJS),$(LDFLAGS_RELEASE),$(LLVM_RELEASE_DEPS))

else
.PHONY: pyston_dbg pyston_release
pyston_dbg:
743
	$(NINJA) -C $(HOME)/pyston-build-dbg pyston $(NINJAFLAGS)
744 745
	ln -sf $(HOME)/pyston-build-dbg/pyston pyston_dbg
pyston_release:
746
	$(NINJA) -C $(HOME)/pyston-build-release pyston $(NINJAFLAGS)
747 748
	ln -sf $(HOME)/pyston-build-release/pyston pyston_release
endif
Kevin Modzelewski's avatar
Kevin Modzelewski committed
749

750
-include $(wildcard *.d) $(wildcard */*.d) $(wildcard */*/*.d) $(wildcard $(UNITTEST_DIR)/*.d) $(wildcard ./lib_python/2.7_Modules/*.d)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
751 752 753

.PHONY: clean
clean:
754
	@ find . $(TOOLS_DIR) $(TEST_DIR) ./lib_python/2.7_Modules \( -name '*.o' -o -name '*.d' -o -name '*.py_cache' -o -name '*.bc' -o -name '*.o.ll' -o -name '*.pub.ll' -o -name '*.cache' -o -name 'stdlib*.ll' -o -name '*.pyc' -o -name '*.so' -o -name '*.a' -o -name '*.expected_cache' -o -name '*.pch' \) -print -delete
Kevin Modzelewski's avatar
Kevin Modzelewski committed
755 756 757 758 759 760 761 762
	@ find \( -name 'pyston*' -executable -type f \) -print -delete
	@ find $(TOOLS_DIR) -maxdepth 0 -executable -type f -print -delete
	@ rm -rf oprofile_data

# A helper function that lets me run subdirectory rules from the top level;
# ex instead of saying "make tests/run_1", I can just write "make run_1"
define make_search
$(eval \
763 764 765 766
$1: $(TEST_DIR)/tests/$1 ;
$1: ./microbenchmarks/$1 ;
$1: ./minibenchmarks/$1 ;
$1: ./benchmarks/$1 ;
767
$(patsubst %, $$1: %/$$1 ;,$(EXTRA_SEARCH_DIRS))
Kevin Modzelewski's avatar
Kevin Modzelewski committed
768 769 770
)
endef

771
RUN_DEPS := ext_pyston
Kevin Modzelewski's avatar
Kevin Modzelewski committed
772

Kevin Modzelewski's avatar
Kevin Modzelewski committed
773 774
define make_target
$(eval \
Kevin Modzelewski's avatar
Kevin Modzelewski committed
775
.PHONY: test$1 check$1
776
check$1 test$1: pyston$1 ext_pyston
777 778 779 780
	python $(TOOLS_DIR)/tester.py -R pyston$1 -j$(TEST_THREADS) -k $(TESTS_DIR) $(ARGS)
	python $(TOOLS_DIR)/tester.py -a -x -R pyston$1 -j$(TEST_THREADS) -k $(TESTS_DIR) $(ARGS)
	python $(TOOLS_DIR)/tester.py -R pyston$1 -j$(TEST_THREADS) -a -n -k $(TESTS_DIR) $(ARGS)
	python $(TOOLS_DIR)/tester.py -R pyston$1 -j$(TEST_THREADS) -a -O -k $(TESTS_DIR) $(ARGS)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
781 782 783

.PHONY: run$1 dbg$1
run$1: pyston$1 $$(RUN_DEPS)
784
	./pyston$1 $$(ARGS)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
785
dbg$1: pyston$1 $$(RUN_DEPS)
786
	zsh -c 'ulimit -v $$(MAX_DBG_MEM_KB); $$(GDB) $$(GDB_CMDS) --args ./pyston$1 $$(ARGS)'
Kevin Modzelewski's avatar
Kevin Modzelewski committed
787 788 789 790 791 792 793 794 795 796 797 798 799
run$1_%: %.py pyston$1 $$(RUN_DEPS)
	$(VERB) zsh -c 'ulimit -v $$(MAX_MEM_KB); ulimit -d $$(MAX_MEM_KB); time ./pyston$1 $$(ARGS) $$<'
$$(call make_search,run$1_%)
dbg$1_%: %.py pyston$1 $$(RUN_DEPS)
	$(VERB) zsh -c 'ulimit -v $$(MAX_DBG_MEM_KB); $$(GDB) $$(GDB_CMDS) --args ./pyston$1 $$(ARGS) $$<'
$$(call make_search,dbg$1_%)

ifneq ($$(ENABLE_VALGRIND),0)
memcheck$1_%: %.py pyston$1 $$(RUN_DEPS)
	$$(VALGRIND) --tool=memcheck --leak-check=no --db-attach=yes ./pyston$1 $$(ARGS) $$<
$$(call make_search,memcheck$1_%)
memcheck_gdb$1_%: %.py pyston$1 $$(RUN_DEPS)
	set +e; $$(VALGRIND) -v -v -v -v -v --tool=memcheck --leak-check=no --track-origins=yes --vgdb=yes --vgdb-error=0 ./pyston$1 $$(ARGS) $$< & export PID=$$$$! ; \
800
	$$(GDB) --ex "set confirm off" --ex "target remote | $$(DEPS_DIR)/valgrind-3.10.0-install/bin/vgdb" --ex "continue" --ex "bt" ./pyston$1; kill -9 $$$$PID
Kevin Modzelewski's avatar
Kevin Modzelewski committed
801 802 803 804
$$(call make_search,memcheck_gdb$1_%)
memleaks$1_%: %.py pyston$1 $$(RUN_DEPS)
	$$(VALGRIND) --tool=memcheck --leak-check=full --leak-resolution=low --show-reachable=yes ./pyston$1 $$(ARGS) $$<
$$(call make_search,memleaks$1_%)
805 806 807
cachegrind$1_%: %.py pyston$1 $$(RUN_DEPS)
	$$(VALGRIND) --tool=cachegrind ./pyston$1 $$(ARGS) $$<
$$(call make_search,cachegrind$1_%)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
808 809 810 811 812
endif

.PHONY: perf$1_%
perf$1_%: %.py pyston$1
	perf record -g -- ./pyston$1 -q -p $$(ARGS) $$<
813
	@$(MAKE) perf_report
Kevin Modzelewski's avatar
Kevin Modzelewski committed
814 815 816 817 818
$$(call make_search,perf$1_%)

)
endef

819 820 821 822
.PHONY: perf_report
perf_report:
	perf report -v -n -g flat,1000 | bash $(TOOLS_DIR)/cumulate.sh | less -S

Kevin Modzelewski's avatar
Kevin Modzelewski committed
823 824 825 826 827 828 829 830 831 832 833 834
.PHONY: run run_% dbg_% debug_% perf_%
run: run_dbg
run_%: run_dbg_%
	@true
dbg_%: dbg_dbg_%
	@true
debug_%: dbg_debug_%
	@true
perf_%: perf_release_%
	@true

$(call make_target,_dbg)
835
$(call make_target,_debug)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
836 837
$(call make_target,_release)
$(call make_target,_grwl)
838
$(call make_target,_grwl_dbg)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
839
$(call make_target,_nosync)
Kevin Modzelewski's avatar
Kevin Modzelewski committed
840

841
# "kill valgrind":
Kevin Modzelewski's avatar
Kevin Modzelewski committed
842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896
kv:
	ps aux | awk '/[v]algrind/ {print $$2}' | xargs kill -9; true

# gprof-based profiling:
.PHONY: prof_% profile_%
prof_%: %.py pyston_prof
	zsh -c 'time ./pyston_prof $(ARGS) $<'
	gprof ./pyston_prof gmon.out > $(patsubst %,%.out,$@)
$(call make_search,prof_%)
profile_%: %.py pyston_profile
	time ./pyston_profile -p $(ARGS) $<
	gprof ./pyston_profile gmon.out > $(patsubst %,%.out,$@)
$(call make_search,profile_%)

# pprof-based profiling:
.PHONY: pprof_% pprof_release_%
pprof_%: %.py pyston_pprof
	CPUPROFILE_FREQUENCY=1000 CPUPROFILE=$@.out ./pyston_pprof -p $(ARGS) $<
	pprof --raw pyston_pprof $@.out > $@_raw.out
	python codegen/profiling/process_pprof.py $@_raw.out pprof.jit > $@_processed.out
	pprof --text $@_processed.out
	# rm -f pprof.out pprof.raw pprof.jit
$(call make_search,pprof_%)

# oprofile-based profiling:
.PHONY: oprof_% oprof_collect_% opreport
oprof_collect_%: %.py pyston_oprof
	sudo opcontrol --image pyston_oprof
	# sudo opcontrol --event CPU_CLK_UNHALTED:28000
	# sudo opcontrol --cpu-buffer-size=128000 --buffer-size=1048576 --buffer-watershed=1048000
	sudo opcontrol --reset
	sudo opcontrol --start
	time ./pyston_oprof -p $(ARGS) $<
	sudo opcontrol --stop
	sudo opcontrol --dump
	sudo opcontrol --image all --event default --cpu-buffer-size=0 --buffer-size=0 --buffer-watershed=0
	sudo opcontrol --deinit
	sudo opcontrol --init
oprof_%: oprof_collect_%
	$(MAKE) opreport
$(call make_search,oprof_%)
opreport:
	! [ -d oprofile_data ]
	opreport -l -t 0.2 -a pyston_oprof
	# opreport lib-image:pyston_oprof -l -t 0.2 -a | head -n 25

.PHONY: oprofcg_% oprof_collectcg_% opreportcg
oprof_collectcg_%: %.py pyston_oprof
	operf -g -e CPU_CLK_UNHALTED:90000 ./pyston_oprof -p $(ARGS) $<
oprofcg_%: oprof_collectcg_%
	$(MAKE) opreportcg
$(call make_search,oprofcg_%)
opreportcg:
	opreport lib-image:pyston_oprof -l -t 0.2 -a --callgraph

897
.PHONY: watch_% watch wdbg_%
Kevin Modzelewski's avatar
Kevin Modzelewski committed
898 899 900
watch_%:
	@ ( ulimit -t 60; ulimit -d $(MAK_MEM_KB); ulimit -v $(MAK_MEM_KB); \
		TARGET=$(dir $@)$(patsubst watch_%,%,$(notdir $@)); \
Kevin Modzelewski's avatar
Kevin Modzelewski committed
901
		clear; $(MAKE) $$TARGET $(WATCH_ARGS); true; \
Kevin Modzelewski's avatar
Kevin Modzelewski committed
902
		while inotifywait -q -e modify -e attrib -e move -e move_self -e create -e delete -e delete_self \
Kevin Modzelewski's avatar
Kevin Modzelewski committed
903
		Makefile $$(find .. \( -name '*.cpp' -o -name '*.h' -o -name '*.py' \) ); do clear; $(MAKE) $$TARGET $(WATCH_ARGS); done )
Kevin Modzelewski's avatar
Kevin Modzelewski committed
904 905
		# Makefile $$(find \( -name '*.cpp' -o -name '*.h' -o -name '*.py' \) -o -type d ); do clear; $(MAKE) $(patsubst watch_%,%,$@); done )
		# -r . ; do clear; $(MAKE) $(patsubst watch_%,%,$@); done
906
watch: watch_pyston_dbg
Kevin Modzelewski's avatar
Kevin Modzelewski committed
907 908
watch_vim:
	$(MAKE) watch WATCH_ARGS='COLOR=0 USE_DISTCC=0 -j1 2>&1 | tee compile.log'
Kevin Modzelewski's avatar
Kevin Modzelewski committed
909 910 911 912 913
wdbg_%:
	$(MAKE) $(patsubst wdbg_%,watch_dbg_%,$@) GDB_CMDS="--ex quit"

.PHONY: test_asm test_cpp_asm
test_asm:
914
	$(CLANGPP_EXE) $(TEST_DIR)/test.s -c -o test
Kevin Modzelewski's avatar
Kevin Modzelewski committed
915 916 917
	objdump -d test | less
	@ rm test
test_cpp_asm:
918
	$(CLANGPP_EXE) $(TEST_DIR)/test.cpp -o test -c -O3 -std=c++11
Kevin Modzelewski's avatar
Kevin Modzelewski committed
919 920 921
	# $(GPP) tests/test.cpp -o test -c -O3
	objdump -d test | less
	rm test
922
test_cpp_dwarf:
923
	$(CLANGPP_EXE) $(TEST_DIR)/test.cpp -o test -c -O3 -std=c++11 -g
924 925 926
	# $(GPP) tests/test.cpp -o test -c -O3
	objdump -W test | less
	rm test
927
test_cpp_ll:
928
	$(CLANGPP_EXE) $(TEST_DIR)/test.cpp -o test.ll -c -O3 -emit-llvm -S -std=c++11 -g
929 930
	less test.ll
	rm test.ll
Kevin Modzelewski's avatar
Kevin Modzelewski committed
931

932 933 934
TEST_EXT_MODULE_NAMES := basic_test descr_test

.PHONY: ext_pyston
935 936
ext_pyston: $(TEST_EXT_MODULE_NAMES:%=$(TEST_DIR)/test_extension/%.pyston.so)
$(TEST_DIR)/test_extension/%.pyston.so: $(TEST_DIR)/test_extension/%.o $(BUILD_SYSTEM_DEPS)
937
	$(CLANG_EXE) -shared $< -o $@ -g
938 939
$(TEST_DIR)/test_extension/%.o: $(TEST_DIR)/test_extension/%.c $(wildcard ./include/*.h) $(BUILD_SYSTEM_DEPS)
	$(CLANG_EXE) -O2 -fPIC -Wimplicit -I./include -c $< -o $@ -g
940

941
.PHONY: ext_python
942 943
ext_python: $(TEST_EXT_MODULE_NAMES:%=$(TEST_DIR)/test_extension/*.c)
	cd $(TEST_DIR)/test_extension; python setup.py build
944

945 946
$(FROM_CPYTHON_SRCS:.c=.o): %.o: %.c $(BUILD_SYSTEM_DEPS)
	$(ECHO) Compiling C file to $@
947
	$(VERB) $(CC) $(EXT_CFLAGS) -c $< -o $@ -g -MMD -MP -MF $(patsubst %.o,%.d,$@) -O0
948

949 950
$(FROM_CPYTHON_SRCS:.c=.release.o): %.release.o: %.c $(BUILD_SYSTEM_DEPS)
	$(ECHO) Compiling C file to $@
951
	$(VERB) $(CC) $(EXT_CFLAGS) -c $< -o $@ -g -MMD -MP -MF $(patsubst %.o,%.d,$@)
952 953 954 955

# These are necessary until we support unicode:
../lib_python/2.7_Modules/_sre.o: EXT_CFLAGS += -Wno-sometimes-uninitialized
../lib_python/2.7_Modules/_sre.release.o: EXT_CFLAGS += -Wno-sometimes-uninitialized