# - Geant4 CMake Configuration File for External Projects
# This file is configured by Geant4 for use by an external project
# As this file is configured by Geant4's CMake system it SHOULD NOT BE EDITED
# It defines the following variables
#  Geant4_INCLUDE_DIRS - include directories for Geant4
#  Geant4_DEFINITIONS  - compile definitions needed to use Geant4
#  Geant4_LIBRARIES    - libraries to link against
#  Geant4_CXX_FLAGS    - Recommended CXX flags for the compiler used to
#                        build the Geant4 libraries.
#  Geant4_CXX_FLAGS_<CONFIG> - Recommended CXX flags for build mode CONFIG.
#  Geant4_USE_FILE     - path to a CMake module which may be included to help
#                        setup CMake variables 
#
# You may supply a version number through find_package which will be checked
# against the version of this build. Standard CMake logic is used so that
# the EXACT flag may be passed, and otherwise this build will report itself
# as compatible with the requested version if:
#
#  VERSION_OF_THIS_BUILD >= VERSION_REQUESTED
#
# By default only the core (or kernel) of Geant4 is activated by this module.
# You can specify additional components of Geant4 through the COMPONENTS
# argument to find_package. By default, all core libraries of Geant4 are
# appended to the Geant4_LIBRARIES variable. Specifiying additional components
# will enable a check on the existence of these components, with the following
# per component variables being set:
#
#  Geant4_${COMPONENT}_FOUND    TRUE is the Geant4 library "component" was
#                               found
#
#  Geant4_${COMPONENT}_LIBRARY  Contains the library for the specified
#                               "component" IF the component is a library.
#
# In Geant4, components can be optional subcomponents of an always available
# library. In that case there will be no Geant4_{COMPONENT}_LIBRARY variable.
# These non-library components are generally activated by compile definitions, 
# and in these cases the appropriate definition will be added to the
# Geant4_DEFINITIONS component
#
# If you specify components and use the REQUIRED option to find_package, then
# the module will issue a FATAL_ERROR if this build of Geant does not have 
# the requested component(s).
#
# The list of components available generally corresponds to the optional extras
# that Geant4 can be built with and are:
#
#  gdml              (GDML support)
#  g3tog4            (Geant3 geometry call list reader library)
#
#  ui_tcsh           (TCsh Style Application Command Line Interface)
#  ui_win32          (WIN32 Style Application Command Line Interface)
#
#  motif             (Motif-X11/OpenGL Graphical User Interface)
#  qt                (Qt4/OpenGL Graphical User Interface)
#
#  vis_network_dawn  (Client/Server network interface to DAWN visualization)
#  vis_network_vrml  (Client/Server network interface to VRML visualization)
#  vis_opengl_x11    (OpenGL visualization with X11 interface)
#  vis_opengl_win32  (OpenGL visualization with X11 interface)
#  vis_raytracer_x11 (RayTracer visualization with X11 interface)
#  vis_openinventor  (OpenInventor visualization)
#
# In addition, two 'shorthand' components are defined to help activate all
# available User Interface and Visualization drivers:
# 
#  ui_all            (All available UI drivers)
#  vis_all           (All available Vis drivers)
#
# These never result in a FATAL_ERROR, even if the REQUIRED find_package 
# argument is set. This is because these options do not depend on specific
# components being available.
#
# ===========================================================================
# Variables used by this module which can change the default behaviour of
# this module. They need to be set prior to the call to find_package
#
#  Geant4_CONFIG_DEBUG    If set, enable extra messaging output which can be
#                         helpful in debugging and identifying problems with
#                         the configuration.
#
#----------------------------------------------------------------------------

