domingo 25 de octubre de 2009

Compilar para Windows desde Ubuntu (II)

En vez de traernos los ejecutables necesarios para la compilación cruzada, podemos traernos los fuentes, y compilarlos.
La ventaja es que podemos tener la última versión, y compilarlos para exactamente la CPU que tengamos (en mi caso, CFLAGS=-march=pentium-m).

Adaptado de la receta de Ramiro.

Nos instalamos algunas dependencias de gcc:
sudo apt-get install flex bison

Algunas dependencias de FFmpeg.
sudo apt-get install texinfo yasm subversion

Y un entorno para poder testear los ejecutables de Windows, sin salir de Linux:
sudo apt-get install wine

Nos preparamos un directorio para bajarnos y compilar el código fuente:
cd "$HOME"
mkdir src
export BASE_PATH="$HOME/src"


Traemos estos ficheros, y los dejamos en el directorio $BASE_PATH:
binutils-2.20.tar.bz2
gcc-core-4.2.4.tar.bz2
mingwrt-3.16-mingw32-dev.tar.gz (from http://sourceforge.net/projects/mingw/files/ under "MinGW Runtime")
w32api-3.13-mingw32-dev.tar.gz (from same site as above under "MinGW API for MS-Windows")
zlib-1.2.3.tar.gz (from http://prdownloads.sourceforge.net/libpng/ )
bzip2-1.0.5.tar.gz (from http://bzip.org/downloads.html )

El compilador cruzado lo instalamos en /usr. Pondrá su cosillas en /usr/bin/i686-mingw32*, sin machacar las del compilador nativo de Ubuntu (que son /usr/bin/i486-linux-gnu*).

Importante:
sudo ln -s /usr/i686-mingw32 /mingw

binutils:
cd "$BASE_PATH"
tar xfvj binutils-2.20.tar.bz2
cd binutils-2.20
mkdir build
cd build
../configure --target=i686-mingw32 --disable-werror --disable-nls --prefix=/usr
make
sudo make install


"runtime" de MinGW:
cd "$BASE_PATH"
sudo tar zxfv mingwrt-3.16-mingw32-dev.tar.gz -C /mingw
sudo tar zxfv w32api-3.13-mingw32-dev.tar.gz -C /mingw


compilador de C:
cd "$BASE_PATH"
tar xfvj gcc-core-4.2.4.tar.bz2
cd gcc-4.2.4
mkdir build
cd build
CFLAGS=-march=pentium-m ../configure --target=i686-mingw32 --disable-nls --prefix=/usr
make
sudo make install


En los entornos GNU, la manera de indicar que queremos usar compilación cruzada, en vez de nativa, es a través de las variables de entorno:
RANLIB=i686-mingw32-ranlib AR=i686-mingw32-ar CC=i686-mingw32-gcc

Compilamos para MinGW algunas bibliotecas de funciones:

zlib:
cd $BASE_PATH
tar zxfv zlib-1.2.3.tar.gz
cd zlib-1.2.3
CFLAGS=-march=pentium-m RANLIB=i686-mingw32-ranlib AR="i686-mingw32-ar rc" CC=i686-mingw32-gcc ./configure --prefix=/mingw
make
sudo make install


bzip2:
cd "$BASE_PATH"
tar zxfv bzip2-1.0.5.tar.gz
cd bzip2-1.0.5
make libbz2.a CFLAGS=-march=pentium-m RANLIB=i686-mingw32-ranlib AR=i686-mingw32-ar CC=i686-mingw32-gcc
sudo cp bzlib.h /mingw/include/
sudo cp libbz2.a /mingw/lib/


Y con esto ya podemos compilar un FFmpeg para MinGW. Aquí la compilación cruzada se indica con --cross-prefix=i686-mingw32- --target-os=mingw32 y la CPU con --arch=pentium-m --cpu=pentium-m:
cd "$BASE_PATH"
mkdir ffmpeg
cd ffmpeg
svn co svn://svn.ffmpeg.org/ffmpeg/trunk svn
mkdir build-win32
cd build-win32
../svn/configure --enable-memalign-hack --cross-prefix=i686-mingw32- --target-os=mingw32 --arch=pentium-m --cpu=pentium-m


Y os preguntaréis, ¿por qué no compilar para MinGW desde MinGW?. Pues porque es más lento. Pero no un poco, sino algo exagerado: diez veces más lento.

martes 20 de octubre de 2009

Compilar para Windows desde Ubuntu (I)

Tres pasos para crear un entorno en Ubuntu que nos permita compilar para Windows.

Nos traemos el paquete básico para compilar:
sudo apt-get install build-essential

El compilador cruzado, binutils y el "runtime":
sudo apt-get install mingw32 mingw32-binutils mingw32-runtime

Y un entorno para poder testear los ejecutables que compilemos:
sudo apt-get install wine

Podemos intentar compilar FFmpeg:
configure --enable-memalign-hack --cross-prefix=i586-mingw32msvc- --target-os=mingw32 --arch=i686 --cpu=i686

Pero nos da este error:
ERROR: MinGW runtime version must be >= 3.15.

Es que en Ubuntu 9.04 las versiones de los paquetes de compilación cruzada a MinGW son algo antiguas:
dpkg -s mingw32 mingw32-binutils mingw32-runtime |fgrep Version
Version: 4.2.1.dfsg-1ubuntu1
Version: 2.18.50-20080109-1
Version: 3.13-1


FFmpeg tiene la costumbre de exigir la última versión de sus dependencias, con otros programas estos paquetes de Ubuntu nos podrían valer perfectamente.

martes 25 de agosto de 2009

Cacharricos

En verano, los campos y las bitácoras se agostan. Ya se sabe, las vacaciones es el periodo del año en que conviene no recalentar el cerebro.

Aún así, algo ha caído:
  • Mi querido portátil, ha vuelto a la vida tras sustituirle el disco muerto de 40GB por otro de 160GB. El proceso requirió los correspondientos improrerios a la SGAE, al ver que se llevaba un 25% de la factura. En fin, Ramoncín tiene que ir pagando su hipoteca ...
  • Me quise comprar un PCecico para el salón. Oferta agotada para cuando me acerqué a la tienda, así que me llevé lo más parecido. No tan mono (es semitorre) pero con 1TB de disco.
Como uno gusta de la diversidad, el portátil tiene su Ubuntu 9.04, y el otro tiene Vista (y un Wubi dentro que tengo que configurar).

miércoles 1 de julio de 2009

Aligerar PDFs

Mensualmente me llega una revista digital en formato PDF.
La mitad de las páginas son anuncios, así que suelo recortarlos con pdftk

Por ejemplo, para dejar sólo las páginas 1, de la 14 a la 24, y de la 26 a la 36:

pdftk MMH20090601.pdf cat 1 14-24 26-36 output MMH20090601-mini.pdf

Con lo cual se queda en la mitad de tamaño:
ls -s1 MMH20090601*
26236 MMH20090601-mini.pdf
48332 MMH20090601.pdf


A los alérgicos a la línea de comando os tranquilizará saber que podéis usar PDFTK Builder

domingo 21 de junio de 2009

ld09.exe y podmena

Al parar el ordenador me pregunta "¿desea matar a cmd.exe, que tarda mucho?".
¿uh? si no tengo ninguna línea de comando abierta.

Lanzo el Administrador de Tareas y veo multipleas instancias de cmd.exe y un proceso iexplore.exe
Raro, porque yo uso Firefox.

Al intentar ejecutar "regedit" desde Inicio->Ejecutar se reiniciaba el Explorador.
Uf, mala pinta.
Pruebo a ejecutar "regedit" desde el administrador de tareas y también se muere.
Uf, mal rollito seguro.

Tengo gran aprecio al Process Explorer y desde ahí ya puedo lanzar con éxito a regedit.
Nos vamos a
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Current Version\Run

Y lo que canta bastante (porque no me suena de nada) es "ld09.exe"

Google nos da una página en blanco para LD09.exe
http://www.prevx.com/filenames/X1867469537856748618-X1/LD09.EXE.html

Pero la versión en la caché sí es más interesante:
http://209.85.229.132/search?q=cache:L30I0qUVx80J:www.prevx.com/filenames/X1867469537856748618-X1/LD09.EXE.html+ld09&cd=3&hl=es&ct=clnk&gl=es&client=firefox-a

Es un informe muy exhaustivo de lo que hace el virus éste.
Pone lo que hace, pero no cómo quitarlo, ya que la misma página aprovecha para venderte su antivirus.
Me entra la duda ¿serán ellos los autores del virus? A ver si su antivirus es otro virus peor ...

Bueno, en cualquiera caso la descripción de lo que hace me permite deshacer bastante:

Borré
c:\windows\ld09.exe
c:\program files\podmena\podmena.sys
c:\program files\podmena\podmena.dll


Fuí al Panel de Control, y desde el Firewall de Windows, quité al accesso a podmena.
Borré la entrada "ld09.exe" del registro
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Current Version\Run\

Y borre las ramas del registro
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\podmena
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\drv_podmena


Cruzamos dedos (lo más fácil al tocar el registro con tanta inconsciencia es que no arranque) y reiniciamos.

Bueno, superamos el arranque. Aunque seguimos con múltiples cmd.exe e iexplore.exe

Hala, a mirar con más atención a
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Current Version\Run

Ajá: hay un "C:\Program Files\Internet Explorer\Connection Wizard\icwsetup.exe" y no tiene mucho sentido que el ayudante de conexión a internet se ejecute en cada arranque.

Pues nada, borramos a "C:\Program Files\Internet Explorer\Connection Wizard\icwsetup.exe"
y quitamos su entrada de "icwsetup.exe" del registro:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Current Version\Run\

Y reiniciamos. Pues que si quieres arroz, Catalina.

¡El muy cuco! (usaría otra expresión, pero al crear el blog marqué la casilla de contenido apto para todos públicos).
Resulta que ha vuelto a poner a "C:\Program Files\Internet Explorer\Connection Wizard\icwsetup.exe" como estaba.

Otro intento, cogemos a "notepad.exe" y lo copiamos con otro nombre, casualmente "C:\Program Files\Internet Explorer\Connection Wizard\icwsetup.exe"

Y reiniciamos. Je, je, esta vez sale una bonita ventana de "notepad" al arrancar, y no tenemos ya a los múltiples cmd.exe.

Bueno, aunque el PC sigue malito, ya tenemos controlada la infección.
Otro día toca erradicarla.

domingo 14 de junio de 2009

Compilar para Windows desde Cygwin (II)

Vamos a compilar a libGD para Windows.

Nos traemos el código fuente:
wget http://www.libgd.org/releases/gd-2.0.36RC1.tar.bz2

Lo desempaquetamos:
tar jxvf gd-2.0.36RC1.tar.bz2

Nos vamos a su directorio:
cd gd-2.0.36RC1

Y le ponemos el parche para aligerar libGD:
patch -p0 < ..patches/libgd.trim.1.diff

Podríamos compilar libpng, libjpeg y freetype desde su código fuente, pero vamos a bajarlos ya compilados desde Mplayer Win32.
Ojo, desempaquetamos cada cosa en su sitio (bibliotecas, includes y scripts de configuración) según la jerarquía de directorios que os comenté.

Lo configuro desactivando la creación de la la bilioteca dinámica, y sólo hará la enlazada estáticamente:

CC="gcc-3" CFLAGS="-mno-cygwin -DNONDLL=1" ./configure --disable-shared --prefix=/mingw --with-png=/mingw --with-freetype=/mingw --with-jpeg=/mingw --without-xpm --without-fontconfig

A construir:
make

Y ya está, sólo falta instalarlo:
make install

viernes 12 de junio de 2009

Parches

Imagina que modificas el código fuente de alguna utilidad. Cada vez que se libere una nueva versión, tendrás que volver a modificarla.
Pero un virtuoso programador (por ende: vago, orgulloso e impaciente) ideó a patch

Así que primero guardas en un ficherito tus cambios:
diff -u source.c.original source.c > source.diff

Y luego puedes decir a patch que aplique esos cambios a la nueva versión:
patch < source.diff

Y por supuesto no está limitado a cambios en un solo fichero, puedes tener un directorio con la versión inicial, otro directorio con la versión modificada por tí, y luego aplicar los cambios a un tercer directorio.

Por ejemplo, aquí me entretuve en recortar cosillas que no necesitaba de la versión 2.0.36 de libGD, e hize un .diff que bautizaremos como libgd.trim.1.diff.

Cuendo esté disponible la versión 2.0.37, le aplicaré mi parche asi:

cd src/gd-2.0.37
patch -p0 < ..patches/libgd.trim.1.diff