compute_version.bzl 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. # Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. # Exceptions. See /LICENSE for license information.
  3. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. """Compute the version string."""
  5. load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
  6. load("//:version_base.bzl", "version_base")
  7. def _validate_nightly_date(date):
  8. date_components = date.split(".", 2)
  9. if len(date_components) != 3:
  10. fail("Must provide a nightly date in 'YYYY.MM.DD' format, found '{}'.".format(date))
  11. year = date_components[0]
  12. if len(year) != 4 or not year.isdigit():
  13. fail("The nightly date year was not a sequence of four digits.")
  14. month = date_components[1]
  15. if len(month) != 2 or not month.isdigit():
  16. fail("The nightly date month was not a sequence of two digits.")
  17. day = date_components[2]
  18. if len(day) != 2 or not day.isdigit():
  19. fail("The nightly date day was not a sequence of two digits.")
  20. def compute_version(ctx):
  21. """Compute the version string.
  22. Args:
  23. ctx: The context for a rule computing the version.
  24. Returns:
  25. The version string.
  26. """
  27. version = version_base
  28. # See if we need to append a pre-release suffix to the version.
  29. #
  30. # TODO: We should more fully check for erroneous combinations of flags here
  31. # to help ensure users don't get surprising results.
  32. if not ctx.attr._release_flag[BuildSettingInfo].value:
  33. pre_release = ctx.attr._pre_release_flag[BuildSettingInfo].value
  34. pre_release_numbers = {
  35. "rc": ctx.attr._rc_number_flag[BuildSettingInfo].value,
  36. }
  37. if pre_release in pre_release_numbers:
  38. number = pre_release_numbers[pre_release]
  39. if number < 0:
  40. fail("Must provide a non-negative {} number when building that pre-release.".format(pre_release))
  41. version += "-{0}.{1}".format(pre_release, number)
  42. elif pre_release == "nightly":
  43. date = ctx.attr._nightly_date_flag[BuildSettingInfo].value
  44. _validate_nightly_date(date)
  45. version += "-0.nightly.{}".format(date)
  46. elif pre_release == "dev":
  47. version += "-0.dev"
  48. else:
  49. fail("Invalid pre-release flag: " + pre_release)
  50. return version
  51. VERSION_ATTRS = {
  52. "_nightly_date_flag": attr.label(default = ":nightly_date"),
  53. "_pre_release_flag": attr.label(default = ":pre_release"),
  54. "_rc_number_flag": attr.label(default = ":rc_number"),
  55. "_release_flag": attr.label(default = ":release"),
  56. }