diff --git a/bin/tools/foamConfigurePaths b/bin/tools/foamConfigurePaths
index 12ea3d36bcb412bd8daeb033466eaff6388c3816..d8656358a1da013caff3548b291dd763a1892a1d 100755
--- a/bin/tools/foamConfigurePaths
+++ b/bin/tools/foamConfigurePaths
@@ -107,6 +107,7 @@ Components specified by absolute path
   -adios-path DIR     Path for 'ADIOS2_ARCH_PATH' (overrides -adios)
   -boost-path DIR     Path for 'BOOST_ARCH_PATH'  (overrides -boost)
   -cgal-path DIR      Path for 'CGAL_ARCH_PATH'   (overrides -cgal)
+  -cmake-path DIR     Path for 'CMAKE_ARCH_PATH'  (overrides -cmake)
   -fftw-path DIR      Path for 'FFTW_ARCH_PATH'   (overrides -fftw)
   -kahip-path DIR     Path for 'KAHIP_ARCH_PATH'  (overrides -kahip)
   -metis-path DIR     Path for 'METIS_ARCH_PATH'  (overrides -metis)
@@ -662,8 +663,15 @@ CONFIG_CSH
     -cmake)
         # Replace cmake_version=...
         optionValue=$(getOptionValue "$@")
-        replaceEtc  config.sh/paraview   cmake_version "$optionValue"
-        replaceEtc  config.csh/paraview  cmake_version "$optionValue"
+        replaceEtc  config.sh/cmake   cmake_version "$optionValue"
+        adjusted=true
+        shift
+        ;;
+
+    -cmake-path)
+        # Replace CMAKE_ARCH_PATH=...
+        optionValue=$(getOptionValue "$@")
+        replaceEtc  config.sh/cmake   CMAKE_ARCH_PATH "$optionValue"
         adjusted=true
         shift
         ;;
diff --git a/doc/Config.md b/doc/Config.md
index 5cb541b34454c8e5760683b6289e771ebe45e413..7193c922ba67969fa7f2f3f14728261ebb66dbd9 100644
--- a/doc/Config.md
+++ b/doc/Config.md
@@ -78,7 +78,6 @@ example,
 
 ParaView_VERSION=5.6.0
 ParaView_QT=qt-system
-cmake_version=cmake-system
 
 # END OF (NORMAL) USER EDITABLE PART
 #------------------------------------------------------------------------------
diff --git a/etc/config.csh/paraview b/etc/config.csh/paraview
index bc57ed568cf1fe3f35b19c4e0d25f9668d4101ef..36c5c0939faac1ce29aece8c315f5d902e8fb35b 100644
--- a/etc/config.csh/paraview
+++ b/etc/config.csh/paraview
@@ -6,24 +6,22 @@
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
 #     Copyright (C) 2011-2016 OpenFOAM Foundation
-#     Copyright (C) 2016-2019 OpenCFD Ltd.
+#     Copyright (C) 2016-2020 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
-#     This file is part of OpenFOAM, licensed under GNU General Public License
-#     <http://www.gnu.org/licenses/>.
+#     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
 #
 # File
 #     config.csh/paraview
 #     - sourced by OpenFOAM-*/etc/cshrc or via foamPV alias
 #
 # Description
-#     Setup for PARAVIEW (partially cmake, qt too)
+#     Setup for PARAVIEW (partially QT too)
 #
 #     To disable use of the PV_PLUGIN_PATH:
 #         ParaView_VERSION=none
 #
 #     For system-wide installations:
-#         cmake_version=cmake-system
 #         ParaView_QT=qt-system
 #         ParaView_VERSION=system       [EXPERIMENTAL]
 #
@@ -53,7 +51,6 @@
 
 set ParaView_VERSION=5.6.3
 set ParaView_QT=qt-system
-set cmake_version=cmake-system
 
 # END OF (NORMAL) USER EDITABLE PART
 #------------------------------------------------------------------------------
@@ -65,14 +62,13 @@ if (! $?WM_COMPILER_LIB_ARCH ) setenv WM_COMPILER_LIB_ARCH
 # Compiler-specific location for ThirdParty installations
 set archDir="$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER"
 
