Projects
> youterm
> 0xFFFF
> radare
> glh
> xml2doc
> bluewall
> pvc-repo
> cvs-repo
> git-repo
> mesure
> wistumbler2
> acr

Posts (81)
> List of posts

> Mini update
> Accelerated dreams
> Paranoia?
> Changelog
> Graphs and 077n pwnk
> HNY2k7
> Maemo mooo
> HC pwned
> Long time no post
> USB Pawah Injector i boot reveng

Categories
> all*
> TWD(7)
> blog(5)
> bluetooth(4)
> conf(1)
> desktop(1)
> devel(8)
> family(8)
> hpcva(9)
> hurd(2)
> life(20)
> n770(3)
> netbsd(2)
> pkgsrc(2)
> reality(5)
> tips(2)
> tothink(2)

Links
+ del.icio.us
+ asterx
+ bee.es.gnu.org

nopcode
+gallery
+www.nopcode.org
+cvs.nopcode.org
+news.nopcode.org
+blogs.nopcode.org

Other Blogs
+ sKUrZ0
+ TripleDES
+ gospel
+ blyx
+ MiKi
+ plue
+ xtraeme
+ esteve
+ jmmv
+ pof
+ syvic
+ Yosh
+ k0ro
+ ESN
+ Brainstorm
+ BlackShell
+ Hubertf
+ TooMany
+ viric
+ ziberpunk

doblog
+ Makefile
+ Source
+ Readme
+ TODO
+ Changelog









 
 >>Tue, 18 Oct 2005 01:24:39 +0200

 TWD : Llibreries amb libtool i ACR


Avui he integrat libtool a ACR. El suport encara no està acabat, pero ja és suficient per penjar un mini tutorial de com fer llibreries en C utilitzant libtool i ACR.



Per exemplificar-ho faré una petita llibreria amb dues funcions totalment inutils, aixi la relació esforç/productivitat estarà equilibrada amb la resta del dia, per tal de mantenir-me constant... oohhm x)

.. no, definitivament no puc postejar fumat ..

Aixi que anem a fer l'estructura del projecte:

  console:

$ cat src/file1.c
#include <stdio.h>

void do_something()
{
printf("Doing something\n");
}

$ cat src/file2.c
#include <stdio.h>

void do_another_stuff()
{
printf("Doing another stuff\n");
}
$


Ara haurem de definir les rules en el configure.acr, haurem de tenir en compte certs aspectes del nostre projecte i volcarlos en el configure.acr:

  console:

$ cat configure.acr
PKGNAME libtest
VERSION 1.0.2

USE_LIBTOOL!

SUBDIRS . src ;

REPORT LIBTOOL_CC LIBTOOL_SHARED LIBTOOL_INSTALL ;


Fem un repas a tots els keywords que hem utilitzat:

PKGNAME : Definim el nom del paquet que anem a crear.
VERSION : Definim el numero de versió del paquet que anem a fer.

