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'`