# *********************************
# ************ cmake **************
# *********************************
CMAKE_MINIMUM_REQUIRED(VERSION 3.1 FATAL_ERROR)
CMAKE_POLICY(SET CMP0043 NEW)
CMAKE_POLICY(SET CMP0048 NEW)

# TARGET_SOURCES requires v3.1

# Enable debug symbols by default
# must be done before project() statement
SET(CMAKE_BUILD_TYPE_INIT Release)
# (you can also set it on the command line: -D CMAKE_BUILD_TYPE=Release)

# Enable CLANG as default compilers, to change this use
# cmake -DCMAKE_C_COMPILER=cc -DCMAKE_CXX_COMPILER=c++
# Note that if compilers are switched on the fly,
# the cache is deleted
IF(NOT DEFINED CMAKE_C_COMPILER)
	FIND_PROGRAM(CMAKE_C_COMPILER   NAMES $ENV{CC}  clang   gcc cc  PATHS ENV PATH NO_DEFAULT_PATH DOC "C Compiler")
ENDIF()
IF(NOT DEFINED CMAKE_CXX_COMPILER)
	FIND_PROGRAM(CMAKE_CXX_COMPILER NAMES $ENV{CXX} clang++ g++ c++ PATHS ENV PATH NO_DEFAULT_PATH DOC "C++ Compiler")
ENDIF()

#SET(CMAKE_VERBOSE_MAKEFILE ON)

# To check for an include file you do this:
#CHECK_INCLUDE_FILE("stdint.h"        HAVE_STDINT_H)
# To check the size of a primitive type:
#CHECK_TYPE_SIZE("int"   SIZEOF_INT)

# *********************************
# ************ Project ************
# *********************************

STRING(TIMESTAMP VERSION %y.%U.%w.%H UTC)

MESSAGE(STATUS "Cmake V${CMAKE_VERSION}")
MESSAGE(STATUS "Mars V${VERSION}")

PROJECT(mars VERSION ${VERSION})

INCLUDE(GNUInstallDirs)

IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
    SET(GCC_MIN 4.4.7)
    IF (CMAKE_C_COMPILER_VERSION VERSION_LESS GCC_MIN OR
	CMAKE_CXX_COMPILER_VERSION VERSION_LESS GCC_MIN)
        MESSAGE(FATAL_ERROR "\n  gcc/g++ ${GCC_MIN} or higher is required.\n  You are running version ${CMAKE_C_COMPILER_VERSION}/${CMAKE_CXX_COMPILER_VERSION}.")
    ENDIF()
ELSEIF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
    SET(CLANG_MIN 3.5)
    IF (CMAKE_C_COMPILER_VERSION VERSION_LESS CLANG_MIN OR
        CMAKE_CXX_COMPILER_VERSION VERSION_LESS CLANG_MIN)
        MESSAGE(FATAL_ERROR "\n  clang/clang++ ${CLANG_MIN} or higher is required.\n  You are running version ${CMAKE_C_COMPILER_VERSION}/${CMAKE_CXX_COMPILER_VERSION}.")
    ENDIF()
ELSE()
    MESSAGE(WARNING "You are using an unsupported compiler! Compilation has only been tested only with clang/clang++ and gcc/g++.")
ENDIF()

# ======== For config.h.in =========
SET(PACKAGE_MAINTAINER "Thomas Bretz")
SET(PACKAGE_BUGREPORT  "tbretz@physik.rwth-aachen.de")
SET(PACKAGE_URL        "https://www.fact-project.org")

FIND_PROGRAM(LSB_RELEASE_EXE NAMES lsb_release)
IF (DEFINED LSB_RELEASE_EXE)
   EXECUTE_PROCESS(COMMAND ${LSB_RELEASE_EXE} -d OUTPUT_VARIABLE LSB_RELEASE OUTPUT_STRIP_TRAILING_WHITESPACE)
   MESSAGE(STATUS ${LSB_RELEASE})
ENDIF()

# *********************************
# ********* Requirements **********
# *********************************

# Inlclude the main source AND build dir itself
#SET(CMAKE_INCLUDE_CURRENT_DIR ON)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)

# =========== help2man ============
FIND_PROGRAM(HELP2MAN_EXECUTABLE help2man)

