1 ! Copyright (C) 2013 John Benediktsson
2 ! See https://factorcode.org/license.txt for BSD license
4 USING: accessors alien.c-types alien.libraries.finder
5 alien.syntax arrays assocs combinators environment io.files
6 io.files.info io.pathnames kernel make math.order namespaces
7 sequences splitting system system-info ;
9 IN: alien.libraries.finder.macosx
13 TUPLE: framework-info location name shortname version suffix ;
15 : make-framework-info ( filename -- info/f )
16 [ framework-info new ] dip
17 "/" split dup [ ".framework" tail? ] find drop [
19 [ "/" join ] bi@ [ >>location ] [ >>name ] bi*
21 rest dup ?first "Versions" = [
23 unclip swap [ >>version ] dip
25 ] when ?first "_" split1 [ >>shortname ] [ >>suffix ] bi*
27 ] [ drop ] if* dup shortname>> empty? [ drop f ] when ;
29 CONSTANT: default-framework-fallback {
30 "~/Library/Frameworks"
32 "/Network/Library/Frameworks"
33 "/System/Library/Frameworks"
36 CONSTANT: default-library-fallback {
43 SYMBOL: dyld-environment
45 : dyld-env ( name -- seq )
46 dyld-environment get [ at ] [ os-env ] if* ;
48 : dyld-paths ( name -- seq )
49 dyld-env [ ":" split ] [ f ] if* ;
51 : paths% ( name seq -- )
52 [ prepend-path , ] with each ;
54 : dyld-override-search ( name -- seq )
56 dup make-framework-info [
57 name>> "DYLD_FRAMEWORK_PATH" dyld-paths paths%
60 file-name "DYLD_LIBRARY_PATH" dyld-paths paths%
63 SYMBOL: dyld-executable-path
65 : dyld-executable-path-search ( name -- seq )
66 "@executable_path/" ?head dyld-executable-path get and [
67 dyld-executable-path get prepend-path
72 :: dyld-default-search ( name -- seq )
73 name make-framework-info :> framework
74 name file-name :> basename
75 "DYLD_FALLBACK_FRAMEWORK_PATH" dyld-paths :> fallback-framework-path
76 "DYLD_FALLBACK_LIBRARY_PATH" dyld-paths :> fallback-library-path
81 name>> fallback-framework-path paths%
84 basename fallback-library-path paths%
86 framework fallback-framework-path empty? and [
87 framework name>> default-framework-fallback paths%
90 fallback-library-path empty? [
91 basename default-library-fallback paths%
95 : dyld-image-suffix-search ( seq -- str )
96 "DYLD_IMAGE_SUFFIX" dyld-env [
100 ".dylib" ?tail [ prepend ] dip
101 [ ".dylib" append ] when ,
109 : dyld-search-paths ( name -- paths )
110 [ dyld-override-search ]
111 [ dyld-executable-path-search ]
112 [ dyld-default-search ] tri 3append
113 dyld-image-suffix-search ;
115 FUNCTION: bool _dyld_shared_cache_contains_path ( c-string name )
117 : use-dyld-shared-cache? ( -- ? )
118 os-version { 11 0 0 } after=? ;
122 : dyld-find ( name -- path/f )
125 { [ dup file-exists? ] [ file-info regular-file? ] }
126 { [ use-dyld-shared-cache? ] [ _dyld_shared_cache_contains_path ] }
131 : framework-find ( name -- path )
132 dup dyld-find [ nip ] [
133 dup ".framework" subseq-index [
136 [ ".framework" append ] keep
137 ] if* file-name append-path dyld-find
140 M: macosx find-library*
141 [ "lib" ".dylib" surround ]
143 [ ".framework/" over 3append ] tri 3array
144 [ dyld-find ] map-find drop ;