#
# Copyright 2013 the V8 project authors. All rights reserved.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
#       copyright notice, this list of conditions and the following
#       disclaimer in the documentation and/or other materials provided
#       with the distribution.
#     * Neither the name of Google Inc. nor the names of its
#       contributors may be used to endorse or promote products derived
#       from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# Those definitions should be consistent with the main Makefile
NACL_ARCHES = nacl_ia32 nacl_x64
MODES = release debug

# Generates all combinations of NACL ARCHES and MODES,
# e.g. "nacl_ia32.release" or "nacl_x64.release"
NACL_BUILDS = $(foreach mode,$(MODES), \
                   $(addsuffix .$(mode),$(NACL_ARCHES)))

HOST_OS = $(shell uname -s | sed -e 's/Linux/linux/;s/Darwin/mac/')
ifeq ($(HOST_OS), linux)
  TOOLCHAIN_DIR = linux_x86_glibc
else
  ifeq ($(HOST_OS), mac)
    TOOLCHAIN_DIR = mac_x86_glibc
  else
    $(error Host platform "${HOST_OS}" is not supported)
  endif
endif

TOOLCHAIN_PATH = $(realpath ${NACL_SDK_ROOT}/toolchain)
NACL_TOOLCHAIN ?= ${TOOLCHAIN_PATH}/${TOOLCHAIN_DIR}

ifeq ($(ARCH), nacl_ia32)
  GYPENV = nacl_target_arch=nacl_ia32 v8_target_arch=arm v8_host_arch=ia32
  TOOLCHAIN_ARCH = x86-4.4
  NACL_CC = "$(NACL_TOOLCHAIN)/bin/i686-nacl-gcc"
  NACL_CXX = "$(NACL_TOOLCHAIN)/bin/i686-nacl-g++"
  NACL_LINK = "$(NACL_TOOLCHAIN)/bin/i686-nacl-g++"
else
  ifeq ($(ARCH), nacl_x64)
    GYPENV = nacl_target_arch=nacl_x64 v8_target_arch=arm v8_host_arch=ia32
    TOOLCHAIN_ARCH = x86-4.4
    NACL_CC = "$(NACL_TOOLCHAIN)/bin/x86_64-nacl-gcc"
    NACL_CXX = "$(NACL_TOOLCHAIN)/bin/x86_64-nacl-g++"
    NACL_LINK = "$(NACL_TOOLCHAIN)/bin/x86_64-nacl-g++"
  else
    $(error Target architecture "${ARCH}" is not supported)
  endif
endif

ifeq ($(wildcard $(NACL_TOOLCHAIN)),)
  $(error Cannot find Native Client toolchain in "${NACL_TOOLCHAIN}")
endif

# For mksnapshot host generation.
GYPENV += host_os=${HOST_OS}

# ICU doesn't support NaCl.
GYPENV += v8_enable_i18n_support=0

# Disable strict aliasing - v8 code often relies on undefined behavior of C++.
GYPENV += v8_no_strict_aliasing=1

NACL_MAKEFILES = $(addprefix $(OUTDIR)/Makefile.,$(NACL_BUILDS))
.SECONDEXPANSION:
# For some reason the $$(basename $$@) expansion didn't work here...
$(NACL_BUILDS): $(NACL_MAKEFILES)
	@$(MAKE) -C "$(OUTDIR)" -f Makefile.$@ \
	            CXX=${NACL_CXX} \
	            LINK=${NACL_LINK} \
	            BUILDTYPE=$(shell echo $(subst .,,$(suffix $@)) | \
	                        python -c "print raw_input().capitalize()") \
	            builddir="$(shell pwd)/$(OUTDIR)/$@"

# NACL GYP file generation targets.
$(NACL_MAKEFILES):
	GYP_GENERATORS=make \
	GYP_DEFINES="${GYPENV}" \
	CC=${NACL_CC} \
	CXX=${NACL_CXX} \
	PYTHONPATH="$(shell pwd)/tools/generate_shim_headers:$(PYTHONPATH)" \
	build/gyp/gyp --generator-output="${OUTDIR}" build/all.gyp \
	              -Ibuild/standalone.gypi --depth=. \
	              -S$(suffix $(basename $@))$(suffix $@) $(GYPFLAGS) \
                      -Dwno_array_bounds=-Wno-array-bounds
