#***************************************************************************************************
#                                             Makefile                                             *
#                                            ----------                                            *
# Description : Build system for the GNU SPICE GUI project C++ source files.                       *
# Started     : 2003-03-18                                                                         *
# Last update : 2015-03-29                                                                         *
# Copyright   : (C) 2003 by MSWaters                                                               *
#***************************************************************************************************

#***************************************************************************************************
#                                                                                                  *
#       This program is free software; you can redistribute it and/or modify it under the          *
#       terms of the GNU General Public License as published by the Free Software Foundation;      *
#       either version 3 of the License, or (at your option) any later version.                    *
#                                                                                                  *
#***************************************************************************************************

#***************************************************************************************************
# Any or all of the values in this section may be set below or on the command line when envoking
# make eg. :
#
#   make GSPICEUI_DBG=1 GSPICEUI_WXLIB=2.8
#
# Note : Values specified on the command line over-ride those specified below.
#***************************************************************************************************

# Create bin file containing debug information (ie. for gdb)
GSPICEUI_DBG = 0

# Specify the version of the wxWidgets library to compile against
GSPICEUI_WXLIB = 3.0

# Specify the install directory
DESTDIR = /usr/local/bin

#***************************************************************************************************
# Specify string values
#***************************************************************************************************

# Which compiler
CXX = g++

# Application name
PROG = gspiceui

# wxWidgets configuration utility
WXCFG = wx-config --unicode --version=$(GSPICEUI_WXLIB)

# Dependency file
DEPS = Makefile.deps

# Directories
# Long winded but unambiguous
#ROOT     := $(shell cd .. ; pwd)
# Short form but possibly ambiguous
ROOT       = ..
SRCDIR     = $(ROOT)/src
OBJDIR     = obj
BINDIR     = $(ROOT)/bin

# Compiler options :
#  -Wall      Enable all optional warnings desirable for normal code
#  -Wextra    Enable extra warning flags not enabled by "-Wall"
#  -pipe      Use pipes rather than temp. files for comms. between various stages of compilation
#  -O0        Reduce compilation time but don't break debugging (this is the default)
#  -O1        Optimize
#  -O2        Optimize even more
#  -O3        Optimize yet more
#  -Ofast     Optimize till it hurts : "-O3" + enable opts not valid for all standard-compliants
#  -Os        Optimize for size
#  -Og        Optimize debugging experience but don't break debugging
ifeq ($(GSPICEUI_DBG),0)
  # Options for release (not using -Wall since it's GCC specific)
  CXXFLAGS := -O1 -pipe $(shell $(WXCFG) --cxxflags)
else
  # Options for development
  CXXFLAGS := -g -Og -Wall -Wextra -pipe $(shell $(WXCFG) --cxxflags)
endif

# The following suppresses spurious warnings from gcc with wxWidgets v2.8.12
ifeq ($(GSPICEUI_WXLIB),2.8)
  CXXFLAGS += -Wno-unused-local-typedefs
endif

# Includes
INCLUDES = -I/usr/include -I/usr/X11R6/include -I.

# Libraries
# (The pkg-config stuff was requested by a user, somehow pangox was missing)
LIBS := $(shell $(WXCFG) --libs core,base,html) $(shell pkg-config --libs-only-l pangox)

