-
Notifications
You must be signed in to change notification settings - Fork 0
Autotools
Esta página contiene unas notas para tomar como guía para compilar una aplicación de escritorio (una calculadora) usando las herramientas de GNU (autotools, make, gcc, etc.) en Ubuntu
$ sudo apt-get install build-essential autotools-dev make autoconf automake subversion
La idea es seguir una serie de convenciones para colocar el código fuente en lenguaje C y usar las herramientas de autotools para detectar funciones y bibliotecas instaladas y una serie de valores que se pueden determinar en tiempo de compilación para producir un ejecutable con las características presentes en cada uno de los sistemas suportados por GNU (no solamente Linux).
Tomé como ejemplo, una calculadora que usa las bibliotecas motif (o lesstif, una implementación libre de las mismas) desde este sitio, y vamos a crear un paquete de software que detecte si la biblioteca motif está instalada, y que genere un programa que se puede compilar, instalar y desinstalar.
Bajamos el código fuente del proyecto: el código fuente de la calculadora calcu.c
, y los archivos Makefile.am
y configure.in
que son usados por los programas de autotools.
$ git clone https://github.com/dfuenzalida/desarrollo-ubuntu.git
$ cd desarrollo-ubuntu/calculadora
El archivo Makefile.am
es muy sencillo:
bin_PROGRAMS = calcu
calcu_SOURCES = src/calcu.c
Básicamente se generará un programa ejecutable (binario) llamado calcu
, y el código fuente es el archivo src/calcu.c
.
El contenido del archivo configure.in
es el siguiente:
AC_INIT(src/calcu.c)
AM_INIT_AUTOMAKE(calcu, 0.1)
AC_PROG_CC
AC_CHECK_LIB(Xm, XmCreateForm,, AC_MSG_ERROR([Xm not found. Install libmotif3 libmotif-dev and libxt-dev]
))
AC_PROG_INSTALL
AC_OUTPUT(Makefile)
Aquí lo relevante es la línea que contiene el texto AC_CHECK_LIB
. En tiempo de compilación se pasará el enlace a la biblioteca Xm
, y para detectar si está instalada se probará crear un programa que use la función XmCreateForm
. Si no está instalada, se generará un mensaje de error.
Un paquete GNU debe contener los archivos README, AUTHORS, NEWS y ChangeLog, pero para este ejemplo los creamos en blanco.
$ aclocal
$ autoconf
$ touch README AUTHORS NEWS ChangeLog
$ automake -a
configure.in:2: installing `./install-sh'
configure.in:2: installing `./missing'
Makefile.am: installing `./INSTALL'
Makefile.am: installing `./COPYING'
Makefile.am: installing `./depcomp'
Entre otras cosas, los programas que se ejecutaron generan un script llamado configure
, que realiza la detección de todos los detalles que varían entre los diferentes sistemas soportados por GNU.
$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking for XmCreateForm in -lXm... no
configure: error: Xm not found. Install libmotif3 libmotif-dev and libxt-dev
Ah! ... no hemos instalado las bibliotecas necesarias para compilar. Lo bueno es que el script configure
, generado por autotools nos lo indicó.
$ sudo apt-get install libmotif3 libmotif-dev libxt-dev
$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking for XmCreateForm in -lXm... yes
checking for a BSD-compatible install... /usr/bin/install -c
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
Listo, ahora podemos compilar el programa:
$ make
gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\"
-DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"calcu\" -DVERSION=\"0.1\" -DHAVE_LIBXM=1
-I. -g -O2 -MT calcu.o -MD -MP -MF .deps/calcu.Tpo -c -o calcu.o `test -f 'src/calcu.c' || echo './'`src/calcu.c
mv -f .deps/calcu.Tpo .deps/calcu.Po
gcc -g -O2 -o calcu calcu.o -lXm
El ejecutable quedó en ./calcu
, como se puede ver en la siguiente foto:
Ahora podemos generar un paquete distribuible de nuestro código fuente con make dist
:
$ make dist
$ ls *.tar.gz
calcu-0.1.tar.gz
Este archivo calcu-0.1.tar.gz
es un "tarball", un paquete de código fuente que podemos enviar a otros, colocar en un sitio FTP y en general, distribuir el código fuente a todo el mundo.
Para convertir este archivo tarball en un paquete de software instalable que no requiera herramientas de desarrollador, sigue las instrucciones de la siguiente página.