Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

code de detection du nouveau gdbm (1.8.3). #8196

Closed
vicuna opened this issue Jul 5, 2003 · 3 comments
Closed

code de detection du nouveau gdbm (1.8.3). #8196

vicuna opened this issue Jul 5, 2003 · 3 comments
Labels

Comments

@vicuna
Copy link

vicuna commented Jul 5, 2003

Original bug ID: 1742
Reporter: administrator
Status: closed
Resolution: fixed
Priority: normal
Severity: minor
Category: ~DO NOT USE (was: OCaml general)

Bug description

Salut, ...

La version de debian de gdbm utilise avec ocaml est gdbm 1.8.3.

Cette version, a part utilise l'include gdbm-ndbm.h a la place de
ndbm.h, a aussi besoin d'utiliser la librairie libgdbm_compat pour
utiliser les anciennes fonctions de compatibilite dbm et ndbm que ocaml
utilise.

J'ai fait un patch pour le package ocaml, mais il est pas tres propre,
alors peut-etre voudrez vous faire un fix correct pour la future version
ocaml 3.07.

Pour cela, voici les informations qui sont utiles :

le fichier d'include se trouve dans /usr/include/gdbm-ndbm.h et la
librairie a utilise est /usr/lib/libgdbm_compat.[l]a.

Pour cela, je pense que le mieux serait de tester l'existence de
gdbm-ndbm.h si ndbm.h n'existe pas, et si on trouve gdbm-ndbm.h, faire
le test " sh ./hasgot -lgdbm_compat dbm_open " avant de mettre dbm_link
a "-lgdbm_compat".

Cela devrait bien marche, mais il y a encore un probleme, et c'est le
fait que otherlibs/dbm/cldbm.c a un include de ndbm.h alors qu'il faut
utiliser gdbm-ndbm.h.

Si vous n'avez pas le temps pour cela, je peut essayer de faire un patch
la semaine prochaine.

Amicalement,

Sven Luther

@vicuna
Copy link
Author

vicuna commented Jul 8, 2003

Comment author: administrator

La version de debian de gdbm utilise avec ocaml est gdbm 1.8.3.

Cette version, a part utilise l'include gdbm-ndbm.h a la place de
ndbm.h, a aussi besoin d'utiliser la librairie libgdbm_compat pour
utiliser les anciennes fonctions de compatibilite dbm et ndbm que ocaml
utilise.

Je râle copieusement sur ces changements gratuits. (Ce n'est pas la
première fois.) Les auteurs de gdbm et les packagers Debian
savent-ils ce que signifie "compatibilité arrière"?

J'ai fait un patch pour le package ocaml, mais il est pas tres propre,
alors peut-etre voudrez vous faire un fix correct pour la future version
ocaml 3.07.

Pour cela, voici les informations qui sont utiles :

le fichier d'include se trouve dans /usr/include/gdbm-ndbm.h et la
librairie a utilise est /usr/lib/libgdbm_compat.[l]a.

Pour cela, je pense que le mieux serait de tester l'existence de
gdbm-ndbm.h si ndbm.h n'existe pas, et si on trouve gdbm-ndbm.h, faire
le test " sh ./hasgot -lgdbm_compat dbm_open " avant de mettre dbm_link
a "-lgdbm_compat".

Cela devrait bien marche, mais il y a encore un probleme, et c'est le
fait que otherlibs/dbm/cldbm.c a un include de ndbm.h alors qu'il faut
utiliser gdbm-ndbm.h.

Peux-tu m'envoyer les fichiers config/Makefile et otherlibs/dbm/cldbm.c
(après application de ton patch) qui font que ça compile correctement
sur le nouveau Debian? Je verrai ensuite comment détecter ça à la config.

  • Xavier

@vicuna
Copy link
Author

vicuna commented Jul 8, 2003

Comment author: administrator

On Tue, Jul 08, 2003 at 10:24:44AM +0200, Xavier Leroy wrote:

La version de debian de gdbm utilise avec ocaml est gdbm 1.8.3.

Cette version, a part utilise l'include gdbm-ndbm.h a la place de
ndbm.h, a aussi besoin d'utiliser la librairie libgdbm_compat pour
utiliser les anciennes fonctions de compatibilite dbm et ndbm que ocaml
utilise.

Je râle copieusement sur ces changements gratuits. (Ce n'est pas la
première fois.) Les auteurs de gdbm et les packagers Debian
savent-ils ce que signifie "compatibilité arrière"?

Bof, cela fait des annees que le support ndbm.h dans gdbm etait plutot
obsolet, et avant il fallait mettre un #define en haut du fichier, ce
qui n'est pas mieux. Je doute que j'aille un jour raler aupres du
mainteneur debian de gdbm car il a plutot mauvais caractere, et comme il
est ftp-master et mainteneur du keyring gpg, il faut mieux ne pas etre
en froid avec lui :))). Je pourrait lui en toucher un mot lorsque je le
verrai a debconf dans une semaine a Oslo.

