#-------------------------------------------------------------------------#
#- Tecmake  (Windows Version)                                            -#
#- Generic Makefile to build applications and libraries at TeCGraf       -#
#- The user makefile usually has the name "config.mak".                  -#
#-------------------------------------------------------------------------#

#---------------------------------#
# Tecmake Version
VERSION = 4.21


#---------------------------------#
# First target
.PHONY: build
build: tecmake


#---------------------------------#
# Location of this file
TECMAKE  = $(TECMAKE_HOME)/tecmakewin.mak


#---------------------------------#
# System Variables Definitions

# If tecmake.bat is not used,
# then at least define main system variables.

WIN32UNAMES = vc16 vc15 vc14 vc12 vc11 vc10 vc9 vc8 vc7 vc6 owc1 bc55 bc56 bc6 gcc3 gcc4 gcc7 mingw3 mingw4 mingw6 dllw4 dllw6 dllg4 dllg7 dll dll7 dll8 dll9 dll10 dll11 dll12 dll14 dll15 dll16
WIN64UNAMES = vc16_64 vc15_64 vc14_64 vc12_64 vc11_64 vc10_64 vc9_64 vc8_64 dll8_64 dll9_64 dll10_64 dll11_64 dll12_64 dll14_64 dll15_64 dll16_64 gcc4_64 gcc7_64 mingw4_64 dllw4_64 mingw6_64 dllw6_64 dllg4_64 dllg7_64

ifdef TEC_UNAME
  ifneq ($(findstring $(TEC_UNAME), $(WIN32UNAMES)), )
    TEC_WIN32 = Yes
  else
    ifneq ($(findstring $(TEC_UNAME), $(WIN64UNAMES)), )
      TEC_WIN64 = Yes
    endif
  endif
endif

ifdef TEC_WIN64
  TEC_SYSNAME=Win64
  TEC_SYSARCH=x64
  # This is not working, because make from Cygwin returns x86 even when running in AMD64.
  ifeq ($(PROCESSOR_ARCHITECTURE), x86)
    # Define this if compiling for 64-bits in a 32bits environment
    #USE_X86_CL64=XXX
  endif
else
  TEC_SYSNAME=Win32
  TEC_SYSARCH=x86
endif


#---------------------------------#
# System Info
.PHONY: sysinfo
sysinfo:
	@echo ''; echo 'Tecmake: System Info'
	@echo 'TEC_SYSNAME = $(TEC_SYSNAME)'
	@echo 'TEC_SYSARCH = $(TEC_SYSARCH)'
	@echo 'TEC_UNAME = $(TEC_UNAME)'
	@echo 'TEC_CC = $(TEC_CC)'; echo ''


#---------------------------------#
# Known platforms

UNAMES = $(WIN32UNAMES) $(WIN64UNAMES)


#---------------------------------#
# Directories Definitions

PROJDIR = ..
SRCDIR  = .
OBJROOT = $(PROJDIR)/obj


# ---------------------------------------------------------
# Byte Order and Word Size

ifneq ($(findstring x86, $(TEC_SYSARCH)), )
   TEC_BYTEORDER = TEC_LITTLEENDIAN
else
ifeq ($(TEC_SYSARCH), arm)
   TEC_BYTEORDER = TEC_LITTLEENDIAN
else
   TEC_BYTEORDER = TEC_BIGENDIAN
endif
endif

ifeq ($(TEC_SYSARCH), x64)
  TEC_BYTEORDER = TEC_LITTLEENDIAN
  TEC_WORDSIZE = TEC_64
else
  TEC_WORDSIZE = TEC_32
endif

# Itanium Exception
ifeq ($(TEC_SYSARCH), ia64)
  TEC_BYTEORDER = TEC_LITTLEENDIAN
  TEC_WORDSIZE = TEC_64
endif


#---------------------------------#
# Tools

SHELL      = bash
SLASH      = slash_parser

# Packed Lua script
LUAPRE = "$(TECMAKE_PATH)"/luapre.lua


#---------------------------------#
# Defaults
APPTYPE = windows
INCLUDES =
LIBS =
LIB =


#---------------------------------#
# User Configuration File
# Everything before this point can be overwritten
# in the configuration file

MAKENAME = config.mak

ifdef MF
  MAKENAME = $(MF).mak
endif

###################
include $(MAKENAME)
###################


#---------------------------------#
# Definitions of public variables

ifdef LIBNAME
  TARGETNAME = $(LIBNAME)
  MAKETYPE = LIB
else
  TARGETNAME = $(APPNAME)
  MAKETYPE = APP
endif

ifndef TARGETNAME
  $(error LIBNAME nor APPNAME defined in $(MAKENAME))
endif

PROJNAME ?= $(TARGETNAME)

ifneq ($(PROJNAME), $(TARGETNAME))
  OBJROOT := $(OBJROOT)/$(TARGETNAME)
endif

ifneq ($(findstring dll, $(TEC_UNAME)), )
  ifneq ($(MAKETYPE), APP)
    MAKETYPE = DLL
    DEF_FILE ?= $(TARGETNAME).def
    DEF_FILE := $(SRCDIR)/$(DEF_FILE)
  endif
endif

DEPEND := $(TARGETNAME).wdep
ifdef DEPENDDIR
  DEPEND := $(DEPENDDIR)/$(TARGETNAME).wdep
endif


# ---------------------------------------------------------
# LO, LOH and LH folders

SRCLUADIR ?= $(SRCDIR)
ifdef NO_LUAOBJECT
  LHDIR  ?= $(SRCLUADIR)
else
  LOHDIR ?= $(SRCLUADIR)
endif

ifdef USE_LOH_SUBDIR
  ifeq ($(TEC_BYTEORDER), TEC_BIGENDIAN)
    ifeq ($(TEC_WORDSIZE), TEC_64)
      LOH_SUBDIR ?= be64
    else
      LOH_SUBDIR ?= be32
    endif
  else
    ifeq ($(TEC_WORDSIZE), TEC_64)
      # longs in 64-bits Windows are 32 bits!!!
      LOH_SUBDIR ?= le64w
    else
      LOH_SUBDIR ?= le32
    endif
  endif
  
  LOHDIR := $(LOHDIR)/$(LOH_SUBDIR)
  INCLUDES += $(LOHDIR)
else
  ifeq ($(TEC_BYTEORDER), TEC_BIGENDIAN)
    ifeq ($(TEC_WORDSIZE), TEC_64)
      LO_SUFFIX ?= _be64
    else
      LO_SUFFIX ?= _be32
    endif
  else
    ifeq ($(TEC_WORDSIZE), TEC_64)
      # longs in 64-bits Windows are 32 bits!!!
      LO_SUFFIX ?= _le64w
    else
      LO_SUFFIX ?=
    endif
  endif
endif

ifdef USE_LH_SUBDIR
  INCLUDES += $(LHDIR)
endif


#---------------------------------#
# Main Rule - Build Everything that it is necessary

.PHONY: tecmake
ifeq ($(MAKETYPE), APP)
  tecmake: print-start system-check directories application scripts
else
  ifeq ($(MAKETYPE), DLL)
    tecmake: print-start system-check directories dynamic-lib
  else
    tecmake: print-start system-check directories static-lib
  endif
endif

.PHONY: print-start
print-start:
	@echo ''; echo 'Tecmake: Starting [ $(TARGETNAME):$(TEC_UNAME) ]'


#---------------------------------#
# Definitions of public variables

ifeq ($(MAKETYPE), APP)
  TARGETROOT ?= $(PROJDIR)/bin
else
  TARGETROOT ?= $(PROJDIR)/lib
endif

ifeq ($(MAKETYPE), APP)
  TEC_UNAME_DIR ?= $(TEC_SYSNAME)
else
  TEC_UNAME_DIR ?= $(TEC_UNAME)
endif
TEC_UNAME_LIB_DIR ?= $(TEC_UNAME)

ifdef DBG
  OPT:=
  ifdef DBG_LIB_DIR
    TEC_UNAME_LIB_DIR := $(TEC_UNAME_LIB_DIR)d
  endif
  ifdef DBG_DIR
    TEC_UNAME_DIR := $(TEC_UNAME_DIR)d
  endif
endif

# Suffix for Lua modules
ifdef USE_LUA
  LIBLUA_SFX := 3
endif
ifdef USE_LUA4
  LIBLUA_SFX := 4