#----------------------------------------------------------------------------
# DEBUG : print out the variables passed via find_package arguments
#
if(Geant4_CONFIG_DEBUG)
  message(STATUS "G4CFG_DEBUG : Geant4_VERSION         = ${Geant4_VERSION}")
  message(STATUS "G4CFG_DEBUG : Geant4_FIND_VERSION    = ${Geant4_FIND_VERSION}")
  message(STATUS "G4CFG_DEBUG : Geant4_FIND_REQUIRED   = ${Geant4_FIND_REQUIRED}")
  message(STATUS "G4CFG_DEBUG : Geant4_FIND_COMPONENTS = ${Geant4_FIND_COMPONENTS}")

  foreach(_cpt ${Geant4_FIND_COMPONENTS})
    message(STATUS "G4CFG_DEBUG : Geant4_FIND_REQUIRED_${_cpt} = ${Geant4_FIND_REQUIRED_${_cpt}}")
  endforeach()

  message(STATUS "G4CFG_DEBUG : Geant4_LIBDEPS_LOADED = ${Geant4_LIBDEPS_LOADED}")
endif()

#-----------------------------------------------------------------------
# Locate ourselves, since all other config files should have been 
# installed alongside us...
#
get_filename_component(_thisdir "${CMAKE_CURRENT_LIST_FILE}" PATH)

#-----------------------------------------------------------------------
# Provide *recommended* compiler flags used by this build of Geant4
# Don't mess with the actual CMAKE_CXX_FLAGS!!!
# It's up to the user what to do with these
#
set(Geant4_CXX_FLAGS " -W -Wall -pedantic -Wno-non-virtual-dtor -Wno-long-long -Wwrite-strings -Wpointer-arith -Woverloaded-virtual -pipe -std=c++98")
set(Geant4_EXE_LINKER_FLAGS "")
set(Geant4_CXX_FLAGS_DEBUG "-g")
set(Geant4_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
set(Geant4_CXX_FLAGS_RELEASE "-O2 -DNDEBUG")
set(Geant4_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")

#-----------------------------------------------------------------------
# Set the base compile definitions required to use Geant4 if the variable
# does not exist (we do this to ensure multiple calls to find_package
# don't overwrite previous invocations)
# Components may append to this
# We set VIS/UI_USE directly here, because for now they are, unfortunately,
# always needed for the Examples. 
# However, they ARE NOT required to use Geant4 itself.
#
if(NOT Geant4_DEFINITIONS)
  set(Geant4_DEFINITIONS -DG4_STORE_TRAJECTORY;-DG4VERBOSE)
endif()

# We set VIS/UI_USE directly here, because for now they are, unfortunately,
# always needed for the Examples. 
# However, they ARE NOT required to use Geant4 itself.
#
if(NOT G4UI_NONE)
  list(APPEND Geant4_DEFINITIONS -DG4UI_USE)
endif()

if(NOT G4VIS_NONE)
  list(APPEND Geant4_DEFINITIONS -DG4VIS_USE)
endif()

#-----------------------------------------------------------------------
# Configure the path to the Geant4 headers, using a relative path if 
# possible. This is only known at CMake time, so we expand a CMake 
# supplied variable.
#

# Geant4 configured for the install with relative paths, so use these
get_filename_component(Geant4_INCLUDE_DIR "${_thisdir}/../../include/Geant4" ABSOLUTE)




#-----------------------------------------------------------------------
# Configure the path(s) to third party headers.
# This is not a perfect solution to recording dependencies on external
# libraries, but it does ensure that users of THIS Geant4 will pick up
# those it was built against.
# Library dependencies are generally handled through the 
# Geant4LibraryDepends file listed below (apart from one exception!)
#
set(Geant4_THIRD_PARTY_INCLUDE_DIRS /home/mice/Grid/MAUS-v3.2.0/third_party/install/include)

#-----------------------------------------------------------------------
# Construct overall include path for using Geant4
#
set(Geant4_INCLUDE_DIRS
    ${Geant4_INCLUDE_DIR}
    ${Geant4_THIRD_PARTY_INCLUDE_DIRS})

#-----------------------------------------------------------------------
# If we have used imported targets for any third party packages, reimport
# them here, BEFORE we try and import the Geant4 targets which are
# linked against them.
# Generally, we try and use a standard find_package, but try and force it
# to find the actual package we were built against.
# THIS IS NOT PERFECT, AS IT CANNOT GUARANTEE A BINARY COMPATIBLE
# PACKAGE IS FOUND.


#-----------------------------------------------------------------------
# Include the file listing all the imported targets.
# (Not needed if used in the same Geant4 project, or if we have run before) 
# This is always installed in the same location as us...
#
if(NOT CMAKE_PROJECT_NAME STREQUAL Geant4)
  if(NOT Geant4_LIBDEPS_LOADED)
    include("${_thisdir}/Geant4LibraryDepends.cmake")
    set(Geant4_LIBDEPS_LOADED 1)
  endif()
endif()

#-----------------------------------------------------------------------
# Setup components.
# THIS SECTION IS VERY ROUGH AND VERY MUCH CUT AND PASTE.
# TODO: INVESTIGATE TIDY UP WITH LESS PROCESSING.
#-----------------------------------------------------------------------
# Many components are simply present as parts of libraries or always built
# but require additional compile definitions.
#
# - GDML
set(Geant4_gdml_FOUND ON)
if(Geant4_gdml_FOUND)
  list(REMOVE_ITEM Geant4_FIND_COMPONENTS gdml)
endif()

# - G3toG4
set(Geant4_g3tog4_FOUND OFF)
if(Geant4_g3tog4_FOUND)
  if(Geant4_FIND_REQUIRED_g3tog4)
    set(_geant4_use_g3tog4_library ON)
  endif()
  list(REMOVE_ITEM Geant4_FIND_COMPONENTS g3tog4)
endif()

# - UI : TCSH
set(Geant4_ui_tcsh_FOUND 1)
if(Geant4_ui_tcsh_FOUND)
  if(Geant4_FIND_REQUIRED_ui_tcsh OR Geant4_FIND_REQUIRED_ui_all)
    list(APPEND Geant4_DEFINITIONS -DG4UI_USE_TCSH)
  endif()
  list(REMOVE_ITEM Geant4_FIND_COMPONENTS ui_tcsh)
endif()

# - UI : win32
set(Geant4_ui_win32_FOUND )
if(Geant4_ui_win32_FOUND)
  if(Geant4_FIND_REQUIRED_ui_win32 OR Geant4_FIND_REQUIRED_ui_all)
    list(APPEND 
      Geant4_DEFINITIONS 
      -DG4INTY_USE_WIN32
      -DG4UI_USE_WIN32
      )
  endif()
  list(REMOVE_ITEM Geant4_FIND_COMPONENTS ui_win32)
endif()

# - Visualization : Network DAWN
set(Geant4_vis_dawn_network_FOUND )
if(Geant4_vis_dawn_network_FOUND)
  if(Geant4_FIND_REQUIRED_vis_dawn_network OR Geant4_FIND_REQUIRED_vis_all)
    list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_DAWN)
  endif()
  list(REMOVE_ITEM Geant4_FIND_COMPONENTS vis_dawn_network)
endif()

# - Visualization : Network VRML
set(Geant4_vis_vrml_network_FOUND )
if(Geant4_vis_vrml_network_FOUND)
  if(Geant4_FIND_REQUIRED_vis_vrml_network OR Geant4_FIND_REQUIRED_vis_all)
    list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_VRML)
  endif()
  list(REMOVE_ITEM Geant4_FIND_COMPONENTS vis_vrml_network)
