# PLEASE adhere to the alphabetical ordering in this Makefile!
# Also indentation by a single tab

MOSTLYCLEANFILES =
lib_LTLIBRARIES =
noinst_LTLIBRARIES =
bin_PROGRAMS =

include Actions/Makefile.am
include Analysis/Makefile.am
include Element/Makefile.am
include Fragmentation/Makefile.am
include Graph/Makefile.am
include Helpers/Makefile.am
include Parser/Makefile.am
include RandomNumbers/Makefile.am
include Shapes/Makefile.am
include UIElements/Makefile.am

AM_LDFLAGS = -ldl ${BOOST_LDFLAGS}
AM_CPPFLAGS = ${BOOST_CPPFLAGS} ${CodePatterns_CFLAGS}

ATOMSOURCE = \
  atom.cpp \
  AtomicInfo.cpp \
  atom_atominfo.cpp \
  atom_bondedparticle.cpp \
  atom_bondedparticleinfo.cpp \
  atom_graphnode.cpp \
  atom_graphnodeinfo.cpp \
  atom_observable.cpp \
  atom_particleinfo.cpp
ATOMHEADER = \
  atom.hpp \
  atom_atominfo.hpp \
  atom_bondedparticle.hpp \
  atom_bondedparticleinfo.hpp \
  atom_graphnode.hpp \
  atom_graphnodeinfo.hpp \
  atom_observable.hpp \
  atom_particleinfo.hpp \
  AtomicInfo.hpp \
  AtomSet.hpp

BONDSOURCE = \
	Bond/bond.cpp \
	Bond/GraphEdge.cpp

BONDHEADER = \
	Bond/bond.hpp \
	Bond/GraphEdge.hpp

DESCRIPTORSOURCE = \
	Descriptors/AtomDescriptor.cpp \
  Descriptors/AtomIdDescriptor.cpp \
  Descriptors/AtomOfMoleculeSelectionDescriptor.cpp \
  Descriptors/AtomSelectionDescriptor.cpp \
  Descriptors/AtomShapeDescriptor.cpp \
  Descriptors/AtomTypeDescriptor.cpp \
  Descriptors/MoleculeDescriptor.cpp \
  Descriptors/MoleculeFormulaDescriptor.cpp \
  Descriptors/MoleculeIdDescriptor.cpp \
  Descriptors/MoleculeNameDescriptor.cpp \
  Descriptors/MoleculeOfAtomSelectionDescriptor.cpp \
  Descriptors/MoleculeOrderDescriptor.cpp \
  Descriptors/MoleculePtrDescriptor.cpp \
  Descriptors/MoleculeSelectionDescriptor.cpp
				   

DESCRIPTORHEADER = \
	Descriptors/AtomDescriptor.hpp \
  Descriptors/AtomIdDescriptor.hpp \
  Descriptors/AtomOfMoleculeSelectionDescriptor.hpp \
  Descriptors/AtomSelectionDescriptor.hpp \
  Descriptors/AtomShapeDescriptor.hpp \
  Descriptors/AtomTypeDescriptor.hpp \
  Descriptors/DescriptorBase.hpp \
  Descriptors/MoleculeDescriptor.hpp \
  Descriptors/MoleculeFormulaDescriptor.hpp \
  Descriptors/MoleculeIdDescriptor.hpp \
  Descriptors/MoleculeNameDescriptor.hpp \
  Descriptors/MoleculeOfAtomSelectionDescriptor.hpp \
  Descriptors/MoleculeOrderDescriptor.hpp \
  Descriptors/MoleculePtrDescriptor.hpp \
  Descriptors/MoleculeSelectionDescriptor.hpp \
  Descriptors/SelectiveIterator.hpp
  