endif
ifdef USE_LUA5
  LIBLUA_SFX := 5
endif
ifdef USE_LUA50
  LIBLUA_SFX := 5
endif
ifdef USE_LUA51
  LIBLUA_SFX := 51
endif
ifdef USE_LUA52
  LIBLUA_SFX := 52
endif
ifdef USE_LUA53
  LIBLUA_SFX := 53
endif
ifdef USE_LUA54
  LIBLUA_SFX := 54
endif

ifdef USE_OLDLIBLUA
  TEC_UNAME_LIBLUA_DIR ?= $(TEC_UNAME_LIB_DIR)
else
  TEC_UNAME_LIBLUA_DIR ?= $(TEC_UNAME_LIB_DIR)/Lua$(LIBLUA_SFX)
endif

# Subfolder for Lua Modules
ifdef LUAMOD_DIR
  TEC_UNAME_DIR := $(TEC_UNAME_DIR)/Lua$(LIBLUA_SFX)
endif

OBJDIR := $(OBJROOT)/$(TEC_UNAME_DIR)
TARGETDIR := $(TARGETROOT)/$(TEC_UNAME_DIR)

TARGETEXE := $(TARGETDIR)/$(TARGETNAME).exe
TARGETDLL := $(TARGETDIR)/$(TARGETNAME).dll
TARGETLIB := $(TARGETDIR)/$(TARGETNAME).lib
ifneq ($(findstring gcc, $(TEC_UNAME)), )
  TARGETLIB := $(TARGETDIR)/lib$(TARGETNAME).a
endif
ifneq ($(findstring mingw, $(TEC_UNAME)), )
  TARGETLIB := $(TARGETDIR)/lib$(TARGETNAME).a
endif
ifneq ($(findstring dllg, $(TEC_UNAME)), )
  TARGETLIB := $(TARGETDIR)/lib$(TARGETNAME).dll.a
endif
ifneq ($(findstring dllw, $(TEC_UNAME)), )
  TARGETLIB := $(TARGETDIR)/lib$(TARGETNAME).a
endif

ifdef NO_ECHO
  ECHO:=@
endif

#---------------------------------#
# Platform/Compiler dependend parameters

STDDEFS = -DTEC_UNAME=$(TEC_UNAME) -DTEC_SYSNAME=$(TEC_SYSNAME) -D$(TEC_BYTEORDER) -D$(TEC_WORDSIZE) -DWIN32
STDLIB  = kernel32 user32 gdi32 winspool comdlg32 advapi32 shell32 uuid oleaut32 ole32 comctl32

#Compilers
VC6 ?= x:/lng/vc6
VC7 ?= x:/lng/vc7
VC8 ?= x:/lng/vc8
VC9 ?= x:/lng/vc9
VC10 ?= x:/lng/vc10
VC11 ?= x:/lng/vc11
VC12 ?= x:/lng/vc12
VC14 ?= x:/lng/vc14
VC15 ?= x:/lng/vc15
VC16 ?= x:/lng/vc16
OWC1 ?= x:/lng/owc1
BC55 ?= x:/lng/bc55
BC56 ?= x:/lng/cbuilderx
BC6  ?= x:/lng/bc6
MINGW3 ?= x:/lng/mingw3
MINGW4 ?= x:/lng/mingw4
MINGW4_64 ?= x:/lng/mingw4_64
MINGW6 ?= x:/lng/mingw6
MINGW6_64 ?= x:/lng/mingw6_64
# The default location is in the PATH
#GCC3 ?= x:/lng/gcc3
#GCC4 ?= x:/lng/gcc4

#Tools
QT ?= x:/lng/qt
ifdef USE_GTK3
  GTKSFX:=3
  GTK3 ?= x:/lng/gtk3
  GTK := $(GTK3)
else
  GTKSFX:=2
  GTK ?= x:/lng/gtk
endif

ifdef USE_IUPWEB
  override USE_ATL = Yes
endif

GLUT ?= x:/lng/glut
GLUT_LIB ?= $(GLUT)/lib
GLUT_INC ?= $(GLUT)/include

OBJEXT = obj
LIBEXT = lib

ifneq ($(findstring _64, $(TEC_UNAME)), )
  BUILD64 = Yes
endif

ifneq ($(findstring dll, $(TEC_UNAME)), )
  USE_DLL = Yes
endif

##########################################################################

ifeq "$(TEC_UNAME)" "vc6"
  COMPILER = $(VC6)
endif

ifeq "$(TEC_UNAME)" "vc7"
  COMPILER = $(VC7)
endif

ifeq "$(TEC_UNAME)" "vc8"
  COMPILER = $(VC8)
endif

ifeq "$(TEC_UNAME)" "vc8_64"
  COMPILER = $(VC8)
  SDKLIBBIN = /amd64
endif

ifneq ($(findstring vc9, $(TEC_UNAME)), )
  COMPILER = $(VC9)
endif

ifneq ($(findstring vc10, $(TEC_UNAME)), )
  COMPILER = $(VC10)
endif

ifneq ($(findstring vc11, $(TEC_UNAME)), )
  COMPILER = $(VC11)
endif

ifneq ($(findstring vc12, $(TEC_UNAME)), )
  COMPILER = $(VC12)
endif

ifneq ($(findstring vc14, $(TEC_UNAME)), )
  COMPILER = $(VC14)
endif

ifneq ($(findstring vc15, $(TEC_UNAME)), )
  COMPILER = $(VC15)
endif

ifneq ($(findstring vc16, $(TEC_UNAME)), )
  COMPILER = $(VC16)
endif

ifeq "$(TEC_UNAME)" "dll"
  COMPILER = $(VC6)
endif

ifeq "$(TEC_UNAME)" "dll7"
  COMPILER = $(VC7)
endif

ifeq "$(TEC_UNAME)" "dll8"
  COMPILER = $(VC8)
  ifdef DBG
    #debug info not working for dll8 linker
    define DBG
    endef
  endif
endif

ifeq "$(TEC_UNAME)" "dll8_64"
  COMPILER = $(VC8)
  SDKLIBBIN = /amd64
endif

ifneq ($(findstring dll9, $(TEC_UNAME)), )
  COMPILER = $(VC9)
endif

ifneq ($(findstring dll10, $(TEC_UNAME)), )
  COMPILER = $(VC10)
endif

ifneq ($(findstring dll11, $(TEC_UNAME)), )
  COMPILER = $(VC11)
endif

ifneq ($(findstring dll12, $(TEC_UNAME)), )
  COMPILER = $(VC12)
endif

ifneq ($(findstring dll14, $(TEC_UNAME)), )
  COMPILER = $(VC14)
endif

ifneq ($(findstring dll15, $(TEC_UNAME)), )
  COMPILER = $(VC15)
endif

ifneq ($(findstring dll16, $(TEC_UNAME)), )
  COMPILER = $(VC16)
endif
ifeq "$(COMPILER)" "$(VC6)"
  TEC_CC = vc
  # Use the VC7 Platform SDK, no harm if VC7 is not installed
  PLATSDK ?= $(VC7)/PlatformSDK
  OLD_OPENGL = Yes
endif

ifeq "$(COMPILER)" "$(VC7)"
  TEC_CC = vc
  PLATSDK ?= $(VC7)/PlatformSDK
  OLD_OPENGL = Yes
endif

ifeq "$(COMPILER)" "$(VC8)"
  NEW_VC_COMPILER = Yes
  TEC_CC = vc
  STDDEFS += -DMSVC8
  PLATSDK ?= $(VC8)/PlatformSDK
  OLD_OPENGL = Yes
  ifdef USE_DLL
    GEN_MANIFEST ?= Yes
  else
    #there is no single thread RTL in VC8
    USE_MT = Yes
  endif
endif

ifeq "$(COMPILER)" "$(VC9)"
  NEW_VC_COMPILER = Yes
  TEC_CC = vc
  STDDEFS += -DMSVC9
  ifdef USE_DLL
    GEN_MANIFEST ?= Yes
  else
    #there is no single thread RTL in VC9
    USE_MT = Yes
  endif
  ifdef VC9SDK
    PLATSDK ?= $(VC9SDK)
  else
    # Not the real folder, we copied from "C:\Program Files\Microsoft SDKs\Windows\v6.0A"
    PLATSDK ?= $(VC9)/WinSDK
  endif
  RESBIN := $(PLATSDK)/bin
  ifdef BUILD64
    RESBIN := $(RESBIN)/x64
  endif
