ENH: add bin/tools/createMingwRuntime helper
Script to copy/create mingw run-time installation from the Linux cross-compilation. Packs everything into a tar or a zip file. To accommodate Windows, all .dll files are also placed in the platforms bin/ directory where they are easily found via the PATH. Futhermore, ThirdParty dll files (including those from mingw itself) are also placed in the same directory. --- Steps - bundles common files and directories (bin, etc, META-INFO, ...) - copies .exe files from FOAM_APPBIN and .dll files from FOAM_LIBBIN to the new target platforms/win64MingwDPInt32Opt/bin. - copies mingw sys-root .dll files to the new target platforms/win64MingwDPInt32Opt/bin - copies other ThirdParty dll files (scotch, fftw, etc) to platforms/win64MingwDPInt32Opt/bin - copies tutorials (can be deactivated) --- Note Can only be called when the linux64Mingw environment is active.
This commit is contained in:
parent
a6e86caa62
commit
18c68e6b74
445
bin/tools/createMingwRuntime
Executable file
445
bin/tools/createMingwRuntime
Executable file
@ -0,0 +1,445 @@
|
||||
#!/bin/bash
|
||||
#------------------------------------------------------------------------------
|
||||
# ========= |
|
||||
# \\ / 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
|
||||
# createMingwRuntime
|
||||
#
|
||||
# Description
|
||||
# Script to copy/create mingw run-time installation from the Linux
|
||||
# cross-compilation. Packs everything into a tar or a zip file.
|
||||
#
|
||||
# To accommodate Windows, all .dll files are also placed in the
|
||||
# platforms bin/ directory where they are easily found via the PATH.
|
||||
#
|
||||
# Futhermore, ThirdParty dll files (including those from mingw itself)
|
||||
# are also placed in the same directory.
|
||||
#
|
||||
# Steps
|
||||
# - bundles common files and directories (bin, etc, META-INFO, ...)
|
||||
#
|
||||
# - copies .exe files from FOAM_APPBIN and .dll files from FOAM_LIBBIN
|
||||
# to the new target platforms/win64MingwDPInt32Opt/bin.
|
||||
#
|
||||
# - copies mingw sys-root .dll files to the new target
|
||||
# platforms/win64MingwDPInt32Opt/bin
|
||||
#
|
||||
# - copies other ThirdParty dll files (scotch, fftw, etc) to
|
||||
# platforms/win64MingwDPInt32Opt/bin
|
||||
#
|
||||
# - copies tutorials (can be deactivated)
|
||||
#
|
||||
# Note
|
||||
# Can only be called when the linux64Mingw environment is active.
|
||||
#
|
||||
# Slightly ad hoc, potentially incomplete.
|
||||
#
|
||||
#------------------------------------------------------------------------------
|
||||
printHelp() {
|
||||
cat<<USAGE
|
||||
|
||||
usage: ${0##*/} [OPTION]
|
||||
options:
|
||||
-name=NAME Stem for tar-file (default: auto)
|
||||
-output=DIR Output directory (default: ".")
|
||||
-prefix=NAME Prefix directory within tar-file (default: auto)
|
||||
-no-tutorials Exclude tutorials
|
||||
-no-patch Ignore '_patch' number for output tar-file
|
||||
-no-prefix Do not prefix subdirectory
|
||||
-no-compress Disable compression
|
||||
-compress=TYPE Use specified compression type
|
||||
-sep=SEP Change version/patch separator from '_' to SEP
|
||||
-with-api=NUM Specify alternative api value for packaging
|
||||
-with-testbin Include any Test-* files from user appbin (expert option)
|
||||
-tgz, -xz, -zip Alias for -compress=tgz, -compress=xz, -compress=zip
|
||||
-help Print help
|
||||
|
||||
Pack OpenFOAM cross-compiled linux64Mingw -> win64Mingw (run-time)
|
||||
|
||||
USAGE
|
||||
exit 0 # Clean exit
|
||||
}
|
||||
|
||||
# Report error and exit
|
||||
die()
|
||||
{
|
||||
exec 1>&2
|
||||
echo
|
||||
echo "Error encountered:"
|
||||
while [ "$#" -ge 1 ]; do echo " $1"; shift; done
|
||||
echo
|
||||
echo "See '${0##*/} -help' for usage"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
outputDir="."
|
||||
versionSeparator='_'
|
||||
withPatchNum=true
|
||||
unset compress packageApi withLibs withTutorials prefixDir tarName
|
||||
unset withTestBin
|
||||
|
||||
# Cleanup tarName to remove trailing '.tar', detect compression etc
|
||||
cleanTarName() {
|
||||
case "$tarName" in
|
||||
(*.tar)
|
||||
tarName="${tarName%.tar}"
|
||||
;;
|
||||
(*.tar.*)
|
||||
compress="${tarName#*.tar.}"
|
||||
tarName="${tarName%.tar*}"
|
||||
;;
|
||||
(*.tgz)
|
||||
compress="tgz"
|
||||
tarName="${tarName%.tgz}"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
while [ "$#" -gt 0 ]
|
||||
do
|
||||
case "$1" in
|
||||
-h | -help*)
|
||||
printHelp
|
||||
;;
|
||||
-name=*)
|
||||
tarName="${1#*=}"
|
||||
cleanTarName
|
||||
;;
|
||||
-output=*)
|
||||
outputDir="${1#*=}"
|
||||
;;
|
||||
-prefix=*)
|
||||
prefixDir="${1#*=}"
|
||||
prefixDir="${prefixDir%/}"
|
||||
;;
|
||||
-no-tutor*)
|
||||
withTutorials=false
|
||||
;;
|
||||
-no-patch)
|
||||
withPatchNum=false
|
||||
;;
|
||||
-no-prefix)
|
||||
prefixDir=false
|
||||
;;
|
||||
-no-compress)
|
||||
unset compress
|
||||
;;
|
||||
-compress=*)
|
||||
compress="${1#*=}"
|
||||
;;
|
||||
-sep=*)
|
||||
versionSeparator="${1#*=}"
|
||||
;;
|
||||
-with-api=*)
|
||||
packageApi="${1#*=}"
|
||||
;;
|
||||
-with-testbin*)
|
||||
withTestBin=true
|
||||
;;
|
||||
-tgz | -xz | -zip)
|
||||
compress="${1#*-}"
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
-*)
|
||||
die "unknown option: '$1'"
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
# Failsafe version separator
|
||||
: "${versionSeparator:=_}"
|
||||
|
||||
# Verify some basic values
|
||||
buildPlatform="$WM_ARCH$WM_COMPILER"
|
||||
compOptions="${WM_OPTIONS#$buildPlatform}"
|
||||
|
||||
targetPlatform="win64$WM_COMPILER" # <- x86_64-w64-mingw32
|
||||
expectedBuildPlatform="linux64Mingw"
|
||||
|
||||
if [ "$buildPlatform" != "$expectedBuildPlatform" ]
|
||||
then
|
||||
die "Requires <$expectedBuildPlatform> environment: found <$buildPlatform>"
|
||||
fi
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Resolve the output directory
|
||||
outputDir="$(cd "$outputDir" 2>/dev/null && pwd -L)" || \
|
||||
die "Cannot resolve output directory"
|
||||
|
||||
[ -w "$outputDir" ] || \
|
||||
die "Output directory non-writable: $outputDir"
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
# Determine the API and PATCH numbers.
|
||||
# Extract from META-INFO/api-info
|
||||
|
||||
api="$($WM_PROJECT_DIR/bin/foamEtcFile -show-api)"
|
||||
patch="$($WM_PROJECT_DIR/bin/foamEtcFile -show-patch)"
|
||||
|
||||
echo "Detected api, patch as '$api', '$patch'" 1>&2
|
||||
if [ -n "$packageApi" ]
|
||||
then
|
||||
echo "Specified package api=$packageApi" 1>&2
|
||||
else
|
||||
packageApi="$api"
|
||||
fi
|
||||
|
||||
|
||||
# Define the output names
|
||||
|
||||
if [ -z "$prefixDir" ]
|
||||
then
|
||||
prefixDir="OpenFOAM-v${packageApi}"
|
||||
elif [ "$prefixDir" = false ]
|
||||
then
|
||||
unset prefixDir
|
||||
fi
|
||||
|
||||
if [ -z "$tarName" ]
|
||||
then
|
||||
tarName="OpenFOAM-v${packageApi}"
|
||||
if [ "$withPatchNum" = false ]
|
||||
then
|
||||
echo "Ignoring patch number for output name" 1>&2
|
||||
elif [ "${patch:-0}" -gt 0 ]
|
||||
then
|
||||
tarName="${tarName}${versionSeparator}${patch}"
|
||||
fi
|
||||
|
||||
tarName="${tarName}-win64"
|
||||
fi
|
||||
|
||||
echo 1>&2
|
||||
echo "Tar-file name: $tarName.tar" 1>&2
|
||||
echo "Directory name: $prefixDir${prefixDir:+/}" 1>&2
|
||||
echo "Output directory: $outputDir" 1>&2
|
||||
echo 1>&2
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
# Create
|
||||
cd "$WM_PROJECT_DIR" || exit
|
||||
|
||||
tmpDir="$(mktemp -d openfoam-mingw-runtime.XXXXXXXX --tmpdir)"
|
||||
tmpTarget="$tmpDir${prefixDir:+/}${prefixDir}"
|
||||
|
||||
trap 'echo "remove $tmpDir"; rm -f $tmpDir 2>/dev/null; exit' EXIT TERM INT
|
||||
echo "Using tmp directory: $tmpDir"
|
||||
|
||||
# Proper umask
|
||||
umask 022
|
||||
|
||||
# Runtime directories
|
||||
mkdir -p "$tmpTarget/platforms/$targetPlatform$compOptions"
|
||||
|
||||
# No separate ThirdParty
|
||||
echo "Third-party libraries in platforms/$targetPlatform$compOptions" >| "$tmpTarget/ThirdParty"
|
||||
|
||||
echo "Copy common files" 1>&2
|
||||
rsync -a --exclude .gitignore COPYING META-INFO README.md bin etc "$tmpTarget"
|
||||
|
||||
if [ -n "$FOAM_CONFIG_ETC" ]
|
||||
then
|
||||
etcDir="${FOAM_CONFIG_ETC##*/}"
|
||||
if [ "$WM_PROJECT_DIR/$etcDir" = "$FOAM_CONFIG_ETC" ]
|
||||
then
|
||||
echo "Copy additional config dir: $etcDir" 1>&2
|
||||
rsync -a "$etcDir" "$tmpTarget"
|
||||
else
|
||||
echo "Do not know how to copy additional config dir: $FOAM_CONFIG_ETC" 1>&2
|
||||
fi
|
||||
else
|
||||
echo "No additional config dir" 1>&2
|
||||
fi
|
||||
|
||||
|
||||
root="platforms/$buildPlatform$compOptions"
|
||||
binDir="$tmpTarget/platforms/$targetPlatform$compOptions/bin"
|
||||
libDir="$tmpTarget/platforms/$targetPlatform$compOptions/lib"
|
||||
|
||||
userBinDir="$tmpTarget/platforms/$targetPlatform$compOptions/user-bin"
|
||||
|
||||
# Definitely need this directory
|
||||
mkdir -p "$binDir"
|
||||
|
||||
# Mingw installation libs
|
||||
other=/usr/x86_64-w64-mingw32/sys-root/mingw
|
||||
if [ -d "$other" ] && [ -d "$other"/bin ]
|
||||
then
|
||||
echo "Copy mingw sys-root .dll files -> platforms bin/" 1>&2
|
||||
rsync -a "$other"/bin/*.dll "$binDir"
|
||||
else
|
||||
echo "Missing mingw .dll files? This looks strange..." 1>&2
|
||||
fi
|
||||
|
||||
echo "Copy .exe files and .dll files -> platforms bin/" 1>&2
|
||||
rsync -a "$root"/bin/*.exe "$root"/lib/*.dll "$binDir"
|
||||
|
||||
# Pstream .dll into bin directory
|
||||
other="$root/lib/$FOAM_MPI"
|
||||
if [ -d "$other" ] && [ -n "$FOAM_MPI" ]
|
||||
then
|
||||
echo "Copy ($FOAM_MPI) libPstream.dll -> platforms bin/" 1>&2
|
||||
rsync -a "$other"/*.dll "$binDir"
|
||||
fi
|
||||
|
||||
# Various dummy (stub) libraries
|
||||
other="$root/lib/dummy"
|
||||
if [ -d "$other" ]
|
||||
then
|
||||
echo "Copy (dummy) *.dll -> platforms bin/" 1>&2
|
||||
for fullpath in "$other"/*.dll
|
||||
do
|
||||
name="${fullpath##*/}"
|
||||
if [ -f "$fullpath" ]
|
||||
then
|
||||
if [ -f "$binDir/$name" ]
|
||||
then
|
||||
echo " [skip dummy/$name]" 1>&2
|
||||
else
|
||||
echo " dummy/$name" 1>&2
|
||||
cp -p "$fullpath" "$binDir"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Miscellaneous ThirdParty items
|
||||
other="$FOAM_EXT_LIBBIN"
|
||||
if [ -d "$other" ]
|
||||
then
|
||||
echo "Copy FOAM_EXT_LIBBIN .dll files -> platforms bin/" 1>&2
|
||||
rsync -a "$other"/*.dll "$binDir"
|
||||
fi
|
||||
|
||||
other="$FFTW_ARCH_PATH"
|
||||
if [ -d "$other" ] && [ -d "$other"/bin ]
|
||||
then
|
||||
echo "Copy FFTW_ARCH_PATH .dll files -> platforms bin/" 1>&2
|
||||
rsync -a "$other"/bin/*.dll "$binDir"
|
||||
fi
|
||||
|
||||
|
||||
# Other (non .dll) files into lib
|
||||
if [ "$withLibs" = true ]
|
||||
then
|
||||
echo "Copy non-dll library files -> platforms lib/" 1>&2
|
||||
echo "... currently unsupported" 1>&2
|
||||
# mkdir -p "$libDir"
|
||||
# rsync -a \
|
||||
# --exclude='*.dll' --exclude='*.o' \
|
||||
# "$root"/lib/ \
|
||||
# "$libDir"
|
||||
else
|
||||
:
|
||||
# echo "Skip non-dll library files -> platforms lib/" 1>&2
|
||||
fi
|
||||
|
||||
|
||||
# Any Test-* files from FOAM_USER_APPBIN
|
||||
if [ "$withTestBin" = true ]
|
||||
then
|
||||
if [ "$(find "$FOAM_USER_APPBIN" -name 'Test-*.exe' | wc -l)" -ge 1 ]
|
||||
then
|
||||
echo "Copy Test-*.exe files from user appbin -> platforms user-bin/"
|
||||
mkdir -p "$userBinDir"
|
||||
rsync -a "$FOAM_USER_APPBIN"/Test-*.exe "$userBinDir"
|
||||
else
|
||||
echo "No Test-*.exe files in user appbin"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
# Add in tutorials
|
||||
if [ "$withTutorials" != false ]
|
||||
then
|
||||
if [ -d ".git" ]
|
||||
then
|
||||
echo "Copy tutorials from git..." 1>&2
|
||||
git archive --format=tar HEAD tutorials | (cd "$tmpTarget" && tar -xf -)
|
||||
else
|
||||
echo "Copying the tutorials directory" 1>&2
|
||||
rsync -a tutorials "$tmpTarget"
|
||||
fi
|
||||
else
|
||||
echo "Skip tutorials" 1>&2
|
||||
fi
|
||||
|
||||
echo ===============
|
||||
echo "Done copying. Now create archive"
|
||||
|
||||
|
||||
# Compression
|
||||
archiveCommand="tar -cf"
|
||||
archiveSuffix=".tar"
|
||||
|
||||
case "$compress" in
|
||||
('' | no | none)
|
||||
echo "No compression requested" 1>&2
|
||||
;;
|
||||
|
||||
(gz | gzip)
|
||||
echo "Use gzip compression" 1>&2
|
||||
archiveCommand="tar -czf"
|
||||
archiveSuffix=".tar.gz"
|
||||
;;
|
||||
|
||||
(tgz)
|
||||
echo "Use gzip compression with tgz ending" 1>&2
|
||||
archiveCommand="tar -czf"
|
||||
archiveSuffix=".tgz"
|
||||
;;
|
||||
|
||||
(bz | bz2 | bzip | bzip2)
|
||||
echo "Use bzip2 compression" 1>&2
|
||||
archiveCommand="tar -cjf"
|
||||
archiveSuffix=".tar.bz2"
|
||||
;;
|
||||
|
||||
(xz)
|
||||
echo "Use xz compression" 1>&2
|
||||
archiveCommand="tar -cJf"
|
||||
archiveSuffix=".tar.xz"
|
||||
;;
|
||||
|
||||
(zip)
|
||||
echo "Use zip archive" 1>&2
|
||||
archiveCommand="zip -r"
|
||||
archiveSuffix=".zip"
|
||||
;;
|
||||
|
||||
(*)
|
||||
echo "Unknown compression scheme: $compress" 1>&2
|
||||
;;
|
||||
esac
|
||||
|
||||
(
|
||||
cd "$tmpDir" || exit
|
||||
time $archiveCommand "$outputDir/$tarName$archiveSuffix" "${prefixDir:-.}"
|
||||
)
|
||||
|
||||
echo
|
||||
echo "# End of creating archive"
|
||||
echo " $outputDir/$tarName$archiveSuffix"
|
||||
echo
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
Loading…
Reference in New Issue
Block a user