PageRenderTime 41ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/racket-5-0-2-bin-i386-osx-mac-dmg/collects/setup/dirs.rkt

http://github.com/smorin/f4f.arc
Racket | 208 lines | 168 code | 21 blank | 19 comment | 36 complexity | ebf6aabbca82fb5619ef4b7d9b954aea MD5 | raw file
Possible License(s): LGPL-2.0
  1. #lang racket/base
  2. (require racket/promise
  3. (prefix-in config: config)
  4. compiler/private/winutf16
  5. compiler/private/mach-o
  6. "private/main-collects.ss")
  7. (provide (rename-out [config:absolute-installation? absolute-installation?]))
  8. ;; ----------------------------------------
  9. ;; "collects"
  10. (define main-collects-dir
  11. (delay (find-main-collects)))
  12. (provide find-collects-dir
  13. find-user-collects-dir
  14. get-collects-search-dirs)
  15. (define (find-collects-dir)
  16. (force main-collects-dir))
  17. (define user-collects-dir
  18. (delay (build-path (system-path* 'addon-dir) (version) "collects")))
  19. (define (find-user-collects-dir)
  20. (force user-collects-dir))
  21. (define (get-collects-search-dirs)
  22. (current-library-collection-paths))
  23. ;; ----------------------------------------
  24. ;; Helpers
  25. (define (single p) (if p (list p) null))
  26. (define (extra a l) (if (and a (not (member a l))) (cons a l) l))
  27. (define (combine-search l default)
  28. ;; Replace #f in list with default path:
  29. (if l
  30. (let loop ([l l])
  31. (cond
  32. [(null? l) null]
  33. [(not (car l)) (append default (loop (cdr l)))]
  34. [else (cons (car l) (loop (cdr l)))]))
  35. default))
  36. (define (cons-user u r)
  37. (if (use-user-specific-search-paths) (cons u r) r))
  38. (define-syntax define-finder
  39. (syntax-rules ()
  40. [(_ provide config:id id user-id config:search-id search-id default)
  41. (begin
  42. (define-finder provide config:id id user-id default)
  43. (provide search-id)
  44. (define (search-id)
  45. (combine-search (force config:search-id)
  46. (cons-user (user-id) (single (id))))))]
  47. [(_ provide config:id id user-id config:search-id search-id
  48. extra-search-dir default)
  49. (begin
  50. (define-finder provide config:id id user-id default)
  51. (provide search-id)
  52. (define (search-id)
  53. (combine-search (force config:search-id)
  54. (extra (extra-search-dir)
  55. (cons-user (user-id) (single (id)))))))]
  56. [(_ provide config:id id user-id default)
  57. (begin
  58. (provide id user-id)
  59. (define dir
  60. (delay
  61. (or (force config:id)
  62. (let ([p (find-collects-dir)])
  63. (and p (simplify-path (build-path p 'up default)))))))
  64. (define (id)
  65. (force dir))
  66. (define user-dir
  67. (delay (build-path (system-path* 'addon-dir) (version) default)))
  68. (define (user-id)
  69. (force user-dir)))]))
  70. (define-syntax no-provide (syntax-rules () [(_ . rest) (begin)]))
  71. ;; ----------------------------------------
  72. ;; "doc"
  73. (define delayed-#f (delay #f))
  74. (provide find-doc-dir
  75. find-user-doc-dir
  76. get-doc-search-dirs)
  77. (define-finder no-provide
  78. config:doc-dir
  79. find-doc-dir
  80. find-user-doc-dir
  81. delayed-#f
  82. get-new-doc-search-dirs
  83. "doc")
  84. ;; For now, include "doc" pseudo-collections in search path:
  85. (define (get-doc-search-dirs)
  86. (combine-search (force config:doc-search-dirs)
  87. (append (get-new-doc-search-dirs)
  88. (map (lambda (p) (build-path p "doc"))
  89. (current-library-collection-paths)))))
  90. ;; ----------------------------------------
  91. ;; "include"
  92. (define-finder provide
  93. config:include-dir
  94. find-include-dir
  95. find-user-include-dir
  96. config:include-search-dirs
  97. get-include-search-dirs
  98. "include")
  99. ;; ----------------------------------------
  100. ;; "lib"
  101. (define-finder provide
  102. config:lib-dir
  103. find-lib-dir
  104. find-user-lib-dir
  105. config:lib-search-dirs
  106. get-lib-search-dirs find-dll-dir
  107. "lib")
  108. ;; ----------------------------------------
  109. ;; Executables
  110. (define-finder provide
  111. config:bin-dir
  112. find-console-bin-dir
  113. find-user-console-bin-dir
  114. (case (system-type)
  115. [(windows) 'same]
  116. [(macosx unix) "bin"]))
  117. (define-finder provide
  118. config:bin-dir
  119. find-gui-bin-dir
  120. find-user-gui-bin-dir
  121. (case (system-type)
  122. [(windows macosx) 'same]
  123. [(unix) "bin"]))
  124. ;; ----------------------------------------
  125. ;; DLLs
  126. (provide find-dll-dir)
  127. (define dll-dir
  128. (delay
  129. (case (system-type)
  130. [(windows)
  131. ;; Extract "lib" location from binary:
  132. (let ([exe (parameterize ([current-directory (system-path* 'orig-dir)])
  133. (find-executable-path (find-system-path 'exec-file)))])
  134. (with-input-from-file exe
  135. (lambda ()
  136. (let ([m (regexp-match (byte-regexp
  137. (bytes-append
  138. (bytes->utf-16-bytes #"dLl dIRECTORy:")
  139. #"((?:..)*?)\0\0"))
  140. (current-input-port))])
  141. (unless m
  142. (error "cannot find \"dLl dIRECTORy\" tag in binary"))
  143. (let-values ([(dir name dir?) (split-path exe)])
  144. (if (regexp-match #rx#"^<" (cadr m))
  145. ;; no DLL dir in binary
  146. #f
  147. ;; resolve relative directory:
  148. (let ([p (bytes->path (utf-16-bytes->bytes (cadr m)))])
  149. (path->complete-path p dir))))))))]
  150. [(macosx)
  151. (let* ([exe (parameterize ([current-directory (system-path* 'orig-dir)])
  152. (let loop ([p (find-executable-path
  153. (find-system-path 'exec-file))])
  154. (if (link-exists? p)
  155. (loop (let-values ([(r) (resolve-path p)]
  156. [(dir name dir?) (split-path p)])
  157. (if (and (path? dir)
  158. (relative-path? r))
  159. (build-path dir r)
  160. r)))
  161. p)))]
  162. [rel (get/set-dylib-path exe "Racket" #f)])
  163. (cond
  164. [(not rel) #f] ; no framework reference found!?
  165. [(regexp-match
  166. #rx#"^(@executable_path/)?(.*?)G?Racket.framework"
  167. rel)
  168. => (lambda (m)
  169. (let ([b (caddr m)])
  170. (if (and (not (cadr m)) (bytes=? b #""))
  171. #f ; no path in exe
  172. (simplify-path
  173. (path->complete-path
  174. (if (not (cadr m))
  175. (bytes->path b)
  176. (let-values ([(dir name dir?) (split-path exe)])
  177. (if (bytes=? b #"")
  178. dir
  179. (build-path dir (bytes->path b)))))
  180. (system-path* 'orig-dir))))))]
  181. [else (find-lib-dir)]))]
  182. [else
  183. (if (eq? 'shared (system-type 'link))
  184. (or (force config:dll-dir) (find-lib-dir))
  185. #f)])))
  186. (define (find-dll-dir)
  187. (force dll-dir))