@@ -4,7 +4,7 @@ Contains rules implementations for building C++ targets
44
55load ("@bazel_tools//tools/cpp:toolchain_utils.bzl" , "find_cpp_toolchain" )
66load ("//cpp:providers.bzl" , "CppModuleInfo" )
7- load ("//cpp/private:common.bzl" , "collect_external_headers" , "collect_external_includes" , "get_compile_command_args" , "resolve_linker_arguments" )
7+ load ("//cpp/private:common.bzl" , "collect_external_headers" , "collect_external_includes" , "collect_module_objects" , "collect_modules" , " get_compile_command_args" , "resolve_linker_arguments" )
88load ("//cpp/private:extra_actions.bzl" , "EXTRA_ACTIONS" )
99load ("//cpp/private/actions:compile.bzl" , "cpp_compile" )
1010load ("//cpp/private/actions:strip.bzl" , "cpp_strip_binary" , "cpp_strip_objects" )
@@ -49,9 +49,10 @@ def shlib_impl(ctx):
4949
5050 all_headers = headers + collect_external_headers (ctx .attr .deps )
5151 includes = depset ([ctx .bin_dir .path + "/_virtual_includes/" + ctx .attr .name ] + ctx .attr .includes , transitive = [collect_external_includes (ctx .attr .deps )])
52+ modules = collect_modules (ctx .attr .deps )
5253
53- obj_files = cpp_compile (ctx .files .srcs , all_headers , includes , features , toolchain )
54- obj_files = cpp_strip_objects (obj_files , features , toolchain )
54+ obj_files = cpp_compile (ctx .files .srcs , all_headers , includes , modules , features , toolchain )
55+ obj_files = cpp_strip_objects (obj_files , features , toolchain ) + collect_module_objects ( ctx . attr . deps )
5556
5657 shlib = ctx .actions .declare_file (ctx .attr .lib_prefix + ctx .attr .name + ctx .attr .lib_suffix )
5758 compile_output = shlib
@@ -73,7 +74,7 @@ def shlib_impl(ctx):
7374 inputs = depset (obj_files , transitive = [lib_inputs , toolchain .all_files ]),
7475 executable = linker ,
7576 arguments = link_flags ,
76- mnemonic = "CppLink " ,
77+ mnemonic = "CppLinkSharedLibrary " ,
7778 progress_message = "Compiling %{output}" ,
7879 )
7980
@@ -116,23 +117,26 @@ def module_impl(ctx):
116117 Returns:
117118 A tuple of providers
118119 """
119- toolchain = ctx . attr . _cc_toolchain [ cc_common . CcToolchainInfo ]
120+ toolchain = find_cpp_toolchain ( ctx )
120121
121122 features = cc_common .configure_features (ctx = ctx , cc_toolchain = toolchain , requested_features = ctx .features + ["no_agressive_strip" ], unsupported_features = ctx .disabled_features )
122123
123124 headers = collect_external_headers (ctx .attr .deps )
124125 includes = depset (ctx .attr .includes , transitive = [collect_external_includes (ctx .attr .deps )])
126+ modules = collect_modules (ctx .attr .deps )
127+
128+ extra_vars = {
129+ "cpp_precompiled_modules" : [],
130+ }
125131
126- extra_modules = []
127132 module_files = []
128- for dep in ctx .attr .deps :
129- if CppModuleInfo in dep :
130- module = dep [CppModuleInfo ]
131- extra_modules .append ({
132- "name" : module .module_name ,
133- "file" : module .pcm .path ,
134- })
135- module_files .append (module .pcm )
133+ module_vars = []
134+
135+ for m in modules :
136+ module_files .append (m ["file" ])
137+ module_vars .append ("{name}={file}" .format (name = m ["name" ], file = m ["file" ].path ))
138+
139+ extra_vars ["cpp_precompiled_modules" ] = module_vars
136140
137141 pcm = ctx .actions .declare_file ("_pcm/" + ctx .attr .module_name + "-" + ctx .files .interface [0 ].basename [:- (len (ctx .files .interface [0 ].extension ) + 1 )] + ".pcm" )
138142
@@ -143,8 +147,7 @@ def module_impl(ctx):
143147 features = features ,
144148 include_directories = includes ,
145149 action_name = EXTRA_ACTIONS .cpp_module_precompile_interface ,
146- extra_vars = {
147- },
150+ extra_vars = extra_vars ,
148151 )
149152
150153 compiler = cc_common .get_tool_for_action (
@@ -155,17 +158,72 @@ def module_impl(ctx):
155158 ctx .actions .run (
156159 outputs = [pcm ],
157160 mnemonic = "CppModulePrecompile" ,
158- inputs = depset (ctx .files .interface , transitive = [depset (headers ), toolchain .all_files ]),
161+ inputs = depset (ctx .files .interface , transitive = [depset (headers ), depset ( module_files ), toolchain .all_files ]),
159162 arguments = precompile_args ,
160163 executable = compiler ,
161164 progress_message = "Precompiling %{output}" ,
162165 )
163166
164- obj_files = cpp_compile (ctx .files .srcs + [pcm ], headers , includes , features , toolchain )
165- obj_files = cpp_strip_objects (obj_files , features , toolchain )
167+ obj_files = cpp_compile (ctx .files .srcs + [pcm ], headers , includes , modules , features , toolchain , module_srcs = ctx . files . interface )
168+ obj_files = cpp_strip_objects (obj_files , features , toolchain ) + collect_module_objects ( ctx . attr . deps )
166169
167170 return CppModuleInfo (
168171 module_name = ctx .attr .module_name ,
169172 pcm = pcm ,
170173 objs = obj_files ,
171174 )
175+
176+ def binary_impl (ctx ):
177+ """
178+ Implements C++ rules for building C++ 20 modules
179+
180+ Return a tuple of providers
181+
182+ Args:
183+ ctx: rule context
184+
185+ Returns:
186+ A tuple of providers
187+ """
188+ toolchain = find_cpp_toolchain (ctx )
189+
190+ features = cc_common .configure_features (ctx = ctx , cc_toolchain = toolchain , requested_features = ctx .features + ["no_agressive_strip" ], unsupported_features = ctx .disabled_features )
191+
192+ all_headers = collect_external_headers (ctx .attr .deps )
193+ includes = collect_external_includes (ctx .attr .deps )
194+
195+ modules = collect_modules (ctx .attr .deps )
196+
197+ obj_files = cpp_compile (ctx .files .srcs , all_headers , includes , modules , features , toolchain )
198+ obj_files = cpp_strip_objects (obj_files , features , toolchain ) + collect_module_objects (ctx .attr .deps )
199+
200+ bin = ctx .actions .declare_file (ctx .attr .name + ctx .attr .bin_suffix )
201+ compile_output = bin
202+ if _has_agressive_strip (features , toolchain ):
203+ compile_output = ctx .actions .declare_file (ctx .attr .name + ".nonstripped" + ctx .attr .bin_suffix )
204+
205+ link_flags , lib_inputs = resolve_linker_arguments (ctx , toolchain , features , compile_output .path , False )
206+
207+ for obj in obj_files :
208+ link_flags .append (obj .path )
209+
210+ linker = cc_common .get_tool_for_action (
211+ feature_configuration = features ,
212+ action_name = ACTION_NAMES .cpp_link_executable ,
213+ )
214+
215+ ctx .actions .run (
216+ outputs = [compile_output ],
217+ inputs = depset (obj_files , transitive = [lib_inputs , toolchain .all_files ]),
218+ executable = linker ,
219+ arguments = link_flags ,
220+ mnemonic = "CppLinkExecutable" ,
221+ progress_message = "Linking %{output}" ,
222+ )
223+
224+ if _has_agressive_strip (features , toolchain ):
225+ cpp_strip_binary (compile_output , compile_output , bin , toolchain )
226+
227+ default_provider = DefaultInfo (executable = bin )
228+
229+ return default_provider
0 commit comments