Enable features that were previously enabled by Bazel in legacy_fields_migrator

https://github.com/bazelbuild/bazel/issues/6861

RELNOTES: None.
PiperOrigin-RevId: 233735389
This commit is contained in:
hlopko 2019-02-13 05:40:32 -08:00 committed by Copybara-Service
parent 49a6c21b32
commit d485e267a5
2 changed files with 58 additions and 24 deletions

View File

@ -93,36 +93,36 @@ def migrate_legacy_fields(crosstool):
_ = [_migrate_repeated_expands(ac) for ac in toolchain.action_config] _ = [_migrate_repeated_expands(ac) for ac in toolchain.action_config]
if (toolchain.dynamic_library_linker_flag or if (toolchain.dynamic_library_linker_flag or
_contains_dynamic_flags(toolchain)) and not _contains_feature( _contains_dynamic_flags(toolchain)) and not _get_feature(
toolchain, "supports_dynamic_linker"): toolchain, "supports_dynamic_linker"):
feature = toolchain.feature.add() feature = toolchain.feature.add()
feature.name = "supports_dynamic_linker" feature.name = "supports_dynamic_linker"
feature.enabled = True feature.enabled = True
if toolchain.supports_start_end_lib and not _contains_feature( if toolchain.supports_start_end_lib and not _get_feature(
toolchain, "supports_start_end_lib"): toolchain, "supports_start_end_lib"):
feature = toolchain.feature.add() feature = toolchain.feature.add()
feature.name = "supports_start_end_lib" feature.name = "supports_start_end_lib"
feature.enabled = True feature.enabled = True
if toolchain.supports_interface_shared_objects and not _contains_feature( if toolchain.supports_interface_shared_objects and not _get_feature(
toolchain, "supports_interface_shared_libraries"): toolchain, "supports_interface_shared_libraries"):
feature = toolchain.feature.add() feature = toolchain.feature.add()
feature.name = "supports_interface_shared_libraries" feature.name = "supports_interface_shared_libraries"
feature.enabled = True feature.enabled = True
if toolchain.supports_embedded_runtimes and not _contains_feature( if toolchain.supports_embedded_runtimes and not _get_feature(
toolchain, "static_link_cpp_runtimes"): toolchain, "static_link_cpp_runtimes"):
feature = toolchain.feature.add() feature = toolchain.feature.add()
feature.name = "static_link_cpp_runtimes" feature.name = "static_link_cpp_runtimes"
feature.enabled = True feature.enabled = True
if toolchain.needsPic and not _contains_feature(toolchain, "supports_pic"): if toolchain.needsPic and not _get_feature(toolchain, "supports_pic"):
feature = toolchain.feature.add() feature = toolchain.feature.add()
feature.name = "supports_pic" feature.name = "supports_pic"
feature.enabled = True feature.enabled = True
if toolchain.supports_fission and not _contains_feature( if toolchain.supports_fission and not _get_feature(
toolchain, "per_object_debug_info"): toolchain, "per_object_debug_info"):
# feature { # feature {
# name: "per_object_debug_info" # name: "per_object_debug_info"
@ -151,7 +151,7 @@ def migrate_legacy_fields(crosstool):
flag_group.expand_if_all_available[:] = ["per_object_debug_info_file"] flag_group.expand_if_all_available[:] = ["per_object_debug_info_file"]
flag_group.flag[:] = ["-gsplit-dwarf"] flag_group.flag[:] = ["-gsplit-dwarf"]
if toolchain.objcopy_embed_flag and not _contains_feature( if toolchain.objcopy_embed_flag and not _get_feature(
toolchain, "objcopy_embed_flags"): toolchain, "objcopy_embed_flags"):
feature = toolchain.feature.add() feature = toolchain.feature.add()
feature.name = "objcopy_embed_flags" feature.name = "objcopy_embed_flags"
@ -168,7 +168,7 @@ def migrate_legacy_fields(crosstool):
tool = action_config.tool.add() tool = action_config.tool.add()
tool.tool_path = _find_tool_path(toolchain, "objcopy") tool.tool_path = _find_tool_path(toolchain, "objcopy")
if toolchain.ld_embed_flag and not _contains_feature( if toolchain.ld_embed_flag and not _get_feature(
toolchain, "ld_embed_flags"): toolchain, "ld_embed_flags"):
feature = toolchain.feature.add() feature = toolchain.feature.add()
feature.name = "ld_embed_flags" feature.name = "ld_embed_flags"
@ -189,9 +189,9 @@ def migrate_legacy_fields(crosstool):
# Create default_link_flags feature for linker_flag # Create default_link_flags feature for linker_flag
flag_sets = _extract_legacy_link_flag_sets_for(toolchain) flag_sets = _extract_legacy_link_flag_sets_for(toolchain)
if flag_sets: if flag_sets:
if _contains_feature(toolchain, "default_link_flags"): if _get_feature(toolchain, "default_link_flags"):
continue continue
if _contains_feature(toolchain, "legacy_link_flags"): if _get_feature(toolchain, "legacy_link_flags"):
for f in toolchain.feature: for f in toolchain.feature:
if f.name == "legacy_link_flags": if f.name == "legacy_link_flags":
f.ClearField("flag_set") f.ClearField("flag_set")
@ -207,8 +207,8 @@ def migrate_legacy_fields(crosstool):
# Create default_compile_flags feature for compiler_flag, cxx_flag # Create default_compile_flags feature for compiler_flag, cxx_flag
flag_sets = _extract_legacy_compile_flag_sets_for(toolchain) flag_sets = _extract_legacy_compile_flag_sets_for(toolchain)
if flag_sets and not _contains_feature(toolchain, "default_compile_flags"): if flag_sets and not _get_feature(toolchain, "default_compile_flags"):
if _contains_feature(toolchain, "legacy_compile_flags"): if _get_feature(toolchain, "legacy_compile_flags"):
for f in toolchain.feature: for f in toolchain.feature:
if f.name == "legacy_compile_flags": if f.name == "legacy_compile_flags":
f.ClearField("flag_set") f.ClearField("flag_set")
@ -228,7 +228,7 @@ def migrate_legacy_fields(crosstool):
if toolchain.unfiltered_cxx_flag: if toolchain.unfiltered_cxx_flag:
# If there already is a feature named unfiltered_compile_flags, the # If there already is a feature named unfiltered_compile_flags, the
# crosstool is already migrated for unfiltered_compile_flags # crosstool is already migrated for unfiltered_compile_flags
if _contains_feature(toolchain, "unfiltered_compile_flags"): if _get_feature(toolchain, "unfiltered_compile_flags"):
for f in toolchain.feature: for f in toolchain.feature:
if f.name == "unfiltered_compile_flags": if f.name == "unfiltered_compile_flags":
for flag_set in f.flag_set: for flag_set in f.flag_set:
@ -239,7 +239,7 @@ def migrate_legacy_fields(crosstool):
flag_group.ClearField("flag") flag_group.ClearField("flag")
flag_group.flag[:] = toolchain.unfiltered_cxx_flag flag_group.flag[:] = toolchain.unfiltered_cxx_flag
else: else:
if not _contains_feature(toolchain, "user_compile_flags"): if not _get_feature(toolchain, "user_compile_flags"):
feature = toolchain.feature.add() feature = toolchain.feature.add()
feature.name = "user_compile_flags" feature.name = "user_compile_flags"
feature.enabled = True feature.enabled = True
@ -250,7 +250,7 @@ def migrate_legacy_fields(crosstool):
flag_group.iterate_over = "user_compile_flags" flag_group.iterate_over = "user_compile_flags"
flag_group.flag[:] = ["%{user_compile_flags}"] flag_group.flag[:] = ["%{user_compile_flags}"]
if not _contains_feature(toolchain, "sysroot"): if not _get_feature(toolchain, "sysroot"):
sysroot_actions = compile_actions(toolchain) + link_actions(toolchain) sysroot_actions = compile_actions(toolchain) + link_actions(toolchain)
sysroot_actions.remove("assemble") sysroot_actions.remove("assemble")
feature = toolchain.feature.add() feature = toolchain.feature.add()
@ -301,6 +301,16 @@ def migrate_legacy_fields(crosstool):
toolchain.ClearField("static_runtimes_filegroup") toolchain.ClearField("static_runtimes_filegroup")
toolchain.ClearField("dynamic_runtimes_filegroup") toolchain.ClearField("dynamic_runtimes_filegroup")
# Enable features that were previously enabled by Bazel
default_features = [
"dependency_file", "random_seed", "module_maps", "module_map_home_cwd",
"header_module_compile", "include_paths", "pic", "preprocessor_define"
]
for feature_name in default_features:
feature = _get_feature(toolchain, feature_name)
if feature:
feature.enabled = True
def _find_tool_path(toolchain, tool_name): def _find_tool_path(toolchain, tool_name):
"""Returns the tool path of the tool with the given name.""" """Returns the tool path of the tool with the given name."""
@ -342,7 +352,7 @@ def _extract_legacy_compile_flag_sets_for(toolchain):
continue continue
if (cmf.compiler_flag or if (cmf.compiler_flag or
cmf.cxx_flag) and not _contains_feature(toolchain, mode): cmf.cxx_flag) and not _get_feature(toolchain, mode):
feature = toolchain.feature.add() feature = toolchain.feature.add()
feature.name = mode feature.name = mode
@ -380,7 +390,7 @@ def _extract_legacy_link_flag_sets_for(toolchain):
if mode == "coverage": if mode == "coverage":
continue continue
if cmf.linker_flag and not _contains_feature(toolchain, mode): if cmf.linker_flag and not _get_feature(toolchain, mode):
feature = toolchain.feature.add() feature = toolchain.feature.add()
feature.name = mode feature.name = mode
@ -392,7 +402,7 @@ def _extract_legacy_link_flag_sets_for(toolchain):
mode = crosstool_config_pb2.LinkingMode.Name(lmf.mode) mode = crosstool_config_pb2.LinkingMode.Name(lmf.mode)
feature_name = LINKING_MODE_TO_FEATURE_NAME.get(mode) feature_name = LINKING_MODE_TO_FEATURE_NAME.get(mode)
# if the feature is already there, we don't migrate, lmf is not used # if the feature is already there, we don't migrate, lmf is not used
if _contains_feature(toolchain, feature_name): if _get_feature(toolchain, feature_name):
continue continue
if lmf.linker_flag: if lmf.linker_flag:
@ -410,9 +420,9 @@ def _extract_legacy_link_flag_sets_for(toolchain):
[feature_name, [feature_name,
CC_LINK_EXECUTABLE, lmf.linker_flag, []]) CC_LINK_EXECUTABLE, lmf.linker_flag, []])
else: else:
result.append( result.append(
[feature_name, [feature_name,
link_actions(toolchain), lmf.linker_flag, []]) link_actions(toolchain), lmf.linker_flag, []])
if toolchain.dynamic_library_linker_flag: if toolchain.dynamic_library_linker_flag:
result.append([ result.append([
@ -439,9 +449,12 @@ def _prepend_feature(toolchain):
return new_feature return new_feature
def _contains_feature(toolchain, name): def _get_feature(toolchain, name):
"""Returns True when toolchain contains a feature with a given name.""" """Returns feature with a given name or None."""
return any(feature.name == name for feature in toolchain.feature) for feature in toolchain.feature:
if feature.name == name:
return feature
return None
def _migrate_expand_if_all_available(message): def _migrate_expand_if_all_available(message):

View File

@ -1070,6 +1070,27 @@ class LegacyFieldsMigrationLibTest(unittest.TestCase):
output.feature[0].flag_set[0].flag_group[1].expand_if_all_available, output.feature[0].flag_set[0].flag_group[1].expand_if_all_available,
["foo"]) ["foo"])
def test_enable_previously_default_features(self):
default_features = [
"dependency_file", "random_seed", "module_maps", "module_map_home_cwd",
"header_module_compile", "include_paths", "pic", "preprocessor_define"
]
crosstool = make_crosstool("""
feature { name: "dependency_file" }
feature { name: "random_seed" }
feature { name: "module_maps" }
feature { name: "module_map_home_cwd" }
feature { name: "header_module_compile" }
feature { name: "include_paths" }
feature { name: "pic" }
feature { name: "preprocessor_define" }
""")
migrate_legacy_fields(crosstool)
output = crosstool.toolchain[0]
for i in range(0, 8):
self.assertEqual(output.feature[i].name, default_features[i])
self.assertTrue(output.feature[i].enabled)
def test_migrate_repeated_expand_if_all_available_from_flag_groups(self): def test_migrate_repeated_expand_if_all_available_from_flag_groups(self):
crosstool = make_crosstool(""" crosstool = make_crosstool("""
action_config { action_config {