From 60d392268198bba0467b20fedd0d003c3ac53792 Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Wed, 15 Apr 2020 14:51:54 +0200 Subject: [PATCH] ENH: support build of scotch executables - improve library checks to avoid unnecessary rebuild when cross-compiling --- makeSCOTCH | 145 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 87 insertions(+), 58 deletions(-) diff --git a/makeSCOTCH b/makeSCOTCH index 9691b27..45a5ebf 100755 --- a/makeSCOTCH +++ b/makeSCOTCH @@ -6,17 +6,16 @@ # \\ / 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 -# . +# This file is part of OpenFOAM, distributed under GPL-3.0-or-later. # # Script # makeSCOTCH # # Description -# Build the SCOTCH and PTSCOTCH libraries +# Build the SCOTCH and PTSCOTCH libraries, optionally build binaries # # ---------------------------------------------- # NO USER-CONFIGURABLE SETTINGS WITHIN THIS FILE @@ -53,18 +52,22 @@ usage() Usage: ${0##*/} [OPTION] [libso] [scotch-VERSION] options: + -force Force compilation, even if include/library already exists -gcc Force use of gcc/g++ + -bin Create scotch binaries as well (experimental) + -no-bin Suppress creation of scotch binaries (default) -no-mpi Suppress build of pt-scotch -help * Compile SCOTCH - $kahipPACKAGE + $scotchPACKAGE USAGE exit 1 } #------------------------------------------------------------------------------ +unset optBinaries optForce # Parse options while [ "$#" -gt 0 ] do @@ -73,9 +76,11 @@ do -h | -help) usage ;; -gcc) useGcc ;; - -no-mpi) - unset withMPI - ;; + -force) optForce=true ;; + -bin) optBinaries=true ;; + -no-bin) unset optBinaries ;; + -no-mpi) unset withMPI ;; + scotch-[1-9]* | scotch-git | scotch_* | scotch-[1-9]*) scotchPACKAGE="${1%%/}" unset SCOTCH_ARCH_PATH # Avoid inconsistency @@ -90,11 +95,11 @@ done [ -n "$scotchPACKAGE" ] || die "The scotch-VERSION was not specified" # Nothing to build -if _foamIsNone $scotchPACKAGE +if _foamIsNone "$scotchPACKAGE" then echo "Using scotch-none (skip ThirdParty build of SCOTCH)" exit 0 -elif _foamIsSystem $scotchPACKAGE +elif _foamIsSystem "$scotchPACKAGE" then echo "Using scotch-system" exit 0 @@ -123,7 +128,7 @@ makefileInc="../../$scotchMakefile" # SCOTCH_ARCH_PATH : installation directory # SCOTCH_SOURCE_DIR : location of the original sources -SCOTCH_SOURCE_DIR=$sourceBASE/$scotchPACKAGE +SCOTCH_SOURCE_DIR="$sourceBASE/$scotchPACKAGE" : "${SCOTCH_ARCH_PATH:=$installBASE$WM_SIZE_OPTIONS/$scotchPACKAGE}" [ -d "$SCOTCH_SOURCE_DIR/src" ] || { @@ -137,12 +142,19 @@ echo ======================================== echo "scotch decomposition ($scotchPACKAGE)" echo " Makefile.inc : ${makefileInc##*/}" +# (serial) scotch +prefixDIR="$SCOTCH_ARCH_PATH" +binDIR="$prefixDIR"/bin +incDIR="$prefixDIR"/include +libDIR="$FOAM_EXT_LIBBIN" + # Test installation. May or may not have libscotcherrexit.so -if [ -f "$SCOTCH_ARCH_PATH/include/scotch.h" ] \ -&& [ -r "$FOAM_EXT_LIBBIN/libscotch$EXT_SO" ] +if [ -z "$optForce" ] \ +&& [ -f "$incDIR"/scotch.h ] \ +&& haveLibso "$libDIR"/libscotch then - echo " scotch include: $SCOTCH_ARCH_PATH/include" - echo " scotch library: $FOAM_EXT_LIBBIN" + echo " scotch include: $incDIR" + echo " scotch library: $libDIR" elif [ -d "$SCOTCH_SOURCE_DIR" ] then ( @@ -163,18 +175,14 @@ then applyPatch "$scotchPACKAGE" .. # patch at parent-level - prefixDIR=$SCOTCH_ARCH_PATH - incDIR=$SCOTCH_ARCH_PATH/include - libDIR=$FOAM_EXT_LIBBIN - - mkdir -p $prefixDIR 2>/dev/null - mkdir -p $incDIR 2>/dev/null - mkdir -p $libDIR 2>/dev/null + mkdir -p "$binDIR" 2>/dev/null + mkdir -p "$incDIR" 2>/dev/null + mkdir -p "$libDIR" 2>/dev/null if [ -f "$makefileInc" ] then rm -f Makefile.inc - ln -s $makefileInc Makefile.inc + ln -s "$makefileInc" Makefile.inc fi [ -f Makefile.inc ] || { echo " Error: scotch needs an appropriate Makefile.inc" @@ -187,15 +195,24 @@ then # Consistency for Intel-MPI and non-icc compilers [ -n "$I_MPI_CC" ] || export I_MPI_CC="$(whichCC)" + # The make targets + make_targets="libscotch" + if [ "$optBinaries" = true ] + then + make_targets="$make_targets scotch" + fi + make realclean 2>/dev/null # Extra safety - make -j $WM_NCOMPPROCS libscotch \ + make -j $WM_NCOMPPROCS $make_targets \ && make \ - prefix=$prefixDIR \ - includedir=$incDIR \ - libdir=$libDIR \ + prefix="$prefixDIR" \ + bindir="$binDIR" \ + libdir="$libDIR" \ + includedir="$incDIR" \ install - rmdir "$SCOTCH_ARCH_PATH/bin" 2> /dev/null || true # Superfluous bin? + rmdir "$binDIR" 2>/dev/null || true # Remove empty bin/ + rmdir "${binDIR%/*}" 2>/dev/null || true # ... and empty parent make realclean 2>/dev/null || true # Failed cleanup is uncritical ) || warnBuildIssues SCOTCH else @@ -211,25 +228,32 @@ fi exit 0 } -echo -echo ======================================== -echo "pt-scotch decomposition ($scotchPACKAGE with $FOAM_MPI)" - # Build ptscotch if normal scotch was built (has include and library) -[ -f "$SCOTCH_ARCH_PATH/include/scotch.h" ] && \ -[ -r "$FOAM_EXT_LIBBIN/libscotch$EXT_SO" ] || \ -{ - # Report that the above tests failed and pass-through the failure - echo - echo " skipping - no found" - exit 2 -} - -if [ -f "$SCOTCH_ARCH_PATH/include/$FOAM_MPI/ptscotch.h" ] && \ - [ -r "$FOAM_EXT_LIBBIN/$FOAM_MPI/libptscotch$EXT_SO" ] +# (reuse prefix/include/lib dirs set above) +if [ -f "$incDIR"/scotch.h ] \ +&& haveLibso "$libDIR"/libscotch then - echo " ptscotch include: $SCOTCH_ARCH_PATH/include/$FOAM_MPI" - echo " ptscotch library: $FOAM_EXT_LIBBIN/$FOAM_MPI" + echo + echo ======================================== + echo "pt-scotch decomposition ($scotchPACKAGE with $FOAM_MPI)" +else + # Report that the above tests failed and pass-through the failure + echo "Skipping pt-scotch - no found" + exit 2 +fi + +# (parallel) pt-scotch +prefixDIR="$SCOTCH_ARCH_PATH" +binDIR="$prefixDIR/bin/$FOAM_MPI" +incDIR="$prefixDIR/include/$FOAM_MPI" +libDIR="$FOAM_EXT_LIBBIN/$FOAM_MPI" + +if [ -z "$optForce" ] \ +&& [ -f "$incDIR"/ptscotch.h ] \ +&& haveLibso "$libDIR"/libptscotch +then + echo " ptscotch include: $incDIR" + echo " ptscotch library: $libDIR" else ( # Older versions ok, but scotch-6.0.5a cannot build in parallel. @@ -246,18 +270,14 @@ else export GIT_DIR="$SCOTCH_SOURCE_DIR/.git" # Mask seeing our own git-repo echo - prefixDIR=$SCOTCH_ARCH_PATH - incDIR=$SCOTCH_ARCH_PATH/include/$FOAM_MPI - libDIR=$FOAM_EXT_LIBBIN/$FOAM_MPI - - mkdir -p $prefixDIR 2>/dev/null - mkdir -p $incDIR 2>/dev/null - mkdir -p $libDIR 2>/dev/null + mkdir -p "$binDIR" 2>/dev/null + mkdir -p "$incDIR" 2>/dev/null + mkdir -p "$libDIR" 2>/dev/null if [ -f "$makefileInc" ] then rm -f Makefile.inc - ln -s $makefileInc Makefile.inc + ln -s "$makefileInc" Makefile.inc fi [ -f Makefile.inc ] || { echo " Error: ptscotch needs an appropriate Makefile.inc" @@ -270,15 +290,24 @@ else # Consistency for Intel-MPI and non-icc compilers [ -n "$I_MPI_CC" ] || export I_MPI_CC="$(whichCC)" + # The make targets. No simple means of handling mpi-specific binaries + make_targets="libptscotch" + if [ "$optBinaries" = true ] + then + make_targets="$make_targets ptscotch" + fi + make realclean 2>/dev/null # Extra safety - make -j $WM_NCOMPPROCS libptscotch \ + make -j $WM_NCOMPPROCS $make_targets \ && make \ - prefix=$prefixDIR \ - includedir=$incDIR \ - libdir=$libDIR \ + prefix="$prefixDIR" \ + bindir="$binDIR" \ + libdir="$libDIR" \ + includedir="$incDIR" \ install - rmdir "$SCOTCH_ARCH_PATH/bin" 2> /dev/null || true # Superfluous bin? + rmdir "$binDIR" 2>/dev/null || true # Remove empty bin/ + rmdir "${binDIR%/*}" 2>/dev/null || true # ... and empty parent make realclean 2>/dev/null || true # Failed cleanup is uncritical ) || warnBuildIssues PTSCOTCH fi