diff --git a/doc/cross-compile-mingw.md b/doc/cross-compile-mingw.md new file mode 100644 index 0000000000000000000000000000000000000000..d98dfa8f7cef062ac9cc1b00ec3976ff066dfa66 --- /dev/null +++ b/doc/cross-compile-mingw.md @@ -0,0 +1,131 @@ +Notes for cross-compiling with mingw. + +On openSUSE use the packages: +``` +mingw64-cross-binutils +mingw64-cross-cpp +mingw64-cross-gcc +mingw64-cross-gcc-c++ +mingw64-filesystem +mingw64-headers +mingw64-runtime + +mingw64-libwinpthread1 +mingw64-winpthreads-devel + +mingw64-libfftw3 +mingw64-fftw3-devel +``` + +This setup is missing zlib, so download that manually and compile as a +*static* library. + +``` +CC="$(wmake -show-c) CFLAGS="$(wmake -show-cflags) ./configure --static +``` + +The resulting output files (zconf.h zlib.h) and (libz.a) either need +to be installed in system locations where OpenFOAM can find it, or if +they are to be shipped directly with OpenFOAM, they can also be placed +in the `src/OpenFOAM/include` and `platforms/XXX/lib` paths. + +When using the cross-compiled executables and libraries, additional +runtime libraries are required. On openSUSE these are provided by the +packages: +``` +mingw64-libgcc_s_seh1 +mingw64-libstdc++6 +``` + +In a few locations within OpenFOAM, flex is used to generate code. The +generated C++ code requires the `FlexLexer.h` header file. +This is normally located under `/usr/include/FlexLexer.h`, which will +be ignored by the cross-compiler. + +As a fairly ugly hack, a copy of this file can be made in a standard +project include location. For example, + +``` +mkdir src/OpenFOAM/lnInclude +cp /usr/include/FlexLexer.h src/OpenFOAM/lnInclude +``` + + +The last point to consider when cross-compiling is the behaviour of +the OpenFOAM tools used during compilation. These are found under +`wmake/src`. When these are compiled they will create executables that +work on the target platform (Windows), but *not* on the host platform. + +The workaround: + +1. Activate the native OpenFOAM environment (Linux with system gcc) +and use that to compile the build tools +``` +wmake/src/Allmake +``` +This can be skipped if you already have an existing OpenFOAM build. + +2. Activate the OpenFOAM for cross-compiling (Linux with mingw) +and use that to compile the build tools +``` +wmake/src/Allmake +``` + +3. Copy the contents of the native platform build tools into the +cross-compilation platform directory. For example, +``` +cp wmake/platforms/linux64Gcc/* wmake/platforms/linux64Mingw/ +``` + +The `wmake/platforms/linux64Mingw/` directory should now contain +native and cross-compiled tools: +``` +dirToString +wmkdep +wmkdepend + +dirToString.exe +wmkdep.exe +wmkdepend.exe +``` + +The native tools are the one that will (automatically) be used +throughout the balance of the cross-compilation process. + + +Adjust paths for third-party sources. Eg, in `etc/config.sh/FFTW` you +may wish to have the following: +``` +fftw_version=fftw-system +export FFTW_ARCH_PATH=/usr/x86_64-w64-mingw32/sys-root/mingw +``` + + +The settings for cross-compilation are normally defined in the +`etc/pref.sh` file with contents like this: + +``` +# For mingw cross-compile + +export WM_COMPILER=Mingw +export WM_MPLIB=MSMPI + +export WM_LABEL_SIZE=32 +# other settings... +``` + + +Additional adjustments may be required in some other places. For example +in `etc/config.sh/FFTW` +``` +fftw_version=fftw-system +export FFTW_ARCH_PATH=/usr/x86_64-w64-mingw32/sys-root/mingw +``` + + +Known limitations (2019-05-01) + +- No CGAL support (ie, no foamyHexMesh) +- No ParaView plugin, runTimepostProcessing +- reacting EulerFoam solvers have too many interdependencies and do + not yet compile. diff --git a/etc/config.csh/settings b/etc/config.csh/settings index 12b2bd1182a1858cb31db71c87053949b7ad6c98..3c8486b21f5e010a58697872a036f1b9f9d2aeab 100644 --- a/etc/config.csh/settings +++ b/etc/config.csh/settings @@ -227,6 +227,13 @@ setenv FOAM_RUN "$WM_PROJECT_USER_DIR/run" # Default to system compiler if (! $?WM_COMPILER_TYPE ) setenv WM_COMPILER_TYPE system +# Cross-compiling +switch ("$WM_COMPILER") +case Mingw*: + setenv WM_OSTYPE MSwindows + breaksw +endsw + # Adjustments for non-gcc compilers switch ("$WM_COMPILER") case Clang*: # Clang compiler suite diff --git a/etc/config.sh/mpi b/etc/config.sh/mpi index 52c8826d88101b33932e6fb29824a5ecfcf92161..6b3f98fb345814dfbbd8b144a98223f3c7ee38c7 100644 --- a/etc/config.sh/mpi +++ b/etc/config.sh/mpi @@ -321,6 +321,20 @@ INTELMPI*) _foamAddPath "$MPI_ARCH_PATH/intel64/bin" _foamAddLib "$MPI_ARCH_PATH/intel64/lib" ;; + +MSMPI) + export FOAM_MPI=msmpi + _foamEtc -config mpi-msmpi # <- Adjustments (optional) + + # Respect MPI_ARCH_PATH if set to a valid directory (eg, user adjustments) + if [ ! -d "$MPI_ARCH_PATH" ] + then + export MPI_ARCH_PATH=$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$FOAM_MPI + fi + + # _foamAddPath "$MPI_ARCH_PATH/bin" + _foamAddLib "$MPI_ARCH_PATH/lib/x64" + ;; esac diff --git a/etc/config.sh/settings b/etc/config.sh/settings index af61276c83b545aefe90c0ef70850857a5abdca9..f44dec25c87052c37a805055a56e5e991bbb93f1 100644 --- a/etc/config.sh/settings +++ b/etc/config.sh/settings @@ -227,6 +227,17 @@ export FOAM_RUN="$WM_PROJECT_USER_DIR/run" # Default to system compiler : ${WM_COMPILER_TYPE:=system}; export WM_COMPILER_TYPE +# Cross-compiling +case "$WM_COMPILER" in +(Mingw*) + export WM_OSTYPE=MSwindows + export WM_CC="$(wmake -show-c)" + export WM_CXX="$(wmake -show-cxx)" + export WM_CFLAGS="$(wmake -show-cflags)" + export WM_CXXFLAGS="$(wmake -show-cxxflags)" + ;; +esac + # Adjust for non-gcc compilers case "$WM_COMPILER" in Clang*) # Clang compiler suite diff --git a/src/Allwmake b/src/Allwmake index 30f3ab83862cb4b4fa349b9b5a8ad020e87b2d82..5797c9eeda461117c66d71c44dffe29e1c3e0e20 100755 --- a/src/Allwmake +++ b/src/Allwmake @@ -20,11 +20,28 @@ wmakeLnInclude -u OSspecific/"${WM_OSTYPE:-POSIX}" OSspecific/"${WM_OSTYPE:-POSIX}"/Allwmake $targetType $* -Pstream/Allwmake $targetType $* - -# Trigger update of version info (as required) -wmakeBuildInfo -check || wrmo OpenFOAM/global/global.o 2>/dev/null -wmake $targetType OpenFOAM +case "$WM_COMPILER" in +Mingw*) + # Pstream/OpenFOAM cyclic dependency + # 1st pass: link as Pstream as single .o object + WM_MPLIB=dummy Pstream/Allwmake libo + FOAM_LINK_DUMMY_PSTREAM=libo wmake $targetType OpenFOAM + + # 2nd pass: link Pstream.dll against libOpenFOAM.dll + Pstream/Allwmake $targetType $* + + # Relink libOpenFOAM.dll against libPstream.dll + wrmo OpenFOAM/global/global.o 2>/dev/null + wmake $targetType OpenFOAM + ;; +*) + Pstream/Allwmake $targetType $* + + # Trigger update of version info (as required) + wmakeBuildInfo -check || wrmo OpenFOAM/global/global.o 2>/dev/null + wmake $targetType OpenFOAM + ;; +esac wmake $targetType fileFormats wmake $targetType surfMesh diff --git a/wmake/makefiles/general b/wmake/makefiles/general index 74d6518cd446fed9b0874e668a67d8989b150a5c..21bc05efdf04e16c951f459e564bf856ace7e7db 100644 --- a/wmake/makefiles/general +++ b/wmake/makefiles/general @@ -163,11 +163,19 @@ objects: $(OBJECTS) | silent .PHONY: libso libso: $(LIB)$(EXT_SO) | silent +ifeq ("$(WM_OSTYPE)","MSwindows") +$(LIB)$(EXT_SO): $(OBJECTS) + @$(WM_SCRIPTS)/makeTargetDir $(LIB) + $(call QUIET_MESSAGE,ld,$(LIB)$(EXT_SO)) + $E $(LINKLIBSO) $(OBJECTS) -L$(LIB_PLATFORMS) \ + $(PROJECT_LIBS) $(LIB_LIBS) $(GLIB_LIBS) -o $(LIB)$(EXT_SO) +else $(LIB)$(EXT_SO): $(OBJECTS) @$(WM_SCRIPTS)/makeTargetDir $(LIB) $(call QUIET_MESSAGE,ld,$(LIB)$(EXT_SO)) $E $(LINKLIBSO) $(OBJECTS) -L$(LIB_PLATFORMS) \ $(LIB_LIBS) $(GLIB_LIBS) -o $(LIB)$(EXT_SO) +endif .PHONY: lib lib: $(LIB).a | silent diff --git a/wmake/rules/linux64Mingw/c b/wmake/rules/linux64Mingw/c new file mode 100644 index 0000000000000000000000000000000000000000..48013b3d7beee7c1a2f950391a50c09848476893 --- /dev/null +++ b/wmake/rules/linux64Mingw/c @@ -0,0 +1,28 @@ +include $(GENERAL_RULES)/Gcc/c + +cARCH = -m64 + +cc = x86_64-w64-mingw32-gcc + +include $(RULES)/c$(WM_COMPILE_OPTION) + +cFLAGS = $(cARCH) $(GFLAGS) $(cWARN) $(cOPT) $(cDBUG) $(LIB_HEADER_DIRS) + +ctoo = $(WM_SCHEDULER) $(cc) $(cFLAGS) -c $< -o $@ + +LINK_LIBS = $(cDBUG) + +LINKLIBSO = $(cc) $(cARCH) \ + -Wl,--output-def=$(LIB).def \ + -Wl,--out-implib,$(LIB).dll.a \ + -Wl,--no-undefined \ + -Wl,--enable-runtime-pseudo-reloc \ + -Wl,--enable-auto-import \ + -Wl,--enable-auto-image-base \ + -Wl,--strip-all \ + -shared + +LINKEXE = $(cc) $(cARCH) \ + -Wl,--enable-auto-import \ + -Wl,--strip-all \ + -Wl,--force-exe-suffix diff --git a/wmake/rules/linux64Mingw/c++ b/wmake/rules/linux64Mingw/c++ new file mode 100644 index 0000000000000000000000000000000000000000..c4939e019a4fb1c7c11e439aa6f594677136501c --- /dev/null +++ b/wmake/rules/linux64Mingw/c++ @@ -0,0 +1,35 @@ +include $(GENERAL_RULES)/Gcc/c++ + +c++ARCH = -m64 + +# With gnu++11 (not c++11) to ensure __STRICT_ANSI__ is not defined +CC = x86_64-w64-mingw32-g++ -std=gnu++11 + +include $(RULES)/c++$(WM_COMPILE_OPTION) + +c++FLAGS = $(c++ARCH) $(GFLAGS) $(c++WARN) $(c++OPT) $(c++DBUG) $(ptFLAGS) $(LIB_HEADER_DIRS) + +Ctoo = $(WM_SCHEDULER) $(CC) $(c++FLAGS) -c $< -o $@ +cxxtoo = $(Ctoo) +cctoo = $(Ctoo) +cpptoo = $(Ctoo) + +LINK_LIBS = $(c++DBUG) + +# Using "-Wl,--no-undefined,--enable-runtime-pseudo-reloc" +# does not forgive undefined symbols during linking + +LINKLIBSO = $(CC) $(c++FLAGS) \ + -Wl,--output-def=$(LIB).def \ + -Wl,--out-implib=$(LIB).dll.a \ + -Wl,--no-undefined \ + -Wl,--enable-runtime-pseudo-reloc \ + -Wl,--enable-auto-import \ + -Wl,--enable-auto-image-base \ + -Wl,--strip-all \ + -shared + +LINKEXE = $(CC) $(c++FLAGS) \ + -Wl,--enable-auto-import \ + -Wl,--strip-all \ + -Wl,--force-exe-suffix diff --git a/wmake/rules/linux64Mingw/c++Debug b/wmake/rules/linux64Mingw/c++Debug new file mode 100644 index 0000000000000000000000000000000000000000..0dae74f2bf72a034f99af4af9f7784ba8d972cb9 --- /dev/null +++ b/wmake/rules/linux64Mingw/c++Debug @@ -0,0 +1,2 @@ +c++DBUG = -gstabs3 -DFULLDEBUG +c++OPT = -O0 -fdefault-inline diff --git a/wmake/rules/linux64Mingw/c++Opt b/wmake/rules/linux64Mingw/c++Opt new file mode 100644 index 0000000000000000000000000000000000000000..35b3083a5627b4086790360de85673d40ddb8489 --- /dev/null +++ b/wmake/rules/linux64Mingw/c++Opt @@ -0,0 +1,4 @@ +c++DBUG = -DNDEBUG +c++OPT = -O3 + +ROUNDING_MATH = -frounding-math diff --git a/wmake/rules/linux64Mingw/c++Prof b/wmake/rules/linux64Mingw/c++Prof new file mode 100644 index 0000000000000000000000000000000000000000..faa2711c7e071bd8314136bd56041a95e804a5c0 --- /dev/null +++ b/wmake/rules/linux64Mingw/c++Prof @@ -0,0 +1,2 @@ +c++DBUG = -gstabs3 -pg +c++OPT = -O2 diff --git a/wmake/rules/linux64Mingw/cDebug b/wmake/rules/linux64Mingw/cDebug new file mode 100644 index 0000000000000000000000000000000000000000..687db6d2d51d2cdcee67082e0fb8987f9d89fa51 --- /dev/null +++ b/wmake/rules/linux64Mingw/cDebug @@ -0,0 +1,2 @@ +cDBUG = -gstabs3 -DFULLDEBUG +cOPT = -O1 -finline-functions diff --git a/wmake/rules/linux64Mingw/cOpt b/wmake/rules/linux64Mingw/cOpt new file mode 100644 index 0000000000000000000000000000000000000000..5031d6a49b61c6defbbce88209cd981808582967 --- /dev/null +++ b/wmake/rules/linux64Mingw/cOpt @@ -0,0 +1,2 @@ +cDBUG = -DNDEBUG +cOPT = -O3 diff --git a/wmake/rules/linux64Mingw/cProf b/wmake/rules/linux64Mingw/cProf new file mode 100644 index 0000000000000000000000000000000000000000..5e2634d8448b96070be7b40c3160f7c670703539 --- /dev/null +++ b/wmake/rules/linux64Mingw/cProf @@ -0,0 +1,2 @@ +cDBUG = -gstabs3 -pg +cOPT = -O2 diff --git a/wmake/rules/linux64Mingw/general b/wmake/rules/linux64Mingw/general new file mode 100644 index 0000000000000000000000000000000000000000..b63818537a179c3d3d251be0e74e111d3934a66b --- /dev/null +++ b/wmake/rules/linux64Mingw/general @@ -0,0 +1,19 @@ +# Need -D_WIN32 -D__MINGW32__ if host cpp is used +#CPP = /lib/cpp -traditional-cpp -D_WIN32 -D__MINGW32__ $(GFLAGS) + +CPP = x86_64-w64-mingw32-cpp -traditional-cpp $(GFLAGS) +LD = x86_64-w64-mingw32-ld +AR = x86_64-w64-mingw32-ar +RANLIB = x86_64-w64-mingw32-ranlib + +PROJECT_LIBS = -l$(WM_PROJECT) -L$(FOAM_LIBBIN)/dummy -lPstream + +include $(GENERAL_RULES)/standard + +include $(DEFAULT_RULES)/c +include $(DEFAULT_RULES)/c++ + +EXT_SO = .dll +EXT_EXE = .exe + +# ----------------------------------------------------------------------------- diff --git a/wmake/rules/linux64Mingw/mplibMSMPI b/wmake/rules/linux64Mingw/mplibMSMPI new file mode 100644 index 0000000000000000000000000000000000000000..abaef71ef996b3bb81037c31fb7e89d7c2224900 --- /dev/null +++ b/wmake/rules/linux64Mingw/mplibMSMPI @@ -0,0 +1,3 @@ +PFLAGS = -DMPICH_SKIP_MPICXX -DOMPI_SKIP_MPICXX +PINC = -I$(MPI_ARCH_PATH)/include +PLIBS = -L$(MPI_ARCH_PATH)/lib -L$(MPI_ARCH_PATH)/lib/x64 -lmsmpi