// -*- MPC -*-
// ***********************************************************************
// The default compiler for the 'make' project type is gcc (provided by
// the fill_value() method in MakeProjectCreator.pm).  This can be
// controlled by setting the compilers template variable.  It may be
// changed on the MPC command line via the -value_template option.
// Additionally, each compiler has a default platform.  The default
// platform for gcc is linux.  This too can be changed via the
// -value_template option.  Below are some examples.
//
// Use SunCC on the default platform (solaris):
//   mwc.pl -type make -value_template compilers=SunCC
// Use the default compiler (gcc) on LynxOS:
//   mwc.pl -type make -value_template platforms=lynxos
// Use HP-UX aCC on the default platform (HP-UX):
//   mwc.pl -type make -value_template compilers=aCC
// ***********************************************************************

conditional_include "common"
conditional_include "unixcommon"

configurations   = Release
obj_ext          = .o
res_ext          = .res
compile_flags    =
arflags          =
pchsupport       = 1
targetoutdir     =
libopt           = -l
build64bit       = 1
pchext           = .gch
versupport       = 1
supports_include = 1
visibility       =
depgen_flags     =
cc               = cc
notparallel      = 1

// ***********************************************************************
// Configuration Section
// ***********************************************************************

Debug {
  lib_modifier = d
  genflags     = -g
}

Release {
  optimize = 1
  genflags = -O
}

// ***********************************************************************
// Compiler Section
// ***********************************************************************

java {
  cc             = javac
  cxx            = javac
  ld             = :
  obj_ext        = .class
  output_option  =
  compile_option =
  ar             = jar
  arflags        = cvf
  platforms      = jvm
}

gcj {
  cc            = gcj
  cxx           = gcj
  pic           = -fPIC
  shflags       = -shared
  platforms     = linux
  exe_linkflags = --main=<%main%>
}

cxx_tru64 {
  cxx        = cxx
  clean      = cxx_repository so_locations
  tempincopt = "-ptr "
  tempinc    = cxx_repository
  platforms  = tru64
  pchcreate  = "-nopch_messages -create_pch "
  pchuse     = "-nopch_messages -use_pch "
}

cxx_vms {
  cxx             = cxx
  arflags         = r
  compilerflags   = -ieee -names_as_is_short
  linkflags       = -threads
  shflags         = -shared -auto_symvec
  clean           = cxx_repository
  tempinc         = cxx_repository
  platforms       = openvms
}

dmc {
  cc           = dmc
  cxx          = dmc
  dmclink      = 1
  ar           = lib
  arflags      = -c
  obj_ext      = .obj
  platforms    = dmc_win
}

gcc {
  cc        = gcc
  cxx       = g++
  pic       = -fPIC
  shflags   = -shared
  platforms = linux
  pchcreate = "-o "
  pchnobj   = 1
  checkopt  = -Wall -Wextra -pedantic -fsyntax-only
  visopt    = -fvisibility=hidden -fvisibility-inlines-hidden
  profopt   = -pg -DCOMPILER_PROFILING
  covopt    = -fprofile-arcs -ftest-coverage -DCOMPILER_COVERAGE
}

arm_elf_gcc {
  cc            = arm-elf-gcc
  cxx           = arm-elf-g++
  ar            = arm-elf-ar
  arflags       = rcs
  compilerflags = -isystem "$(SYSTEMDIR)/arm-elf/include"
  shflags       = -shared
  platforms     = nucleus
  pchcreate     = "-o "
  pchnobj       = 1
  checkopt      = -Wall -Wextra -pedantic -fsyntax-only
  visopt        = -fvisibility=hidden -fvisibility-inlines-hidden
  profopt       = -pg -DCOMPILER_PROFILING
  covopt        = -fprofile-arcs -ftest-coverage -DCOMPILER_COVERAGE
}

arm_keil {
  cc            = armcc
  cxx           = armcc
  ar            = armar
  ld            = armlink
  libpathopt    = "--userlibpath "
  link_lib_name = 1
  arflags       = -rcs
  compilerflags = --gnu -DKEIL
  platforms     = cmsis_cortex_m4
}

Intel {
  cxx       = icpc
  pic       = -fPIC
  shflags   = -shared
  platforms = linux
  visopt    = -fvisibility=hidden
}

SunCC {
  cxx             = CC
  pic             = -KPIC
  shflags         = -G
  compilerflags64 = -xarch=v9
  linkflags       = -library=Cstd -library=Crun
  clean           = SunWS_cache ir.out
  platforms       = solaris
  pchcreate       = -xpch=collect:
  pchuse          = -xpch=use:
  pchstop         = -xpchstop=
  pchext          = .Cpch
  visopt          = -xldscope=hidden
}