J'ai fait un patch pour le package ocaml, mais il est pas tres propre,
alors peut-etre voudrez vous faire un fix correct pour la future version
ocaml 3.07.

Pour cela, voici les informations qui sont utiles :

le fichier d'include se trouve dans /usr/include/gdbm-ndbm.h et la
librairie a utilise est /usr/lib/libgdbm_compat.[l]a.

Pour cela, je pense que le mieux serait de tester l'existence de
gdbm-ndbm.h si ndbm.h n'existe pas, et si on trouve gdbm-ndbm.h, faire
le test " sh ./hasgot -lgdbm_compat dbm_open " avant de mettre dbm_link
a "-lgdbm_compat".

Cela devrait bien marche, mais il y a encore un probleme, et c'est le
fait que otherlibs/dbm/cldbm.c a un include de ndbm.h alors qu'il faut
utiliser gdbm-ndbm.h.

Peux-tu m'envoyer les fichiers config/Makefile et otherlibs/dbm/cldbm.c
(après application de ton patch) qui font que ça compile correctement
sur le nouveau Debian? Je verrai ensuite comment détecter ça à la config.

Ok, je les attache.

Sinon, j'ai entrepris de rendre plusieurs versions de ocaml installable
parallelement, en utilisant une option -suffix a configure, et en
placant la variable $(SUFFIX) aux bon endroits. Je pense n'avoir manquer
aucun endroit, j'arrive a compiler lablgl, lablgtk et mon application
les utilisant sans probleme (quoi que il semble y avoir un probleme avec
lablgl, mais c'est peut etre du a tcl/tk8.4 ou le snapshot de lundi du
cvs). L'utilisation d'un tel setup pose plutot des problemes pour les
packages autre que ocaml, quoi que mon appli propre a ete tres simple a
modifier (5 lignes dans le config/Makefile.vars). Cela prouve seulement
que la pluspart des applications ocaml ont des systeme de build plutot
cochon.

Je ne suis pas entierement sur que ce soit reellement la bonne voie a
prendre, si les benefices sont suffisant pour contrebalance le cout
engendre, mais est-ce que le cas echeant ce genre de patch pourrait etre
applique a ocaml ? Il faut que je le nettoie un peu encore cependant.

BTW, je pense que d'utiliser ocamlrun- au lieu du simple
ocamlrun est une bonne chose, car de toute facon, ocamlrun est
incompatible d'une version a l'autre.

Amicalement,

Sven Luther


generated by ./configure --with-pthread -prefix /usr -mandir /usr/share/man -tkdefs -I/usr/include/tcl8.3 -tklibs -L/usr/lib -ltk8.3 -ltcl8.3

PREFIX=/usr
BINDIR=$(PREFIX)/bin
LIBDIR=$(PREFIX)/lib/ocaml/3.06
STUBLIBDIR=$(LIBDIR)/stublibs
MANDIR=$(PREFIX)/share/man
MANEXT=1
RANLIB=ranlib
RANLIBCMD=ranlib
SHARPBANGSCRIPTS=true
BIGNUM_ARCH=x86
PTHREAD_LINK=-lpthread
X11_INCLUDES=-I/usr/X11R6/include
X11_LINK=-L/usr/X11R6/lib -lX11
DBM_INCLUDES=
DBM_LINK=-lgdbm_compat
TK_DEFS=-I/usr/include/tcl8.3 $(X11_INCLUDES)
TK_LINK=-L/usr/lib -ltk8.3 -ltcl8.3 -ldl $(X11_LINK)
BYTECC=gcc
BYTECCCOMPOPTS=-fno-defer-pop -Wall -Wno-unused -D_FILE_OFFSET_BITS=64 -D_REENTRANT
BYTECCLINKOPTS= -Wl,-E
BYTECCLIBS= -lm -ldl -lcurses -lpthread
BYTECCRPATH=-Wl,-rpath,
EXE=
SUPPORTS_SHARED_LIBRARIES=true
SHAREDCCCOMPOPTS=-fPIC
MKSHAREDLIB=gcc -shared -o
MKSHAREDLIBRPATH=-Wl,-rpath,
ARCH=i386
MODEL=default
SYSTEM=linux_elf
NATIVECC=gcc
NATIVECCCOMPOPTS=-Wall -Wno-unused -D_FILE_OFFSET_BITS=64 -D_REENTRANT
NATIVECCPROFOPTS=-Wall -Wno-unused -D_FILE_OFFSET_BITS=64 -D_REENTRANT
NATIVECCLINKOPTS=
NATIVECCRPATH=-Wl,-rpath,
NATIVECCLIBS= -lm -ldl
ASFLAGS=
ASPP=gcc
ASPPFLAGS=-c -DSYS_$(SYSTEM)
ASPPPROFFLAGS=-DPROFILING
PROFILING=prof
BINUTILS_OBJCOPY=/usr/bin/objcopy
BINUTILS_NM=/usr/bin/nm
DYNLINKOPTS=-ldl
OTHERLIBRARIES=unix str num dynlink bigarray systhreads graph dbm labltk
DEBUGGER=ocamldebugger


