diff --git a/bin/tools/createMingwRuntime b/bin/tools/createMingwRuntime new file mode 100755 index 0000000000000000000000000000000000000000..b02e466f8a256d9afd0ba93dc3f5b840ac157627 --- /dev/null +++ b/bin/tools/createMingwRuntime @@ -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 + + +# ---------------------------------------------------------------------------