USE_LIBTOOL! : Indiquem a ACR que volem utilitzar libtool. (L'admiració serveix, al igual que en moltes altres keywords de acr per indicar que es necessari, i que si no ho té aturi l'execució de l'script mostrant un error.

SUBDIRS . src ; : Li indiquem el llistat de directoris on trobara fitxers amb el nom 'Makefile.acr' per filtrar-los i crear els finals 'Makefile'.

REPORT LIBTOOL_CC LIBTOOL_SHARED LIBTOOL_INSTALL ; : Aquesta keyword ens creara un report al final de l'execució del ./configure final, ens ajudara a entendre millor que fa internament.

Molt bé, ara haurem de crear els 2 Makefile.acr, un en el directori actual ./ i un altre a src/.

  console:

$ cat Makefile.acr
all:
cd src & ${MAKE} all

install:
cd src & ${MAKE} install

clean:
cd src & ${MAKE} clean

mrproper: clean
rm src/Makefile Makefile


$ cat src/Makefile.acr
LIB_VERSION=@VERSION@
LIBTOOL_CC=@LIBTOOL_CC@
LIBTOOL_SHARED=@LIBTOOL_SHARED@
LIBTOOL_INSTALL=@LIBTOOL_INSTALL@
LIBDIR=@LIBDIR@

LIBNAME=@PKGNAME@

%.lo:%.c
${LIBTOOL_CC} $<

all: file1.lo file2.lo
${LIBTOOL_SHARED} ${LIBNAME}.la file1.lo file2.lo

install:
mkdir -p ${LIBDIR}
${LIBTOOL_INSTALL} ${LIBNAME}.la ${LIBDIR}

clean:
-rm -rf .libs
-rm *.o *.lo *.la


El primer dels dos Makefiles no té més secret, no crec que calgui explicar que fa. El segon ja és un pel més complexe i és exactament on intervé la veritable mecanica del framework.

Al principi de tot definim totes les variables necessaries per compilar una llibreria compartida (shared), que són:

LIB_VERSION : Variable definida per l'usuari i que es requerida per LIBTOOL_SHARED, es molt important definir-la ja que sense ella donarà error al compilar i ACR no pot manejar aquest tipus d'error, ja que ja ho fa AMR i en aquest cas hem delegat la feina a l'usuari.

LIBTOOL_CC : Compilador a utilitzar quan volguem compilar un objecte per la llibreria.

LIBTOOL_SHARED : Linkador a utilitzar quan volguem juntar els objectes de la llibreria i crear la llibreria final.

LIBTOOL_INSTALL : Ens serveix per instal.lar la llibreria, crear els noms de fitxers de la forma correcta amb el numero de versió, els enllaços simbolics, el .a (archive) i el .la (libtool archive).

LIBDIR : Definim la variable LIBDIR directament adquirida desde l'ACR, aquesta variable pot ser definida per l'usuari fent './configure --libdir=/our/new/library/path' o per defecte ${PREFIX}/lib. Serà on instal.larem la llibreria.

La primera rule potser us sembla extranya..ja que no s'acostuma a utilitzar perquè GNU-make ja integra certes d'aquestes macros per alguns tipus de fitxers, pero sembla que no suporta libtool missfeature found!.

Aquesta macro pinta algo com aixo: %.lo:%.c \ ${LIBTOOL_CC} $<. Aquesta macro ens serveix per indicar al make que cada cop que li demanem una dependencia d'un target que acabi amb .lo, ens agafi el .c i el compili utilitzant ${LIBTOOL_CC}, és a dir, el compilador de libtool. (un vil wrapper del CC).

Al utilitzar LIBTOOL_CC ens farà dues compilacions per cada objecte, una en el directori dels sources (o actual, si fem un crosspathbuild) amb una compilació normal i després una altre en mode PIC a .libs.

El mode PIC serveix per fer que el loader carregui els simbols de forma dinamica, evitant el limit definit pel GOT. Aixo no està suportat en certes arquitectures, però és recomenable d'utilitzar quan creem llibreries.

--

Ara executarem l'ACR i el ./configure
  console:

$ acr
acr: ./configure script created succesfully.
acr: all done.
$ ./configure
checking build system type... i686-unknown-linux-gnu
checking host system type... i686-unknown-linux-gnu
checking target system type... i686-unknown-linux-gnu
checking for working directories... current
using prefix /usr/local
checking for c compiler... gcc
checking for libtool... /usr/pkg/bin/libtool
creating ./Makefile
creating src/Makefile
cleaning temporally files... done

Final report:
- LIBTOOL_CC = /usr/pkg/bin/libtool --mode=compile gcc -c
- LIBTOOL_SHARED = /usr/pkg/bin/libtool --mode=link gcc -rpath /usr/local/lib -release ${LIB_VERSION} -o
- LIBTOOL_INSTALL = /usr/pkg/bin/libtool --mode=install /usr/bin/install -c
$


Aqui podem veure com LIBTOOL_SHARED ens demana LIB_VERSION .

Molt bé, ara simplement fem make i veurem com tot es compila correctament. A l'hora de la creació de la llibreria, podem definir una versió i informacó dins de la versió.

Lo primer es simplement el numero de versió de la llibreria (libfoo-2.9.0.so). Pero lo segon es també interessant, ja que ens permet definir dos tipus de versions, una d'evolució (M.m.s) i la segona que especifica l'estat d'implementació per estar acabada (C:R:A) . Més concretament:

C : Current : El numero de l'implementació de l'interficie últim.
R : Revision : Nombre d'implementació de l'interficie actual.
A : Age : Diferencia entre Current i Revision.

De fet el resultat final es guiarà per aquestes premises:
  console:

A < C
X = C - A
Y = A
Z = R


Per exemple: -version-info 3:0:2 resultarà en libfoo.so.1.2.0

Libtool definirà el nom final de la llibreria com: libname-V.V.V.so.X.Y.Z.

Per definir aixo ho farem amb la flag -version-info 3:0:2, encara que no es necessari i sembla que sigui una cosa que va a gustos Té més del que sembla...feu-vos una repasada pel /lib i /usr/lib

Us pastejo finalment el output del make i aixi us feu una idea per si algo va malament

  console:

$ make
cd src & make all
make[1]: Entering directory `/tmp/libtest/src'
/usr/pkg/bin/libtool --mode=compile gcc -c file1.c
mkdir .libs
gcc -c file1.c -fPIC -DPIC -o .libs/file1.o
gcc -c file1.c -o file1.o >/dev/null 2>&1
/usr/pkg/bin/libtool --mode=compile gcc -c file2.c
gcc -c file2.c -fPIC -DPIC -o .libs/file2.o
gcc -c file2.c -o file2.o >/dev/null 2>&1
/usr/pkg/bin/libtool --mode=link gcc -rpath /usr/local/lib -release 1.0.2 -o libtest.la file1.lo file2.lo
gcc -shared .libs/file1.o .libs/file2.o -Wl,-soname -Wl,libtest-1.0.2.so -o .libs/libtest-1.0.2.so
(cd .libs & rm -f libtest.so & ln -s libtest-1.0.2.so libtest.so)
ar cru .libs/libtest.a file1.o file2.o
ranlib .libs/libtest.a
creating libtest.la
(cd .libs & rm -f libtest.la & ln -s ../libtest.la libtest.la)
make[1]: Leaving directory `/tmp/libtest/src'
$



>> ACR
>> Libtool manual

[add comment] [view comments] (38)

Comments:
from: xtraeme
date: Tue, 18 Oct 2005 12:03:03 +0200
title: re: title

hmm esta realmente currao el acr, enhorabuena :-)


