ifndef SYSNAME
  SYSNAME := $(shell uname)
  ifeq ($(SYSNAME),)
    $(error error with shell command uname)
  endif
endif

ifndef NODENAME
  NODENAME := $(shell uname -n)
  ifeq ($(NODENAME),)
    $(error error with shell command uname -n)
  endif
endif

ifndef MACHNAME
  MACHNAME := $(shell uname -m)
  ifeq ($(MACHNAME),)
    $(error error with shell command uname -m)
  endif
endif

ifndef PROF
  PROF := false
endif

ifndef STATIC_CMGUI
  STATIC_CMGUI = false
endif

ifndef DEBUG
  ifneq ($(PROF),false)
    OPT := true
  endif
  ifndef OPT
    OPT := false
  endif
  ifeq ($(OPT),false)
    DEBUG := true
  else
    DEBUG := false
  endif
endif

ifndef MP
  MP = false
endif

ifndef PROFILE
  PROFILE = false
endif

ifndef CV_API
  CV_API = true
endif

ifndef SOLVE_MODEL
  SOLVE_MODEL = false
endif

# set architecture dependent directories and default options

# defaults
INSTRUCTION=$(MACHNAME)
BIN_ARCH_DIR = $(INSTRUCTION)-$(OPERATING_SYSTEM)
LIB_ARCH_DIR = $(INSTRUCTION)-$(ABI)-$(OPERATING_SYSTEM)

ifeq ($(filter-out IRIX%,$(SYSNAME)),)# SGI
  # Specify what application binary interface (ABI) to use i.e. 32, n32 or 64
  ifndef ABI
    ifdef SGI_ABI
      ABI := $(patsubst -%,%,$(SGI_ABI))
    else
      ABI = n32
    endif
  endif
  # Specify which instruction set to use i.e. -mips#
  ifndef MIPS
    # Using mips3 for most basic version on esu* machines
    # as there are still some Indys around.
    # Although mp versions are unlikely to need mips3 they are made this way
    # because it makes finding library locations easier.
    MIPS = 4
    ifeq ($(filter-out esu%,$(NODENAME)),)
      ifeq ($(ABI),n32)
        ifneq ($(DEBUG),false)
          MIPS=3
        endif
      endif
    endif
  endif
  INSTRUCTION := mips
  OPERATING_SYSTEM := irix
endif
ifeq ($(SYSNAME),Linux)
  OPERATING_SYSTEM := linux
  ifeq ($(filter-out i%86,$(MACHNAME)),)
    INSTRUCTION := i686
  endif
  ifneq ($(filter $(INSTRUCTION),i686 ia64 x86_64),)# i686, ia64, x86_64 
    LIB_ARCH_DIR = $(INSTRUCTION)-$(OPERATING_SYSTEM)# no ABI required
  endif
  ifndef ABI
    ABI=32
    ifeq ($(filter-out i%86,$(MACHNAME)),)
      ABI=32
    endif
    ifneq (,$(filter $(MACHNAME),ia64 x86_64))# ia64 or x86_64
      ABI=64
    endif
  endif
endif
ifeq ($(SYSNAME),win32)
  LIB_ARCH_DIR = $(INSTRUCTION)-$(OPERATING_SYSTEM)# no ABI
  ABI=32
  INSTRUCTION := i386
  OPERATING_SYSTEM := win32
endif
ifeq ($(SYSNAME),SunOS)
  OPERATING_SYSTEM := solaris
endif
ifeq ($(SYSNAME),AIX)
  ifndef ABI
    ifdef OBJECT_MODE
      ifneq ($(OBJECT_MODE),32_64)
        ABI = $(OBJECT_MODE)
      endif
    endif
  endif
  ifndef ABI
    ABI = 32
  endif
  INSTRUCTION := rs6000
  OPERATING_SYSTEM := aix
endif

EXE_ABI_SUFFIX =
ifeq ($(ABI),64)
  # ??? Should this be trimmed off x86_64 also?
  ifneq ($(MACHNAME),ia64)# ia64 is always 64-bit
    EXE_ABI_SUFFIX = 64
  endif
endif

ifeq ($(MP),false)
  MT_SUFFIX =
  MP_SUFFIX =
else
  MT_SUFFIX = -mt
  MP_SUFFIX = _mp
endif

ifeq ($(PROFILE),false)
  PROFILE_SUFFIX =
else
  PROFILE_SUFFIX = -profile
endif

ifeq ($(CV_API),false)
  CV_API_SUFFIX = -FE
else
  CV_API_SUFFIX = -CV
endif

ifeq ($(SOLVE_MODEL),false)
  SOLVE_MODEL_SUFFIX =
else
  SOLVE_MODEL_SUFFIX = -solver
endif

ifneq ($(DEBUG),false)
  DEBUG_SUFFIX = -debug
else
  DEBUG_SUFFIX = 
endif

ifneq ($(STATIC_CMGUI),false)
  CMGUI_SUFFIX = -static
