racket/racket/collects/openssl/libcrypto.rkt
Matthew Flatt 710320e3dc "Mac OS X" -> "Mac OS"
Although "macOS" is the correct name for Apple's current desktop OS,
we've decided to go with "Mac OS" to cover all of Apple's Unix-like
desktop OS versions. The label "Mac OS" is more readable, clear in
context (i.e., unlikely to be confused with the Mac OSes that
proceeded Mac OS X), and as likely to match Apple's future OS names
as anything.
2016-12-23 12:18:36 -07:00

60 lines
2.2 KiB
Racket

#lang racket/base
(require ffi/unsafe
racket/runtime-path
setup/cross-system
(for-syntax racket/base
setup/cross-system))
(provide libcrypto
libcrypto-load-fail-reason
openssl-lib-versions)
;; Notes on shared library versions when provided by OS
;; ie, VERSION s.t. OS provides "lib{crypto,ssl}.{so,dylib}.$VERSION"
;;
;; - Debian and Ubuntu use a few fixed library versions even though
;; actual OpenSSL version changes:
;; - Debian squeeze: lib{crypto,ssl}.so.0.9.8
;; - Debian {wheezy, jessie, stretch, sid}: lib{crypto,ssl}.so.1.0.0
;; - Ubuntu {14.04, 14.10, 15.04}: lib{crypto,ssl}.so.1.0.0
;; - Debian and Ubuntu also provide versionless library in pkg "libssl-dev"
;; - Fedora provides libraries suffixed with actual versions (eg
;; 1.0.1k) as well as a simply-versioned symlink (eg libssl.so.10):
;; - Fedora {19, 20}: lib{crypto,ssl}.so.1.0.1e, also lib{crypto,ssl}.so.10
;; - Fedora 21: lib{crypto,ssl}.so.1.0.1j, also lib{crypto,ssl}.so.10
;; - Fedora 22: lib{crypto,ssl}.so.1.0.1k, also lib{crypto,ssl}.so.10
;; - Fedora also provides a versionless library in pkg "openssl-devel"
;; - Mac OS includes 0.9.8, 0.9.7, and versionless
(define openssl-lib-versions
'(;; Versionless (eg from devel pkg)
""
;; Compatibility-based version / SONAME
"10" ;; Fedora
"1.0.0" ;; Debian, Ubuntu
;; Other specific known versions
"1.0.1k" "1.0.1j" "1.0.1g" "1.0.1e"
"1.0" "1.0.0" "1.0.0e" "1.0.0d" "1.0.0c" "1.0.0b" "1.0.0a"
"0.9.8e" "0.9.8b" "0.9.8" "0.9.7"))
(define libcrypto-load-fail-reason #f)
;; We need to declare because they might be distributed with Racket,
;; in which case they should get bundled with stand-alone executables:
(define-runtime-path libcrypto-so
#:runtime?-id runtime?
(case (if runtime? (system-type) (cross-system-type))
[(windows) '(so "libeay32")]
[(macosx)
;; Version "1.0.0" is bundled with Racket
'(so "libcrypto" ("1.0.0" #f))]
[else '(so "libcrypto")]))
(define libcrypto
(with-handlers ([exn:fail? (lambda (x)
(set! libcrypto-load-fail-reason (exn-message x))
#f)])
(ffi-lib libcrypto-so openssl-lib-versions)))