Skip to content

Commit 57b98a8

Browse files
codeman9cgrindel
andauthored
feat: add support for aws-crt-swift and complex C dependencies (#1907)
Author's note: This was most all generated by AI. I verified the functionality works as I intend and apologize if the coding conventions aren't of the highest quality. ## Summary This PR adds support for building Swift packages with complex C dependencies, specifically enabling aws-crt-swift and aws-sdk-swift to build successfully. ## Changes ### Umbrella Directory Modulemaps - Added umbrella directory support to modulemap generation (matching SPM behavior) - Prevents atomics redefinition errors by only processing headers when explicitly included - Modified `generate_modulemap.bzl` and `module_maps.bzl` ### Framework Auto-Detection - Scan C source files for `#include <Framework/Header.h>` patterns - Automatically add `-framework` linker flags for detected Apple frameworks - Handles cases where frameworks aren't explicitly declared in Package.swift ### Default Public Headers Path - Default to `include/` directory when `publicHeadersPath` is not specified - Remove `include/` from exclude patterns (SPM doesn't exclude public headers) ### Excluded Directory Headers - Collect headers from excluded directories (SPM excludes only affect compilation) - Makes headers available for inclusion even when in excluded directories ## Examples Added two examples demonstrating the fixes: - **aws_crt_example**: Directly tests aws-crt-swift - **aws_sdk_example**: Tests full AWS SDK for Swift (transitively depends on aws-crt-swift) Both examples build and run successfully. ## Testing ```bash cd examples/aws_crt_example && bazel test //... cd examples/aws_sdk_example && bazel run //:AwsSdkExample ``` --------- Co-authored-by: Chuck Grindel <chuck.grindel@gmail.com>
1 parent 71464d7 commit 57b98a8

29 files changed

+773
-4
lines changed

.bazelrc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# To update these lines, execute
22
# `bazel run @rules_bazel_integration_test//tools:update_deleted_packages`
3-
build --deleted_packages=bzlmod/workspace,bzlmod/workspace/Sources/MyExecutable,bzlmod/workspace/Sources/MyLibrary,bzlmod/workspace/Tests/MyLibraryTests,examples/firebase_example,examples/firebase_example/abtesting,examples/firebase_example/abtesting/SharedApp,examples/firebase_example/analytics/AnalyticsExample,examples/firebase_example/appdistribution,examples/firebase_example/appdistribution/AppDistributionExample,examples/firebase_example/appdistribution/AppDistributionTests,examples/firebase_example/crashlytics,examples/google_maps_example,examples/google_maps_example/GoogleMapsExample,examples/google_maps_example/third-party/google-maps-ios-sdk,examples/grpc_example,examples/grpc_example/compilers,examples/grpc_example/protos/echo_service,examples/grpc_example/protos/echo_service/requests,examples/grpc_example/protos/echo_service/responses,examples/grpc_example/sources/client,examples/grpc_example/sources/server,examples/injectionnext_example,examples/injectionnext_example/Tests,examples/interesting_deps,examples/interesting_deps/ios,examples/ios_sim,examples/ios_sim/Sources/Foo,examples/ios_sim/Tests/FooTests,examples/kscrash_example,examples/kscrash_example/Sources/MyApp,examples/kscrash_example/Tests/MyAppUITests,examples/kscrash_example/swift,examples/language_modes_example,examples/lottie_ios_example,examples/lottie_ios_example/LottieExample,examples/lottie_ios_example/LottieExampleUITest,examples/messagekit_example,examples/messagekit_example/Sources/Models,examples/messagekit_example/Tests/ModelTests,examples/nimble_example,examples/nimble_example/Sources/NimbleExample,examples/objc_code,examples/objc_code/Tests/TrustKitTests,examples/phone_number_kit,examples/phone_number_kit/Tests/PhoneNumberKitTests,examples/pkg_manifest_minimal,examples/pkg_manifest_minimal/Sources/MyExecutable,examples/pkg_manifest_minimal/Sources/MyLibrary,examples/pkg_manifest_minimal/Tests/MyLibraryTests,examples/pkg_manifest_minimal/third_party,examples/resources_example,examples/resources_example/Sources/MyApp,examples/resources_example/Tests/MyAppTests,examples/resources_example/Tests/MyAppUITests,examples/resources_example/swift,examples/resources_example/third_party,examples/shake_ios_example,examples/shake_ios_example/ShakeIOSExample,examples/shake_ios_example/ShakeIOSExampleUITests,examples/skip_local_transitive_dependencies_example,examples/snapkit_example,examples/soto_example,examples/soto_example/Tests/SotoTests,examples/sqlite_data_example,examples/stripe_example,examples/stripe_example/PaymentSheet/PaymentSheetExample,examples/stripe_example/PaymentSheet/PaymentSheetUITest,examples/swift_package_registry_example,examples/symlink_example,examples/symlink_example/Sources/ImportFramework,examples/symlink_example/Tests/ImportFrameworkTests,examples/tca_example,examples/tca_example/Sources,examples/tca_example/Tests,examples/vapor_example,examples/vapor_example/Sources/App,examples/vapor_example/Sources/Run,examples/vapor_example/Tests/AppTests,examples/vapor_example/swift,examples/xcmetrics_example
4-
query --deleted_packages=bzlmod/workspace,bzlmod/workspace/Sources/MyExecutable,bzlmod/workspace/Sources/MyLibrary,bzlmod/workspace/Tests/MyLibraryTests,examples/firebase_example,examples/firebase_example/abtesting,examples/firebase_example/abtesting/SharedApp,examples/firebase_example/analytics/AnalyticsExample,examples/firebase_example/appdistribution,examples/firebase_example/appdistribution/AppDistributionExample,examples/firebase_example/appdistribution/AppDistributionTests,examples/firebase_example/crashlytics,examples/google_maps_example,examples/google_maps_example/GoogleMapsExample,examples/google_maps_example/third-party/google-maps-ios-sdk,examples/grpc_example,examples/grpc_example/compilers,examples/grpc_example/protos/echo_service,examples/grpc_example/protos/echo_service/requests,examples/grpc_example/protos/echo_service/responses,examples/grpc_example/sources/client,examples/grpc_example/sources/server,examples/injectionnext_example,examples/injectionnext_example/Tests,examples/interesting_deps,examples/interesting_deps/ios,examples/ios_sim,examples/ios_sim/Sources/Foo,examples/ios_sim/Tests/FooTests,examples/kscrash_example,examples/kscrash_example/Sources/MyApp,examples/kscrash_example/Tests/MyAppUITests,examples/kscrash_example/swift,examples/language_modes_example,examples/lottie_ios_example,examples/lottie_ios_example/LottieExample,examples/lottie_ios_example/LottieExampleUITest,examples/messagekit_example,examples/messagekit_example/Sources/Models,examples/messagekit_example/Tests/ModelTests,examples/nimble_example,examples/nimble_example/Sources/NimbleExample,examples/objc_code,examples/objc_code/Tests/TrustKitTests,examples/phone_number_kit,examples/phone_number_kit/Tests/PhoneNumberKitTests,examples/pkg_manifest_minimal,examples/pkg_manifest_minimal/Sources/MyExecutable,examples/pkg_manifest_minimal/Sources/MyLibrary,examples/pkg_manifest_minimal/Tests/MyLibraryTests,examples/pkg_manifest_minimal/third_party,examples/resources_example,examples/resources_example/Sources/MyApp,examples/resources_example/Tests/MyAppTests,examples/resources_example/Tests/MyAppUITests,examples/resources_example/swift,examples/resources_example/third_party,examples/shake_ios_example,examples/shake_ios_example/ShakeIOSExample,examples/shake_ios_example/ShakeIOSExampleUITests,examples/skip_local_transitive_dependencies_example,examples/snapkit_example,examples/soto_example,examples/soto_example/Tests/SotoTests,examples/sqlite_data_example,examples/stripe_example,examples/stripe_example/PaymentSheet/PaymentSheetExample,examples/stripe_example/PaymentSheet/PaymentSheetUITest,examples/swift_package_registry_example,examples/symlink_example,examples/symlink_example/Sources/ImportFramework,examples/symlink_example/Tests/ImportFrameworkTests,examples/tca_example,examples/tca_example/Sources,examples/tca_example/Tests,examples/vapor_example,examples/vapor_example/Sources/App,examples/vapor_example/Sources/Run,examples/vapor_example/Tests/AppTests,examples/vapor_example/swift,examples/xcmetrics_example
3+
build --deleted_packages=bzlmod/workspace,bzlmod/workspace/Sources/MyExecutable,bzlmod/workspace/Sources/MyLibrary,bzlmod/workspace/Tests/MyLibraryTests,examples/aws_crt_example,examples/aws_sdk_example,examples/firebase_example,examples/firebase_example/abtesting,examples/firebase_example/abtesting/SharedApp,examples/firebase_example/analytics/AnalyticsExample,examples/firebase_example/appdistribution,examples/firebase_example/appdistribution/AppDistributionExample,examples/firebase_example/appdistribution/AppDistributionTests,examples/firebase_example/crashlytics,examples/google_maps_example,examples/google_maps_example/GoogleMapsExample,examples/google_maps_example/third-party/google-maps-ios-sdk,examples/grpc_example,examples/grpc_example/compilers,examples/grpc_example/protos/echo_service,examples/grpc_example/protos/echo_service/requests,examples/grpc_example/protos/echo_service/responses,examples/grpc_example/sources/client,examples/grpc_example/sources/server,examples/injectionnext_example,examples/injectionnext_example/Tests,examples/interesting_deps,examples/interesting_deps/ios,examples/ios_sim,examples/ios_sim/Sources/Foo,examples/ios_sim/Tests/FooTests,examples/kscrash_example,examples/kscrash_example/Sources/MyApp,examples/kscrash_example/Tests/MyAppUITests,examples/kscrash_example/swift,examples/language_modes_example,examples/lottie_ios_example,examples/lottie_ios_example/LottieExample,examples/lottie_ios_example/LottieExampleUITest,examples/messagekit_example,examples/messagekit_example/Sources/Models,examples/messagekit_example/Tests/ModelTests,examples/nimble_example,examples/nimble_example/Sources/NimbleExample,examples/objc_code,examples/objc_code/Tests/TrustKitTests,examples/phone_number_kit,examples/phone_number_kit/Tests/PhoneNumberKitTests,examples/pkg_manifest_minimal,examples/pkg_manifest_minimal/Sources/MyExecutable,examples/pkg_manifest_minimal/Sources/MyLibrary,examples/pkg_manifest_minimal/Tests/MyLibraryTests,examples/pkg_manifest_minimal/third_party,examples/resources_example,examples/resources_example/Sources/MyApp,examples/resources_example/Tests/MyAppTests,examples/resources_example/Tests/MyAppUITests,examples/resources_example/swift,examples/resources_example/third_party,examples/shake_ios_example,examples/shake_ios_example/ShakeIOSExample,examples/shake_ios_example/ShakeIOSExampleUITests,examples/skip_local_transitive_dependencies_example,examples/snapkit_example,examples/soto_example,examples/soto_example/Tests/SotoTests,examples/sqlite_data_example,examples/stripe_example,examples/stripe_example/PaymentSheet/PaymentSheetExample,examples/stripe_example/PaymentSheet/PaymentSheetUITest,examples/swift_package_registry_example,examples/symlink_example,examples/symlink_example/Sources/ImportFramework,examples/symlink_example/Tests/ImportFrameworkTests,examples/tca_example,examples/tca_example/Sources,examples/tca_example/Tests,examples/vapor_example,examples/vapor_example/Sources/App,examples/vapor_example/Sources/Run,examples/vapor_example/Tests/AppTests,examples/vapor_example/swift,examples/xcmetrics_example
4+
query --deleted_packages=bzlmod/workspace,bzlmod/workspace/Sources/MyExecutable,bzlmod/workspace/Sources/MyLibrary,bzlmod/workspace/Tests/MyLibraryTests,examples/aws_crt_example,examples/aws_sdk_example,examples/firebase_example,examples/firebase_example/abtesting,examples/firebase_example/abtesting/SharedApp,examples/firebase_example/analytics/AnalyticsExample,examples/firebase_example/appdistribution,examples/firebase_example/appdistribution/AppDistributionExample,examples/firebase_example/appdistribution/AppDistributionTests,examples/firebase_example/crashlytics,examples/google_maps_example,examples/google_maps_example/GoogleMapsExample,examples/google_maps_example/third-party/google-maps-ios-sdk,examples/grpc_example,examples/grpc_example/compilers,examples/grpc_example/protos/echo_service,examples/grpc_example/protos/echo_service/requests,examples/grpc_example/protos/echo_service/responses,examples/grpc_example/sources/client,examples/grpc_example/sources/server,examples/injectionnext_example,examples/injectionnext_example/Tests,examples/interesting_deps,examples/interesting_deps/ios,examples/ios_sim,examples/ios_sim/Sources/Foo,examples/ios_sim/Tests/FooTests,examples/kscrash_example,examples/kscrash_example/Sources/MyApp,examples/kscrash_example/Tests/MyAppUITests,examples/kscrash_example/swift,examples/language_modes_example,examples/lottie_ios_example,examples/lottie_ios_example/LottieExample,examples/lottie_ios_example/LottieExampleUITest,examples/messagekit_example,examples/messagekit_example/Sources/Models,examples/messagekit_example/Tests/ModelTests,examples/nimble_example,examples/nimble_example/Sources/NimbleExample,examples/objc_code,examples/objc_code/Tests/TrustKitTests,examples/phone_number_kit,examples/phone_number_kit/Tests/PhoneNumberKitTests,examples/pkg_manifest_minimal,examples/pkg_manifest_minimal/Sources/MyExecutable,examples/pkg_manifest_minimal/Sources/MyLibrary,examples/pkg_manifest_minimal/Tests/MyLibraryTests,examples/pkg_manifest_minimal/third_party,examples/resources_example,examples/resources_example/Sources/MyApp,examples/resources_example/Tests/MyAppTests,examples/resources_example/Tests/MyAppUITests,examples/resources_example/swift,examples/resources_example/third_party,examples/shake_ios_example,examples/shake_ios_example/ShakeIOSExample,examples/shake_ios_example/ShakeIOSExampleUITests,examples/skip_local_transitive_dependencies_example,examples/snapkit_example,examples/soto_example,examples/soto_example/Tests/SotoTests,examples/sqlite_data_example,examples/stripe_example,examples/stripe_example/PaymentSheet/PaymentSheetExample,examples/stripe_example/PaymentSheet/PaymentSheetUITest,examples/swift_package_registry_example,examples/symlink_example,examples/symlink_example/Sources/ImportFramework,examples/symlink_example/Tests/ImportFrameworkTests,examples/tca_example,examples/tca_example/Sources,examples/tca_example/Tests,examples/vapor_example,examples/vapor_example/Sources/App,examples/vapor_example/Sources/Run,examples/vapor_example/Tests/AppTests,examples/vapor_example/swift,examples/xcmetrics_example
55

66
# Import Shared settings
77
import %workspace%/shared.bazelrc

.github/workflows/ci.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ jobs:
3535
runner: ubuntu-22.04
3636
- test: '@@//bzlmod:e2e_test'
3737
runner: macos-15
38+
- test: '@@//examples:aws_crt_example_test_bazel_.bazelversion'
39+
runner: macos-15
40+
- test: '@@//examples:aws_sdk_example_test_bazel_.bazelversion'
41+
runner: macos-15
3842
- test: '@@//examples:firebase_example_test_bazel_.bazelversion'
3943
runner: macos-15
4044
- test: '@@//examples:google_maps_example_test_bazel_.bazelversion'
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.build

examples/aws_crt_example/.bazelrc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# Import Shared settings
2+
import %workspace%/../../shared.bazelrc
3+
4+
# Import CI settings.
5+
import %workspace%/../../ci.bazelrc
6+
7+
# Try to import a local.rc file; typically, written by CI
8+
try-import %workspace%/../../local.bazelrc
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
load("@bazel_gazelle//:def.bzl", "gazelle", "gazelle_binary")
2+
load("@build_bazel_rules_swift//swift:swift_test.bzl", "swift_test")
3+
load("@cgrindel_bazel_starlib//bzltidy:defs.bzl", "tidy")
4+
load("@rules_swift_package_manager//swiftpkg:defs.bzl", "swift_package_tool")
5+
6+
swift_test(
7+
name = "AwsCrtTests",
8+
srcs = ["Tests/AwsCrtTests/AwsCrtTests.swift"],
9+
deps = [
10+
"@swiftpkg_aws_crt_swift//:AwsCommonRuntimeKit",
11+
],
12+
)
13+
14+
tidy(
15+
name = "tidy",
16+
targets = [
17+
":update_build_files",
18+
],
19+
)
20+
21+
# Purposefully am not adding this to tidy. It is expensive to run and only
22+
# needs to be run when the Package.swift has been updated.
23+
swift_package_tool(
24+
name = "update_swift_packages",
25+
cmd = "update",
26+
package = "Package.swift",
27+
)
28+
29+
# MARK: - Gazelle
30+
31+
# Ignore the Swift build folder
32+
# gazelle:exclude .build
33+
# gazelle:exclude Tests
34+
35+
gazelle_binary(
36+
name = "gazelle_bin",
37+
languages = [
38+
"@bazel_skylib_gazelle_plugin//bzl",
39+
"@swift_gazelle_plugin//gazelle",
40+
],
41+
)
42+
43+
gazelle(
44+
name = "update_build_files",
45+
data = [
46+
"@swift_deps_info//:swift_deps_index",
47+
],
48+
extra_args = [
49+
"-swift_dependency_index=$(location @swift_deps_info//:swift_deps_index)",
50+
],
51+
gazelle = ":gazelle_bin",
52+
)
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
module(name = "aws_crt_example")
2+
3+
bazel_dep(
4+
name = "rules_swift_package_manager",
5+
version = "0.0.0",
6+
)
7+
local_path_override(
8+
module_name = "rules_swift_package_manager",
9+
path = "../..",
10+
)
11+
12+
bazel_dep(name = "cgrindel_bazel_starlib", version = "0.27.0")
13+
bazel_dep(name = "bazel_skylib", version = "1.8.2")
14+
bazel_dep(name = "apple_support", version = "1.24.3")
15+
bazel_dep(
16+
name = "rules_swift",
17+
version = "3.1.2",
18+
repo_name = "build_bazel_rules_swift",
19+
)
20+
bazel_dep(
21+
name = "rules_apple",
22+
version = "4.2.0",
23+
repo_name = "build_bazel_rules_apple",
24+
)
25+
26+
bazel_dep(
27+
name = "bazel_skylib_gazelle_plugin",
28+
version = "1.8.2",
29+
dev_dependency = True,
30+
)
31+
bazel_dep(
32+
name = "gazelle",
33+
version = "0.46.0",
34+
dev_dependency = True,
35+
repo_name = "bazel_gazelle",
36+
)
37+
bazel_dep(
38+
name = "swift_gazelle_plugin",
39+
version = "0.2.1",
40+
dev_dependency = True,
41+
)
42+
43+
apple_cc_configure = use_extension(
44+
"@apple_support//crosstool:setup.bzl",
45+
"apple_cc_configure_extension",
46+
)
47+
use_repo(apple_cc_configure, "local_config_apple_cc")
48+
49+
swift_deps = use_extension(
50+
"@rules_swift_package_manager//:extensions.bzl",
51+
"swift_deps",
52+
)
53+
swift_deps.from_package(
54+
declare_swift_deps_info = True,
55+
resolved = "//:Package.resolved",
56+
swift = "//:Package.swift",
57+
)
58+
use_repo(
59+
swift_deps,
60+
"swift_deps_info",
61+
"swift_package",
62+
"swiftpkg_aws_crt_swift",
63+
)

examples/aws_crt_example/Package.resolved

Lines changed: 23 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// swift-tools-version: 5.9
2+
3+
import PackageDescription
4+
5+
let package = Package(
6+
name: "AwsCrtExample",
7+
dependencies: [
8+
.package(url: "https://github.com/awslabs/aws-crt-swift.git", from: "0.54.0"),
9+
]
10+
)

examples/aws_crt_example/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# AWS CRT Swift Example
2+
3+
This example demonstrates using [aws-crt-swift](https://github.com/awslabs/aws-crt-swift) with Bazel.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import XCTest
2+
import AwsCommonRuntimeKit
3+
4+
final class AwsCrtTests: XCTestCase {
5+
func testCrtTypes() throws {
6+
// Test that we can use types from AwsCommonRuntimeKit
7+
let logLevel = LogLevel.info
8+
XCTAssertEqual(logLevel, LogLevel.info)
9+
}
10+
}

0 commit comments

Comments
 (0)