aCC {
  cxx             = aCC
  pic             = +Z
  shflags         = -b
  platforms       = hpux
  compilerflags   = -AA -D_RWSTD_MULTI_THREAD +W336
  compilerflags64 = +DA2.0W +DS2.0W
  linkflags       = -Wl,+s
  linkflags64     = -Wl,-x -Wl,+h$(@F) -ldl
  pchcreate       = "+hdr_create "
  pchuse          = "+hdr_use "
}

xlC_r {
  cc              = xlc_r
  cxx             = xlC_r
  arflags64      += -X64 -rv
  compilerflags64 = -q64
  platforms       = aix
  pchcreate       = -qgenpcomp=
  pchuse          = -qusepcomp=
}

SGICC {
  cxx             = CC
  pic             = -KPIC
  shflags         = -shared
  compilerflags64 = -64
  linkflags       = -Wl,-woff,84
  clean           = ii_files
  platforms       = irix
  pchcreate       = -LANG:create_pch=
  pchuse          = -diag_suppress 3056 -LANG:use_pch=
}

wrsppc {
  cc            = gcc$(CPUTYPE)
  cxx           = g++$(CPUTYPE)
  cputype       = ppc
  cpu           = PPC604
  ar            = ar$(CPUTYPE)
  nm            = nm$(CPUTYPE)
  compilerflags = -mlongcall
  checkopt      = -Wall -Wextra -pedantic -fsyntax-only
  platforms     = vxworks
}

wrspentium {
  cc            = gcc$(CPUTYPE)
  cxx           = g++$(CPUTYPE)
  cputype       = pentium
  cpu           = PENTIUM
  ar            = ar$(CPUTYPE)
  nm            = nm$(CPUTYPE)
  checkopt      = -Wall -Wextra -pedantic -fsyntax-only
  platforms     = vxworks
}

NCC {
  cxx       = NCC
  pic       = -KPIC
  platforms = tandem
}

ghsppc {
  cc            = cc$(CXXINT)$(CPUTYPE)
  cxx           = cx$(CXXINT)$(CPUTYPE)
  ar            = cx$(CXXINT)$(CPUTYPE)
  cputype       = ppc
  arflags       = --one_instantiation_per_object -archive -o
  compilerflags = --new_style_casts --one_instantiation_per_object --exceptions --std --long_long
  platforms     = integrity
}

// ***********************************************************************
// Platform Section
// ***********************************************************************

jvm {
  versupport =
  lib_prefix =
  dll_ext    =
  lib_ext    = .jar
}

tru64 {
  shflags       = -shared /usr/lib/libcxxstd.a
  ldlibs        = -ltli -lrt
  extracppflags = -D__USE_STD_IOSTREAM -D_REENTRANT
}

openvms {
  // If you want to create shareable images, you can
  // set dll_ext to .exe using the -value_template option of MPC.
  versupport    =
  lib_prefix    =
  dll_ext       =
  exe_ext       = .exe
  ldlibs        = -lpthread
  extracppflags = -D__USE_STD_IOSTREAM -D_REENTRANT
}

linux {
  gnumake       = 1
  ldlibs        = -ldl $(subst lib,-l,$(sort $(basename $(notdir $(wildcard /usr/lib/librt.so /lib/librt.so))))) -lpthread
  extracppflags = -D_REENTRANT
}

nucleus {
  gnumake       = 1
  extracppflags = -mcpu=arm7tdmi -msoft-float -mthumb-interwork
}

cmsis_cortex_m4 {
  gnumake       = 1
  extracppflags = --cpu=Cortex-M4
}

solaris {
  shflags       = -G
  ldlibs        = -lsocket -ldl -lnsl -lgen -lposix4 -lthread
  extracppflags = -D_REENTRANT
}

hpux {
  dll_ext       = .sl
  ldlibs        = -lxti -lrt -lpthread -ldld
  extracppflags = -D_REENTRANT
}

aix {
  dll_ext          =
  ldlibs           = -ldl -lpthread
  extracppflags    = -D_REENTRANT
  supports_include =
}

irix {
  ldlibs  = -lsocket -lgen -lpthread
}

lynxos {
  dll_ext       =
  extracppflags = -D__NO_INCLUDE_WARN__ -mthreads -mminimal-toc
}

macosx {
  ranlib  = 1
  dll_ext = .dylib
  shflags = -shared -dynamic
}

// I'm not sure if this is even useful anymore.
macos {
  dld     = libtool
  ranlib  = 1
  dll_ext = .dylib
  shflags = -dynamic
  ldlibs  = -lcc_dynamic -lstdc++ -lSystem -ldl
}

unixware {
  ldlibs        = -lsocket -ldl -lnsl -lgen -lposix4 -lthread
  extracppflags = -D_REENTRANT
}

qnx {
  ldlibs        = -lsocket
  extracppflags = -D__GCC_BUILTIN
}

