Cross-compiling for Windows

From iMath
Jump to navigation Jump to search

Ubuntu, wine, and msys installed into wine

I have not been successful with this. If you want to try, get the automated MinGW installer from Sourceforge. Choose the pre-packaged lists, and then run mingw-get update; mingw-get install msys-base mingw32-base, which should update libtool to version 2.4

Ubuntu, mingw32, wine and Microsoft Visual C++

General setup

It seems that an Openoffice 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++ 2010 to work under wine. Installing with vcsetup.exe, or installing Visual Studio is pretty hopeless and an overkill anyway. Instead, try this hack:

  • Get a working installation under Windows (the express version is available for free, and works fine)
  • After booting into Ubuntu, copy cl.exe, c1xx.dll, c1.dll, c2.dll, lib.exe, link.exe, mspdb100.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

Install the required libraries and include files somewhere (is there a better/standard location?)

mkdir ~/.wine/drive_c/vc
cp -aR /c/Programme/Microsoft Visual Studio 9/VC/lib/ ~/.wine/drive_c/vc
cp -aR /c/Programme/Microsoft Visual Studio 9/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

Libtool version 2.4 claims to be able to deal with MSVC so use that version if you can.

Compiling CLN

CLN still needs a lot of fixes to compile with MSVC.

Compiling GiNaC

Copy libcln.lib into ~/.wine/drive_c/local/lib and the CLN headers into ~/.wine/drive_c/local/include/cln

Get the source code from GiNaC MSVC support branch using the download button on the web page.

