compute_version.bzl 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. "alpha": ctx.attr._alpha_number_flag[BuildSettingInfo].value,
  36. "beta": ctx.attr._beta_number_flag[BuildSettingInfo].value,
  37. "rc": ctx.attr._rc_number_flag[BuildSettingInfo].value,
  38. }
  39. if pre_release in pre_release_numbers:
  40. number = pre_release_numbers[pre_release]
  41. if number < 0:
  42. fail("Must provide a non-negative {} number when building that pre-release.".format(pre_release))
  43. version += "-{0}.{1}".format(pre_release, number)
  44. elif pre_release == "nightly":
  45. date = ctx.attr._nightly_date_flag[BuildSettingInfo].value
  46. _validate_nightly_date(date)
  47. version += "-0.nightly.{}".format(date)
  48. elif pre_release == "dev":
  49. version += "-0.dev"
  50. else:
  51. fail("Invalid pre-release flag: " + pre_release)
  52. return version
  53. VERSION_ATTRS = {
  54. "_alpha_number_flag": attr.label(default = ":alpha_number"),
  55. "_beta_number_flag": attr.label(default = ":beta_number"),
  56. "_nightly_date_flag": attr.label(default = ":nightly_date"),
  57. "_pre_release_flag": attr.label(default = ":pre_release"),
  58. "_rc_number_flag": attr.label(default = ":rc_number"),
  59. "_release_flag": attr.label(default = ":release"),
  60. }