# The following variables will likely need to be modified, depending on where
# and how you built LLVM & Clang. They can be overridden in a command-line
# invocation of make, like:
#
#   make LLVM_SRC_PATH=<path> LLVM_BIN_PATH=<path> ...
#

# LLVM_SRC_PATH is the path to the root of the checked out source code. This
# directory should contain the configure script, the include/ and lib/
# directories of LLVM, Clang in tools/clang/, etc.
# Alternatively, if you're building vs. a binary download of LLVM, then
# LLVM_SRC_PATH can point to the main untarred directory.
LLVM_SRC_PATH ?= ../llvm

# LLVM_BIN_PATH is the directory where binaries are placed by the LLVM build
# process. It should contain the tools like opt, llc and clang. The default
# reflects a debug build with autotools (configure & make).
LLVM_BIN_PATH ?= $(shell readlink -e \
	../../out/llvm_i686_linux_work/Release+Asserts/bin)

HOST_ARCH ?= x86
ifeq ($(HOST_ARCH),x86_64)
  HOST_FLAGS = -m64
else
  ifeq ($(HOST_ARCH),x86)
    HOST_FLAGS = -m32
  endif
endif

$(info -----------------------------------------------)
$(info Using LLVM_SRC_PATH = $(LLVM_SRC_PATH))
$(info Using LLVM_BIN_PATH = $(LLVM_BIN_PATH))
$(info Using HOST_ARCH     = $(HOST_ARCH))
$(info -----------------------------------------------)

LLVM_CXXFLAGS := `$(LLVM_BIN_PATH)/llvm-config --cxxflags`
LLVM_LDFLAGS := `$(LLVM_BIN_PATH)/llvm-config --libs` \
                `$(LLVM_BIN_PATH)/llvm-config --ldflags`

# It's recommended that CXX matches the compiler you used to build LLVM itself.
OPTLEVEL := -O0
CXX := g++

CXXFLAGS := -Wall -Wextra -Werror -fno-rtti -fno-exceptions \
	$(OPTLEVEL) -g $(LLVM_CXXFLAGS) $(HOST_FLAGS) \
	-Wno-error=unused-parameter
LDFLAGS := $(HOST_FLAGS)

SRCS= \
	IceCfg.cpp \
	IceCfgNode.cpp \
	IceConverter.cpp \
	IceGlobalContext.cpp \
	IceInst.cpp \
	IceInstX8632.cpp \
	IceIntrinsics.cpp \
	IceLiveness.cpp \
	IceOperand.cpp \
	IceRegAlloc.cpp \
        IceRNG.cpp \
	IceTargetLowering.cpp \
	IceTargetLoweringX8632.cpp \
	IceTranslator.cpp \
	IceTypeConverter.cpp \
	IceTypes.cpp \
	llvm2ice.cpp \
	PNaClTranslator.cpp

OBJS=$(patsubst %.cpp, build/%.o, $(SRCS))

# Keep all the first target so it's the default.
all: llvm2ice

.PHONY: all

llvm2ice: $(OBJS)
	$(CXX) $(LDFLAGS) -o $@ $^ $(LLVM_LDFLAGS) -ldl

# TODO: Be more precise than "*.h" here and elsewhere.
$(OBJS): build/%.o: src/%.cpp src/*.h src/*.def
	$(CXX) -c $(CXXFLAGS) $< -o $@

$(OBJS): | build

build:
	@mkdir -p $@

check-lit: llvm2ice
	LLVM_BIN_PATH=$(LLVM_BIN_PATH) \
	$(LLVM_SRC_PATH)/utils/lit/lit.py -sv tests_lit

check: check-lit
	(cd crosstest; ./runtests.sh)

# TODO: Fix the use of wildcards.
# Assumes clang-format is within $PATH.
format:
	clang-format -style=LLVM -i src/*.h src/*.cpp

# Assumes clang-format-diff.py is within $PATH, and that the
# clang-format it calls is also within $PATH.  This may require adding
# a component to $PATH, or creating symlinks within some existing
# $PATH component.  Uses the one in /usr/lib/clang-format/ if it
# exists.
ifeq (,$(wildcard /usr/lib/clang-format/clang-format-diff.py))
  CLANG_FORMAT_DIFF = clang-format-diff.py
else
  CLANG_FORMAT_DIFF = /usr/lib/clang-format/clang-format-diff.py
endif
format-diff:
	git diff -U0 `git merge-base HEAD master` | \
	$(CLANG_FORMAT_DIFF) -p1 -style=LLVM -i

clean:
	rm -rf llvm2ice *.o build/
