/racket-5-0-2-bin-i386-osx-mac-dmg/collects/sgl/make-gl-info.rkt

http://github.com/smorin/f4f.arc · Racket · 178 lines · 161 code · 16 blank · 1 comment · 10 complexity · 6055856dd1a212d9e61fd315b429a44b MD5 · raw file

  1. #lang mzscheme
  2. (require (prefix dynext: dynext/compile)
  3. dynext/file
  4. (prefix dynext: dynext/link)
  5. mzlib/file
  6. setup/dirs
  7. launcher
  8. srfi/13/string)
  9. (provide make-gl-info)
  10. (define c-file #<<end-string
  11. #include <escheme.h>
  12. #include <GL/gl.h>
  13. #include <GL/glu.h>
  14. Scheme_Object *scheme_reload(Scheme_Env *env)
  15. {
  16. Scheme_Env *mod_env;
  17. mod_env = scheme_primitive_module(scheme_intern_symbol("make-gl-info-helper"), env);
  18. scheme_add_global("gl-byte-size",
  19. scheme_make_integer_value(sizeof(GLbyte)),
  20. mod_env);
  21. scheme_add_global("gl-ubyte-size",
  22. scheme_make_integer_value(sizeof(GLubyte)),
  23. mod_env);
  24. scheme_add_global("gl-short-size",
  25. scheme_make_integer_value(sizeof(GLshort)),
  26. mod_env);
  27. scheme_add_global("gl-ushort-size",
  28. scheme_make_integer_value(sizeof(GLushort)),
  29. mod_env);
  30. scheme_add_global("gl-int-size",
  31. scheme_make_integer_value(sizeof(GLint)),
  32. mod_env);
  33. scheme_add_global("gl-uint-size",
  34. scheme_make_integer_value(sizeof(GLuint)),
  35. mod_env);
  36. scheme_add_global("gl-float-size",
  37. scheme_make_integer_value(sizeof(GLfloat)),
  38. mod_env);
  39. scheme_add_global("gl-double-size",
  40. scheme_make_integer_value(sizeof(GLdouble)),
  41. mod_env);
  42. scheme_add_global("gl-boolean-size",
  43. scheme_make_integer_value(sizeof(GLboolean)),
  44. mod_env);
  45. scheme_add_global("gl-sizei-size",
  46. scheme_make_integer_value(sizeof(GLsizei)),
  47. mod_env);
  48. scheme_add_global("gl-clampf-size",
  49. scheme_make_integer_value(sizeof(GLclampf)),
  50. mod_env);
  51. scheme_add_global("gl-clampd-size",
  52. scheme_make_integer_value(sizeof(GLclampd)),
  53. mod_env);
  54. scheme_add_global("gl-enum-size",
  55. scheme_make_integer_value(sizeof(GLenum)),
  56. mod_env);
  57. scheme_add_global("gl-bitfield-size",
  58. scheme_make_integer_value(sizeof(GLbitfield)),
  59. mod_env);
  60. scheme_finish_primitive_module(mod_env);
  61. return scheme_void;
  62. }
  63. Scheme_Object *scheme_initialize(Scheme_Env *env)
  64. {
  65. return scheme_reload(env);
  66. }
  67. Scheme_Object *scheme_module_name(void)
  68. {
  69. return scheme_intern_symbol("make-gl-info-helper");
  70. }
  71. end-string
  72. )
  73. (define (delete/continue x)
  74. (with-handlers ([exn:fail:filesystem? void])
  75. (delete-file x)))
  76. (define (parse-includes s)
  77. (map (lambda (s) (substring s 2 (string-length s)))
  78. (string-tokenize s)))
  79. (define (get-args which-arg)
  80. (let ([fp (build-path (find-lib-dir) "buildinfo")])
  81. (if (file-exists? fp)
  82. (call-with-input-file fp
  83. (lambda (i)
  84. (let loop ([l (read-line i)])
  85. (if (eof-object? l)
  86. ""
  87. (let ([m (regexp-match (format "^~a=(.*)$" which-arg) l)])
  88. (if m
  89. (cadr m)
  90. (loop (read-line i))))))))
  91. "")))
  92. (define (compile-c-to-so file file.c file.so)
  93. (let ([file.o (append-object-suffix file)])
  94. (dynext:compile-extension #f file.c file.o
  95. `(,@(parse-includes (get-args "X_CFLAGS"))
  96. ,(collection-path "compiler")))
  97. (dynext:link-extension #f (list file.o) file.so)
  98. (delete/continue file.o)))
  99. (define (build-helper compile-directory variant)
  100. (let* ([file "make-gl-info-helper.rkt"]
  101. [c (build-path compile-directory (append-c-suffix file))]
  102. [so (build-path compile-directory "native"
  103. (system-library-subpath variant)
  104. (append-extension-suffix file))])
  105. (make-directory* (build-path compile-directory "native"
  106. (system-library-subpath variant)))
  107. (with-output-to-file c (lambda () (display c-file)) 'replace)
  108. (compile-c-to-so file c so)))
  109. (define (effective-system-type)
  110. (let ([t (system-type)])
  111. (if (not (eq? t 'unix))
  112. t
  113. ;; Check "buildinfo" for USE_GL flag:
  114. (let ([buildinfo (build-path (find-lib-dir) "buildinfo")])
  115. (if (not (file-exists? buildinfo))
  116. (begin (printf "WARNING: buildinfo file missing: ~a\n" buildinfo)
  117. t)
  118. (with-input-from-file buildinfo
  119. (lambda ()
  120. (if (regexp-match? #rx"-DUSE_GL" (current-input-port))
  121. t
  122. (begin (printf "WARNING: no GL support\n")
  123. 'no-gl)))))))))
  124. (define (make-gl-info compile-directory)
  125. (let ([zo (build-path compile-directory (append-zo-suffix "gl-info.rkt"))]
  126. [mod
  127. (compile
  128. (case (effective-system-type)
  129. [(macosx windows no-gl)
  130. `(,#'module gl-info mzscheme
  131. (provide (all-defined))
  132. (define gl-byte-size 1)
  133. (define gl-ubyte-size 1)
  134. (define gl-short-size 2)
  135. (define gl-ushort-size 2)
  136. (define gl-int-size 4)
  137. (define gl-uint-size 4)
  138. (define gl-boolean-size 1)
  139. (define gl-sizei-size 4)
  140. (define gl-bitfield-size 4)
  141. (define gl-enum-size 4)
  142. (define gl-float-size 4)
  143. (define gl-double-size 8)
  144. (define gl-clampf-size 4)
  145. (define gl-clampd-size 8))]
  146. [else
  147. (for-each (lambda (variant)
  148. (parameterize ([dynext:link-variant variant])
  149. (build-helper compile-directory variant)))
  150. (available-mzscheme-variants))
  151. `(,#'module gl-info mzscheme
  152. (provide (all-defined))
  153. ,@(map
  154. (lambda (x)
  155. `(define ,x ,(dynamic-require 'sgl/make-gl-info-helper x)))
  156. '(gl-byte-size gl-ubyte-size gl-short-size gl-ushort-size
  157. gl-int-size gl-uint-size gl-boolean-size gl-sizei-size
  158. gl-bitfield-size gl-enum-size gl-float-size gl-double-size
  159. gl-clampf-size gl-clampd-size)))]))])
  160. (with-output-to-file zo
  161. (lambda () (write mod))
  162. 'replace)))