from: USA
date: Thu, 20 Jul 2006 21:52:15 +0200
title: My homepage

Nice site!
My homepage | Cool site


from: Australia
date: Thu, 20 Jul 2006 21:52:23 +0200
title: My homepage

Thank you!


from: Darrell Wilkins
date: Sun, 09 Sep 2007 15:50:27 +0200
title: Bruce Tucker

cessantly trichia mottle foredoomer dillweed snippy judaic spinifugal


from: Jody Blair
date: Tue, 11 Sep 2007 23:00:00 +0200
title: Alejandro Watkins

cessantly trichia mottle foredoomer dillweed snippy judaic spinifugal


from: Leo Colon
date: Wed, 09 Jan 2008 21:57:35 +0100
title: Garland Gallagher

stegodont ceratitis permutation tushery pullus tripudium ripelike summerbird


from: Ida Garrett
date: Sat, 12 Jan 2008 01:23:14 +0100
title: Tony Yang

stegodont ceratitis permutation tushery pullus tripudium ripelike summerbird


from: Glenna Brewer
date: Sat, 12 Jan 2008 07:17:47 +0100
title: Anton Mosley

stegodont ceratitis permutation tushery pullus tripudium ripelike summerbird


from: Derick Mack
date: Mon, 14 Jan 2008 17:48:00 +0100
title: Regina Jefferson

