#!/bin/bash #------------------------------------------------------------------------------ # ========= | # \\ / F ield | OpenFOAM: The Open Source CFD Toolbox # \\ / O peration | Website: https://openfoam.org # \\ / A nd | Copyright (C) 2011-2018 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 . # # Script # wclean # # Usage # wclean [OPTION] [dir] # wclean [OPTION] target [dir [MakeDir]] # # Description # Clean up the wmake control directory Make/\$WM_OPTIONS and remove the # lnInclude directories generated for libraries. # #------------------------------------------------------------------------------ Script=${0##*/} # Source the wmake functions # shellcheck source=scripts/wmakeFunctions . "${0%/*}/scripts/wmakeFunctions" error() { while [ "$#" -ge 1 ]; do echo "$1"; shift; done usage exit 1 } usage() { cat</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 #------------------------------------------------------------------------------ # If target not specified search up the directory tree for the Make # sub-directory, check the existence of the 'files' file and clean there if # present # ------------------------------------------------------------------------------ [ -n "$targetType" ] || cdSource #------------------------------------------------------------------------------ # Remove empty sub-directories and exit #------------------------------------------------------------------------------ if [ "$targetType" = empty ] then # First pass: clean up empty source code directories echo "Removing empty directories..." # Get sub-directories avoiding particular directories # shellcheck disable=SC2044 for dir in $(find . -mindepth 1 -maxdepth 1 \ -type d \( -name .git -prune -o -print \) ) do echo " searching: $dir" find "$dir" -depth -type d -empty -exec rmdir {} \; -print done # Second pass: clean up object directories with WM_PROJECT_DIR that don't # have respective source code folders, along with the respective binaries expandPath "$PWD" if [ "$exPath" = "$WM_PROJECT_DIR" ] then findObjectDir "$PWD" if [ -d "$objectsDir" ] then echo " Removing redundant object directories in $objectsDir" find "$objectsDir" -name 'variables' -print | \ while read -r variablesFile do # Hack'ish way of getting the original source code path depFile=$(dirname "$variablesFile") depToSource "$depFile" # Check if the original source code directory exists if [ ! -r "$sourceFile" ] then # Delete the respective binary first binaryFile=$(grep -e '^ *\(EXE\|LIB\) *= *' "$variablesFile") # Catch all file extension (o,a,so,?+) for libraries if echo "$binaryFile" | grep -qe '^ *LIB *= *' then binaryFile="${binaryFile}.*" fi # Isolate path and translate environment variables binaryFile=$(echo "$binaryFile" | \ sed -e 's/^ *\(EXE\|LIB\) *= *//' \ -e 's/(/{/g' -e 's/)/}/g' ) # Expand environment variables for path binaryFile=$(eval echo "$binaryFile") # Verbosely remove binary file if [ -n "$binaryFile" ] && [ -e "$binaryFile" ] then rm -vf "$binaryFile" 2>/dev/null fi # Remove the deprecated object directory rm -rvf "$depFile" 2>/dev/null fi done fi fi exit 0 fi #------------------------------------------------------------------------------ # Recurse the directories tree #------------------------------------------------------------------------------ if [ "$targetType" = all ] then if [ -e Allwclean ] # Consistent with Allwmake then ./Allwclean exit $? elif [ -e Allclean ] # Often used for tutorial cases then ./Allclean exit $? else # For all the sub-directories containing a 'Make' directory # shellcheck disable=SC2044 for dir in $(find . \( -type d -a -name Make \)) do dir=${dir%/Make} # Parent directory - trim /Make from the end # If Allwclean exists execute otherwise wclean if [ -e "$dir/Allwclean" ] then "$dir/Allwclean" else $0 "$dir" fi done fi fi # targetType is not needed beyond this point unset targetType #------------------------------------------------------------------------------ # Clean the 'Make' directory if present #------------------------------------------------------------------------------ if [ -d "$MakeDir" ] then objectsDir=$MakeDir/$WM_OPTIONS if [[ "$PWD" = *"$WM_PROJECT_DIR"* ]] then platformPath=$WM_PROJECT_DIR/platforms/${WM_OPTIONS} objectsDir=$platformPath${PWD//$WM_PROJECT_DIR/} fi rm -rf "$objectsDir" 2>/dev/null fi #------------------------------------------------------------------------------ # Remove the lnInclude directory if present #------------------------------------------------------------------------------ if [ -d lnInclude ] then rm -rf lnInclude 2>/dev/null fi #------------------------------------------------------------------------------ # Cleanup local variables and functions #------------------------------------------------------------------------------ unset Script usage error MakeDir #------------------------------------------------------------------------------