endif

ifeq "$(COMPILER)" "$(VC10)"
  NEW_VC_COMPILER = Yes
  TEC_CC = vc
  STDDEFS += -DMSVC10
  ifndef USE_DLL
    #there is no single thread RTL in VC10
    USE_MT = Yes
  endif
  ifdef VC10SDK
    PLATSDK ?= $(VC10SDK)
  else
    # Not the real folder, we copied from "C:\Program Files\Microsoft SDKs\Windows\v7.1"
    PLATSDK ?= $(VC10)/WinSDK
  endif
  RESBIN := $(PLATSDK)/bin
  ifdef BUILD64
    RESBIN := $(RESBIN)/x64
  endif
endif

ifeq "$(COMPILER)" "$(VC11)"
  NEW_VC_COMPILER = Yes
  NEW_SDK_UM = Yes
  TEC_CC = vc
  STDDEFS += -DMSVC11
  ifndef USE_DLL
    #there is no single thread RTL in VC11
    USE_MT = Yes
  endif
  ifdef VC11SDK
    PLATSDK ?= $(VC11SDK)
  else
    # Not the real folder, we copied from "C:\Program Files (x86)\Windows Kits\8.0"
    PLATSDK ?= $(VC11)/WinSDK
  endif
  ifdef BUILD64
    SDKLIBBIN := x64
  else
    SDKLIBBIN := x86
  endif
  RESBIN := $(PLATSDK)/bin/$(SDKLIBBIN)
  WINSDKVERNUM := win8
  PLATSDK_INC := $(PLATSDK)/include/shared $(PLATSDK)/include/um 
  PLATSDK_LIB := $(PLATSDK)/lib/$(WINSDKVERNUM)/um/$(SDKLIBBIN)
endif

ifeq "$(COMPILER)" "$(VC12)"
  NEW_VC_COMPILER = Yes
  NEW_SDK_UM = Yes
  TEC_CC = vc
  STDDEFS += -DMSVC12
  ifndef USE_DLL
    #there is no single thread RTL in VC12
    USE_MT = Yes
  endif
  ifdef VC12SDK
    PLATSDK ?= $(VC12SDK)
  else
    # Not the real folder, we copied from "C:\Program Files (x86)\Windows Kits\8.1"
    PLATSDK ?= $(VC12)/WinSDK
  endif
  ifdef BUILD64
    SDKLIBBIN := x64
  else
    SDKLIBBIN := x86
  endif
  RESBIN := $(PLATSDK)/bin/$(SDKLIBBIN)
  WINSDKVERNUM := winv6.3
  PLATSDK_INC := $(PLATSDK)/include/shared $(PLATSDK)/include/um 
  PLATSDK_LIB := $(PLATSDK)/lib/$(WINSDKVERNUM)/um/$(SDKLIBBIN)
endif

ifeq "$(COMPILER)" "$(VC14)"
  NEW_VC_COMPILER = Yes
  NEW_SDK_UM = Yes
  TEC_CC = vc
  STDDEFS += -DMSVC14
  ifndef USE_DLL
    #there is no single thread RTL in VC14
    USE_MT = Yes
  endif
  ifdef VC14SDK
    PLATSDK ?= $(VC14SDK)
  else
    # Not the real folder, we copied from "C:\Program Files (x86)\Windows Kits\10"
    PLATSDK ?= $(VC14)/WinSDK
  endif
  ifdef BUILD64
    SDKLIBBIN := x64
  else
    SDKLIBBIN := x86
  endif
  RESBIN := $(PLATSDK)/bin/$(SDKLIBBIN)
  WINSDKVERNUM ?= 10.0.10240.0
  WINSDKBASEINC := $(PLATSDK)/include/$(WINSDKVERNUM)
  WINSDKBASELIB := $(PLATSDK)/lib/$(WINSDKVERNUM)
  PLATSDK_INC := $(WINSDKBASEINC)/ucrt $(WINSDKBASEINC)/shared $(WINSDKBASEINC)/um
  PLATSDK_LIB := $(WINSDKBASELIB)/ucrt/$(SDKLIBBIN) $(WINSDKBASELIB)/um/$(SDKLIBBIN)
endif

ifeq "$(COMPILER)" "$(VC15)"
  NEW_VC_COMPILER = Yes
  NEW_SDK_UM = Yes
  NEW_VC_PATH = Yes
  TEC_CC = vc
  STDDEFS += -DMSVC15
  ifndef USE_DLL
    #there is no single thread RTL in VC15
    USE_MT = Yes
  endif
  ifdef VC15SDK
    PLATSDK ?= $(VC15SDK)
  else
    # Not the real folder, we copied from "C:\Program Files (x86)\Windows Kits\10"
    PLATSDK ?= $(VC15)/WinSDK
  endif
  ifdef BUILD64
    SDKLIBBIN := x64
  else
    SDKLIBBIN := x86
  endif
  WINSDKVERNUM ?= 10.0.17134.0
  RESBIN := $(PLATSDK)/bin/$(WINSDKVERNUM)/$(SDKLIBBIN)
  WINSDKBASEINC := $(PLATSDK)/include/$(WINSDKVERNUM)
  WINSDKBASELIB := $(PLATSDK)/lib/$(WINSDKVERNUM)
  PLATSDK_INC := $(WINSDKBASEINC)/ucrt $(WINSDKBASEINC)/shared $(WINSDKBASEINC)/um
  PLATSDK_LIB := $(WINSDKBASELIB)/ucrt/$(SDKLIBBIN) $(WINSDKBASELIB)/um/$(SDKLIBBIN)
endif

ifeq "$(COMPILER)" "$(VC16)"
  NEW_VC_COMPILER = Yes
  NEW_SDK_UM = Yes
  NEW_VC_PATH = Yes
  TEC_CC = vc
  STDDEFS += -DMSVC16
  ifndef USE_DLL
    #there is no single thread RTL in VC16
    USE_MT = Yes
  endif
  ifdef VC16SDK
    PLATSDK ?= $(VC16SDK)
  else
    # Not the real folder, we copied from "C:\Program Files (x86)\Windows Kits\10"
    PLATSDK ?= $(VC16)/WinSDK
  endif
  ifdef BUILD64
    SDKLIBBIN := x64
  else
    SDKLIBBIN := x86
  endif
  WINSDKVERNUM ?= 10.0.18362.0
  RESBIN := $(PLATSDK)/bin/$(WINSDKVERNUM)/$(SDKLIBBIN)
  WINSDKBASEINC := $(PLATSDK)/include/$(WINSDKVERNUM)
  WINSDKBASELIB := $(PLATSDK)/lib/$(WINSDKVERNUM)
  PLATSDK_INC := $(WINSDKBASEINC)/ucrt $(WINSDKBASEINC)/shared $(WINSDKBASEINC)/um
  PLATSDK_LIB := $(WINSDKBASELIB)/ucrt/$(SDKLIBBIN) $(WINSDKBASELIB)/um/$(SDKLIBBIN)
endif

