@@ -112,24 +112,38 @@ def compilation_action(ctx, target_type = TARGET_TYPE.LIBRARY):
112112 The provider containing the compilation information.
113113 """
114114 toolchain = ctx .toolchains ["//d:toolchain_type" ].d_toolchain_info
115- c_deps = [d [CcInfo ] for d in ctx .attr .deps if CcInfo in d ]
116- c_linker_inputs = [
115+ cc_deps = [d [CcInfo ] for d in ctx .attr .deps if CcInfo in d ]
116+ cc_linker_inputs = [
117117 linker_input
118- for dep in c_deps
118+ for dep in cc_deps
119119 for linker_input in dep .linking_context .linker_inputs .to_list ()
120120 ]
121- c_libraries = depset ([
121+ cc_libraries = depset ([
122122 lib .pic_static_library if lib .pic_static_library else lib .static_library
123- for li in c_linker_inputs
123+ for li in cc_linker_inputs
124124 for lib in li .libraries
125+ ], order = "topological" )
126+ fix_linker_flags = {
127+ "-pthread" : "-lpthread" ,
128+ }
129+ cc_linker_flags = depset ([
130+ fix_linker_flags .get (flag , flag )
131+ for li in cc_linker_inputs
132+ for flag in li .user_link_flags
125133 ])
126134 d_deps = [d [DInfo ] for d in ctx .attr .deps if DInfo in d ]
127- compiler_flags = depset (ctx .attr .dopts , transitive = [d .compiler_flags for d in d_deps ])
135+ compiler_flags = depset (
136+ ctx .attr .dopts ,
137+ transitive = [d .compiler_flags for d in d_deps ],
138+ )
128139 imports = depset (
129140 [paths .join (ctx .label .workspace_root , ctx .label .package , imp ) for imp in ctx .attr .imports ],
130141 transitive = [d .imports for d in d_deps ],
131142 )
132- linker_flags = depset (ctx .attr .linkopts , transitive = [d .linker_flags for d in d_deps ])
143+ linker_flags = depset (
144+ ctx .attr .linkopts ,
145+ transitive = [d .linker_flags for d in d_deps ] + [cc_linker_flags ],
146+ )
133147 string_imports = depset (
134148 ([paths .join (ctx .label .workspace_root , ctx .label .package )] if ctx .files .string_srcs else []) +
135149 [paths .join (ctx .label .workspace_root , ctx .label .package , imp ) for imp in ctx .attr .string_imports ],
@@ -144,15 +158,15 @@ def compilation_action(ctx, target_type = TARGET_TYPE.LIBRARY):
144158 args .add_all (toolchain .compiler_flags )
145159 args .add_all (compiler_flags .to_list ())
146160 args .add_all (versions .to_list (), format_each = "-version=%s" )
147- args .add_all (toolchain .linker_flags )
148- args .add_all (linker_flags .to_list (), format_each = "-L=%s" )
149161 output = None
150162 cc_toolchain = None
151163 env = ctx .var
152164 if target_type in [TARGET_TYPE .BINARY , TARGET_TYPE .TEST ]:
165+ args .add_all (toolchain .linker_flags )
166+ args .add_all (linker_flags .to_list (), format_each = "-L=%s" )
153167 for dep in d_deps :
154168 args .add_all (dep .libraries )
155- args .add_all (c_libraries )
169+ args .add_all (cc_libraries )
156170 if target_type == TARGET_TYPE .TEST :
157171 args .add_all (["-main" , "-unittest" ])
158172 output = ctx .actions .declare_file (_binary_name (ctx , ctx .label .name ))
@@ -183,7 +197,7 @@ def compilation_action(ctx, target_type = TARGET_TYPE.LIBRARY):
183197
184198 transitive_library_inputs = []
185199 if target_type != TARGET_TYPE .LIBRARY :
186- transitive_library_inputs += [d .libraries for d in d_deps ] + [c_libraries ]
200+ transitive_library_inputs += [d .libraries for d in d_deps ] + [cc_libraries ]
187201 inputs = depset (
188202 direct = ctx .files .srcs + ctx .files .string_srcs ,
189203 transitive = [toolchain .d_compiler [DefaultInfo ].default_runfiles .files ] +
@@ -219,8 +233,7 @@ def compilation_action(ctx, target_type = TARGET_TYPE.LIBRARY):
219233 libraries = depset (
220234 [] if ctx .attr .source_only else [output ],
221235 order = "topological" ,
222- transitive = [d .libraries for d in d_deps ] +
223- [c_libraries ],
236+ transitive = [d .libraries for d in d_deps ] + [cc_libraries ],
224237 ),
225238 linker_flags = linker_flags ,
226239 string_imports = depset (
0 commit comments