#*************************************************************************************************** # Makefile * # ---------- * # Description : Build system for the GNU SPICE GUI project C++ source files. * # Started : 2003-03-18 * # Last update : 2016-11-06 * # Copyright : (C) 2003-2016 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 and linker CXX = g++ LD = 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 # -std=[C++NO] The C++ standard to use where C++NO is eg. c++98, c++03, c++11, c++14, c++1z, etc. ifeq ($(GSPICEUI_DBG),0) # Options for release (not using -Wall since it's GCC specific) CXXFLAGS := -O3 -pipe $(shell $(WXCFG) --cxxflags) else # Options for development CXXFLAGS := -g -Og -Wall -Wextra -pipe $(shell $(WXCFG) --cxxflags) endif # Suppress warnings not of interest CXXFLAGS += -Wno-unused-parameter -Wno-misleading-indentation # 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. # 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) # Source files #HDRS := $(wildcard *.hpp) $(wildcard */*.hpp) $(wildcard */*/*.hpp) SRCS := $(wildcard *.cpp) $(wildcard */*.cpp) $(wildcard */*/*.cpp) # Objects OBJS := $(SRCS) 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 $(OBJDIR) vpath test_% $(BINDIR) #*************************************************************************************************** # Make these targets #*************************************************************************************************** all : bnr_beg $(OBJS) $(PROG) bnr_end bnr_beg : @echo -e "\n**************************** Build gSpiceUI binary ****************************\n" bnr_end : @echo -e "\n*************************** Build process completed ***************************\n" #*************************************************************************************************** # Rules to make targets #*************************************************************************************************** # 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. .o files # -o place output file in $@ $(OBJDIR)/%.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) $(LD) -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 : @echo -e "\n***************************** Build dependencies ******************************\n" $(CXX) -MM -D wxCHECK_VERSION="" -I. $(SRCS) | \ gawk 'BEGIN {} { printf "%s%s\n", (index($$0," ")!=1 ? "$(OBJDIR)/" : ""), $$0 }' > $(DEPS) @echo -e "\n**************************** Build deps completed *****************************\n" #*************************************************************************************************** # 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_Config test_AppConfig 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_Config : Config.cpp TypeDefs.cpp StrUtils.cpp Component.cpp 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 CnvtType.cpp TypeDefs.cpp StrUtils.cpp \ Component.cpp NetList.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_AppConfig : AppConfig.cpp Config.cpp TypeDefs.cpp StrUtils.cpp Component.cpp CnvtType.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 #*************************************************************************************************** # Check for bugs using cppcheck (a tool for static C/C++ code analysis) #*************************************************************************************************** check : @echo -e "\n************************** Perform static bug check ***************************\n" @cppcheck --enable=all --std=c++11 . @echo -e "\n************************* Static bug check completed **************************\n" #*************************************************************************************************** # Remove old versions of the main application binary and object files #*************************************************************************************************** clean : rm -f $(BINDIR)/$(PROG) $(OBJDIR)/*.o #*************************************************************************************************** # Remove old versions of test utility binaries #*************************************************************************************************** cleantests : rm -f $(BINDIR)/test_* #*************************************************************************************************** # Remove old versions of all application and test utility binaries and object files #*************************************************************************************************** cleanall : clean cleantests #*************************************************************************************************** # Display a help message #*************************************************************************************************** help : @echo @echo -e "gSpiceUI source code build system. " @echo @echo -e "Available make targets :" @echo -e " all - Build the application binary (default)" @echo -e " deps - Create the dependencies file" @echo -e " tests - Build the all test utilities" @echo -e " test_* - Build a particular test utility" @echo -e " install - Install the application binary" @echo -e " uninstall - Uninstall the application binary" @echo -e " check - Check for bugs using cppcheck" @echo -e " clean - Remove the application binary and object files" @echo -e " cleantests - Remove the test utility binaries" @echo -e " cleanall - Remove the application and test utility binaries and object files" @echo -e " help - Display this message" @echo #*************************************************************************************************** # Specify phony targets (ie. targets which are not files) #*************************************************************************************************** .PHONY : bnr_beg bnr_end deps install uninstall check clean cleantests help #***************************************************************************************************