ifeq "$(TEC_CC)" "vc"
  ifdef BUILD64
    STDDEFS += -DWIN64
    MACHINE = X64
    GTK := $(GTK)_x64
    ifdef NEW_VC_PATH
      VCLIBBIN = /x64
    else
      VCLIBBIN = /amd64
    endif
    ifdef USE_X86_CL64
      # Compiling for 64-bits in a 32bits environment
      ifdef NEW_VC_PATH
        BIN = $(COMPILER)/bin/Hostx86/x64
      else
        BIN = $(COMPILER)/bin/x86_amd64
      endif
    else
      ifdef NEW_VC_PATH
        BIN = $(COMPILER)/bin/Hostx64/x64
      else
        BIN = $(COMPILER)/bin/amd64
      endif
    endif
  else
    MACHINE = X86
    ifdef NEW_VC_PATH
      VCLIBBIN = /x86 
      BIN = $(COMPILER)/bin/Hostx86/x86
    else
      VCLIBBIN =
      BIN = $(COMPILER)/bin
    endif
  endif
  RESBIN ?= $(COMPILER)/bin
  CC        = $(BIN)/cl -nologo
  CPPC      = $(BIN)/cl -nologo
  LIBC      = $(BIN)/link -lib -nologo
  LINKER    = $(BIN)/link -nologo
  MT        = $(RESBIN)/mt -nologo
  RCC       = $(RESBIN)/rc -fo
  ifndef NEW_SDK_UM
    ifdef BUILD64
      SDKLIBBIN := /x64
    else
      SDKLIBBIN :=
    endif
    PLATSDK_LIB = $(PLATSDK)/lib$(SDKLIBBIN)
    PLATSDK_INC = $(PLATSDK)/include
  endif
  STDINCS = $(PLATSDK_INC) $(COMPILER)/include 
  STDFLAGS  = -c -Fo$(OBJDIR)/ -W3
  STDLFLAGS =
  DEPDEFS   = -D_WIN32 -D_M_IX86 -D_STDCALL_SUPPORTED
  STDLIBDIR = $(PLATSDK_LIB) $(COMPILER)/lib$(VCLIBBIN) 
  OPTFLAGS := -O2
  DEBUGFLAGS := -Z7 -Od -GZ
  ifdef USE_ATL
    STDINCS += $(COMPILER)/atlmfc/include
    STDLIBDIR += $(COMPILER)/atlmfc/lib$(VCLIBBIN)
  endif
  STDLIBDIR := $(addprefix -LIBPATH:, $(STDLIBDIR))
  ifdef NEW_VC_COMPILER
    DEBUGFLAGS := -Z7 -Od -RTC1
    STDDEFS += -D_CRT_SECURE_NO_DEPRECATE
    ifndef CPP_NARROW_INLINES
      STDDEFS += -D_CPP_NARROW_INLINES_DEFINED
    endif
    ifdef USE_CLR
      STDFLAGS += -clr
    else
      STDFLAGS += -EHsc
    endif
    ifdef USE_OPENMP
      STDFLAGS += -openmp
      LIBS += vcomp
    endif
  else                  # Exception Handling Model
    STDFLAGS += -GX
  endif
  ifneq ($(MAKETYPE), LIB)
    ifeq "$(COMPILER)" "$(VC6)"
      STDLFLAGS += -pdb:none -incremental:no -machine:$(MACHINE)
    else
      STDLFLAGS += -incremental:no -machine:$(MACHINE)
    endif
    ifdef DBG
      STDLFLAGS += -debug
    endif
    ifdef NEW_VC_COMPILER
      ifndef GEN_MANIFEST
        STDLFLAGS += -MANIFEST:NO
      else
        ifeq ($(GEN_MANIFEST), No)
          STDLFLAGS += -MANIFEST:NO
        else
          STDLFLAGS += -MANIFEST
        endif
      endif
    endif
  endif
  ifeq ($(MAKETYPE), APP)
    ifeq "$(COMPILER)" "$(VC6)"
      STDFLAGS += -GA
    else
      OPTFLAGS += -GL
      ifdef OPT
        STDLFLAGS += -LTCG
      endif
    endif
    STDLFLAGS += -subsystem:$(APPTYPE) -out:$(TARGETEXE)
  else
    ifeq ($(MAKETYPE), DLL)
      ifeq "$(COMPILER)" "$(VC6)"
        STDFLAGS += -GD
      else
        OPTFLAGS += -GL
        ifdef OPT
          STDLFLAGS += -LTCG
        endif
      endif
      STDLFLAGS += -dll -subsystem:$(APPTYPE) -out:$(TARGETDLL) -implib:$(TARGETLIB) -def:$(DEF_FILE)
    else
      STDLFLAGS += -out:$(TARGETLIB)
    endif
  endif
  ifdef USE_DLL
    ifdef DBG
      STDFLAGS += -MDd
    else
      STDFLAGS += -MD
    endif
  else
    ifdef USE_MT
      ifdef DBG
        STDFLAGS += -MTd
      else
        STDFLAGS += -MT
      endif
    else
      ifdef DBG
        STDFLAGS += -MLd
      else
        STDFLAGS += -ML
      endif
    endif
  endif
endif

##########################################################################

ifeq "$(TEC_UNAME)" "owc1"
  COMPILER = $(OWC1)
  TEC_CC  = wc
  STDLFLAGS =
endif

ifeq "$(TEC_CC)" "wc"
  WIN_OTHER = YES
  BIN     = $(COMPILER)/binnt
  CC      = $(SLASH) $(BIN)/wcc386
  CPPC    = $(SLASH) $(BIN)/wpp386
  LIBC    = $(SLASH) $(BIN)/wlib
  LINKER  = $(SLASH) $(BIN)/wlink
  RCC     = $(SLASH) $(BIN)/rc -fo
  STDINCS = $(COMPILER)/h $(COMPILER)/h/nt
  STDFLAGS += -od -w4 -5r -bt=nt -mf -e25 -zq -fo$(OBJDIR)/
  STDLIBDIR = LIBP $(COMPILER)/lib386 LIBP $(COMPILER)/lib386/nt
  DEBUGFLAGS := -d2
  OPTFLAGS := -ot
  ifeq ($(MAKETYPE), APP)
    STDLFLAGS = OP maxe=25 OP quiet FORM windows nt NAME $(TARGETEXE)
    ifeq ($(APPTYPE), console)
      STDLFLAGS += RU con
    endif
  else
    STDLFLAGS += -b -c -n -q -p=512 $(TARGETLIB)
  endif
  ifdef USE_DLL
    STDFLAGS += -bm -br
  endif
endif

##########################################################################

ifeq "$(TEC_UNAME)" "bc55"
  COMPILER = $(BC55)
  TEC_CC  = bc
  OLD_OPENGL = Yes
endif

ifeq "$(TEC_UNAME)" "bc56"
  COMPILER = $(BC56)
  TEC_CC  = bc
  OLD_OPENGL = Yes
endif

ifeq "$(TEC_UNAME)" "bc6"
  COMPILER = $(BC6)
  TEC_CC  = bc
  OLD_OPENGL = Yes
endif

ifeq "$(TEC_CC)" "bc"
  WIN_OTHER = YES
  TEC_CC   = bc
  BIN      = $(COMPILER)/bin
  CC       = $(BIN)/bcc32
  CPPC     = $(BIN)/bcc32
  LIBC     = $(BIN)/tlib /P32
  RCC      = $(BIN)/brc32 -r -fo
  LINKER   = $(SLASH) $(BIN)/ilink32
  STDINCS  = $(COMPILER)/include $(COMPILER)/include/dinkumware
  STDLIBDIR = -L$(COMPILER)/lib -L$(COMPILER)/lib/PSDK
  STDFLAGS  = -c -n$(OBJDIR)/
  STDLIB    := cw32 import32 $(STDLIB)
  ifeq ($(MAKETYPE), APP)
    STDLFLAGS = -Tpe #-x -c -Gn
    ifeq ($(APPTYPE), console)
      STARTUP = c0x32.obj
      STDLFLAGS += -ap
    else
      STARTUP = c0w32.obj
      STDLFLAGS += -aa
    endif
  else
    STDLFLAGS = $(TARGETLIB)
  endif
  OPTFLAGS := -O2
  DEBUGFLAGS := -v -x -xp
  ifdef USE_DLL
    STDFLAGS += -tWDMR
  endif
endif

##########################################################################

ifneq ($(findstring gcc, $(TEC_UNAME)), )
  TEC_CC = gcc
endif

ifneq ($(findstring mingw, $(TEC_UNAME)), )
  TEC_CC = gcc
endif

ifeq "$(TEC_UNAME)" "gcc3"
  COMPILER = $(GCC3)
  ifdef USE_OPENGL
    STDDEFS += -DUSE_OPENGL32
  endif
endif

ifeq "$(TEC_UNAME)" "mingw3"
  COMPILER = $(MINGW3)
  OLD_OPENGL = Yes
endif

ifneq ($(findstring gcc4, $(TEC_UNAME)), )
  COMPILER = $(GCC4)
endif

ifneq ($(findstring gcc7, $(TEC_UNAME)), )
  COMPILER = $(GCC7)
endif

ifeq "$(TEC_UNAME)" "mingw4"
  COMPILER = $(MINGW4)
  OLD_OPENGL = Yes
endif

ifeq "$(TEC_UNAME)" "mingw4_64"
  COMPILER = $(MINGW4_64)
  BUILD64 = Yes
endif

ifeq "$(TEC_UNAME)" "mingw6"
  COMPILER = $(MINGW6)
endif