endif()

#----------------------------------------------------------------------------
# Components which requires slightly more complex setup
#
# - Visualization : RayTracerX
set(Geant4_vis_raytracer_x11_FOUND OFF)
if(Geant4_vis_raytracer_x11_FOUND)
  if(Geant4_FIND_REQUIRED_vis_raytracer_x11 OR Geant4_FIND_REQUIRED_vis_all)
    list(APPEND
      Geant4_DEFINITIONS
      -DG4INTY_USE_XT
      -DG4VIS_USE_RAYTRACERX
      )
  endif()
  list(REMOVE_ITEM Geant4_FIND_COMPONENTS vis_raytracer_x11)
endif()

# - Qt (UI and Vis!)
set(Geant4_qt_FOUND OFF)
if(Geant4_qt_FOUND)
  if(Geant4_FIND_REQUIRED_qt OR Geant4_FIND_REQUIRED_ui_all OR
      Geant4_FIND_REQUIRED_vis_all)
    list(APPEND 
      Geant4_DEFINITIONS 
      -DG4INTY_USE_QT
      -DG4UI_USE_QT
      -DG4VIS_USE_OPENGLQT
      )
    set(_geant4_use_opengl_library ON)
  endif()
  list(REMOVE_ITEM Geant4_FIND_COMPONENTS qt)
