Skip to content

Commit

Permalink
Fix legacy_fields_migrator
Browse files Browse the repository at this point in the history
This cl fixes:

* clears 'supports_embedded_runtimes'
* adds user_compile_flags and sysroot feature
  * these are needed to appear before unfiltered_compile_flags

Progress towards:
bazelbuild/bazel#6861
bazelbuild/bazel#5883

RELNOTES: None.
PiperOrigin-RevId: 228299172
  • Loading branch information
hlopko committed Jan 9, 2019
1 parent 91210fe commit f835b8b
Show file tree
Hide file tree
Showing 2 changed files with 185 additions and 12 deletions.
39 changes: 33 additions & 6 deletions tools/migration/legacy_fields_migration_lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,16 +155,42 @@ def migrate_legacy_fields(crosstool):
if _contains_feature(toolchain, "unfiltered_compile_flags"):
for f in toolchain.feature:
if f.name == "unfiltered_compile_flags":
feature = f
break
for flag_set in f.flag_set:
for flag_group in flag_set.flag_group:
if flag_group.iterate_over == "unfiltered_compile_flags":
flag_group.ClearField("iterate_over")
flag_group.ClearField("expand_if_all_available")
flag_group.ClearField("flag")
flag_group.flag[:] = toolchain.unfiltered_cxx_flag
else:
if not _contains_feature(toolchain, "user_compile_flags"):
feature = toolchain.feature.add()
feature.name = "user_compile_flags"
feature.enabled = True
flag_set = feature.flag_set.add()
flag_set.action[:] = ALL_COMPILE_ACTIONS
flag_group = flag_set.flag_group.add()
flag_group.expand_if_all_available[:] = ["user_compile_flags"]
flag_group.iterate_over = "user_compile_flags"
flag_group.flag[:] = ["%{user_compile_flags}"]

if not _contains_feature(toolchain, "sysroot"):
feature = toolchain.feature.add()
feature.name = "sysroot"
feature.enabled = True
flag_set = feature.flag_set.add()
flag_set.action[:] = ALL_COMPILE_ACTIONS + ALL_LINK_ACTIONS
flag_group = flag_set.flag_group.add()
flag_group.expand_if_all_available[:] = ["sysroot"]
flag_group.flag[:] = ["--sysroot=%{sysroot}"]

feature = toolchain.feature.add()
feature.name = "unfiltered_compile_flags"
feature.enabled = True

_add_flag_sets(
feature,
[[None, ALL_COMPILE_ACTIONS, toolchain.unfiltered_cxx_flag, []]])
flag_set = feature.flag_set.add()
flag_set.action[:] = ALL_COMPILE_ACTIONS
flag_group = flag_set.flag_group.add()
flag_group.flag[:] = toolchain.unfiltered_cxx_flag

