old_contents: """ Rule for building Boost from sources. """
  
  load("//foreign_cc/private:detect_root.bzl", "detect_root")
  load(
      "//foreign_cc/private:framework.bzl",
      "CC_EXTERNAL_RULE_ATTRIBUTES",
      "CC_EXTERNAL_RULE_FRAGMENTS",
      "cc_external_rule_impl",
      "create_attrs",
  )
  
  def _boost_build_impl(ctx):
      attrs = create_attrs(
          ctx.attr,
          configure_name = "BoostBuild",
          create_configure_script = _create_configure_script,
          make_commands = ["./b2 install {} --prefix=.".format(" ".join(ctx.attr.user_options))],
      )
      return cc_external_rule_impl(ctx, attrs)
  
  def _create_configure_script(configureParameters):
      ctx = configureParameters.ctx
      root = detect_root(ctx.attr.lib_source)
  
      return [
          "cd $INSTALLDIR",
          "##copy_dir_contents_to_dir## $$EXT_BUILD_ROOT$$/{}/. .".format(root),
          "./bootstrap.sh {}".format(" ".join(ctx.attr.bootstrap_options)),
      ]
  
  def _attrs():
      attrs = dict(CC_EXTERNAL_RULE_ATTRIBUTES)
      attrs.pop("targets")
      attrs.pop("make_commands")
      attrs.update({
          "bootstrap_options": attr.string_list(
              doc = "any additional flags to pass to bootstrap.sh",
              mandatory = False,
          ),
          "user_options": attr.string_list(
              doc = "any additional flags to pass to b2",
              mandatory = False,
          ),
      })
      return attrs
  
  boost_build = rule(
      doc = "Rule for building Boost. Invokes bootstrap.sh and then b2 install.",
      attrs = _attrs(),
      fragments = CC_EXTERNAL_RULE_FRAGMENTS,
      output_to_genfiles = True,
      implementation = _boost_build_impl,
      toolchains = [
          "@rules_foreign_cc//foreign_cc/private/framework:shell_toolchain",
          "@bazel_tools//tools/cpp:toolchain_type",
      ],
      # TODO: Remove once https://github.com/bazelbuild/bazel/issues/11584 is closed and the min supported
      # version is updated to a release of Bazel containing the new default for this setting.
      incompatible_use_toolchain_transition = True,
  )
  
new_contents: """ Rule for building Boost from sources. """
  
  load("//foreign_cc/private:detect_root.bzl", "detect_root")
  load(
      "//foreign_cc/private:framework.bzl",
      "CC_EXTERNAL_RULE_ATTRIBUTES",
      "CC_EXTERNAL_RULE_FRAGMENTS",
      "cc_external_rule_impl",
      "create_attrs",
  )
  
  def _boost_build_impl(ctx):
      attrs = create_attrs(
          ctx.attr,
          configure_name = "BoostBuild",
          create_configure_script = _create_configure_script,
          make_commands = ["./b2 install {} --prefix=.".format(" ".join(ctx.attr.user_options))],
      )
      return cc_external_rule_impl(ctx, attrs)
  
  def _create_configure_script(configureParameters):
      ctx = configureParameters.ctx
      root = detect_root(ctx.attr.lib_source)
  
      return [
          "cd $INSTALLDIR",
          "##copy_dir_contents_to_dir## $$EXT_BUILD_ROOT$$/{}/. .".format(root),
          "chmod -R +w .",
          "./bootstrap.sh {}".format(" ".join(ctx.attr.bootstrap_options)),
      ]
  
  def _attrs():
      attrs = dict(CC_EXTERNAL_RULE_ATTRIBUTES)
      attrs.pop("targets")
      attrs.pop("make_commands")
      attrs.update({
          "bootstrap_options": attr.string_list(
              doc = "any additional flags to pass to bootstrap.sh",
              mandatory = False,
          ),
          "user_options": attr.string_list(
              doc = "any additional flags to pass to b2",
              mandatory = False,
          ),
      })
      return attrs
  
  boost_build = rule(
      doc = "Rule for building Boost. Invokes bootstrap.sh and then b2 install.",
      attrs = _attrs(),
      fragments = CC_EXTERNAL_RULE_FRAGMENTS,
      output_to_genfiles = True,
      implementation = _boost_build_impl,
      toolchains = [
          "@rules_foreign_cc//foreign_cc/private/framework:shell_toolchain",
          "@bazel_tools//tools/cpp:toolchain_type",
      ],
      # TODO: Remove once https://github.com/bazelbuild/bazel/issues/11584 is closed and the min supported
      # version is updated to a release of Bazel containing the new default for this setting.
      incompatible_use_toolchain_transition = True,
  )
  
subject: set write permission on boost_build for INSTALL_DIR (#653)