endif()

# - Motif (UI and Vis!)
set(Geant4_motif_FOUND OFF)
if(Geant4_motif_FOUND)
  if(Geant4_FIND_REQUIRED_motif OR Geant4_FIND_REQUIRED_ui_all OR
      Geant4_FIND_REQUIRED_vis_all)
    list(APPEND
      Geant4_DEFINITIONS
      -DG4INTY_USE_XT
      -DG4UI_USE_XM
      -DG4VIS_USE_OPENGLXM
      )
    set(_geant4_use_opengl_library ON)
  endif()

  list(REMOVE_ITEM Geant4_FIND_COMPONENTS motif)
endif()

# - OpenGL X11
set(Geant4_vis_opengl_x11_FOUND OFF)
if(Geant4_vis_opengl_x11_FOUND)
  if(Geant4_FIND_REQUIRED_vis_opengl_x11 OR Geant4_FIND_REQUIRED_vis_all)
    list(APPEND
      Geant4_DEFINITIONS
      -DG4INTY_USE_XT
      -DG4VIS_USE_OPENGLX
      )
    set(_geant4_use_opengl_library ON)    
  endif()

  list(REMOVE_ITEM Geant4_FIND_COMPONENTS vis_opengl_x11)
endif()

# - OpenGL Win32
set(Geant4_vis_opengl_win32_FOUND )
if(Geant4_vis_opengl_win32_FOUND)
  if(Geant4_FIND_REQUIRED_vis_opengl_win32 OR Geant4_FIND_REQUIRED_vis_all)
    list(APPEND
      Geant4_DEFINITIONS
      -DG4INTY_USE_WIN32
      -DG4VIS_USE_OPENGLWIN32
      )
    set(_geant4_use_opengl_library ON)    
  endif()

  list(REMOVE_ITEM Geant4_FIND_COMPONENTS vis_opengl_win32)
endif()

# - OpenInventor
set(Geant4_vis_openinventor_FOUND OFF)
if(Geant4_vis_openinventor_FOUND)
  if(Geant4_FIND_REQUIRED_vis_openinventor OR Geant4_FIND_REQUIRED_vis_all)
    if(UNIX AND NOT WIN32)
      list(APPEND Geant4_DEFINITIONS
        -DG4INTY_USE_XT
        -DG4VIS_USE_OI
        -DG4VIS_USE_OIX
        )
    elseif(WIN32)
      list(APPEND Geant4_DEFINITIONS
        -G4INTY_USE_WIN32
        -DG4VIS_USE_OI
        -DG4VIS_USE_OIWIN32
        )
    endif()

    set(_geant4_use_inventor_library ON)
  endif()

  list(REMOVE_ITEM Geant4_FIND_COMPONENTS vis_openinventor)
endif()


#-----------------------------------------------------------------------
# Now perform final configuration of libraries...
# We provide FOUND variables for shared and static but for now we don't 
# allow users to choose - we prefer shared if available, and fallback to 
# static otherwise
#
set(Geant4_shared_FOUND ON)
set(Geant4_static_FOUND OFF)

if(Geant4_shared_FOUND)
  set(_geant4_lib_use_suffix "")
else()
  set(_geant4_lib_use_suffix "-static")
endif()

# The list of libraries probably should be autogenerated, but we hard code
# for now. We don't have to divide the list of shared libraries, but we
# do so for consistency with the way we'll need to do it for static.
# - Always on Vis Components
set(_geant4_internal_libraries
  G4Tree${_geant4_lib_use_suffix}
  G4FR${_geant4_lib_use_suffix} 
  G4GMocren${_geant4_lib_use_suffix}
  G4visHepRep${_geant4_lib_use_suffix}
  G4RayTracer${_geant4_lib_use_suffix}
  G4VRML${_geant4_lib_use_suffix}
  )

