Dear PETSc users,

First, thanks to the developers for your great effort with the PETSc library, 
which I have benefited from several times.

I want to share with you that I recently was able to cross compile PETSc with 
the MXE (mxe.cc) cross compiler, and then link it into an application (also 
built with the mxe compiler) to produce an executable that I successfully ran 
on my Windows computer. In doing this I realized that there is very little 
documentation of this on the web, so maybe others could benefit from my 
approach. It contains a few hacks that might be solved more elegant, but that 
is probably out of may range.

First, I installed the mxe cross compiler following the tutorial 
(mxe.cc/#tutorial<https://mxe.cc/#tutorial>):

git clone https://github.com/mxe/mxe.git
make cc
make blas lapack
export PATH=~/code/mxe/usr/bin:$PATH

Then I compiled PETSc (3.11.3 tarball):

wget http://ftp.mcs.anl.gov/pub/petsc/release-snapshots/petsc-3.11.3.tar.gz
gunzip -c petsc-3.11.3.tar.gz | tar -xof -
cd petsc-3.11.3/
./configure PETSC_ARCH=arch-mxe-static \
  --with-mpi=0 --host=i686-w64-mingw32.static \
  --enable-static --disable-shared \
  --with-cc=i686-w64-mingw32.static-gcc \
  --with-cxx=i686-w64-mingw32.static-g++ \
  --with-fc=i686-w64-mingw32.static-gfortran \
  --with-ld=i686-w64-mingw32.static-ld \
  --with-ar=i686-w64-mingw32.static-ar \
  --with-pkg-config=i686-w64-mingw32.static-pkg-config \
  --with-batch --known-64-bit-blas-indices

Next, I did the reconfigure step that was explained in the output from the call 
to configure:

* copy 'conftest-arch-mxe-static' to your Windows machine
* Rename it with extension '.exe'
* Run the application in Windows. This generates 
'reconfigure-arch-mxe-static.py'
* Copy 'reconfigure-arch-mxe-static.py' back to the Linux machine
* Run the python script:

python reconfigure-arch-mxe-static.py

Now, 'make all' failed to compile, but I did two hacks to mitigate it:

1) In  '~/code/petsc-3.11.3/arch-mxe-static/include/petscconf.h' include the 
following lines:
#ifndef PETSC_HAVE_DIRECT_H
#define PETSC_HAVE_DIRECT_H 1
#endif

2) In ~/code/petsc-3.11.3/src/sys/error/fp.c, comment out line 405-406:
// elif defined PETSC_HAVE_XMMINTRIN_H
// _MM_SET_EXCEPTION_MASK(_MM_MASK_INEXACT | _MM_MASK_UNDERFLOW);

After this 'make all' ran successfully.
I was finally able to compile my code (linking PETSc) following step 5 of the 
mxe tutorial: mxe.cc/#tutorial<https://mxe.cc/#tutorial>
Then, simply copy to Windows and double-click.


Best regards,

Lars Hov Odsæter

Reply via email to