//
/* /
/
Objective Caml /
/
/
/
Francois Rouaix, projet Cristal, INRIA Rocquencourt /
/
/
/
Copyright 1996 Institut National de Recherche en Informatique et /
/
en Automatique. All rights reserved. This file is distributed /
/
under the terms of the GNU Library General Public License, with /
/
the special exception on linking described in file ../../LICENSE. /
/
*/
/
/

/* $Id: cldbm.c,v 1.7 2001/12/07 13:39:51 xleroy Exp $ */

#include <string.h>
#include <fcntl.h>
#include <gdbm-ndbm.h>
#include <mlvalues.h>
#include <alloc.h>
#include <memory.h>
#include <fail.h>
#include <callback.h>

/* Quite close to sys_open_flags, but we need RDWR */
static int dbm_open_flags[] = {
O_RDONLY, O_WRONLY, O_RDWR, O_CREAT
};

static void raise_dbm (char *errmsg) Noreturn;

static void raise_dbm(char *errmsg)
{
static value * dbm_exn = NULL;
if (dbm_exn == NULL)
dbm_exn = caml_named_value("dbmerror");
raise_with_string(*dbm_exn, errmsg);
}

#define DBM_val(v) *((DBM **) &Field(v, 0))

static value alloc_dbm(DBM * db)
{
value res = alloc_small(1, Abstract_tag);
DBM_val(res) = db;
return res;
}

static DBM * extract_dbm(value vdb)
{
if (DBM_val(vdb) == NULL) raise_dbm("DBM has been closed");
return DBM_val(vdb);
}

/* Dbm.open : string -> Sys.open_flag list -> int -> t /
value caml_dbm_open(value vfile, value vflags, value vmode) /
ML */
{
char *file = String_val(vfile);
int flags = convert_flag_list(vflags, dbm_open_flags);
int mode = Int_val(vmode);
DBM *db = dbm_open(file,flags,mode);

if (db == NULL)
raise_dbm("Can't open file");
else
return (alloc_dbm(db));
}

/* Dbm.close: t -> unit /
value caml_dbm_close(value vdb) /
ML */
{
dbm_close(extract_dbm(vdb));
DBM_val(vdb) = NULL;
return Val_unit;
}

/* Dbm.fetch: t -> string -> string /
value caml_dbm_fetch(value vdb, value vkey) /
ML */
{
datum key,answer;
key.dptr = String_val(vkey);
key.dsize = string_length(vkey);
answer = dbm_fetch(extract_dbm(vdb), key);
if (answer.dptr) {
value res = alloc_string(answer.dsize);
memmove (String_val (res), answer.dptr, answer.dsize);
return res;
}
else raise_not_found();
}

value caml_dbm_insert(value vdb, value vkey, value vcontent) /* ML */
{
datum key, content;

key.dptr = String_val(vkey);
key.dsize = string_length(vkey);
content.dptr = String_val(vcontent);
content.dsize = string_length(vcontent);

switch(dbm_store(extract_dbm(vdb), key, content, DBM_INSERT)) {
case 0:
return Val_unit;
case 1: /* DBM_INSERT and already existing */
raise_dbm("Entry already exists");
default:
raise_dbm("dbm_store failed");
}
}

value caml_dbm_replace(value vdb, value vkey, value vcontent) /* ML */
{
datum key, content;

key.dptr = String_val(vkey);
key.dsize = string_length(vkey);
content.dptr = String_val(vcontent);
content.dsize = string_length(vcontent);

switch(dbm_store(extract_dbm(vdb), key, content, DBM_REPLACE)) {
case 0:
return Val_unit;
default:
raise_dbm("dbm_store failed");
}
}

value caml_dbm_delete(value vdb, value vkey) /* ML */
{
datum key;
key.dptr = String_val(vkey);
key.dsize = string_length(vkey);

if (dbm_delete(extract_dbm(vdb), key) < 0)
raise_dbm("dbm_delete");
else return Val_unit;
}

value caml_dbm_firstkey(value vdb) /* ML */
{
datum key = dbm_firstkey(extract_dbm(vdb));

if (key.dptr) {
value res = alloc_string(key.dsize);
memmove (String_val (res), key.dptr, key.dsize);
return res;
}
else raise_not_found();
}

value caml_dbm_nextkey(value vdb) /* ML */
{
datum key = dbm_nextkey(extract_dbm(vdb));

if (key.dptr) {
value res = alloc_string(key.dsize);
memmove (String_val (res), key.dptr, key.dsize);
return res;
}
else raise_not_found();
}



@vicuna
Copy link
Author

vicuna commented Jul 8, 2003

Comment author: administrator

Hopefully fixed 2003-07-08 by XL

@vicuna vicuna closed this as completed Jul 8, 2003
@vicuna vicuna added the bug label Mar 19, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant