Compiling under Windows
Preparing the Openoffice SDK with Microsoft Visual C++
To build iMath for Windows, you need the Windows Openoffice SDK.
- Download and install the Openoffice SDK
- The following is explained in detail in "SDK installation directory"\sdk\docs\install.html
- Install Microsoft Visual C++ (the free express version will do, then you also need to install the Microsoft Visual Studio 2008 Redistributable Package)
- Install make (e.g. copy C:\MinGW\bin\mingw32-make.exe to WINDOWS\system32 and rename it to make.exe)
- Install info-zip (e.g. download from [1] and put zip.exe into C:\Windows\system32)
- To test the SDK installation, open a command prompt and cd to the ...\sdk\examples\cpp\DocumentLoader directory.
- Run ...\sdk\setsdkenv_windows.bat to configure your environment. This should create a custom batch file somewhere in your home directory (usually Application Data\Openoffice\...). Give it the correct paths to the make and zip executables
- I had to edit thecustom batch file and add a correct URE path:
set OO_SDK_URE_HOME=C:\Programme\OpenOffice.org 3\URE
- Run vsvars32.bat from the MSVC\Common7\Tools directory
- Now try to build the example by typing make, if this is not successful fix the problems before continuing.
- The next time you want to use the SDK, just run the custom batch file to set the environment variables required
Preparing the Cygwin environment
Since LibreOffice for Windows is being built through Cygwin, it is best to set up the environment as described on the LibreOffice build page. Of course, you can skip the downloading of the Office source code.
For some reason CLN expects time.h to be in the subdirectory sys. Copy it from your Visual Studio Installation directory\VC\include\time.h to sys\time.h in the same directory.
Take care not to install the gcc compiler when you install Cygwin, as it takes precedence of MSVC. You can check this by running the Cygwin setup.exe, searching for the packages gcc-core and gcc-g++, and uninstalling them if necessary.
Setup the cygwin.bat (usually found in C:\cygwin) to set the MSVC environment variables before running the Cygwin shell. Insert the following call before the last line:
call "%VS120COMNTOOLS%\vsvars32.bat"
Note that depending on your version of Visual Studio the 120 might be another number. Run
cmd.exe
set
to see what variable is available on your system.
Compiling with Microsoft Visual C++
Compiling CLN
Get the CLN sourcecode from the CLN website. Bring up a Cygwin shell by calling the cygwin.bat file. Change to the source directory. Run autoreconf -i
and ./configure CPPFLAGS="-MD -DNO_ASM -EHsc"
. Check in the output of configure that cl.exe is found as the C compiler.
Run make
. It will probably stop and complain about missing files base/digitseq/cl_asm.obj and polynomial/elem/cl_asm_GF2.obj. Remove the files base/digitseq/cl_asm.lo and polynomial/elem/cl_asm_GF2.lo. Run make base/digitseq/cl_asm.lo
. It will fail again but you can see the command that was issued. Copy this command exactly, adding the flag -TC
before -c
(this will enable MSVC to recognize the extension .S
as a valid source file extension). Repeat for cl_asm_GF2.obj. This should create cl_asm.obj and cl_asm_GF2.obj (if not, repeat the procedure).
Run make
to finish the build, make check</check> do run some tests on the library, and
make install
to install it. On my system, the pkg-config information was not installed automatically, so I had to manually copy cln.pc to /usr/lib/pkg-config.
Preparing MSYS and Mingw
- Get the mingw installer from here
- Use the pre-packaged lists for the first install
- Do mingw-get update and mingw-get install msys-base mingw32-base. This should update libtool to 2.4
- Click on the MSYS icon to start a Bourne shell
- Add .../Microsoft Visual Studio 10.0/Common7/IDE and .../Microsoft Visual Studio 10.0/VC/BIN to PATH (e.g
PATH=$PATH:"/c/Programme/Microsoft Visual Studio 10.0/Common7/IDE":"/c/Programme/Microsoft Visual Studio 10.0/VC/bin"
). You can find these paths in vsvars32.bat somewhere in the Visual Studio installation directory.
- If you want to use cl (the Microsoft compiler) to compile something, copy .../Microsoft Visual Studio 10.0/VC/include and lib to msys /vc/include and /vc/lib (or find a better way to make CPPFLAGS accept path names with spaces)
- Copy Microsoft SDKs/Windows/Vxxx/Include and Lib to msys /sdk/include and /sdk/Lib (or find a better way to set the cl.exe LIB path)
Compiling gmp with gcc
Download and unpack gmp into your msys home directory.
- Change into the new directory.
- For a shared library build, run configure with
--disable-static --enable-shared
. Then do make, make check and make install
- Change into the .libs subdirectory
- Make sure the MSVC binaries are in your path and run
lib /def:libgmp-3.dll.def /out:libgmp-3.lib
- Copy libgmp-3.exp, libgmp-3.dll.def and libgmp-3.lib into /usr/local/lib.
- Do make distclean
- For a static library build, run configure with
--enable-static --disable- shared
(note that it is not possible to build both static and shared libraries in one compilation run).
- Do make, make check and make install
- Note that make install overwrites the libgmp.la for dynamic linking in /usr/local/lib.
- Download objconv objconv and put the executable somewhere into your msys path.
- Change into the .libs subdirectory
- Run
objconv -fcoff -nr:___chkstk:__chkstk libgmp.a libgmp.lib
to make the symbols compatible with MSVC
- Copy the new libgmp.lib into /usr/local/lib
To compile a test program with MSVC
- Open a DOS command shell and go to the gmp directory.
- You can find some example files in the demos subdirectory of gmp.
- For a dynamically linked program, run
cl /MD -I \vc\include -I \sdk\include -I \local\include isprime.c /link /LIBPATH: \vc\lib /LIBPATH: \sdk\lib LIBPATH: \local\lib libgmp-3.lib
- For a static link, substitute libgmp-3.lib with libgmp.lib
Compilation with Microsoft Visual C++
Preparations
- Install mingw (the minimal version will do since we will be using the Microsoft compiler)
- Set your PATH as described above in the gcc compile section and create the msys /vc and /sdk directories
- Create the /vc/include/sys directory and put /vc/include/time.h into it
Compiling CLN
Download the CLN source code and unpack it into your msys home directory
- Change to the source directory
- run
./configure LD=cl CC=cl CXX=cl CCAS=cl CPPFLAGS="-DEBUG -DNO_ASM -EHsc -MD -I/vc/include -I/sdk/include" LIB=/vc/lib:/sdk/lib
- Run make LIB="/vc/lib;/sdk/lib"
- make will stop and complain about missing files cl_asm.obj and cl_asm_GF2.obj
- copying cl_asm.o from a gcc compile to cl_asm.obj gives lots of linker errors, don't try that
- change to the src subdirectory
- Remove cl_asm.lo and cl_asm_GF2.lo
- Edit the Makefile and find the lines starting with
cl_asm.lo:
and cl_asm_GF2.lo:
.
- Change cl_asm.S and cl_asm_GF2.S to cl_asm_.cc and cl_asm_GF2.cc in these lines (because MSVC doesn't recognize the .S extension). Total of three (six?) changes for each.
- run make again in the top-level directory
The build will finish with some linker warnings about duplicate definitions and create the library in .libs.
The linker errors are (hopefully) all harmless and have to do with different handling of inlined functions by gcc and MSVC
- bool zerop(const cl_RA&): As soon as more than one file includes cl_RA.h, inline bool zerop(..) is defined twice and produces a linker warning
- cl_I numerator (const cl_RA&): same as above
- bool CL_FLATTEN minusp (const cl_RA&): same as above
- const cl_I denominator (const cl_RA&): same as above
- bool zerop (const cl_I&): As soon as more than one file includes cl_I.h, inline bool zerop(..) is defined twice and produces a linker warning
- bool minusp (const cl_I&): Same as zerop
- const cl_LF operator+ (const cl_LF&, const cl_LF&): Defined in cl_LF_2plus.cc and as an inline version in cl_LF.h, these clash when cl_R_mul.cc includes cl_LF.h
- same for operator-
Now try compiling the examples and checks:
- Run
make LIB="/vc/lib;/sdk/lib" check
- On my machine, this compiled without a flaw and said "All two tests passed"
Install the library and headers
- Run
make LIB=/vc/lib:/sdk/lib install
to put them into /local/lib
If you want to use the gmp library as compiled and modified by objconv above, add --with-gmp=/usr/local LDFLAGS=/usr/local/lib/libgmp.lib
to the configure invocation. You might have to create a copy of libgmp.lib named libgmp.a in /usr/local/lib because make will link to both of them.
Compiling GiNaC
Download the Ginac source code from git and unpack it into your msys home directory
- Download pkg-config, gettext and glib2 from the GTK project. Unzip the files and install them under /MinGW/bin
- Change to the source directory
- Run
./configure CPPFLAGS="-DEBUG -MD -EHsc -I/vc/include -I/sdk/include" LIB=/vc/lib:/sdk/lib PKG_CONFIG_PATH=/usr/local/lib/pkgconfig --disable-shared --enable-static
- If configure chokes, find pkg.m4 on the web and put it in MinGW/share/aclocal
- If you have not installed libreadline, then configure will give a warning. You can ignore this if you do not plan to build the ginsh.
- run make LIB="/vc/lib:/sdk/lib"
- The linker complains about "no public symbols existing" in registrar.obj, which seems to be OK since the source file has no code.
- Make will fail in the ginsh subdirectory if you have not installed libreadline. Run make -t in this directory to ignore the problem.
- Running
make LIB=/vc/lib:/sdk/lib check
passes all 58 tests successfully
- Run
make LIB=/vc/lib:/sdk/lib install
to put the library into /local/lib
Compiling EQC
Download the EQC source code and unpack it into your msys home directory
- Don't forget to set the Visual C++ paths as described above
- Run
autoreconf -i
to get the newest libtool files
- Run
./configure LIB=/vc/lib:/sdk/lib CPPFLAGS="-DEBUG -MD -EHsc -I/vc/include -I/sdk/include" PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
- Run
make LIB="/vc/lib:/sdk/lib"
- You need to run
make LIB="/vc/lib:/sdk/lib" install
to install library and headers correctly. If you have not installed the tools required to build the files in the doc directory, edit Makefile.am there and remove all lines except the first two.
- On my system eqc.pc did not get installed into /local/lib/pkgconfig, so I copied it there manually
Compiling iMath
Make sure you have the Microsoft Visual C++ 2010 Redistributable package installed (search for vcredist on the Microsoft website)
Download the iMath source code and unpack it into your msys home directory in an msys shell
- Run
autoreconf -i
to get the newest libtool files
- Run
./configure LIB=/vc/lib:/sdk/lib CPPFLAGS="-I/vc/include -I/sdk/include" PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
Now change to a DOS shell prepared for the OpenOffice SDK as described above
- Go to the src subdirectory
- Edit the Makefile and adapt the OS and MINGW settings at the beginning
- If your office installation path has a space in it, you need to set the PRJ manually in the Makefile, prepending every space with a backslash
- run make
- If cppumaker chokes, just run the identical command manually without the -O flag. Move the generated type directory ./com to ./inc/com
- In my opinion, there is an error in the sdk/settings/settings.mk file. The CC_FLAGS must not have -MT, instead they should have -MD. Change this if you get linker errors when creating the DLL
- If make chokes on the manifest, just run make again to ignore the error
- After make was successful, run make deploy to install the extension