DESCRIPTORIMPLHEADER = \
	Descriptors/AtomDescriptor_impl.hpp \
  Descriptors/AtomIdDescriptor_impl.hpp \
  Descriptors/AtomOfMoleculeSelectionDescriptor_impl.hpp \
  Descriptors/AtomSelectionDescriptor_impl.hpp \
  Descriptors/AtomShapeDescriptor_impl.hpp \
  Descriptors/AtomTypeDescriptor_impl.hpp \
  Descriptors/DescriptorBase_impl.hpp \
  Descriptors/MoleculeDescriptor_impl.hpp \
  Descriptors/MoleculeFormulaDescriptor_impl.hpp \
  Descriptors/MoleculeIdDescriptor_impl.hpp \
  Descriptors/MoleculeNameDescriptor_impl.hpp \
  Descriptors/MoleculeOfAtomSelectionDescriptor_impl.hpp \
  Descriptors/MoleculeOrderDescriptor_impl.hpp \
  Descriptors/MoleculePtrDescriptor_impl.hpp \
  Descriptors/MoleculeSelectionDescriptor_impl.hpp \
  Descriptors/SelectiveIterator_impl.hpp

DYNAMICSSOURCE = \
	Dynamics/MinimiseConstrainedPotential.cpp

DYNAMICSHEADER = \
	Dynamics/LinearInterpolationBetweenSteps.hpp \
	Dynamics/MinimiseConstrainedPotential.hpp \
	Dynamics/OutputTemperature.hpp \
	Dynamics/VerletForceIntegration.hpp

THERMOSTATSOURCE = \
  Thermostats/Berendsen.cpp \
  Thermostats/GaussianThermostat.cpp \
  Thermostats/Langevin.cpp \
  Thermostats/NoseHoover.cpp \
  Thermostats/NoThermostat.cpp \
  Thermostats/Thermostat.cpp \
  Thermostats/Woodcock.cpp

THERMOSTATHEADER = \
  Thermostats/Berendsen.hpp \
  Thermostats/GaussianThermostat.hpp \
  Thermostats/Langevin.hpp \
  Thermostats/NoseHoover.hpp \
  Thermostats/NoThermostat.hpp \
  Thermostats/Thermostat.hpp \
  Thermostats/Woodcock.hpp

TESSELATIONSOURCE = \
  Tesselation/boundary.cpp \
  Tesselation/BoundaryLineSet.cpp \
  Tesselation/BoundaryPointSet.cpp \
  Tesselation/BoundaryPolygonSet.cpp \
  Tesselation/BoundaryTriangleSet.cpp \
  Tesselation/CandidateForTesselation.cpp \
  Tesselation/ellipsoid.cpp \
  Tesselation/tesselation.cpp \
  Tesselation/tesselationhelpers.cpp \
  Tesselation/TesselPoint.cpp \
  Tesselation/triangleintersectionlist.cpp
  
TESSELATIONHEADER = \
  Tesselation/boundary.hpp \
  Tesselation/BoundaryLineSet.hpp \
  Tesselation/BoundaryMaps.hpp \
  Tesselation/BoundaryPointSet.hpp \
  Tesselation/BoundaryPolygonSet.hpp \
  Tesselation/BoundaryTriangleSet.hpp \
  Tesselation/CandidateForTesselation.hpp \
  Tesselation/ellipsoid.hpp \
  IPointCloud.hpp \
  PointCloudAdaptor.hpp \
  Tesselation/tesselation.hpp \
  Tesselation/tesselationhelpers.hpp \
  Tesselation/TesselPoint.hpp \
  Tesselation/triangleintersectionlist.hpp

MOLECUILDERSOURCE = \
  ${ATOMSOURCE} \
  ${BONDSOURCE} \
  ${DESCRIPTORSOURCE} \
  ${DYNAMICSSOURCE} \
  ${THERMOSTATSOURCE} \
  ${TESSELATIONSOURCE} \
  Box.cpp \
  config.cpp \
  ConfigFileBuffer.cpp \
  Formula.cpp \
  linkedcell.cpp \
  MoleculeLeafClass.cpp \
  moleculelist.cpp \
  molecule.cpp \
  molecule_geometry.cpp \
  molecule_graph.cpp \
  ThermoStatContainer.cpp \
  UIElements/UIFactory.cpp \
  version.c \
  World.cpp \
  WorldTime.cpp

