@@ -9,7 +9,7 @@ To verify the processed cargo cc_args, we use cc_args_and_env_analysis_test().
99
1010load ("@bazel_skylib//lib:unittest.bzl" , "analysistest" , "asserts" )
1111load ("@rules_cc//cc:action_names.bzl" , "ACTION_NAMES" , "ACTION_NAME_GROUPS" )
12- load ("@rules_cc//cc:cc_toolchain_config_lib.bzl" , "action_config" , "feature" , "flag_group" , "flag_set" , "tool" , "tool_path" )
12+ load ("@rules_cc//cc:cc_toolchain_config_lib.bzl" , "action_config" , "env_entry" , "env_set" , " feature" , "flag_group" , "flag_set" , "tool" , "tool_path" )
1313load ("@rules_cc//cc:defs.bzl" , "cc_toolchain" )
1414load ("@rules_cc//cc/common:cc_common.bzl" , "cc_common" )
1515load ("@rules_cc//cc/toolchains:cc_toolchain_config_info.bzl" , "CcToolchainConfigInfo" )
@@ -36,6 +36,17 @@ def _test_cc_config_impl(ctx):
3636 ]),
3737 ),
3838 ],
39+ env_sets = [
40+ env_set (
41+ actions = ACTION_NAME_GROUPS .all_cc_compile_actions ,
42+ env_entries = [
43+ env_entry (
44+ key = "INCLUDE" ,
45+ value = ctx .attr .extra_include_paths ,
46+ ),
47+ ],
48+ ),
49+ ] if ctx .attr .extra_include_paths else [],
3950 ),
4051 feature (
4152 name = "default_cpp_flags" ,
@@ -156,6 +167,7 @@ test_cc_config = rule(
156167 "extra_ar_flags" : attr .string_list (),
157168 "extra_cc_compile_flags" : attr .string_list (),
158169 "extra_cxx_compile_flags" : attr .string_list (),
170+ "extra_include_paths" : attr .string (default = "" ),
159171 "legacy_cc_toolchain" : attr .bool (default = False ),
160172 },
161173 provides = [CcToolchainConfigInfo ],
@@ -241,6 +253,15 @@ def _cc_args_and_env_analysis_test_impl(ctx):
241253 "set up by most Bazel C/C++ toolchains is extremely error-prone." ,
242254 )
243255
256+ if ctx .attr .expected_include :
257+ actual_include = cargo_action .env .get ("INCLUDE" )
258+ asserts .equals (
259+ env ,
260+ ctx .attr .expected_include ,
261+ actual_include ,
262+ "error: expected INCLUDE '{}' but got '{}'" .format (ctx .attr .expected_include , actual_include ),
263+ )
264+
244265 return analysistest .end (env )
245266
246267cc_args_and_env_analysis_test = analysistest .make (
@@ -249,6 +270,7 @@ cc_args_and_env_analysis_test = analysistest.make(
249270 attrs = {
250271 "expected_cflags" : attr .string_list (default = ["-Wall" ]),
251272 "expected_cxxflags" : attr .string_list (default = ["-fno-rtti" ]),
273+ "expected_include" : attr .string (default = "" ),
252274 "legacy_cc_toolchain" : attr .bool (default = False ),
253275 },
254276)
@@ -259,6 +281,7 @@ def cargo_build_script_with_extra_cc_compile_flags(
259281 extra_cc_compile_flags = ["-Wall" ],
260282 extra_cxx_compile_flags = ["-fno-rtti" ],
261283 extra_ar_flags = ["-x" ],
284+ extra_include_paths = "" ,
262285 legacy_cc_toolchain = False ):
263286 """Produces a test cargo_build_script target that's set up to use a custom cc_toolchain with the extra_cc_compile_flags.
264287
@@ -273,6 +296,7 @@ def cargo_build_script_with_extra_cc_compile_flags(
273296 extra_cc_compile_flags: Extra C/C++ args for the cc_toolchain.
274297 extra_cxx_compile_flags: Extra C++-specific args for the cc_toolchain.
275298 extra_ar_flags: Extra archiver args for the cc_toolchain.
299+ extra_include_paths: INCLUDE environment variable value for the cc_toolchain.
276300 legacy_cc_toolchain: Enables legacy tool_path configuration of the cc
277301 cc toolchain.
278302 """
@@ -282,6 +306,7 @@ def cargo_build_script_with_extra_cc_compile_flags(
282306 extra_cc_compile_flags = extra_cc_compile_flags ,
283307 extra_cxx_compile_flags = extra_cxx_compile_flags ,
284308 extra_ar_flags = extra_ar_flags ,
309+ extra_include_paths = extra_include_paths ,
285310 legacy_cc_toolchain = legacy_cc_toolchain ,
286311 )
287312 cc_toolchain (
@@ -423,3 +448,98 @@ def legacy_cc_toolchain_test(name):
423448 target_under_test = "%s/cargo_build_script" % name ,
424449 legacy_cc_toolchain = True ,
425450 )
451+
452+ def libpath_relative_test (name ):
453+ cargo_build_script_with_extra_cc_compile_flags (
454+ name = "%s/cargo_build_script" % name ,
455+ extra_cc_compile_flags = ["-Ltest/relative/sysroot" , "-L" , "test/relative/sysroot2" , "-LIBPATH:test/relative/sysroot3" , "-LIBPATH=test/relative/sysroot4" , "-LIBPATH:" , "some_unrelated_arg" , "-LIBPATH=" , "some_unrelated_arg2" ],
456+ )
457+ cc_args_and_env_analysis_test (
458+ name = name ,
459+ target_under_test = "%s/cargo_build_script" % name ,
460+ expected_cflags = ["-L${pwd}/test/relative/sysroot" , "-L" , "${pwd}/test/relative/sysroot2" , "-LIBPATH:${pwd}/test/relative/sysroot3" , "-LIBPATH=${pwd}/test/relative/sysroot4" , "-LIBPATH:" , "some_unrelated_arg" , "-LIBPATH=" , "some_unrelated_arg2" ],
461+ )
462+
463+ def libpath_absolute_test (name ):
464+ cargo_build_script_with_extra_cc_compile_flags (
465+ name = "%s/cargo_build_script" % name ,
466+ extra_cc_compile_flags = ["-L/test/absolute/sysroot" , "-L" , "/test/absolute/sysroot2" , "-LIBPATH:/test/absolute/sysroot3" , "-LIBPATH=/test/absolute/sysroot4" , "-LIBPATH:" , "some_unrelated_arg" , "-LIBPATH=" , "some_unrelated_arg2" ],
467+ )
468+ cc_args_and_env_analysis_test (
469+ name = name ,
470+ target_under_test = "%s/cargo_build_script" % name ,
471+ expected_cflags = ["-L/test/absolute/sysroot" , "-L" , "/test/absolute/sysroot2" , "-LIBPATH:/test/absolute/sysroot3" , "-LIBPATH=/test/absolute/sysroot4" , "-LIBPATH:" , "some_unrelated_arg" , "-LIBPATH=" , "some_unrelated_arg2" ],
472+ )
473+
474+ def resource_dir_relative_test (name ):
475+ cargo_build_script_with_extra_cc_compile_flags (
476+ name = "%s/cargo_build_script" % name ,
477+ extra_cc_compile_flags = ["-resource-dir" , "test/relative/resources" , "-resource-dir=test/relative/resources2" , "-resource-dir=" , "some_unrelated_arg" ],
478+ )
479+ cc_args_and_env_analysis_test (
480+ name = name ,
481+ target_under_test = "%s/cargo_build_script" % name ,
482+ expected_cflags = ["-resource-dir" , "${pwd}/test/relative/resources" , "-resource-dir=${pwd}/test/relative/resources2" , "-resource-dir=" , "some_unrelated_arg" ],
483+ )
484+
485+ def resource_dir_absolute_test (name ):
486+ cargo_build_script_with_extra_cc_compile_flags (
487+ name = "%s/cargo_build_script" % name ,
488+ extra_cc_compile_flags = ["-resource-dir" , "/test/absolute/resources" , "-resource-dir=/test/absolute/resources2" , "-resource-dir=" , "some_unrelated_arg" ],
489+ )
490+ cc_args_and_env_analysis_test (
491+ name = name ,
492+ target_under_test = "%s/cargo_build_script" % name ,
493+ expected_cflags = ["-resource-dir" , "/test/absolute/resources" , "-resource-dir=/test/absolute/resources2" , "-resource-dir=" , "some_unrelated_arg" ],
494+ )
495+
496+ def include_relative_test (name ):
497+ cargo_build_script_with_extra_cc_compile_flags (
498+ name = "%s/cargo_build_script" % name ,
499+ extra_include_paths = select ({
500+ "@platforms//os:windows" : "test/relative/include;another/relative/path" ,
501+ "//conditions:default" : "test/relative/include:another/relative/path" ,
502+ }),
503+ )
504+ cc_args_and_env_analysis_test (
505+ name = name ,
506+ target_under_test = "%s/cargo_build_script" % name ,
507+ expected_include = select ({
508+ "@platforms//os:windows" : "${pwd}/test/relative/include;${pwd}/another/relative/path" ,
509+ "//conditions:default" : "${pwd}/test/relative/include:${pwd}/another/relative/path" ,
510+ }),
511+ )
512+
513+ def include_absolute_test (name ):
514+ cargo_build_script_with_extra_cc_compile_flags (
515+ name = "%s/cargo_build_script" % name ,
516+ extra_include_paths = select ({
517+ "@platforms//os:windows" : "/test/absolute/include;/another/absolute/path" ,
518+ "//conditions:default" : "/test/absolute/include:/another/absolute/path" ,
519+ }),
520+ )
521+ cc_args_and_env_analysis_test (
522+ name = name ,
523+ target_under_test = "%s/cargo_build_script" % name ,
524+ expected_include = select ({
525+ "@platforms//os:windows" : "/test/absolute/include;/another/absolute/path" ,
526+ "//conditions:default" : "/test/absolute/include:/another/absolute/path" ,
527+ }),
528+ )
529+
530+ def include_mixed_test (name ):
531+ cargo_build_script_with_extra_cc_compile_flags (
532+ name = "%s/cargo_build_script" % name ,
533+ extra_include_paths = select ({
534+ "@platforms//os:windows" : "/test/absolute/include;test/relative/path" ,
535+ "//conditions:default" : "/test/absolute/include:test/relative/path" ,
536+ }),
537+ )
538+ cc_args_and_env_analysis_test (
539+ name = name ,
540+ target_under_test = "%s/cargo_build_script" % name ,
541+ expected_include = select ({
542+ "@platforms//os:windows" : "/test/absolute/include;${pwd}/test/relative/path" ,
543+ "//conditions:default" : "/test/absolute/include:${pwd}/test/relative/path" ,
544+ }),
545+ )
0 commit comments