ifeq "$(TEC_UNAME)" "mingw6_64"
  COMPILER = $(MINGW6_64)
  BUILD64 = Yes
endif

ifneq ($(findstring dllg4, $(TEC_UNAME)), )
  COMPILER = $(GCC4)
  TEC_CC = gcc
endif

ifneq ($(findstring dllg7, $(TEC_UNAME)), )
  COMPILER = $(GCC7)
  TEC_CC = gcc
endif

ifeq "$(TEC_UNAME)" "dllw4"
  COMPILER = $(MINGW4)
  TEC_CC = gcc
  OLD_OPENGL = Yes
endif

ifeq "$(TEC_UNAME)" "dllw4_64"
  COMPILER = $(MINGW4_64)
  TEC_CC = gcc
  BUILD64 = Yes
endif

ifeq "$(TEC_UNAME)" "dllw6"
  COMPILER = $(MINGW6)
  TEC_CC = gcc
endif

ifeq "$(TEC_UNAME)" "dllw6_64"
  COMPILER = $(MINGW6_64)
  TEC_CC = gcc
  BUILD64 = Yes
endif

ifeq "$(COMPILER)" "$(GCC4)"
  ifdef USE_OPENGL
    STDDEFS += -DUSE_OPENGL32
  endif
endif

ifeq "$(COMPILER)" "$(GCC7)"
  ifdef USE_OPENGL
    STDDEFS += -DUSE_OPENGL32
  endif
endif

ifeq "$(TEC_CC)" "gcc"
  WIN_OTHER = YES
  ifneq ($(findstring w4, $(TEC_UNAME)), )
    WIN_OTHER :=
  endif
  ifneq ($(findstring w6, $(TEC_UNAME)), )
    WIN_OTHER :=
  endif
  ifdef BUILD64
    STDDEFS += -DWIN64
    GTK := $(GTK)_x64
  endif
  ifneq "$(findstring mingw, $(COMPILER))" ""
    BIN   = $(COMPILER)/bin/
  endif
  CC      = $(BIN)gcc
  CPPC    = $(BIN)g++
  LIBC    = $(BIN)ar
  RCC     = $(BIN)windres -O coff -o
  ifndef LINKER
    ifneq "$(findstring .cpp, $(SRC))" ""
      LINKER := $(CPPC)
    else
      LINKER := $(CC)
    endif
  endif
  RANLIB  = $(BIN)ranlib
  ifneq "$(findstring mingw, $(COMPILER))" ""
    STDINCS = $(COMPILER)/include
    STDLIBDIR = -L$(COMPILER)/lib
  endif
  STDFLAGS += -Wall
  DEBUGFLAGS := -g
  OPTFLAGS := -O2
  OBJEXT=o
  LIBEXT=a
  ifdef USE_OPENMP
    STDFLAGS += -fopenmp
    LIBS += gomp
  endif
  ifdef USE_CPP11
    STDFLAGS += -std=c++11
  endif
  ifeq ($(MAKETYPE), APP)
    STDLFLAGS = -Wl,-subsystem,$(APPTYPE)
  else
    ifeq ($(MAKETYPE), DLL)
      ifneq ($(findstring w4, $(TEC_UNAME)), )
        STDLFLAGS = -static-libgcc
        ifneq "$(findstring .cpp, $(SRC))" ""
          STDLFLAGS += -static-libstdc++
        endif
      else
        ifneq ($(findstring w6, $(TEC_UNAME)), )
          STDLFLAGS = -static-libgcc
          ifneq "$(findstring .cpp, $(SRC))" ""
            STDLFLAGS += -static-libstdc++
          endif
        else
          STDLFLAGS =
        endif
      endif
    else
      STDLFLAGS = r
    endif
  endif
endif

##########################################################################

ifdef DBG
  STDFLAGS += $(DEBUGFLAGS)
  STDDEFS += -DDEBUG
else
  STDDEFS += -DNDEBUG
  ifdef OPT
    STDFLAGS += $(OPTFLAGS)
  endif
endif

# allows an extra configuration file.
ifdef EXTRA_CONFIG
include $(EXTRA_CONFIG)
endif

.PHONY: system-check
system-check:
  ifndef TEC_UNAME
			@echo ''; echo 'Tecmake: check failed, TEC_UNAME not defined.'; echo '';
			@exit 1;
  endif
  ifndef TEC_WIN32
    ifndef TEC_WIN64
			@echo ''; echo 'Tecmake: check failed, TEC_UNAME not recognized.'; echo '';
			@exit 1;
    endif
  endif
  ifdef CHECK_GDIPLUS
    ifdef WIN_OTHER
			@echo ''; echo 'Tecmake: check failed, GDI+ NOT available in this system.'; echo '';
			@exit 1;
    endif
  endif


#---------------------------------#
# Tecgraf Libraries Location
TECTOOLS_HOME ?= ../..

IUP   ?= $(TECTOOLS_HOME)/iup
CD    ?= $(TECTOOLS_HOME)/cd
IM    ?= $(TECTOOLS_HOME)/im
LUA   ?= $(TECTOOLS_HOME)/lua
LUA51 ?= $(TECTOOLS_HOME)/lua5.1
LUA52 ?= $(TECTOOLS_HOME)/lua52
LUA53 ?= $(TECTOOLS_HOME)/lua53
LUA54 ?= $(TECTOOLS_HOME)/lua54
ZLIB  ?= $(TECTOOLS_HOME)/zlib
FREETYPE ?= $(TECTOOLS_HOME)/freetype
FTGL     ?= $(TECTOOLS_HOME)/ftgl


#---------------------------------#
#  Pre-defined libraries

# Library order:
#   user + iupcd + cd + iup + motif + X
# Library path order is reversed

ifdef USE_LUA
  LUA_SFX :=
endif

ifdef USE_LUA4
  LUA_SFX := 4
  override USE_LUA = Yes
  LUA := $(LUA4)
endif

ifdef USE_LUA5
  LUA_SFX := 5
  override USE_LUA = Yes
  LUA := $(LUA5)
endif

ifdef USE_LUA50
  LUA_SFX := 50
  override USE_LUA = Yes
  LUA := $(LUA50)
  NO_LUALIB := Yes
endif

ifdef USE_LUA51
  LUA_SFX := 5.1
  override USE_LUA = Yes
  LUA := $(LUA51)
  NO_LUALIB := Yes
endif

ifdef USE_LUA52
  LUA_SFX := 52
  override USE_LUA = Yes
  LUA := $(LUA52)
  NO_LUALIB := Yes
endif

ifdef USE_LUA53
  LUA_SFX := 53
  override USE_LUA = Yes
  LUA := $(LUA53)
  NO_LUALIB := Yes
endif

ifdef USE_LUA54
  LUA_SFX := 54
  override USE_LUA = Yes
  LUA := $(LUA54)
  NO_LUALIB := Yes
endif

ifdef LUA_SUFFIX
  LUA_SFX := $(LUA_SUFFIX)
endif

ifdef USE_IUP
  override USE_IUP3 = Yes
endif
ifdef USE_IUP3
  override USE_IUP = Yes
endif

ifdef USE_IUP2
  override USE_IUP = Yes
  IUP := $(IUP)2
endif

ifdef USE_IUPBETA
  IUP := $(IUP)/beta
endif

ifdef USE_CDBETA
  CD := $(CD)/beta
endif

ifdef USE_IMBETA
  IM := $(IM)/beta
endif

ifdef USE_GLUT
  override USE_OPENGL = Yes
  LIBS += glut32
  LDIR += $(GLUT_INC)
  STDINCS += $(GLUT_LIB)
endif

ifdef USE_GDK
  override USE_GTK = Yes
endif

ifdef USE_IUPCONTROLS
  override USE_CD = Yes
  override USE_IUP = Yes
  ifdef USE_IUPLUA
    LIBS += iupluacontrols$(LIBLUA_SFX)
    override USE_CDLUA = Yes
  endif
  LIBS += iupcontrols
endif

ifdef USE_IUPGLCONTROLS
  override USE_OPENGL = Yes
  override USE_IUP = Yes
  override LINK_FTGL = Yes
  ifdef USE_IUPLUA
    LIBS += iupluaglcontrols$(LIBLUA_SFX)
  endif
  LIBS += iupglcontrols
endif

ifdef USE_IUPWEB
  override USE_IUP = Yes
  ifdef USE_IUPLUA
    LIBS += iupluaweb$(LIBLUA_SFX)
  endif
  LIBS += iupweb iupole comsuppw