MOLECUILDERHEADER = \
  ${ATOMHEADER} \
  ${BONDHEADER} \
  ${DESCRIPTORHEADER} \
  ${DESCRIPTORIMPLHEADER} \
  ${DYNAMICSHEADER} \
  ${THERMOSTATHEADER} \
  ${TESSELATIONHEADER} \
  Box.hpp \
  config.hpp \
  ConfigFileBuffer.hpp \
  Formula.hpp \
  linkedcell.hpp \
  MoleculeLeafClass.hpp \
  molecule.hpp \
  ThermoStatContainer.hpp \
  types.hpp \
  UIElements/UIFactory.hpp \
  version.h \
  World.hpp \
  World_calculations.hpp \
  WorldTime.hpp

noinst_LTLIBRARIES += libMolecuilder.la
libMolecuilder_la_includedir = $(includedir)/MoleCuilder/

nobase_libMolecuilder_la_include_HEADERS = ${MOLECUILDERHEADER}

## Define the source file list for the "libexample-@MOLECUILDER_API_VERSION@.la"
## target.  Note that @MOLECUILDER_API_VERSION@ is not interpreted by Automake and
## will therefore be treated as if it were literally part of the target name,
## and the variable name derived from that.
## The file extension .cc is recognized by Automake, and makes it produce
## rules which invoke the C++ compiler to produce a libtool object file (.lo)
## from each source file.  Note that it is not necessary to list header files
## which are already listed elsewhere in a _HEADERS variable assignment.
libMolecuilder_la_SOURCES = ${MOLECUILDERSOURCE}

## Instruct libtool to include ABI version information in the generated shared
## library file (.so).  The library ABI version is defined in configure.ac, so
## that all version information is kept in one place.
#libMolecuilder_la_LDFLAGS = -version-info $(MOLECUILDER_SO_VERSION)

## The generated configuration header is installed in its own subdirectory of
## $(libdir).  The reason for this is that the configuration information put
## into this header file describes the target platform the installed library
## has been built for.  Thus the file must not be installed into a location
## intended for architecture-independent files, as defined by the Filesystem
## Hierarchy Standard (FHS).
## The nodist_ prefix instructs Automake to not generate rules for including
## the listed files in the distribution on 'make dist'.  Files that are listed
## in _HEADERS variables are normally included in the distribution, but the
## configuration header file is generated at configure time and should not be
## shipped with the source tarball.
libMolecuilder_la_libincludedir = $(libdir)/MoleCuilder/include
nodist_libMolecuilder_la_libinclude_HEADERS = $(top_builddir)/libmolecuilder_config.h

## Install the generated pkg-config file (.pc) into the expected location for
## architecture-dependent package configuration information.  Occasionally,
## pkg-config files are also used for architecture-independent data packages,
## in which case the correct install location would be $(datadir)/pkgconfig.
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = $(top_builddir)/MoleCuilder.pc


INCLUDES = -I$(top_srcdir)/src/unittests -I$(top_srcdir)/src/Actions -I$(top_srcdir)/src/UIElements -I$(top_srcdir)/LinearAlgebra/src

noinst_LIBRARIES = libmenu.a
bin_PROGRAMS += molecuilder molecuildergui joiner analyzer
EXTRA_PROGRAMS = unity

molecuilderdir = ${bindir}

libmenu_a_SOURCES = ${UISOURCE} ${UIHEADER} 

molecuilder_DATA = Element/elements.db Element/valence.db Element/orbitals.db Element/Hbonddistance.db Element/Hbondangle.db

molecuilder_CXXFLAGS = $(AM_CPPFLAGS) 
#molecuilder_CXXFLAGS += -DNO_CACHING
molecuilder_LDFLAGS = $(AM_LDFLAGS) $(BOOST_FILESYSTEM_LDFLAGS) $(BOOST_PROGRAM_OPTIONS_LDFLAGS) $(BOOST_RANDOM_LDFLAGS) $(BOOST_SYSTEM_LDFLAGS) $(BOOST_THREAD_LDFLAGS)
molecuilder_SOURCES = builder.cpp builder_init.cpp builder_init.hpp
molecuilder_LDADD = \
	libMolecuilderUI.la \
	$(top_builddir)/LinearAlgebra/src/LinearAlgebra/libLinearAlgebra.la \
	${CodePatterns_LIBS} \
	$(BOOST_THREAD_LIBS) \
	$(BOOST_PROGRAM_OPTIONS_LIBS) \
	$(BOOST_RANDOM_LIBS) \
	$(BOOST_SYSTEM_LIBS) \
	$(BOOST_FILESYSTEM_LIBS)

