•First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Estructura de la charla: Introduccion. Herramientas de desarrollo: linea de comando. gnu make, autoconf, automake, configure, et.al. cvs diff y patch i18n y l10n ant (java) Herramientas de desarrollo: visuales. Glade, Anjuta, KDevelop y Kylix Para Java: netbeans (www.netbeans.org), eclipse (www.eclipse.org), Distribuyendo nuestra app. Sourceforge http://www.sourceforge.net Freshmeat http://freshmeat.net Conclusiones. •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Introducción En esta charla vamos a intentar responder las siguientes preguntas: ¿Cómo puedo participar en proyectos de código abierto? ¿Cómo empiezo? ¿Qué herramientas tengo que conocer? Lo más importante: tener ganas y un poco de tiempo. ¿Por qué hacerlo? Principamente diversón. Pero además: es útil, ego y CV. •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Algunos proyectos Ya hay muchos proyectos interesantes. • Kernel de Linux • GTK / Gnome • Gimp • QT / KDE, • Mozilla • tu proyecto aquı́ Para poder aportar hay que saber algunas cosas: • Programar: ya sea en C, C++, Java, Perl, php, etc. • Conocer algunas herramientas básicas de desarrollo que hiremos disctuiendo aquı́. •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Make En programas grandes lleva tiempo compilar todo. Es más fácil dividir los fuentes y compilar sólo lo que cambió. Para ello se utilizan archivos Makefile y el programa make. make maneja dependencias entre archivos. tiene reglas para hacer distintas acciones: generar la aplicación, la documentación, instalar el programa, etc. Tı́picamente para compilar un programa hacemos: $ make all •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Make Para entender cómo trabaja make hagamos un ejemplo sencillo. Tenemos dos archivos en C, un header y el makefile: file1.c, file2.c, file1.h, makefile. Analizemos el siguiente makefile: •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit autoconf, et.al. En proyectos grandes hay varios problemas que resolver: • Muchas dependencias entre archivos: librerias, codigo, headers, etc. • Requerimientos de librerias: X11, gtk, QT, etc. • Soporte para diversas plataformas: Linux, Win32, *BSD, etc. configure permite detectar todo esto automáticamente. Tipicamente configure genera un Makefile y un config.h que toman en cuenta todas las dependencias. Para compilar el programa: $ ./configure checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking whether make sets ${MAKE}... yes checking for working aclocal-1.4... missing checking for working autoconf... found . . $ make •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit ¿Cómo genero mi configure? Por suerte no es muy difı́cil. Hay varios utilitarios para ayudar: autoconf, automake, autoheader, etc. negro: files obligatorios. gris: opcionales verde: ejecutables (scripts) •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit ¿Cómo genero mi configure? El procedimiento es el siguente: 1. Escribo configure.in y Makefile.am 2. Usando automake* genero Makefile.in 3. Usando autoheader* genero config.h.in (si uso config.h) 4. Usando autoconf* genero configure a partir de configure.in y Makefile.in. Para compilar mi programa sólo tengo que correr configure* y esto me genera config.h y Makefile. •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit 1a. Escribo configure.in AC_INIT(src/rio_format.c) AM_INIT_AUTOMAKE(rio500, 0.8) AM_CONFIG_HEADER(librio500/config.h) ... AC_PROG_CC AC_HEADER_STDC ... AC_CHECK_HEADERS(fcntl.h sys/ioctl.h unistd.h) AC_C_BIGENDIAN ... AC_MSG_CHECKING(whether to link with ElectricFence) AC_ARG_WITH(efence, [ --with-efence Link with ElectricFence --without-efence Don’t Link with ElectricFence (default)], [ case "$withval" in yes) ... *) ... ]) ... AC_OUTPUT(Makefile src/Makefile librio500/Makefile ... docs/Makefile) •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Macros de autoconf m4* es un lenguaje de macros. Basicamente toma un file de input y macros y expande el input. autoconf* usa macros similares a los de m4*. Veamos algunos ejemplos: AC DEFUN( FUNCION NAME, BODY ) define una función llamada FUNCTION NAME cuyo cuerpo es BODY. Cuando m4 encuentra FUNCTION NAME la expande reemplazando con BODY. AC TRY RUN( PROGRAM, ACTION-IF-TRUE*, ACTION-IF-FAIL* ) compila un programa en C. Si compila, corre y hace un exit(0) lleva a cabo ACTION-IF-TRUE. Sino ejecuta ACTION-IF-FAIL. AC DEFINE( VARIABLE, VALUE*, DESCRIPTION* ) define una variable de preprocesador C mediante un #define como resultado de un test. En autoconf.info hay una lista de macros ya definidos por autoconf que se pueden usar en configure.in. •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Algunos macros de autoconf Cada linea de configure.in es un macro. Cada macro corresponde un chequeo y dependiendo del resultado se setean algunas variables. AC_DEFUN( AC_C_BIGENDIAN, [ AC_CACHE_CHECK( whether byte ordering is bigendian, ac_cv_c_bigendia [ ac_cv_c_bigendian=unknown ... if test $ac_cv_c_bigendian = unknown; then AC_TRY_RUN( [ main () { /* Are we little or big endian? From Harbison&Steele. */ union { long l; char c[sizeof (long)]; } u; u.l = 1; exit (u.c[sizeof (long) - 1] == 1); }], ac_cv_c_bigendian=no, ac_cv_c_bigendian=yes) fi ] ) if test $ac_cv_c_bigendian = yes; then AC_DEFINE(WORDS_BIGENDIAN) fi ] ) •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit 1b. Escribo Makefile.am CFLAGS1=@CFLAGS@ -Wall DEFAULT_FONT_PATH = @fontpath@ ... EFENCE_LIB = @efence_lib@ FLAGS1 = $(CFLAGS1) -I$(top_srcdir)/librio500 @GLIB_CFLAGS@ $(CPPFLAGS FLAGS2 = -DDEFAULT_PSF_FONT=\"$(DEFAULT_PSF_FONT)\" .. CFLAGS = $(FLAGS1) $(FLAGS2) $(USB_CFLAGS) LDADD = $(USB_LIBS) -L../librio500 @GLIB_LIBS@ -lrio500_api \ -lrio500 $(EFENCE_LIB) GETOPT_FILES = getopt.c getopt1.c bin_PROGRAMS = rio_format rio_add_song ... bmp2rioani rio_format_SOURCES = rio_format.c $(GETOPT_FILES) rio_add_song_SOURCES = rio_add_song.c $(GETOPT_FILES) ... •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit 2. Corriendo automake* genero Makefile.in Makefile.in generado por automake* a partir de Makefile.am: # Makefile.in generated automatically by automake 1.5 from Makefile.am srcdir prefix .. EXEEXT OBJEXT .. = @srcdir@ = @prefix@ = @EXEEXT@ = @OBJEXT@ # extensiones: nada en Unix, .exe DOS, etc. # extensiones: .o en Unix, .obj DOS, etc. # reglas para rio_format rio_format_OBJECTS = rio_format.$(OBJEXT) getopt.$(OBJEXT) getopt1.$(O rio_format_LDADD = $(LDADD) rio_format_DEPENDENCIES = rio_format_LDFLAGS = .. rio_format$(EXEEXT): $(rio_format_OBJECTS) $(rio_format_DEPENDENCIES) @rm -f rio_format$(EXEEXT) $(LINK) $(rio_format_LDFLAGS) $(rio_format_OBJECTS) $(rio_form ... @varname@ son completadas por configure* cuando corre. •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit 3. Corriendo autoheader* genero config.h.in El comando autoheader* revisa configure.in buscando macros de la forma AC DEFINE() y genera un archivo config.h.in con cada variable definida con un comentario y con un #undef: /* librio500/config.h.in. Generated from configure.in by autoheader. ... /* ID3 Support */ #undef USE_ID3_TAGS /* And now the rest of the boys */ #undef ENABLE_NLS #undef HAVE_CATGETS #undef HAVE_GETTEXT ... /* Define to 1 if using ‘alloca.c’. */ #undef C_ALLOCA /* Define to 1 if translation of program messages to the user’s native language is requested. */ #undef ENABLE_NLS ... •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit 4. Corriendo autoconf* genero configure* El comando autoconf* lee configure.in, expande todos los macros y genera configure*. Una vez generado: corriendo configure* se generan un Makefile por cada Makefile.in y config.h por cada config.h.in: /* librio500/config.h. Generated by configure. */ /* librio500/config.h.in. Generated from configure.in by autoheader. /* These are standard for all packages using Automake */ #define PACKAGE "rio500" #define VERSION "0.8" /* USBDEVFS Support */ /* #undef WITH_USBDEVFS */ /* ID3 Support */ /* #undef USE_ID3_TAGS */ /* And now the rest of the boys */ #define ENABLE_NLS 1 /* #undef HAVE_CATGETS */ #define HAVE_GETTEXT 1 ... •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit cvs - Concurrent Versions System Cuando mucha gente modifica un mismo programa o cuando queremos mantener versiones anteriores de un programa debemos usar cvs. Del man page: ”CVS is a version control system, which allows you to keep old versions of files (usually source code), keep a log of who, when, and why changes occurred, etc., like RCS or SCCS. Unlike the simpler systems, CVS does not just operate on one file at a time or one directory at a time, but operates on hierarchical collections of directories consisting of version controlled files. CVS helps to manage releases and to control the concurrent editing of source files among multiple authors. CVS allows triggers to enable/log/control various operations and works well over a wide area network. cvs keeps a single copy of the master sources. This copy is called the source “repository”; it contains all the information to permit extracting previous software releases at any time based on either a symbolic revision tag, or a date in the past.” •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit cvs - Concurrent Versions System Para poder usar cvs* hace falta tener una cuenta en un servidor de cvs*. Cuando se tiene acceso sólo de lectura se usan los siguientes comandos: cvs login: Antes de utlizar cualquier comando hay que validarse contra el servidor de CVS. Una vez logeado se es posible realizar las otras operaciones cvs checkout module: hace un “checkout” del módulo module de CVS. Tı́picamente para traer todo un directorio con un proyecto la primera vez que se va a trabajar sobre él. cvs -z3 update -d: Si estoy parado en el directorio que bajé via CVS puedo hacer un “update” de los cambios que otros hicieron sobre ese dir. El flag ’-z3’ es para que use compresión al traer los cambios y ’-d’ para que sea recursivo. cvs status -v file: Nos da información sobre el archivo file y nos dice en qué rama estamos trabajando. •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit cvs - Concurrent Versions System Si ahora nosotros tenemos un proyecto que queremos subir a un servidor cvs donde tenemos una cuenta con acceso de escritura usamos los siguientes comandos: cvs import module vendor-tag release-tag: Si estamos parados en el directorio donde están nuestros fuentes usamos este comando para subirlo. module es el nombre del módulo con que se hacen los checkout, vendor-tag y releasetag son dos tags. cvs commit file: Una vez que modifiqué un archivo y estoy seguro que anda debo hacer un “commit” de mis cambios. Uso este comando. Allı́ el CVS me pedirá que ingrese un comentario. Es muy importante hacerlo para que quede registrado quien hizo qué cambio. cvs add file: Agrega un file al repositorio. Pero no actualiza el servidor hasta que no se hace un commit. •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit cvs - Concurrent Versions System cvs tag -b branch-name: Crea una rama en el repositorio llamada branch-name a partir de la rama principal. Para poder utilizarla hay que hacer un cvs checkout cvs checkout -r branch-name module: Hace un “checkout” de la rama llamada branch-name. •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit diff y patch Problema: Solución: ¿Cómo le mandamos cambios/mejoras El comando diff*. Este comando comhecha por nosotros si no tenemos acceso para dos archivos fuentes y genera un de escritura al CVS? archivo con la diferencia entre los dos files. #include hstdio.hi main() { printf("Hello world!"); } ¡¡Falta el CR!! Lo arreglamos y veamos el $ diff file.c file.c.orig: 5c5 < printf("Hello world!\n"); --> printf("Hello world!"); •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit diff y patch ¿Cómo se utiliza en la práctica? 1. Hacemos un cvs checkout o cvs update de los fuentes que queremos modificar. 2. Copiamos el file a modificar, por ejemplo: $ cp file.c file.c.orig 3. Hacemos las modificaciones en file.c 4. Hacemos diff con la versión original y lo redireccionamos a un file: $ diff file.c file.c.orig ¿ file.diff 5. Le mandamos el diff a la persona responable del proyecto con nuestras super-modificaciones. •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Internationalization y localization ¿Qué es i18n y l10n? i18n (internationalization) es la operación que hay que hacer para que nuestro programa pueda ser fácilmente traducido a otros idiomas. l10n (localization) es la operación que hay que hacer para que el input/output de nuestro programa puede adaptarse fácilmente a las convenciones culturales de distintas regiones del mundo. En los proyectos GNU se utiliza el paquete gettext. Veremos una pasada rápida a los pasos que hay que hacer para que nuestro fuente utilize gettext •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Internationalization y localization 1. Modificar fuentes 1a agregar #include <libintl.h> y #include <locale.h> 1b agregar código de inicialización: int main (argc, argv) int argc; char argv; { ... setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); ... } PACKAGE y LOCALEDIR deben ser definidas mediante ’-D’ en la compilación o estar en config.h si se usa autoconf. Por ejemplo: •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Internationalization y localization 1. Modificar fuentes (cont) 1c agregar #define (String) gettext (String) en algún lugar y marcar todos los strings que queremos sea posible traducir: Si en algún lugar tenemos: ... printf ("Error!! No se pudo hacer tal o cual cosa."); ... se debe modificar por: ... printf (_("Error!! No se pudo hacer tal o cual cosa.")); ... •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Internationalization y localization 2. Generar el .pot con xgettext Corriendo xgettext -a sobre mis fuentes obtengo un archivo de tipo .pot con los strings que quiero convertir. # Comentarios... #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2002-02-20 02:59+0000\n" ... #: librio500/anim.c:73 msgid "Setting animation." msgstr "" #: librio500/anim.c:98 msgid "Removing Animation." msgstr "" ... •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Internationalization y localization 3. Generar los .po para cada LOCALE Copiar el .pot al idioma que quiero modificar y traducir. Por ejemplo: $ cp PACKAGE.pot es AR.po. 4. Compilar el programa 5. Generar los .mo e instalarlos Para generar los .mo ejecutar: $ msgfmt -o es AR.mo es AR.po. Luego instalarlos en LOCALEDIR. Para ver los resultados basta setear la variable LC MESSAGES al locale deseado y correr la aplicacion: $ export LC MESSAGES="es AR" $ ./app •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Ant Ant tiene funcionalidad similar a la de make pero con algunas diferencias importantes: • Ant está mas bien orientada hacia Java. • makefiles usa comandos shell para trabajar por lo que dependen de la plataforma donde se escribió. Ant. utiliza tareas escritas en Java. • Ant utiliza el formato XML para el ‘makefile’. • Se agregan modulos nuevos escribiendo clases Java. Ant tiene montones de ‘tareas’ ya armadas para hacer distintas cosas. Veamos algunos ejemplos interesantes: • Acceder a repositorios CVS. • Corre Jar, gunzip, rpm, Tar, etc. sobre un set de files. • Manda mail! •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Ant: ejemplo Un ejemplo simple Los archivos de Ant se suelen llamar build.xml. Veamos un ejemplo: Después de la parte general se definen targets que equivalen a las reglas de make. Para ejecutar ant se hace: $ ant target donde target es la regla que se quiere ejecutar. •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Ant: targets •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Herramientas visuales Glade • Genera código C para GTK/GNOME • Guarda XML que puede ser leido dinámicamente • Genera todos los files necesarios para autoconf automáticamente. •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Herramientas visuales Anjuta • IDE para GTK/GNOME - C,C++ • Debugger interactivo • Editor integrado con syntax highlighting, documentación, etc. •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Herramientas visuales KDevelop • IDE para QT/KDE • Class browser, Wizards • Editor integrado con syntax highlighting, documentación, etc. •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Herramientas visuales Kylix • IDE cross-platform Linux/Windoze: C++ y Delphi • Gratis para proyectos GNU • Muy similar al Borland C Builder •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Herramientas visuales: Java Netbeans (Sun) • Mas que una IDE: un framework expandible. Soporte principalmente para Java pero también C, HTML, XML • Server HTTP incorporado, soporte para JSP, CORBA, RMI, ANT • JDBC, Servlets, CVS •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Herramientas visuales: Java Netbeans: Poseidon • Módulo para Netbeans, comercial, para desarrollo de UML. • Generacón de código Java o C a partir del UML y templates (genera clases y getter/putter). • Generación de documentacón al estilo Javadoc. •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Herramientas visuales: Java Eclipse (IBM) • Mas que una IDE: una plataforma para desarrollos. • Soporte Java, C, C++, Cobol, y otros. Refactoring. • Sistema de plug-ins para expansión •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Herramientas visuales: Java Eclipse: Stellation Virtual Source File (VSF) Demo • Prototipo de un editor VSF • VSF: un fuente ‘virtual’ compuesto por multiples fragmentos de otros fuentes, anotaciones, resutlados de pruebas, emails, etc. • Permite trabajar sobre el VSF como si fuese un único documento. •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Sourceforge - http://sf.net Facilidades: • Acceso a un CVS ‘individual’, bugtracking, listas de correo • cuentas ssh, webhosting, ftp, compiler farm • Patch tracking system, etc. •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Sourceforge - http://sf.net Administración de proyectos: •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Freshmeat - http://freshmeat.net Catálogo de proyectos: • Permite anunciar releases nuevos. • Categorizar mi programa. • Buscar proyectos similares por todo tipo de criteriors. •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Conclusiones • Hay muchisimos proyectos interesantes para colaborar. • Hay muchas areas donde se puede aportar: código, documentación, traducciones, etc. • Todas las herramientas son gratis y están a la mano de cualquiera con acceso a Inet. •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit Referencias • automake, et.al: • KDevelop: info automake, info autoconf • CVS: • Kylix: man cvs, info cvs http://www.borland.com/kylix • I18n y l18n: • Netbeans: info gettext xgettext -h, msgfmt -h http://www.kdevelop.org http://www.netbeans.org y man • Ant: http://ant.apache.org • Glade: http://glade.gnome.org • Anjuta: • Eclipse: http://www.eclipse.org • Sourceforge: http://www.sourceforge.net • Freshmeat: http://freshmeat.net http://anjuta.sourceforge.net •First •Prev •Next •Last •Go Back •Full Screen •Close •Quit