endif

ifdef USE_IMLUA
  override USE_IM = Yes
  LIBS += imlua$(LIBLUA_SFX)
  IMLUA_LIB ?= $(IM)/lib/$(TEC_UNAME_LIBLUA_DIR)
  LDIR += $(IMLUA_LIB)
endif

ifdef USE_CDLUA
  override USE_CD = Yes
  LIBS += cdlua$(LIBLUA_SFX)
  CDLUA_LIB ?= $(CD)/lib/$(TEC_UNAME_LIBLUA_DIR)
  LDIR += $(CDLUA_LIB)
endif

ifdef USE_IUPLUA
  override USE_IUP = Yes
  ifdef USE_CD
    ifeq ($(findstring iupluacd, $(LIBNAME)), )
      LIBS += iupluacd$(LIBLUA_SFX)
    endif
  endif
  ifdef USE_OPENGL
    ifeq ($(findstring iupluagl, $(LIBNAME)), )
      LIBS += iupluagl$(LIBLUA_SFX)
    endif
  endif
  LIBS += iuplua$(LIBLUA_SFX)
  IUPLUA_LIB ?= $(IUP)/lib/$(TEC_UNAME_LIBLUA_DIR)
  LDIR += $(IUPLUA_LIB)
endif

ifdef USE_LUA
  ifndef NO_LUALIB
    LIBS += lualib$(LUA_SFX)
  endif
  LIBS += lua$(LUA_SFX)

  LUA_LIB ?= $(LUA)/lib/$(TEC_UNAME)
  LDIR += $(LUA_LIB)

  LUA_INC ?= $(LUA)/include
  INCLUDES += $(LUA_INC)

  LUA_BIN ?= $(LUA)/bin/$(TEC_SYSNAME)
  ifdef USE_BIN2C_LUA
    BIN2C := $(LUA_BIN)/lua$(LUA_SFX) $(BIN2C_PATH)bin2c.lua
  else
    BIN2C := $(LUA_BIN)/bin2c$(LUA_SFX)
  endif
  LUAC   := $(LUA_BIN)/luac$(LUA_SFX)
  LUABIN := $(LUA_BIN)/lua$(LUA_SFX)
endif

ifdef USE_IUP
  ifdef USE_CD
    LIBS += iupcd
  endif
  ifdef USE_GTK
    LIBS += iupgtk
  else
    LIBS += iup
  endif
  
  IUP_LIB ?= $(IUP)/lib/$(TEC_UNAME)
  LDIR += $(IUP_LIB)
  
  ifdef USE_OPENGL
    LIBS += iupgl
  endif
  
  ifdef USE_DLL
    ifeq ($(MAKETYPE), APP)
      LIBS += iupstub
    endif
  endif

  IUP_INC ?= $(IUP)/include
  INCLUDES += $(IUP_INC)
endif

ifdef USE_CD
  ifdef USE_GDIPLUS
    CHECK_GDIPLUS = Yes
    LIBS += cdcontextplus gdiplus
  endif
  
  ifdef USE_CAIRO
    # To use Cairo with Win32 base driver (NOT for GDK)
    # Can NOT be used together with GDI+
    LIBS += cdcairo pangocairo-1.0 cairo
  endif
  
  ifdef USE_GDK
    LIBS += cdgdk
  else
    LIBS += cd
  endif
  
  LINK_FREETYPE = Yes
  
  CD_LIB ?= $(CD)/lib/$(TEC_UNAME)
  LDIR += $(CD_LIB)

  CD_INC ?= $(CD)/include
  INCLUDES += $(CD_INC)
endif

ifdef USE_IM
  LIBS += im
  
  ifndef NO_ZLIB
    LINK_ZLIB = Yes
  endif
  
  IM_LIB ?= $(IM)/lib/$(TEC_UNAME)
  LDIR += $(IM_LIB)

  IM_INC ?= $(IM)/include
  INCLUDES += $(IM_INC)
endif

ifdef USE_FTGL
  LINK_FTGL = Yes
  USE_FREETYPE = Yes
  
  FTGL_INC ?= $(FTGL)/include
  INCLUDES += $(FTGL_INC)
endif

ifdef LINK_FTGL
  LIBS += ftgl
  LINK_FREETYPE = Yes
  
  FTGL_LIB ?= $(FTGL)/lib/$(TEC_UNAME)
  LDIR += $(FTGL_LIB)
endif

ifdef USE_FREETYPE
  LINK_FREETYPE = Yes
  
  FREETYPE_INC ?= $(FREETYPE)/include
  INCLUDES += $(FREETYPE_INC)
endif

ifdef LINK_FREETYPE
  LIBS += freetype6
  
  ifeq ($(findstring dll, $(TEC_UNAME)), )
    ifndef NO_ZLIB
      LINK_ZLIB = Yes
    endif
  endif
  
  FREETYPE_LIB ?= $(FREETYPE)/lib/$(TEC_UNAME)
  LDIR += $(FREETYPE_LIB)
endif

ifdef LINK_PDFLIB
  LIBS += pdflib
  
  ifeq ($(findstring dll, $(TEC_UNAME)), )
    ifndef NO_ZLIB
      LINK_ZLIB = Yes
    endif
  endif
  
  PDFLIB_LIB ?= $(PDFLIB)/lib/$(TEC_UNAME)
  LDIR += $(PDFLIB_LIB)
endif

ifdef USE_ZLIB
  LINK_ZLIB = Yes
  
  ZLIB_INC ?= $(ZLIB)/include
  INCLUDES += $(ZLIB_INC)
endif

ifdef LINK_ZLIB
  ifndef ZLIB_NAME
    ZLIB_NAME = zlib1
    
    ifneq ($(findstring gcc, $(TEC_UNAME)), )
      ZLIB_NAME = z
    endif
    ifneq ($(findstring mingw, $(TEC_UNAME)), )
      ZLIB_NAME = z
    endif
  endif
  LIBS += $(ZLIB_NAME)

  ZLIB_LIB ?= $(ZLIB)/lib/$(TEC_UNAME)
  LDIR += $(ZLIB_LIB)
endif

ifdef USE_OPENGL
  ifdef OLD_OPENGL
    LIBS += glaux glu32 opengl32
  else
    LIBS += glu32 opengl32
  endif
endif

ifdef USE_GTK
  STDINCS += $(GTK)/include/atk-1.0 $(GTK)/include/gtk-$(GTKSFX).0 $(GTK)/include/gdk-pixbuf-2.0 
  STDINCS += $(GTK)/include/cairo $(GTK)/include/pango-1.0 $(GTK)/include/glib-2.0 
  STDINCS += $(GTK)/lib/glib-2.0/include 
  ifndef USE_GTK3
    STDINCS += $(GTK)/lib/gtk-2.0/include
  endif
  ifeq "$(TEC_CC)" "gcc"
    STDFLAGS += -mms-bitfields
  endif
  LDIR += $(GTK)/lib
  ifdef USE_GTK3
    LIBS += gtk-3 gdk-3
  else
    LIBS += gtk-win32-2.0 gdk-win32-2.0 
  endif
  LIBS += gdk_pixbuf-2.0 pango-1.0 pangowin32-1.0 gobject-2.0 gmodule-2.0 glib-2.0
endif

ifdef USE_QT
	#STDFLAGS += -Zm200 -w34100 -w34189 -Zm200 -w34100 -w34189 -w34100 -w34189
  STDINCS += $(QT)/include $(QT)/include/QtCore $(QT)/include/QtGui $(QT)/include/ActiveQt $(QT)/mkspecs/win32-msvc2005
  STDDEFS += -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_QT3SUPPORT_LIB -DQT3_SUPPORT -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT
  LDIR += $(QT)/lib
  LIBS += QtMain QtGui4 QtCore4
endif


#---------------------------------#
#  Building compilation flags that are sets

DEPINCS := $(INCLUDES) $(EXTRAINCS)

# INCLUDES for dependencies, remove references to "c:" and similars
DEPINCS := $(patsubst c:%, /cygdrive/c%, $(DEPINCS))
DEPINCS := $(patsubst d:%, /cygdrive/d%, $(DEPINCS))
DEPINCS := $(patsubst x:%, /cygdrive/x%, $(DEPINCS))
DEPINCS := $(patsubst t:%, /cygdrive/t%, $(DEPINCS))
DEPINCS := $(addprefix -I, $(DEPINCS))

