Hi,
schönes neues Jahr!
Gleich mal eine Autoconf/Libtool Frage: wie sage ich Automake und Libtool, welche Version die Bibliothek hat, die ich gerade compiliere?
Per default erzeugt mir ein make Run eine libirgendwas.so.0.0.0, ich möchte aber, dass es libirgendwas.so.0.1.0 wird und libtool/ld das auch als soname in die lib einbaut, da ich gerade die Version 0.1 meines Pakets compiliere ($(VERSION) ist "0.1").
Konrad
Am Samstag, 1. Januar 2005 19:45 schrieb Konrad Rosenbaum:
Hi,
schönes neues Jahr!
Dito!
Gleich mal eine Autoconf/Libtool Frage: wie sage ich Automake und Libtool, welche Version die Bibliothek hat, die ich gerade compiliere?
foo_la_LDFLAGS = ... -version-info 0:1:0
Zu beachten: - das sind Doppelpunkte, die im Dateinamen zu Punkten werden - die Libtool-Versionierung ist schwierig und hat überhaupt nichts mit Paketversionen zu tun
Schema: a.b.c a -> wird erhöht sobald sich die API ändert * dabei b auf 0 setzen * trifft zu auf jegliche Veränderung an der API (im Gegensatz zu c) b -> wird erhöht sobald sich irgendwas im Quelltext ändert (außer Kommentare;) c -> die Differenz von a(aktuell) zum kleinstmöglichen a mit der selben API * wird immer auf 0 gesetzt, sobald Funktionen gelöscht bzw. geändert werden * wird erhöht, falls a erhöht wird und nur Funktionen hinzugekommen sind
0.1.0 heißt also, daß nur was im Quelltext geändert wurde, nicht aber in den (öffentlich installierten) Headern. Ansonsten wäre es 1.0.0 oder 1.0.1.
Josef
On Saturday 01 January 2005 20:15, Josef Spillner wrote:
Am Samstag, 1. Januar 2005 19:45 schrieb Konrad Rosenbaum:
Gleich mal eine Autoconf/Libtool Frage: wie sage ich Automake und Libtool, welche Version die Bibliothek hat, die ich gerade compiliere?
foo_la_LDFLAGS = ... -version-info 0:1:0
libtool 1.5a: gcc: unrecognized option `-version-info=0:1:0'
libtool 1.5.6 gibt die Option wenigstens nicht an gcc weiter, aber soname wird immernoch auf die falsche Option gesetzt (ich habe version-info=1:0:0 mal ausprobiert soname ist trotzdem libxyz.so.0). Die Symlinks sind weiterhin 0.0.0.
So sieht die Configuration aus: Libtool: 1.5.6 Automake: 1.7.9, identisches Verhalten plus ein paar aclocal-Warnungen bei 1.9.4 Autoconf: 2.59
Makefile.am (Auszug): lib_LTLIBRARIES = libterces.la libterces_la_SOURCES = terces.c hash/md5.c hash/sha1.c hash.c ... libterces_la_CFLAGS = -I$(TCL_INC_DIR) libterces_la_LDFLAGS = $(TCL_LIB_SPEC) -version-info=1:0:0
(ich habe zum Testen mal 1:0:0 gewählt, damit auch soname zeigt, ob es klappt)
Zu beachten:
- das sind Doppelpunkte, die im Dateinamen zu Punkten werden
- die Libtool-Versionierung ist schwierig und hat überhaupt nichts mit
Paketversionen zu tun
Ok, verstanden. Aber glaube mir, im Vergleich zu den Büchern über das Thema was ich da programmiere ist das ein sehr übersichtliches Schema (es ist eine Kryptolib).
Konrad
Am Samstag, 1. Januar 2005 21:44 schrieb Konrad Rosenbaum:
libtool 1.5a: gcc: unrecognized option `-version-info=0:1:0'
libtool 1.5.6 gibt die Option wenigstens nicht an gcc weiter, aber soname wird immernoch auf die falsche Option gesetzt (ich habe version-info=1:0:0 mal ausprobiert soname ist trotzdem libxyz.so.0). Die Symlinks sind weiterhin 0.0.0.
Ich war leicht ungenau in meinen Ausführungen. Aus der Option a:b:c bastelt sich libtool etwas zusammen, was als foo.so.x.y.z herauskommt und aufgrund der Kompatibilität (Buchstabe c) den Wert hat, den x.y.z hatte, als c 0 war.
Ich war da auch mal verwirrt, siehe: http://mail.ggzgamingzone.org/pipermail/ggz-dev/2004-July/000182.html
Man beachte die Bezeichnung "humans shouldn't care", die stammt von irgendeiner libtool-Doku.
Oh und das = muß weg, daher vermutlich der gcc-Fehler.
Josef
On Saturday 01 January 2005 21:59, Josef Spillner wrote:
Ich war leicht ungenau in meinen Ausführungen. Aus der Option a:b:c bastelt sich libtool etwas zusammen, was als foo.so.x.y.z herauskommt und aufgrund der Kompatibilität (Buchstabe c) den Wert hat, den x.y.z hatte, als c 0 war.
Ok:
x=a-c, soweit klar.
Durch ein paar Experimente habe ich herausgefunden:
y=c und z=b
Logik dahinter:
x ist das älteste Interface zu dem die Lib kompatibel ist. y ist die aktuelle ABI dieses Interface. z ist die Revision dieses x.y.
Beispiel: 3:4:1 ist die Interface-Version 3, Revision 4, und 1 Schritt rückwärtskompatibel.
Das ergibt libfoo.so.2.1.4: 2 ist das älteste Interface, das unterstützt wird, 1 ist die leicht inkompatible Variante davon, 4 ist die Revision von 2.1
Die Beispiele in Deiner Mail hätten so aussehen sollen: 1:1:0 -> 1.0.1 2:1:1 -> 1.1.1
Konrad
lug-dd@mailman.schlittermann.de