#Stuff for building the GUI using Qt
molecuildergui_SOURCES = builder.cpp builder_init.cpp builder_init.hpp
molecuildergui_CXXFLAGS = $(AM_CPPFLAGS) -DUSE_GUI_QT
molecuildergui_LDFLAGS = $(AM_LDFLAGS) $(BOOST_FILESYSTEM_LDFLAGS) $(BOOST_PROGRAM_OPTIONS_LDFLAGS) $(BOOST_SYSTEM_LDFLAGS) $(BOOST_THREAD_LDFLAGS)
molecuildergui_LDADD = \
	libMolecuilderQtUI.la \
	libMolecuilderUI.la \
	$(top_builddir)/LinearAlgebra/src/LinearAlgebra/libLinearAlgebra.la \
	${CodePatterns_LIBS} \
	$(BOOST_THREAD_LIBS) \
	$(BOOST_PROGRAM_OPTIONS_LIBS) \
	$(BOOST_RANDOM_LIBS) \
	$(BOOST_SYSTEM_LIBS) \
	$(BOOST_FILESYSTEM_LIBS) \
	$(GUI_LIBS)

joiner_SOURCES = Fragmentation/joiner.cpp Fragmentation/datacreator.cpp Fragmentation/datacreator.hpp
joiner_LDADD = \
	libMolecuilderFragmentation.la \
	libMolecuilderHelpers.la \
	libMolecuilderElement.la \
	$(top_builddir)/LinearAlgebra/src/LinearAlgebra/libLinearAlgebra.la \
	${CodePatterns_LIBS} \
	$(BOOST_THREAD_LIBS)

analyzer_SOURCES = Fragmentation/analyzer.cpp Fragmentation/datacreator.cpp Fragmentation/datacreator.hpp
analyzer_LDADD = \
	libMolecuilderFragmentation.la \
	libMolecuilderHelpers.la \
	libMolecuilderElement.la \
	$(top_builddir)/LinearAlgebra/src/LinearAlgebra/libLinearAlgebra.la \
	${CodePatterns_LIBS} \
	$(BOOST_THREAD_LIBS)

unity_SOURCES = unity.cpp
unity_LDADD = \
	${CodePatterns_LIBS} \
	$(BOOST_THREAD_LIBS) \
	$(BOOST_PROGRAM_OPTIONS_LIBS) \
	$(BOOST_RANDOM_LIBS) \
	$(BOOST_SYSTEM_LIBS) \
	$(BOOST_FILESYSTEM_LIBS)


FORCE:
$(srcdir)/.git-version: FORCE
	@if (test -d $(top_srcdir)/.git && cd $(srcdir) \
	     && { git describe --dirty --always || git describe; } ) > .git-version-t 2>/dev/null \
	  && ! diff .git-version-t $(srcdir)/.git-version >/dev/null 2>&1; then \
	  mv -f .git-version-t $(srcdir)/.git-version; \
	else \
	  rm -f .git-version-t; \
	fi

EXTRA_DIST = $(srcdir)/.git-version $(molecuilder_DATA)

$(srcdir)/version.c: $(srcdir)/.git-version
	echo "const char *MOLECUILDERVERSION = \"$(PACKAGE_NAME) version "`cat $(srcdir)/.git-version`"\";" > $@


unity.cpp: ${MOLECUILDERSOURCE} ${MOLECUILDERHEADER}
	echo "#include \"$(srcdir)/Helpers/MemDebug.cpp\"" >  unity.cpp; \
	list='$(MOLECUILDERSOURCE)'; for file in $$list; do \
  	echo "#include \"$(srcdir)/$$file\"" >> unity.cpp; \
	done; \
	subdirs='$(SUBDIRS)';for directory in $$subdirs; do\
		olddir=$$PWD;\
		cd $$directory && make unity.cpp;\
		cd $$olddir;\
		echo "#include \"$$directory/unity.cpp\"" >> unity.cpp;\
	done;\
	echo "#include \"$(srcdir)/builder.cpp\"" >> unity.cpp;
	echo "#include \"$(srcdir)/version.c\"" >> unity.cpp;

MOSTLYCLEANFILES += unity.cpp