# Objects
OBJS := $(wildcard *.cpp) $(wildcard */*.cpp) $(wildcard */*/*.cpp)
OBJS := $(filter-out tests/%.cpp, $(OBJS))
OBJS := $(notdir $(OBJS))
OBJS := $(patsubst %.cpp, obj/%.o, $(OBJS))

# Specify list of directories that `make' should search for prerequisite files
VPATH = $(BINDIR)

# Set search paths for the specific file types
vpath   %.cpp    base main netlist process utility tests                 \
	               ngspice ngspice/commands ngspice/dialogs ngspice/panels \
	               gnucap  gnucap/commands  gnucap/dialogs  gnucap/panels
vpath   %.o      obj
vpath   test_%   $(BINDIR)

#***************************************************************************************************
# Make these targets
#***************************************************************************************************

all : banner $(OBJS) $(PROG)
	@echo
	@echo "********************** Build process completed **********************"
	@echo

banner :
	@echo
	@echo "*********************** Build gSpiceUI binary ***********************"
	@echo

# Compiler Rules :
#   $<  is the name of the first dependency
#   $@  is the file name of the target
#   -c  compile only, don't link, produces object file ie. <name>.o files
#   -o  place output file in $@

obj/%.o : %.cpp
	$(CXX) -c $(CXXFLAGS) $(INCLUDES) $< -o $@
	@echo

# Linker Rules :
#   -pipe  use pipes rather temporary files for interprocess communications
#   -o     specify the output file name

$(BINDIR)/$(PROG) : $(OBJS)
	$(CXX) -pipe -o $(BINDIR)/$(PROG) obj/*.o $(LIBS)
ifeq ($(ROOT)/GSpiceUI.app,$(wildcard $(ROOT)/GSpiceUI.app))
	cp $(BINDIR)/$(PROG) $(ROOT)/GSpiceUI.app/Contents/MacOS/gspiceui
endif

#***************************************************************************************************
# Include the dependencies file
#***************************************************************************************************

ifeq ($(DEPS),$(wildcard $(DEPS)))
  include $(DEPS)
endif

#***************************************************************************************************
# Create the dependencies file
#***************************************************************************************************

deps :
	$(CXX) -MM -D wxCHECK_VERSION="" -I. *.cpp */*.cpp */*/*.cpp | \
	gawk 'BEGIN {} { printf "%s%s\n", (index($$0," ")!=1 ? "$(OBJDIR)/" : ""), $$0 }' > $(DEPS)

#***************************************************************************************************
# Build the test utilities
#***************************************************************************************************

tests : test_Component test_NetList test_CnvtType test_CmdNgSpiceOPT test_CmdNgSpicePR           \
	      test_CmdNgSpiceDC test_CmdNgSpiceAC test_CmdNgSpiceTR test_CmdGnuCapOPT test_CmdGnuCapPR \
	      test_CmdGnuCapOP  test_CmdGnuCapDC  test_CmdGnuCapAC  test_CmdGnuCapTR  test_CmdGnuCapFO \
	      test_CmdGnuCapGEN test_StrUtils test_AppPnlValue

# Compiler options

test_% : CXXFLAGS  = -Wall -g -pipe $(shell $(WXCFG) --cxxflags)
ifeq ($(GSPICEUI_WXLIB),2.8)  # This suppresses spurious warnings from gcc with wxWidgets v2.8.12
  test_% : CXXFLAGS += -Wno-unused-local-typedefs
endif
test_% : CXXFLAGS += -D $(shell echo $@ | tr "[:lower:]" "[:upper:]")
# Libraries
test_% : LIBS      = $(shell $(WXCFG) --libs core,base)

# Compiler Rules for test utilities :
#   $^  is the names of all the prerequisites
#   $@  is the file name of the target

test_% : %.cpp
	@echo
	$(CXX) $(CXXFLAGS) $(INCLUDES) $^ -o $(BINDIR)/$@ $(LIBS)
	@echo

test_StrUtils      : StrUtils.cpp Component.cpp CnvtType.cpp
test_CnvtType      : CnvtType.cpp
test_Component     : Component.cpp CnvtType.cpp StrUtils.cpp
test_NetList       : NetList.cpp Component.cpp StrUtils.cpp TypeDefs.cpp CnvtType.cpp

test_CmdNgSpiceOPT : CmdNgSpiceOPT.cpp CmdBase.cpp CnvtType.cpp
test_CmdNgSpiceDC  : CmdNgSpiceDC.cpp  CmdBase.cpp CnvtType.cpp
test_CmdNgSpiceAC  : CmdNgSpiceAC.cpp  CmdBase.cpp CnvtType.cpp
test_CmdNgSpiceTR  : CmdNgSpiceTR.cpp  CmdBase.cpp CnvtType.cpp
test_CmdNgSpicePR  : CmdNgSpicePR.cpp  CmdBase.cpp

test_CmdGnuCapOPT  : CmdGnuCapOPT.cpp  CmdBase.cpp CnvtType.cpp
test_CmdGnuCapOP   : CmdGnuCapOP.cpp   CmdBase.cpp CnvtType.cpp
test_CmdGnuCapDC   : CmdGnuCapDC.cpp   CmdBase.cpp CnvtType.cpp
test_CmdGnuCapAC   : CmdGnuCapAC.cpp   CmdBase.cpp CnvtType.cpp
test_CmdGnuCapTR   : CmdGnuCapTR.cpp   CmdBase.cpp CnvtType.cpp
test_CmdGnuCapFO   : CmdGnuCapFO.cpp   CmdBase.cpp CnvtType.cpp
test_CmdGnuCapGEN  : CmdGnuCapGEN.cpp  CmdBase.cpp CnvtType.cpp
test_CmdGnuCapPR   : CmdGnuCapPR.cpp   CmdBase.cpp CnvtType.cpp TypeDefs.cpp StrUtils.cpp \
	                   Component.cpp NetList.cpp

test_AppPnlValue   : AppPnlValue.cpp PnlValue.cpp UnitsBase.cpp ChoUnits.cpp LblUnits.cpp \
	                   PnlTxtSpn.cpp PnlLblTxt.cpp CnvtType.cpp

#***************************************************************************************************
# Install the application
#***************************************************************************************************

install :
	mkdir -p $(DESTDIR)/bin
	cp ../bin/$(PROG) $(DESTDIR)/bin

#***************************************************************************************************
# Uninstall the application
#***************************************************************************************************

uninstall :
	rm -f $(DESTDIR)/bin/$(PROG)
#	rmdir --ignore-fail-on-non-empty $(DESTDIR)/bin

#***************************************************************************************************
# Remove old versions of the main application binary and object files
#***************************************************************************************************

clean :
	rm -f $(BINDIR)/$(PROG) $(OBJDIR)/*.o

#***************************************************************************************************
# Remove old versions of test application binaries
#***************************************************************************************************

cleantests :
	rm -f $(BINDIR)/test_*

#***************************************************************************************************
# Remove old versions of all application binaries
#***************************************************************************************************

cleanall : clean cleantests

#***************************************************************************************************
# Specify phony targets (ie. targets which are not files)
#***************************************************************************************************

.PHONY : banner deps install uninstall clean cleantests

#***************************************************************************************************