-# Clean PATH and LD_LIBRARY_PATH
-eval `$WM_PROJECT_DIR/bin/foamCleanPath -csh-env=PATH "$ParaView_DIR $archDir/ParaView- $archDir/qt- $archDir/cmake-"`
+# Clean path and library path
+eval `$WM_PROJECT_DIR/bin/foamCleanPath -csh-env=PATH "$ParaView_DIR $archDir/ParaView- $archDir/qt-"`
 eval `$WM_PROJECT_DIR/bin/foamCleanPath -csh-env=LD_LIBRARY_PATH "$ParaView_DIR $archDir/ParaView- $archDir/qt-"`
 
-# Evaluate command-line parameters for ParaView and cmake
+# Evaluate command-line parameters for ParaView
 while ( $#argv > 0 )
     switch ($argv[1])
-    case cmake*=*:
     case ParaView*=*:
         # name=value  -> set name=value
         eval "set $argv[1]"
@@ -81,13 +77,6 @@ while ( $#argv > 0 )
     shift
 end
 
-# ThirdParty cmake
-set cmake="$archDir/$cmake_version"
-if ( -r "$cmake/bin/cmake" ) then
-    # _foamAddPath not available when foamPV alias is used
-    setenv PATH "$cmake/bin:${PATH}"
-endif
-
 if ($?ParaView_VERSION) then
 switch ("$ParaView_VERSION")
 case "":
@@ -106,13 +95,12 @@ case "none":
 
 case "system":
     # Obtain major.minor from `paraview --version`
-    set pv_api=`paraview --version | \
-        sed -ne 's/^[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/p'`
+    set pv_api=`paraview --version | sed -ne 's/^[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/p'`
 
-    if ( "${%pv_api}" ) then
-        setenv PV_PLUGIN_PATH "$FOAM_LIBBIN/paraview-$pv_api"
-    else
+    if ("${pv_api}" == "") then
         unsetenv ParaView_DIR PV_PLUGIN_PATH
+    else
+        setenv PV_PLUGIN_PATH "$FOAM_LIBBIN/paraview-$pv_api"
     endif
 
     if ($?FOAM_VERBOSE && $?prompt) then
@@ -138,9 +126,8 @@ default:
         breaksw
 
     case [0-9]*:
-        # Extract API from VERSION
-        set pv_api=`echo "$ParaView_VERSION" | \
-            sed -ne 's/^[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/p'`
+        # Extract API from VERSION.
+        set pv_api=`echo "$ParaView_VERSION" | sed -ne 's/^[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/p'`
         breaksw
     endsw
 
@@ -214,7 +201,6 @@ endif
 unsetenv ParaView_VERSION ParaView_QT
 
 unset archDir libDir
-unset cmake cmake_version
 unset pv_api pvLibDir pvPython qtDir
 
 #------------------------------------------------------------------------------
diff --git a/etc/config.sh/cmake b/etc/config.sh/cmake
new file mode 100644
index 0000000000000000000000000000000000000000..617ee6dfc9e93555acded8d5c75673b6b77512eb
--- /dev/null
+++ b/etc/config.sh/cmake
@@ -0,0 +1,35 @@
+#----------------------------------*-sh-*--------------------------------------
+# =========                 |
+# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+#  \\    /   O peration     |
+#   \\  /    A nd           | www.openfoam.com
+#    \\/     M anipulation  |
+#------------------------------------------------------------------------------
+#     Copyright (C) 2020 OpenCFD Ltd.
+#------------------------------------------------------------------------------
+# License
+#     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
+#
+# File
+#     etc/config.sh/cmake
+#     - possibly sourced during make process only.
+#
+# Description
+#     CMAKE location (ThirdParty or otherwise) when not found via the PATH
+#     Does not affect the PATH, that is left for the caller
+#
+#     For system-wide installations:
+#         cmake_version=cmake-system
+#         define CMAKE_ARCH_PATH
+#
+# Note
+#     No csh version. This file is only used during make processes.
+#
+#------------------------------------------------------------------------------
+# USER EDITABLE PART: Changes made here may be lost with the next upgrade
+
+cmake_version=cmake-system
+export CMAKE_ARCH_PATH="$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$cmake_version"
+
+# END OF (NORMAL) USER EDITABLE PART
+#------------------------------------------------------------------------------
diff --git a/etc/config.sh/paraview b/etc/config.sh/paraview
index d850ccf307b9f93ec3a0ffc76c81fbf8be1d66b8..265869f960e2cddaa0762c865daccd659b2fa95d 100644
--- a/etc/config.sh/paraview
+++ b/etc/config.sh/paraview
@@ -16,7 +16,7 @@
 #     - sourced by OpenFOAM-*/etc/bashrc or via foamPV alias
 #
 # Description
-#     Setup for PARAVIEW (partially cmake, qt too)
+#     Setup for PARAVIEW (partially QT too)
 #
 #     To disable use of the PV_PLUGIN_PATH:
 #         ParaView_VERSION=none
@@ -55,7 +55,6 @@
 
 ParaView_VERSION=5.6.3
 ParaView_QT=qt-system
-cmake_version=cmake-system
 
 # END OF (NORMAL) USER EDITABLE PART
 #------------------------------------------------------------------------------
@@ -64,34 +63,26 @@ pv_api=auto             # Either auto or pair of (major.minor) digits
 # Compiler-specific location for ThirdParty installations
 archDir="$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER"
 
-# Clean PATH and LD_LIBRARY_PATH
+# Clean path and library path
 eval \
     "$($WM_PROJECT_DIR/bin/foamCleanPath -sh-env=PATH \
-    $ParaView_DIR $archDir/ParaView- $archDir/qt- $archDir/cmake-)"
+    $ParaView_DIR $archDir/ParaView- $archDir/qt-)"
 
 eval \
     "$($WM_PROJECT_DIR/bin/foamCleanPath -sh-env=LD_LIBRARY_PATH \
     $ParaView_DIR $archDir/ParaView- $archDir/qt-)"
 
-# Evaluate command-line parameters for ParaView and cmake
+# Evaluate command-line parameters for ParaView
 for i
 do
     case "$i" in
-    (cmake*=* | ParaView*=*)
+    (ParaView*=*)
         # name=value  -> export name=value
         eval "export $i"
         ;;
     esac
 done
 
-# ThirdParty cmake
-cmake="$archDir/$cmake_version"
-if [ -r "$cmake/bin/cmake" ]
-then
-    # _foamAddPath not available when foamPV function is used
-    PATH="$cmake/bin:$PATH"
-fi
-
 case "$ParaView_VERSION" in
 ('')
     # empty - do nothing
@@ -206,7 +197,6 @@ then
 fi
 
 unset archDir libDir
-unset cmake cmake_version
 unset pv_api pvLibDir pvPython qtDir
 
 #------------------------------------------------------------------------------
diff --git a/etc/config.sh/paraview-system b/etc/config.sh/paraview-system
index c972de3df20d2babce6effc9fca16c98e527f38b..1bdec0f30d9c4af10d406cc071ffeb6a843d6d9e 100644
--- a/etc/config.sh/paraview-system
+++ b/etc/config.sh/paraview-system
@@ -5,11 +5,10 @@
 #   \\  /    A nd           | www.openfoam.com
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
-#     Copyright (C) 2019 OpenCFD Ltd.
+#     Copyright (C) 2019-2020 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
-#     This file is part of OpenFOAM, licensed under GNU General Public License
-#     <http://www.gnu.org/licenses/>.
+#     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
 #
 # File
 #     etc/config.sh/paraview-system
@@ -26,7 +25,7 @@
 # Compiler-specific location for ThirdParty installations
 archDir="$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER"
 
-# Clean PATH and LD_LIBRARY_PATH
+# Clean path and library path
 eval \
     "$($WM_PROJECT_DIR/bin/foamCleanPath -sh-env=PATH \
     $ParaView_DIR $archDir/ParaView-)"
diff --git a/wmake/scripts/cmakeFunctions b/wmake/scripts/cmakeFunctions
index bceed70f9e4d6e7348c275bfc888bc44b5d65d70..6882e12589ca590b3723e77bc3b64867328a2ff1 100644
--- a/wmake/scripts/cmakeFunctions
+++ b/wmake/scripts/cmakeFunctions
@@ -16,7 +16,16 @@
 # Description
 #     Helper functions for CMake
 #
+# Environment
+#     Consider CMAKE_INSTALL_PREFIX as a reserved name, although it is not
+#     set/unset here.
+#
+# Files
+#     Uses etc/config.sh/cmake (if it exists) for the
+#     CMAKE_ARCH_PATH that may specify a possible cmake/bin directory.
+#
 #------------------------------------------------------------------------------
+. ${WM_PROJECT_DIR:?}/wmake/scripts/have_cmake
 . ${WM_PROJECT_DIR:?}/wmake/scripts/wmakeFunctions  # Require wmake functions
 
 # Export compiler information for cmake
@@ -29,64 +38,92 @@ export CXXFLAGS="$(wmake -show-cxxflags)"
 #------------------------------------------------------------------------------
 
 #
-# Check sentinel file(s) to handle paraview / vtk version changes
+# Save build/configure parameter information (dependency) into sentinel file
 #
-sameDependency()
+# 1 - sentinelFile
+# 2... build/configure parameters
+#
+storeDependency()
 {
-    local depend="$1"
-    local sourceDir="$2"
-    local objectsDir sentinel prev
+    local sentinel="$1"
+    local depend
+    shift
 
-    # Where generated files are stored
-    objectsDir=$(findObjectDir "$sourceDir") || exit 1 # Fatal
-    sentinel="$objectsDir/ThirdParty"
+    if [ -n "$sentinel" ]
+    then
+        mkdir -p "$(dirname "$sentinel")"
 
-    echo "$sentinel"
+        echo '# Build/configure parameters' >| "$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
+        for depend
+        do
+            echo "-- $depend"
+        done >> "$sentinel"
     fi
+    return 0
 }
 
+
 #
-# Save dependency information into sentinel file
+# Check sentinel file(s) to handle changed build/configure parameters
+# such as paraview / vtk version changes
 #
-storeDependency()
+# 1 - sourceDir
+# 2... build/configure parameters
+#
+sameDependency()
 {
-    local depend="$1"
-    local sentinel="$2"
+    local sourceDir="$1"
+    shift
+    local depend objectsDir
+    local compare=0
 
-    if [ -n "$sentinel" ]
+    # Where generated files are stored
+    objectsDir=$(findObjectDir "$sourceDir") || exit 1 # Fatal
+    local sentinel="$objectsDir/ThirdParty"
+
+    if [ -f "$sentinel" ]
     then
-        mkdir -p "$(dirname "$sentinel")"
-        echo "$depend" >| "$sentinel"
+        # Create an .update version
+        storeDependency   "${sentinel}.update" $@
+        cmp "${sentinel}" "${sentinel}.update" >/dev/null 2>&1
+        compare=$?
+
+        if [ "$compare" -ne 0 ]
+        then
+            echo "build/configure parameters changed between builds" 1>&2
+        fi
+
+    else
+        # No sentinel file: First time, or failed compilation?
+        if [ -f "$objectsDir/CMakeCache.txt" ]
+        then
+            echo "previous build was incomplete" 1>&2
+            compare=1
+        fi
     fi
-    return 0
+
+    echo "$sentinel"
+    return "$compare"
 }
 
 
-# CMake with output suppressed according to WM_QUIET
-_cmake()
+# Resolve the location of cmake (if needed) and call with output
+# suppressed according to WM_QUIET
+call_cmake()
 {
-    echo "cmake..."
-    if [ -n "$WM_QUIET" ]
+    if have_cmake
     then
-        cmake -DCMAKE_RULE_MESSAGES=OFF $@ >/dev/null
+        if [ -n "$WM_QUIET" ]
+        then
+            echo "cmake..."
+            "$CMAKE_EXE" -DCMAKE_RULE_MESSAGES=OFF $@ >/dev/null
+        else
+            echo "cmake $@"
+            "$CMAKE_EXE" $@
+        fi
     else
-        cmake $@
+        return 1
     fi
 }
 
@@ -109,12 +146,13 @@ cmakeVersioned()
     objectsDir=$(findObjectDir "$sourceDir") || exit 1 # Fatal
 
     # Version changed
-    sentinel=$(sameDependency "$depend" "$sourceDir") || \
+    sentinel=$(sameDependency "$sourceDir" "$depend" $@) || \
         rm -rf "$objectsDir" 2>/dev/null
 
     mkdir -p "$objectsDir" \
-    && (cd "$objectsDir" && _cmake "$@" "$sourceDir" && make) \
-    && storeDependency "$depend" "$sentinel"
+    && ( cd "$objectsDir" && call_cmake "$@" "$sourceDir" && \
+         make "-j${WM_NCOMPPROCS:-1}" ) \
+    && storeDependency "$sentinel" "$depend" $@
 }
 
 
