# 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> \
#        LIBCXX_INSTALL_PATH=<path> CLANG_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)

# LIBCXX_INSTALL_PATH is the directory where libc++ is located. It should
# contain header files and corresponding libraries
LIBCXX_INSTALL_PATH ?= $(shell readlink -e \
	../../../toolchain/linux_x86/pnacl_newlib/host_x86_32)

# CLANG_PATH is the location of the clang compiler to use.
CLANG_PATH ?= $(shell readlink -e \
	../../../../third_party/llvm-build/Release+Asserts/bin)

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

$(info -----------------------------------------------)
$(info Using LLVM_SRC_PATH = $(LLVM_SRC_PATH))
$(info Using LLVM_BIN_PATH = $(LLVM_BIN_PATH))
$(info Using LIBCXX_INSTALL_PATH = $(LIBCXX_INSTALL_PATH))
$(info Using CLANG_PATH = $(CLANG_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 := $(CLANG_PATH)/clang++

CXXFLAGS := $(LLVM_CXXFLAGS) -Wall -Wextra -Werror -fno-rtti \
	-fno-exceptions $(OPTLEVEL) -g $(HOST_FLAGS) \
	-Wno-error=unused-parameter -I$(LIBCXX_INSTALL_PATH)/include/c++/v1
LDFLAGS := $(HOST_FLAGS) -L$(LIBCXX_INSTALL_PATH)/lib

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 \
               -Wl,-rpath=$(abspath $(LIBCXX_INSTALL_PATH)/lib)

# 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/
