Can't recursively search DLLs with FFI on Cygwin

* doc/ref/api-foreign.text (dynamic-link): document problems with recursive DLLs.
* test-suite/standalone/test-ffi (global): with Cygwin, dynamic-link C library explicitly
* test-suite/standalone/test-foreign-object-scm (libc-ptr): with Cygwin, link C library explicitly
* test-suite/tests/foreign.test (qsort): with Cygwin, link C library explicitly
This commit is contained in:
Mike Gran 2017-03-05 12:26:57 -08:00
commit 4ce31fd387
4 changed files with 40 additions and 7 deletions

View file

@ -3,7 +3,7 @@ exec guile -q -s "$0" "$@"
!#
;;; test-ffi --- Foreign function interface. -*- Scheme -*-
;;;
;;; Copyright (C) 2010 Free Software Foundation, Inc.
;;; Copyright (C) 2010, 2017 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
@ -263,7 +263,15 @@ exec guile -q -s "$0" "$@"
(if (defined? 'setlocale)
(setlocale LC_ALL "C"))
(define global (dynamic-link))
(define global (cond
((string-contains %host-type "cygwin")
;; On Cygwin, dynamic-link doesn't search recursively
;; into linked DLLs. Thus one needs to link to the core
;; C library DLL explicitly.
(dynamic-link "cygwin1"))
(else
(dynamic-link))))
(define strerror
(pointer->procedure '* (dynamic-func "strerror" global)

View file

@ -3,7 +3,7 @@ exec guile -q -s "$0" "$@"
!#
;;; test-foreign-object-scm --- Foreign object interface. -*- Scheme -*-
;;;
;;; Copyright (C) 2014 Free Software Foundation, Inc.
;;; Copyright (C) 2014, 2017 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
@ -26,7 +26,17 @@ exec guile -q -s "$0" "$@"
(define (libc-ptr name)
(catch #t
(lambda () (dynamic-pointer name (dynamic-link)))
(lambda ()
(dynamic-pointer name
(cond
((string-contains %host-type "cygwin")
;; On Cygwin, dynamic-link does not search
;; recursively into linked DLLs. Thus, one
;; needs to link to the core C library DLL
;; explicitly.
(dynamic-link "cygwin1"))
(else
(dynamic-link)))))
(lambda (k . args)
(print-exception (current-error-port) #f k args)
(write "Skipping test.\n" (current-error-port))