#----------------------------------*-sh-*--------------------------------------
# =========                 |
# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
#  \\    /   O peration     |
#   \\  /    A nd           | www.openfoam.com
#    \\/     M anipulation  |
#------------------------------------------------------------------------------
#     Copyright (C) 2017-2019 OpenCFD Ltd.
#------------------------------------------------------------------------------
# License
#     This file is part of OpenFOAM, licensed under GNU General Public License
#     <http://www.gnu.org/licenses/>.
#
# Script
#     cmakeFunctions
#
# Description
#     Helper functions for CMake
#------------------------------------------------------------------------------
. $WM_PROJECT_DIR/wmake/scripts/wmakeFunctions  # Require some wmake functions

# Export compiler information for cmake
export CC="$(wmake -show-c)"
export CXX="$(wmake -show-cxx)"

export CFLAGS="$(wmake -show-cflags)"
export CXXFLAGS="$(wmake -show-cxxflags)"

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

#
# Check sentinel file(s) to handle paraview / vtk version changes
#
sameDependency()
{
    local depend="$1"
    local sourceDir="$2"
    local objectsDir sentinel prev

    # Where generated files are stored
    objectsDir=$(findObjectDir "$sourceDir") || exit 1 # Fatal
    sentinel="$objectsDir/ThirdParty"

    echo "$sentinel"

    if read -r prev 2>/dev/null < $sentinel
    then
        if [ "$prev" = "$depend" ]
        then
            return 0
        else
            echo "${depend%=*} changed between builds" 1>&2
            return 1
        fi
    elif [ -f "$objectsDir/CMakeCache.txt" ]
    then
        echo "previous build was incomplete" 1>&2
        return 1
    else
        return 0
    fi
}


# CMake with output suppressed according to WM_QUIET
_cmake()
{
    echo "cmake..."
    if [ -n "$WM_QUIET" ]
    then
        cmake -DCMAKE_RULE_MESSAGES=OFF $@ >/dev/null
    else
        cmake $@
    fi
}


# CMake into objectsDir with external dependency
# - use sentinel file(s) to handle paraview/vtk version changes
#
# 1 - depend
# 2 - sourceDir
# 3... optional cmake defines
#
cmakeVersioned()
{
    local depend="$1"
    local sourceDir="$2"
    shift 2
    local objectsDir sentinel

    # Where generated files are stored
    objectsDir=$(findObjectDir "$sourceDir") || exit 1 # Fatal

    # Version changed
    sentinel=$(sameDependency "$depend" "$sourceDir") || \
        rm -rf "$objectsDir" > /dev/null 2>&1

    mkdir -p "$objectsDir" \
    && (cd "$objectsDir" && _cmake "$@" "$sourceDir" && make) \
    && echo "$depend" >| "${sentinel:-/dev/null}"
}


# CMake into objectsDir with external dependency
#
# 1 - depend
# 2 - sourceDir
# 3... optional cmake defines
#
cmakeVersionedInstall()
{
    local depend="$1"
    local sourceDir="$2"
    shift 2
    local objectsDir sentinel

    # Where generated files are stored
    objectsDir=$(findObjectDir "$sourceDir") || exit 1 # Fatal

    # Version changed
    sentinel=$(sameDependency "$depend" "$sourceDir") || \
        rm -rf "$objectsDir" > /dev/null 2>&1

    mkdir -p "$objectsDir" \
    && (cd "$objectsDir" && _cmake "$@" "$sourceDir" && make install) \
    && echo "$depend" >| "${sentinel:-/dev/null}"
}


# wmake with tracking of external dependency as per cmakeVersioned
# - use sentinel file(s) to handle paraview/vtk version changes
#
# 1 - depend
# 2 - sourceDir
# 3... wmake arguments
#
wmakeVersioned()
{
    local depend="$1"
    local sourceDir="$2"
    shift 2
    local objectsDir sentinel

    # Where generated files are stored
    objectsDir=$(findObjectDir "$sourceDir") || exit 1 # Fatal

    # Version changed
    sentinel=$(sameDependency "$depend" "$sourceDir") || \
        rm -rf "$objectsDir" > /dev/null 2>&1

    mkdir -p "$objectsDir" \
    && wmake "$@" \
    && echo "$depend" >| "${sentinel:-/dev/null}"
}


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