# =========== pkg-config ============
FIND_PACKAGE(PkgConfig)
FIND_PACKAGE(PackageHandleStandardArgs)


# ============= libnova ==============

PKG_CHECK_MODULES(Nova QUIET Nova)

# Try to locate the package in the default path
# and in the path provided by pkg-config
FIND_PATH(NOVA_INCLUDE_DIR NAMES libnova/libnova.h PATHS ${NOVA_INCLUDE_DIRS})
FIND_LIBRARY(NOVA_LIBRARY NAMES nova PATHS ${NOVA_LIBRARY_DIRS})

# Check if NOVA_LIBARARY and NOVA_INCLUDE_DIR is set
# Print a message otherwise
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Nova DEFAULT_MSG NOVA_LIBRARY NOVA_INCLUDE_DIR)

# Mark those variables to be displayed as 'advanced' in the GUI
MARK_AS_ADVANCED(NOVA_LIBRARY NOVA_INCLUDE_DIR)

# handle success
FIND_PACKAGE_MESSAGE(NovaInc "Found Nova headers in ${NOVA_INCLUDE_DIR}" "[${NOVA_LIBRARY}][${NOVA_INCLUDE_DIR}]")

IF(NOT NOVA_FOUND)
     MESSAGE(WARNING "You are compiling without support for libnova!")
ENDIF()


# ============== libz ================

FIND_PACKAGE(ZLIB REQUIRED)

# *********************************
# **********   HEAL Pix  **********
# *********************************

SET(HEALPIX_PREFIX "${CMAKE_SOURCE_DIR}/RootHealPix" CACHE FILEPATH "Base path to the RootHealPix code.")

IF(EXISTS ${HEALPIX_PREFIX})
   FIND_PACKAGE_MESSAGE(HealPixPrefix "RootHealPix prefix: ${HEALPIX_PREFIX}" "[${HEALPIX_PREFIX}]")
   SET(FOUND_HEALPIX ON)
ENDIF()

# ============== ROOT ================

FIND_PROGRAM(ROOTCONFIG_EXECUTABLE NAMES root-config)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(root-config DEFAULT_MSG ROOTCONFIG_EXECUTABLE)
IF(NOT ROOTCONFIG_EXECUTABLE)
   MESSAGE(FATAL_ERROR "Please make sure `root-config` is accessible in your path. In case of an installation from source, you might need to source\n . [path-to-root]/bin/thisroot.sh")
ENDIF()

# You need to tell CMake where to find the ROOT installation. This can be done in a number of ways:
#   - ROOT built with classic configure/make use the provided $ROOTSYS/etc/cmake/FindROOT.cmake
#   - ROOT built with CMake. Add in CMAKE_PREFIX_PATH the installation prefix for ROOT
IF(EXISTS $ENV{ROOTSYS}/ROOTConfig.cmake)
   IF(NOT DEFINED ENV{CMAKE_PREFIX_PATH})
      LIST(APPEND CMAKE_PREFIX_PATH $ENV{ROOTSYS})
   ENDIF()
ENDIF()
SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "$ENV{ROOTSYS}/etc/cmake")

SET(ROOT_PACKAGES Gui Minuit ASImage HistPainter)
IF(FOUND_HEALPIX)
   SET(ROOT_PACKAGES ${ROOT_PACKAGES} FITSIO)
ENDIF()

#---Locate the ROOT package and defines a number of variables (e.g. ROOT_INCLUDE_DIRS)
#SET(ROOT_CONFIG_DEBUG 1)
FIND_PACKAGE(ROOT REQUIRED COMPONENTS ${ROOT_PACKAGES})

IF(NOT DEFINED ROOT_CONFIG_EXECUTABLE)
   FIND_PACKAGE_MESSAGE(RootFound "Found ROOT: ${ROOT_INCLUDE_DIRS}" "[${ROOT_INCLUDE_DIRS}][${ROOT_LIBRARY_DIR}][${ROOT_VERSION}]")
ENDIF()

#---Define useful ROOT functions and macros (e.g. ROOT_GENERATE_DICTIONARY)
FIND_PACKAGE_MESSAGE(RootInclude "Setup ROOT: [${ROOT_VERSION}] ${ROOT_USE_FILE}" "[${ROOT_VERSION}][${ROOT_USE_FILE}]")
IF(DEFINED ROOT_USE_FILE)
   INCLUDE(${ROOT_USE_FILE})
