Windows/Build/Cross-Compiling: Difference between revisions
*>Brandon |
m Ochurlaud moved page Windows/Imported From TechBase/Build/Cross-Compiling to Windows/Build/Cross-Compiling |
||
(22 intermediate revisions by 10 users not shown) | |||
Line 4: | Line 4: | ||
==Basic tools== | ==Basic tools== | ||
===MinGw=== | ===MinGw=== | ||
Install mingw for linux | 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. | |||
On gentoo, you need to do the following: "emerge crossdev; crossdev mingw32". | |||
===Qt4 Kdesupport and dependencies=== | ===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 [http://sourceforge.net/project/showfiles.php?group_id=214730 sourceforge mirrors] | You can install these dependencies(aspell, boost, dbus, qca etc..) from windows with the kdewin installer or manually download them from [http://sourceforge.net/project/showfiles.php?group_id=214730 sourceforge mirrors] | ||
Line 10: | Line 15: | ||
You also need to have Qt4 and KDE4 already installed on linux, to use moc/uic/kde4automoc etc... | You also need to have Qt4 and KDE4 already installed on linux, to use moc/uic/kde4automoc etc... | ||
===Cmake=== | ===Cmake=== | ||
To cross compile | 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 two files Toolchain-mingw32.cmake and mingw32-kdelibs.cmake with this contents and place them somewhere i.e. in your home | |||
====Toolchain-mingw32.cmake==== | |||
<syntaxhighlight lang="scheme"> | |||
set(KDE_PREFIX /windows/kde4) | |||
set(KDE4_SRC_DIR /home/kdeuser/kde/src) | |||
# 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 22: | Line 31: | ||
# here is the target environment located | # here is the target environment located | ||
SET(CMAKE_FIND_ROOT_PATH /usr/i586-mingw32msvc | SET(CMAKE_FIND_ROOT_PATH /usr/i586-mingw32msvc ${KDE_PREFIX} ) | ||
# 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 40: | ||
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) | set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) | ||
set( | # FindQt4.cmake querys qmake to get information, this doesn't work when crosscompiling | ||
set( | set(QT_BINARY_DIR ${KDE4_SRC_DIR}/qt-copy/bin) | ||
set(QT_LIBRARY_DIR ${KDE_PREFIX}/lib) | |||
set(QT_QTCORE_LIBRARY ${KDE_PREFIX}/lib/libQtCore4.a) | |||
set(QT_QTCORE_INCLUDE_DIR ${KDE_PREFIX}/include/QtCore) | |||
set(QT_MKSPECS_DIR ${KDE_PREFIX}/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) | |||
</syntaxhighlight> | |||
====mingw32-kdelibs.cmake==== | |||
<syntaxhighlight lang="scheme"> | |||
set(KDE_PREFIX /windows/kde4) | |||
set(KDE4_BIN_DIR /home/kdeuser/kde/bin) | |||
# this one is used by FindKDE4.cmake to load FindKDE4Internal.cmake: | |||
set( | set(KDE4_DATA_DIR ${KDE_PREFIX}/share/apps CACHE PATH "points to the apps directory of installed kdelibs") | ||
# not sure about this one: | |||
set(KDEWIN_DIR ${KDE_PREFIX} CACHE PATH "what is it ?") | |||
set( | |||
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") | |||
# use the binaries from native KDE4 | |||
set( | set(KDE4_KCFGC_EXECUTABLE ${KDE4_BIN_DIR}/kconfig_compiler CACHE PATH "") | ||
set( | set(KDE4_AUTOMOC_EXECUTABLE ${KDE4_BIN_DIR}/kde4automoc CACHE PATH "") | ||
set( | set(KDE4_MEINPROC_EXECUTABLE ${KDE4_BIN_DIR}/meinproc4 CACHE PATH "") | ||
</syntaxhighlight> | |||
<br/> | |||
</ | |||
adjust the values according to your setup | adjust the values according to your setup | ||
==Build kdelibs== | ==Build kdelibs== | ||
< | <syntaxhighlight lang="bash"> | ||
svn co svn://anonsvn.kde.org/home/kde/trunk/KDE/kdelibs | svn co svn://anonsvn.kde.org/home/kde/trunk/KDE/kdelibs | ||
cd kdelibs | cd kdelibs | ||
mkdir build | mkdir build | ||
cd build | cd build | ||
cmake -DCMAKE_TOOLCHAIN_FILE=~/Toolchain-mingw32.cmake | cmake -DCMAKE_TOOLCHAIN_FILE=~/Toolchain-mingw32.cmake .. | ||
</ | </syntaxhighlight> | ||
* you have to make a link to your kde4automoc for linux in the bin directory | * you have to make a link to your kde4automoc and kconfig_compiler for linux in the bin directory | ||
< | <syntaxhighlight lang="bash"> | ||
ln -s /path/to/kde4automoc bin/ | ln -s /path/to/kde4automoc bin/ | ||
ln -s /path/to/kconfig_compiler bin/ | ln -s /path/to/kconfig_compiler bin/ | ||
</ | </syntaxhighlight> | ||
* since linux is case sensitive you have to make symbolic links for some headers | * since linux is case sensitive you have to make symbolic links for some headers | ||
< | <syntaxhighlight lang="bash"> | ||
cd /windows/kde4/include | cd /windows/kde4/include | ||
ln -s soprano Soprano | ln -s soprano Soprano | ||
</ | </syntaxhighlight> | ||
* You will get an error in klauncher.moc about slotKDEInitData so go into kinit and do something like this(you need wine) | |||
<syntaxhighlight lang="bash"> | |||
* You will get | |||
< | |||
rm *.moc | rm *.moc | ||
../bin/kde4automoc.exe /home/kdeuser/kde/src/KDE/kdelibs/build/kinit/ | ../bin/kde4automoc.exe /home/kdeuser/kde/src/KDE/kdelibs/build/kinit/klauncher_automoc.cpp /home/kdeuser/kde/src/KDE/kdelibs/kinit /home/kdeuser/kde/src/KDE/kdelibs/build/kinit /windows/kde4/bin/moc.exe | ||
</ | </syntaxhighlight> | ||
and then do make as usual | and then do make as usual | ||
Line 117: | Line 111: | ||
==Build kdepimlibs== | ==Build kdepimlibs== | ||
This is easy :) | This is easy :) | ||
< | <syntaxhighlight lang="bash"> | ||
svn co svn://anonsvn.kde.org/home/kde/trunk/KDE/kdepimlibs | svn co svn://anonsvn.kde.org/home/kde/trunk/KDE/kdepimlibs | ||
cd kdepimlibs | cd kdepimlibs | ||
mkdir build | mkdir build | ||
cd build | cd build | ||
cmake -DCMAKE_TOOLCHAIN_FILE=~/Toolchain-mingw32.cmake .. | cmake -DCMAKE_TOOLCHAIN_FILE=~/Toolchain-mingw32.cmake -C ~/mingw32-kdelibs.cmake .. | ||
make | make | ||
make install | make install | ||
</ | </syntaxhighlight> | ||
==Build kdebase== | ==Build kdebase== | ||
This is easy :) | This is easy :) | ||
< | <syntaxhighlight lang="bash"> | ||
svn co svn://anonsvn.kde.org/home/kde/trunk/KDE/kdebase | svn co svn://anonsvn.kde.org/home/kde/trunk/KDE/kdebase | ||
cd kdebase | cd kdebase | ||
mkdir build | mkdir build | ||
cd build | cd build | ||
cmake -DCMAKE_TOOLCHAIN_FILE=~/Toolchain-mingw32.cmake | cmake -DCMAKE_TOOLCHAIN_FILE=~/Toolchain-mingw32.cmake -C ~/mingw32-kdelibs.cmake .. | ||
make | make | ||
make install | make install | ||
</ | </syntaxhighlight> | ||
== Icecream == | |||
One of the joys of cross-compiling is the possibility to use an icecream cluster to speed up compilation. | |||
For Debian Etch, you can get an icecream environment from here: | |||
ftp://ftp.kdab.com/gpg4win/devtools/debian-etch-mingw32-icecream-env.tar.gz | |||
(If you want to create your own environment: icecc-create-env does a good job except that it packages the wrong as. /usr/bin/i586-mingw32msvc-as is needed) | |||
The bin/ dir with symlinks from i586-mingw32msvc-* to /usr/bin/icecc: | |||
ftp://ftp.kdab.com/gpg4win/devtools/icecc-mingw-bin.tar.bz2 | |||
Untar icecc-mingw-bin.tar.bz2 to icecc-mingw-bin | |||
Then set the following environment variables: | |||
<syntaxhighlight lang="bash"> | |||
export PATH=/path/to/icecc-mingw-bin/bin:$PATH | |||
export ICECC_CC=i586-mingw32msvc-gcc | |||
export ICECC_CXX=i586-mingw32msvc-g++ | |||
export ICECC_VERSION=i686:/path/to/debian-etch-mingw32-icecream-env.tar.gz,x86_64:/path/to/debian-etch-mingw32-icecream-env.tar.gz | |||
</syntaxhighlight> | |||
(Re-)run cmake and have fun. |
Latest revision as of 14:58, 18 March 2016
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.
On gentoo, you need to do the following: "emerge crossdev; crossdev mingw32".
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
set(KDE_PREFIX /windows/kde4)
set(KDE4_SRC_DIR /home/kdeuser/kde/src)
# the name of the target operating system
SET(CMAKE_SYSTEM_NAME Windows)
# which compilers to use for C and C++
SET(CMAKE_C_COMPILER i586-mingw32msvc-gcc)
SET(CMAKE_CXX_COMPILER i586-mingw32msvc-g++)
# here is the target environment located
SET(CMAKE_FIND_ROOT_PATH /usr/i586-mingw32msvc ${KDE_PREFIX} )
# adjust the default behaviour of the FIND_XXX() commands:
# search headers and libraries in the target environment, search
# 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)
# FindQt4.cmake querys qmake to get information, this doesn't work when crosscompiling
set(QT_BINARY_DIR ${KDE4_SRC_DIR}/qt-copy/bin)
set(QT_LIBRARY_DIR ${KDE_PREFIX}/lib)
set(QT_QTCORE_LIBRARY ${KDE_PREFIX}/lib/libQtCore4.a)
set(QT_QTCORE_INCLUDE_DIR ${KDE_PREFIX}/include/QtCore)
set(QT_MKSPECS_DIR ${KDE_PREFIX}/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(KDE_PREFIX /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 ${KDE_PREFIX}/share/apps CACHE PATH "points to the apps directory of installed kdelibs")
# not sure about this one:
set(KDEWIN_DIR ${KDE_PREFIX} CACHE PATH "what is it ?")
# 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")
# use the binaries from native KDE4
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 and kconfig_compiler 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 an error in klauncher.moc about slotKDEInitData so go into kinit and do something like this(you need wine)
rm *.moc
../bin/kde4automoc.exe /home/kdeuser/kde/src/KDE/kdelibs/build/kinit/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 -C ~/mingw32-kdelibs.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 -C ~/mingw32-kdelibs.cmake ..
make
make install
Icecream
One of the joys of cross-compiling is the possibility to use an icecream cluster to speed up compilation.
For Debian Etch, you can get an icecream environment from here:
ftp://ftp.kdab.com/gpg4win/devtools/debian-etch-mingw32-icecream-env.tar.gz
(If you want to create your own environment: icecc-create-env does a good job except that it packages the wrong as. /usr/bin/i586-mingw32msvc-as is needed)
The bin/ dir with symlinks from i586-mingw32msvc-* to /usr/bin/icecc:
ftp://ftp.kdab.com/gpg4win/devtools/icecc-mingw-bin.tar.bz2
Untar icecc-mingw-bin.tar.bz2 to icecc-mingw-bin
Then set the following environment variables:
export PATH=/path/to/icecc-mingw-bin/bin:$PATH
export ICECC_CC=i586-mingw32msvc-gcc
export ICECC_CXX=i586-mingw32msvc-g++
export ICECC_VERSION=i686:/path/to/debian-etch-mingw32-icecream-env.tar.gz,x86_64:/path/to/debian-etch-mingw32-icecream-env.tar.gz
(Re-)run cmake and have fun.