# clear fields
toolchain.ClearField("debian_extra_requires")
Expand All @@ -190,6 +216,7 @@ def migrate_legacy_fields(crosstool):
toolchain.ClearField("supports_start_end_lib")
toolchain.ClearField("supports_interface_shared_objects")
toolchain.ClearField("supports_fission")
toolchain.ClearField("supports_embedded_runtimes")
toolchain.ClearField("compiler_flag")
toolchain.ClearField("cxx_flag")
toolchain.ClearField("linker_flag")
Expand Down
158 changes: 152 additions & 6 deletions tools/migration/legacy_fields_migration_lib_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ def test_deletes_fields(self):
supports_start_end_lib: false
supports_interface_shared_objects: false
supports_fission: false
supports_embedded_runtimes: false
static_runtimes_filegroup: 'yolo'
dynamic_runtimes_filegroup: 'yolo'
""")
Expand All @@ -73,6 +74,7 @@ def test_deletes_fields(self):
self.assertNotIn("supports_start_end_lib", output)
self.assertNotIn("supports_interface_shared_objects", output)
self.assertNotIn("supports_fission", output)
self.assertNotIn("supports_embedded_runtimes", output)
self.assertNotIn("static_runtimes_filegroup", output)
self.assertNotIn("dynamic_runtimes_filegroup", output)

Expand Down Expand Up @@ -365,6 +367,79 @@ def test_linking_mode_features_are_not_added_when_present(self):
self.assertNotIn("mostly-static-flag", output)
self.assertNotIn("mostly-static-libraries-flag", output)

def test_unfiltered_require_user_compile_flags_and_sysroot(self):
crosstool = make_crosstool("""
feature { name: 'preexisting_feature' }
unfiltered_cxx_flag: 'unfiltered-flag-1'
""")
migrate_legacy_fields(crosstool)
output = crosstool.toolchain[0]
# all these features are added after features that are already present in
# the crosstool
self.assertEqual(output.feature[0].name, "preexisting_feature")
self.assertEqual(output.feature[1].name, "user_compile_flags")
self.assertEqual(output.feature[2].name, "sysroot")
self.assertEqual(output.feature[3].name, "unfiltered_compile_flags")

def test_user_compile_flags_not_migrated_when_present(self):
crosstool = make_crosstool("""
unfiltered_cxx_flag: 'unfiltered-flag-1'
feature { name: 'user_compile_flags' }
feature { name: 'preexisting_feature' }
""")
migrate_legacy_fields(crosstool)
output = crosstool.toolchain[0]
self.assertEqual(output.feature[0].name, "user_compile_flags")
self.assertEqual(output.feature[1].name, "preexisting_feature")
self.assertEqual(output.feature[2].name, "sysroot")
self.assertEqual(output.feature[3].name, "unfiltered_compile_flags")

def test_sysroot_not_migrated_when_present(self):
crosstool = make_crosstool("""
unfiltered_cxx_flag: 'unfiltered-flag-1'
feature { name: 'sysroot' }
feature { name: 'preexisting_feature' }
""")
migrate_legacy_fields(crosstool)
output = crosstool.toolchain[0]
self.assertEqual(output.feature[0].name, "sysroot")
self.assertEqual(output.feature[1].name, "preexisting_feature")
self.assertEqual(output.feature[2].name, "user_compile_flags")
self.assertEqual(output.feature[3].name, "unfiltered_compile_flags")

def test_user_compile_flags(self):
crosstool = make_crosstool("""
unfiltered_cxx_flag: 'unfiltered-flag-1'
""")
migrate_legacy_fields(crosstool)
output = crosstool.toolchain[0]
self.assertEqual(output.feature[0].name, "user_compile_flags")
self.assertEqual(output.feature[0].enabled, True)
self.assertEqual(output.feature[0].flag_set[0].action, ALL_COMPILE_ACTIONS)
self.assertEqual(
output.feature[0].flag_set[0].flag_group[0].expand_if_all_available,
["user_compile_flags"])
self.assertEqual(output.feature[0].flag_set[0].flag_group[0].iterate_over,
"user_compile_flags")
self.assertEqual(output.feature[0].flag_set[0].flag_group[0].flag,
["%{user_compile_flags}"])

def test_sysroot(self):
crosstool = make_crosstool("""
unfiltered_cxx_flag: 'unfiltered-flag-1'
""")
migrate_legacy_fields(crosstool)
output = crosstool.toolchain[0]
self.assertEqual(output.feature[1].name, "sysroot")
self.assertEqual(output.feature[1].enabled, True)
self.assertEqual(output.feature[1].flag_set[0].action,
ALL_COMPILE_ACTIONS + ALL_LINK_ACTIONS)
self.assertEqual(
output.feature[1].flag_set[0].flag_group[0].expand_if_all_available,
["sysroot"])
self.assertEqual(output.feature[1].flag_set[0].flag_group[0].flag,
["--sysroot=%{sysroot}"])

def test_unfiltered_compile_flags_is_not_added_when_already_present(self):
crosstool = make_crosstool("""
unfiltered_cxx_flag: 'unfiltered-flag-1'
Expand All @@ -376,11 +451,80 @@ def test_unfiltered_compile_flags_is_not_added_when_already_present(self):
output = crosstool.toolchain[0]
self.assertEqual(output.feature[0].name, "something_else")
self.assertEqual(output.feature[1].name, "unfiltered_compile_flags")
self.assertEqual(output.feature[1].flag_set[0].action, ALL_COMPILE_ACTIONS)
self.assertEqual(output.feature[1].flag_set[0].flag_group[0].flag,
["unfiltered-flag-1"])
self.assertEqual(len(output.feature[1].flag_set), 0)
self.assertEqual(output.feature[2].name, "something_else_2")