@@ -135,12 +173,13 @@ cmakeVersionedInstall()
     objectsDir=$(findObjectDir "$sourceDir") || exit 1 # Fatal
 
     # Version changed
-    sentinel=$(sameDependency "$depend" "$sourceDir") || \
+    sentinel=$(sameDependency "$sourceDir" "$depend" $@) || \
         rm -rf "$objectsDir" 2>/dev/null
 
     mkdir -p "$objectsDir" \
-    && (cd "$objectsDir" && _cmake "$@" "$sourceDir" && make install) \
-    && storeDependency "$depend" "$sentinel"
+    && ( cd "$objectsDir" && call_cmake "$@" "$sourceDir" && \
+         make "-j${WM_NCOMPPROCS:-1}" install ) \
+    && storeDependency "$sentinel" "$depend" $@
 }
 
 
@@ -162,12 +201,12 @@ wmakeVersioned()
     objectsDir=$(findObjectDir "$sourceDir") || exit 1 # Fatal
 
     # Version changed
-    sentinel=$(sameDependency "$depend" "$sourceDir") || \
+    sentinel=$(sameDependency "$sourceDir" "$depend" $@) || \
         rm -rf "$objectsDir" 2>/dev/null
 
     mkdir -p "$objectsDir" \
     && wmake "$@" \