else
  CMGUI_SUFFIX = 
endif

EXE_DIR := bin/$(BIN_ARCH_DIR)
EXE_NAME := laplace$(EXE_ABI_SUFFIX)$(MT_SUFFIX)$(DEBUG_SUFFIX)$(PROFILE_SUFFIX)$(CV_API_SUFFIX)$(SOLVE_MODEL_SUFFIX)$(CMGUI_SUFFIX)
EXECUTABLE := $(EXE_DIR)/$(EXE_NAME)
SRC_DIR := .
OBJ_DIR := obj/$(LIB_ARCH_DIR)$(MT_SUFFIX)$(DEBUG_SUFFIX)$(PROFILE_SUFFIX)$(CV_API_SUFFIX)$(SOLVE_MODEL_SUFFIX)

CMGUI_DIR = ${HOME}/mycmiss/cmgui
CMGUI_INC_DIR = $(CMGUI_DIR)/source
CMGUI_LIB_DIR = $(CMGUI_DIR)/lib/$(LIB_ARCH_DIR)/cmgui$(DEBUG_SUFFIX)$(PROFILE_SUFFIX)
CMGUI_LIBS = \
  cmgui_general \
  cmgui_finite_element \
  cmgui_computed_variable \
  cmgui_computed_variable_finite_element
CMGUI_API_HEADERS = \
  api/cmiss_region.h \
  user_interface/message.h

IMAGE_LIBRARIES_DIR = /product/cmiss/image_libraries/lib/$(LIB_ARCH_DIR)
IMAGE_LIBRARIES = \
  bz2 \
  z
MATRIX_LIBRARIES_DIR = /product/cmiss/linear_solvers/lib/$(LIB_ARCH_DIR)
MATRIX_LIBRARIES = \
  lapack-debug \
  blas-debug

STATIC_LIBS = \
  $(addprefix $(IMAGE_LIBRARIES_DIR)/lib,\
      $(addsuffix .a,$(IMAGE_LIBRARIES))) \
  $(addprefix $(MATRIX_LIBRARIES_DIR)/lib,\
      $(addsuffix .a,$(MATRIX_LIBRARIES))) \

SRCS = \
  $(SRC_DIR)/main.c \
  $(SRC_DIR)/laplace_code.c \
  $(SRC_DIR)/recipes.c
DEPS = $(wildcard $(SRC_DIR)/*.h)
OBJS = $(subst $(SRC_DIR)/,$(OBJ_DIR)/,$(subst .c,.o,$(SRCS)))

DEPS += $(addprefix $(CMGUI_INC_DIR)/,$(CMGUI_API_HEADERS))

CC = gcc
ifneq ($(STATIC_CMGUI),false)
  LINK = g++
  STD_LIBS = m g2c stdc++
else
  LINK = $(CC)
  STD_LIBS = m
endif
INC_DIRS = $(CMGUI_INC_DIR)
CFLAGS =
LINK_FLAGS =
ifneq ($(DEBUG),false)
  CFLAGS += -g -W -Wall -Wno-parentheses -Wno-switch -Wno-format
  LINK_FLAGS += -g
else
  CFLAGS += -O2 -W -Wall -Wno-parentheses -Wno-switch \
    -Wno-format
  LINK_FLAGS += -O2
endif

ifneq ($(PROFILE),false)
  CFLAGS += -pg
  LINK_FLAGS += -pg
else
  CFLAGS += 
  LINK_FLAGS += 
endif

ifneq ($(CV_API),false)
  CFLAGS += -DUSE_CV_API
else
  CFLAGS += -DUSE_FE_HEADER
endif

ifneq ($(SOLVE_MODEL),false)
  CFLAGS += -DSOLVE_MODEL
else
  CFLAGS +=
endif

CFLAGS += $(addprefix -I,$(INC_DIRS))
LINK_LIBS =
ifneq ($(STATIC_CMGUI),false)
  LINK_LIBS += \
    $(CMGUI_LIB_DIR)/libcmgui.a \
    $(STATIC_LIBS)
else
  LINK_LIBS += \
    -L$(CMGUI_LIB_DIR) $(addprefix -l,$(CMGUI_LIBS)) \
    $(STATIC_LIBS)
endif
LINK_LIBS += $(addprefix -l,$(STD_LIBS))

.PHONY : clean all

all : $(EXECUTABLE)

$(EXECUTABLE) : $(OBJS)
	@if [ ! -d $(@D) ]; then \
		mkdir -p $(@D) ;\
	fi
	$(LINK) $(LINK_FLAGS) -o $@ $(OBJS) $(LINK_LIBS)

$(OBJ_DIR)/%.o : $(SRC_DIR)/%.c $(DEPS)
	@if [ ! -d $(@D) ]; then \
		mkdir -p $(@D) ;\
	fi
	$(CC) $(CFLAGS) -c -o $@ $<

clean :
	rm -f $(OBJS) $(EXECUTABLE)
