Hay una pequeña diferencia en el scandir, en MacOS se declara como
int
scandir(const char *dirname, struct dirent ***namelist,
int (*select)(struct dirent *),
int (*compar)(const void *, const void *));
y en Linux me la encuentro como:
int scandir(const char *dir, struct dirent ***namelist,
int(*filter)(const struct dirent *),
int(*compar)(const struct dirent **, const struct dirent **));
Nos fijamos en el tercer parámetro, un puntero a función que Linux espera un "const struct dirent *" y en MacOS espera un "struct dirent *". Dicho en román-paladino, en Linux la función de filtrado no "debe" modificar la estructura que se le pasa, en MacOS se podría modificar.
Se resuelve con una compilación condicional del estilo de:
#if defined(__BUILD_FOR_INTEL_DARWIN)
int client_file_filter(struct dirent *entry)
#elif defined(__BUILD_FOR_INTEL_LINUX)
int client_file_filter(const struct dirent *entry)
#else
#error "Please, define client_file_filter for your OS"
#endif
Los items __BUILD_FOR_INTEL_DARWIN y __BUILD_FOR_INTEL_LINUX los construyo en el Makefile. Además, tengo la precaución de poner una directriz del procesador "#error" por si portamos el código a otra plataforma.
lunes, 4 de junio de 2007
jueves, 24 de mayo de 2007
Biblioteca libjpeg
Necesito la biblioteca libjpeg. He seguido las instrucciones de DZone Snippets y no he tenido ningún problema. Gracias a DZones Snippets y Peter Cooper!
(Por cierto, DZone Snippets usa Ruby on Rails!)
(Por cierto, DZone Snippets usa Ruby on Rails!)
Compilación de biblioteca FFMPEG
Algunos codecs de video (mpeg-1 y mpeg-4) son de la biblioteca FFMPEG. Para compilarla, se construye con las siguientes opciones:
cd ffmpeg
./configure --disable-mmx --enable-memalign-hack --disable-v4l --disable-v4l2
Creo que para PowerPC no es necesario la opción --disable-mmx.
cd ffmpeg
./configure --disable-mmx --enable-memalign-hack --disable-v4l --disable-v4l2
Creo que para PowerPC no es necesario la opción --disable-mmx.
miércoles, 18 de abril de 2007
Compilando ICF2 (Biblioteca básica)
De nuevo he podido dedicar tiempo. He empezado a portar la biblioteca que llamamos ICF2 (Integrated Component Framework, version 2). Básicamente consiste en un conjunto de clases C++ que libera (o intenta liberar) al programador de la gestión de detalles de bajo nivel, relacionadas con la programacion multithread, las comunicaciones, etc. Entre las características principales, se incluye soporte para la programación orientada a eventos (mensajería, concurrencia, temporización, etc.), soporte multihilo, sincronización, contenedores genéricos y gestión de memoria (smart references).
Lo primero que me he encontrado es que las bibliotecas compartidas en Mac OS son .dylib. He tenido que cambiar la opción -shared por -dynamiclib.
Asimismo, he cambiado la opción -soname (válidad solo para ficheros ELF) por las opciones -compatibility_version y -current_version.
En cuanto al código, no he tenido que cambiar nada en comparación con Linux.
Lo primero que me he encontrado es que las bibliotecas compartidas en Mac OS son .dylib. He tenido que cambiar la opción -shared por -dynamiclib.
Asimismo, he cambiado la opción -soname (válidad solo para ficheros ELF) por las opciones -compatibility_version y -current_version.
En cuanto al código, no he tenido que cambiar nada en comparación con Linux.
jueves, 22 de marzo de 2007
MAC address
El primer problema: necesito conocer la dirección hardware de la(s) tarjeta(s) Ethernet instalada(s). En Linux tengo una ioctl, SIOCGIFHWADDR, que me devuelve una estructura con información del interfaz. En Darwin se usa la llamada getifaddrs.
He encontrado un trozo de código en las
páginas de Rafael Baptista, tiene la ventaja de que compara entre sistemas operativos. Gracias, Rafael!
Bueno, he codificado una compilación condicional y resuelto.
He encontrado un trozo de código en las
páginas de Rafael Baptista, tiene la ventaja de que compara entre sistemas operativos. Gracias, Rafael!
Bueno, he codificado una compilación condicional y resuelto.
Empezamos a compilar
Ya tengo mi entorno preparado, podemos empezar la compilación propiamente dicha. Creo que lo mejor será intentar compilar todo e iré comentando los problemas. La otra opción sería estudiar las diferencias entre Darwin y Linux e intentar preparar el código, pero no sé lo suficiente de Darwin para eso.
miércoles, 21 de marzo de 2007
tcl ya funciona
Encontré esta solución (bendito Google) para que funcionen las scripts de TCL, Hay que cambiar la cabecera de la script, donde pone:
#!/usr/bin/wish
hay que poner:
#!/bin/sh
# HACK: this is a comment for tcl \
exec wish "$0" ${1+"$@"}
con eso ya está resuelto (me interesa, evidentemente, que la script siga funcionando en otros UNIX). No me gusta mucho, debería haber funcionado lo de arriba.
#!/usr/bin/wish
hay que poner:
#!/bin/sh
# HACK: this is a comment for tcl \
exec wish "$0" ${1+"$@"}
con eso ya está resuelto (me interesa, evidentemente, que la script siga funcionando en otros UNIX). No me gusta mucho, debería haber funcionado lo de arriba.
Suscribirse a:
Entradas (Atom)