ELSE()
   # From RootUseFile.cmake (root 6)
   INCLUDE_DIRECTORIES(${ROOT_INCLUDE_DIRS})
   LINK_DIRECTORIES(${ROOT_LIBRARY_DIR})
   ADD_DEFINITIONS(${ROOT_DEFINITIONS})
   SET(CMAKE_CXX_FLAGS     "${CMAKE_CXX_FLAGS} ${ROOT_CXX_FLAGS}")
   SET(CMAKE_C_FLAGS       "${CMAKE_C_FLAGS} ${ROOT_C_FLAGS}")
   SET(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${ROOT_fortran_FLAGS}")
ENDIF()

# Replace separators to make the version consistent
# (older version might use the '/')
STRING(REPLACE "/" "." ROOT_VERSION ${ROOT_VERSION})

# This happens when root is used from its build directory
# Create the version components manually
IF(ROOT_VERSION AND NOT ROOT_VERSION_MAJOR)
   # Create a list of components
   STRING(REPLACE "." ";" ROOT_VERSION_LIST ${ROOT_VERSION})
   # Split version string
   LIST(GET ROOT_VERSION_LIST 0 ROOT_VERSION_MAJOR)
   LIST(GET ROOT_VERSION_LIST 1 ROOT_VERSION_MINOR)
   LIST(GET ROOT_VERSION_LIST 2 ROOT_VERSION_PATCH)
   # Remove trailing 0's
   STRING(REGEX REPLACE "0+([0-9]+)" "\\1" ROOT_VERSION_MINOR ${ROOT_VERSION_MINOR})
   STRING(REGEX REPLACE "0+([0-9]+)" "\\1" ROOT_VERSION_PATCH ${ROOT_VERSION_PATCH})
ENDIF()

# Is this is a local or a global installation?
IF(DEFINED ENV{ROOTSYS})
   IF(ROOTSYS AND NOT ROOTSYS STREQUAL "$ENV{ROOTSYS}")
      MESSAGE(WARNING
         " \n"
         " ROOT Location changed!\n"
         " Present  ROOTSYS: $ENV{ROOTSYS}\n"
         " Previous ROOTSYS: ${ROOTSYS}")
      FILE(REMOVE thisroot.sh)
      FILE(REMOVE root)
   ENDIF()

   SET(ROOTSYS $ENV{ROOTSYS} CACHE INTERNAL "Internal variable to check for consistency in ROOTSYS")

   # For convenience and easy tracking
   ADD_CUSTOM_COMMAND(OUTPUT thisroot.sh COMMAND ln -sf ${ROOTSYS}/bin/thisroot.sh VERBATIM)
   ADD_CUSTOM_COMMAND(OUTPUT root        COMMAND ln -sf ${ROOTSYS}/bin/root VERBATIM)
   ADD_CUSTOM_TARGET(thisroot ALL DEPENDS thisroot.sh)
   ADD_CUSTOM_TARGET(lnroot   ALL DEPENDS root)
ENDIF()

IF(ROOTVER AND NOT ROOTVER VERSION_EQUAL ROOT_VERSION)
   MESSAGE(WARNING
      " \n"
      " ROOT Version changed!\n"
      " Present:  ${ROOT_VERSION}\n"
      " Previous: ${ROOTVER}")
ENDIF()

SET(ROOTVER ${ROOT_VERSION} CACHE INTERNAL "Internal variable to check for consistency of root version")

IF(ROOT_VERSION VERSION_LESS 6.20)
  SET(ROOT_DICTIONARY_OPTION -p)
ENDIF()



# -lGui -lCore -lCint -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lTree
# -lRint -lPostscript -lMatrix -lPhysics -lMathCore -lThread
# -lASImage -lMinuit -lHistPainter -lThread

#MESSAGE("INCL_DIRS: ${ROOT_INCLUDE_DIRS}")
#MESSAGE("LIBS:      ${ROOT_LIBRARIES}")
#MESSAGE("DEFS:      ${ROOT_DEFINITIONS}")
#MESSAGE("CXXFLAGS:  ${ROOT_CXX_FLAGS}")
#MESSAGE("CXFLAGS:   ${ROOT_CC_FLAGS}")
#MESSAGE("FOUND:     ${ROOT_FOUND}")
#MESSAGE("FILE:      ${ROOT_USE_FILE}")
#MESSAGE("DIR:       ${CMAKE_CURRENT_SOURCE_DIR}")
#ROOT_<library>_LIBRARY	PATH	Full path for each of the ROOT libraries listed in COMPONENTS
#ROOT_<command>_CMD	PATH	Full path for each ROOT executable (rootcling, root, hadd, etc.)
#ROOT_<option>_FOUND	BOOL	True for each enabled build option (e.g. cocoa, python, xrootd, etc.)

# function ROOT_GENERATE_DICTIONARY( dictionary
#                                    header1 header2 ...
#                                    LINKDEF linkdef1 ...
#                                    OPTIONS opt1...)

# *********************************
# ********** Observatory **********
# *********************************

SET(OBSERVATORY "ORM" CACHE STRING "Select the observatory location (ORM, HAWC, SPM, RWTH: see nova.h)")

IF(NOT OBSERVATORY STREQUAL "ORM"  AND
   NOT OBSERVATORY STREQUAL "HAWC" AND
   NOT OBSERVATORY STREQUAL "SPM"  AND
   NOT OBSERVATORY STREQUAL "RWTH")
   MESSAGE(FATAL_ERROR "OBSERVATORY=${OBSERVATORY} invalid. Only ORM, HAWC, SPM and RWTH allowd!")
ENDIF()

FIND_PACKAGE_MESSAGE(PresetObservatory "Preset Observatory: ${OBSERVATORY}" "[${OBSERVATORY}]")


# *********************************
# *********** Compiler ************
# *********************************

SET(CMAKE_CXX_STANDARD 11)
SET(CMAKE_CXX_FLAGS
	"${CMAKE_CXX_FLAGS} -Wall -Winit-self -Wpointer-arith \
         -Wcast-align -Wformat -Woverloaded-virtual \
         -Wnon-virtual-dtor -Wshadow -fPIC") # -Wextra

# /opt/root-6.18.04-bin/include/Bytes.h:72:6: warning: cast from 'char *' to 'UShort_t *'
#       (aka 'unsigned short *') increases required alignment from 1 to 2 [-Wcast-align]
#    *((UShort_t *)buf) = Rbswap_16(x);
#      ^~~~~~~~~~~~~~~

IF(NOT ROOT_VERSION VERSION_LESS 6.18 AND ROOT_VERSION VERSION_LESS 6.23)
   SET(CMAKE_CXX_FLAGS
       "${CMAKE_CXX_FLAGS} -Wno-cast-align")
ENDIF()

SET(CMAKE_CXX_FLAGS
	"${CMAKE_CXX_FLAGS} \
         -DMARSVER=\\\"1.0\\\" -D_REENTRANT -D__MARS__ -D__LINUX__ \
         -DPACKAGE_VERSION=\\\"1.0\\\" -DREVISION=\\\"1.0\\\" \
         -DPACKAGE_NAME=\\\"MARS\\\" -DHAVE_ZLIB")

CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/cmake/root.rc.in"     "${PROJECT_BINARY_DIR}/.rootrc")
CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/cmake/rootlogon.C.in" "${PROJECT_BINARY_DIR}/rootlogon.C")
CONFIGURE_FILE("${PROJECT_SOURCE_DIR}/cmake/dohtml.C.in"    "${PROJECT_BINARY_DIR}/dohtml.C")

# -------------------------------------------------------

FILE(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/dictionary)

MACRO(SRCFILES subdir)

	MESSAGE(STATUS "Reading source list from ${DIR}/Makefile")

 	EXECUTE_PROCESS(COMMAND
		${PROJECT_SOURCE_DIR}/Makefile.extract.sh ${subdir}
	        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/${subdir}
		OUTPUT_VARIABLE _HEADERS)

        SEPARATE_ARGUMENTS(_HEADERS)

        LIST(GET       _HEADERS 0 _CINT)
        LIST(REMOVE_AT _HEADERS 0)

 	SET(_SRCLIST ${_HEADERS})

        STRING(REPLACE "${subdir}/" " "    _HEADERS ${_HEADERS}) # Remove directory
        STRING(REPLACE ".cc"        ".h"   _HEADERS ${_HEADERS}) # change extension
        STRING(REPLACE ".cxx"       ".hxx" _HEADERS ${_HEADERS}) # special for files in mmc

	SEPARATE_ARGUMENTS(_HEADERS)

	# - This adds the rule how the dictionary is created
        ROOT_GENERATE_DICTIONARY(dictionary/${_CINT} ${_HEADERS} ${_CINT}Incl.h LINKDEF ${subdir}/${_CINT}LinkDef.h OPTIONS ${ROOT_DICTIONARY_OPTION} -D__MARS__ -DHAVE_ZLIB)
	# - This makes sure that it is compiled
	TARGET_SOURCES(mars PRIVATE dictionary/${_CINT}.cxx ${_SRCLIST})
	SET_SOURCE_FILES_PROPERTIES(dictionary/${_CINT}.cxx PROPERTIES COMPILE_FLAGS "-Wno-deprecated-register")

        INSTALL(DIRECTORY ${subdir}/ DESTINATION "include" FILES_MATCHING PATTERN "*.h")

        # This is a hack if somebody tries to run root from
        # the compile directory rather than from a package
        # install directory. In this case, the pcm files
        # are not where the library is where they should be
        IF(TARGET ${_CINT})
       	    ADD_CUSTOM_COMMAND(TARGET ${_CINT} POST_BUILD
                COMMAND test -f ../dictionary/${CINT}_rdict.pcm && ln -s ../dictionary/${_CINT}_rdict.pcm ${_CINT}_rdict.pcm || true
            	WORKING_DIRECTORY lib
            	VERBATIM)
        ENDIF()

ENDMACRO()

# -------------------------------------------------------

#SET(DIRECTORIES mmc)

SET(DIRECTORIES
	manalysis
        mastro
        mbadpixels
	mbase
        mcalib
        mcamera
	mcorsika
        mdata
        mdrs
        melectronics
        mextralgo
        mfbase
	mfileio
        mfilter
        mgeom
        mgui
        mhbase
        mhcalib
        mhflux
        mhft
        mhist
        mhvstime
        mimage
        mjobs
        mjoptim
        mjtrain
        mmain
        mmc
        mmovie
        mmuon
        mpedestal
        mpointing
        mranforest
        mraw
        mreport
        msignal
        msim
        msimcamera
        msimreflector
        msql
        mtools
        mtrigger
)

INCLUDE_DIRECTORIES(${DIRECTORIES} mcore .)

IF(NOVA_FOUND)
   INCLUDE_DIRECTORIES(${NOVA_INCLUDE_DIR})
ENDIF()


SET(CORE_HEADERS
	mcore/factofits.h
	mcore/factfits.h
	mcore/DrsCalib.h
	mcore/PixelMap.h
	mcore/Interpolator2D.h
        MIncl.h)

IF(NOVA_FOUND)
    LIST(APPEND CORE_HEADERS mcore/nova.h mcore/Prediction.h)
ENDIF()

ROOT_GENERATE_DICTIONARY(dictionary/Core ${CORE_HEADERS} MIncl.h
        LINKDEF MLinkDef.h
        OPTIONS -p -D__MARS__ -DHAVE_ZLIB)

ADD_LIBRARY(mars SHARED dictionary/Core.cxx) # CMAKE_POSITION_INDEPENDENT_CODE
SET_SOURCE_FILES_PROPERTIES(dictionary/Core.cxx PROPERTIES COMPILE_FLAGS "-Wno-deprecated-register")
TARGET_INCLUDE_DIRECTORIES(mars SYSTEM PUBLIC ${ROOT_INCLUDE_DIRS})

# This is a hack if somebody tries to run root from
# the compile directory rather than from a package
# install directory. In this case, the pcm files
# are not where the library is where they should be
IF(TARGET Core)
    ADD_CUSTOM_COMMAND(TARGET Core POST_BUILD
        COMMAND test -f ../dictionary/Core_rdict.pcm && ln -s ../dictionary/Core_rdict.pcm Core_rdict.pcm || true
    	WORKING_DIRECTORY lib
    	VERBATIM)
ENDIF()


TARGET_LINK_LIBRARIES(mars ZLIB::ZLIB ${ROOT_LIBRARIES})
IF(NOVA_FOUND)
   TARGET_LINK_LIBRARIES(mars ${NOVA_LIBRARY})
ENDIF()

ADD_EXECUTABLE(showplot showplot.cc)
ADD_EXECUTABLE(showlog  showplot.cc)
ADD_EXECUTABLE(ceres    ceres.cc)
TARGET_LINK_LIBRARIES(showplot mars ${ROOT_LIBRARIES})
TARGET_LINK_LIBRARIES(showlog  mars ${ROOT_LIBRARIES})
TARGET_LINK_LIBRARIES(ceres    mars ${ROOT_LIBRARIES})


FOREACH(DIR ${DIRECTORIES})
	SRCFILES(${DIR})
ENDFOREACH()

# -------------------------------------------------------

IF(FOUND_HEALPIX)
   # https://github.com/akira-okumura/RootHealPix.git
   # THealPixD de("name", "", 2); for (int i=0; i<100; i++) de.Fill(gRandom->Uniform()*90, gRandom->Uniform()*180); de.Draw("COLZ");

   #   INCLUDE_DIRECTORIES(${HEALPIX_PREFIX}/include)
   # - The first one is required to make ROOT_GENERATE_DICTIONARY
   #   find absolute paths. The second one is required for
   #   compilation. Note that any later ROOT_GENERALE_DICTIONARY
   #   might find the LinkDef.h in RootHealPix/include
   INCLUDE_DIRECTORIES(/ ${HEALPIX_PREFIX}/include)

   ROOT_GENERATE_DICTIONARY(dictionary/HealPix
	${HEALPIX_PREFIX}/include/Healoption.h
	${HEALPIX_PREFIX}/include/THealAlm.h
	${HEALPIX_PREFIX}/include/THealFFT.h
	${HEALPIX_PREFIX}/include/THealPainter.h
	${HEALPIX_PREFIX}/include/THealPaletteAxis.h
	${HEALPIX_PREFIX}/include/THealPixCube.h
	${HEALPIX_PREFIX}/include/THealPix.h
	${HEALPIX_PREFIX}/include/THealUtil.h
	${HEALPIX_PREFIX}/include/TVirtualHealPainter.h
	LINKDEF ${HEALPIX_PREFIX}/include/LinkDef.h OPTIONS -p)

   # - Define the source files of the library
   ADD_LIBRARY(RootHealPix SHARED dictionary/HealPix.cxx
        ${HEALPIX_PREFIX}/src/THealAlm.cxx
        ${HEALPIX_PREFIX}/src/THealFFT.cxx
        ${HEALPIX_PREFIX}/src/THealPainter.cxx
        ${HEALPIX_PREFIX}/src/THealPaletteAxis.cxx
        ${HEALPIX_PREFIX}/src/THealPixCube.cxx
        ${HEALPIX_PREFIX}/src/THealPix.cxx
        ${HEALPIX_PREFIX}/src/THealUtil.cxx
        ${HEALPIX_PREFIX}/src/TVirtualHealPainter.cxx)

   # - Tweak some warnings
   SET_TARGET_PROPERTIES(RootHealPix PROPERTIES COMPILE_FLAGS
   	"-Wno-unused-variable -Wno-unused-function -Wno-unneeded-internal-declaration -Wno-shadow")

   # - Link with the root libraries for auto-loading
   TARGET_LINK_LIBRARIES(mars RootHealPix)

   # - Install the corresponding header files
   INSTALL(DIRECTORY ${HEALPIX_PREFIX}/include/ DESTINATION "include" FILES_MATCHING PATTERN "*.h")

   # - Install the library
   INSTALL(TARGETS RootHealPix DESTINATION ".")
ENDIF()


# rootlogon.C finds the shared object only if the libmars.so is in the same directory than the dictionary files
# there is a way to create a map file with rootcling - but I haven#t yet fugured out how. Note that a link is not enough
#ADD_CUSTOM_COMMAND(TARGET mars POST_BUILD
#	COMMAND cp -f ${PROJECT_BINARY_DIR}/libmars.so ${PROJECT_BINARY_DIR}/dictionary/libmars.so
#	COMMENT "Copying libmars.so to ${PROJECT_BINARY_DIR}/dictionary")

#---Create a shared library with geneated dictionary
#ADD_LIBRARY(Event SHARED Event.cxx G__Event.cxx)
#TARGET_LINK_LIBRARIES(Event ${ROOT_LIBRARIES})

#---Create  a main program using the library
#ADD_EXECUTABLE(Main MainEvent.cxx)
#TARGET_LINK_LIBRARIES(Main Event)


# *********************************
# ************ Packaging **********
# *********************************

#SET(PKG_SHARE    "${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}")
#SET(PKG_APPS     "${CMAKE_INSTALL_DATAROOTDIR}/applications")
#SET(PKG_PIXMAPS  "${CMAKE_INSTALL_DATAROOTDIR}/pixmaps")

# ====== Installation targets =====

#INSTALL(TARGETS  mars           DESTINATION "${CMAKE_INSTALL_BINDIR}")
INSTALL(TARGETS   mars         DESTINATION ".")
INSTALL(TARGETS   showplot     DESTINATION ".")
INSTALL(TARGETS   showlog      DESTINATION ".")
INSTALL(TARGETS   ceres        DESTINATION ".")
INSTALL(FILES     .rootrc      DESTINATION ".")
INSTALL(DIRECTORY lib          DESTINATION ".")
INSTALL(DIRECTORY macros       DESTINATION "." FILES_MATCHING PATTERN "*.C")
INSTALL(DIRECTORY fact         DESTINATION "." FILES_MATCHING PATTERN "*.C")
INSTALL(DIRECTORY datacenter   DESTINATION ".")
INSTALL(DIRECTORY scripts      DESTINATION ".")
INSTALL(DIRECTORY resources    DESTINATION "." FILES_MATCHING PATTERN "*.rc" PATTERN "*.txt")
INSTALL(DIRECTORY resmc        DESTINATION "." FILES_MATCHING PATTERN "*" )
INSTALL(DIRECTORY mcore/       DESTINATION "include" FILES_MATCHING PATTERN "*.h")


# ======== General packaging ======
# https://cmake.org/cmake/help/latest/module/CPack.html

INCLUDE(InstallRequiredSystemLibraries)

# SET(CPACK_STRIP_FILES ON) # Strip debug sysmbold from files

SET(CPACK_PACKAGE_VERSION       "${mars_VERSION}")
SET(CPACK_PACKAGE_CONTACT       "${PACKAGE_BUGREPORT}")
SET(CPACK_PACKAGE_MAINTAINER    "${PACKAGE_MAINTAINER}")
#SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
#SET(CPACK_PACKAGE_VENDOR "Me, myself, and I")


SET(CPACK_SOURCE_IGNORE_FILES "/old/;/build/;/[.].*/;/autom4te[.]cache/;.*~;.log$")

# Maybe the text displayed in synaptic?
#SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README")
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "MARS - Environment")
#CPACK_RESOURCE_FILE_README     ReadMe file to be embedded in the installer.

