#!/usr/bin/make -f

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
SRC_VERSION := $(shell dpkg-parsechangelog | sed -ne 's/^Version: \(\([0-9]\+\):\)\?\(.*\)-.*/\3/p')

BUILDDIR := build
CXX_DEB_INST := $(CURDIR)/debian/cxx/
CXXABI_DEB_INST := $(CURDIR)/debian/abi/

ifneq (,$(filter parallel=%,$(subst $(COMMA), ,$(DEB_BUILD_OPTIONS))))
  NJOBS := -j $(subst parallel=,,$(filter parallel=%,$(subst $(COMMA), ,$(DEB_BUILD_OPTIONS))))
endif

CXXFLAGS := $(shell dpkg-buildflags --get CXXFLAGS) $(shell dpkg-buildflags --get CPPFLAGS)
# dpkg-buildflags prevents ::operator new global overloading if used for libc++
#LDFLAGS := $(shell dpkg-buildflags --get LDFLAGS)
LDFLAGS :=
DEB_HOST_ARCH       ?= $(shell dpkg-architecture -qDEB_HOST_ARCH)

EXCEPTIONS :=ON
# Exceptions don't seem to work on s390x. Exceptions disabled because I have
# no idea what ABI specifications tells about s390x exception handling.
ifneq (,$(filter $(DEB_HOST_ARCH),s390x))
EXCEPTIONS :=OFF
endif

CLANG_VERSION := 6.0
CMAKE ?= $(shell which cmake)

SHARED_CMAKE_OPTIONS := \
	-DCMAKE_INSTALL_PREFIX=/usr \
	-DLLVM_CONFIG_PATH=$(shell which llvm-config-$(CLANG_VERSION)) \
	-DCMAKE_BUILD_TYPE=RelWithDebInfo \
	-DCMAKE_AR=$(shell which llvm-ar-$(CLANG_VERSION)) \
	-DCMAKE_RANLIB=$(shell which llvm-ranlib-$(CLANG_VERSION)) \
	-DCMAKE_CXX_COMPILER=$(shell which clang++-$(CLANG_VERSION)) \
	-DCMAKE_C_COMPILER=$(shell which clang-$(CLANG_VERSION)) \
	-DCMAKE_CXX_FLAGS="$(CXXFLAGS)" \
	-DCMAKE_EXE_LINKER_FLAGS="$(LDFLAGS)" \
	-DCMAKE_SHARED_LINKER_FLAGS="$(LDFLAGS)" \
	-DCMAKE_MODULE_LINKER_FLAGS="$(LDFLAGS)" \
	-DLLVM_EXTERNAL_LIT=/usr/lib/llvm-$(CLANG_VERSION)/build/utils/lit/lit.py

CXXABI_CMAKE_OPTIONS := \
	-DLIBCXXABI_LIBCXX_PATH=$(abspath libcxx) \
	-DLIBCXXABI_LIBCXX_LIBRARY_PATH=$(abspath libcxx/$(BUILDDIR)/lib) \
	-DLIBCXXABI_ENABLE_EXCEPTIONS=$(EXCEPTIONS) \
	-DLLVM_ENABLE_RTTI=ON

CXX_CMAKE_OPTIONS := \
	-DLIBCXX_CXX_ABI=libcxxabi \
	-DLIBCXX_CXX_ABI_INCLUDE_PATHS=$(abspath libcxxabi/include) \
	-DLIBCXX_CXX_ABI_LIBRARY_PATH=$(abspath	libcxxabi/$(BUILDDIR)/lib) \
	-DLIBCXX_ENABLE_EXCEPTIONS=$(EXCEPTIONS) \
	-DLIBCXX_INSTALL_EXPERIMENTAL_LIBRARY=ON

%:
	dh $@

override_dh_auto_clean:
	rm -rf libcxxabi/$(BUILDDIR) libcxx/$(BUILDDIR) $(CXX_DEB_INST) $(CXXABI_DEB_INST)
	find -name *.pyc -delete

override_dh_auto_build:
	mkdir -p libcxxabi/$(BUILDDIR) && \
	cd libcxxabi/$(BUILDDIR) && \
		$(CMAKE) .. $(SHARED_CMAKE_OPTIONS) $(CXXABI_CMAKE_OPTIONS) && \
		make $(NJOBS) VERBOSE=1
	mkdir -p libcxx/$(BUILDDIR) && \
	cd libcxx/$(BUILDDIR) && \
		$(CMAKE) .. $(SHARED_CMAKE_OPTIONS) $(CXX_CMAKE_OPTIONS) && \
		make $(NJOBS) VERBOSE=1

override_dh_auto_install:
	make -C libcxxabi/$(BUILDDIR) install DESTDIR=$(CXXABI_DEB_INST)
	make -C libcxx/$(BUILDDIR) install DESTDIR=$(CXX_DEB_INST)
	mkdir -p $(CXXABI_DEB_INST)/usr/include/c++/v1/
	mv $(CXX_DEB_INST)/usr/include/c++/v1/*cxxabi*.h $(CXXABI_DEB_INST)/usr/include/c++/v1/

override_dh_install-arch:
	dh_install
	find debian/libc++-test -name *.pyc -delete
	find debian/libc++abi-test -name *.pyc -delete

# python is unstable on s390x
# Testsuite is failing on mips and others
TESTSUITE_ENABLE_ARCHS := i386 amd64 arm64
ifeq (,$(filter-out $(TESTSUITE_ENABLE_ARCHS), $(DEB_HOST_ARCH)))
ifeq (,$(filter nocheck,$(subst $(COMMA), ,$(DEB_BUILD_OPTIONS))))
override_dh_auto_test:
	-make -C libcxxabi/$(BUILDDIR) check-libcxxabi
	-make -C libcxx/$(BUILDDIR) check-libcxx
endif
endif

.PHONY: get-orig-source
get-orig-source:
	sh debian/libc++-get-orig-source.sh $(SRC_VERSION)
