mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-01 04:10:18 +02:00
197 lines
6.5 KiB
Scheme
197 lines
6.5 KiB
Scheme
;;;; Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc.
|
|
;;;;
|
|
;;;; This library is free software; you can redistribute it and/or
|
|
;;;; modify it under the terms of the GNU Lesser General Public
|
|
;;;; License as published by the Free Software Foundation; either
|
|
;;;; version 2.1 of the License, or (at your option) any later version.
|
|
;;;;
|
|
;;;; This library is distributed in the hope that it will be useful,
|
|
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
;;;; Lesser General Public License for more details.
|
|
;;;;
|
|
;;;; You should have received a copy of the GNU Lesser General Public
|
|
;;;; License along with this library; if not, write to the Free Software
|
|
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
;;;;
|
|
|
|
;;;; Deprecated definitions.
|
|
|
|
(define substring-move-left! substring-move!)
|
|
(define substring-move-right! substring-move!)
|
|
|
|
;; This method of dynamically linking Guile Extensions is deprecated.
|
|
;; Use `load-extension' explicitly from Scheme code instead.
|
|
|
|
(define (split-c-module-name str)
|
|
(let loop ((rev '())
|
|
(start 0)
|
|
(pos 0)
|
|
(end (string-length str)))
|
|
(cond
|
|
((= pos end)
|
|
(reverse (cons (string->symbol (substring str start pos)) rev)))
|
|
((eq? (string-ref str pos) #\space)
|
|
(loop (cons (string->symbol (substring str start pos)) rev)
|
|
(+ pos 1)
|
|
(+ pos 1)
|
|
end))
|
|
(else
|
|
(loop rev start (+ pos 1) end)))))
|
|
|
|
(define (convert-c-registered-modules dynobj)
|
|
(let ((res (map (lambda (c)
|
|
(list (split-c-module-name (car c)) (cdr c) dynobj))
|
|
(c-registered-modules))))
|
|
(c-clear-registered-modules)
|
|
res))
|
|
|
|
(define registered-modules '())
|
|
|
|
(define (register-modules dynobj)
|
|
(set! registered-modules
|
|
(append! (convert-c-registered-modules dynobj)
|
|
registered-modules)))
|
|
|
|
(define (warn-autoload-deprecation modname)
|
|
(issue-deprecation-warning
|
|
"Autoloading of compiled code modules is deprecated."
|
|
"Write a Scheme file instead that uses `load-extension'.")
|
|
(issue-deprecation-warning
|
|
(simple-format #f "(You just autoloaded module ~S.)" modname)))
|
|
|
|
(define (init-dynamic-module modname)
|
|
;; Register any linked modules which have been registered on the C level
|
|
(register-modules #f)
|
|
(or-map (lambda (modinfo)
|
|
(if (equal? (car modinfo) modname)
|
|
(begin
|
|
(warn-autoload-deprecation modname)
|
|
(set! registered-modules (delq! modinfo registered-modules))
|
|
(let ((mod (resolve-module modname #f)))
|
|
(save-module-excursion
|
|
(lambda ()
|
|
(set-current-module mod)
|
|
(set-module-public-interface! mod mod)
|
|
(dynamic-call (cadr modinfo) (caddr modinfo))
|
|
))
|
|
#t))
|
|
#f))
|
|
registered-modules))
|
|
|
|
(define (dynamic-maybe-call name dynobj)
|
|
(catch #t ; could use false-if-exception here
|
|
(lambda ()
|
|
(dynamic-call name dynobj))
|
|
(lambda args
|
|
#f)))
|
|
|
|
(define (dynamic-maybe-link filename)
|
|
(catch #t ; could use false-if-exception here
|
|
(lambda ()
|
|
(dynamic-link filename))
|
|
(lambda args
|
|
#f)))
|
|
|
|
(define (find-and-link-dynamic-module module-name)
|
|
(define (make-init-name mod-name)
|
|
(string-append "scm_init"
|
|
(list->string (map (lambda (c)
|
|
(if (or (char-alphabetic? c)
|
|
(char-numeric? c))
|
|
c
|
|
#\_))
|
|
(string->list mod-name)))
|
|
"_module"))
|
|
|
|
;; Put the subdirectory for this module in the car of SUBDIR-AND-LIBNAME,
|
|
;; and the `libname' (the name of the module prepended by `lib') in the cdr
|
|
;; field. For example, if MODULE-NAME is the list (inet tcp-ip udp), then
|
|
;; SUBDIR-AND-LIBNAME will be the pair ("inet/tcp-ip" . "libudp").
|
|
(let ((subdir-and-libname
|
|
(let loop ((dirs "")
|
|
(syms module-name))
|
|
(if (null? (cdr syms))
|
|
(cons dirs (string-append "lib" (symbol->string (car syms))))
|
|
(loop (string-append dirs (symbol->string (car syms)) "/")
|
|
(cdr syms)))))
|
|
(init (make-init-name (apply string-append
|
|
(map (lambda (s)
|
|
(string-append "_"
|
|
(symbol->string s)))
|
|
module-name)))))
|
|
(let ((subdir (car subdir-and-libname))
|
|
(libname (cdr subdir-and-libname)))
|
|
|
|
;; Now look in each dir in %LOAD-PATH for `subdir/libfoo.la'. If that
|
|
;; file exists, fetch the dlname from that file and attempt to link
|
|
;; against it. If `subdir/libfoo.la' does not exist, or does not seem
|
|
;; to name any shared library, look for `subdir/libfoo.so' instead and
|
|
;; link against that.
|
|
(let check-dirs ((dir-list %load-path))
|
|
(if (null? dir-list)
|
|
#f
|
|
(let* ((dir (in-vicinity (car dir-list) subdir))
|
|
(sharlib-full
|
|
(or (try-using-libtool-name dir libname)
|
|
(try-using-sharlib-name dir libname))))
|
|
(if (and sharlib-full (file-exists? sharlib-full))
|
|
(link-dynamic-module sharlib-full init)
|
|
(check-dirs (cdr dir-list)))))))))
|
|
|
|
(define (try-using-libtool-name libdir libname)
|
|
(let ((libtool-filename (in-vicinity libdir
|
|
(string-append libname ".la"))))
|
|
(and (file-exists? libtool-filename)
|
|
libtool-filename)))
|
|
|
|
(define (try-using-sharlib-name libdir libname)
|
|
(in-vicinity libdir (string-append libname ".so")))
|
|
|
|
(define (link-dynamic-module filename initname)
|
|
;; Register any linked modules which have been registered on the C level
|
|
(register-modules #f)
|
|
(let ((dynobj (dynamic-link filename)))
|
|
(dynamic-call initname dynobj)
|
|
(register-modules dynobj)))
|
|
|
|
(define (try-module-linked module-name)
|
|
(init-dynamic-module module-name))
|
|
|
|
(define (try-module-dynamic-link module-name)
|
|
(and (find-and-link-dynamic-module module-name)
|
|
(init-dynamic-module module-name)))
|
|
|
|
(define (list* . args)
|
|
(issue-deprecation-warning "'list*' is deprecated. Use 'cons*' instead.")
|
|
(apply cons* args))
|
|
|
|
;; The strange prototype system for uniform arrays has been
|
|
;; deprecated.
|
|
|
|
(define uniform-vector-fill! array-fill!)
|
|
|
|
(define make-uniform-vector dimensions->uniform-array)
|
|
|
|
(define (make-uniform-array prot . bounds)
|
|
(dimensions->uniform-array bounds prot))
|
|
|
|
(define (list->uniform-vector prot lst)
|
|
(list->uniform-array 1 prot lst))
|
|
|
|
(define-macro (eval-case . clauses)
|
|
(issue-deprecation-warning
|
|
"`eval-case' is deprecated. Use `eval-when' instead.")
|
|
;; Practically speaking, eval-case only had load-toplevel and else as
|
|
;; conditions.
|
|
(cond
|
|
((assoc-ref clauses '(load-toplevel))
|
|
=> (lambda (exps)
|
|
;; the *unspecified so that non-toplevel definitions will be
|
|
;; caught
|
|
`(begin *unspecified* . ,exps)))
|
|
((assoc-ref clauses 'else)
|
|
=> (lambda (exps)
|
|
`(begin *unspecified* . ,exps)))
|
|
(else
|
|
`(begin))))
|