################################################################
# Makefile for building: PhysGeo
# makefile for my PhD thesis                                   
# Created by Michal Buday, no copyrights                       
################################################################
SHELL    := /bin/sh
SRC      := src
PYSRC    := pysrc
INCLUDE  := include
BIN      := bin

CC       := gcc           # GNU C   compiler
CXX      := g++           # GNU C++ compiler
CXXFLAGS := -pipe -fopenmp -lhdf5 -larmadillo -Wno-unused-variable -g -std=gnu++17 -Wall -W 
             # -fopenmp  www.openmp.org
             # -larmadillo arma.sourceforge.net/

QTFLAGS := -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB 
QTFLAGS += -I../PhysGeo -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -isystem /usr/include/libdrm -I/usr/lib64/qt5



OPT      := -std=c++17 -O3 -g
#OPT      := -O3 -fopenmp
# GGG      := -g # for debugging
                 # bash$ gdb ${program name} core
# ===============================================================================================
# standard stuff

LIBOBJ := ggfm.o \
	geodetic_functions.o \
	3dtransformations.o \
	tess_taylor_coeff.o \
	physical_constants.o \
	loadpoints.o \
	itrf2etrf.o \
	interpolations.o \
	geodetic_sphere.o \
	dms.o \
	tesseroid.o \
	fnalfs.o \
        points.o \
	timer.o \
	isgemgeoid.o \
        progressbar.o \
        my_vector.o \
        gaussquad.o \
        raster.o \
        jtsketrs.o \
        my_parser.o



LIBOBJ := $(addprefix $(BIN)/,$(LIBOBJ))

SOURCES := src/ggfm.cpp \
	src/geodetic_functions.cpp \
	src/3dtransformations.cpp \
	src/tess_taylor_coeff.cpp \
	src/physical_constants.cpp \
	src/loadpoints.cpp \
	src/itrf2etrf.cpp \
	src/interpolations.cpp \
	src/geodetic_sphere.cpp \
	src/dms.cpp \
	src/tesseroid.cpp \
	src/fnalfs.cpp \
        src/points.cpp \
	src/timer.cpp \
	src/isgemgeoid.cpp \
        src/progressbar.cpp \
        src/my_vector.cpp \
        src/gaussquad.cpp \
        src/raster.cpp \
        src/jtsketrs.cpp \
        src/my_parser.cpp

DIST :=         /usr/lib64/qt5/mkspecs/features/spec_pre.prf \
		/usr/lib64/qt5/mkspecs/common/unix.conf \
		/usr/lib64/qt5/mkspecs/common/linux.conf \
		/usr/lib64/qt5/mkspecs/common/sanitize.conf \
		/usr/lib64/qt5/mkspecs/common/gcc-base.conf \
		/usr/lib64/qt5/mkspecs/common/gcc-base-unix.conf \
		/usr/lib64/qt5/mkspecs/common/g++-base.conf \
		/usr/lib64/qt5/mkspecs/common/g++-unix.conf \
		/usr/lib64/qt5/mkspecs/qconfig.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_accessibility_support_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_bootstrap_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_concurrent.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_concurrent_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_core.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_core_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_dbus.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_dbus_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_edid_support_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_egl_support_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_fb_support_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_glx_support_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_gui.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_gui_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_input_support_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_kms_support_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_network.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_network_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_opengl.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_opengl_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_openglextensions.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_openglextensions_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_printsupport.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_printsupport_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_service_support_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_sql.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_sql_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_testlib.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_testlib_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_theme_support_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_widgets.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_widgets_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_xml.pri \
		/usr/lib64/qt5/mkspecs/modules/qt_lib_xml_private.pri \
		/usr/lib64/qt5/mkspecs/features/qt_functions.prf \
		/usr/lib64/qt5/mkspecs/features/qt_config.prf \
		/usr/lib64/qt5/mkspecs/linux-g++/qmake.conf \
		/usr/lib64/qt5/mkspecs/features/spec_post.prf \
		.qmake.stash \
		/usr/lib64/qt5/mkspecs/features/exclusive_builds.prf \
		/usr/lib64/qt5/mkspecs/features/toolchain.prf \
		/usr/lib64/qt5/mkspecs/features/default_pre.prf \
		/usr/lib64/qt5/mkspecs/features/resolve_config.prf \
		/usr/lib64/qt5/mkspecs/features/default_post.prf \
		/usr/lib64/qt5/mkspecs/features/qml_debug.prf \
		/usr/lib64/qt5/mkspecs/features/warn_on.prf \
		/usr/lib64/qt5/mkspecs/features/qt.prf \
		/usr/lib64/qt5/mkspecs/features/resources.prf \
		/usr/lib64/qt5/mkspecs/features/moc.prf \
		/usr/lib64/qt5/mkspecs/features/unix/opengl.prf \
		/usr/lib64/qt5/mkspecs/features/uic.prf \
		/usr/lib64/qt5/mkspecs/features/unix/thread.prf \
		/usr/lib64/qt5/mkspecs/features/qmake_use.prf \
		/usr/lib64/qt5/mkspecs/features/file_copies.prf \
		/usr/lib64/qt5/mkspecs/features/testcase_targets.prf \
		/usr/lib64/qt5/mkspecs/features/exceptions.prf \
		/usr/lib64/qt5/mkspecs/features/yacc.prf \
		/usr/lib64/qt5/mkspecs/features/lex.prf \


.PHONY: all
all: $(LIBOBJ)
########################
# Building executables #
########################

main_ggfm.bin: main_ggfm.cpp include/physical_constants.h
	$(CXX) $(CXXFLAGS) $< $(LIBOBJ) -o $@

main_isgem.bin: main_isgem.cpp include/physical_constants.h
	$(CXX) $(CXXFLAGS) $< $(LIBOBJ) -o $@

main_jtsk.bin: main_jtsk.cpp include/physical_constants.h
	$(CXX) $(CXXFLAGS) $< $(LIBOBJ) -o $@

main.bin: main.cpp include/physical_constants.h
	$(CXX) $(CXXFLAGS)$(QTFLAGS) $< $(LIBOBJ) -o $@

######################
# Building libraries #
######################
$(BIN)/ggfm.o: src/ggfm.cpp include/ggfm.h \
		include/geodetic_functions.h \
		include/physical_constants.h \
		include/fnalfs.h
	$(CXX) -c $(CXXFLAGS) -o $@ src/ggfm.cpp

$(BIN)/geodetic_functions.o: src/geodetic_functions.cpp include/geodetic_functions.h \
		include/physical_constants.h
	$(CXX) -c $(CXXFLAGS) -o $@ src/geodetic_functions.cpp

$(BIN)/3dtransformations.o: src/3dtransformations.cpp include/3dtransformations.h
	$(CXX) -c $(CXXFLAGS) -o $@ src/3dtransformations.cpp

$(BIN)/tess_taylor_coeff.o: src/tess_taylor_coeff.cpp include/tess_taylor_coeff.h
	$(CXX) -c $(CXXFLAGS) -o $@ src/tess_taylor_coeff.cpp

$(BIN)/physical_constants.o: src/physical_constants.cpp include/physical_constants.h
	$(CXX) -c $(CXXFLAGS) -o $@ src/physical_constants.cpp

$(BIN)/loadpoints.o: src/loadpoints.cpp include/loadpoints.h
	$(CXX) -c $(CXXFLAGS) -o $@ src/loadpoints.cpp

$(BIN)/itrf2etrf.o: src/itrf2etrf.cpp include/itrf2etrf.h
	$(CXX) -c $(CXXFLAGS) -o $@ src/itrf2etrf.cpp

$(BIN)/interpolations.o: src/interpolations.cpp include/interpolations.h \
		include/geodetic_functions.h \
		include/physical_constants.h
	$(CXX) -c $(CXXFLAGS) -o $@ src/interpolations.cpp

$(BIN)/geodetic_sphere.o: src/geodetic_sphere.cpp include/geodetic_sphere.h \
		include/dms.h
	$(CXX) -c $(CXXFLAGS) -o $@ src/geodetic_sphere.cpp

$(BIN)/tesseroid.o: src/tesseroid.cpp include/tesseroid.h \
		include/tess_taylor_coeff.h \
		include/physical_constants.h \
		include/geodetic_functions.h
	$(CXX) -c $(CXXFLAGS) -o  $@ src/tesseroid.cpp

$(BIN)/fnalfs.o: src/fnalfs.cpp include/fnalfs.h
	$(CXX) -c $(CXXFLAGS) -o $@ src/fnalfs.cpp

$(BIN)/points.o: src/points.cpp include/points.h
	$(CXX) -c $(CXXFLAGS) -o $@ src/points.cpp

$(BIN)/timer.o: src/timer.cpp include/timer.h
	$(CXX) -c $(CXXFLAGS) -o $@ src/timer.cpp

$(BIN)/isgemgeoid.o: src/isgemgeoid.cpp include/isgemgeoid.h
	$(CXX) -c $(CXXFLAGS) -o $@ src/isgemgeoid.cpp

$(BIN)/dms.o: src/dms.cpp include/dms.h
	$(CXX) -c $(CXXFLAGS) -o $@ src/dms.cpp

$(BIN)/progressbar.o: src/progressbar.cpp include/progressbar.h
	$(CXX) -c $(CXXFLAGS) -o $@ src/progressbar.cpp

$(BIN)/my_vector.o: src/my_vector.cpp include/my_vector.h
	$(CXX) -c $(CXXFLAGS) -o $@ src/my_vector.cpp

$(BIN)/gaussquad.o: src/gaussquad.cpp include/gaussquad.h
	$(CXX) -c $(CXXFLAGS) -o $@ src/gaussquad.cpp

$(BIN)/raster.o: src/raster.cpp include/raster.h
	$(CXX) -c $(CXXFLAGS) -o $@ src/raster.cpp

$(BIN)/jtsketrs.o: src/jtsketrs.cpp include/jtsketrs.h
	$(CXX) -c $(CXXFLAGS) -o $@ src/jtsketrs.cpp

$(BIN)/my_parser.o: src/my_parser.cpp include/my_parser.h
	$(CXX) $(QTFLAGS) -c $(CXXFLAGS) -o $@ src/my_parser.cpp


#################
# Cleaning crew #
#################
.PHONY: clean
clean:
	rm -f $(BIN)/*.o *.o
	rm -f $(SRC)/*.save
	rm -f *.save
	rm -f $(PYSRC)/*.pyc

.PHONY: clean_bin
clean_bin:
	rm -f *.bin
