Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master' into use-cc-toolchain-co…
Browse files Browse the repository at this point in the history
…nfig-for-swift
  • Loading branch information
gferon committed Sep 18, 2023
2 parents 36ad5aa + 953c281 commit 7f8ef9f
Show file tree
Hide file tree
Showing 12 changed files with 315 additions and 24 deletions.
1 change: 1 addition & 0 deletions doc/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ _DOC_SRCS = {
"swift_binary",
"swift_c_module",
"swift_compiler_plugin",
"universal_swift_compiler_plugin",
"swift_feature_allowlist",
"swift_grpc_library",
"swift_import",
Expand Down
53 changes: 53 additions & 0 deletions doc/rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ On this page:
* [swift_binary](#swift_binary)
* [swift_c_module](#swift_c_module)
* [swift_compiler_plugin](#swift_compiler_plugin)
* [universal_swift_compiler_plugin](#universal_swift_compiler_plugin)
* [swift_feature_allowlist](#swift_feature_allowlist)
* [swift_grpc_library](#swift_grpc_library)
* [swift_import](#swift_import)
Expand Down Expand Up @@ -623,3 +624,55 @@ bazel test //:Tests --test_filter=TestModuleName.TestClassName/testMethodName
| <a id="swift_test-swiftc_inputs"></a>swiftc_inputs | Additional files that are referenced using <code>$(location ...)</code> in attributes that support location expansion. | <a href="https://bazel.build/concepts/labels">List of labels</a> | optional | <code>[]</code> |


<a id="universal_swift_compiler_plugin"></a>

## universal_swift_compiler_plugin

<pre>
universal_swift_compiler_plugin(<a href="#universal_swift_compiler_plugin-name">name</a>, <a href="#universal_swift_compiler_plugin-plugin">plugin</a>)
</pre>

Wraps an existing `swift_compiler_plugin` target to produce a universal binary.

This is useful to allow sharing of caches between Intel and Apple Silicon Macs
at the cost of building everything twice.

Example:

```bzl
# The actual macro code, using SwiftSyntax, as usual.
swift_compiler_plugin(
name = "Macros",
srcs = glob(["Macros/*.swift"]),
deps = [
"@SwiftSyntax",
"@SwiftSyntax//:SwiftCompilerPlugin",
"@SwiftSyntax//:SwiftSyntaxMacros",
],
)

# Wrap your compiler plugin in this universal shim.
universal_swift_compiler_plugin(
name = "Macros.universal",
plugin = ":Macros",
)

# The library that defines the macro hook for use in your project, this
# references the universal_swift_compiler_plugin.
swift_library(
name = "MacroLibrary",
srcs = glob(["MacroLibrary/*.swift"]),
plugins = [":Macros.universal"],
)
```


**ATTRIBUTES**


| Name | Description | Type | Mandatory | Default |
| :------------- | :------------- | :------------- | :------------- | :------------- |
| <a id="universal_swift_compiler_plugin-name"></a>name | A unique name for this target. | <a href="https://bazel.build/concepts/labels#target-names">Name</a> | required | |
| <a id="universal_swift_compiler_plugin-plugin"></a>plugin | Target to generate a 'fat' binary from. | <a href="https://bazel.build/concepts/labels">Label</a> | required | |


20 changes: 19 additions & 1 deletion examples/xplatform/macros/BUILD
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
load("//swift:swift.bzl", "swift_binary", "swift_library", "swift_test")
load("//swift:swift_compiler_plugin.bzl", "swift_compiler_plugin")
load("//swift:swift_compiler_plugin.bzl", "swift_compiler_plugin", "universal_swift_compiler_plugin")

licenses(["notice"])

Expand All @@ -15,6 +15,13 @@ swift_library(
plugins = [":stringify_macro"],
)

swift_library(
name = "stringify_universal",
srcs = ["Stringify.swift"],
module_name = "StringifyUniversal",
plugins = [":stringify_macro_universal"],
)

swift_compiler_plugin(
name = "stringify_macro",
srcs = [
Expand All @@ -34,12 +41,23 @@ swift_compiler_plugin(
],
)

universal_swift_compiler_plugin(
name = "stringify_macro_universal",
plugin = ":stringify_macro",
)

swift_binary(
name = "stringify_client",
srcs = ["StringifyClient.swift"],
deps = [":stringify"],
)

swift_binary(
name = "stringify_universal_client",
srcs = ["StringifyUniversalClient.swift"],
deps = [":stringify_universal"],
)

swift_test(
name = "stringify_macro_test",
srcs = ["StringifyMacroTests.swift"],
Expand Down
22 changes: 22 additions & 0 deletions examples/xplatform/macros/StringifyUniversalClient.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// Copyright 2023 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.

import StringifyUniversal

@main
struct Main {
static func main() {
print(#stringify(1 + 2))
}
}
17 changes: 17 additions & 0 deletions platform_mappings
Original file line number Diff line number Diff line change
@@ -1,53 +1,70 @@
platforms:
@build_bazel_apple_support//platforms:macos_x86_64
--apple_platform_type=macos
--cpu=darwin_x86_64

@build_bazel_apple_support//platforms:macos_arm64
--apple_platform_type=macos
--cpu=darwin_arm64

@build_bazel_apple_support//platforms:darwin_arm64e
--apple_platform_type=macos
--cpu=darwin_arm64e

@build_bazel_apple_support//platforms:ios_i386
--apple_platform_type=ios
--cpu=ios_i386

@build_bazel_apple_support//platforms:ios_x86_64
--apple_platform_type=ios
--cpu=ios_x86_64

@build_bazel_apple_support//platforms:ios_sim_arm64
--apple_platform_type=ios
--cpu=ios_sim_arm64

@build_bazel_apple_support//platforms:ios_armv7
--apple_platform_type=ios
--cpu=ios_armv7

@build_bazel_apple_support//platforms:ios_arm64
--apple_platform_type=ios
--cpu=ios_arm64

@build_bazel_apple_support//platforms:ios_arm64e
--apple_platform_type=ios
--cpu=ios_arm64e

@build_bazel_apple_support//platforms:tvos_x86_64
--apple_platform_type=tvos
--cpu=tvos_x86_64

@build_bazel_apple_support//platforms:tvos_sim_arm64
--apple_platform_type=tvos
--cpu=tvos_sim_arm64

@build_bazel_apple_support//platforms:tvos_arm64
--apple_platform_type=tvos
--cpu=tvos_arm64

@build_bazel_apple_support//platforms:watchos_i386
--apple_platform_type=watchos
--cpu=watchos_i386

@build_bazel_apple_support//platforms:watchos_x86_64
--apple_platform_type=watchos
--cpu=watchos_x86_64

@build_bazel_apple_support//platforms:watchos_arm64
--apple_platform_type=watchos
--cpu=watchos_arm64

@build_bazel_apple_support//platforms:watchos_armv7k
--apple_platform_type=watchos
--cpu=watchos_armv7k

@build_bazel_apple_support//platforms:watchos_arm64_32
--apple_platform_type=watchos
--cpu=watchos_arm64_32

flags:
Expand Down
17 changes: 17 additions & 0 deletions platform_mappings_bzlmod
Original file line number Diff line number Diff line change
@@ -1,53 +1,70 @@
platforms:
@@apple_support~1.9.0//platforms:macos_x86_64
--apple_platform_type=macos
--cpu=darwin_x86_64

@@apple_support~1.9.0//platforms:macos_arm64
--apple_platform_type=macos
--cpu=darwin_arm64

@@apple_support~1.9.0//platforms:darwin_arm64e
--apple_platform_type=macos
--cpu=darwin_arm64e

@@apple_support~1.9.0//platforms:ios_i386
--apple_platform_type=ios
--cpu=ios_i386

@@apple_support~1.9.0//platforms:ios_x86_64
--apple_platform_type=ios
--cpu=ios_x86_64

@@apple_support~1.9.0//platforms:ios_sim_arm64
--apple_platform_type=ios
--cpu=ios_sim_arm64

@@apple_support~1.9.0//platforms:ios_armv7
--apple_platform_type=ios
--cpu=ios_armv7

@@apple_support~1.9.0//platforms:ios_arm64
--apple_platform_type=ios
--cpu=ios_arm64

@@apple_support~1.9.0//platforms:ios_arm64e
--apple_platform_type=ios
--cpu=ios_arm64e

@@apple_support~1.9.0//platforms:tvos_x86_64
--apple_platform_type=tvos
--cpu=tvos_x86_64

@@apple_support~1.9.0//platforms:tvos_sim_arm64
--apple_platform_type=tvos
--cpu=tvos_sim_arm64

@@apple_support~1.9.0//platforms:tvos_arm64
--apple_platform_type=tvos
--cpu=tvos_arm64

@@apple_support~1.9.0//platforms:watchos_i386
--apple_platform_type=watchos
--cpu=watchos_i386

@@apple_support~1.9.0//platforms:watchos_x86_64
--apple_platform_type=watchos
--cpu=watchos_x86_64

@@apple_support~1.9.0//platforms:watchos_arm64
--apple_platform_type=watchos
--cpu=watchos_arm64

@@apple_support~1.9.0//platforms:watchos_armv7k
--apple_platform_type=watchos
--cpu=watchos_armv7k

@@apple_support~1.9.0//platforms:watchos_arm64_32
--apple_platform_type=watchos
--cpu=watchos_arm64_32

flags:
Expand Down
3 changes: 3 additions & 0 deletions swift/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ bzl_library(
"//swift/internal:swift_common",
"//swift/internal:utils",
"@bazel_skylib//lib:dicts",
"@build_bazel_apple_support//lib:apple_support",
"@build_bazel_apple_support//lib:lipo",
"@build_bazel_apple_support//lib:transitions",
],
)

Expand Down
29 changes: 29 additions & 0 deletions swift/internal/swift_autoconfiguration.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ load(
"SWIFT_FEATURE_USE_MODULE_WRAP",
"SWIFT_FEATURE_USE_OLD_DRIVER",
"SWIFT_FEATURE_USE_RESPONSE_FILES",
"SWIFT_FEATURE__SUPPORTS_MACROS",
)

def _scratch_file(repository_ctx, temp_dir, name, content = ""):
Expand Down Expand Up @@ -175,6 +176,30 @@ def _write_swift_version(repository_ctx, swiftc_path):
repository_ctx.file(filename, contents, executable = False)
return filename

def _fetch_supported_features(repository_ctx, swiftc_path):
"""Fetch the json config of supported features from Swift
This can be used to flip rules specific features
Args:
repository_ctx: The repository context.
swiftc_path: The `path` to the `swiftc` executable.
Returns:
The list of supported features, or an empty array if it fails
"""
repository_ctx.file("empty.swift")
result = repository_ctx.execute([
swiftc_path,
"-frontend",
"-emit-supported-features",
"empty.swift",
])
if result.return_code == 0:
return json.decode(result.stdout.strip()).get("SupportedArguments", [])

return []

def _compute_feature_values(repository_ctx, swiftc_path):
"""Computes a list of supported/unsupported features by running checks.
Expand Down Expand Up @@ -274,6 +299,10 @@ def _create_linux_toolchain(repository_ctx):
feature_values.append(SWIFT_FEATURE_USE_AUTOLINK_EXTRACT)
feature_values.append(SWIFT_FEATURE_USE_MODULE_WRAP)

swift_features_config = _fetch_supported_features(repository_ctx, path_to_swiftc)
if "load-plugin-executable" in swift_features_config:
feature_values.append(SWIFT_FEATURE__SUPPORTS_MACROS)

repository_ctx.file(
"BUILD",
"""
Expand Down
2 changes: 2 additions & 0 deletions swift/swift.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ load(
load(
"@build_bazel_rules_swift//swift:swift_compiler_plugin.bzl",
_swift_compiler_plugin = "swift_compiler_plugin",
_universal_swift_compiler_plugin = "universal_swift_compiler_plugin",
)
load(
"@build_bazel_rules_swift//swift/internal:swift_feature_allowlist.bzl",
Expand Down Expand Up @@ -101,6 +102,7 @@ swift_common = _swift_common
swift_binary = _swift_binary
swift_c_module = _swift_c_module
swift_compiler_plugin = _swift_compiler_plugin
universal_swift_compiler_plugin = _universal_swift_compiler_plugin
swift_feature_allowlist = _swift_feature_allowlist
swift_grpc_library = _swift_grpc_library
swift_import = _swift_import
Expand Down
Loading

0 comments on commit 7f8ef9f

Please sign in to comment.