2017-12-15 23:46 GMT

View Issue Details Jump to Notes ]
IDProjectCategoryView StatusLast Update
0002408OpenFOAMPatchpublic2016-12-27 14:20
Reporterwyldckat 
Assigned Tohenry 
PrioritylowSeveritytextReproducibilityN/A
StatusresolvedResolutionfixed 
Product Versiondev 
Target VersionFixed in Version 
Summary0002408: wmake comments mentions 'wmakeQueue' when the current name is 'wmakeCollect'
DescriptionAttached is the file "wmake" for updating "wmake/wmake". It provides two fixes:

  - Fixed references for 'wmakeQueue' to 'wmakeCollect'

  - Typo 'existance' -> 'existence'
TagsNo tags attached.
Attached Files
  • ? file icon wmake (15,065 bytes) 2016-12-26 17:15 -
    #!/bin/bash
    #------------------------------------------------------------------------------
    # =========                 |
    # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    #  \\    /   O peration     |
    #   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
    #    \\/     M anipulation  |
    #-------------------------------------------------------------------------------
    # License
    #     This file is part of OpenFOAM.
    #
    #     OpenFOAM is free software: you can redistribute it and/or modify it
    #     under the terms of the GNU General Public License as published by
    #     the Free Software Foundation, either version 3 of the License, or
    #     (at your option) any later version.
    #
    #     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
    #     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    #     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    #     for more details.
    #
    #     You should have received a copy of the GNU General Public License
    #     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
    #
    # Script
    #     wmake
    #
    # Description
    #     General, easy to use make system for multi-platform development
    #     with support for local and network parallel compilation.
    #
    #     This updated wmake supports out-of-tree object and dependency files to
    #     avoid the clutter which accumulates in the source-tree with the original
    #     wmake system.  Now when building the OpenFOAM package both the object and
    #     dependency files are now located in a tree with the same structure as the
    #     source tree but in the platforms/$WM_OPTIONS sub-directory of
    #     $WM_PROJECT_DIR.
    #
    #     When building user libraries and applications which are not located in the
    #     OpenFOAM source-tree the object and dependency files are located in a tree
    #     with the same structure as the source tree but in the Make/$WM_OPTIONS
    #     sub-directory.
    #
    #     The disadvantage of the out-of-tree compilation is that the dependency
    #     files are harder to find but are sometimes useful to study which header
    #     files are included.  For those who need access to the dependency files the
    #     new wdep script is provided to locate them.  See the wdep script header or
    #     run:
    #         wdep -h
    #
    # See also
    #     wmakeLnInclude, wmakeLnIncludeAll, wmakeCollect, wdep, wrmdep, wrmo,
    #     wclean, wcleanPlatform, wcleanLnIncludeAll
    #
    #------------------------------------------------------------------------------
    Script=${0##*/}
    
    # Source the wmake functions
    . ${0%/*}/scripts/wmakeFunctions
    
    usage() {
        exec 1>&2
        while [ "$#" -ge 1 ]; do echo "$1"; shift; done
        cat<<USAGE
    
    Usage: $Script [OPTION] [dir]
           $Script [OPTION] target [dir [MakeDir]]
    
    options:
      -s | -silent      Quiet mode (does not echo commands)
      -a | -all         wmake all sub-directories, running Allwmake if present
      -q | -queue       wmakeCollect all sub-directories, running Allwmake if present
      -k or -non-stop   Compile without stopping when errors occur
      -j                Compile using all local cores/hyperthreads
      -jN or -j N       Compile using N cores/hyperthreads
      -no-scheduler     Compile without wmakeScheduler
      -update           Update lnInclude directories, dep files, remove deprecated
                        files and directories
      -h | -help        Print the usage
    
    
    A general, easy-to-use make system for multi-platform development
    with support for local and network parallel compilation.
    
    The 'target' is a Makefile target:
      e.g., platforms/linux64GccDPOpt/.../fvMesh.o
    
    or a special target:
      all               wmake all sub-directories, running Allwmake if present
      queue             wmakeCollect all sub-directories, running Allwmake if present
      exe               Compile statically linked executable
      lib               Compile statically linked archive lib (.a)
      libo              Compile statically linked lib (.o)
      libso             Compile dynamically linked lib (.so)
      dep               Compile lnInclude and dependencies only
      updatedep         Compile dependencies only (in case of broken dependencies)
      objects           Compile but not link
    
    USAGE
        exit 1
    }
    
    
    # Default make is the "make" in the path
    make="make"
    
    
    #------------------------------------------------------------------------------
    # Set WM_NCOMPPROCS to number of cores on local machine
    #------------------------------------------------------------------------------
    
    useAllCores()
    {
        if [ -r /proc/cpuinfo ]
        then
            WM_NCOMPPROCS=$(egrep "^processor" /proc/cpuinfo | wc -l)
        else
            WM_NCOMPPROCS=1
        fi
    
        export WM_NCOMPPROCS
    }
    
    
    #------------------------------------------------------------------------------
    # Parse arguments and options
    #------------------------------------------------------------------------------
    
    # Default to compiling the local target only
    all=
    update=
    
    while [ "$#" -gt 0 ]
    do
        case "$1" in
            # Print help
            -h | -help)
                usage
                ;;
            -s | -silent)
                export WM_QUIET=1
                ;;
            -a | -all | all)
                all="all"
                ;;
            -q | -queue | queue)
                all="queue"
                ;;
            # Parallel compilation on all cores of local machine
            -j)
                useAllCores
                test $# -ge 2 && expr $2 + 1 > /dev/null 2>&1 \
                    && shift && export WM_NCOMPPROCS=$1
                echo "Compiling enabled on $WM_NCOMPPROCS cores"
                ;;
            # Parallel compilation on specified number of cores
            -j*)
                export WM_NCOMPPROCS=${1#-j}
                echo "Compiling enabled on $WM_NCOMPPROCS cores"
                ;;
            # Non-stop compilation, ignoring errors
            -k | -non-stop)
                export WM_CONTINUE_ON_ERROR=1
                ;;
            # Disable scheduled parallel compilation
            -no-scheduler)
                unset WM_SCHEDULER
                ;;
            # Meant to be used following a pull, this will:
            # - remove dep files that depend on deleted files;
            # - remove stale dep files;
            # - update lnInclude directories;
            # - remove empty directories, along with deprecated object directories
            #   and respective binaries.
            -update)
                update="true"
                [ -z "$all" ] && all="all"
                ;;
            --)
                shift
                break
                ;;
            -*)
                usage "unknown option: '$*'"
                ;;
            *)
                break
                ;;
        esac
        shift
    done
    
    
    #------------------------------------------------------------------------------
    # Check environment variables
    #------------------------------------------------------------------------------
    
    checkEnv
    
    # When compiling anything but a standalone exe WM_PROJECT and WM_PROJECT_DIR
    # must be set
    [ "$1" = exe -o \( "$WM_PROJECT" -a "$WM_PROJECT_DIR" \) ] || {
        echo "$Script error:" 1>&2
        echo "    environment variable \$WM_PROJECT or " \
             "\$WM_PROJECT_DIR not set" 1>&2
        echo "    while building project library" 1>&2
        exit 1
    }
    
    
    #------------------------------------------------------------------------------
    # Setup parallel compilation
    #------------------------------------------------------------------------------
    
    # Set WM_NCOMPPROCS automatically when both WM_HOSTS and WM_SCHEDULER are set
    if [ -z "$WM_NCOMPPROCS" -a -n "$WM_HOSTS" -a -n "$WM_SCHEDULER" ]
    then
        WM_NCOMPPROCS=$(wmakeScheduler -count)
        [ $? -eq 0 ] || unset WM_NCOMPPROCS
    fi
    
    if [ "$WM_NCOMPPROCS" ]
    then
        parOpt="-j $WM_NCOMPPROCS"
    
        if [ "$WM_NCOMPPROCS" -gt 1 -a ! "$MAKEFLAGS" ]
        then
            lockDir=$HOME/.$WM_PROJECT/.wmake
    
            if [ -d $lockDir ]
            then
                rm -f $lockDir/*
            else
                mkdir -p $lockDir
            fi
    
            make="$make --no-print-directory $parOpt"
        fi
    fi
    
    
    #------------------------------------------------------------------------------
    # Check arguments and change to the directory in which to run wmake
    #------------------------------------------------------------------------------
    
    unset dir targetType
    MakeDir=Make
    
    if [ $# -ge 1 ]
    then
        if [ -d "$1" ]
        then
            dir=$1
        else
            targetType=$1
        fi
    
        # Specified directory name:
        [ $# -ge 2 ] && dir=$2
    
        # Specified alternative name for the Make sub-directory:
        [ $# -ge 3 ] && MakeDir=$3
    
        if [ "$dir" ]
        then
            cd $dir 2>/dev/null || {
                echo "$Script error: could not change to directory '$dir'" 1>&2
                exit 1
            }
        fi
    
        # Print command
        [ -z "$targetType" ] || targetSpace=" "
        echo "$Script $targetType$targetSpace${dir:-.}"
    fi
    
    
    #------------------------------------------------------------------------------
    # Recurse the source tree to compile "all" targets
    #------------------------------------------------------------------------------
    
    if [ -n "$update" ]
    then
        wrmdep -update
        wrmdep -old
        wmakeLnIncludeAll -update $parOpt
        wclean empty
        export WM_UPDATE_DEPENDENCIES=yes
    fi
    
    
    #------------------------------------------------------------------------------
    # Recurse the source tree to compile "all" targets
    #------------------------------------------------------------------------------
    
    if [ "$all" = "all" ]
    then
        if [ -e Allwmake ]
        then
            ./Allwmake -fromWmake $targetType
            exit $?
        else
            # Have to keep track of the main exit code for the call to "make"
            makeExitCode=0
    
            # Find all the sub-directories containing a 'Make' directory
            FOAM_APPS=$(\
                           for d in *; \
                           do [ -d "$d" -a "$d" != Optional -a "$d" != Make ] \
                              && echo "$d"; \
                           done | xargs \
                     )
            if [ ! "$FOAM_APPS" = "" ]
            then
                # Compile all applications in sub-directories
                $make ${WM_CONTINUE_ON_ERROR:+-k} \
                      -f $WM_DIR/makefiles/apps \
                      TARGET="$targetType" FOAM_APPS="$FOAM_APPS"
                makeExitCode=$?
            fi
            # If the current directory contains a 'Make' directory continue
            # otherwise exit, or always exit in case of error
            if [ ! -d $MakeDir -o $makeExitCode -ne 0 ]
            then
                exit $makeExitCode
            fi
    
            # Clean up tracking variable
            unset makeExitCode
        fi
    fi
    
    
    #------------------------------------------------------------------------------
    # Recurse the source tree to compile "all" targets using wmakeCollect
    #------------------------------------------------------------------------------
    
    if [ "$all" = "queue" ]
    then
        [ -n "$update" ] || wmakeLnIncludeAll $parOpt
    
        (
            export WM_COLLECT_DIR=$WM_PROJECT_DIR/platforms/${WM_OPTIONS}/${PWD////_}
            export WM_SCHEDULER=wmakeCollect
            trap '$WM_SCHEDULER -kill' TERM INT
            $WM_SCHEDULER -clean                                                   \
         && wmake -all objects                                                     \
         && $WM_SCHEDULER
        ) && wmake -all
        exit $?
    fi
    
    
    #------------------------------------------------------------------------------
    # Search up the directory tree for the Make sub-directory,
    # check the existence of the 'files' file and build there if present
    #------------------------------------------------------------------------------
    
    cdSource
    
    
    #------------------------------------------------------------------------------
    # Transform options
    #------------------------------------------------------------------------------
    
    # Transform no option to "libso" if that looks appropriate or remove it
    # so that the call to make builds the application
    if [ "$targetType" = "" ]
    then
        unset targetType
        if grep -e '^ *LIB *=' "$MakeDir/files" >/dev/null 2>&1
        then
            targetType=libso
        fi
    elif grep -e '^ *EXE *=' "$MakeDir/files" >/dev/null 2>&1
    then
        # Application. Remove any nonsense targetType
        case "$targetType" in
          lib*)
            unset targetType
            break
            ;;
        esac
    fi
    
    
    #------------------------------------------------------------------------------
    # Spawn a sub-shell and unset MAKEFLAGS in that sub-shell to avoid
    # files and options being built in parallel
    #------------------------------------------------------------------------------
    
    objectsDir=$MakeDir/$WM_OPTIONS
    if [ $(echo $PWD | grep "$WM_PROJECT_DIR") ]
    then
        platformPath=$WM_PROJECT_DIR/platforms/${WM_OPTIONS}
        objectsDir=$platformPath$(echo $PWD | sed s%$WM_PROJECT_DIR%% )
    fi
    
    (
        unset MAKEFLAGS
        mkdir -p $objectsDir
    
        # Pre-build the $WM_OPTIONS/options file
        # which is included when building the $WM_OPTIONS/files file
        $make -s -f $WM_DIR/makefiles/files MAKE_DIR=$MakeDir \
              OBJECTS_DIR=$objectsDir $objectsDir/options
    
        $make -s -f $WM_DIR/makefiles/files MAKE_DIR=$MakeDir \
              OBJECTS_DIR=$objectsDir
    )
    
    
    #------------------------------------------------------------------------------
    # Check the $objectsDir/sourceFiles file was created successfully
    #------------------------------------------------------------------------------
    
    [ -r $objectsDir/sourceFiles ] || {
        echo "$Script error: file '$objectsDir/sourceFiles'" \
             "could not be created in $PWD" 1>&2
        exit 1
    }
    
    
    #------------------------------------------------------------------------------
    # Make the dependency files
    #------------------------------------------------------------------------------
    
    # For libraries create lnInclude ...
    case "$targetType" in
        lib | libo | libso | dep )
            # ... but only if 'LIB' is declared in 'Make/files'
            if grep -e '^ *LIB *=' "$MakeDir/files" >/dev/null 2>&1
            then
                $make -s -f $WM_DIR/makefiles/general MAKE_DIR=$MakeDir \
                      OBJECTS_DIR=$objectsDir lnInclude
            fi
            ;;
    esac
    
    
    #------------------------------------------------------------------------------
    # When WM_UPDATE_DEPENDENCIES is set, use forced dependency files update
    #------------------------------------------------------------------------------
    
    if [ -n "$WM_UPDATE_DEPENDENCIES" ]
    then
    
        $make -f $WM_DIR/makefiles/general MAKE_DIR=$MakeDir \
            OBJECTS_DIR=$objectsDir updatedep
        makeExitCode=$?
    
        if [ $makeExitCode -ne 0 ]
        then
            exit $makeExitCode
        fi
    
        unset makeExitCode
    fi
    
    
    #------------------------------------------------------------------------------
    # Make the dependency files or object files and link
    #------------------------------------------------------------------------------
    
    exec $make -f $WM_DIR/makefiles/general MAKE_DIR=$MakeDir \
         OBJECTS_DIR=$objectsDir $targetType
    
    
    #------------------------------------------------------------------------------
    # Cleanup local variables and functions
    #------------------------------------------------------------------------------
    
    unset Script usage useAllCores update expandPath findTarget
    
    
    #------------------------------------------------------------------------------
    
    ? file icon wmake (15,065 bytes) 2016-12-26 17:15 +

-Relationships
+Relationships

-Notes

~0007552

henry (manager)

Resolved by commit 9efade0139397b46485f0805a3d0b958fe20f9e3
+Notes

-Issue History
Date Modified Username Field Change
2016-12-26 17:14 wyldckat New Issue
2016-12-26 17:14 wyldckat Status new => assigned
2016-12-26 17:14 wyldckat Assigned To => henry
2016-12-26 17:15 wyldckat File Added: wmake
2016-12-27 14:20 henry Status assigned => resolved
2016-12-27 14:20 henry Resolution open => fixed
2016-12-27 14:20 henry Note Added: 0007552
+Issue History