Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
devel:tools:building
bazel-apple-support
bazel-apple-support-0.7.1.obscpio
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File bazel-apple-support-0.7.1.obscpio of Package bazel-apple-support
07070100000000000041ED000003E800000064000000025D4DB8B500000000000000000000000000000000000000000000002300000000bazel-apple-support-0.7.1/.bazelci07070100000001000081A4000003E800000064000000015D4DB8B5000002FC000000000000000000000000000000000000003100000000bazel-apple-support-0.7.1/.bazelci/presubmit.yml--- x_defaults: # YAML has a feature for "repeated nodes", BazelCI is fine with extra nodes # it doesn't know about; so that is used to avoid repeating common subparts. common: &common platform: macos build_targets: - "//..." test_targets: - "//..." tasks: macos_latest: name: "Latest Bazel" bazel: latest <<: *common macos_last_green: name: "Last Green Bazel" bazel: last_green <<: *common macos_latest_head_deps: name: "Latest Bazel with Head Deps" bazel: latest shell_commands: # Update the WORKSPACE to use head versions of some deps to ensure nothing # has landed on them breaking this project. - .bazelci/update_workspace_to_deps_heads.sh <<: *common buildifier: latest 07070100000002000081ED000003E800000064000000015D4DB8B5000003C9000000000000000000000000000000000000004500000000bazel-apple-support-0.7.1/.bazelci/update_workspace_to_deps_heads.sh#!/bin/bash # Copyright 2019 The Bazel Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set -eu # Modify the WORKSPACE to pull in the master branches of some deps. sed \ -i "" \ -e \ '/^workspace.*/a \ \ load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")\ \ git_repository(\ \ name = "bazel_skylib",\ \ remote = "https://github.com/bazelbuild/bazel-skylib.git",\ \ branch = "master",\ )\ ' \ WORKSPACE 07070100000003000081A4000003E800000064000000015D4DB8B500000131000000000000000000000000000000000000002200000000bazel-apple-support-0.7.1/AUTHORS# This the official list of Bazel authors for copyright purposes. # This file is distinct from the CONTRIBUTORS files. # See the latter for an explanation. # Names should be added to this file as: # Name or Organization <email address> # The email address is not required for organizations. Google Inc. 07070100000004000081A4000003E800000064000000015D4DB8B50000035D000000000000000000000000000000000000002000000000bazel-apple-support-0.7.1/BUILDload("@bazel_skylib//:bzl_library.bzl", "bzl_library") licenses(["notice"]) exports_files(["LICENSE"]) # A bzl_library incase anything needs to depend on this for other libraries # (like to then use stardoc). bzl_library( name = "bzl_library", srcs = glob(["*.bzl"]), visibility = ["//visibility:public"], deps = [ "//lib:bzl_library", "//rules:bzl_library", ], ) # Consumed by bazel tests. filegroup( name = "for_bazel_tests", testonly = 1, srcs = [ "WORKSPACE", "//lib:for_bazel_tests", "//rules:for_bazel_tests", "//tools:for_bazel_tests", ], # Exposed publicly just so other rules can use this if they set up # integration tests that need to copy all the support files into # a temporary workspace for the tests. visibility = ["//visibility:public"], ) 07070100000005000081A4000003E800000064000000015D4DB8B50000099C000000000000000000000000000000000000002A00000000bazel-apple-support-0.7.1/CONTRIBUTING.md# How to Contribute We'd love to accept your patches and contributions to this project. There are just a few small guidelines you need to follow. ## File or claim an issue Please let us know what you're working on if you want to change or add to the project. Before undertaking something, please file an issue or claim an existing issue. All significant changes/additions should also be discussed before they can be accepted. This gives all participants a chance to validate the design and to avoid duplication of effort. Ensuring that there is an issue for discussion before working on a PR helps everyone provide input/discussion/advice and avoid a PR having to get restarted based on useful feedback. We use [labels](https://github.com/bazelbuild/apple_support/labels) for the issues and pull requests to help track priorities, things being considered, deferred, etc. A project owner will try to update labels every week or so, as workloads permit. ## Contributor License Agreement Contributions to this project must be accompanied by a Contributor License Agreement. You (or your employer) retain the copyright to your contribution; this simply gives us permission to use and redistribute your contributions as part of the project. Head over to <https://cla.developers.google.com/> to see your current agreements on file or to sign a new one. You generally only need to submit a CLA once, so if you've already submitted one (even if it was for a different project), you probably don't need to do it again. ## Setting up your development environment To enforce a consistent code style through our code base, we use `buildifier` from the [bazelbuild/buildtools](https://github.com/bazelbuild/buildtools) to format `BUILD` and `*.bzl` files. We also use `buildifier --lint=warn` to check for common issues. You can download `buildifier` from [bazelbuild/buildtools Releases Page](https://github.com/bazelbuild/buildtools/releases). Bazel's CI is configured to ensure that files in pull requests are formatted correctly and that there are no lint issues. ## Code reviews All submissions, including submissions by project members, require review. We use GitHub pull requests for this purpose. Consult [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more information on using pull requests. ## Community Guidelines This project follows [Google's Open Source Community Guidelines](https://opensource.google.com/conduct/). 07070100000006000081A4000003E800000064000000015D4DB8B500000228000000000000000000000000000000000000002700000000bazel-apple-support-0.7.1/CONTRIBUTORS# People who have agreed to one of the CLAs and can contribute patches. # The AUTHORS file lists the copyright holders; this file # lists people. For example, Google employees are listed here # but not in AUTHORS, because Google holds the copyright. # # https://developers.google.com/open-source/cla/individual # https://developers.google.com/open-source/cla/corporate # # Names should be added to this file as: # Name <email address> Sergio Campamá <kaipi@google.com> Thomas Van Lenten <thomasvl@google.com> Tony Allevato <allevato@google.com> 07070100000007000081A4000003E800000064000000015D4DB8B500002C5E000000000000000000000000000000000000002200000000bazel-apple-support-0.7.1/LICENSE Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. 07070100000008000081A4000003E800000064000000015D4DB8B500000302000000000000000000000000000000000000002400000000bazel-apple-support-0.7.1/README.md# Apple Support for [Bazel](https://bazel.build) [![Build Status](https://badge.buildkite.com/6739ca70cb485ecec4ec403f4d6775269728aece4bb984127f.svg?branch=master)](https://buildkite.com/bazel/apple-support-darwin) This repository contains helper methods that support building rules that target Apple platforms. ## Quick setup Add the following to your `WORKSPACE` file to add this repository as a dependency: ```python load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") git_repository( name = "build_bazel_apple_support", remote = "https://github.com/bazelbuild/apple_support.git", tag = "0.7.0", ) load( "@build_bazel_apple_support//lib:repositories.bzl", "apple_support_dependencies", ) apple_support_dependencies() ``` 07070100000009000081A4000003E800000064000000015D4DB8B5000000AF000000000000000000000000000000000000002400000000bazel-apple-support-0.7.1/WORKSPACEworkspace(name = "build_bazel_apple_support") load( "@build_bazel_apple_support//lib:repositories.bzl", "apple_support_dependencies", ) apple_support_dependencies() 0707010000000A000041ED000003E800000064000000025D4DB8B500000000000000000000000000000000000000000000001E00000000bazel-apple-support-0.7.1/doc0707010000000B000081A4000003E800000064000000015D4DB8B5000004C6000000000000000000000000000000000000002800000000bazel-apple-support-0.7.1/doc/README.md# Apple Support Starlark Modules and Rules Apple Support provides a collection of Starlark helpers for rule authors targeting Apple Platforms (and Xcode) as well as some Rules directly. ## Starlark Modules <table class="table table-condensed table-bordered table-params"> <thead> <tr> <th><code>.bzl</code> file</th> <th>Module</th> </tr> </thead> <tbody> <tr> <td valign="top"><code>@build_bazel_apple_support//lib:apple_support.bzl</code></td> <td valign="top"><code><a href="apple_support.md">apple_support</a></code><br/></td> </tr> <tr> <td valign="top"><code>@build_bazel_apple_support//lib:xcode_support.bzl</code></td> <td valign="top"><code><a href="xcode_support.md">xcode_support</a></code><br/></td> </tr> </tbody> </table> ## Rules <table class="table table-condensed table-bordered table-params"> <thead> <tr> <th><code>.bzl</code> file</th> <th>Rules</th> </tr> </thead> <tbody> <tr> <td valign="top"><code>@build_bazel_apple_support//rules:apple_genrule.bzl</code></td> <td valign="top"><code><a href="rules.md#apple_genrule">apple_genrule</a></code><br/></td> </tr> </tbody> </table> 0707010000000C000081A4000003E800000064000000015D4DB8B500002B6F000000000000000000000000000000000000002F00000000bazel-apple-support-0.7.1/doc/apple_support.md# `apple_support` Starlark Module <!-- Generated file, do not edit directly. --> A module of helpers for rule authors to aid in writing actions that target Apple platforms. To use these in your Starlark code, simply load the module; for example: ```build load("@build_bazel_apple_support//lib:apple_support.bzl", "apple_support") ``` <!-- BEGIN_TOC --> On this page: * [apple_support.action_required_attrs](#apple_support.action_required_attrs) * [apple_support.action_required_env](#apple_support.action_required_env) * [apple_support.action_required_execution_requirements](#apple_support.action_required_execution_requirements) * [apple_support.path_placeholders.platform_frameworks](#apple_support.path_placeholders.platform_frameworks) * [apple_support.path_placeholders.sdkroot](#apple_support.path_placeholders.sdkroot) * [apple_support.path_placeholders.xcode](#apple_support.path_placeholders.xcode) * [apple_support.run](#apple_support.run) * [apple_support.run_shell](#apple_support.run_shell) <!-- END_TOC --> <a name="apple_support.action_required_attrs"></a> ## apple_support.action_required_attrs <pre style="white-space: normal"> apple_support.action_required_attrs() </pre> Returns a dictionary with required attributes for registering actions on Apple platforms. This method adds private attributes which should not be used outside of the apple_support codebase. It also adds the following attributes which are considered to be public for rule maintainers to use: * `_xcode_config`: Attribute that references a target containing the single `apple_common.XcodeVersionConfig` provider. This provider can be used to inspect Xcode-related properties about the Xcode being used for the build, as specified with the `--xcode_version` Bazel flag. The most common way to retrieve this provider is: `ctx.attr._xcode_config[apple_common.XcodeVersionConfig]`. The returned `dict` can be added to the rule's attributes using Skylib's `dicts.add()` method. <a name="apple_support.action_required_attrs.returns"></a> ### Returns A `dict` object containing attributes to be added to rule implementations. <a name="apple_support.action_required_env"></a> ## apple_support.action_required_env <pre style="white-space: normal"> apple_support.action_required_env(<a href="#apple_support.action_required_env.ctx">ctx</a>) </pre> Returns a dictionary with the environment variables required for Xcode path resolution. In most cases, you should _not_ use this API. It exists solely for using it on test rules, where the test action registration API is not available in Starlark. To use these environment variables for a test, your test rule needs to propagate the `testing.TestEnvironment` provider, which takes a dictionary with environment variables to set during the test execution. <a name="apple_support.action_required_env.arguments"></a> ### Arguments <table class="params-table"> <colgroup> <col class="col-param" /> <col class="col-description" /> </colgroup> <tbody> <tr id="apple_support.action_required_env.ctx"> <td><code>ctx</code></td> <td><p><code>Required</code></p><p>The context of the rule registering the action.</p></td> </tr> </tbody> </table> <a name="apple_support.action_required_env.returns"></a> ### Returns A dictionary with environment variables required for Xcode path resolution. <a name="apple_support.action_required_execution_requirements"></a> ## apple_support.action_required_execution_requirements <pre style="white-space: normal"> apple_support.action_required_execution_requirements() </pre> Returns a dictionary with the execution requirements for running actions on Apple platforms. In most cases, you should _not_ use this API. It exists solely for using it on test rules, where the test action registration API is not available in Starlark. To use these environment variables for a test, your test rule needs to propagate the `testing.TestExecution` provider, which takes a dictionary with execution requirements for the test action. <a name="apple_support.action_required_execution_requirements.returns"></a> ### Returns A dictionary with execution requirements for running actions on Apple platforms. <a name="apple_support.path_placeholders.platform_frameworks"></a> ## apple_support.path_placeholders.platform_frameworks <pre style="white-space: normal"> apple_support.path_placeholders.platform_frameworks(<a href="#apple_support.path_placeholders.platform_frameworks.ctx">ctx</a>) </pre> Returns the platform's frameworks directory, anchored to the Xcode path placeholder. <a name="apple_support.path_placeholders.platform_frameworks.arguments"></a> ### Arguments <table class="params-table"> <colgroup> <col class="col-param" /> <col class="col-description" /> </colgroup> <tbody> <tr id="apple_support.path_placeholders.platform_frameworks.ctx"> <td><code>ctx</code></td> <td><p><code>Required</code></p><p>The context of the rule that will register an action.</p></td> </tr> </tbody> </table> <a name="apple_support.path_placeholders.platform_frameworks.returns"></a> ### Returns Returns a string with the platform's frameworks directory, anchored to the Xcode path placeholder. <a name="apple_support.path_placeholders.sdkroot"></a> ## apple_support.path_placeholders.sdkroot <pre style="white-space: normal"> apple_support.path_placeholders.sdkroot() </pre> Returns a placeholder value to be replaced with SDKROOT during action execution. In order to get this values replaced, you'll need to use the `apple_support.run()` API by setting the `xcode_path_resolve_level` argument to either the `apple_support.xcode_path_resolve_level.args` or `apple_support.xcode_path_resolve_level.args_and_files` value. <a name="apple_support.path_placeholders.sdkroot.returns"></a> ### Returns Returns a placeholder value to be replaced with SDKROOT during action execution. <a name="apple_support.path_placeholders.xcode"></a> ## apple_support.path_placeholders.xcode <pre style="white-space: normal"> apple_support.path_placeholders.xcode() </pre> Returns a placeholder value to be replaced with DEVELOPER_DIR during action execution. In order to get this values replaced, you'll need to use the `apple_support.run()` API by setting the `xcode_path_resolve_level` argument to either the `apple_support.xcode_path_resolve_level.args` or `apple_support.xcode_path_resolve_level.args_and_files` value. <a name="apple_support.path_placeholders.xcode.returns"></a> ### Returns Returns a placeholder value to be replaced with DEVELOPER_DIR during action execution. <a name="apple_support.run"></a> ## apple_support.run <pre style="white-space: normal"> apple_support.run(<a href="#apple_support.run.ctx">ctx</a>, <a href="#apple_support.run.xcode_path_resolve_level">xcode_path_resolve_level</a>=None, <a href="#apple_support.run.**kwargs">**kwargs</a>) </pre> Registers an action to run on an Apple machine. In order to use `apple_support.run()`, you'll need to modify your rule definition to add the following: * `fragments = ["apple"]` * Add the `apple_support.action_required_attrs()` attributes to the `attrs` dictionary. This can be done using the `dicts.add()` method from Skylib. This method registers an action to run on an Apple machine, configuring it to ensure that the `DEVELOPER_DIR` and `SDKROOT` environment variables are set. If the `xcode_path_resolve_level` is enabled, this method will replace the given `executable` with a wrapper script that will replace all instances of the `__BAZEL_XCODE_DEVELOPER_DIR__` and `__BAZEL_XCODE_SDKROOT__` placeholders in the given arguments with the values of `DEVELOPER_DIR` and `SDKROOT`, respectively. In your rule implementation, you can use references to Xcode through the `apple_support.path_placeholders` API, which in turn uses the placeholder values as described above. The available APIs are: * `apple_support.path_placeholders.xcode()`: Returns a reference to the Xcode.app installation path. * `apple_support.path_placeholders.sdkroot()`: Returns a reference to the SDK root path. * `apple_support.path_placeholders.platform_frameworks(ctx)`: Returns the Frameworks path within the Xcode installation, for the requested platform. If the `xcode_path_resolve_level` value is: * `apple_support.xcode_path_resolve_level.none`: No processing will be done to the given `arguments`. * `apple_support.xcode_path_resolve_level.args`: Only instances of the placeholders in the argument strings will be replaced. * `apple_support.xcode_path_resolve_level.args_and_files`: Instances of the placeholders in the arguments strings and instances of the placeholders within response files (i.e. any path argument beginning with `@`) will be replaced. <a name="apple_support.run.arguments"></a> ### Arguments <table class="params-table"> <colgroup> <col class="col-param" /> <col class="col-description" /> </colgroup> <tbody> <tr id="apple_support.run.ctx"> <td><code>ctx</code></td> <td><p><code>Required</code></p><p>The context of the rule registering the action.</p></td> </tr> <tr id="apple_support.run.xcode_path_resolve_level"> <td><code>xcode_path_resolve_level</code></td> <td><p><code>Optional; default is None</code></p><p>The level of Xcode path replacement required for the action.</p></td> </tr> <tr id="apple_support.run.**kwargs"> <td><code>**kwargs</code></td> <td><p>See <code>ctx.actions.run</code> for the rest of the available arguments.</p></td> </tr> </tbody> </table> <a name="apple_support.run_shell"></a> ## apple_support.run_shell <pre style="white-space: normal"> apple_support.run_shell(<a href="#apple_support.run_shell.ctx">ctx</a>, <a href="#apple_support.run_shell.**kwargs">**kwargs</a>) </pre> Registers a shell action to run on an Apple machine. In order to use `apple_support.run_shell()`, you'll need to modify your rule definition to add the following: * `fragments = ["apple"]` * Add the `apple_support.action_required_attrs()` attributes to the `attrs` dictionary. This can be done using the `dicts.add()` method from Skylib. This method registers an action to run on an Apple machine, configuring it to ensure that the `DEVELOPER_DIR` and `SDKROOT` environment variables are set. `run_shell` does not support placeholder substitution. To achieve placeholder substitution, please use `run` instead. <a name="apple_support.run_shell.arguments"></a> ### Arguments <table class="params-table"> <colgroup> <col class="col-param" /> <col class="col-description" /> </colgroup> <tbody> <tr id="apple_support.run_shell.ctx"> <td><code>ctx</code></td> <td><p><code>Required</code></p><p>The context of the rule registering the action.</p></td> </tr> <tr id="apple_support.run_shell.**kwargs"> <td><code>**kwargs</code></td> <td><p>See <code>ctx.actions.run</code> for the rest of the available arguments.</p></td> </tr> </tbody> </table> 0707010000000D000081A4000003E800000064000000015D4DB8B5000011DB000000000000000000000000000000000000002700000000bazel-apple-support-0.7.1/doc/rules.md# Build Rules <!-- Generated file, do not edit directly. --> Build Rules provided by Apple Support. <!-- BEGIN_TOC --> On this page: * [apple_genrule](#apple_genrule) <!-- END_TOC --> <a name="apple_genrule"></a> ## apple_genrule <pre style="white-space: normal"> apple_genrule(<a href="#apple_genrule.name">name</a>, <a href="#apple_genrule.cmd">cmd</a>, <a href="#apple_genrule.executable">executable</a>=False, <a href="#apple_genrule.outs">outs</a>=[], <a href="#apple_genrule.srcs">srcs</a>=[], <a href="#apple_genrule.message">message</a>=None, <a href="#apple_genrule.tools">tools</a>=[], <a href="#apple_genrule.no_sandbox">no_sandbox</a>=False, <a href="#apple_genrule.**kwargs">**kwargs</a>) </pre> Genrule which provides Apple specific environment and make variables. This mirrors the native genrule except that it provides a different set of make variables. This rule will only run on a Mac. Example of use: ``` load("@build_bazel_apple_support//rules:apple_genrule.bzl", "apple_genrule") apple_genrule( name = "world", outs = ["hi"], cmd = "touch $@", ) ``` This rule also does location expansion, much like the native genrule. For example, `$(location hi)` may be used to refer to the output in the above example. The set of make variables that are supported for this rule: * `OUTS`: The outs list. If you have only one output file, you can also use `$@`. * `SRCS`: The srcs list (or more precisely, the pathnames of the files corresponding to labels in the srcs list). If you have only one source file, you can also use `$<`. * `<`: srcs, if it's a single file. * `@`: outs, if it's a single file. * `@D`: The output directory. If there is only one filename in outs, this expands to the directory containing that file. If there are multiple filenames, this variable instead expands to the package's root directory in the genfiles tree, even if all the generated files belong to the same subdirectory. The following environment variables are added to the rule action: * `DEVELOPER_DIR`: The base developer directory as defined on Apple architectures, most commonly used in invoking Apple tools such as xcrun. * `SDKROOT`: The base SDK directory as defined on Apple architectures, most commonly used in invoking Apple tools such as xcrun. <a name="apple_genrule.arguments"></a> ### Arguments <table class="params-table"> <colgroup> <col class="col-param" /> <col class="col-description" /> </colgroup> <tbody> <tr id="apple_genrule.name"> <td><code>name</code></td> <td><p><code>Required</code></p><p>The name of the target.</p></td> </tr> <tr id="apple_genrule.cmd"> <td><code>cmd</code></td> <td><p><code>Required</code></p><p>The command to run. Subject the variable substitution.</p></td> </tr> <tr id="apple_genrule.executable"> <td><code>executable</code></td> <td><p><code>Optional; default is False</code></p><p>Boolean. Declare output to be executable. Setting this flag to 1 means the output is an executable file and can be run using the run command. The genrule must produce exactly one output in this case.</p></td> </tr> <tr id="apple_genrule.outs"> <td><code>outs</code></td> <td><p><code>Optional; default is []</code></p><p>A list of files generated by this rule. If the executable flag is set, outs must contain exactly one label.</p></td> </tr> <tr id="apple_genrule.srcs"> <td><code>srcs</code></td> <td><p><code>Optional; default is []</code></p><p>A list of inputs for this rule, such as source files to process.</p></td> </tr> <tr id="apple_genrule.message"> <td><code>message</code></td> <td><p><code>Optional; default is None</code></p><p>A progress message to be reported as the rule runs.</p></td> </tr> <tr id="apple_genrule.tools"> <td><code>tools</code></td> <td><p><code>Optional; default is []</code></p><p>A list of tool dependencies for this rule, they will be available when the action is run.</p></td> </tr> <tr id="apple_genrule.no_sandbox"> <td><code>no_sandbox</code></td> <td><p><code>Optional; default is False</code></p><p>If the sandbox should be disabled when the action is run.</p></td> </tr> <tr id="apple_genrule.**kwargs"> <td><code>**kwargs</code></td> <td><p>Extra args meant to just be the common rules for all rules (tags, etc.).</p></td> </tr> </tbody> </table> 0707010000000E000081A4000003E800000064000000015D4DB8B500000894000000000000000000000000000000000000002F00000000bazel-apple-support-0.7.1/doc/xcode_support.md# `xcode_support` Starlark Module <!-- Generated file, do not edit directly. --> A modules of helpers for rule authors to aid in writing rules that need to change what they do based on attributes of the active Xcode. To use these in your Starlark code, simply load the module; for example: ```build load("@build_bazel_apple_support//lib:xcode_support.bzl", "xcode_support") ``` <!-- BEGIN_TOC --> On this page: * [xcode_support.is_xcode_at_least_version](#xcode_support.is_xcode_at_least_version) <!-- END_TOC --> <a name="xcode_support.is_xcode_at_least_version"></a> ## xcode_support.is_xcode_at_least_version <pre style="white-space: normal"> xcode_support.is_xcode_at_least_version(<a href="#xcode_support.is_xcode_at_least_version.xcode_config">xcode_config</a>, <a href="#xcode_support.is_xcode_at_least_version.version">version</a>) </pre> Returns True if Xcode version is at least a given version. This method takes as input an `XcodeVersionConfig` provider, which can be obtained from the `_xcode_config` attribute (e.g. `ctx.attr._xcode_config[apple_common.XcodeVersionConfig]`). This provider should contain the Xcode version parameters with which this rule is being built with. If you need to add this attribute to your rule implementation, please refer to `apple_support.action_required_attrs()`. <a name="xcode_support.is_xcode_at_least_version.arguments"></a> ### Arguments <table class="params-table"> <colgroup> <col class="col-param" /> <col class="col-description" /> </colgroup> <tbody> <tr id="xcode_support.is_xcode_at_least_version.xcode_config"> <td><code>xcode_config</code></td> <td><p><code>Required</code></p><p>The XcodeVersionConfig provider from the <code>_xcode_config</code> attribute's value.</p></td> </tr> <tr id="xcode_support.is_xcode_at_least_version.version"> <td><code>version</code></td> <td><p><code>Required</code></p><p>The minimum desired Xcode version, as a dotted version string.</p></td> </tr> </tbody> </table> <a name="xcode_support.is_xcode_at_least_version.returns"></a> ### Returns True if the given `xcode_config` version at least as high as the requested version. 0707010000000F000041ED000003E800000064000000025D4DB8B500000000000000000000000000000000000000000000001E00000000bazel-apple-support-0.7.1/lib07070100000010000081A4000003E800000064000000015D4DB8B5000001A8000000000000000000000000000000000000002400000000bazel-apple-support-0.7.1/lib/BUILDload("@bazel_skylib//:bzl_library.bzl", "bzl_library") licenses(["notice"]) # For the bzl_library at the root of the apple_support. bzl_library( name = "bzl_library", srcs = glob(["*.bzl"]), visibility = ["//:__pkg__"], deps = ["@bazel_skylib//lib:types"], ) # Consumed by bazel tests. filegroup( name = "for_bazel_tests", testonly = 1, srcs = glob(["**"]), visibility = ["//:__pkg__"], ) 07070100000011000081A4000003E800000064000000015D4DB8B500003821000000000000000000000000000000000000003000000000bazel-apple-support-0.7.1/lib/apple_support.bzl# Copyright 2018 The Bazel Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Definitions for registering actions on Apple platforms.""" load("@bazel_skylib//lib:types.bzl", "types") # Options to declare the level of Xcode path resolving needed in an `apple_support.run()` # invocation. _XCODE_PATH_RESOLVE_LEVEL = struct( none = None, args = "args", args_and_files = "args_and_files", ) def _platform_frameworks_path_placeholder(ctx): """Returns the platform's frameworks directory, anchored to the Xcode path placeholder. Args: ctx: The context of the rule that will register an action. Returns: Returns a string with the platform's frameworks directory, anchored to the Xcode path placeholder. """ return "{xcode_path}/Platforms/{platform_name}.platform/Developer/Library/Frameworks".format( platform_name = ctx.fragments.apple.single_arch_platform.name_in_plist, xcode_path = _xcode_path_placeholder(), ) def _sdkroot_path_placeholder(): """Returns a placeholder value to be replaced with SDKROOT during action execution. In order to get this values replaced, you'll need to use the `apple_support.run()` API by setting the `xcode_path_resolve_level` argument to either the `apple_support.xcode_path_resolve_level.args` or `apple_support.xcode_path_resolve_level.args_and_files` value. Returns: Returns a placeholder value to be replaced with SDKROOT during action execution. """ return "__BAZEL_XCODE_SDKROOT__" def _xcode_path_placeholder(): """Returns a placeholder value to be replaced with DEVELOPER_DIR during action execution. In order to get this values replaced, you'll need to use the `apple_support.run()` API by setting the `xcode_path_resolve_level` argument to either the `apple_support.xcode_path_resolve_level.args` or `apple_support.xcode_path_resolve_level.args_and_files` value. Returns: Returns a placeholder value to be replaced with DEVELOPER_DIR during action execution. """ return "__BAZEL_XCODE_DEVELOPER_DIR__" def _add_dicts(*dictionaries): """Adds a list of dictionaries into a single dictionary.""" # If keys are repeated in multiple dictionaries, the latter one "wins". result = {} for d in dictionaries: result.update(d) return result def _kwargs_for_apple_platform(ctx, additional_env = None, **kwargs): """Returns a modified dictionary with required arguments to run on Apple platforms.""" processed_args = dict(kwargs) # Make sure that _xcode_config is properly set. _validate_attribute_present(ctx, "_xcode_config") env_dicts = [] original_env = processed_args.get("env") if original_env: env_dicts.append(original_env) if additional_env: env_dicts.append(additional_env) # Add the environment variables required for DEVELOPER_DIR and SDKROOT last to avoid clients # overriding this value. env_dicts.append(_action_required_env(ctx)) execution_requirement_dicts = [] original_execution_requirements = processed_args.get("execution_requirements") if original_execution_requirements: execution_requirement_dicts.append(original_execution_requirements) # Add the execution requirements last to avoid clients overriding this value. execution_requirement_dicts.append(_action_required_execution_requirements()) processed_args["env"] = _add_dicts(*env_dicts) processed_args["execution_requirements"] = _add_dicts(*execution_requirement_dicts) return processed_args def _validate_attribute_present(ctx, attribute_name): """Validates that the given attribute is present for the rule, failing otherwise.""" if not hasattr(ctx.attr, attribute_name): fail("\n".join([ "", "ERROR: This rule requires the '{}' attribute to be present. ".format(attribute_name), "To add this attribute, modify your rule definition like this:", "", "load(\"@bazel_skylib//lib:dicts.bzl\", \"dicts\")", "load(", " \"@build_bazel_apple_support//lib:apple_support.bzl\",", " \"apple_support\",", ")", "", "your_rule_name = rule(", " attrs = dicts.add(apple_support.action_required_attrs(), {", " # other attributes", " }),", " # other rule arguments", ")", "", ])) def _action_required_attrs(): """Returns a dictionary with required attributes for registering actions on Apple platforms. This method adds private attributes which should not be used outside of the apple_support codebase. It also adds the following attributes which are considered to be public for rule maintainers to use: * `_xcode_config`: Attribute that references a target containing the single `apple_common.XcodeVersionConfig` provider. This provider can be used to inspect Xcode-related properties about the Xcode being used for the build, as specified with the `--xcode_version` Bazel flag. The most common way to retrieve this provider is: `ctx.attr._xcode_config[apple_common.XcodeVersionConfig]`. The returned `dict` can be added to the rule's attributes using Skylib's `dicts.add()` method. Returns: A `dict` object containing attributes to be added to rule implementations. """ return { "_xcode_config": attr.label( default = configuration_field( name = "xcode_config_label", fragment = "apple", ), ), "_xcode_path_wrapper": attr.label( cfg = "host", executable = True, default = Label("@build_bazel_apple_support//tools:xcode_path_wrapper"), ), } def _action_required_env(ctx): """Returns a dictionary with the environment variables required for Xcode path resolution. In most cases, you should _not_ use this API. It exists solely for using it on test rules, where the test action registration API is not available in Starlark. To use these environment variables for a test, your test rule needs to propagate the `testing.TestEnvironment` provider, which takes a dictionary with environment variables to set during the test execution. Args: ctx: The context of the rule registering the action. Returns: A dictionary with environment variables required for Xcode path resolution. """ platform = ctx.fragments.apple.single_arch_platform xcode_config = ctx.attr._xcode_config[apple_common.XcodeVersionConfig] return _add_dicts( apple_common.apple_host_system_env(xcode_config), apple_common.target_apple_env(xcode_config, platform), ) def _action_required_execution_requirements(): """Returns a dictionary with the execution requirements for running actions on Apple platforms. In most cases, you should _not_ use this API. It exists solely for using it on test rules, where the test action registration API is not available in Starlark. To use these environment variables for a test, your test rule needs to propagate the `testing.TestExecution` provider, which takes a dictionary with execution requirements for the test action. Returns: A dictionary with execution requirements for running actions on Apple platforms. """ return {"requires-darwin": "1"} def _run(ctx, xcode_path_resolve_level = _XCODE_PATH_RESOLVE_LEVEL.none, **kwargs): """Registers an action to run on an Apple machine. In order to use `apple_support.run()`, you'll need to modify your rule definition to add the following: * `fragments = ["apple"]` * Add the `apple_support.action_required_attrs()` attributes to the `attrs` dictionary. This can be done using the `dicts.add()` method from Skylib. This method registers an action to run on an Apple machine, configuring it to ensure that the `DEVELOPER_DIR` and `SDKROOT` environment variables are set. If the `xcode_path_resolve_level` is enabled, this method will replace the given `executable` with a wrapper script that will replace all instances of the `__BAZEL_XCODE_DEVELOPER_DIR__` and `__BAZEL_XCODE_SDKROOT__` placeholders in the given arguments with the values of `DEVELOPER_DIR` and `SDKROOT`, respectively. In your rule implementation, you can use references to Xcode through the `apple_support.path_placeholders` API, which in turn uses the placeholder values as described above. The available APIs are: * `apple_support.path_placeholders.xcode()`: Returns a reference to the Xcode.app installation path. * `apple_support.path_placeholders.sdkroot()`: Returns a reference to the SDK root path. * `apple_support.path_placeholders.platform_frameworks(ctx)`: Returns the Frameworks path within the Xcode installation, for the requested platform. If the `xcode_path_resolve_level` value is: * `apple_support.xcode_path_resolve_level.none`: No processing will be done to the given `arguments`. * `apple_support.xcode_path_resolve_level.args`: Only instances of the placeholders in the argument strings will be replaced. * `apple_support.xcode_path_resolve_level.args_and_files`: Instances of the placeholders in the arguments strings and instances of the placeholders within response files (i.e. any path argument beginning with `@`) will be replaced. Args: ctx: The context of the rule registering the action. xcode_path_resolve_level: The level of Xcode path replacement required for the action. **kwargs: See `ctx.actions.run` for the rest of the available arguments. """ if xcode_path_resolve_level == _XCODE_PATH_RESOLVE_LEVEL.none: ctx.actions.run(**_kwargs_for_apple_platform(ctx, **kwargs)) return # If using the wrapper script, also make sure that it exists. _validate_attribute_present(ctx, "_xcode_path_wrapper") processed_kwargs = _kwargs_for_apple_platform( ctx, additional_env = {"XCODE_PATH_RESOLVE_LEVEL": xcode_path_resolve_level}, **kwargs ) all_arguments = [] # If the client requires Xcode path resolving, push the original executable to be the first # argument, as the executable will be set to be the xcode_path_wrapper script. executable_args = ctx.actions.args() original_executable = processed_kwargs.pop("executable") executable_args.add(original_executable) all_arguments.append(executable_args) # Append the original arguments to the full list of arguments, after the original executable. original_args_list = processed_kwargs.pop("arguments", []) if original_args_list: all_arguments.extend(original_args_list) # We also need to include the user executable in the "tools" argument of the action, since it # won't be referenced by "executable" anymore. original_tools = processed_kwargs.pop("tools", None) if types.is_list(original_tools): all_tools = [original_executable] + original_tools elif types.is_depset(original_tools): all_tools = depset([original_executable], transitive = [original_tools]) elif original_tools: fail("'tools' argument must be a sequence or depset.") elif not types.is_string(original_executable): # Only add the user_executable to the "tools" list if it's a File, not a string. all_tools = [original_executable] else: all_tools = [] ctx.actions.run( executable = ctx.executable._xcode_path_wrapper, arguments = all_arguments, tools = all_tools, **processed_kwargs ) def _run_shell(ctx, **kwargs): """Registers a shell action to run on an Apple machine. In order to use `apple_support.run_shell()`, you'll need to modify your rule definition to add the following: * `fragments = ["apple"]` * Add the `apple_support.action_required_attrs()` attributes to the `attrs` dictionary. This can be done using the `dicts.add()` method from Skylib. This method registers an action to run on an Apple machine, configuring it to ensure that the `DEVELOPER_DIR` and `SDKROOT` environment variables are set. `run_shell` does not support placeholder substitution. To achieve placeholder substitution, please use `run` instead. Args: ctx: The context of the rule registering the action. **kwargs: See `ctx.actions.run` for the rest of the available arguments. """ _validate_attribute_present(ctx, "_xcode_config") # TODO(b/77637734) remove "workaround" once the bazel issue is resolved. # Bazel doesn't always get the shell right for a single string `commands`; # so work around that case by faking it as a list of strings that forces # the shell correctly. command = kwargs.get("command") if command and types.is_string(command): processed_args = dict(kwargs) processed_args["command"] = ["/bin/sh", "-c", command] kwargs = processed_args ctx.actions.run_shell(**_kwargs_for_apple_platform(ctx, **kwargs)) apple_support = struct( action_required_attrs = _action_required_attrs, action_required_env = _action_required_env, action_required_execution_requirements = _action_required_execution_requirements, path_placeholders = struct( platform_frameworks = _platform_frameworks_path_placeholder, sdkroot = _sdkroot_path_placeholder, xcode = _xcode_path_placeholder, ), run = _run, run_shell = _run_shell, xcode_path_resolve_level = _XCODE_PATH_RESOLVE_LEVEL, ) 07070100000012000081A4000003E800000064000000015D4DB8B500000430000000000000000000000000000000000000003600000000bazel-apple-support-0.7.1/lib/framework_migration.bzl# Copyright 2019 The Bazel Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Helper functions related to apple framework cleanup migration.""" def _is_post_framework_migration(): """Determine whether bazel is pre- or post- framework infrastructure migration. Returns: Whether bazel has been updated to use the new framework infrastructure. """ return hasattr(apple_common.new_objc_provider(), "static_framework_names") framework_migration = struct( is_post_framework_migration = _is_post_framework_migration, ) 07070100000013000081A4000003E800000064000000015D4DB8B5000006FF000000000000000000000000000000000000002F00000000bazel-apple-support-0.7.1/lib/repositories.bzl# Copyright 2018 The Bazel Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Definitions for handling Bazel repositories used by apple_support.""" load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") def _maybe(repo_rule, name, **kwargs): """Executes the given repository rule if it hasn't been executed already. Args: repo_rule: The repository rule to be executed (e.g., `git_repository`.) name: The name of the repository to be defined by the rule. **kwargs: Additional arguments passed directly to the repository rule. """ if not native.existing_rule(name): repo_rule(name = name, **kwargs) def apple_support_dependencies(): """Fetches repository dependencies of the `apple_support` workspace. Users should call this macro in their `WORKSPACE` to ensure that all of the dependencies of the Swift rules are downloaded and that they are isolated from changes to those dependencies. """ _maybe( http_archive, name = "bazel_skylib", urls = [ "https://github.com/bazelbuild/bazel-skylib/releases/download/0.9.0/bazel_skylib-0.9.0.tar.gz", ], sha256 = "1dde365491125a3db70731e25658dfdd3bc5dbdfd11b840b3e987ecf043c7ca0", ) 07070100000014000081A4000003E800000064000000015D4DB8B5000007F2000000000000000000000000000000000000003000000000bazel-apple-support-0.7.1/lib/xcode_support.bzl# Copyright 2019 The Bazel Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Support functions for working with Xcode configurations.""" def _is_xcode_at_least_version(xcode_config, version): """Returns True if Xcode version is at least a given version. This method takes as input an `XcodeVersionConfig` provider, which can be obtained from the `_xcode_config` attribute (e.g. `ctx.attr._xcode_config[apple_common.XcodeVersionConfig]`). This provider should contain the Xcode version parameters with which this rule is being built with. If you need to add this attribute to your rule implementation, please refer to `apple_support.action_required_attrs()`. Args: xcode_config: The XcodeVersionConfig provider from the `_xcode_config` attribute's value. version: The minimum desired Xcode version, as a dotted version string. Returns: True if the given `xcode_config` version at least as high as the requested version. """ current_version = xcode_config.xcode_version() if not current_version: fail("Could not determine Xcode version at all. This likely means Xcode isn't available; " + "if you think this is a mistake, please file an issue.") desired_version = apple_common.dotted_version(version) return current_version >= desired_version # Define the loadable module that lists the exported symbols in this file. xcode_support = struct( is_xcode_at_least_version = _is_xcode_at_least_version, ) 07070100000015000041ED000003E800000064000000025D4DB8B500000000000000000000000000000000000000000000002000000000bazel-apple-support-0.7.1/rules07070100000016000081A4000003E800000064000000015D4DB8B50000017F000000000000000000000000000000000000002600000000bazel-apple-support-0.7.1/rules/BUILDload("@bazel_skylib//:bzl_library.bzl", "bzl_library") licenses(["notice"]) # For the bzl_library at the root of the apple_support. bzl_library( name = "bzl_library", srcs = glob(["*.bzl"]), visibility = ["//:__pkg__"], ) # Consumed by bazel tests. filegroup( name = "for_bazel_tests", testonly = 1, srcs = glob(["**"]), visibility = ["//:__pkg__"], ) 07070100000017000081A4000003E800000064000000015D4DB8B500002106000000000000000000000000000000000000003200000000bazel-apple-support-0.7.1/rules/apple_genrule.bzl# Copyright 2017 The Bazel Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Genrule which provides Apple's Xcode environment.""" load("@bazel_skylib//lib:dicts.bzl", "dicts") load("@bazel_skylib//lib:paths.bzl", "paths") load("//lib:apple_support.bzl", "apple_support") def _compute_make_variables( genfiles_dir, label, resolved_srcs, files_to_build): resolved_srcs_list = resolved_srcs.to_list() files_to_build_list = files_to_build.to_list() variables = { "OUTS": " ".join([x.path for x in files_to_build_list]), "SRCS": " ".join([x.path for x in resolved_srcs_list]), } if len(resolved_srcs_list) == 1: variables["<"] = resolved_srcs_list[0].path if len(files_to_build_list) == 1: variables["@"] = files_to_build_list[0].path variables["@D"] = paths.dirname(variables["@"]) else: variables["@D"] = genfiles_dir.path + "/" + label.package return variables def _apple_genrule_impl(ctx): if not ctx.outputs.outs: fail("apple_genrule must have one or more outputs", attr = "outs") files_to_build = depset(ctx.outputs.outs) if ctx.attr.executable and len(files_to_build.to_list()) > 1: fail( "if genrules produce executables, they are allowed only one output. " + "If you need the executable=1 argument, then you should split this " + "genrule into genrules producing single outputs", attr = "executable", ) resolved_srcs = depset(transitive = [dep.files for dep in ctx.attr.srcs]) label_dict = {dep.label: dep.files.to_list() for dep in ctx.attr.srcs} resolved_inputs, argv, runfiles_manifests = ctx.resolve_command( command = ctx.attr.cmd, attribute = "cmd", expand_locations = True, make_variables = _compute_make_variables( ctx.genfiles_dir, ctx.label, depset(resolved_srcs.to_list()), files_to_build, ), tools = ctx.attr.tools, label_dict = label_dict, execution_requirements = apple_support.action_required_execution_requirements(), ) message = ctx.attr.message or "Executing apple_genrule" extra_args = {} if ctx.attr.no_sandbox: extra_args["execution_requirements"] = {"no-sandbox": "1"} apple_support.run_shell( ctx, inputs = resolved_srcs.to_list() + resolved_inputs, outputs = files_to_build.to_list(), env = ctx.configuration.default_shell_env, command = argv, progress_message = "%s %s" % (message, ctx.label), mnemonic = "Genrule", input_manifests = runfiles_manifests, **extra_args ) return [ DefaultInfo( files = files_to_build, data_runfiles = ctx.runfiles(transitive_files = files_to_build), ), ] _apple_genrule_inner = rule( implementation = _apple_genrule_impl, attrs = dicts.add(apple_support.action_required_attrs(), { "srcs": attr.label_list(allow_files = True), "outs": attr.output_list(mandatory = True), "cmd": attr.string(mandatory = True), "executable": attr.bool(default = False), "message": attr.string(), "no_sandbox": attr.bool(), "tools": attr.label_list(cfg = "host", allow_files = True), }), output_to_genfiles = True, fragments = ["apple"], ) def apple_genrule( name, cmd, executable = False, outs = [], srcs = [], message = None, tools = [], no_sandbox = False, **kwargs): """Genrule which provides Apple specific environment and make variables. This mirrors the native genrule except that it provides a different set of make variables. This rule will only run on a Mac. Example of use: ``` load("@build_bazel_apple_support//rules:apple_genrule.bzl", "apple_genrule") apple_genrule( name = "world", outs = ["hi"], cmd = "touch $@", ) ``` This rule also does location expansion, much like the native genrule. For example, `$(location hi)` may be used to refer to the output in the above example. The set of make variables that are supported for this rule: * `OUTS`: The outs list. If you have only one output file, you can also use `$@`. * `SRCS`: The srcs list (or more precisely, the pathnames of the files corresponding to labels in the srcs list). If you have only one source file, you can also use `$<`. * `<`: srcs, if it's a single file. * `@`: outs, if it's a single file. * `@D`: The output directory. If there is only one filename in outs, this expands to the directory containing that file. If there are multiple filenames, this variable instead expands to the package's root directory in the genfiles tree, even if all the generated files belong to the same subdirectory. The following environment variables are added to the rule action: * `DEVELOPER_DIR`: The base developer directory as defined on Apple architectures, most commonly used in invoking Apple tools such as xcrun. * `SDKROOT`: The base SDK directory as defined on Apple architectures, most commonly used in invoking Apple tools such as xcrun. Args: name: The name of the target. cmd: The command to run. Subject the variable substitution. executable: Boolean. Declare output to be executable. Setting this flag to 1 means the output is an executable file and can be run using the run command. The genrule must produce exactly one output in this case. outs: A list of files generated by this rule. If the executable flag is set, outs must contain exactly one label. srcs: A list of inputs for this rule, such as source files to process. message: A progress message to be reported as the rule runs. tools: A list of tool dependencies for this rule, they will be available when the action is run. no_sandbox: If the sandbox should be disabled when the action is run. **kwargs: Extra args meant to just be the common rules for all rules (tags, etc.). """ if executable: if len(outs) != 1: fail("apple_genrule, if executable, must have exactly one output") intermediate_out = outs[0] + ".nonexecutable" # Remove any visibility and make this sub rule private since it is an # implementation detail. sub_kwargs = dict(kwargs) sub_kwargs.pop("visibility", None) _apple_genrule_inner( name = name + "_nonexecutable", outs = [intermediate_out], cmd = cmd, srcs = srcs, message = message, tools = tools, no_sandbox = no_sandbox, executable = executable, visibility = ["//visibility:private"], **sub_kwargs ) # Remove anything from kwargs that might have a meaning that isn't wanted # on the genrule that does the copy. Generally, we are just trying to # keep things like testonly, visibility, etc. trimmed_kwargs = dict(kwargs) trimmed_kwargs.pop("stamp", None) native.genrule( name = name, outs = outs, srcs = [intermediate_out], cmd = "cp $< $@", executable = True, **trimmed_kwargs ) else: _apple_genrule_inner( name = name, outs = outs, cmd = cmd, srcs = srcs, message = message, tools = tools, executable = executable, no_sandbox = no_sandbox, **kwargs ) 07070100000018000041ED000003E800000064000000025D4DB8B500000000000000000000000000000000000000000000001F00000000bazel-apple-support-0.7.1/test07070100000019000081A4000003E800000064000000015D4DB8B500000308000000000000000000000000000000000000002500000000bazel-apple-support-0.7.1/test/BUILDload("//rules:apple_genrule.bzl", "apple_genrule") load(":apple_support_test.bzl", "apple_support_test") load(":xcode_support_test.bzl", "xcode_support_test") licenses(["notice"]) # Custom rules that test rule-context APIs. Check their implementations for more details. apple_support_test(name = "apple_support_test") xcode_support_test(name = "xcode_support_test") # Test to ensure the environment variable contract of apple_genrule. sh_test( name = "apple_genrule_test", size = "small", srcs = ["apple_genrule_test.sh"], args = ["$(location simple_genrule.txt)"], data = ["simple_genrule.txt"], ) apple_genrule( name = "simple_genrule", outs = ["simple_genrule.txt"], cmd = "printenv | grep \"^\\(DEVELOPER_DIR\\|SDKROOT\\)\" > $(@)", ) 0707010000001A000081ED000003E800000064000000015D4DB8B50000048C000000000000000000000000000000000000003500000000bazel-apple-support-0.7.1/test/apple_genrule_test.sh#!/bin/bash # Copyright 2019 The Bazel Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. set -eu # Integration test for apple_genrule. # This test checks that the first argument contains a file that contains # Xcode environment variables. Since the file was generated using an # apple_genrule using `printenv`, we enforce that the contract of providing the # DEVELOPER_DIR and SDKROOT environment variables is maintained. INPUT_FILE="$1" if ! grep -Fq DEVELOPER_DIR "$INPUT_FILE"; then echo "FAILURE: DEVELOPER_DIR not found." exit 1 fi if ! grep -Fq SDKROOT "$INPUT_FILE"; then echo "FAILURE: SDKROOT not found." exit 1 fi 0707010000001B000081A4000003E800000064000000015D4DB8B5000018C8000000000000000000000000000000000000003600000000bazel-apple-support-0.7.1/test/apple_support_test.bzl# Copyright 2018 The Bazel Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Definition of a test rule to test apple_support.""" load( "@build_bazel_apple_support//lib:apple_support.bzl", "apple_support", ) # Contents of the tool that writes the state of the action into a file. The first argument to this # script is the path to the output file. _TEST_TOOL_CONTENTS = """#!/bin/bash set -eu OUTPUT_FILE="$1" shift echo "XCODE_PATH_ENV=$DEVELOPER_DIR" > "$OUTPUT_FILE" echo "SDKROOT_PATH_ENV=$SDKROOT" >> "$OUTPUT_FILE" for arg in "$@"; do if [[ "$arg" == @* ]]; then cat "${arg:1}" >> "$OUTPUT_FILE" else echo "$arg" >> "$OUTPUT_FILE" fi done """ # Template for the test script used to validate that the action outputs contain the expected # values. _TEST_SCRIPT_CONTENTS = """ #!/bin/bash set -eu FILES=( {file_paths} ) function assert_contains_line() {{ file="$1" contents="$2" if [[ -f "$file" ]]; then grep -Fxq "$contents" "$file" || \ (echo "In file: $file"; \ echo "Expected contents not found: $contents"; \ echo "File contents:"; \ cat "$file"; \ exit 1) else echo "$file doesn't exist" exit 1 fi }} function assert_not_contains() {{ file="$1" contents="$2" if [[ -f "$file" ]]; then grep -Fq "$contents" "$file" || return 0 else echo "$file doesn't exist" exit 1 fi echo "In file: $file" echo "Contents found but not expected: $contents" echo "File contents:" cat "$file" exit 1 }} XCODE_PATH_ENV="$DEVELOPER_DIR" SDKROOT_PATH_ENV="$SDKROOT" for file in "${{FILES[@]}}"; do assert_contains_line "$file" "XCODE_PATH_ENV=$XCODE_PATH_ENV" assert_contains_line "$file" "SDKROOT_PATH_ENV=$SDKROOT_PATH_ENV" assert_not_contains "$file" "{xcode_path_placeholder}" assert_not_contains "$file" "{sdkroot_path_placeholder}" done echo "Test passed" exit 0 """ def _apple_support_test_impl(ctx): """Implementation of the apple_support_test rule.""" # Declare all the action outputs run_output = ctx.actions.declare_file( "{}_run_output".format(ctx.label.name), ) run_output_xcode_path_in_args = ctx.actions.declare_file( "{}_run_output_xcode_path_in_args".format(ctx.label.name), ) run_output_xcode_path_in_file = ctx.actions.declare_file( "{}_run_output_xcode_path_in_file".format(ctx.label.name), ) run_shell_output = ctx.actions.declare_file( "{}_run_shell_output".format(ctx.label.name), ) test_tool = ctx.actions.declare_file("{}_test_tool".format(ctx.label.name)) ctx.actions.write(test_tool, _TEST_TOOL_CONTENTS, is_executable = True) # Create one action per possible combination of inputs to the apple_support.run and # apple_support.run_shell helper methods. apple_support.run( ctx, outputs = [run_output], executable = test_tool, arguments = [run_output.path], ) apple_support.run( ctx, outputs = [run_output_xcode_path_in_args], executable = test_tool, arguments = [ run_output_xcode_path_in_args.path, "XCODE_PATH_ARG={}".format(apple_support.path_placeholders.xcode()), "FRAMEWORKS_PATH_ARG={}".format( apple_support.path_placeholders.platform_frameworks(ctx), ), "SDKROOT_PATH_ARG={}".format(apple_support.path_placeholders.sdkroot()), ], xcode_path_resolve_level = apple_support.xcode_path_resolve_level.args, ) action_args = ctx.actions.args() action_args.add( "XCODE_PATH_ARG={}".format(apple_support.path_placeholders.xcode()), ) action_args.add( "FRAMEWORKS_PATH_ARG={}".format(apple_support.path_placeholders.platform_frameworks(ctx)), ) action_args.add( "SDKROOT_PATH_ARG={}".format(apple_support.path_placeholders.sdkroot()), ) action_args.set_param_file_format("multiline") action_args.use_param_file("@%s", use_always = True) apple_support.run( ctx, outputs = [run_output_xcode_path_in_file], executable = test_tool, arguments = [ run_output_xcode_path_in_file.path, action_args, ], xcode_path_resolve_level = apple_support.xcode_path_resolve_level.args_and_files, ) apple_support.run_shell( ctx, outputs = [run_shell_output], tools = [test_tool], command = ["/bin/bash", "-c", "{tool} {output}".format( output = run_shell_output.path, tool = test_tool.path, )], ) test_files = [ run_output, run_output_xcode_path_in_args, run_output_xcode_path_in_file, run_shell_output, ] test_script = ctx.actions.declare_file("{}_test_script".format(ctx.label.name)) ctx.actions.write(test_script, _TEST_SCRIPT_CONTENTS.format( file_paths = "\n ".join([x.short_path for x in test_files]), sdkroot_path_placeholder = apple_support.path_placeholders.sdkroot(), xcode_path_placeholder = apple_support.path_placeholders.xcode(), ), is_executable = True) return [ testing.ExecutionInfo(apple_support.action_required_execution_requirements()), testing.TestEnvironment(apple_support.action_required_env(ctx)), DefaultInfo( executable = test_script, files = depset([run_output_xcode_path_in_args]), runfiles = ctx.runfiles( files = test_files, ), ), ] apple_support_test = rule( implementation = _apple_support_test_impl, attrs = apple_support.action_required_attrs(), fragments = ["apple"], test = True, ) 0707010000001C000081A4000003E800000064000000015D4DB8B5000007FF000000000000000000000000000000000000003600000000bazel-apple-support-0.7.1/test/xcode_support_test.bzl# Copyright 2019 The Bazel Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Definition of a test rule to test xcode_support.""" load( "@build_bazel_apple_support//lib:apple_support.bzl", "apple_support", ) load( "@build_bazel_apple_support//lib:xcode_support.bzl", "xcode_support", ) # Template for the test script used to validate that the action outputs contain the expected # values. _TEST_SCRIPT_CONTENTS = """ #!/bin/bash set -eu if [[ "{past_version_is_true}" != "True" ]]; then echo "FAILURE: 'past_version_is_true' should be True, but it's {past_version_is_true}." exit 1 fi if [[ "{future_version_is_false}" != "False" ]]; then echo "FAILURE: 'future_version_is_false' should be False, but it's {future_version_is_false}." exit 1 fi """ def _xcode_support_test_impl(ctx): """Implementation of the xcode_support_test rule.""" test_script = ctx.actions.declare_file("{}_test_script".format(ctx.label.name)) xcode_config = ctx.attr._xcode_config[apple_common.XcodeVersionConfig] ctx.actions.write(test_script, _TEST_SCRIPT_CONTENTS.format( past_version_is_true = str(xcode_support.is_xcode_at_least_version(xcode_config, "1.0")), future_version_is_false = str(xcode_support.is_xcode_at_least_version(xcode_config, "999")), ), is_executable = True) return [DefaultInfo(executable = test_script)] xcode_support_test = rule( implementation = _xcode_support_test_impl, attrs = apple_support.action_required_attrs(), test = True, ) 0707010000001D000041ED000003E800000064000000025D4DB8B500000000000000000000000000000000000000000000002000000000bazel-apple-support-0.7.1/tools0707010000001E000081A4000003E800000064000000015D4DB8B500000277000000000000000000000000000000000000002600000000bazel-apple-support-0.7.1/tools/BUILDlicenses(["notice"]) # Additional files, such as tools, that should be present in a test's runfiles # during coverage collection. filegroup( name = "coverage_support", # Public so other rules can add the dependencies via this group. visibility = ["//visibility:public"], ) sh_binary( name = "xcode_path_wrapper", srcs = ["xcode_path_wrapper.sh"], # Added to rules as a private attribute, so it needs to be public. visibility = ["//visibility:public"], ) # Consumed by bazel tests. filegroup( name = "for_bazel_tests", testonly = 1, srcs = glob(["**"]), visibility = ["//:__pkg__"], ) 0707010000001F000081ED000003E800000064000000015D4DB8B500000F67000000000000000000000000000000000000003600000000bazel-apple-support-0.7.1/tools/xcode_path_wrapper.sh#!/bin/bash # # Copyright 2018 The Bazel Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # SYNOPSIS # Replaces Bazel placeholder values with DEVELOPER_DIR and SDKROOT in the # argument list or in params files with their actual values. # # This script requires the XCODE_PATH_RESOLVE_LEVEL environment variable to be # set to either the `args` or `args_and_files` values. When the value is # `args`, only the given arguments will be processed to replace instances of # the Bazel placeholders with DEVELOPER_DIR and SDKROOT. When the value is # `args_and_files`, as well as processing the args as before, if an argument # begins with `@`, it will be treated as a response file and the contents of # such file will be processed to replaced the Bazel placeholder values. # # USAGE # xcode_path_wrapper.sh <executable> <arguments...> # # ARGUMENTS # executable: The actual executable to launch. # arguments...: Arguments that are processed and then passed to the # executable. set -eu if [[ -z "${XCODE_PATH_RESOLVE_LEVEL:-}" ]]; then cat <<END ERROR: xcode_path_wrapper.sh requires to be invoked with the \ XCODE_PATH_RESOLVE_LEVEL environment variable set to either 'args' or \ 'args_and_files' END exit 1 fi # SYNOPSIS # Rewrites any Bazel placeholder strings in the given argument string, # echoing the result. # # USAGE # rewrite_argument <argument> function rewrite_argument { ARG="$1" ARG="${ARG//__BAZEL_XCODE_DEVELOPER_DIR__/$DEVELOPER_DIR}" ARG="${ARG//__BAZEL_XCODE_SDKROOT__/$SDKROOT}" echo "$ARG" } # SYNOPSIS # Rewrites any Bazel placeholder strings in the given params file, if any. # If there were no substitutions to be made, the original path is echoed back # out; otherwise, this function echoes the path to a temporary file # containing the rewritten file. # # USAGE # rewrite_params_file <path> function rewrite_params_file { PARAMSFILE="$1" if grep -qe '__BAZEL_XCODE_\(DEVELOPER_DIR\|SDKROOT\)__' "$PARAMSFILE" ; then NEWFILE="$(mktemp "${TMPDIR%/}/bazel_xcode_wrapper_params.XXXXXXXXXX")" sed \ -e "s#__BAZEL_XCODE_DEVELOPER_DIR__#$DEVELOPER_DIR#g" \ -e "s#__BAZEL_XCODE_SDKROOT__#$SDKROOT#g" \ "$PARAMSFILE" > "$NEWFILE" echo "$NEWFILE" else # There were no placeholders to substitute, so just return the original # file. echo "$PARAMSFILE" fi } TOOLNAME="$1" shift ARGS=() if [[ "$XCODE_PATH_RESOLVE_LEVEL" == "args" ]]; then for ARG in "$@" ; do ARGS+=("$(rewrite_argument "$ARG")") done exec "$TOOLNAME" "${ARGS[@]}" elif [[ "$XCODE_PATH_RESOLVE_LEVEL" == "args_and_files" ]]; then # If any temporary files are created (like rewritten response files), clean # them up when the script exits. TEMPFILES=() trap '[[ ${#TEMPFILES[@]} -ne 0 ]] && rm "${TEMPFILES[@]}"' EXIT for ARG in "$@" ; do case "$ARG" in @*) PARAMSFILE="${ARG:1}" NEWFILE=$(rewrite_params_file "$PARAMSFILE") if [[ "$PARAMSFILE" != "$NEWFILE" ]] ; then TEMPFILES+=("$NEWFILE") fi ARG="@$NEWFILE" ;; *) ARG=$(rewrite_argument "$ARG") ;; esac ARGS+=("$ARG") done # We can't use `exec` here because we need to make sure the `trap` runs # afterward. "$TOOLNAME" "${ARGS[@]}" else cat <<END ERROR: Unrecognized value for XCODE_PATH_RESOLVE_LEVEL: \ "$XCODE_PATH_RESOLVE_LEVEL" END exit 1 fi 07070100000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000B00000000TRAILER!!!168 blocks
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor