Mostrando entradas con la etiqueta Cygwin. Mostrar todas las entradas
Mostrando entradas con la etiqueta Cygwin. Mostrar todas las entradas

domingo, 19 de septiembre de 2010

Compilar para Windows desde Cygwin (IV)

Ya están disponibles en Cygwin los paquetes para compilación cruzada preparados por el projecto MinGW-w64, que generan código para Windows de 32 y de 64 bits.

Si queremos compilar ffmpeg para Windows de 32 bits, nos bajamos los paquetes:
mingw64-i686-binutils, mingw64-i686-gcc-core, mingw64-i686-headers, mingw64-i686-pthreads, mingw64-i686-runtime

La invocación de configure queda así:
./configure --enable-memalign-hack --arch=x86 --target-os=mingw32 --enable-cross-compile --cross-prefix=i686-w64-mingw32- --disable-shared --enable-static --disable-dxva2


Si queremos compilar ffmpeg para Windows de 64 bits, nos bajamos los paquetes:
mingw64-x86_64-binutils, mingw64-x86_64-gcc-core, mingw64-x86_64-headers, mingw64-x86_64-pthreads, mingw64-x86_64-runtime

La invocación de configure es ahora:
./configure --arch=x86_64 --target-os=mingw32 --enable-cross-compile --cross-prefix=x86_64-w64-mingw32- --disable-shared --enable-static --disable-dxva2

Lo de --disable-dxva2 es porque no uso la aceleración DXVA2 al decodificar h264.
DXVA 2.0 necesita Vista como mínimo (-D_WIN32_WINNT=0x0600), y activar las macros para que C maneje los objetos que normalmente se acceden desde C++ (-DCOBJMACROS), así que, si la queréis, usad --extra-cflags='-DCOBJMACROS -D_WIN32_WINNT=0x0600'.

viernes, 23 de abril de 2010

Cygwin es lento (I)

Pero mucho, mucho.

Lo más lento es ejecutar los configure, que en Unix tardan segundos y en Cygwin minutos.
La razón es la lentísima creación de processos (spawing) en Cygwin.

Por ejemplo, el configure de FFmpeg.

Primero creamos un entorno óptimo, eliminando los directorios innecesarios de PATH:
export TMPDIR=/tmp
export TEMP=/tmp
export TMP=/tmp
export PATH=/usr/local/bin:/usr/bin:/bin


Esta es mi invocación habitual de configure:
time ksh ./configure --disable-shared --enable-static --enable-gpl --enable-avfilter --enable-avfilter-lavf --enable-pthreads --enable-avisynth --enable-bzlib --enable-libmp3lame --enable-libx264 --cc=gcc443 --cpu=core2 --enable-zlib --extra-cflags=-DX_DISPLAY_MISSING

real 2m24.004s
user 0m15.938s
sys 0m41.157s


La cuenta no sale: 2m24s -15s -42s = 86 segundos sin currar.

Primer intento de mejorarlo: evitar las reubicaciones de las DLLs.
Para ello, invocamos la línea de comandos de Windows (cmd.exe), vamos al directorio de los binarios de Cygwin, invocamos dash, y lanzamos rebaseall:
cd c:\cygwin\bin
dash
./rebaseall


Volvemos a invocar el configure de FFmpeg y nos da:

real 2m20.758s
user 0m15.713s
sys 0m42.660s


Bueno, hemos ganado 4 segundos.

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

sábado, 6 de junio de 2009

Compilar para Windows desde Cygwin (I)

Cygwin es una excelente simulación de POSIX sobre Windows, lo que facilita compilar programs que vengan del mundillo Unix.
Aparte de programs para el propio entorno Cygwin, también permite compilar programas "puro-Windows", que no dependan de la biblioteca de funciones cygwin1.dll.

Básicamente, sólo hay que añadir el parámetro "-mno-cygwin" al compilar.

Hay unos pocos paquetes Cygwin que contienen bibliotecas puras de Windows (que procedecen del proyecto MinGW): mingw-runtime, mingw-zlib y mingw-bzip2, más sus versiones -devel para desarrollar.

Estos paquetes se instalan así:
  • /usr/include/mingw/ para los includes
  • /usr/lib/mingw/ para las bibliotecas.
Resulta conveniente que ambos directorios partan de la misma raiz, así que yo tengo un par de enlaces simbólicos:
  • /mingw/include -> /usr/include/mingw/
  • /mingw/lib -> /usr/lib/mingw/
También tengo /mingw/bin para guardar ejecutables puro-Windows o scripts de configuración de las bibliotecas puro-Windows.

Vamos, que ejecuté estos comandos:

mkdir -p /mingw/bin
ln -s /usr/include/mingw/ /mingw/include
ln -s /usr/lib/mingw/ /mingw/lib

miércoles, 15 de abril de 2009

Gráficos desde awk

Por mi edad y mi ser austero, soy un fanático de awk.
Maravilloso para procesar ficheritos de texto, descubrí que había una variante que procesaba XML, bautizada con el no muy original y sí muy descriptivo nombre de XMLgawk

La variante tenía un interesante interfaz para añadir extensiones al lenguaje, así que contribuí con una extensión para usar las funciones gráficas de libGD.

Aquí tenéis una austera página con los binarios para Cygwin, y unas someras explicaciones de cómo compilarlos desde los fuentes.

martes, 14 de abril de 2009

Polinomios

Pues sí, uno de los paquetes de Cygwin es una calculadora algebraica, que permite hacer derivadas, integrales, límites, resolver sus raíces, todo sobre polinomios.

¡Ah si lo hubiera tenido en los tiempos que estudiaba! :-)

martes, 17 de marzo de 2009

x264-20090315

Toca compilar x264 para Cygwin.

Cogemos el x264 de hoy, y, como cuando detecta a Cygwin lo que hace es una compilación cruzada para MinGW, le aplicamos un parche:

patch < x264.cygwin.diff

El contenido de x264.cygwin.diff es:

diff --git a/configure b/configure
index eb51091..31da92e 100755
--- a/configure
+++ b/configure
@@ -212,11 +212,8 @@ case $host_os in
LDFLAGS="$LDFLAGS -lm"
;;
cygwin*)
- SYS="MINGW"
- CFLAGS="$CFLAGS -mno-cygwin"
- LDFLAGS="$LDFLAGS -mno-cygwin"
+ SYS="CYGWIN"
EXE=".exe"
- DEVNULL="NUL"
;;
mingw*)
SYS="MINGW"
@@ -241,6 +238,8 @@ case $host_cpu in
ASFLAGS="-O2"
if [ "$SYS" = MACOSX ]; then
ASFLAGS="$ASFLAGS -f macho -DPREFIX"
+ elif [ "$SYS" = CYGWIN ]; then
+ ASFLAGS="$ASFLAGS -f win32 -DPREFIX"
elif [ "$SYS" = MINGW ]; then
ASFLAGS="$ASFLAGS -f win32 -DPREFIX"
else
@@ -368,6 +367,8 @@ fi
if [ "$avis_input" = "auto" ] ; then
if [ $SYS = MINGW ]; then
avis_input="yes"
+ elif [ "$SYS" = CYGWIN ]; then
+ avis_input="yes"
else
avis_input="no";
fi
@@ -440,6 +441,10 @@ if [ "$shared" = "yes" ]; then
echo "SONAME=libx264-$API.dll" >> config.mak
echo 'IMPLIBNAME=libx264.dll.a' >> config.mak
echo 'SOFLAGS=-Wl,--out-implib,$(IMPLIBNAME) -Wl,--enable-auto-image-base' >> config.mak
+ elif [ "$SYS" = CYGWIN ]; then
+ echo "SONAME=libx264-$API.dll" >> config.mak
+ echo 'IMPLIBNAME=libx264.dll.a' >> config.mak
+ echo 'SOFLAGS=-Wl,--out-implib,$(IMPLIBNAME) -Wl,--enable-auto-image-base' >> config.mak
elif [ "$SYS" = "MACOSX" ]; then
echo "SOSUFFIX=dylib" >> config.mak
echo "SONAME=libx264.$API.dylib" >> config.mak


Esta es mi configuración:
CC=gcc-4 ./configure --disable-mp4-output --extra-cflags=-march=core2

Le damos caña y casca:

Found no assembler
Minimum version is yasm-0.6.1
If you really want to compile without asm, configure with --disable-asm.

Vaya, requiere yasm y no lo tengo instalado en mi Cygwin 1.7. Bueno pero lo tengo para Cygwin 1.5, bajado de Cygwin Ports, y se supone que hay compatibilidad hacia delante.

En mi Cygwin 1.5, cygcheck -l yasm me dice lo que tengo que copiar, y cygcheck /usr/bin/yasm.exe me dice las dependencias (las DLLs que también habrá que copiar si no existen ya).

Así que ejecuto en mi Cygwin 1.7:

cd /bin && cp -p /cygdrive/c/cygwin/bin/yasm.exe .
cd /usr/include && cp -pri /cygdrive/c/cygwin/usr/include/libyasm .


Y ahora ya funciona:

$ CC=gcc-4 ./configure --disable-mp4-output --extra-cflags=-march=core2
./version.sh: line 2: git: command not found
Platform: X86
System: CYGWIN
asm: yes
avis input: yes
mp4 output: no
pthread: yes
debug: no
gprof: no
PIC: no
shared: no
visualize: no
You can run 'make' or 'make fprofiled' now.


Bueno hay un errorcillo, pero git sólo se usa para poner la versión.

Así que make && make install y ya tenemos libx264 disponible.

lunes, 16 de marzo de 2009

ffmpeg-17998

Los chicos de Cygwin han sacado la versión 4.3.2-2 de gcc. Vamos a probarla con el ffmpeg de hoy.

Aprovechando que gcc 4.3.x permite optimizar para Core2, uso esta configuración:

./configure --cc=gcc-4 --enable-shared --disable-static --cpu=core2 --enable-gpl --enable-avfilter --enable-avfilter-lavf --enable-pthreads --enable-avisynth --enable-bzlib --enable-zlib --build-suffix=-SVN

Decimos make y, vaya, hombre, salen errores:

libavformat/rtsp.o: In function `__ntohl':
/usr/include/asm/byteorder.h:40: multiple definition of `___ntohl'
libavformat/os_support.o:/usr/include/asm/byteorder.h:40: first defined here


¿De dónde viene esto? Pues hay tres motivos encadenados:

  1. FFmpeg le pasa -std=c99 al compilador
  2. La versión 4.3.x de gcc cambia la semántica del comando inline en modo C99
  3. Los "includes" de las funciones C de Cygwin no cumplen la norma C99.


¿Qué soluciones hay?

  1. La fácil, quitamos el trozo que casca, o sea añadimos --disable-network a nuestra configuración.
  2. La complicada, avisar en la lista de correo de Cygwin que habría que soportar C99 en los "includes".


Es lunes, así que vamos a usar la opción 1.

Ahora funciona la cosa, pero otra tarea pendiente es enviar un parche a ffmpeg-devel para no tener que hacer esta chapucilla con las compilaciones que crean bibliotecas compartidas.