vxworks {
  versupport       =
  dll_ext          =
  exe_ext          = .out
  specialscript    = "for i in $$3; do for j in $$4; do i=`echo $$i | sed sa\^-laa`;[ -r \"$$j/lib$$i.a\" ] && libs=\"$$libs $$j/lib$$i.a\" && break;done;done;$$1 $$2 $$libs | munch | grep -v \\.cpp > $$6"
  prelinktarget    = __ctordtor.c
  prelinktargetobj = __ctordtor$(OBJEXT)
  clean            = __ctordtor$(OBJEXT)
  ldlibs           = -L$(WIND_BASE)/target/lib/$(CPUTYPE)/$(CPU)/common$(CPU_SPECIFIC) -larch
  extracppflags    = -nostdlib -I$(WIND_BASE)/target/h
  ld               = ld$(CPUTYPE)
  linkflags        = -X -r
}

vxworks_rtp {
  versupport    =
  dll_ext       =
  exe_ext       = .vxe
  extracppflags = -I$(WIND_BASE)/target/usr/h -I$(WIND_BASE)/target/usr/h/wrn/coreip -mrtp
  ldlibs        = -ldl
  linkflags     = -L$(WIND_BASE)/target/usr/lib/$(CPUTYPE)/$(CPU)/common
}

cygwin {
  gnumake    = 1
  versupport =
  dll_ext    = .dll
  exe_ext    = .exe
  rc         = windres
  res_ext    = .o
  pic        =
  depgen_flags = -t make
}

// MinGW compiler with the MSYS shell, make, etc.
mingw_msys {
  versupport   =
  lib_prefix   =
  dll_ext      = .dll
  lib_ext      = .lib
  exe_ext      = .exe
  ldlibs       = -lwsock32 -lnetapi32
  rc           = rc
  pic          =
  depgen_flags = -t make
  gnumake = 1
}

// MinGW compiler with the built-in Windows shell and native make
// (not cygwin or MSYS; GNUWin32 is recommended)
// This also needs core utils (cat, cp, rm) from GNUWin32
//       http://gnuwin32.sourceforge.net/packages/coreutils.htm
// because the makefiles use forward slashes in their arguments.
mingw {
  versupport   =
  lib_prefix   =
  dll_ext      = .dll
  lib_ext      = .lib
  exe_ext      = .exe
  ldlibs       = -lwsock32 -lnetapi32
  rc           = windres
  res_ext      = .o
  devnull      = nul
  makedir      = mkdir
  move         = move /y
  testdirstart = if not exist
  testdirend   =
  pic          =
  slash        = \\
  depgen_flags = -t make
  echo_outer_quote =
  expanded_variable_assignment = 1
  gnumake = 1
}

dmc_win {
  versupport       =
  lib_prefix       =
  dll_ext          = .dll
  lib_ext          = .lib
  exe_ext          = .exe
  ldlibs           = wsock32+kernel32
  rc               = rc
  devnull          = nul
  delete           = del /f/s/q
  type             = type
  copy             = copy /y
  makedir          = mkdir
  move             = move /y
  supports_include =
  testdirstart     = if not exist
  testdirend       =
  depgen_flags     = -t make
}

tandem {
  shflags       = -shared -all
  ldlibs        = -lsocket -ldl -lnsl -lgen -lthread
  extracppflags = -D_REENTRANT
}

// For Integrity, the following should be set as environment variables, on
// the make command line or within a verbatim section in your mpc file.
//
// OS_DIR The full path to your BSP installation.
// BSP    The BSP name (ex. sim800).
//
integrity {
  cxxint         = int
  versupport     =
  dll_ext        =
  ldlibs         = -lshm_client -lnet -lsocket -lposix
  extraarflags   = -bsp $(BSP) -os_dir $(OS_DIR) --one_instantiation_per_object
  extracppflags  = -integrate -dynamic -bsp $(BSP) -os_dir $(OS_DIR) --one_instantiation_per_object -non_shared -Uvector
  specialscript  = "echo Kernel > $$6; echo Filename DynamicDownload >> $$6;echo EndKernel >> $$6; echo AddressSpace >> $$6;echo Filename $$5 >> $$6;echo Language C++ >> $$6;echo Library libINTEGRITY.so >> $$6;echo Library libc.so >> $$6;echo Library libscxx_e.so >> $$6;echo Task Initial >> $$6;echo StackLength 0x8000 >> $$6;echo EndTask >> $$6;echo EndAddressSpace >> $$6"
  prelinktarget  = $(notdir $(BIN).int)
  postlinkbinary = $(MV) $(BIN) $(BIN).tmp && intex -bsp $(BSP) -os_dir $(OS_DIR) -intfile $(notdir $(BIN).int) -o $(BIN) $(BIN).tmp
}

conditional_include "user_makedll"
