|
|
Line 20: |
Line 20: |
| Since iMath uses autoconf you should have no trouble compiling it. Should you run into problems please report them to the the author. | | Since iMath uses autoconf you should have no trouble compiling it. Should you run into problems please report them to the the author. |
|
| |
|
| === Compilation and installation (Windows) === | | === Compilation and installation (Windows) |
|
| |
|
| [https://sourceforge.net/apps/mediawiki/ooo-imath/index.php?title=Cross-compiling Cross-compiling for Windows] | | [https://sourceforge.net/apps/mediawiki/ooo-imath/index.php?title=Compiling Compiling under Windows] |
|
| |
|
| === Compiling for Windows === | | === Compilation (Windows cross-compiling from Linux) === |
|
| |
|
| ==== Preparing the Openoffice SDK with Microsoft Visual C++ ====
| | [https://sourceforge.net/apps/mediawiki/ooo-imath/index.php?title=Cross-compiling Cross-compiling for Windows] |
| | |
| To build iMath for Windows, you need the Windows Openoffice SDK.
| |
| | |
| * Download and install the [http://www.openoffice.org 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 and zip (for example, in WINDOWS\system32, or somewhere else in your path)
| |
| | |
| 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. I had to edit this custom batch file and add a correct URE path:
| |
| <code>set OO_SDK_URE_HOME=C:\Programme\OpenOffice.org 3\URE</code>
| |
| Now try to build the example by typing make, if this is not successful fix the problems before continuing.
| |
| | |
| ==== Preparing MSYS and Mingw ====
| |
| | |
| Download the necessary files from [http://www.mingw.org mingw].
| |
| | |
| * Install msys and msysdtk from www.mingw.org. You will need flex and bison, among others
| |
| * Click on the MSYS icon to start a Bourne shell
| |
| * Add .../Microsoft Visual Studio 9.0/Common7/IDE and .../Microsoft Visual Studio 9.0/VC/BIN to PATH (<code>PATH="$PATH":"..."</code>). 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 9.0/BIN to the msys /vc (or find a better way to make CPPFLAGS accept path names with spaces)
| |
| * Copy Microsoft SDKs/Windows/Vxxx/lib to msys /sdk (or find a better way to set the cl.exe LIB path)
| |
| | |
| ==== Compilation with gcc ====
| |
| | |
| ===== Compiling gmp with gcc =====
| |
| | |
| Download and unpack [http://gmplib.org gmp] into your msys home directory.
| |
| | |
| * Change into the new directory.
| |
| * For a shared library build, run configure with <code>--disable-static --enable-shared</code>. Then do make, make check and make install
| |
| * Change into the .libs subdirectory
| |
| * Make sure the MSVC binaries are in your path and run <code>lib /def:libgmp-3.dll.def /out:libgmp-3.lib</code>
| |
| * 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 <code>--enable-static --disable- shared</code> (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 [http://www.agner.org/optimize/ objconv] and put the executable somewhere into your msys path.
| |
| * Change into the .libs subdirectory
| |
| * Run <code>objconv -fcoff -nr:___chkstk:__chkstk libgmp.a libgmp.lib</code> 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 <code>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</code>
| |
| * For a static link, substitute libgmp-3.lib with libgmp.lib
| |
| | |
| ===== Compiling CLN with gcc =====
| |
| | |
| Download the [http://www.ginac.de/CLN CLN source code] and unpack it into your msys home directory
| |
| * Change to the source directory
| |
| * run configure with <code>--with-gmp=/usr/local CPPFLAGS="-DNO_ASM" LDFLAGS="-Wl,--enable-auto-import -static"</code>.
| |
| * Note: I tried <code>--enable-shared --enable-static --with-gmp=/usr/local/</code> and it failed
| |
| * Note: Without the <code>-static</code> the program crashes because it is linked to libstdc++.dll.a, but it works when linking manually to ibstdc++.a
| |
| * Note: Without the <code>-DNO_ASM</code> there is a linker error at pi.exe: <code>multiple definition of shift1right_loop_down</code>
| |
| * Do make, make check, make install
| |
| * Do NOT strip the libcln.a even though it is huge, linking to it will subsequently fail. Instead, strip the .exe files produced
| |
| | |
| ===== Compiling GiNaC 1.5.7 with gcc =====
| |
| | |
| Download the [http://www.ginac.de GiNaC] source code and unpack it into your msys home directory
| |
| * Download pkg-config, glib from the [http://www.gtk.org/download-windows.html GTK project]. Unzip the files and install them under /mingw
| |
| * Change to the source directory
| |
| * Run configure with <code>--disable-shared PKG_CONFIG_PATH=/usr/local/lib/pkgconfig LDFLAGS="-Wl,--enable-auto-import -static"</code>
| |
| * Do make, make check, make install
| |
| * If the compile fails in function.cpp line 1800: Remove <code>new</code> and make <code>-></code> become <code>.</code> (IMHO the return type of the function is ex and not ex*, so this is a bug)
| |
| * According to this [http://bbs.archlinux.org/viewtopic.php?pid=753660 post] changing <code>power::power</code> to <code>GiNaC::power</code> is enough
| |
| | |
| ===== Compiling eqc with gcc =====
| |
| | |
| Download the [http://sourceforge.net/projects/eqc EQC] source code and unpack it into your msys home directory
| |
| * You might be missing some autoconf macros (e.g. <code>ac_cxx_have_sstream.m4</code>). Get [http://nongnu.askapache.com/autoconf-archive Autoconf archive] and install it into /usr/share/aclocal.
| |
| * You also need Mingw libasprintf from the gettext directory
| |
| * Run configure with <code>--disable-shared PKG_CONFIG_PATH=/usr/local/lib/pkgconfig LDFLAGS="-Wl,--enable-auto-import -static"</code>
| |
| | |
| ===== TODO and ideas =====
| |
| * EQC: In utils.h make ext/hash_fun.h be backward/hash_fun.h for mingw windows compile (but ext/hash_fun.h is correct for mingw linux cross-compilation)
| |
| * <code>objconv -fcoff -nu</code> works on libeqc.a and libginac.a from a standard Ubuntu install. Use it instead of compiling it under msys?
| |
| | |
| ==== Compilation with Microsoft Visual C++ ====
| |
| | |
| This is what I tried to get a native MSVC compile (because Openoffice is compiled with MSVC), in spite of being warned that CLN is not compileable with anything except gcc...
| |
| | |
| ===== Preparations =====
| |
| | |
| * Install [http://www.mingw.org 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 [http://www.ginac.de/CLN CLN source code] and unpack it into your msys home directory
| |
| * Change to the source directory
| |
| * run <code>./configure CC=cl CXX=cl CCAS=cl CPPFLAGS="-DEBUG -DNO_ASM -EHsc -MD -I/vc/include -I/sdk/include" LIB=/vc/lib:/sdk/lib</code>
| |
| * 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 <code>cl_asm.lo:</code> and <code>cl_asm_GF2.lo:</code>. Remove the comment from the first line below them
| |
| ** Change cl_asm.S and cl_asm_GF2.S to cl_asm.cc and cl_asm_GF2.cc in the first lines and in the lines you just uncommented (because MSVC doesn't recognize the .S extension). Total of five changes for each.
| |
| ** cp base/digitseq/cl_asm.S to base/digitseq/cl_asm.cc. cl_asm_GF2.cc already exists in my distribution and is identical to cl_asm_GF2.S
| |
| ** run make cl_asm.lo and make cl_asm_GF2.lo. This should create cl_asm.obj and cl_asm_GF2.obj
| |
| ** If you get a libtool error about not finding cygpath, edit libtool in the cln root directory and find the line reading <code>fix_srcfile_path="\`cygpath -w \"\$srcfile\"\`</code>. Change it to <code>fix_srcfile_path="$srcfile"</code>.
| |
| * Run make again
| |
| | |
| 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-
| |
| | |
| When you try to use the library created, there will be lots of unresolved externals when linking. The reason is that libtool actually
| |
| does two links when creating the library (why?) and the second link has less files in its list (why?). Therefore, go to the Makefile
| |
| again and edit the following entry (the second and following lines must start with a tab character):
| |
| libcln.la: $(libcln_la_OBJECTS) $(libcln_la_DEPENDENCIES)
| |
| $(libcln_la_LINK) -rpath $(libdir) $(libcln_la_OBJECTS) $(libcln_la_LIBADD) $(LIBS)
| |
| list='$(libcln_la_OBJECTS)'; \
| |
| libobjects="`echo $$list | sed 's/\\.lo/.obj/g'`"; \
| |
| lib -OUT:.libs/libcln.lib $$libobjects $(libcln_la_LIBADD) $(LIBS)
| |
| | |
| Remove src/.libs/libcln.lib, run touch cl_asm.lo (or any other dependency of the library) and run make again.
| |
| | |
| Now try compiling the examples:
| |
| * Change to the examples subdirectory
| |
| * Edit the Makefile and change the entry for CXXLINK by adding <code>/vc/lib/msvcrt.lib /vc/lib/msvcprt.lib /vc/lib/oldnames.lib /sdk/lib/Kernel32.lib /sdk/lib/Uuid.lib</code> at the end. If you can figure out how to give the library directories to configure please let me know!
| |
| * Also, sometimes the compiler flag <code>-MD</code> given to configure seems to get lost in the examples Makefile. Add it to CXXCOMPILE if you get complaints about a missing libcpmt.lib
| |
| | |
| The linker will fail with some unresolved externals. The reason is the different handling of extern declarations by gcc and MSVC. The errors can be removed by editing the source:
| |
| | |
| # <code>libcln.lib(cl_I_from_digits.obj) : error LNK2019: unresolved external symbol _mulu32_high referenced in function "class cln::cl_I const __cdecl cln::digits_to_I(char const *,unsigned int,unsigned long)" (?digits_to_I@cln@@YA?BVcl_I@1@PBDIK@Z)</code>.
| |
| #* cl_low.h defines <code>extern "C" uint32 mulu32_high;</code>
| |
| #* Solution: Move this declaration outside of the namespace cln in cl_low.h (e.g. to the beginning of the file)
| |
| # The same applies for <code>_divu_32_rest</code> and <code>_divu_16_rest</code>
| |
| # <code>libcln.lib(cl_F_dprint.obj) : error LNK2019: unresolved external symbol "struct cln::cl_anything * __cdecl cl_I_constructor_from_UL(unsigned long)" (?cl_I_constructor_from_UL@@YAPAUcl_anything@cln@@K@Z) referenced in function "public: __thiscall cln::cl_I::cl_I(unsigned long)" (??0cl_I@cln@@QAE@K@Z)</code>.
| |
| #* cl_I.h declares <code>extern cl_private_thing cl_I_constructor_from_UL (uint32 wert);</code> and <code>extern cl_private_thing cl_I_constructor_from_Q (sint64 wert);</code> somewhere in the file
| |
| #* Comment out these declarations
| |
| #* Replace them by the following at the beginning of the file:
| |
| extern cln::cl_private_thing cl_I_constructor_from_UL (uint32 wert);
| |
| extern cln::cl_private_thing cl_I_constructor_from_Q (sint64 wert);
| |
| #* Edit cl_I_from_UL.cc and comment out the namespace declaration <code>namespace cln {</code> and <code>} // namespace cln</code>
| |
| #* Add <code>using namespace cln;</code>
| |
| #* Do the same for cl_I_from_Q.cc
| |
| | |
| Now pi.exe compiles and links and calculates PI (whether correctly or not, I did not check). If it doesn't, you might have to remove the .lo files which the linker complains about and re-make in the src subdirectory so that the source code modifications find their way into the library.
| |
| | |
| The other examples need more modifications of the source along the same lines to link. Only e.cc presents new problems
| |
| * Add <code>#include "../src/float/lfloat/cl_LF.h"</code> to the beginning of the file
| |
| * Comment out the <code>extern cl_LF cl_I_to_LF(const cl_I&, uintC);</code> declaration lower down
| |
| * Change the call to <code>log(10)</code> to <code>log ((double)10))</code>
| |
| * Edit cl_LF.h, comment out <code>extern const cl_LF cl_I_to_LF (const cl_I& x, uintC len);</code> and add <code>extern const cln::cl_LF cl_I_to_LF (const cln::cl_I& x, uintC len);</code> to the beginning of the file, outside the namespace cln
| |
| * Edit cl_LF_from_I.cc, remove <code>namespace cln{}</code> and add <code>using namespace cln;</code> instead
| |
| | |
| To ensure that all the files depending on cl_LF.h etc. get recompiled, it is simplest (but takes a while) to do a make clean and then a new make.
| |
| | |
| Try compiling the checks:
| |
| * Edit the makefile in the tests subdirectory and manually add the libraries as above
| |
| * Run "make check"
| |
| * On my compile, this compiled without a flaw and said "All two tests passed"
| |
| | |
| If you want to use the gmp library as compiled and modified by objconv above, add <code>--with-gmp=/usr/local LDFLAGS=/usr/local/lib/libgmp.lib</code> 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.
| |
| | |
| To get a successful GiNaC compile, more edits of the source code for missing externals are necessary
| |
| * Edit include/cln/integer_io.h
| |
| ** Find four lines with <code>extern print_integer</code> and move them to the top of the file, outside of namespace cln
| |
| ** Find the line with <code>extern cl_print_flags default_print_flags</code> and move it to the top of the file
| |
| ** Add <code>cln::</code> to all occurences of <code>cl_print_flags</code> and <code>cl_I</code> which you moved out of the namespace
| |
| * Edit include/cln/output.h
| |
| ** Move the line <code>extern cl_print_flags default_print_flags;</code> to the top of the file, outside of namespace cln
| |
| ** Add <code>cln::</code> before <code>cl_print_flags</code>
| |
| * Do the same for float_io.h, lfloat_io.h, dfloat_io.h, sfloat_io.h, ffloat_io.h, complex_io.h, real_io.h and rational_io.h
| |
| * Edit cl_I_[a-d]print.cc, remove the <code>namespace cln</code> and add <code>using namespace cln;</code> to the top of the files
| |
| * Do the same for cl_I_print.cc
| |
| * Edit cl_prin_globals.cc and move <code>cl_print_flags default_print_flags;</code> outside of namespace cln. Add <code>cln::</code> before <code>cl_print_flags</code>
| |
| * Do <code>make clean; make</code> to catch all the dependencies
| |
| | |
| Actually, there are lots more header files which would need similar edits, but I have listed only those required to get GiNaC to build.
| |
| | |
| ===== Compiling GiNaC =====
| |
| | |
| Download the Ginac source code from [http://github.com/AlexeiSheplyakov/GiNaC/tree/master.msvc.support git] and unpack it into your msys home directory
| |
| * Download pkg-config, glib from the [http://www.gtk.org/download-windows.html GTK project]. Unzip the files and install them under /mingw
| |
| * Change to the source directory
| |
| * Run <code>./configure CC=cl CXX=cl 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</code>
| |
| * 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
| |
| * 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.
| |
| * Linking in the tools subdirectory requires editing the Makefile and manually adding the libraries to <code>CXXLINK</code> after <code>-o $@</code>: <code>/vc/lib/msvcrt.lib /vc/lib/msvcprt.lib /vc/lib/oldnames.lib /sdk/lib/Kernel32.lib /sdk/lib/Uuid.lib</code>
| |
| * <code>make check</code> passes all 58 tests successfully
| |
| | |
| ===== Compiling EQC =====
| |
| | |
| Download the EQC source code and unpack it into your msys home directory
| |
| * Change to the eqc directory
| |
| * Edit src/Makefile.am and comment out the line <code>CXX := /usr/bin/ccache $(CXX)</code> if you don't have ccache installed
| |
| * Run <code>./configure CC=cl CXX=cl 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</code>
| |
| * Edit src/Makefile and add to am_eqc_OBJECTS : /vc/lib/msvcprt.lib /vc/lib/msvcrt.lib /vc/lib/oldnames.lib /sdk/lib/Kernel32.lib /sdk/lib/Uuid.lib
| |
|
| |
|
| === Binary packages === | | === Binary packages === |