0

The OpenGL library for Chez Scheme (currently only setup for Linux) loads the GLUT library as follows:

(define no-op (load-shared-object "libglut.so.3"))

Here's a link to that code.

Of course, we'd like the library to load libglut.so.3 on Linux but GLUT.framework/GLUT on macOS.

Here's an example of how Ypsilon Scheme loads libraries based on the platform:

(define libGLUT
  (cond
    (on-darwin  (load-shared-object "GLUT.framework/GLUT"))
    (on-windows (load-shared-object "glut32.dll"))
    (on-linux   (load-shared-object "libglut.so.3"))
    (on-freebsd (load-shared-object "libglut.so"))
    (on-openbsd (begin
             (load-shared-object "libXmu.so.10.0")
             (load-shared-object "libGLU.so.7.0")
             (load-shared-object "libglut.so.3.7")))
    (else
     (assertion-violation
      #f
          "can not locate GLUT library, unknown operating system"))))

What's a good way to check the platform on Chez Scheme so that we can do something similar in our bindings for foreign libraries?

kristianp
  • 5,496
  • 37
  • 56
dharmatech
  • 8,979
  • 8
  • 42
  • 88

2 Answers2

2

From https://github.com/cisco/ChezScheme/blob/master/examples/socket.ss:

(case (machine-type)
  [(i3le ti3le) (load-shared-object "libc.so.6")]
  [(i3osx ti3osx a6osx ta6osx) (load-shared-object "libc.dylib")]
  [else (load-shared-object "libc.so")])

Using meta-cond instead will give you slightly more efficient run-time behavior, since it will be resolved at compile time.

1

How about (machine-type) ?

~ % uname -m -p -r -s
Darwin 15.6.0 x86_64 i386
~ % chez
Chez Scheme Version 9.4.1
Copyright 1984-2016 Cisco Systems, Inc.

> (machine-type)
ta6osx
Carl
  • 31
  • 4