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

#------------------------------------------------------------------------------
# Define rules for making the TBB shared library.
#------------------------------------------------------------------------------

tbb_root ?= "$(TBB30_INSTALL_DIR)"
BUILDING_PHASE=1
include $(tbb_root)/build/common.inc
DEBUG_SUFFIX=$(findstring _debug,_$(cfg))

#------------------------------------------------------------
# Define static pattern rules dealing with .cpp source files
#------------------------------------------------------------
$(warning CONFIG: cfg=$(cfg) arch=$(arch) compiler=$(compiler) os=$(tbb_os) runtime=$(runtime))

default_tbb: $(TBB.DLL)
.PHONY: default_tbb tbbvars clean
.PRECIOUS: %.$(OBJ)

VPATH = $(tbb_root)/src/tbb/$(ASSEMBLY_SOURCE) $(tbb_root)/src/tbb $(tbb_root)/src/old $(tbb_root)/src/rml/client

CPLUS_FLAGS += $(PIC_KEY) $(DEFINE_KEY)__TBB_BUILD=1

ifeq (1,$(TBB_NOSTRICT))
# GNU 3.2.3 headers have a ISO syntax that is rejected by Intel compiler in -strict_ansi mode.
# The Mac uses gcc, so the list is empty for that platform.
# The files below need the -strict_ansi flag downgraded to -ansi to compile

KNOWN_NOSTRICT = concurrent_hash_map.o \
	concurrent_queue.o \
	concurrent_vector_v2.o \
	concurrent_vector.o \
	task.o \
	task_group_context.o \
	governor.o \
	market.o \
	arena.o \
	scheduler.o \
	observer_proxy.o \
	tbb_main.o \
	task_v2.o

endif

# Object files (that were compiled from C++ code) that gmake up TBB
TBB_CPLUS.OBJ = concurrent_hash_map.$(OBJ) \
		concurrent_queue.$(OBJ) \
		concurrent_vector.$(OBJ) \
		dynamic_link.$(OBJ) \
		itt_notify.$(OBJ) \
		cache_aligned_allocator.$(OBJ) \
		pipeline.$(OBJ) \
		queuing_mutex.$(OBJ) \
		queuing_rw_mutex.$(OBJ) \
		reader_writer_lock.$(OBJ) \
		spin_rw_mutex.$(OBJ) \
		spin_mutex.$(OBJ) \
		critical_section.$(OBJ) \
		task.$(OBJ) \
		tbb_misc.$(OBJ) \
		mutex.$(OBJ) \
		recursive_mutex.$(OBJ) \
		condition_variable.$(OBJ) \
		tbb_thread.$(OBJ) \
		concurrent_monitor.$(OBJ) \
		private_server.$(OBJ) \
		rml_tbb.$(OBJ) \
		task_group_context.$(OBJ) \
		governor.$(OBJ) \
		market.$(OBJ) \
		arena.$(OBJ) \
		scheduler.$(OBJ) \
		observer_proxy.$(OBJ) \
		tbb_main.$(OBJ)

# OLD/Legacy object files for backward binary compatibility
ifeq (,$(findstring $(DEFINE_KEY)TBB_NO_LEGACY,$(CPLUS_FLAGS)))
TBB_CPLUS_OLD.OBJ = \
		concurrent_vector_v2.$(OBJ) \
		concurrent_queue_v2.$(OBJ) \
		spin_rw_mutex_v2.$(OBJ) \
		task_v2.$(OBJ)
endif

# Object files that gmake up TBB (TBB_ASM.OBJ is platform-specific)
TBB.OBJ = $(TBB_CPLUS.OBJ) $(TBB_CPLUS_OLD.OBJ) $(TBB_ASM.OBJ)

# Suppress superfluous warnings for TBB compilation
WARNING_KEY += $(WARNING_SUPPRESS)

include $(tbb_root)/build/common_rules.inc

ifneq (,$(TBB.DEF))
tbb.def: $(TBB.DEF)
	$(CMD) "$(CPLUS) $(PREPROC_ONLY) $(TBB.DEF) $(INCLUDES) $(CPLUS_FLAGS) >tbb.def 2>$(NUL) || exit 0"

LIB_LINK_FLAGS += $(EXPORT_KEY)tbb.def
$(TBB.DLL): tbb.def
endif

tbbvars.sh:
	$(MAKE_TBBVARS)

$(TBB.DLL): BUILDING_LIBRARY = $(TBB.DLL)
$(TBB.DLL): $(TBB.OBJ) $(TBB.RES) tbbvars.sh $(TBB_NO_VERSION.DLL)
#	$(LIB_LINK_CMD) $(LIB_OUTPUT_KEY)$(TBB.DLL) $(TBB.OBJ) $(TBB.RES) $(LIB_LINK_LIBS) $(LIB_LINK_FLAGS)
	$(AR) rcs libtbb.a $(TBB.OBJ)
	$(RANLIB) libtbb.a

ifneq (,$(TBB_NO_VERSION.DLL))
$(TBB_NO_VERSION.DLL):
	echo "INPUT ($(TBB.DLL))" > $(TBB_NO_VERSION.DLL)
endif

#clean:
#	$(RM) *.$(OBJ) *.$(DLL) *.res *.map *.ilk *.pdb *.exp *.manifest *.tmp *.d core core.*[0-9][0-9]

# Include automatically generated dependences
-include *.d
