#!/bin/sh

#-----------------------------------------------------------------------
# sh config query script for Geant4 11.4.0 on UNIX platforms
# Autogenerated by CMake DO NOT EDIT
#-----------------------------------------------------------------------

#-----------------------------------------------------------------------
# Determine location of this script.
# NB, we don't always use the result of this calculation, but it does not
# hurt to do it. Only possible error is if too long a chain of symbolic
# links are used to point to the physical script.
#
# Resolve symbolic links to script - we should end up with a physical file
script="$0"
calldir=`pwd`
loopcount=""

while [ "x`readlink $script`" != "x" ] ; do
  preloc=`dirname $script`
  script=`readlink $script`

  if [ ${script##/} = ${script##~} ] ; then
    # The symbolic link was relative...
    script="$preloc/$script"
  fi
  loopcount="l$loopcount"

  if [ ${#loopcount} -gt 10 ] ; then
    echo "error: more than 10 symbolic links to geant4-config traversed."
    exit 1
  fi
done

# If we still have a relative path, then it must be relative to the
# calling dir. NB we don't attempt to resolve directory symbolic
# links or remove '.' or '..'
if [ ${script##/} = ${script##~} ] ; then
  script="$calldir/$script"
fi

#-----------------------------------------------------------------------
# Finally, grab the directory in which the script is located
# Used below should we be setup to be relocatable.
scriptloc=`dirname $script`

#-----------------------------------------------------------------------
# Expansion and calculation of all needed variables
#
prefix=$scriptloc/..
# canonicalize path
prefix=`cd "$prefix" 2>/dev/null; pwd -P`

exec_prefix=
libdir=${prefix}/lib
includedirs="${prefix}/include/Geant4"

name="geant4"
description="Geant4 toolkit for the simulation of the passage of particles through matter"
version="11.4.0"

# 'Requires' that may affect cflags and libs.
# Basic flags and libraries for visualization
vis_cflags="-DG4UI_USE_TCSH"

vis_libs="-lG4Tree \
-lG4FR \
-lG4GMocren \
-lG4RayTracer \
-lG4VRML \
-lG4ToolsSG \
-lG4vis_management \
-lG4modeling"

#-----------------------------------------------------------------------
# Core setup...
#
cflags="-W -Wall -pedantic -Wno-non-virtual-dtor -Wno-long-long -Wwrite-strings -Wpointer-arith -Woverloaded-virtual -Wno-variadic-macros -Wshadow -pipe -pthread -ftls-model=global-dynamic -std=c++17"
feature_list=""

# - CXX Standard
geant4_cxx_std="17"

# - static libs
have_staticlibs="no"
feature_list="${feature_list} staticlibs[${have_staticlibs}]"
# No action as yet

# - multithreading
have_multithreading="yes"
feature_list="${feature_list} multithreading[${have_multithreading}]"
if test "x${have_multithreading}" = "xyes" ; then
  geant4_tls_model="global-dynamic"
  if test "x${geant4_tls_model}" = "xauto" ; then
    geant4_tls_model=""
  fi
else
  geant4_tls_model=""
fi

# - smart stacking
have_smartstack="no"
feature_list="${feature_list} smartstack[${have_smartstack}]"
if test "x${have_smartstack}" = "xyes" ; then
  cflags="-DG4_USESMARTSTACK ${cflags}"
fi

# - ParticleHP was built as HP. Pure feature
have_php_as_hp="no"
feature_list="${feature_list} php_as_hp[${have_php_as_hp}]"

# - Includes and Libs
for g4incdir in ${includedirs} ; do
  cflags="${cflags} -I${g4incdir}"
done

libs="-lG4interfaces \
-lG4geomtext \
-lG4mctruth \
-lG4analysis \
-lG4error_propagation \
-lG4readout \
-lG4physicslists \
-lG4run \
-lG4event \
-lG4tracking \
-lG4parmodels \
-lG4processes_hadronic \
-lG4processes_core
-lG4digits_hits \
-lG4track \
-lG4particles \
-lG4geometry \
-lG4materials \
-lG4graphics_reps \
-lG4intercoms \
-lG4global \
"

#-----------------------------------------------------------------------
# - Extra optional features that were enabled.
# - ALL
geant4_uses_opengl="no"
geant4_uses_x11="no"

# - CLHEP
have_clhep="no"
feature_list="${feature_list} clhep[${have_clhep}]"

if test "x${have_clhep}" = "xno" ; then
  cflags="${cflags} -I/usr/include"
  libs="${libs} -L/usr/lib -lCLHEP-2.4.7.1"
fi
if test "x${have_clhep}" = "xyes" ; then
  libs="${libs} -lG4clhep"
fi

# - EXPAT
have_expat="no"
feature_list="${feature_list} expat[${have_expat}]"

if test "x${have_expat}" = "xyes" ; then
  libs="${libs} -lG4expat"
fi

# - ZLIB
have_zlib="no"
feature_list="${feature_list} zlib[${have_zlib}]"

if test "x${have_zlib}" = "xyes" ; then
  libs="${libs} -lG4zlib"
fi

# - GDML
have_gdml="yes"
feature_list="${feature_list} gdml[${have_gdml}]"

if test "x${have_gdml}" = "xyes" ; then
  cflags="${cflags} "
  libs="-lG4gdml ${libs}"
fi

# - PTL
have_ptl="yes"
feature_list="${feature_list} ptl[${have_ptl}]"

if test "x${have_ptl}" = "xyes" ; then
  libs="${libs} -lG4ptl"
fi

# - USolids
have_usolids="no"
feature_list="${feature_list} usolids[${have_usolids}]"
if test "x${have_usolids}" = "xyes" ; then
  cflags="${cflags} "
fi

# - Freetype
have_freetype="no"
feature_list="${feature_list} freetype[${have_freetype}]"

# - HDF5
have_hdf5="no"
feature_list="${feature_list} hdf5[${have_hdf5}]"

# - G3toG4
have_g3tog4="yes"
feature_list="${feature_list} g3tog4[${have_g3tog4}]"

if test "x${have_g3tog4}" = "xyes" ; then
  libs="-lG3toG4 ${libs}"
fi

# - Qt
have_qt="yes"
feature_list="${feature_list} qt[${have_qt}]"

if test "x${have_qt}" = "xyes" ; then
  vis_cflags="${vis_cflags} \
  -DG4UI_USE_QT -DG4VIS_USE_OPENGLQT -DG4VIS_USE_TOOLSSG_QT_GLES  -I/usr/include/qt6/QtCore -I/usr/include/qt6 -I/usr/include/qt6/QtGui -I/usr/include/qt6/QtDBus -I/usr/include/qt6/QtWidgets -I/usr/include/qt6/QtOpenGL"
  geant4_uses_opengl="yes"
fi

# - Motif
have_motif="yes"
feature_list="${feature_list} motif[${have_motif}]"

if test "x${have_motif}" = "xyes" ; then
  vis_cflags="${vis_cflags} -DG4UI_USE_XM -DG4VIS_USE_OPENGLXM -DG4VIS_USE_TOOLSSG_XT_GLES"
  geant4_uses_x11="yes"
  geant4_uses_opengl="yes"
fi

# - RayTracerX11
have_raytracerx11="yes"
feature_list="${feature_list} raytracer-x11[${have_raytracerx11}]"

if test "x${have_raytracerx11}" = "xyes" ; then
  vis_cflags="${vis_cflags} -DG4VIS_USE_RAYTRACERX"
  geant4_uses_x11="yes"
fi

# - OpenGL with X11
have_openglx11="yes"
feature_list="${feature_list} opengl-x11[${have_openglx11}]"

if test "x${have_openglx11}" = "xyes" ; then
  vis_cflags="${vis_cflags} -DG4VIS_USE_OPENGLX -DG4VIS_USE_TOOLSSG_X11_GLES"
  geant4_uses_opengl="yes"
  geant4_uses_x11="yes"
fi

# - OpenInventor
# Whilst it *is* an Xt based driver, don't *think* Xt or X11 appear
# in the public interface, nor do the Inventor headers...
have_openinventor="yes"
feature_list="${feature_list} openinventor[${have_openinventor}]"

if test "x${have_openinventor}" = "xyes" ; then
  vis_cflags="${vis_cflags} -DG4VIS_USE_OI -DG4VIS_USE_OIX"
  vis_libs="-lG4OpenInventor ${vis_libs}"
fi

# - VTK
have_vtk="no"
feature_list="${feature_list} vtk[${have_vtk}]"


# - If we have any OpenGL based feature, then we need to add in the
# OpenGL global define and the G4OpenGL libraries.
if test "x${geant4_uses_opengl}" = "xyes" ; then
  vis_cflags="-DG4VIS_USE_OPENGL ${vis_cflags}"
  vis_libs="-lG4OpenGL ${vis_libs}"
fi

# - If we have any X11 based feature, then we *may* need the X11 includes
if test "x${geant4_uses_x11}" = "xyes" ; then
  vis_cflags=" ${vis_cflags}"
fi

#-----------------------------------------------------------------------
# Datasets
# - List creation for sh compatibility, see:
#    https://wiki.ubuntu.com/DashAsBinSh
# Note however that the guide in the link uses the GNU awk extension
# 'length' to find the number of elements in the array. This will fail
# on other awk implementations. Use standard feature of split function
# returning number of elements.
dataset_url="https://cern.ch/geant4-data/datasets"
dataset_timeout="1500"
dataset_list=$(awk 'BEGIN { n = split( "G4NDL|G4NEUTRONHPDATA|/usr/share/Geant4/data/G4NDL4.7.1|G4NDL.4.7.1.tar.gz|54f0ed3995856f02433d42ec96d70bc6;G4EMLOW|G4LEDATA|/usr/share/Geant4/data/G4EMLOW8.8|G4EMLOW.8.8.tar.gz|328330009df633f7e9b3a9f445745298;PhotonEvaporation|G4LEVELGAMMADATA|/usr/share/Geant4/data/PhotonEvaporation6.1.2|G4PhotonEvaporation.6.1.2.tar.gz|d80ba9bdefcf9e23487a26adfa273304;RadioactiveDecay|G4RADIOACTIVEDATA|/usr/share/Geant4/data/RadioactiveDecay6.1.2|G4RadioactiveDecay.6.1.2.tar.gz|20d494f73d4bddabd7fab5c06a58895c;G4PARTICLEXS|G4PARTICLEXSDATA|/usr/share/Geant4/data/G4PARTICLEXS4.2|G4PARTICLEXS.4.2.tar.gz|b63341cc97a472b04ff607b094493174;G4PII|G4PIIDATA|/usr/share/Geant4/data/G4PII1.3|G4PII.1.3.tar.gz|05f2471dbcdf1a2b17cbff84e8e83b37;RealSurface|G4REALSURFACEDATA|/usr/share/Geant4/data/RealSurface2.2|G4RealSurface.2.2.tar.gz|ea8f1cfa8d8aafd64b71fb30b3e8a6d9;G4SAIDDATA|G4SAIDXSDATA|/usr/share/Geant4/data/G4SAIDDATA2.0|G4SAIDDATA.2.0.tar.gz|d5d4e9541120c274aeed038c621d39da;G4ABLA|G4ABLADATA|/usr/share/Geant4/data/G4ABLA3.3|G4ABLA.3.3.tar.gz|b25d093339e1e4532e31038653580ca6;G4INCL|G4INCLDATA|/usr/share/Geant4/data/G4INCL1.3|G4INCL.1.3.tar.gz|72c3ff5f7f1e6f727f2ebf3b11ce784f;G4ENSDFSTATE|G4ENSDFSTATEDATA|/usr/share/Geant4/data/G4ENSDFSTATE3.0|G4ENSDFSTATE.3.0.tar.gz|c500728534ce3e9fb2fefa0112eb3a74;G4CHANNELING|G4CHANNELINGDATA|/usr/share/Geant4/data/G4CHANNELING2.0|G4CHANNELING.2.0.tar.gz|e853fbcba1e8640f7c3a437253955482", array, ";"); for (i=1;i<=n;i++) { print array[i]; } }')

#-----------------------------------------------------------------------
# function print_datasets
#          print dataset information with one line per dataset and each
#          line in the format
#            <NAME> <ENVVARNAME> <PATH>
print_datasets()
{
  for ds in ${dataset_list} ; do
    dataset_name=$(echo $ds | cut -d "|" -f1)
    dataset_envvar=$(echo $ds | cut -d "|" -f2)
    dataset_path=$(echo $ds | cut -d "|" -f3)
    echo ${dataset_name} ${dataset_envvar} ${dataset_path}
  done
  exit 0
}

#-----------------------------------------------------------------------
# function print_datasets_sh
#          print dataset information with one line per dataset and each
#          line in the format
#            export <ENVVARNAME>="<PATH>"
print_datasets_sh()
{
  for ds in ${dataset_list} ; do
    dataset_envvar=$(echo $ds | cut -d "|" -f2)
    dataset_path=$(echo $ds | cut -d "|" -f3)
    echo "export ${dataset_envvar}=\"${dataset_path}\""
  done
  exit 0
}

#-----------------------------------------------------------------------
# function print_datasets_csh
#          print dataset information with one line per dataset and each
#          line in the format
#            setenv <ENVVARNAME> "<PATH>";
print_datasets_csh()
{
  for ds in ${dataset_list} ; do
    dataset_envvar=$(echo $ds | cut -d "|" -f2)
    dataset_path=$(echo $ds | cut -d "|" -f3)
    echo "setenv ${dataset_envvar} \"${dataset_path}\";"
  done
  exit 0
}

#-----------------------------------------------------------------------
# function check_datasets
#          Check whether datasets exist as directories at the expected
#          location. Print dataset name, path and install status
#
check_datasets()
{
  for ds in ${dataset_list} ; do
    dataset_name=$(echo $ds | cut -d "|" -f1)
    dataset_path=$(echo $ds | cut -d "|" -f3)
    dataset_status="NOTFOUND"
    if test -d ${dataset_path} ; then
      dataset_status="INSTALLED"
    fi
    echo ${dataset_name} ${dataset_status} ${dataset_path}
  done
}

#-----------------------------------------------------------------------
# function install_datasets
#          Download and install datasets if they are not already installed
#
install_datasets()
{
  G4CURL=$(which curl)
  if test "x${G4CURL}" = "x" ; then
    echo "- error: no curl executable found"
    exit 1
  fi

  G4OPENSSL=$(which openssl)
  if test "x${G4OPENSSL}" = "x" ; then
      G4MD5SUM=$(which md5sum)
      if test "x${G4MD5SUM}" = "x" ; then
    echo "- error: no openssl or md5sum executable found"
    exit 1
      else
	  G4MD5CMD="${G4MD5SUM}"
      fi
  else
      G4MD5CMD="${G4OPENSSL} dgst -md5 -r"
  fi

  G4TAR=$(which tar)
  if test "x${G4TAR}" = "x" ; then
    echo "- error: no tar executable found"
    exit 1
  fi

  datasets_to_install=''
  for ds in ${dataset_list} ; do
    dataset_path=$(echo $ds | cut -d "|" -f3)
    if test ! -d ${dataset_path} ; then
      datasets_to_install="${datasets_to_install} ${ds}"
    fi
  done

  dataset_install="ok"
  if test "x${datasets_to_install}" != "x" ; then
    # - Create download cache
    g4downloaddir=$(mktemp -d -t g4dlcXXXXXXXXXX)
    if test -d ${g4downloaddir} ; then
      echo "+ created download cache"
    else
      echo "- error : failed to create '${g4downloaddir}'"
      dataset_install="fail"
      break
    fi

    # - Download/install loop
    for ds in ${datasets_to_install} ; do
      # Create base path (repetitive)
      dataset_path=$(echo $ds | cut -d "|" -f3)
      mkdir -p $(dirname ${dataset_path})
      if [ "$?" != "0" ] || [ ! -w $(dirname ${dataset_path}) ] ; then
        echo "- error : failed to create base directory '$(dirname ${dataset_path})'"
        dataset_install="fail"
        break
      fi

      # - Download bundle to cache
      dataset_file=$(echo $ds | cut -d "|" -f4)
      echo "+ downloading ${dataset_file}"
      ${G4CURL} -L -f -m ${dataset_timeout} -o ${g4downloaddir}/${dataset_file} ${dataset_url}/${dataset_file}
      curl_status="$?"
      if [ "$curl_status" != "0" ] ; then
        echo "- download of '${dataset_file}' failed : CURL error $?"
        dataset_install="fail"
        break
      fi

      # Validate bundle hash (basic)
      dataset_md5=$(echo $ds | cut -d "|" -f5)
      actual_md5=$(${G4MD5CMD} ${g4downloaddir}/${dataset_file} | cut -d ' ' -f1)
      echo "+ checking md5 of ${dataset_file}"
      if [ "${actual_md5}" != "${dataset_md5}" ] ; then
        echo "- md5 mismatch for '${dataset_file}' : ${actual_md5}(actual) != ${dataset_md5}(expected)"
        dataset_install="fail"
        break
      fi

      # Unpack bundle
      echo "+ untar ${dataset_file}"
      ${G4TAR} -C ${g4downloaddir} -xf ${g4downloaddir}/${dataset_file}
      tar_status="$?"
      if [ "$tar_status" != "0" ] ; then
        echo "- untar of '${dataset_file}' failed : tar error $?"
        dataset_install="fail"
        break
      fi

      # Install bundle
      echo "+ installing $(basename ${dataset_path})"
      cp -R ${g4downloaddir}/$(basename ${dataset_path}) $(dirname ${dataset_path})
      cp_status="$?"
      if [ "$cp_status" != "0" ] ; then
        echo "- copy of '$(basename ${dataset_path})' failed : cp error $?"
        # Extra task - remove anything copied...
        rm -Rf ${dataset_path}
        dataset_install="fail"
        break
      fi
    done

    # - Clean up download cache
    rm -Rf ${g4downloaddir}
    if test -d ${g4downloaddir} ; then
      echo "- failed to remove '${g4downloaddir}'"
    else
      echo "+ cleaned download cache"
    fi
  fi

  if [ "${dataset_install}" = "ok" ] ; then
    echo "+ all datasets installed"
    exit 0
  else
    echo "- dataset installation failed"
    exit 1
  fi
  exit 1
}

#-----------------------------------------------------------------------
# function list_features
#          print list of enabled and disabled features.
#
list_features()
{
cat<<EOF
Known Features:
EOF
  for f in ${feature_list} ; do
    echo " $f"
  done
  exit 0
}

#-----------------------------------------------------------------------
# function help
#          print help on available command line arguments and enabled
#          and disabled features of the toolkit
#
help()
{
  cat<<EOF
Usage: geant4-config [OPTION...]
  --prefix                output installation prefix of Geant4
  --version               output version for Geant4
  --cxxstd                C++ Standard compiled against
  --tls-model             Thread Local Storage model used
  --libs                  output all linker flags
  --cflags                output all preprocessor
                          and compiler flags

  --libs-without-gui      output linker flags without
                          GUI components
  --cflags-without-gui    output preprocessor and compiler
                          flags without GUI components

  --has-feature FEATURE   output yes if FEATURE is supported,
                          or no if not supported

  --features              print list of features

  --sh                    print shell commands required to set environment
                          variables for Geant4, which can be evaluated in
                          the calling shell with "eval \$(geant4-config --sh)"

  --csh                   print C shell commands required to set environment
                          variables for Geant4, which can be evaluated in
                          the calling shell with "eval \`geant4-config --csh\`"

  --datasets              output dataset name, environment variable
                          and path, with one line per dataset

  --check-datasets        output dataset name, installation status and
                          expected installation location, with one line
                          per dataset

  --install-datasets      download and install any missing datasets,
                          requires a network connection and for the dataset
                          path to be user writable

Known Features:
EOF
  for f in ${feature_list} ; do
    echo " $f"
  done

  cat<<EOF

Help options:
  -?, --help              show this help message
  --usage                 display brief usage message
EOF

  exit 1
}

#-----------------------------------------------------------------------
# function usage
#          print basic usage message
#
usage()
{
  cat<<EOF
Usage: geant4-config [--prefix] [--version] [--libs] [--cflags]
EOF
  exit 1
}

#-----------------------------------------------------------------------
# Process arguments
#
if test $# -eq 0 ; then
  usage
fi

while test $# -gt 0 ; do
  case "$1" in
    -*=*)
      optflag=`echo "$1" | sed 's/=[-_a-zA-Z0-9]*//'`
      optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'`
      ;;
    *)
      optflag=$1
      optarg=
      ;;
  esac

  case "$optflag" in
    --prefix)
      echo ${prefix}
      ;;

    --version)
      echo ${version}
      ;;

    --cxxstd)
      echo ${geant4_cxx_std}
      ;;

    --tls-model)
      echo ${geant4_tls_model}
      ;;

    --libs)
      echo "-L${libdir}" ${vis_libs} ${libs}
      ;;

    --cflags)
      echo ${vis_cflags} ${cflags}
      ;;

    --libs-without-gui)
      echo "-L${libdir}" ${libs}
      ;;

    --cflags-without-gui)
      echo ${cflags}
      ;;

    --has-feature)
      if [ x$optarg = x ]; then
        if [  $# -gt 1 ]; then
	  shift
	  optarg=$1
	else
	  echo "$optflag - missing parameter"
	  exit 1
	fi
      fi

      case "$optarg" in
        static)
          echo ${have_staticlibs}
          ;;
        multithreading)
          echo ${have_multithreading}
          ;;
        smartstack)
          echo ${have_smartstack}
          ;;
        clhep)
          echo ${have_clhep}
          ;;
        expat)
          echo ${have_expat}
          ;;
        zlib)
          echo ${have_zlib}
          ;;
        gdml)
          echo ${have_gdml}
          ;;
        usolids)
          echo ${have_usolids}
          ;;
        freetype)
          echo ${have_freetype}
          ;;
        hdf5)
          echo ${have_hdf5}
          ;;
        g3tog4)
          echo ${have_g3tog4}
          ;;
        qt)
          echo ${have_qt}
          ;;
        vtk)
          echo ${have_vtk}
          ;;
        motif)
          echo ${have_motif}
          ;;
        raytracer-x11)
          echo ${have_raytracerx11}
          ;;
        opengl-x11)
          echo ${have_openglx11}
          ;;
        openinventor)
          echo ${have_openinventor}
          ;;
        php_as_hp)
          echo ${have_php_as_hp}
          ;;
        *)
          echo "no"
          ;;
      esac
      ;;

    --features)
      list_features
      ;;

    --datasets)
      print_datasets
      ;;

    --check-datasets)
      check_datasets
      ;;

    --install-datasets)
      install_datasets
      ;;

    --sh)
      print_datasets_sh
      ;;

    --csh)
      print_datasets_csh
      ;;

    -?)
      help
      ;;

    --help)
      help
      ;;

    --usage)
      usage
      ;;

    *)
      usage
      ;;
  esac

  shift
done

# Finally...
exit 0