SET(CPACK_GENERATOR        TBZ2) # TGZ DEB
#SET(CPACK_SOURCE_GENERATOR TBZ2) # TGZ
#SET(CPACK_PROJECT_CONFIG_FILE ${CMAKE_SOURCE_DIR}/cmake/Package.txt)
#SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/Copyright.txt")


# ======== Debian packaging =======
# https://cmake.org/cmake/help/latest/module/CPackDeb.html
# https://www.debian.org/doc/debian-policy

#SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libao4 (>=1.0), libsfm-system2.3v5 (>=2.3), libsfml-graphicsv2.3v5 (>=2.3), libsfml-audio2.3v5 (>=2.3), libsfm-window2.3v5 (>2.3)")
SET(CPACK_DEBIAN_PACKAGE_SHLIBDEPS 1) # generate better (atomatic?) dependecies
SET(CPACK_DEBIAN_PACKAGE_GENERATE_SHLIBS_POLICY ">=")
SET(CPACK_DEBIAN_PACKAGE_CONTROL_STRICT_PERMISSION TRUE)
SET(CPACK_DEBIAN_PACKAGE_SECTION utils)
SET(CPACK_DEBIAN_PACKAGE_HOMEPAGE "${PACKAGE_URL}")
SET(CPACK_DEBIAN_PACKAGE_DESCRIPTION
"${CPACK_PACKAGE_DESCRIPTION_SUMMARY}
 This package contains the MARS Analysis Environment.")
#indent the long description with spaces

#CPACK_INSTALL_CMAKE_PROJECTS
#List of four values that specify what project to install. Build directory, Project Name, Project Component, Directory.

INCLUDE(CPack)