INCLUDES := $(addprefix -I, $(INCLUDES))
STDINCS := $(addprefix -I, $(STDINCS))
EXTRAINCS := $(addprefix -I, $(EXTRAINCS))
DEFINES := $(addprefix -D, $(DEFINES))

ifdef USE_CPP11
  DEPFLAGS += -std=c++11
endif

# For aplications and DLLs
ifneq ($(MAKETYPE), LIB)
  LIBS += $(STDLIB)
  LIBS := $(addsuffix .$(LIBEXT), $(LIBS))

  ifeq ($(TEC_CC), vc)
    ifdef LDIR
      LDIR  := $(addprefix -LIBPATH:, $(LDIR))
    endif

    STDLFLAGS += $(LDIR) $(STDLIBDIR) $(LIBS)
  endif

  ifeq ($(TEC_CC), bc)
    ifdef LDIR
      LDIR  := $(addprefix -L, $(LDIR))
    endif
  endif

  ifeq ($(TEC_CC), wc)
    ifdef LDIR
      LDIR  := $(addprefix LIBP , $(LDIR))
    endif

    LIBS := $(addprefix LIB , $(LIBS))

    STDLFLAGS += $(LDIR) $(STDLIBDIR) $(LIBS)
  endif

  ifeq ($(TEC_CC), gcc)
    LIBS := $(addprefix -l, $(LIBS))
    LIBS := $(LIBS:.a=)
    ifdef LDIR
      LDIR  := $(addprefix -L, $(LDIR))
    endif

    STDLFLAGS += $(LDIR) $(STDLIBDIR) $(LIBS)
  endif

endif


#---------------------------------#
# Definitions of private variables

# C, C++ and RC compiler flags
CFLAGS   = $(FLAGS) $(STDFLAGS) $(INCLUDES) $(STDINCS) $(EXTRAINCS) $(DEFINES) $(STDDEFS)
CXXFLAGS = $(CPPFLAGS) $(STDFLAGS) $(INCLUDES) $(STDINCS) $(EXTRAINCS) $(DEFINES) $(STDDEFS)
RCFLAGS  = $(INCLUDES) $(STDINCS) $(EXTRAINCS) $(DEFINES) $(STDDEFS)

# Sources with relative path
SOURCES    = $(addprefix $(SRCDIR)/, $(SRC))

# Target for applications or libraries
ifeq ($(MAKETYPE), APP)
  TARGET := $(TARGETEXE)
else
  ifeq ($(MAKETYPE), DLL)
    TARGET := $(TARGETDLL) $(TARGETLIB) $(TARGETDIR)/$(TARGETNAME).exp
  else
    TARGET := $(TARGETLIB)
  endif
endif

# OBJ: list of .o, without path
# OBJS: list of .o with relative path
OBJ = $(notdir $(SRC))
OBJ := $(OBJ:.c=.$(OBJEXT))
OBJ := $(OBJ:.cpp=.$(OBJEXT))
OBJ := $(OBJ:.cxx=.$(OBJEXT))
OBJ := $(OBJ:.cc=.$(OBJEXT))
OBJ := $(OBJ:.rc=.res)
OBJS = $(addprefix $(OBJDIR)/, $(OBJ))

# Construct VPATH variable
P-SRC = $(dir $(SRC))
P-SRC += $(dir $(SRCLUA))
VPATH = .:$(foreach dir,$(P-SRC),$(if $(dir)="./",:$(dir)))

#---------------------------------#
ifdef LOHPACK
  # Pacote LOH unificado com todos scripts Lua precompilados
  LOHS := $(LOHDIR)/$(LOHPACK)
  LOHDIRS :=
else
  ifdef NO_LUAOBJECT
    LH = $(notdir $(SRCLUA))
    LH := $(LH:.lua=.lh)
    LHS = $(addprefix $(LHDIR)/, $(LH))
    LUAS := $(LHS)
  else
    # LOH: lista dos arquivos .loh, sem path
    # LOHS: lista dos arquivos .loh, com path relativo
    LO = $(notdir $(SRCLUA))
    LO := $(LO:.lua=$(LO_SUFFIX).lo)
    LOS = $(addprefix $(OBJROOT)/, $(LO))

    LOH = $(notdir $(SRCLUA))
    LOH := $(LOH:.lua=$(LO_SUFFIX).loh)
    LOHS = $(addprefix $(LOHDIR)/, $(LOH))
    LUAS := $(LOHS)
  endif
endif

#---------------------------------#
# Compiler depedent adjusts

# CFLAGS: parametros passados ao linker e librarian
LINKFLAGS := $(LFLAGS)  $(STDLFLAGS) $(OBJS) $(SLIB)
LIBFLAGS  := $(LCFLAGS) $(STDLFLAGS) $(OBJS) $(SLIB)

ifeq ($(TEC_CC), bc)
  ifeq ($(MAKETYPE), APP)
    LINKFLAGS = $(LFLAGS) $(STDLFLAGS) $(LDIR) $(STDLIBDIR) $(STARTUP) $(OBJS), $(TARGETEXE), , $(LIBS) $(SLIB),
  else
    LIBFLAGS  = $(LCFLAGS) $(subst /,\\, $(STDLFLAGS) $(addprefix +,$(OBJS) $(SLIB)))
  endif
endif

ifeq ($(TEC_CC), wc)
  ifeq ($(MAKETYPE), APP)
    LINKFLAGS = $(LFLAGS) $(STDLFLAGS) $(addprefix F , $(OBJS) $(SLIB))
  else
    #wlib adds files using "+" as an option
    LIBFLAGS  := $(LCFLAGS) $(STDLFLAGS) $(addprefix +, $(OBJS) $(SLIB))
  endif
endif

ifeq ($(TEC_CC), gcc)
  ifeq ($(MAKETYPE), APP)
    LINKFLAGS = -o $(TARGETEXE) $(OBJS) $(SLIB) $(LFLAGS) $(STDLFLAGS)
  endif
  ifeq ($(MAKETYPE), DLL)
    LINKFLAGS = -shared -o $(TARGETDLL) -Wl,--out-implib=$(TARGETLIB) $(OBJS) $(DEF_FILE) $(SLIB) $(LFLAGS) $(STDLFLAGS)
  endif
endif

#---------------------------------#
# Dynamic Library Build

.PHONY: dynamic-lib
dynamic-lib: $(TARGETDLL) addmanifest

$(TARGETDLL) : $(LUAS) $(OBJS) $(EXTRADEPS) $(DEF_FILE)
	@echo ''; echo Tecmake: linking $(@F) ...
	$(ECHO)$(LINKER) $(LINKFLAGS)
	@echo ''; echo 'Tecmake: Dynamic Library ($@) Done'; echo ''


#---------------------------------#
# Static Library Build

.PHONY: static-lib
static-lib: $(TARGETLIB)

$(TARGETDIR)/$(TARGETNAME).lib : $(LUAS) $(OBJS) $(EXTRADEPS)
	@echo ''; echo Tecmake: librarian $(@F) ...
	$(ECHO)$(LIBC) $(LIBFLAGS)
	@echo ''; echo 'Tecmake: Static Library ($@) Done'; echo ''
	
$(TARGETDIR)/lib$(TARGETNAME).a : $(LUAS) $(OBJS) $(EXTRADEPS)
	@echo ''; echo Tecmake: librarian $(@F) ...
	$(ECHO)$(LIBC) $(ARFLAGS) $@ $(OBJS) $(SLIB)
	@echo ''; echo Tecmake: updating lib TOC $(@F) ...
	$(ECHO)-$(RANLIB) $@
	@echo ''; echo 'Tecmake: Static Library ($@) Done'; echo ''


#---------------------------------#
# Application Build

.PHONY: application
application: $(TARGETEXE) addmanifest

$(TARGETEXE) : $(LUAS) $(OBJS) $(EXTRADEPS)
	@echo ''; echo Tecmake: linking $(@F) ...
	$(ECHO)$(LINKER) $(LINKFLAGS)
	@echo ''; echo 'Tecmake: Application ($@) Done.'; echo ''


#---------------------------------#
#  Application Scripts

# Nomes dos scripts
SRELEASE = $(SRCDIR)/$(TARGETNAME).bat
EXEC := $(subst /,\,$(TARGETEXE))

