Jump to content

Windows/Build/Cross-Compiling: Difference between revisions

From KDE Community Wiki
*>Brandon
*>Brandon
Line 12: Line 12:
To cross compile kde you need cmake >= 2.5, you can get the last version from [http://cmake.org/HTML/Download.html#cvs CVS]
To cross compile kde you need cmake >= 2.5, you can get the last version from [http://cmake.org/HTML/Download.html#cvs CVS]


* Create a file Toolchain-mingw32.cmake with this content and place it somewhere i.e. in your home
* Create two files Toolchain-mingw32.cmake and mingw32-kdelibs.cmake with this contents and place them somewhere i.e. in your home
<code bash>
====Toolchain-mingw32.cmake====
<code scheme>
# the name of the target operating system
# the name of the target operating system
SET(CMAKE_SYSTEM_NAME Windows)
SET(CMAKE_SYSTEM_NAME Windows)
Line 25: Line 26:


# adjust the default behaviour of the FIND_XXX() commands:
# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search  
# search headers and libraries in the target environment, search
# programs in the host environment
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
Line 31: Line 32:
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)


# FindQt4.cmake querys qmake to get information, this doesn't work when crosscompiling
set(KDE4_INSTALL_DIR    /windows/kde4)
set(KDE4_INSTALL_DIR    /windows/kde4)
set(QT_BINARY_DIR  /home/kdeuser/kde/src/qt-copy/bin)
set(QT_BINARY_DIR  /home/kdeuser/kde/src/qt-copy/bin)
set(CMAKE_INSTALL_PREFIX ${KDE4_INSTALL_DIR})
set(LIB_INSTALL_DIR      ${KDE4_INSTALL_DIR}/lib)
set(QT_LIBRARY_DIR  ${KDE4_INSTALL_DIR}/lib)
set(QT_LIBRARY_DIR  ${KDE4_INSTALL_DIR}/lib)
set(QT_QTCORE_LIBRARY  ${KDE4_INSTALL_DIR}/lib/libQtCore4.a)
set(QT_QTCORE_LIBRARY  ${KDE4_INSTALL_DIR}/lib/libQtCore4.a)
Line 45: Line 42:
set(QT_QMAKE_EXECUTABLE  ${QT_BINARY_DIR}/qmake)
set(QT_QMAKE_EXECUTABLE  ${QT_BINARY_DIR}/qmake)
set(QT_UIC_EXECUTABLE  ${QT_BINARY_DIR}/uic)
set(QT_UIC_EXECUTABLE  ${QT_BINARY_DIR}/uic)
</code>
====mingw32-kdelibs.cmake====
<code scheme>
set(KDE4_INSTALL_DIR    /windows/kde4)
set(KDE4_BIN_DIR    /home/kdeuser/kde/bin)
# this one is used by FindKDE4.cmake to load FindKDE4Internal.cmake:
set(KDE4_DATA_DIR    /windows/kde4/share/apps CACHE PATH "points to the apps directory of installed kdelibs")
# not sure about this one:
set(KDEWIN_DIR ${KDE4_INSTALL_DIR} CACHE PATH "what is it ?")


set(WITH_AVAHI OFF)
# disable some things:
set(WITH_DNSSD OFF)
set(WITH_AVAHI OFF   CACHE BOOL "Disabled")
set(WITH_ENCHANT OFF)
set(WITH_DNSSD OFF   CACHE BOOL "Disabled")
set(WITH_FAM OFF)
set(WITH_ENCHANT OFF CACHE BOOL "Disabled")
set(WITH_GSSAPI OFF)
set(WITH_FAM OFF     CACHE BOOL "Disabled")
set(WITH_HSPELL OFF)
set(WITH_GSSAPI OFF CACHE BOOL "Disabled")
set(WITH_OpenEXR OFF)
set(WITH_HSPELL OFF CACHE BOOL "Disabled")
set(WITH_OpenEXR OFF CACHE BOOL "Disabled")


set(KDE4_DATA_DIR  ${KDE4_INSTALL_DIR}/share/apps)
set(KDE4_KCFGC_EXECUTABLE ${KDE4_BIN_DIR}/kconfig_compiler CACHE PATH "")
set(KDE4_LIB_INSTALL_DIR    ${KDE4_INSTALL_DIR}/lib)
set(KDE4_AUTOMOC_EXECUTABLE ${KDE4_BIN_DIR}/kde4automoc CACHE PATH "")
set(KDE4_INCLUDE_DIR ${KDE4_INSTALL_DIR}/include)
set(KDE4_MEINPROC_EXECUTABLE ${KDE4_BIN_DIR}/meinproc4 CACHE PATH "")
set(KDE4_KDECORE_LIBRARY    ${KDE4_INSTALL_DIR}/lib/libkdecore.dll.a)
set(KDE4_KDE3SUPPORT_LIBRARY    ${KDE4_INSTALL_DIR}/lib/libkde3support.dll.a)
set(KDE4_KDEUI_LIBRARY    ${KDE4_INSTALL_DIR}/lib/libkdeui.dll.a)
set(KDE4_KIO_LIBRARY    ${KDE4_INSTALL_DIR}/lib/libkio.dll.a)
set(KDE4_KDNSSD_LIBRARY    ${KDE4_INSTALL_DIR}/lib/libkdnssd.dll.a)
set(KDE4_KFILE_LIBRARY    ${KDE4_INSTALL_DIR}/lib/libkfile.dll.a)
set(KDE4_KHTML_LIBRARY    ${KDE4_INSTALL_DIR}/lib/libkhtml.dll.a)
set(KDE4_KNEWSTUFF2_LIBRARY    ${KDE4_INSTALL_DIR}/lib/libknewstuff2.dll.a)
set(KDE4_KNOTIFYCONFIG_LIBRARY    ${KDE4_INSTALL_DIR}/lib/libknotifyconfig.dll.a)
set(KDE4_KPARTS_LIBRARY    ${KDE4_INSTALL_DIR}/lib/libkparts.dll.a)
set(KDE4_KTEXTEDITOR_LIBRARY    ${KDE4_INSTALL_DIR}/lib/libktexteditor.dll.a)
set(KDE4_KUTILS_LIBRARY    ${KDE4_INSTALL_DIR}/lib/libkutils.dll.a)
set(KDE4_PHONON_LIBRARY    ${KDE4_INSTALL_DIR}/lib/libphonon.dll.a)
set(KDE4_SOLID_LIBRARY    ${KDE4_INSTALL_DIR}/lib/libsolid.dll.a)
set(KDEWIN_DIR ${KDE4_INSTALL_DIR})
</code>
</code>
adjust the values according to your setup
adjust the values according to your setup

Revision as of 02:05, 17 March 2008

Warning

This section needs improvements: Please help us to

cleanup confusing sections and fix sections which contain a todo


cross compiling is still unstable

Template:KDE4

Basic tools

MinGw

Install mingw for linux, on debian the packages are called mingw32, mingw32-binutils, mingw32-runtime, you need to install mingw32 with gcc/g++ 3 and not 4 since that doesn't work with kdelibs, debian testing/unstable has gcc 4 so i've installed mingw32 package from ubuntu repository

Qt4 Kdesupport and dependencies

You can install these dependencies(aspell, boost, dbus, qca etc..) from windows with the kdewin installer or manually download them from sourceforge mirrors

Qt4 and KDE4 for linux

You also need to have Qt4 and KDE4 already installed on linux, to use moc/uic/kde4automoc etc...

Cmake

To cross compile kde you need cmake >= 2.5, you can get the last version from CVS

  • Create two files Toolchain-mingw32.cmake and mingw32-kdelibs.cmake with this contents and place them somewhere i.e. in your home

Toolchain-mingw32.cmake

  1. the name of the target operating system

SET(CMAKE_SYSTEM_NAME Windows)

  1. which compilers to use for C and C++

SET(CMAKE_C_COMPILER i586-mingw32msvc-gcc) SET(CMAKE_CXX_COMPILER i586-mingw32msvc-g++)

  1. here is the target environment located

SET(CMAKE_FIND_ROOT_PATH /usr/i586-mingw32msvc /windows/kde4 )

  1. adjust the default behaviour of the FIND_XXX() commands:
  2. search headers and libraries in the target environment, search
  3. programs in the host environment

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

  1. FindQt4.cmake querys qmake to get information, this doesn't work when crosscompiling

set(KDE4_INSTALL_DIR /windows/kde4) set(QT_BINARY_DIR /home/kdeuser/kde/src/qt-copy/bin) set(QT_LIBRARY_DIR ${KDE4_INSTALL_DIR}/lib) set(QT_QTCORE_LIBRARY ${KDE4_INSTALL_DIR}/lib/libQtCore4.a) set(QT_QTCORE_INCLUDE_DIR ${KDE4_INSTALL_DIR}/include/QtCore) set(QT_MKSPECS_DIR ${KDE4_INSTALL_DIR}/mkspecs) set(QT_MOC_EXECUTABLE ${QT_BINARY_DIR}/moc) set(QT_QMAKE_EXECUTABLE ${QT_BINARY_DIR}/qmake) set(QT_UIC_EXECUTABLE ${QT_BINARY_DIR}/uic)

mingw32-kdelibs.cmake

set(KDE4_INSTALL_DIR /windows/kde4) set(KDE4_BIN_DIR /home/kdeuser/kde/bin)

  1. this one is used by FindKDE4.cmake to load FindKDE4Internal.cmake:

set(KDE4_DATA_DIR /windows/kde4/share/apps CACHE PATH "points to the apps directory of installed kdelibs")

  1. not sure about this one:

set(KDEWIN_DIR ${KDE4_INSTALL_DIR} CACHE PATH "what is it ?")

  1. disable some things:

set(WITH_AVAHI OFF CACHE BOOL "Disabled") set(WITH_DNSSD OFF CACHE BOOL "Disabled") set(WITH_ENCHANT OFF CACHE BOOL "Disabled") set(WITH_FAM OFF CACHE BOOL "Disabled") set(WITH_GSSAPI OFF CACHE BOOL "Disabled") set(WITH_HSPELL OFF CACHE BOOL "Disabled") set(WITH_OpenEXR OFF CACHE BOOL "Disabled")

set(KDE4_KCFGC_EXECUTABLE ${KDE4_BIN_DIR}/kconfig_compiler CACHE PATH "") set(KDE4_AUTOMOC_EXECUTABLE ${KDE4_BIN_DIR}/kde4automoc CACHE PATH "") set(KDE4_MEINPROC_EXECUTABLE ${KDE4_BIN_DIR}/meinproc4 CACHE PATH "") adjust the values according to your setup

Build kdelibs

svn co svn://anonsvn.kde.org/home/kde/trunk/KDE/kdelibs cd kdelibs mkdir build cd build cmake -DCMAKE_TOOLCHAIN_FILE=~/Toolchain-mingw32.cmake ..

  • you have to make a link to your kde4automoc for linux in the bin directory

ln -s /path/to/kde4automoc bin/ ln -s /path/to/kconfig_compiler bin/

  • since linux is case sensitive you have to make symbolic links for some headers

cd /windows/kde4/include ln -s soprano Soprano

  • You will get a linker error on kjsembed so from the build directory cd into kjsembed/kjsembed and make VERBOSE=1 2>/dev/null

copy the last command i.e.

/usr/bin/i586-mingw32msvc-g++    -Wl,--export-all-symbols -Wl,--disable-auto-import -shared -o ../../bin/libkjsembed.dll -Wl,--out-implib,../../bin/libkjsembed.dll.a -Wl,--major-image-version,4,--minor-image-version,1 CMakeFiles/kjsembed.dir/kjsembed_automoc.cpp.obj CMakeFiles/kjsembed.dir/kjseglobal.cpp.obj CMakeFiles/kjsembed.dir/binding_support.cpp.obj CMakeFiles/kjsembed.dir/static_binding.cpp.obj CMakeFiles/kjsembed.dir/variant_binding.cpp.obj CMakeFiles/kjsembed.dir/object_binding.cpp.obj CMakeFiles/kjsembed.dir/builtins.cpp.obj CMakeFiles/kjsembed.dir/fileio.cpp.obj CMakeFiles/kjsembed.dir/jseventmapper.cpp.obj CMakeFiles/kjsembed.dir/eventproxy.cpp.obj CMakeFiles/kjsembed.dir/slotproxy.cpp.obj CMakeFiles/kjsembed.dir/jseventutils.cpp.obj CMakeFiles/kjsembed.dir/qobject_binding.cpp.obj CMakeFiles/kjsembed.dir/kjsembed.cpp.obj CMakeFiles/kjsembed.dir/value_binding.cpp.obj CMakeFiles/kjsembed.dir/iosupport.cpp.obj CMakeFiles/kjsembed.dir/qwidget_binding.cpp.obj CMakeFiles/kjsembed.dir/qaction_binding.cpp.obj CMakeFiles/kjsembed.dir/qlayout_binding.cpp.obj CMakeFiles/kjsembed.dir/qpainter_binding.cpp.obj CMakeFiles/kjsembed.dir/settings.cpp.obj CMakeFiles/kjsembed.dir/svg_binding.cpp.obj CMakeFiles/kjsembed.dir/filedialog_binding.cpp.obj CMakeFiles/kjsembed.dir/application.cpp.obj CMakeFiles/kjsembed.dir/color.cpp.obj CMakeFiles/kjsembed.dir/dom.cpp.obj CMakeFiles/kjsembed.dir/font.cpp.obj CMakeFiles/kjsembed.dir/image.cpp.obj CMakeFiles/kjsembed.dir/pen.cpp.obj CMakeFiles/kjsembed.dir/pixmap.cpp.obj CMakeFiles/kjsembed.dir/point.cpp.obj CMakeFiles/kjsembed.dir/rect.cpp.obj CMakeFiles/kjsembed.dir/size.cpp.obj CMakeFiles/kjsembed.dir/url.cpp.obj CMakeFiles/kjsembed.dir/bind_qlcdnumber.cpp.obj CMakeFiles/kjsembed.dir/bind_qtimer.cpp.obj CMakeFiles/kjsembed.dir/brush.cpp.obj CMakeFiles/kjsembed.dir/QBrush_bind.cpp.obj CMakeFiles/kjsembed.dir/quiloader_binding.cpp.obj -L/windows/kde4/bin -L/windows/kde4/lib ../../bin/libkdecore.dll.a /windows/kde4/lib/libQtCore4.a /windows/kde4/lib/libQtUiTools.a /windows/kde4/lib/libQtGui4.a /windows/kde4/lib/libQtSvg4.a ../../bin/libkjs.dll.a /windows/kde4/lib/libQtNetwork4.a /windows/kde4/lib/libQtDBus4.a /windows/kde4/lib/libz.dll.a /windows/kde4/lib/libkdewin32.dll.a -luser32 -lshell32 -lws2_32 -lnetapi32 -luserenv /windows/kde4/lib/libQtXml4.a /windows/kde4/bin/bzip2.dll /windows/kde4/lib/libintl.dll.a /windows/kde4/bin/libpcre.dll /windows/kde4/bin/libpcreposix.dll

you need to remove

/windows/kde4/lib/libQtCore4.a

from this command and add

-lQtCore4

execute the modified command and continue with the normal building

  • You will get another error in klauncher.moc about slotKDEInitData so go into kinit and do something like this(you need wine)

make clean rm *.moc ../bin/kde4automoc.exe /home/kdeuser/kde/src/KDE/kdelibs/build/kinit/kdeinit_klauncher_automoc.cpp /home/kdeuser/kde/src/KDE/kdelibs/kinit /home/kdeuser/kde/src/KDE/kdelibs/build/kinit /windows/kde4/bin/moc.exe and then do make as usual

  • Another error in kdewidgets because wine doesn't find some dll to run makekdewidgets.exe so either run the linux version manually like this
makekdewidgets -o /home/kdeuser/kde/src/KDE/kdelibs/build/kdewidgets/kdewidgets.cpp /home/kdeuser/kde/src/KDE/kdelibs/kdewidgets/kde.widgets

or symlink those missing library in your wine system32 folder(i haven't tested it but it should work)

Build kdepimlibs

This is easy :) svn co svn://anonsvn.kde.org/home/kde/trunk/KDE/kdepimlibs cd kdepimlibs mkdir build cd build cmake -DCMAKE_TOOLCHAIN_FILE=~/Toolchain-mingw32.cmake .. make make install

Build kdebase

This is easy :) svn co svn://anonsvn.kde.org/home/kde/trunk/KDE/kdebase cd kdebase mkdir build cd build cmake -DCMAKE_TOOLCHAIN_FILE=~/Toolchain-mingw32.cmake .. make make install