def test_unfiltered_compile_flags_is_not_edited_if_old_variant_present(self):
crosstool = make_crosstool("""
unfiltered_cxx_flag: 'unfiltered-flag-1'
feature {
name: 'unfiltered_compile_flags'
flag_set {
action: 'c-compile'
flag_group {
flag: 'foo-flag-1'
}
}
}
""")
migrate_legacy_fields(crosstool)
output = crosstool.toolchain[0]
self.assertEqual(output.feature[0].name, "unfiltered_compile_flags")
self.assertEqual(len(output.feature[0].flag_set), 1)
self.assertEqual(output.feature[0].flag_set[0].action, ["c-compile"])
self.assertEqual(output.feature[0].flag_set[0].flag_group[0].flag,
["foo-flag-1"])

def test_use_of_unfiltered_compile_flags_var_is_removed_and_replaced(self):
crosstool = make_crosstool("""
unfiltered_cxx_flag: 'unfiltered-flag-1'
feature {
name: 'unfiltered_compile_flags'
flag_set {
action: 'c-compile'
flag_group {
flag: 'foo-flag-1'
}
}
flag_set {
action: 'c++-compile'
flag_group {
flag: 'bar-flag-1'
}
flag_group {
expand_if_all_available: 'unfiltered_compile_flags'
iterate_over: 'unfiltered_compile_flags'
flag: '%{unfiltered_compile_flags}'
}
flag_group {
flag: 'bar-flag-2'
}
}
flag_set {
action: 'c-compile'
flag_group {
flag: 'foo-flag-2'
}
}
}
""")
migrate_legacy_fields(crosstool)
output = crosstool.toolchain[0]
self.assertEqual(output.feature[0].name, "unfiltered_compile_flags")
self.assertEqual(output.feature[0].flag_set[0].action, ["c-compile"])
self.assertEqual(output.feature[0].flag_set[0].flag_group[0].flag,
["foo-flag-1"])
self.assertEqual(output.feature[0].flag_set[1].action, ["c++-compile"])
self.assertEqual(output.feature[0].flag_set[1].flag_group[0].flag,
["bar-flag-1"])
self.assertEqual(output.feature[0].flag_set[1].flag_group[1].flag,
["unfiltered-flag-1"])
self.assertEqual(output.feature[0].flag_set[1].flag_group[2].flag,
["bar-flag-2"])
self.assertEqual(output.feature[0].flag_set[2].action, ["c-compile"])
self.assertEqual(output.feature[0].flag_set[2].flag_group[0].flag,
["foo-flag-2"])

def test_unfiltered_compile_flags_is_added_at_the_end(self):
crosstool = make_crosstool("""
feature { name: 'something_else' }
Expand All @@ -389,9 +533,11 @@ def test_unfiltered_compile_flags_is_added_at_the_end(self):
migrate_legacy_fields(crosstool)
output = crosstool.toolchain[0]
self.assertEqual(output.feature[0].name, "something_else")
self.assertEqual(output.feature[1].name, "unfiltered_compile_flags")
self.assertEqual(output.feature[1].flag_set[0].action, ALL_COMPILE_ACTIONS)
self.assertEqual(output.feature[1].flag_set[0].flag_group[0].flag,
self.assertEqual(output.feature[1].name, "user_compile_flags")
self.assertEqual(output.feature[2].name, "sysroot")
self.assertEqual(output.feature[3].name, "unfiltered_compile_flags")
self.assertEqual(output.feature[3].flag_set[0].action, ALL_COMPILE_ACTIONS)
self.assertEqual(output.feature[3].flag_set[0].flag_group[0].flag,
["unfiltered-flag-1"])

def test_default_link_flags_is_added_first(self):
Expand Down

0 comments on commit f835b8b

Please sign in to comment.