# - G4OpenGL if it's requested.
if(_geant4_use_opengl_library)
  list(APPEND _geant4_internal_libraries
    G4OpenGL${_geant4_lib_use_suffix}
    G4gl2ps${_geant4_lib_use_suffix}
    )
  list(APPEND Geant4_DEFINITIONS -DG4VIS_USE_OPENGL)
endif()

# - G4OpenInventor if it's requested.
if(_geant4_use_inventor_library)
  list(APPEND _geant4_internal_libraries
    G4OpenInventor${_geant4_lib_use_suffix}
    )
endif()

# - G3toG4 if it's requested
if(_geant4_use_g3tog4_library)
  set(_geant4_g3tog4_library G3toG4${_geant4_lib_use_suffix})
endif()

# - 'Kernel' libraries
list(APPEND _geant4_internal_libraries
  G4vis_management${_geant4_lib_use_suffix}
  G4modeling${_geant4_lib_use_suffix}
  G4interfaces${_geant4_lib_use_suffix}
  G4persistency${_geant4_lib_use_suffix}
  ${_geant4_g3tog4_library}
  G4analysis${_geant4_lib_use_suffix}
  G4error_propagation${_geant4_lib_use_suffix}
  G4readout${_geant4_lib_use_suffix}
  G4physicslists${_geant4_lib_use_suffix}
  G4run${_geant4_lib_use_suffix}
  G4event${_geant4_lib_use_suffix}
  G4tracking${_geant4_lib_use_suffix}
  G4parmodels${_geant4_lib_use_suffix}
  G4processes${_geant4_lib_use_suffix}
  G4digits_hits${_geant4_lib_use_suffix}
  G4track${_geant4_lib_use_suffix}
  G4particles${_geant4_lib_use_suffix}
  G4geometry${_geant4_lib_use_suffix}
  G4materials${_geant4_lib_use_suffix}
  G4graphics_reps${_geant4_lib_use_suffix}
  G4intercoms${_geant4_lib_use_suffix}
  G4global${_geant4_lib_use_suffix}
  )

# - Any externals built by Geant4
foreach(_extlib G4clhep;G4zlib)
  list(APPEND 
    _geant4_internal_libraries
    ${_extlib}${_geant4_lib_use_suffix}
    )
endforeach()

# - Now set them to Geant4_LIBRARIES
set(Geant4_LIBRARIES ${_geant4_internal_libraries})


#-----------------------------------------------------------------------
# Remove any duplicates from the Geant4_{DEFINITIONS,INCLUDE_DIRS,LIBRARIES}
# variables so that multiple passes append things correctly 
#
list(REMOVE_DUPLICATES Geant4_DEFINITIONS)
list(REMOVE_DUPLICATES Geant4_INCLUDE_DIRS)
list(REMOVE_DUPLICATES Geant4_LIBRARIES)

#-----------------------------------------------------------------------
# Point the user to the UseGeant4.cmake file which they may wish to include
# to help them with setting up Geant4
#
set(Geant4_USE_FILE ${_thisdir}/UseGeant4.cmake)

#-----------------------------------------------------------------------
# Finally, handle any remaining components.
# We should have dealt with all available components above, except for 
# ui_all and vis_all, and removed them from the list of FIND_COMPONENTS 
# so any left  we either didn't find or don't know about. Emit a warning 
# if REQUIRED isn't set, or FATAL_ERROR otherwise
#
list(REMOVE_DUPLICATES Geant4_FIND_COMPONENTS)
list(REMOVE_ITEM Geant4_FIND_COMPONENTS ui_all vis_all)

foreach(_remaining ${Geant4_FIND_COMPONENTS})
  if(Geant4_FIND_REQUIRED)
    message(FATAL_ERROR "Geant4 component ${_remaining} not found")
  elseif(NOT Geant4_FIND_QUIETLY)
    message(WARNING " Geant4 component ${_remaining} not found")
  endif()
  unset(Geant4_FIND_REQUIRED_${_remaining})
endforeach()

# And we should be done...