-    && storeDependency "$depend" "$sentinel"
+    && storeDependency "$sentinel" "$depend" $@
 }
 
 
diff --git a/wmake/scripts/have_cmake b/wmake/scripts/have_cmake
new file mode 100644
index 0000000000000000000000000000000000000000..94e0531f1eac1e1929e719a39bda1b51bdf249ff
--- /dev/null
+++ b/wmake/scripts/have_cmake
@@ -0,0 +1,122 @@
+#----------------------------------*-sh-*--------------------------------------
+# =========                 |
+# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+#  \\    /   O peration     |
+#   \\  /    A nd           | www.openfoam.com
+#    \\/     M anipulation  |
+#------------------------------------------------------------------------------
+#     Copyright (C) 2020 OpenCFD Ltd.
+#------------------------------------------------------------------------------
+# License
+#     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
+#
+# Script
+#     have_cmake
+#
+# Description
+#     Locate CMAKE executable
+#
+# Files
+#     Uses etc/config.sh/cmake (if it exists) for the
+#     CMAKE_ARCH_PATH that may specify a possible cmake/bin directory.
+#
+# Functions provided
+#     have_cmake, no_cmake, echo_cmake
+#
+# Variables set on success
+#     HAVE_CMAKE
+#     CMAKE_EXE
+#
+# When properly resolved, CMAKE_EXE will be an absolute path to the
+# cmake executable. On failure it will point to 'false'
+#
+#------------------------------------------------------------------------------
+
+# Reset variables
+no_cmake()
+{
+    unset HAVE_CMAKE CMAKE_EXE
+}
+
+
+# Report
+echo_cmake()
+{
+    echo cmake="${CMAKE_EXE:-false}"
+    echo version="$("${CMAKE_EXE:-false}" --version | sed -ne '1s/^.*version *//p')"
+}
+
+
+#
+# Try to locate cmake according to values specified in <etc/config.sh/cmake>
+# or just use what is found on the path.
+#
+# On success: return the resolved value as output.
+# On failure: set executable as "false" and return with 1
+#
+have_cmake()
+{
+    # Treat previous queries as "sticky"
+    if [ -n "$CMAKE_EXE" ]
+    then
+        test "$CMAKE_EXE" != "false"
+        return $?
+    fi
+
+    local config="config.sh/cmake"
+    unset CMAKE_ARCH_PATH
+    local settings candidate foundExe
+
+    if settings="$("$WM_PROJECT_DIR"/bin/foamEtcFile "$config" 2>/dev/null)"
+    then
+        . "$settings"
+
+        if [ -d "$CMAKE_ARCH_PATH" ]
+        then
+            candidate="$CMAKE_ARCH_PATH"/bin/cmake
+            if [ -f "$candidate" ] && [ -x "$candidate" ]
+            then
+                foundExe="$candidate"
+            fi
+        fi
+    fi
+
+    if [ -z "$foundExe" ]
+    then
+        # Default: resolve from PATH
+        if candidate="$(command -v cmake 2>/dev/null)"
+        then
+            foundExe="$candidate"
+        fi
+    fi
+
+    if [ -n "$foundExe" ]
+    then
+        # OK
+        export HAVE_CMAKE=true
+        export CMAKE_EXE="$foundExe"
+    else
+        # Failure
+        export CMAKE_EXE="false"  # Avoid repeated calls?
+        return 2
+    fi
+}
+
+
+# Reset variables
+no_cmake
+
+
+# Test/query
+case "$1" in
+-test)
+    have_cmake
+    echo_cmake
+    ;;
+-query)
+    ## query_cmake
+    ;;
+esac
+
+
+#------------------------------------------------------------------------------
diff --git a/wmake/scripts/paraviewFunctions b/wmake/scripts/paraviewFunctions
index 5a4ea1dec773c52d8ee3d9f1b2d318c2d88a921a..dc80705975e2a3c0af48083560aad91ea6508d76 100644
--- a/wmake/scripts/paraviewFunctions
+++ b/wmake/scripts/paraviewFunctions
@@ -18,8 +18,8 @@
 #     Setup of variables for creating ParaView plugins
 #
 # Requires