You can now run ./configure CC="wine cl" CXX="wine cl" LD="wine link" LIBTOOL=/usr/local/bin/libtool CPPFLAGS="-DEBUG -MD -EHsc -IC:/vc/include -IC:/sdk/Include -IC:/local/include" LIB="C:/vc/lib;C:/sdk/lib;C:/local/lib" --host=i586-mingw32msvc (assuming that you are using the libtool installed into /usr/local). There are still a lot of libtool issues, though, which need to be hacked by editing libtool:

  • 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!
  • The line starting with LTCFLAGS must read LTCFLAGS="-g -IC:/vc/VC/include -IC:/cl/SDK/Include"
  • Find the line containing $cwrapper $cwrappersource and add C:/cl/VC/lib/libcmt.lib C:/cl/VC/lib/oldnames.lib C:/cl/SDK/lib/Kernel32.lib to the end of it
  • In the check (and other subdirectories), when linking fails edit the Makefile and add the following to the command starting with CXXLINK: C:/vc/lib/msvcrt.lib C:/vc/lib/msvcprt.lib C:/vc/lib/oldnames.lib C:/sdk/lib/Kernel32.lib C:/sdk/lib/Uuid.lib C:/local/lib/libcln.lib
  • After compilation, the wrapper created in the source directory does not work, but the .exe created in .libs does. Do cp .libs/* . before running make check again.

After hacking away the libtool problems, GiNaC compiles and all 58 tests pass successfully.

Compiling EQC

Copy libginac.lib into ~/.wine/drive_c/local/lib and the GiNaC headers into ~/.wine/drive_c/local/include/ginac

  • Before starting, be sure to run make distclean and also remove the ccache line in src/Makefile.am (if you want to use ccache then add it to the configure invocation, e.g. CC="ccache wine cl")
  • Run env LIBTOOLIZE=/usr/local/bin/libtoolize autoreconf -i and ./configure CC="wine cl" CXX="wine cl" LD="wine link" LIB="C:/vc/lib;c:/sdk/lib" CPPFLAGS="-DEBUG -MD -EHsc -IC:/vc/include -IC:/sdk/include -IC:/local/include" --host=i586-mingw32msvc.
  • To get EQC to link successfully, you need to edit the src/Makefile and add the following to the command starting with CXXLINK C:/vc/lib/msvcrt.lib C:/vc/lib/msvcprt.lib C:/vc/lib/oldnames.lib C:/sdk/lib/Kernel32.lib C:/sdk/lib/Uuid.lib C:/local/lib/libcln.lib C:/local/lib/libginac.lib.
  • If the Makefile has no such line, edit libeqc.la instead and change the line reading dependency_libs to have these libraries (instead of the ones listed).
  • Run make
  • If you get an error lib: command not found, find two lines with ...lib -OUT... in libtool and change them to ...wine lib -OUT...

Preparing the OOo SDK

  • Install Openoffice.org and the Openoffice SDK into wine using the standard Windows installation files. Try to run ~/.wine/drive_c/Program Files/OpenOffice.org 3/program/soffice.exe, if this doesn't start (cannot determine user interface language), then install it into a clean wine.
  • In the SDK base directory (e.g. ~/.wine/drive_c/Program Files/OpenOffice.org 3/Basis/sdk), put a file config.guessecho wine; exit 0 and make it executable.
  • Edit settings/settings.mk and add a section for wine:
###########################################################################
#
# Wine specific settings
#
###########################################################################
ifeq "$(PLATFORM)" "wine"
# Settings for Wine cross-compilation using Microsoft compiler/linker
#
OS=WINE
PS=/
ICL=$$
CC=wine cl
LINK=wine link
BUILDLIB=wine lib
echo=echo
MKDIR=mkdir -p
MV=mv
CAT=cat
OBJ_EXT=obj
EXE_EXT=.exe
COPY=cp
SHAREDLIB_EXT=dll
SHAREDLIB_OUT=$(OUT_BIN)
PACKAGE_LIB_DIR=windows.plt
UNOPKG_PLATFORM=Windows 
#
OSEP=\<
CSEP=\>
QUOTE=
QM=\"
SQM=
ECHOLINE=echo.
P2BG= 
#
DEL=rm
DELRECURSIVE=rm -r
URLPREFIX=file:///  
#
SALLIB=isal.lib
CPPULIB=icppu.lib
CPPUHELPERLIB=icppuhelper.lib
SALHELPERLIB=isalhelper.lib
REGLIB=ireg.lib
STORELIB=istore.lib
STLPORTLIB=stlport_vc71$(STLDEBUG).lib 
#
BLANK= 
EMPTYSTRING=
PATH_SEPARATOR=;
# use this for release version
CC_FLAGS=-c -MT -Zm500 -Zc:forScope,wchar_t- -wd4251 -wd4275 -wd4290 -wd4675 -wd4786 -wd4800 -Zc:forScope -GR -EHa
ifeq "$(CPP_MANIFEST)" "true"
LINK_MANIFEST=mt -manifest $@.manifest "-outputresource:$@;2"
else
LINK_MANIFEST=
endif
ifeq "$(DEBUG)" "yes"
CC_FLAGS+=-Zi
endif 
CC_INCLUDES=-I. -I$(OUT_INC) -I$(PRJ)/include -I"$(CPP_WINDOWS_VC)/include" -I"$(BASE)/local/include"
#STL_INCLUDES=-I"$(OO_SDK_HOME)/include/stl"
SDK_JAVA_INCLUDES = -I"$(OO_SDK_JAVA_HOME)/include" -I"$(OO_SDK_JAVA_HOME)/include/win32"
#
# define for used compiler necessary for UNO
# -DCPPU_ENV=msci -- windows msvc 4.x - 7.x
#
CC_DEFINES=-DWIN32 -DWNT -D_DLL -DCPPU_ENV=msci
CC_OUTPUT_SWITCH=-Fo
#
LIBRARY_LINK_FLAGS=/NODEFAULTLIB /DLL /DEBUGTYPE:cv
COMP_LINK_FLAGS=$(LIBRARY_LINK_FLAGS) /DEF:$(PRJ)/settings/component.uno.def
EXE_LINK_FLAGS=/MAP /OPT:NOREF /SUBSYSTEM:CONSOLE /BASE:0x1b000000 /DEBUGTYPE:cv /NODEFAULTLIB  msvcrt.lib kernel32.lib
ifeq "$(DEBUG)" "yes"
LIBRARY_LINK_FLAGS+=/DEBUG
EXE_LINK_FLAGS+=/DEBUG
endif
endif
  • Go to sdk/bin and create an executable cppumaker LD_LIBRARY_PATH=/usr/lib/ure/lib /usr/lib/openoffice/basis3.2/sdk/bin/cppumaker.bin "$@"
  • Go to URE/bin and do ln -s /usr/lib/ure/bin/regmerge ..
  • We probably don't want to use regcomp, but anyway
ln -s /usr/lib/ure/bin/regcomp .
ln -s /usr/lib/ure/bin/regcomp.bin .
  • Install the OOo DLLs where wine can find them, but not into ~/.wine/drive_c/windows/system32, because this will confuse openoffice ("Cannot determine user interface language" error)

Compiling iMath

  • Copy libeqc.lib into ~/.wine/drive_c/local/lib and the headers into ~/.wine/drive_c/local/include/libeqc
  • Edit config.wine BASE= to match your wine installation directory
  • Source the config.wine file
  • Edit src/Makefile.in and change the line starting with PRJ to match your installation (spaces must be escaped - therefore using $(...) doesn't work. Can someone tell me how to get it to work?)
  • Run env LIBTOOLIZE=/usr/local/bin/libtoolize autoreconf -i
  • Run ./configure CC="wine cl" CXX="wine cl" LD="wine cl" --host=i586-mingw32msvc --build=i686-pc-linux-gnu
  • 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