# Copyright 2005-2010 Intel Corporation.  All Rights Reserved.
#
# This file is part of Threading Building Blocks.
#
# Threading Building Blocks is free software; you can redistribute it
# and/or modify it under the terms of the GNU General Public License
# version 2 as published by the Free Software Foundation.
#
# Threading Building Blocks is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Threading Building Blocks; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#
# As a special exception, you may use this file as part of a free software
# library without restriction.  Specifically, if other files instantiate
# templates or use macros or inline functions from this file, or you compile
# this file and link it with other files to produce an executable, this
# file does not by itself cause the resulting executable to be covered by
# the GNU General Public License.  This exception does not however
# invalidate any other reasons why the executable file might be covered by
# the GNU General Public License.

# This file should be always located and called in $(tbb_root)/examples

# Usage:
#   make [all] [clean] [release] [debug] [test]
#      executes specified targets for all examples.
#   make {example's dir}/{target}
#      calls specified example with specified target.
#      For instance: make task/tree_sum/all

tbb_root?=..
BUILDING_PHASE:=0
include ../build/common.inc

#check, if tbb_root is not absolute path (the filter keeps only /* paths)
ifeq ($(filter /% $(SLASH)%, $(subst :, ,$(tbb_root)) ),)
    # also changes related variables like work_dir
    override tbb_root := $(CWD)$(SLASH)..
    export TBB30_INSTALL_DIR := $(tbb_root)
endif

ifeq ($(tbb_os),windows)
    ifeq ($(UNIXMODE),1)
        EXAMPLE_MAKEFILE = Makefile
        EXAMPLES = $(wildcard */*/$(EXAMPLE_MAKEFILE))
        ifeq ($(compiler),gcc)
            override CXXFLAGS += -Wl,--enable-auto-import
        endif
        export CPATH := $(CPATH);$(tbb_root)/include
        export LIBRARY_PATH := $(LIBRARY_PATH);$(work_dir)_release;$(work_dir)_debug
        export RM = cmd /C del /Q /F
    else
        EXAMPLE_MAKEFILE = Makefile.windows
        EXAMPLES = $(wildcard */*/$(EXAMPLE_MAKEFILE))
        EXAMPLE_MAKEFILE := $(if $(EXAMPLES),Makefile.windows,Makefile)
        export INCLUDE := $(tbb_root)$(SLASH)include;$(INCLUDE)
        export LIB := $(work_dir)_release;$(work_dir)_debug;$(LIB)
    endif
    work_dir := $(subst /,$(SLASH),$(work_dir))
    export PATH := $(work_dir)_release;$(work_dir)_debug;$(PATH)
    export TBB_ARCH_PLATFORM = $(arch)\$(runtime)
    export TBB_TARGET_ARCH = $(arch)
else
    EXAMPLE_MAKEFILE = Makefile
    EXAMPLES := $(wildcard */*/$(EXAMPLE_MAKEFILE))
    # platform-specific settings
    ifeq ($(arch),ia64)
        override CXXFLAGS += $(PIC_KEY)
    endif
    ifeq ($(compiler),gcc)
        ifeq ($(arch),intel64)
            override CXXFLAGS += -m64
        endif
        ifeq ($(arch),ia32)
            override CXXFLAGS += -m32
        endif
        ifeq ($(arch),ppc64)
            override CXXFLAGS += -m64
        endif
        ifeq ($(arch),ppc32)
            override CXXFLAGS += -m32
        endif
        ifeq ($(arch),sparc)
            override CXXFLAGS += -mcpu=v9 -m64
        endif
    endif
    ifeq ($(compiler),suncc)
        override CXXFLAGS += -I$(tbb_root)$(SLASH)include -library=stlport4 -M$(tbb_root)/build/suncc.map.pause -erroff=unassigned,attrskipunsup,badargtype2w,badbinaryopw,wbadasg,wvarhidemem,wbadinit
        ifeq ($(arch),intel64)
            override CXXFLAGS += -m64
        endif
        ifeq ($(arch),ia32)
            override CXXFLAGS += -m32
        endif
        ifeq ($(arch),sparc)
            override CXXFLAGS += -m64
        endif
    endif
    ifeq ($(tbb_os),macos)
        # GUI for examples does not support 64-bit platforms
        ifeq ($(arch),intel64)
            export UI=con
        endif
        ifeq ($(arch),ppc64)
            export UI=con
        endif
        export DYLD_LIBRARY_PATH := $(DYLD_LIBRARY_PATH):$(work_dir)_release:$(work_dir)_debug
    else
        export LD_LIBRARY_PATH := $(LD_LIBRARY_PATH):$(work_dir)_release:$(work_dir)_debug
    endif
    export LIBS
    export LIBRARY_PATH := $(LIBRARY_PATH):$(work_dir)_release:$(work_dir)_debug
    export CPATH := $(CPATH):$(tbb_root)/include
endif

COMMON_TARGETS := all clean release debug test
# list of directories of examples
EXAMPLES_DIRS := $(foreach T,$(EXAMPLES),$(dir $(T)))
# targets to explicitly call example have format: {example's dir}/{example's target}
EXAMPLES_TARGETS := $(foreach T,$(COMMON_TARGETS),$(addsuffix $(T),$(EXAMPLES_DIRS)))

.PHONY: $(COMMON_TARGETS) $(EXAMPLES_TARGETS)

.DEFAULT: all

# execute standard targets for all examples
$(COMMON_TARGETS):: % : $(addsuffix %,$(EXAMPLES_DIRS))

# proxy rule for calling appropriate example
$(EXAMPLES_TARGETS)::
	-$(MAKE) -C $(@D)  -f $(EXAMPLE_MAKEFILE) $(notdir $@) CXX="$(CPLUS)" CXXFLAGS="$(CXXFLAGS)"

printenv:
ifeq ($(tbb_os),windows)
	@cmd /C set PATH
	@cmd /C set LIB
	@cmd /C set INCLUDE
else
	@env | grep PATH
endif

