# 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_x86_64_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)

# 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_64
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
CCACHE := `command -v ccache`
CXX := CCACHE_CPP2=yes $(CCACHE) $(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= \
	assembler.cpp \
	assembler_ia32.cpp \
	IceCfg.cpp \
	IceCfgNode.cpp \
	IceConverter.cpp \
	IceGlobalContext.cpp \
	IceInst.cpp \
	IceInstX8632.cpp \
	IceIntrinsics.cpp \
	IceLiveness.cpp \
	IceMemoryRegion.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/
