Kompilace Windows aplikací na (Arch) Linuxu
Lze psát nativní GNOME aplikace pro Windows a fungují celkem bez problémů. Není problém zkompilovat glib, libxml, gtk+, gstreamer a další opensource knihovny pro použití ve windows.
Spravoval jsem do nedávna cross-kompilační prostředí pro GTK+ aplikace na Arch Linuxu. Všechny potřebné balíky si můžete nainstalovat z mého veřejného arch repozitáře:
pacman -Sy mingw32-gtk+2 mingw32-gcc
GTK+ Hello Windows!
Jak tedy sestavit a připravit k použití GTK+ program pro Windows z Linuxu? Odpověď dává následující skript, který je sice dlouhý, ale dá se rozdělit na tři části:
- Zkopírování všech potřebných DLL knihoven (závislostí aplikace),
- vytvoření konfiguračních souborů pro GTK+ a Pango,
- sestavení vašeho programu (za předpokladu že používá autotools).
#!/bin/sh -e # prepare package rm -rf package mkdir -p package cp /usr/i486-mingw32/bin/lib{atk,cairo,charset,gdk,glade,glib,\ gmodule,gobject,gthread,gtk,iconv,intl,pango,png,xml}*.dll package/ cp /usr/i486-mingw32/bin/zlib1.dll package/ cp /usr/i486-mingw32/bin/{libxr,ssl,crypto}*.dll package/ mkdir -p package/lib/gtk-2.0/2.10.0/engines cp -r /usr/i486-mingw32/lib/gtk-2.0/2.10.0/engines/*.dll \ package/lib/gtk-2.0/2.10.0/engines mkdir -p package/etc/{gtk-2.0,pango} cat > package/etc/gtk-2.0/gtkrc << EOF gtk-icon-sizes = "gtk-menu=13,13:gtk-small-toolbar=16,16:gtk-large-toolbar=24,24:gtk-dnd=32,32" gtk-toolbar-icon-size = small-toolbar # disable images in buttons. i've only seen ugly delphi apps use this feature. gtk-button-images = 0 # enable/disable images in menus. most "stock" microsoft apps don't use these, except sparingly. # the office apps use them heavily, though. gtk-menu-images = 1 # use the win32 button ordering instead of the GNOME HIG one, where applicable gtk-alternative-button-order = 1 # use the win32 sort indicators direction, as in Explorer gtk-alternative-sort-arrows = 1 style "msw-default" { GtkWidget::interior-focus = 1 GtkOptionMenu::indicator-size = { 9, 5 } GtkOptionMenu::indicator-spacing = { 7, 5, 2, 2 } GtkSpinButton::shadow-type = in # Owen and I disagree that these should be themable #GtkUIManager::add-tearoffs = 0 #GtkComboBox::add-tearoffs = 0 GtkComboBox::appears-as-list = 1 GtkComboBox::focus-on-click = 0 GOComboBox::add_tearoffs = 0 GtkTreeView::allow-rules = 0 GtkTreeView::expander-size = 12 GtkExpander::expander-size = 12 GtkScrolledWindow::scrollbar_spacing = 1 GtkSeparatorMenuItem::horizontal-padding = 2 engine "wimp" { } } class "*" style "msw-default" binding "ms-windows-tree-view" { bind "Right" { "expand-collapse-cursor-row" (1,1,0) } bind "Left" { "expand-collapse-cursor-row" (1,0,0) } } class "GtkTreeView" binding "ms-windows-tree-view" EOF cat > package/etc/pango/pango.aliases << EOF courier = "courier new" tahoma = "tahoma,browallia new,mingliu,simhei,gulimche,ms gothic,kartika,latha,mangal" sans = "arial,browallia new,mingliu,simhei,gulimche,ms gothic,kartika,latha,mangal" serif = "times new roman,angsana new,mingliu,simsun,gulimche,ms gothic,kartika,latha,mangal" mono = "courier new,courier monothai,mingliu,simsun,gulimche,ms gothic,kartika,latha,mangal" monospace = "courier new,courier monothai,mingliu,simsun,gulimche,ms gothic,kartika,latha,mangal" EOF # build app make distdir cd app-0.1.0/ export CFLAGS="-O2 -mms-bitfields" export LDFLAGS="-mwindows" export PKG_CONFIG_PATH="/usr/i486-mingw32/lib/pkgconfig/" ./configure \ --prefix=/usr/i486-mingw32 \ --host=i486-mingw32 make cd .. cp app-0.1.0/{app.exe,*.glade} package/ cp app.xml package/ find package -type f | xargs chmod 644 ./upx `find package -name '*.exe' -o -name '*.dll'`
