14
14
"haskell_cc_libraries_aspect" ,
15
15
"link_libraries" ,
16
16
"merge_HaskellCcLibrariesInfo" ,
17
+ "merge_cc_shared_library_infos" ,
17
18
)
18
19
load (":private/context.bzl" , "haskell_context" , "render_env" )
19
20
load (":private/expansions.bzl" , "expand_make_variables" )
@@ -48,6 +49,7 @@ HaskellReplLoadInfo = provider(
48
49
"import_dirs" : "Depset of Haskell import directories." ,
49
50
"cc_libraries_info" : "HaskellCcLibrariesInfo of transitive C dependencies." ,
50
51
"cc_info" : "CcInfo of transitive C dependencies." ,
52
+ "cc_shared_library_infos" : "CcSharedLibraryInfo providers of transitive C dependencies." ,
51
53
"compiler_flags" : "Flags to pass to the Haskell compiler." ,
52
54
"repl_ghci_args" : "Arbitrary extra arguments to pass to GHCi. This extends `compiler_flags` and `repl_ghci_args` from the toolchain" ,
53
55
"data_runfiles" : "Runtime data dependencies of this target, i.e. the files and runfiles of the `data` attribute." ,
@@ -68,6 +70,7 @@ HaskellReplDepInfo = provider(
68
70
"interface_dirs" : "Set of interface dirs for all the dependencies" ,
69
71
"cc_libraries_info" : "HaskellCcLibrariesInfo of transitive C dependencies." ,
70
72
"cc_info" : "CcInfo of the package itself (includes its transitive dependencies)." ,
73
+ "cc_shared_library_infos" : "CcSharedLibraryInfo providers of transitive C dependencies." ,
71
74
"runfiles" : "Runfiles of this target." ,
72
75
},
73
76
)
@@ -146,6 +149,7 @@ def _merge_HaskellReplLoadInfo(load_infos):
146
149
import_dirs = depset ()
147
150
cc_libraries_infos = []
148
151
cc_infos = []
152
+ cc_shared_library_infos = []
149
153
compiler_flags = []
150
154
repl_ghci_args = []
151
155
data_runfiles = []
@@ -158,6 +162,7 @@ def _merge_HaskellReplLoadInfo(load_infos):
158
162
import_dirs = depset (transitive = [import_dirs , load_info .import_dirs ])
159
163
cc_libraries_infos .append (load_info .cc_libraries_info )
160
164
cc_infos .append (load_info .cc_info )
165
+ cc_shared_library_infos .extend (load_info .cc_shared_library_infos )
161
166
compiler_flags += load_info .compiler_flags
162
167
repl_ghci_args += load_info .repl_ghci_args
163
168
data_runfiles .append (load_info .data_runfiles )
@@ -171,6 +176,7 @@ def _merge_HaskellReplLoadInfo(load_infos):
171
176
import_dirs = import_dirs ,
172
177
cc_libraries_info = merge_HaskellCcLibrariesInfo (infos = cc_libraries_infos ),
173
178
cc_info = cc_common .merge_cc_infos (cc_infos = cc_infos ),
179
+ cc_shared_library_infos = cc_shared_library_infos ,
174
180
compiler_flags = compiler_flags ,
175
181
repl_ghci_args = repl_ghci_args ,
176
182
data_runfiles = _merge_runfiles (data_runfiles ),
@@ -180,11 +186,13 @@ def _merge_HaskellReplLoadInfo(load_infos):
180
186
def _merge_HaskellReplLoadInfoMulti (root_info , load_infos ):
181
187
cc_libraries_infos = []
182
188
cc_infos = []
189
+ cc_shared_library_infos = []
183
190
data_runfiles = []
184
191
java_deps = []
185
192
for load_info in load_infos :
186
193
cc_libraries_infos .append (load_info .cc_libraries_info )
187
194
cc_infos .append (load_info .cc_info )
195
+ cc_shared_library_infos .extend (load_info .cc_shared_library_infos )
188
196
data_runfiles .append (load_info .data_runfiles )
189
197
java_deps .append (load_info .java_deps )
190
198
@@ -197,6 +205,7 @@ def _merge_HaskellReplLoadInfoMulti(root_info, load_infos):
197
205
import_dirs = root_info .import_dirs ,
198
206
cc_libraries_info = merge_HaskellCcLibrariesInfo (infos = cc_libraries_infos ),
199
207
cc_info = cc_common .merge_cc_infos (cc_infos = cc_infos ),
208
+ cc_shared_library_infos = cc_shared_library_infos ,
200
209
compiler_flags = root_info .compiler_flags ,
201
210
repl_ghci_args = root_info .repl_ghci_args ,
202
211
data_runfiles = _merge_runfiles (data_runfiles ),
@@ -209,6 +218,7 @@ def _merge_HaskellReplDepInfo(dep_infos):
209
218
interface_dirs = depset ()
210
219
cc_libraries_infos = []
211
220
cc_infos = []
221
+ cc_shared_library_infos = []
212
222
runfiles = []
213
223
214
224
for dep_info in dep_infos :
@@ -217,6 +227,7 @@ def _merge_HaskellReplDepInfo(dep_infos):
217
227
interface_dirs = depset (transitive = [interface_dirs , dep_info .interface_dirs ])
218
228
cc_libraries_infos .append (dep_info .cc_libraries_info )
219
229
cc_infos .append (dep_info .cc_info )
230
+ cc_shared_library_infos .extend (dep_info .cc_shared_library_infos )
220
231
runfiles .append (dep_info .runfiles )
221
232
222
233
return HaskellReplDepInfo (
@@ -226,6 +237,7 @@ def _merge_HaskellReplDepInfo(dep_infos):
226
237
interface_dirs = interface_dirs ,
227
238
cc_libraries_info = merge_HaskellCcLibrariesInfo (infos = cc_libraries_infos ),
228
239
cc_info = cc_common .merge_cc_infos (cc_infos = cc_infos ),
240
+ cc_shared_library_infos = cc_shared_library_infos ,
229
241
runfiles = _merge_runfiles (runfiles ),
230
242
)
231
243
@@ -257,6 +269,11 @@ def _create_HaskellReplCollectInfo(target, dep_labels, dep_package_ids, dep_pack
257
269
for dep in getattr (ctx .rule .attr , "deps" , []) + getattr (ctx .rule .attr , "narrowed_deps" , [])
258
270
if CcInfo in dep and not HaskellInfo in dep
259
271
]
272
+ ccSharedLibraryInfoDeps = [
273
+ dep
274
+ for dep in getattr (ctx .rule .attr , "deps" , []) + getattr (ctx .rule .attr , "narrowed_deps" , [])
275
+ if CcSharedLibraryInfo in dep and not HaskellInfo in dep
276
+ ]
260
277
if HaskellLibraryInfo in target :
261
278
package_id = target [HaskellLibraryInfo ].package_id
262
279
load_info = HaskellReplLoadInfo (
@@ -266,12 +283,19 @@ def _create_HaskellReplCollectInfo(target, dep_labels, dep_package_ids, dep_pack
266
283
boot_files = hs_info .boot_files ,
267
284
module_names = hs_info .module_names ,
268
285
import_dirs = set .to_depset (hs_info .import_dirs ),
269
- cc_libraries_info = deps_HaskellCcLibrariesInfo (ccInfoDeps ),
286
+ cc_libraries_info = deps_HaskellCcLibrariesInfo (ccInfoDeps + ccSharedLibraryInfoDeps ),
270
287
cc_info = cc_common .merge_cc_infos (cc_infos = [
271
288
# Collect pure C library dependencies, no Haskell dependencies.
272
289
dep [CcInfo ]
273
290
for dep in ccInfoDeps
274
291
]),
292
+ cc_shared_library_infos = [merge_cc_shared_library_infos (
293
+ owner = ctx .label ,
294
+ cc_shared_library_infos = [
295
+ dep [CcSharedLibraryInfo ]
296
+ for dep in ccSharedLibraryInfoDeps
297
+ ],
298
+ )],
275
299
compiler_flags = hs_info .user_compile_flags ,
276
300
repl_ghci_args = hs_info .user_repl_flags ,
277
301
data_runfiles = _data_runfiles (ctx , ctx .rule , "data" ),
@@ -287,6 +311,7 @@ def _create_HaskellReplCollectInfo(target, dep_labels, dep_package_ids, dep_pack
287
311
interface_dirs = hs_info .interface_dirs ,
288
312
cc_libraries_info = target [HaskellCcLibrariesInfo ],
289
313
cc_info = target [CcInfo ],
314
+ cc_shared_library_infos = [target [CcSharedLibraryInfo ]] if CcSharedLibraryInfo in target else [],
290
315
runfiles = target [DefaultInfo ].default_runfiles ,
291
316
)
292
317
dep_infos [target .label ] = dep_info
@@ -484,7 +509,9 @@ def _compiler_flags_and_inputs(hs, cc, repl_info, get_dirname, static = False, i
484
509
repl_info .load_info .cc_info ,
485
510
repl_info .dep_info .cc_info ,
486
511
])
487
- all_libraries = [lib for li in cc_info .linking_context .linker_inputs .to_list () for lib in li .libraries ]
512
+ cc_shared_library_infos = repl_info .load_info .cc_shared_library_infos + repl_info .dep_info .cc_shared_library_infos
513
+ linker_inputs = cc_info .linking_context .linker_inputs .to_list () + [info .linker_input for info in cc_shared_library_infos ]
514
+ all_libraries = [lib for li in linker_inputs for lib in li .libraries ]
488
515
cc_libraries = get_cc_libraries (cc_libraries_info , all_libraries )
489
516
if static :
490
517
cc_library_files = _concat (get_library_files (hs , cc_libraries_info , cc_libraries ))
0 commit comments