stegodont ceratitis permutation tushery pullus tripudium ripelike summerbird


from: Elsie Simmons
date: Sun, 27 Jan 2008 07:18:30 +0100
title: Esteban Craig

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Adele Mullen
date: Sun, 27 Jan 2008 14:28:49 +0100
title: Hugo Schultz

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Harriet Gonzalez
date: Sun, 27 Jan 2008 23:47:42 +0100
title: Kent Anthony

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Adrianne Mcgowan
date: Wed, 30 Jan 2008 00:22:17 +0100
title: Genevieve Travis

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Kayla Glover
date: Wed, 30 Jan 2008 05:15:01 +0100
title: Joseph Mason

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Elvira Fry
date: Wed, 30 Jan 2008 12:53:04 +0100
title: Marguerite Mcfadden

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Lee Weaver
date: Fri, 01 Feb 2008 21:05:01 +0100
title: Heidi Weiss

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Kurt Davenport
date: Sat, 02 Feb 2008 08:01:22 +0100
title: Randal Higgins

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Barney Lambert
date: Sat, 02 Feb 2008 21:42:46 +0100
title: Alisa Meyer

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Gwendolyn Gates
date: Sun, 03 Feb 2008 05:04:59 +0100
title: Lana Clemons

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Alejandro Mccoy
date: Tue, 05 Feb 2008 17:20:23 +0100
title: Monika Blackwell

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Greg Cannon
date: Wed, 06 Feb 2008 04:35:15 +0100
title: Phyllis Fleming

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Sam Fox
date: Wed, 06 Feb 2008 10:14:30 +0100
title: Lavonne Haney

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Leigh England
date: Wed, 06 Feb 2008 21:09:02 +0100
title: Martha Landry

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Norbert Carlson
date: Thu, 07 Feb 2008 01:30:46 +0100
title: Hiram Peck

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Josh Carson
date: Thu, 07 Feb 2008 13:12:53 +0100
title: Deidra Burch

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Cathleen Leblanc
date: Fri, 08 Feb 2008 00:30:58 +0100
title: Anderson Mcdonald

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Tia Stone
date: Fri, 08 Feb 2008 08:16:16 +0100
title: Esmeralda Garrison

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Leland George
date: Fri, 08 Feb 2008 13:21:11 +0100
title: Chuck Johnston

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Jarrod Morrison
date: Sun, 10 Feb 2008 12:19:28 +0100
title: Ross Conrad

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Janell Maynard
date: Mon, 11 Feb 2008 06:32:41 +0100
title: Kendall Rodriguez

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Tracey Maynard
date: Mon, 11 Feb 2008 13:22:28 +0100
title: Ava Owen

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Frank Burt
date: Mon, 11 Feb 2008 23:14:54 +0100
title: Colette Barton

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Ralph Rowe
date: Tue, 12 Feb 2008 04:52:26 +0100
title: Monica Todd

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Jude Walter
date: Tue, 12 Feb 2008 12:26:12 +0100
title: Norberto Buchanan

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Carmela Peck
date: Fri, 15 Feb 2008 09:13:24 +0100
title: Francis Walker

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Stella Williamson
date: Fri, 15 Feb 2008 23:32:59 +0100
title: Monty Ferguson

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Tamera Gardner
date: Sat, 16 Feb 2008 03:08:03 +0100
title: Lillie Vargas

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider


from: Dora Chaney
date: Thu, 21 Feb 2008 19:10:02 +0100
title: Ingrid Jordan

pyroglutamic briber encoronal blastoidea pseudomeric amentum coronership raider