.PHONY: scripts
ifdef NO_SCRIPTS
  scripts: ;
else
  scripts: $(SRELEASE) ;
endif

$(SRELEASE): $(TARGETEXE)
	@echo ''; echo 'Tecmake: generating script $(@F)'
	@echo '@echo off' > $@
	@echo 'REM Script generated automatically by tecmake v$(VERSION)' >> $@
	@echo '$(EXEC) %*' >> $@


#---------------------------------#
# Directories Creation

.PHONY: directories
directories: $(OBJDIR) $(TARGETDIR) $(EXTRADIR) $(LOHDIR) $(LHDIR) $(DEPENDDIR)

$(OBJDIR) $(TARGETDIR):
	if [ ! -d $@ ] ; then mkdir -p $@ ; fi

ifdef EXTRADIR
  $(EXTRADIR):
	  if [ ! -d $@ ] ; then mkdir -p $@ ; fi
else
  $(EXTRADIR): ;
endif

ifdef LOHDIR
  $(LOHDIR):
	  if [ ! -d $@ ] ; then mkdir -p $@ ; fi
else
  $(LOHDIR): ;
endif

ifdef LHDIR
  $(LHDIR):
	  if [ ! -d $@ ] ; then mkdir -p $@ ; fi
else
  $(LHDIR): ;
endif

ifdef DEPENDDIR
  $(DEPENDDIR):
	  if [ ! -d $@ ] ; then mkdir -p $@ ; fi
else
  $(DEPENDDIR): ;
endif


#---------------------------------#
# Compilation Rules

$(OBJDIR)/%.o:  $(SRCDIR)/%.c
	@echo ''; echo Tecmake: compiling $(<F) ...
	$(ECHO)$(CC) -c $(CFLAGS) -o $@ $<

$(OBJDIR)/%.o:  $(SRCDIR)/%.cpp
	@echo ''; echo Tecmake: compiling $(<F) ...
	$(ECHO)$(CPPC) -c $(CXXFLAGS) -o $@ $<

$(OBJDIR)/%.o:  $(SRCDIR)/%.cxx
	@echo ''; echo Tecmake: compiling $(<F) ...
	$(ECHO)$(CPPC) -c $(CXXFLAGS) -o $@ $<

$(OBJDIR)/%.o:  $(SRCDIR)/%.cc
	@echo ''; echo Tecmake: compiling $(<F) ...
	$(ECHO)$(CPPC) -c $(CXXFLAGS) -o $@ $<

$(OBJDIR)/%.obj:  $(SRCDIR)/%.c
	@echo ''; echo Tecmake: compiling $(<F) ...
	$(ECHO)$(CC) $(CFLAGS) $<

$(OBJDIR)/%.obj:  $(SRCDIR)/%.cpp
	@echo ''; echo Tecmake: compiling $(<F) ...
	$(ECHO)$(CPPC) $(CXXFLAGS) $<
	
$(OBJDIR)/%.obj:  $(SRCDIR)/%.cxx
	@echo ''; echo Tecmake: compiling $(<F) ...
	$(ECHO)$(CPPC) $(CXXFLAGS) $<
	
$(OBJDIR)/%.obj:  $(SRCDIR)/%.cc
	@echo ''; echo Tecmake: compiling $(<F) ...
	$(ECHO)$(CPPC) $(CXXFLAGS) $<
	
$(OBJDIR)/%.res:  $(SRCDIR)/%.rc
	@echo ''; echo Tecmake: compiling $(<F) ...
	$(ECHO)$(RCC) $@ $(RCFLAGS) $<

$(LHDIR)/%.lh:  $(SRCLUADIR)/%.lua
	@echo ''; echo Tecmake: generating $(<F) ...
	$(ECHO)$(BIN2C) $< > $@

$(LOHDIR)/%.loh:  $(OBJROOT)/%.lo
	@echo ''; echo Tecmake: generating $(<F) ...
	$(ECHO)$(BIN2C) $< > $@

$(OBJROOT)/%$(LO_SUFFIX).lo: $(SRCLUADIR)/%.lua
	@echo ''; echo Tecmake: compiling $(<F) ...
	$(ECHO)$(LUAC) -o $@ $<

ifdef LOHPACK
$(LOHDIR)/$(LOHPACK):  $(SRCLUA)
	@echo ''; echo Tecmake: Generating $(<F) ...
	$(ECHO)$(LUABIN) $(LUAPRE) $(LUAPREFLAGS) -l $(SRCLUADIR) -o $@ $(SRCLUA)
endif


#---------------------------------#
# Rule to add a manifest file to the generated binary
.PHONY: addmanifest
addmanifest:
  ifdef NEW_VC_COMPILER
    ifeq ($(GEN_MANIFEST), Yes)
	    @echo ''; echo Tecmake: adding Manifest ...
      ifeq ($(MAKETYPE), DLL)
	      $(ECHO)$(MT) -manifest $(TARGETDLL).manifest "-outputresource:$(TARGETDLL);2"
      endif
      ifeq ($(MAKETYPE), APP)
	      $(ECHO)$(MT) -manifest $(TARGETEXE).manifest "-outputresource:$(TARGETEXE);1"
      endif
    endif
  endif


#---------------------------------#
# Dependencies

.PHONY: depend
depend: $(DEPEND)

$(DEPEND): $(MAKENAME)
  ifdef SRC
	  @echo "" > $(DEPEND)
	  @which gcc 2> /dev/null 1>&2 ;\
	  if [ $$? -eq 0 ]; then \
	    echo "Tecmake: Building Dependencies ... (can be slow)" ;\
	    g++ $(DEPFLAGS) $(DEPINCS) $(DEFINES) $(STDDEFS) $(DEPDEFS) -MM $(SOURCES) | \
	    sed -e '1,$$s/^\([^ ]*\)\.o/$$(OBJDIR)\/\1.$(OBJEXT)/' | \
	    sed -e 's/\([ \t][ \t]*\)\([a-zA-Z]\):/\1\/cygdrive\/\2/g' > $(DEPEND) ;\
	  else \
	    echo "" ;\
	    echo "Tecmake: error, g++ not found. Dependencies can not be built." ;\
	    echo "Must set NO_DEPEND=Yes" ;\
	    echo "" ;\
	    exit 1 ;\
	  fi
  endif

ifdef USE_NODEPEND
  NO_DEPEND:=Yes
endif

###################
ifndef NO_DEPEND
include $(DEPEND)
endif
###################


#---------------------------------#
# Management Rules

.PHONY: clean-dir
clean-dir:
	rm -fr $(OBJROOT) $(TARGETROOT)

#   Remove extra files
.PHONY: clean-extra
clean-extra:
	rm -f $(DEPEND) $(SRELEASE)

#   Remove Lua object inclusion files
.PHONY: clean-lohs
clean-lohs:
	rm -f $(LOS) $(LOHS)
	
#   Remove Lua inclusion files
.PHONY: clean-lhs
clean-lhs:
	rm -f $(LHS)
	
#   Remove object files
.PHONY: clean-obj
clean-obj:
	rm -f $(OBJS)

#   Remove target
.PHONY: clean-target
clean-target:
	rm -f $(TARGET)

#   Remove target and object files
.PHONY: clean-all-obj
clean-all-obj:
	@for d in $(UNAMES); do \
	  (cd $(OBJROOT)/$$d; echo $(OBJ) | xargs rm -f) ;\
	done

#   Remove libraries and executables for all platforms
.PHONY: clean-all-target
clean-all-target:
	@for d in $(UNAMES); do \
	  (rm -f $(TARGETROOT)/$$d/$(TARGETNAME).exe $(TARGETROOT)/$$d/$(TARGETNAME).$(LIBEXT) $(TARGETROOT)/$$d/$(TARGETNAME).dll $(TARGETROOT)/$$d/$(TARGETNAME).exp) ;\
	done

.PHONY: clean
clean: clean-target clean-obj

.PHONY: clean-all
clean-all: clean-extra clean-lohs clean-lhs clean-all-target clean-all-obj

#   Rebuild target and object files
.PHONY: rebuild
rebuild: clean-obj clean-target tecmake

#   Rebuild target without rebuilding object files
.PHONY: relink
relink: clean-target tecmake


#---------------------------------#

.PHONY: version
version:
	@echo "Tecmake Windows Version $(VERSION)"

#---------------------------------#
