Cross-compiling for Windows: Difference between revisions

From iMath
Jump to navigation Jump to search
 
(89 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Ubuntu, mingw32, wine and Microsoft Visual C++ ==
== Ubuntu, wine and Microsoft Visual C++ ==


=== General setup ===
=== General setup ===


It seems that an Office extension for Windows must be compiled with MSVC to be compatible. Here is a way to do this from within Ubuntu. Make sure you have mingw32 and wine installed. Then, get Microsoft Visual (Express) C++ to work under wine. Installing with vcsetup.exe, or installing Visual Studio  is pretty hopeless and an overkill anyway. Instead, try this hack:
It seems that an Office extension for Windows must be compiled with MSVC to be compatible. Here is a way to do this from within Ubuntu. Make sure you have a recent wine installed. By default this will be a 64 bit version. If you need a 32-bit wine, use <code>winearch='win32' winecfg</code>.


First make sure that your wine environment matches the Office you want to compile the extension for. If you are compiling for a 32-bit Office, you must install a 32-bit wine. If this does not happen automatically, use
==== Visual Studio 2017 or 2019 (64 bit compiler, outputting 32 bit or 64 bit code) ====
  winearch='win32' winecfg
* Get a working Visual Studio installation under Windows (the community version is available for free, and works fine)
* Set up the following file structure in your <code>.wine/drive_c</code> directory (for 32 bit wine, change <code>Hostx64</code> to <code>Hostx86</code> in the first two lines).
  vc/bin/x64 from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\bin\Hostx64\x64
  vc/bin/x86 from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\bin\Hostx64\x86
  vc/lib/x64 from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\lib\x64
  vc/lib/x86 from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\lib\x86
  vc/include from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\include
  vc/sdk/lib/ucrt/x64 from C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\ucrt\x64
  vc/sdk/lib/ucrt/x86 from C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\ucrt\x86
  vc/sdk/lib/um/x64 from C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\um\x64
  vc/sdk/lib/um/x86 from C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\um\x86
  vc/sdk/include/ucrt from C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\ucrt
  vc/sdk/include/um from C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\um
  vc/sdk/include/shared from C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\shared
  vc/sdk/include/ucrt/sys/time.h: link to ../time.h
* If you change this structure you must also adapt the .configure calls later
* If you are only targeting x64 or x86 you can omit the other architecture
* Run <code>wine regedit</code> and add to HKEY_CURRENT_USER\Environment the entry PATH:
** 64 bit host, 64 bit target: <code>C:\vc\bin\x64</code>
** 64 bit host, 32 bit target: <code>C:\vc\bin\x86;C:\vc\bin\x64</code>


==== Visual Studio 2015 ====
<code>wine cl</code>, <code>wine link</code> and <code>wine lib</code> should now work.
The C++ compiler needs at least wine version 1.8 to work.


* Get a working installation under Windows (the community version is available for free, and works fine)
==== Debug build ====
* After booting into Ubuntu, copy cl.exe, c1xx.dll, c1.dll, c2.dll, lib.exe, link.exe, mspdb140.dll and clui.dll from the Windows Visual Studio 2015 installation to .wine/drive_c/windows/system32/ or some other location in your PATH
* Copy mt.exe from a Windows SDK installation to .wine/drive_c/windows/system32/ or some other location in your PATH
* Get winetricks (you need a recent version)
* Run winetricks vcrun2015. This will override msvcp140.dll with a Windows native version in the wine configuration


wine cl, wine link, wine lib and wine mt should now work from a (Unix) terminal
* To get a debug build, use the flags <code>-MDd -D_DEBUG</code> for libraries
* You will need to copy the debug versions of the standard libraries into the paths


Install the required libraries and include files somewhere (is there a better/standard location?)
=== Compiling CLN ===
mkdir ~/.wine/drive_c/vc
cp -aR /c/Programme/Microsoft Visual Studio 14/VC/lib/ ~/.wine/drive_c/vc
cp -aR /c/Programme/Microsoft Visual Studio 14/VC/include/ ~/.wine/drive_c/vc
mkdir ~/.wine/drive_c/sdk
cp -aR /c/Programme/Windows\ Kits/8.1/Lib/ ~/.wine/drive_c/sdk/lib8.1
cp -aR /c/Programme/Windows\ Kits/8.1/Include/ ~/.wine/drive_c/sdk/include8.1
cp -aR /c/Programme/Windows\ Kits/10/Lib/ ~/.wine/drive_c/sdk/lib10
cp -aR /c/Programme/Windows\ Kits/10/Include/ ~/.wine/drive_c/sdk/include10


==== Visual Studio 2012 ====
You must use a recent [https://www.ginac.de/CLN/ CLN] (>1.3.6)


* Get a working installation under Windows (the express version is available for free, and works fine)
If the linker reports undefined symbols, try to remove the inlined methods <code>cl_string::cl_string (const char * s)</code> and <code>cl_string& cl_string::operator= (const char * s)</code> from <code>include/cln/string.h</code> and instead defining them in <code>src/base/string/cl_st_make2.cc</code>. The extern definitions can be removed from these two methods.
* After booting into Ubuntu, copy cl.exe, c1xx.dll, c1.dll, c2.dll, lib.exe, link.exe, mspdb100.dll, mspdb120.dll and clui.dll from the Windows Visual Express installation to .wine/drive_c/windows/system32/ or some other location in your PATH
* Copy mt.exe from a Windows SDK installation to .wine/drive_c/windows/system32/ or some other location in your PATH
* Get winetricks
* Run winetricks vcrun2012. This will override msvcr120.dll with a Windows native version in the wine configuration


wine cl, wine link and wine lib should now work from a (Unix) terminal
If compilation fails on the two assembler files, remove the following lines from <code>src/Makefile.am</code>:
  nodist_libcln_la_SOURCES = \
  base/digitseq/cl_asm.S \
  polynomial/elem/cl_asm_GF2.S


Install the required libraries and include files somewhere (is there a better/standard location?)
==== Visual Studio 2017 and 2019 ====
mkdir ~/.wine/drive_c/vc
cp -aR /c/Programme/Microsoft Visual Studio 12/VC/lib/ ~/.wine/drive_c/vc
cp -aR /c/Programme/Microsoft Visual Studio 12/VC/include/ ~/.wine/drive_c/vc
cd ~/.wine/drive_c/vc/include
cp time.h sys
mkdir ~/.wine/drive_c/sdk
cp -aR /c/Programme/Microsoft\ SDKs/Windows/v7.1A/Lib/ ~/.wine/drive_c/sdk
cp -aR /c-ro/Programme/Microsoft\ SDKs/Windows/v7.0A/Include/ ~/.wine/drive_c/sdk


==== Visual Studio 2010 ====
* Run <code>autoreconf -i</code>
* Configure the build
** 64 bit build: <code>./configure CC="wine cl" CXX="wine cl" CCAS="wine cl" LD="wine link" LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64" CPPFLAGS="-MD -DNO_ASM -EHsc -IC:/vc/include -IC:/vc/sdk/include/um -IC:/vc/sdk/include/ucrt -IC:/vc/sdk/include/shared" --host=amd64-mingw64msvc</code>
** 32 bit build: <code>./configure CC="wine cl" CXX="wine cl" CCAS="wine cl" LD="wine link" LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86" CPPFLAGS="-MD -DNO_ASM -EHsc -IC:/vc/include -IC:/vc/sdk/include/um -IC:/vc/sdk/include/ucrt -IC:/vc/sdk/include/shared" --host=i586-mingw32msvc</code>
* Edit libtool and find the two lines containing <code>-OUT</code>. Replace <code>lib</code> with <code>wine lib</code>
* Make one of these changes (depending on what source version you have only one is possible)
** Edit the src/Makefile and find the line starting with <code>.S.lo</code> and add the switch <code>-TC</code> before <code>-c -o</code>
** Remove the definition of <code>nodist_libcln_la_SOURCES</code> from src/Makefile.am (total three lines) and re-run configure
* Build
** 64 bit build: <code>make LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64"</code>
** 32 bit build: <code>make LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86"</code>
* Check
** 64 bit build: <code>make LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64" check</code>
** 32 bit build: <code>make LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86" check</code>
* All tests should pass successfully (note that on a 64-bit wine, the 32-bit tests will not execute). If they do not, you might need to install the package wine-binfmt


* Get a working installation under Windows (the express version is available for free, and works fine)
=== Compiling GiNaC ===
* After booting into Ubuntu, copy cl.exe, c1xx.dll, c1.dll, c2.dll, lib.exe, link.exe, mspdb100.dll and clui.dll from the Windows Visual Express installation to .wine/drive_c/windows/system32/ or some other location in your PATH
* Copy mt.exe from a Windows SDK installation to .wine/drive_c/windows/system32/ or some other location in your PATH
* Get winetricks
* Run winetricks vcrun2010. This will override msvcr100.dll with a Windows native version in the wine configuration


wine cl, wine link and wine lib should now work from a (Unix) terminal
For a 64 bit build, you need a recent version of [https://www.ginac.de GiNaC] (>1.7.8).


Install the required libraries and include files somewhere (is there a better/standard location?)
If compilation fails with reference to a missing C++20 compiler, edit the <code>configure.ac</code> and change the compiler prerequisite <code>AX_CXX_COMPILE_STDCXX</code> to version 20.
mkdir ~/.wine/drive_c/vc
cp -aR /c/Programme/Microsoft Visual Studio 10/VC/lib/ ~/.wine/drive_c/vc
cp -aR /c/Programme/Microsoft Visual Studio 10/VC/include/ ~/.wine/drive_c/vc
mkdir ~/.wine/drive_c/sdk
cp -aR /c/Programme/Microsoft\ SDKs/Windows/v7.0A/Lib/ ~/.wine/drive_c/sdk
cp -aR /c-ro/Programme/Microsoft\ SDKs/Windows/v7.0A/Include/ ~/.wine/drive_c/sdk


=== Compiling CLN ===
==== Visual Studio 2017 and 2019 ====


The latest CLN has patches applied so that it will compile with MSVC
* Copy src/.libs/libcln.lib into ~/.wine/drive_c/local/lib/x64 (or x86) and the CLN headers in the include directory into ~/.wine/drive_c/local/include/x64/cln (or x86/cln)
 
* Get a recent GiNaC (>= 1.8.2)
* Run <code>./configure CC="wine cl" CXX="wine cl" CCAS="wine cl" LD="wine link" MANIFEST_TOOL="wine mt" LIB="C:/vc/lib;C:/sdk/lib" CPPFLAGS="-MD -DNO_ASM -EHsc -IC:/vc/include -IC:/sdk/include" --host=i586-mingw32msvc</code>
* Run <code>autoreconf -i</code> in the source directory
* Edit libtool and find the two lines containing <code>-OUT</code>. Replace <code>lib</code> with <code>wine lib</code>
* Configure
* Run make LIB="C:/vc/lib;C:/sdk/lib"
** 64 bit: <code>./configure CC="wine cl" CXX="wine cl" LD="wine link" CLN_CFLAGS=-IC:/local/include/x64 CLN_LIBS=C:/local/lib/x64/libcln.lib LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64" CPPFLAGS="-MD -EHsc -Zc:__cplusplus -IC:/vc/include -IC:/vc/sdk/include/um -IC:/vc/sdk/include/ucrt -IC:/local/include" --disable-shared --enable-static --host=amd64-mingw64msvc</code>
* make will stop and complain about missing files cl_asm.obj and cl_asm_GF2.obj
** 32 bit: <code>./configure CC="wine cl" CXX="wine cl" LD="wine link" CLN_CFLAGS=-IC:/local/include/x86 CLN_LIBS=C:/local/lib/x86/libcln.lib LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86" CPPFLAGS="-MD -EHsc -IC:/vc/include -IC:/vc/sdk/include/um -IC:/vc/sdk/include/ucrt -IC:/local/include" --disable-shared --enable-static --host=i586-mingw32msvc</code>
* Depending on your CLN version, do one of the following
** change to the src subdirectory
** Remove cl_asm.lo and cl_asm_GF2.lo
** Edit the Makefile and find the lines starting with <code>cl_asm.lo:</code> and <code>cl_asm_GF2.lo:</code>
** Add the switch -TC before -c -o in the last line of the block. This will help MSVC recognize the .S extension as a valid C file
** run make cl_asm.lo and make cl_asm_GF2.lo. This should create cl_asm.obj and cl_asm_GF2.obj
* or (newer versions):
** Edit the Makefile and find the line starting with <code>.S.lo</code>
** Add the switch -TC before -c -o
* Run make LIB="C:/vc/lib;C:/sdk/lib" to finish the compile
* Run make LIB="C:/vc/lib;C:/sdk/lib" check, all tests should pass successfully
 
=== Compiling GiNaC ===
 
* Copy libcln.lib into ~/.wine/drive_c/local/lib and the CLN headers into ~/.wine/drive_c/local/include/cln
* Unpack the source code and run <code>autoreconf -i</code> in the new directory that was created.
* You can now run <code>./configure CC="wine cl" CXX="wine cl" LD="wine link" MANIFEST_TOOL="wine mt" LIB="C:/vc/lib;C:/sdk/lib" CPPFLAGS="-MD -DNO_ASM -EHsc -IC:/vc/include -IC:/sdk/include -IC:/local/include" --disable-shared --enable-static --host=i586-mingw32msvc</code>
* Hacks for GiNaC 1.7 (which requires C++11 from Visual Studio 2015)
** The configure command is <code>./configure CC="wine cl" CXX="wine cl" LD="wine link" MANIFEST_TOOL="wine mt" LIB="C:/vc/lib;C:/sdk/lib8.1/winv6.3/um/x86;C:/sdk/lib10/10.0.10240.0/ucrt/x86" CPPFLAGS="-MD -DNO_ASM -EHsc -IC:/vc/include -IC:/sdk/include8.1/um -IC:/sdk/include10/10.0.10240.0/ucrt -IC:/local/include" --disable-shared --enable-static --host=i586-mingw32msvc</code>
** Since MSVC does not set __cplusplus correctly (?), comment out the line <code>AX_CXX_COMPILE_STDCXX([11])</code>
** Remove <code>#include <unistd.h></code> from excompiler.cpp since it is unnecessary and does not exist in Windows
* Edit the libtool created by configure:
* Edit the libtool created by configure:
** The line starting with <code>old_archive_cmds</code> must read <code>"wine lib -OUT:\$oldlib\$oldobjs\$old_deplibs"</code>. Note that this line occurs twice in the file!
** The line starting with <code>old_archive_cmds</code> must read <code>"wine lib -OUT:\$oldlib\$oldobjs\$old_deplibs"</code>. Note that this line occurs twice in the file!
* In the check (and other subdirectories), when linking fails edit the Makefile and add the following to the command starting with CXXLINK: <code>libcln.lib</code>. This is necessary because the package config file cln.pc is in Unix format and cl cannot find the library as specified there
* Build
* Run <code>make LIB="C:/vc/lib;C:/sdk/lib;C:/local/lib"</code>
** 64 bit: <code>make LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64"</code>
** 32 bit: <code>make LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86"</code>
* On Windows compilation will fail in the ginsh subdirectory. Simply cd to this directory and run <code>make -t</code> (since we won't be needing ginsh)
* On Windows compilation will fail in the ginsh subdirectory. Simply cd to this directory and run <code>make -t</code> (since we won't be needing ginsh)
* GiNaC now compiles and all 58 tests pass successfully with <code>make LIB="C:/vc/lib;C:/sdk/lib;C:/local/lib" check</code>
* Change to the toplevel directory again and finish the build with the same make command as before
* If instead you get unhandled exception errors, try moving the definition of lst::info() from the .cpp file to the .h file (and don't ask me why this should make a difference). This only seems to happen when you compile with the -MT flag!
* Check
 
** 64 bit: <code>make LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64" check</code>
=== Compiling EQC ===
** 32 bit: <code>make LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86" check</code>
 
* All tests should pass successfully (note that on 64 bit wine the 32 bit tests will not execute)
Copy libginac.lib into ~/.wine/drive_c/local/lib and the GiNaC headers into ~/.wine/drive_c/local/include/ginac (make sure you also get the headers from the parser subdirectory and put them into the /local/include/ginac directory).
 
* Before starting, be sure to run <code>make distclean</code>
* Run <code>autoreconf -i</code> and <code>./configure CC="wine cl" CXX="wine cl" LD="wine link" MANIFEST_TOOL="wine mt" LIB="C:/vc/lib;c:/sdk/lib" CPPFLAGS="-DEBUG -MD -EHsc -IC:/vc/include -IC:/sdk/include -IC:/local/include" --host=i586-mingw32msvc</code>
* Find two lines with <code>...lib -OUT...</code> in libtool and change them to <code>...wine lib -OUT...</code>
* To get EQC to link successfully, you need to edit the src/Makefile and add the following to the command starting with CXXLINK: <code>libcln.lib libginac.lib</code>.
* Run <code>make LIB="C:/vc/lib;C:/sdk/lib;C:/local/lib"</code>
* If you get zillions of multiply-defined symbol errors, try replacing -MD with -MT when running configure (do a distclean before you re-run configure)


=== Preparing the Office SDK ===
=== Preparing the Office SDK ===


* Install Office and the Office SDK into wine using the standard Windows installation files. Try to run ~/.wine/drive_c/Program Files/<YOUR_OFFICE>/program/soffice.exe, if this doesn't start (cannot determine user interface language), then install it into a clean wine.
* Install Office and the Office SDK into wine using the standard Windows installation files. Try to run ~/.wine/drive_c/Program Files/<YOUR_OFFICE>/program/soffice.exe, if this doesn't start, then install it into a clean wine.
* LibreOffice 3.4 requires installing the Visual C++ 2008 runtime libraries with winetricks vcrun2008
* Remember to install 64-bit versions of the Office and SDK if you set up a 64-bit Visual C++ environment
* In the SDK base directory (e.g. ~/.wine/drive_c/Program Files/<YOUR_OFFICE>/sdk), edit settings/dk.mk and change the platform <code>PLATFORM=wine</code> (for Apache OpenOffice, create a file called config.guess in the sdk subdirectory with contents <code>echo wine; exit 0</code>)
* In the SDK base directory (e.g. ~/.wine/drive_c/Program Files/<YOUR_OFFICE>/sdk), edit settings/dk.mk and change the platform <code>PLATFORM=wine</code> (for Apache OpenOffice, create a file called config.guess in the sdk subdirectory with contents <code>echo wine; exit 0</code>)
* Edit settings/settings.mk and add a section for wine. The iMath source subdirectory src/wine-sdk-config contains a sample that works for me, but keep in mind that the settings.mk file varies between SDK versions.
* Edit settings/settings.mk and add a section for wine. The iMath source subdirectory src/wine-sdk-config contains a sample that works for me, but keep in mind that the settings.mk file varies between SDK versions.
* Go to sdk/bin and create an executable called cppumaker with content <code>wine "$OO_SDK_HOME/bin/cppumaker.exe" "$@"</code>
* Go to sdk/bin and create an executable called cppumaker with content <code>wine "$OO_SDK_HOME/bin/cppumaker.exe" "$@"</code>
* Install the Office DLLs where wine can find them (e.g. into the sdk/bin directory) but not into ~/.wine/drive_c/windows/system32, because this will confuse the office ("Cannot determine user interface language" error)
* Install the Office DLLs where wine can find them (e.g. symlink into the sdk/bin directory) but not into ~/.wine/drive_c/windows/system32, because this will confuse the office. This is required for cppumaker.exe to run


=== Compiling iMath ===
=== Compiling iMath ===
Copy libginac.lib into ~/.wine/drive_c/local/lib/x64 (or x86) and the GiNaC headers (also from the parser subdirectory) into ~/.wine/drive_c/local/include/x64/ginac (or x86/ginac)


* Copy libeqc.lib into ~/.wine/drive_c/local/lib and all the headers from the src subdirectory into ~/.wine/drive_c/local/include/libeqc
* Because GNU make has problems with spaces in paths, it is strongly advisable to create a symlink to ~/.wine/drive_c/Program\ Files and any other directory that has spaces (e.g. LibreOffice\ 5)
* Because GNU make has problems with spaces in paths, it is strongly advisable to create a symlink to ~/.wine/drive_c/Program\ Files and any other directory that has spaces (e.g. LibreOffice\ 4)
* Edit the config.wine file matching your Office installation in the directory src/wine-sdk-config. Set <code>BASE=</code> to match your wine installation directory. Edit the relevant entries at the top of the file using the symlinked directory names without spaces
* Edit the config.wine file matching your Office installation in the directory src/wine-sdk-config. Set <code>BASE=</code> to match your wine installation directory. Edit the relevant entries at the top of the file using the symlinked directory names without spaces
* Source this config.wine.xxx file
* Source this config.wine.xxx file
* Run <code>autoreconf -i</code>
* Run <code>autoreconf -i</code>
* Run <code>./configure CC="wine cl" CXX="wine cl" LD="wine cl" MANIFEST_TOOL="wine mt" --host=i586-mingw32msvc --build=i686-pc-linux-gnu</code>
* 32 bit build: Run <code>./configure CC="wine cl" CXX="wine cl" LD="wine cl" --host=i586-mingw32msvc</code>
* 64 bit build: Run <code>./configure CC="wine cl" CXX="wine cl" LD="wine cl" --host=amd64-mingw64msvc</code>
* Change into the source directory
* Change into the source directory
* Run make. This will produce an error about mt.exe at the end of the process. Just run make again and the extension is created in the iMathout directory
* Run make. This will produce an error about mt.exe at the end of the process. Just run make again and the extension is created in the iMathout directory

Latest revision as of 17:56, 24 September 2023

Ubuntu, wine and Microsoft Visual C++

General setup

It seems that an Office extension for Windows must be compiled with MSVC to be compatible. Here is a way to do this from within Ubuntu. Make sure you have a recent wine installed. By default this will be a 64 bit version. If you need a 32-bit wine, use winearch='win32' winecfg.

Visual Studio 2017 or 2019 (64 bit compiler, outputting 32 bit or 64 bit code)

  • Get a working Visual Studio installation under Windows (the community version is available for free, and works fine)
  • Set up the following file structure in your .wine/drive_c directory (for 32 bit wine, change Hostx64 to Hostx86 in the first two lines).
 vc/bin/x64 from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\bin\Hostx64\x64
 vc/bin/x86 from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\bin\Hostx64\x86
 vc/lib/x64 from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\lib\x64
 vc/lib/x86 from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\lib\x86
 vc/include from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\include
 vc/sdk/lib/ucrt/x64 from C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\ucrt\x64
 vc/sdk/lib/ucrt/x86 from C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\ucrt\x86
 vc/sdk/lib/um/x64 from C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\um\x64
 vc/sdk/lib/um/x86 from C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\um\x86
 vc/sdk/include/ucrt from C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\ucrt
 vc/sdk/include/um from C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\um
 vc/sdk/include/shared from C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\shared
 vc/sdk/include/ucrt/sys/time.h: link to ../time.h
  • If you change this structure you must also adapt the .configure calls later
  • If you are only targeting x64 or x86 you can omit the other architecture
  • Run wine regedit and add to HKEY_CURRENT_USER\Environment the entry PATH:
    • 64 bit host, 64 bit target: C:\vc\bin\x64
    • 64 bit host, 32 bit target: C:\vc\bin\x86;C:\vc\bin\x64

wine cl, wine link and wine lib should now work.

Debug build

  • To get a debug build, use the flags -MDd -D_DEBUG for libraries
  • You will need to copy the debug versions of the standard libraries into the paths

Compiling CLN

You must use a recent CLN (>1.3.6)

If the linker reports undefined symbols, try to remove the inlined methods cl_string::cl_string (const char * s) and cl_string& cl_string::operator= (const char * s) from include/cln/string.h and instead defining them in src/base/string/cl_st_make2.cc. The extern definitions can be removed from these two methods.

If compilation fails on the two assembler files, remove the following lines from src/Makefile.am:

 nodist_libcln_la_SOURCES = \
 base/digitseq/cl_asm.S \
 polynomial/elem/cl_asm_GF2.S

Visual Studio 2017 and 2019

  • Run autoreconf -i
  • Configure the build
    • 64 bit build: ./configure CC="wine cl" CXX="wine cl" CCAS="wine cl" LD="wine link" LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64" CPPFLAGS="-MD -DNO_ASM -EHsc -IC:/vc/include -IC:/vc/sdk/include/um -IC:/vc/sdk/include/ucrt -IC:/vc/sdk/include/shared" --host=amd64-mingw64msvc
    • 32 bit build: ./configure CC="wine cl" CXX="wine cl" CCAS="wine cl" LD="wine link" LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86" CPPFLAGS="-MD -DNO_ASM -EHsc -IC:/vc/include -IC:/vc/sdk/include/um -IC:/vc/sdk/include/ucrt -IC:/vc/sdk/include/shared" --host=i586-mingw32msvc
  • Edit libtool and find the two lines containing -OUT. Replace lib with wine lib
  • Make one of these changes (depending on what source version you have only one is possible)
    • Edit the src/Makefile and find the line starting with .S.lo and add the switch -TC before -c -o
    • Remove the definition of nodist_libcln_la_SOURCES from src/Makefile.am (total three lines) and re-run configure
  • Build
    • 64 bit build: make LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64"
    • 32 bit build: make LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86"
  • Check
    • 64 bit build: make LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64" check
    • 32 bit build: make LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86" check
  • All tests should pass successfully (note that on a 64-bit wine, the 32-bit tests will not execute). If they do not, you might need to install the package wine-binfmt

Compiling GiNaC

For a 64 bit build, you need a recent version of GiNaC (>1.7.8).

If compilation fails with reference to a missing C++20 compiler, edit the configure.ac and change the compiler prerequisite AX_CXX_COMPILE_STDCXX to version 20.

Visual Studio 2017 and 2019

  • Copy src/.libs/libcln.lib into ~/.wine/drive_c/local/lib/x64 (or x86) and the CLN headers in the include directory into ~/.wine/drive_c/local/include/x64/cln (or x86/cln)
  • Get a recent GiNaC (>= 1.8.2)
  • Run autoreconf -i in the source directory
  • Configure
    • 64 bit: ./configure CC="wine cl" CXX="wine cl" LD="wine link" CLN_CFLAGS=-IC:/local/include/x64 CLN_LIBS=C:/local/lib/x64/libcln.lib LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64" CPPFLAGS="-MD -EHsc -Zc:__cplusplus -IC:/vc/include -IC:/vc/sdk/include/um -IC:/vc/sdk/include/ucrt -IC:/local/include" --disable-shared --enable-static --host=amd64-mingw64msvc
    • 32 bit: ./configure CC="wine cl" CXX="wine cl" LD="wine link" CLN_CFLAGS=-IC:/local/include/x86 CLN_LIBS=C:/local/lib/x86/libcln.lib LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86" CPPFLAGS="-MD -EHsc -IC:/vc/include -IC:/vc/sdk/include/um -IC:/vc/sdk/include/ucrt -IC:/local/include" --disable-shared --enable-static --host=i586-mingw32msvc
  • Edit the libtool created by configure:
    • The line starting with old_archive_cmds must read "wine lib -OUT:\$oldlib\$oldobjs\$old_deplibs". Note that this line occurs twice in the file!
  • Build
    • 64 bit: make LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64"
    • 32 bit: make LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86"
  • On Windows compilation will fail in the ginsh subdirectory. Simply cd to this directory and run make -t (since we won't be needing ginsh)
  • Change to the toplevel directory again and finish the build with the same make command as before
  • Check
    • 64 bit: make LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64" check
    • 32 bit: make LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86" check
  • All tests should pass successfully (note that on 64 bit wine the 32 bit tests will not execute)

Preparing the Office SDK

  • Install Office and the Office SDK into wine using the standard Windows installation files. Try to run ~/.wine/drive_c/Program Files/<YOUR_OFFICE>/program/soffice.exe, if this doesn't start, then install it into a clean wine.
  • Remember to install 64-bit versions of the Office and SDK if you set up a 64-bit Visual C++ environment
  • In the SDK base directory (e.g. ~/.wine/drive_c/Program Files/<YOUR_OFFICE>/sdk), edit settings/dk.mk and change the platform PLATFORM=wine (for Apache OpenOffice, create a file called config.guess in the sdk subdirectory with contents echo wine; exit 0)
  • Edit settings/settings.mk and add a section for wine. The iMath source subdirectory src/wine-sdk-config contains a sample that works for me, but keep in mind that the settings.mk file varies between SDK versions.
  • Go to sdk/bin and create an executable called cppumaker with content wine "$OO_SDK_HOME/bin/cppumaker.exe" "$@"
  • Install the Office DLLs where wine can find them (e.g. symlink into the sdk/bin directory) but not into ~/.wine/drive_c/windows/system32, because this will confuse the office. This is required for cppumaker.exe to run

Compiling iMath

Copy libginac.lib into ~/.wine/drive_c/local/lib/x64 (or x86) and the GiNaC headers (also from the parser subdirectory) into ~/.wine/drive_c/local/include/x64/ginac (or x86/ginac)

  • Because GNU make has problems with spaces in paths, it is strongly advisable to create a symlink to ~/.wine/drive_c/Program\ Files and any other directory that has spaces (e.g. LibreOffice\ 5)
  • Edit the config.wine file matching your Office installation in the directory src/wine-sdk-config. Set BASE= to match your wine installation directory. Edit the relevant entries at the top of the file using the symlinked directory names without spaces
  • Source this config.wine.xxx file
  • Run autoreconf -i
  • 32 bit build: Run ./configure CC="wine cl" CXX="wine cl" LD="wine cl" --host=i586-mingw32msvc
  • 64 bit build: Run ./configure CC="wine cl" CXX="wine cl" LD="wine cl" --host=amd64-mingw64msvc
  • Change into the source directory
  • Run make. This will produce an error about mt.exe at the end of the process. Just run make again and the extension is created in the iMathout directory