Cross-compiling for Windows: Difference between revisions

From iMath
Jump to navigation Jump to search
Line 156: Line 156:
* Source the config.wine file
* 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?)
* 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 <code>./configure CC="wine cl" CXX="wine cl" LD="wine CL" --host=i586-mingw32msvc --build=i686-pc-linux-gnu</code>
* Run <code>env LIBTOOLIZE=/usr/local/bin/libtoolize autoreconf -i</code>
* Run <code>./configure CC="wine cl" CXX="wine cl" LD="wine cl" --host=i586-mingw32msvc --build=i686-pc-linux-gnu</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

Revision as of 16:43, 21 December 2010

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++ 2008 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, mspdb80.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 vcrun2008. This will override msvcr90.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/cl
mkdir ~/.wine/drive_c/cl/VC
cp -aR /c/Programme/Microsoft Visual Studio 9/VC/lib/ ~/.wine/drive_c/cl/VC
cp -aR mvs/VC/include/ ~/.wine/drive_c/cl/VC
cd .wine/drive_c/cl/VC/include/
cp time.h sys
mkdir ~/.wine/drive_c/cl/SDK
cp -aR /c/Programme/Microsoft\ SDKs/Windows/v6.0A/Lib/ ~/.wine/drive_c/cl/SDK
cp -aR /c-ro/Programme/Microsoft\ SDKs/Windows/v6.0A/Include/ ~/.wine/drive_c/cl/SDK

Libtool version 2.4 claims to be able to deal with MSVC. I have not been able to confirm this, but if you want to try, you can download libtool 2.4 source, run configure, make and make install (which will install into /usr/local/...). Then, to use it e.g. in compiling GiNaC, go to the main GiNaC directory and run env LIBTOOLIZE=/usr/local/bin/libtoolize autoreconf -i before executing configure

Compiling CLN

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

Compiling GiNaC

Copy libcln.lib into ~/.wine/drive_c/cl/lib and the CLN headers into ~/.wine/drive_c/cl/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:/cl/VC/include -IC:/cl/SDK/Include -IC:/cl/include" LIB="C:/cl/VC/lib;C:/cl/SDK/lib;C:/cl/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:/cl/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:/cl/VC/lib/msvcrt.lib C:/cl/VC/lib/msvcprt.lib C:/cl/VC/lib/oldnames.lib C:/cl/SDK/lib/Kernel32.lib C:/cl/SDK/lib/Uuid.lib C:/cl/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/cl/lib and the GiNaC headers into ~/.wine/drive_c/cl/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:/cl/VC/lib;c:/cl/SDK/lib" CPPFLAGS="-DEBUG -MD -EHsc -IC:/cl/VC/include -IC:/cl/SDK/include -IC:/cl/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:/cl/VC/lib/msvcrt.lib C:/cl/VC/lib/msvcprt.lib C:/cl/VC/lib/oldnames.lib C:/cl/SDK/lib/Kernel32.lib C:/cl/SDK/lib/Uuid.lib C:/cl/lib/libcln.lib C:/cl/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=WIN
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)/cl/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
  • 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/cl/lib and the headers into ~/.wine/drive_c/cl/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