Windows 64bit binaries can be generated on 64bit Linux using the mingw compiler for cross-compilation.
- The mingw cross-compiler should be at least version 8.2.0 (tested), but could be slightly older. Versions that are much older likely have faulty regex implementations.
Host setup
openSUSE
On openSUSE use these packages for compilation:
zypper in mingw64-cross-binutils
zypper in mingw64-cross-cpp mingw64-cross-gcc mingw64-cross-gcc-c++
zypper in mingw64-filesystem mingw64-headers mingw64-runtime
zypper in mingw64-libwinpthread1 mingw64-winpthreads-devel
zypper in mingw64-libz mingw64-zlib-devel
# Note: can cross-compile FFTW from ThirdParty sources instead
zypper in mingw64-libfftw3 mingw64-fftw3-devel

CentOS/RedHat
For CentOS/RedHat, the cross-compiler is available under PowerTools
dnf config-manager --set-enabled PowerTools
The packages have slightly different names than the openSUSE ones:
dnf install mingw64-gcc-c++
dnf install mingw64-winpthreads mingw64-zlib
Notably, many of the development packages are simply rolled into the runtime ones. An FFTW package appears to be missing, but cross-compiling one from ThirdParty sources makes reasonable sense anyhow.
Caution
Cross-compiling on RedHat systems has not always be successful in the past. The runtime packages often lag behind the windows runtime environment and the cross-compiling packages simply do not run.
Configuration Files
Since the settings for cross-compilation will often differ from the
native compilation, it is advisable to isolate the changes in a
dedicated directory (OpenFOAM-v2006 and later).
We normally create a etc-mingw
directory as a convenient reminder to
its purpose.
The overall preferences (etc-mingw/prefs.sh):
# Preferences for mingw cross-compiled
export FOAM_CONFIG_ETC="etc-mingw"
export WM_COMPILER=Mingw
export WM_MPLIB=MSMPI
unset WM_COMPILE_CONTROL # No tuning
To disable CGAL (etc-mingw/config.sh/CGAL):
boost_version=boost-none
cgal_version=CGAL-none
export BOOST_ARCH_PATH="/$boost_version"
export CGAL_ARCH_PATH="/$cgal_version"
For a system FFTW (etc-mingw/config.sh/FFTW):
fftw_version=fftw-system
export FFTW_ARCH_PATH=/usr/x86_64-w64-mingw32/sys-root/mingw
Since we have created the etc-mingw
directory in OpenFOAM project
directory, it is easiest to source the environment from there:
source etc/bashrc etc-mingw/prefs.sh
# With additional verbosity of the sourcing
FOAM_VERBOSE=true source etc/bashrc etc-mingw/prefs.sh
Before a full compilation
Before spending a large amount of time and effort with cross-compiling and installing, it is advisable to verify that the simplest possible application works successfully on the target machine. This small test application/library suite is called Test-dummyLib and is located under
applications/test/00-dummy/Allwmake
Run-time setup
When running, the WM_PROJECT_DIR
environment must be set.
OpenFOAM will otherwise not be able to locate its files.
If running with MSYS2, make certain to set the following environmental control (preferrably for all users):
MSYS2_PATH_TYPE inherit
For the cross-compiled executables and libraries to work, the corresponding runtime libraries are required. These will need to be copied across from the Linux host system to the target machine. On openSUSE these runtime libraries are provided by the packages:
mingw64-libgcc_s_seh1
mingw64-libstdc++6
mingw64-libz
mingw64-libwinpthread1
Both for CentOS/RedHat and for openSUSE, this roughly corresponds to the entire directory contents:
/usr/x86_64-w64-mingw32/sys-root/mingw/bin/*.dll
Additional Notes / Workarounds
Flex
Flex is used in a few locations within OpenFOAM for generating code.
The generated C++ code requires the FlexLexer.h
header file, but its
/usr/include
location will be ignored by the cross-compiler. As a
moderately ugly workaround, a copy of this file can be made in a
standard project include location as part of the compilation process.
For example,
ln -s /usr/include/FlexLexer.h src/OSspecific/MSwindows
libz
If there are any issues with the system zlib, it is possible to download it manually and compile it as a static library.
CC="$(wmake -show-c)" CFLAGS="$(wmake -show-cflags)" ./configure --static
make
The resulting output files (zconf.h, zlib.h) and (libz.a) either need
to be installed in system locations where OpenFOAM can find them, or if
they are to be shipped directly with OpenFOAM, they can also be placed
in the src/OpenFOAM/include
and platforms/linux64Mingw*/lib
paths.
If the header files are only needed during compilation, it can be a
fairly convenient hack to simply place copies of them in the
src/OSspecific/MSwindows
directory.
The wmake toolchain
Always use the wmake/src/Allmake
script (called automatically)
to ensure that the wmake binary toolchain is built for the host
platform where it is needed.
Known limitations (2021-12-15)
- kahip does not build
- ptscotch does not build
- boost should build ok, but no CGAL support (ie, no foamyHexMesh)
- no ParaView plugin, runTimePostProcessing
Copyright (C) 2020-2021 OpenCFD Ltd.