-#     ParaView_DIR  (unless system)
-#     PV_PLUGIN_PATH
+#     ParaView_DIR   (unless system)
+#     PV_PLUGIN_PATH (or rely on automatic mechanism)
 #
 # Provides Functions
 #     get_pvplugin_api, have_pvplugin_support, no_paraview, echo_paraview
@@ -85,22 +85,59 @@ cmakePvInstall()
     cmakeVersionedInstall "ParaView_DIR=$ParaView_DIR" "$@"
 }
 
-#
+
 # Build library - use sentinel file(s) to handle paraview version changes
+# Some difficulty handling different installation options as well
+# as wmake options, so only handle build/configure information for now
 #
+# 1 - libName
+# 2... build/configure information
+#
+# Similar to wmakeVersioned
 wmakeLibPv()
 {
     local depend="ParaView_DIR=$ParaView_DIR"
-    local sentinel libName
+    local libName="$1"
+    shift 1
+    local sentinel
 
-    for libName
-    do
-        sentinel=$(sameDependency "$depend" "$libName") || \
-            wclean $libName
+    sentinel=$(sameDependency "$libName" "$depend" $@) || \
+        wclean "$libName"
 
-        wmake $targetType $libName \
-        && storeDependency "$depend" "$sentinel"
-    done
+    wmake $targetType "$libName" \
+    && storeDependency "$sentinel" "$depend" $@
+}
+
+# Get ParaView API from given path.
+# Eg, "/path/paraview-dir/paraview-5.6" -> "5.6"
+#
+# Or the output from `paraview --version`
+# Eg, "paraview version 5.6.3" -> "5.6"
+#
+# 1 - the input path ending with paraview-x.y, or paraview --version information
+#
+# On success, return 0 and echo value
+#
+get_pvapi()
+{
+    local pv_api
+
+    # Extract paraview major+minor version from the directory name
+    # From /path/paraview-5.6 -> 5.6
+    pv_api=$(echo "${1:-none}" | \
+        sed -ne 's@^.*/@@;s@^[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*$@\1@p')
+
+    if [ -z "$pv_api" ]
+    then
+        # Extract paraview major+minor version from "paraview --version" information
+        pv_api=$(echo "${1:-none}" | \
+            sed -ne 's@^.*version *\([0-9][0-9]*\.[0-9][0-9]*\).*$@\1@p')
+    fi
+
+    [ -n "$pv_api" ] || return 1
+
+    # OK
+    echo "$pv_api"
 }
 
 
@@ -122,10 +159,9 @@ get_pvplugin_api()
     targetDir="${PV_PLUGIN_PATH##;}"
     targetDir="${targetDir%%;*}"
 
-    # Extract paraview major+minor version from the directory name
+    # Extract paraview major+minor version from directory name
     # From /path/paraview-5.6 -> 5.6
-    pv_api=$(echo "$targetDir" | \
-        sed -ne 's@^.*/@@;s/^[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\).*/\1/p')
+    pv_api=$(get_pvapi "$targetDir")
 
     [ -n "$pv_api" ] || return 1
 
@@ -147,7 +183,7 @@ get_pvplugin_api()
 have_pvplugin_support()
 {
     local warn="==> skip paraview-plugin"
-    local settings pv_api installDir binDir includeDir targetDir
+    local settings pv_api pv_executable installDir binDir includeDir targetDir
 
     # Trivial check
     command -v cmake >/dev/null || {
@@ -162,12 +198,13 @@ have_pvplugin_support()
     fi
     unset FOAM_PV_PLUGIN_LIBBIN PARAVIEW_API
 
-    if [ -z "$targetDir" ] || [ -z "$pv_api" ]
-    then
-        echo "$warn (could not determine target or major.minor version)"
-        echo "    PV_PLUGIN_PATH=${PV_PLUGIN_PATH:-???}"
-        return 1
-    fi
+    # Probably not needed...
+    # if [ -z "$targetDir" ] || [ -z "$pv_api" ]
+    # then
+    #     echo "$warn (could not determine target or major.minor version)"
+    #     echo "    PV_PLUGIN_PATH=${PV_PLUGIN_PATH:-???}"
+    #     return 1
+    # fi
 
     # Include/library names
     local header="pqServerManagerModel.h"
@@ -176,6 +213,21 @@ have_pvplugin_support()
     then
         # ParaView_DIR defined. Look for include/
 
+        # Unless already known, get API value from include directory name
+        if [ -z "$pv_api" ]
+        then
+            for settings in $(find "$ParaView_DIR"/include -maxdepth 1 -name 'paraview-*' -type d)
+            do
+                pv_api=$(get_pvapi "$settings") && break
+            done
+
+            if [ -z "$pv_api" ]
+            then
+                echo "$warn (could not determine paraview major.minor version)"
+                return 1
+            fi
+        fi
+
         header=$(findFirstFile \
             "$ParaView_DIR/include/paraview-$pv_api/$header" \
             "$ParaView_DIR/include/paraview/$header"
@@ -184,11 +236,14 @@ have_pvplugin_support()
     else
         # No ParaView_DIR defined
         # - use location of 'paraview' to guess an equivalent ParaView_DIR
-        # - assume we can use paraview-config
+        # - assume paraview-config works, but might be removed too!
 
-        binDir="$(command -v paraview 2>/dev/null)"
-        binDir="${binDir%/*}"       # Eg, /usr/bin/paraview -> /usr/bin
-        installDir="${binDir%/*}"   # Eg, /usr/bin -> /usr
+        pv_executable="$(command -v paraview 2>/dev/null)" || {
+            echo "$warn (no paraview found?)"
+            return 2
+        }
+        binDir="${pv_executable%/*}"  # Eg, /usr/bin/paraview -> /usr/bin
+        installDir="${binDir%/*}"     # Eg, /usr/bin -> /usr
 
         case "$installDir" in
         (/*)    # An absolute path
@@ -196,6 +251,17 @@ have_pvplugin_support()
         ;;
         esac
 
+        # Unless already known, get API value from `paraview --version` information
+        if [ -z "$pv_api" ]
+        then
+            pv_api=$(get_pvapi "$("$pv_executable" --version)")
+            if [ -z "$pv_api" ]
+            then
+                echo "$warn (could not determine paraview major.minor version)"
+                return 1
+            fi
+        fi
+
         header=$(findFirstFile \
             "$(paraview-config --include 2>/dev/null |sed -ne 's/^ *-I//p')/$header"\
             "${includeDir:+$includeDir/paraview-$pv_api/$header}" \
@@ -218,8 +284,9 @@ have_pvplugin_support()
     # ----------------------------------
 
     # OK
+    # Use FOAM_LIBBIN/paraview-maj.min as default
     export HAVE_PVPLUGIN_SUPPORT=true
-    export FOAM_PV_PLUGIN_LIBBIN="$targetDir"
+    export FOAM_PV_PLUGIN_LIBBIN="${targetDir:-$FOAM_LIBBIN/paraview-$pv_api}"
     export PARAVIEW_API="$pv_api"
     export PARAVIEW_INC_DIR="${header%/*}"      # Basename
 
diff --git a/wmake/scripts/wmake.cmake-args b/wmake/scripts/wmake.cmake-args
new file mode 100644
index 0000000000000000000000000000000000000000..1c618e5664b72a164e5ab282999fe419eefe44d8
--- /dev/null
+++ b/wmake/scripts/wmake.cmake-args
@@ -0,0 +1,120 @@
+#----------------------------------*-sh-*--------------------------------------
+# =========                 |
+# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+#  \\    /   O peration     |
+#   \\  /    A nd           | www.openfoam.com
+#    \\/     M anipulation  |
+#------------------------------------------------------------------------------
+#     Copyright (C) 2020 OpenCFD Ltd.
+#------------------------------------------------------------------------------
+# License
+#     This file is part of OpenFOAM, distributed under GPL-3.0-or-later.
+#
+# File
+#     wmake/scripts/wmake.cmake-args
+#
+# Description
+#     Special-purpose argument parser (eg, for Allwmake scripts)
+#     that handles -prefix=... and some other simpler tasks
+#
+# Usage
+#     # Parse the arguments by sourcing this script
+#     . ${WM_PROJECT_DIR:?}/wmake/scripts/wmake.cmake-args
+#
+# Options
+#     -prefix=...
+#     Exports CMAKE_INSTALL_PREFIX value.
+#     Handles u(ser), g(roup), o(ther) short-cuts (see foamEtcFile),
+#     absolute or relative paths
+#
+#     -j | -jN | -j N
+#     Compile using all or specified N cores/hyperthreads
+#
+#------------------------------------------------------------------------------
+
+# NB: nArgs to track the current processing position to avoid wraparound
+# when checking for optional parameters (eg, the -j processing)
+
+nArgs="$#"
+for arg in "$@"
+do
+    shift; nArgs="$((nArgs - 1))"               # Drop argument
+
+    case "$arg" in
+
+    # Install prefix: user
+    -prefix=u | -prefix=user)
+        export CMAKE_INSTALL_PREFIX="${FOAM_USER_LIBBIN%/*}"
+        echo "Install prefix = user ($CMAKE_INSTALL_PREFIX)" 1>&2
+        continue    # Handled argument
+        ;;
+
+    # Install prefix: group
+    -prefix=g | -prefix=group)
+        export CMAKE_INSTALL_PREFIX="${FOAM_SITE_LIBBIN%/*}"
+        echo "Install prefix = group ($CMAKE_INSTALL_PREFIX)" 1>&2
+        continue    # Handled argument
+        ;;
+
+    # Install prefix: other/openfoam
+    -prefix=o | -prefix=other | -prefix=openfoam)
+        export CMAKE_INSTALL_PREFIX="${FOAM_LIBBIN%/*}"
+        echo "Install prefix = openfoam ($CMAKE_INSTALL_PREFIX)" 1>&2
+        continue    # Handled argument
+        ;;
+
+    # Install prefix: custom
+    -prefix=*)
+        export CMAKE_INSTALL_PREFIX="${arg#*=}"
+        : "${CMAKE_INSTALL_PREFIX:=/usr/local}"  # Default as per autoconf
+
+        # Require as absolute path
+        [ "${CMAKE_INSTALL_PREFIX#/}" != "${CMAKE_INSTALL_PREFIX}" ] || \
+            CMAKE_INSTALL_PREFIX="${PWD}/${CMAKE_INSTALL_PREFIX}"
+
+        echo "Install prefix = $CMAKE_INSTALL_PREFIX" 1>&2
+        continue    # Handled argument
+        ;;
+
+    # Parallel compilation (all or specified number of cores)
+    -j)
+        export WM_NCOMPPROCS=0
+        if [ "$nArgs" -gt 0 ]
+        then
+            case "$1" in
+            [0-9]*)
+                if WM_NCOMPPROCS="$(expr 0 + "$1" 2>/dev/null)"
+                then
+                    shift; nArgs="$((nArgs - 1))"   # Drop argument
+                fi
+                ;;
+            esac
+        fi
+        if [ "${WM_NCOMPPROCS:=0}" -le 0 ]
+        then
+            WM_NCOMPPROCS=$(getconf _NPROCESSORS_ONLN 2>/dev/null) || \
+                WM_NCOMPPROCS=1
+        fi
+
+        echo "Compiling enabled on $WM_NCOMPPROCS cores" 1>&2
+        continue    # Handled argument
+        ;;
+
+    # Parallel compilation (specified number of cores)
+    -j[0-9]*)
+        export WM_NCOMPPROCS="${arg#-j}"
+        if [ "${WM_NCOMPPROCS:=0}" -le 0 ]
+        then
+            WM_NCOMPPROCS=$(getconf _NPROCESSORS_ONLN 2>/dev/null) || \
+                WM_NCOMPPROCS=1
+        fi
+
+        echo "Compiling enabled on $WM_NCOMPPROCS cores" 1>&2
+        continue    # Handled argument
+        ;;
+    esac
+
+    set -- "$@" "$arg"     # Reinsert unhandled argument
+done
+
+#------------------------------------------------------------------------------