15
15
import textwrap
16
16
import types
17
17
import json
18
+ from pathlib import Path
18
19
19
20
import package_configuration
20
21
22
+ def match_glob (root_dir , pattern ):
23
+ return sorted ([str (p .relative_to (root_dir )) for p in Path (root_dir ).glob (pattern )])
24
+
21
25
if len (sys .argv ) == 3 :
22
26
repo_dir = "external/" + sys .argv [1 ]
23
27
topdir = sys .argv [2 ]
@@ -46,7 +50,9 @@ def resolve(path, pkgroot):
46
50
else :
47
51
return path
48
52
49
- def path_to_label (path , pkgroot ):
53
+ symlinks = {}
54
+
55
+ def path_to_label (path , pkgroot , output = None ):
50
56
"""Substitute one pkgroot for another relative one to obtain a label."""
51
57
if path .find ("${pkgroot}" ) != - 1 :
52
58
# determine if the given path is inside the repository root
@@ -57,10 +63,22 @@ def path_to_label(path, pkgroot):
57
63
58
64
return None if relative_path .startswith ('..' ) else relative_path .replace ('\\ ' , '/' )
59
65
60
- topdir_relative_path = path .replace (pkgroot , "$topdir" )
61
- if topdir_relative_path .find ("$topdir" ) != - 1 :
66
+ topdir_relative_path = path .replace (os . path . realpath ( pkgroot ) , "$topdir" )
67
+ if topdir_relative_path .startswith ("$topdir" ):
62
68
return os .path .normpath (topdir_relative_path .replace ("$topdir" , topdir )).replace ('\\ ' , '/' )
63
69
70
+ if not output is None :
71
+ if os .path .isabs (path ) and os .path .exists (path ):
72
+ global symlinks
73
+ lnk = symlinks .get (path )
74
+ if not lnk :
75
+ lnk = "lnk_{}" .format (len (symlinks ))
76
+ symlinks [path ] = lnk
77
+ output .append ("#SYMLINK: {} {}" .format (path .replace ('\\ ' , '/' ), lnk ))
78
+ return lnk
79
+ else :
80
+ print ("WARN: could not handle" , path , file = sys .stderr )
81
+
64
82
def hs_library_pattern (name , mode = "static" , profiling = False ):
65
83
"""Convert hs-libraries entry to glob patterns.
66
84
@@ -115,7 +133,7 @@ def hs_library_pattern(name, mode = "static", profiling = False):
115
133
# pkgroot is not part of .conf files. It's a computed value. It is
116
134
# defined to be the directory enclosing the package database
117
135
# directory.
118
- pkgroot = os .path .dirname (os .path .dirname (os . path . realpath ( conf ) ))
136
+ pkgroot = os .path .dirname (os .path .dirname (conf ))
119
137
120
138
pkg_id_map .append ((pkg .name , pkg .id ))
121
139
@@ -200,37 +218,36 @@ def hs_library_pattern(name, mode = "static", profiling = False):
200
218
name = pkg .name ,
201
219
id = pkg .id ,
202
220
version = pkg .version ,
203
- hdrs = "glob({}, allow_empty = True)" . format ( [
204
- path_to_label ( "{}/**/*.h" . format ( include_dir ) , pkgroot )
221
+ hdrs = [
222
+ "/" . join ([ path_to_label ( include_dir , pkgroot , output ), header ] )
205
223
for include_dir in pkg .include_dirs
206
- if path_to_label ( include_dir , pkgroot )
207
- ]) ,
224
+ for header in match_glob ( resolve ( include_dir , pkgroot ), "**/*.h" )
225
+ ],
208
226
includes = [
209
- "/" .join ([repo_dir , path_to_label (include_dir , pkgroot )])
227
+ "/" .join ([repo_dir , path_to_label (include_dir , pkgroot , output )])
210
228
for include_dir in pkg .include_dirs
211
- if path_to_label (include_dir , pkgroot )
212
229
],
213
- static_libraries = "glob({}, allow_empty = True)" . format ( [
214
- path_to_label ( "{}/{}" . format ( library_dir , pattern ), pkgroot )
230
+ static_libraries = [
231
+ "/" . join ([ path_to_label ( library_dir , pkgroot , output ), library ] )
215
232
for hs_library in pkg .hs_libraries
216
233
for pattern in hs_library_pattern (hs_library , mode = "static" , profiling = False )
217
234
for library_dir in pkg .library_dirs
218
- if path_to_label ( library_dir , pkgroot )
219
- ]) ,
220
- static_profiling_libraries = "glob({}, allow_empty = True)" . format ( [
221
- path_to_label ( "{}/{}" . format ( library_dir , pattern ), pkgroot )
235
+ for library in match_glob ( resolve ( library_dir , pkgroot ), pattern )
236
+ ],
237
+ static_profiling_libraries = [
238
+ "/" . join ([ path_to_label ( library_dir , pkgroot , output ), library ] )
222
239
for hs_library in pkg .hs_libraries
223
240
for pattern in hs_library_pattern (hs_library , mode = "static" , profiling = True )
224
241
for library_dir in pkg .library_dirs
225
- if path_to_label ( library_dir , pkgroot )
226
- ]) ,
227
- shared_libraries = "glob({}, allow_empty = True)" . format ( [
228
- path_to_label ( "{}/{}" . format ( dynamic_library_dir , pattern ), pkgroot )
242
+ for library in match_glob ( resolve ( library_dir , pkgroot ), pattern )
243
+ ],
244
+ shared_libraries = [
245
+ "/" . join ([ path_to_label ( dynamic_library_dir , pkgroot , output ), library ] )
229
246
for hs_library in pkg .hs_libraries
230
247
for pattern in hs_library_pattern (hs_library , mode = "dynamic" , profiling = False )
231
- for dynamic_library_dir in pkg .dynamic_library_dirs + pkg .library_dirs
232
- if path_to_label ( dynamic_library_dir , pkgroot )
233
- ]) ,
248
+ for dynamic_library_dir in set ( pkg .dynamic_library_dirs + pkg .library_dirs )
249
+ for library in match_glob ( resolve ( dynamic_library_dir , pkgroot ), pattern )
250
+ ],
234
251
haddock_html = repr (haddock_html ),
235
252
haddock_interfaces = repr (haddock_interfaces ),
236
253
deps = pkg .depends ,
0 commit comments