diff --git a/.bazelrc b/.bazelrc index f1d3ca5ee..bc83009e5 100644 --- a/.bazelrc +++ b/.bazelrc @@ -1,7 +1,7 @@ # To update these lines, execute # `bazel run @rules_bazel_integration_test//tools:update_deleted_packages` -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/interesting_deps,examples/interesting_deps/ios,examples/ios_sim,examples/ios_sim/Sources/Foo,examples/ios_sim/Tests/FooTests,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/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 -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/interesting_deps,examples/interesting_deps/ios,examples/ios_sim,examples/ios_sim/Sources/Foo,examples/ios_sim/Tests/FooTests,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/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 +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/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/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 +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/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/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 # Import Shared settings import %workspace%/shared.bazelrc diff --git a/examples/injectionnext_example/.bazelrc b/examples/injectionnext_example/.bazelrc new file mode 100644 index 000000000..e9769fc7b --- /dev/null +++ b/examples/injectionnext_example/.bazelrc @@ -0,0 +1,8 @@ +# Import Shared settings +import %workspace%/../../shared.bazelrc + +# Import CI settings. +import %workspace%/../../ci.bazelrc + +# Try to import a local.rc file; typically, written by CI +try-import %workspace%/../../local.bazelrc diff --git a/examples/injectionnext_example/BUILD.bazel b/examples/injectionnext_example/BUILD.bazel new file mode 100644 index 000000000..561b30397 --- /dev/null +++ b/examples/injectionnext_example/BUILD.bazel @@ -0,0 +1,33 @@ +load("@bazel_gazelle//:def.bzl", "gazelle", "gazelle_binary") +load("@cgrindel_bazel_starlib//bzltidy:defs.bzl", "tidy") + +tidy( + name = "tidy", + targets = [ + ":update_build_files", + ], +) + +# MARK: - Gazelle + +# Ignore the Swift build folder +# gazelle:exclude .build + +gazelle_binary( + name = "gazelle_bin", + languages = [ + "@bazel_skylib_gazelle_plugin//bzl", + "@swift_gazelle_plugin//gazelle", + ], +) + +gazelle( + name = "update_build_files", + data = [ + "@swift_deps_info//:swift_deps_index", + ], + extra_args = [ + "-swift_dependency_index=$(location @swift_deps_info//:swift_deps_index)", + ], + gazelle = ":gazelle_bin", +) diff --git a/examples/injectionnext_example/MODULE.bazel b/examples/injectionnext_example/MODULE.bazel new file mode 100644 index 000000000..1bae3e6d9 --- /dev/null +++ b/examples/injectionnext_example/MODULE.bazel @@ -0,0 +1,55 @@ +bazel_dep( + name = "rules_swift_package_manager", + version = "0.0.0", +) +local_path_override( + module_name = "rules_swift_package_manager", + path = "../..", +) + +bazel_dep(name = "cgrindel_bazel_starlib", version = "0.26.0") +bazel_dep(name = "bazel_skylib", version = "1.7.1") +bazel_dep(name = "apple_support", version = "1.21.1") +bazel_dep( + name = "rules_swift", + version = "2.8.1", + repo_name = "build_bazel_rules_swift", +) +bazel_dep( + name = "rules_apple", + version = "3.20.1", + repo_name = "build_bazel_rules_apple", +) + +bazel_dep( + name = "bazel_skylib_gazelle_plugin", + version = "1.7.1", + dev_dependency = True, +) +bazel_dep( + name = "gazelle", + version = "0.43.0", + dev_dependency = True, + repo_name = "bazel_gazelle", +) +bazel_dep( + name = "swift_gazelle_plugin", + version = "0.2.1", + dev_dependency = True, +) + +swift_deps = use_extension( + "@rules_swift_package_manager//:extensions.bzl", + "swift_deps", +) +swift_deps.from_package( + declare_swift_deps_info = True, + resolved = "//:Package.resolved", + swift = "//:Package.swift", +) +use_repo( + swift_deps, + "swift_deps_info", + "swift_package", + "swiftpkg_injectionnext", +) diff --git a/examples/injectionnext_example/Package.resolved b/examples/injectionnext_example/Package.resolved new file mode 100644 index 000000000..0b0440441 --- /dev/null +++ b/examples/injectionnext_example/Package.resolved @@ -0,0 +1,14 @@ +{ + "pins" : [ + { + "identity" : "injectionnext", + "kind" : "remoteSourceControl", + "location" : "https://github.com/johnno1962/InjectionNext.git", + "state" : { + "revision" : "634878bb8c10be33ce1b47317bbcb6b6fb73e402", + "version" : "1.3.1" + } + } + ], + "version" : 2 +} diff --git a/examples/injectionnext_example/Package.swift b/examples/injectionnext_example/Package.swift new file mode 100644 index 000000000..0ec859300 --- /dev/null +++ b/examples/injectionnext_example/Package.swift @@ -0,0 +1,17 @@ +// swift-tools-version: 5.7 + +import PackageDescription + +let package = Package( + name: "injectionnext_example", + dependencies: [ + .package(url: "https://github.com/johnno1962/InjectionNext.git", from: "1.3.1"), + ], + targets: [ + .testTarget( + name: "SomeTest", + dependencies: [.product(name: "InjectionNext", package: "InjectionNext")], + path: "Tests" + ) + ] +) diff --git a/examples/injectionnext_example/README.md b/examples/injectionnext_example/README.md new file mode 100644 index 000000000..c14f0bfe1 --- /dev/null +++ b/examples/injectionnext_example/README.md @@ -0,0 +1,5 @@ +# InjectionNext Example + +This Package contains code that is written in Objective-C++ along with plain C +code. It validates that the correct cc_library targets are created to link the +C code with the Objective-C++ target. diff --git a/examples/injectionnext_example/Tests/BUILD.bazel b/examples/injectionnext_example/Tests/BUILD.bazel new file mode 100644 index 000000000..8a053729e --- /dev/null +++ b/examples/injectionnext_example/Tests/BUILD.bazel @@ -0,0 +1,20 @@ +load("@build_bazel_rules_apple//apple:ios.bzl", "ios_unit_test") +load("@build_bazel_rules_swift//swift:swift.bzl", "swift_library") + +swift_library( + name = "injectionnext_unit_test.library", + testonly = True, + srcs = ["EmptyTest.swift"], + module_name = "Tests", + tags = ["manual"], + visibility = ["//visibility:public"], + deps = ["@swiftpkg_injectionnext//:InjectionNext"], +) + +ios_unit_test( + name = "injectionnext_unit_test", + minimum_os_version = "17.0", + runner = "@build_bazel_rules_apple//apple/testing/default_runner:ios_xctestrun_ordered_runner", + visibility = ["//visibility:public"], + deps = [":injectionnext_unit_test.library"], +) diff --git a/examples/injectionnext_example/Tests/EmptyTest.swift b/examples/injectionnext_example/Tests/EmptyTest.swift new file mode 100644 index 000000000..09ee82e74 --- /dev/null +++ b/examples/injectionnext_example/Tests/EmptyTest.swift @@ -0,0 +1,9 @@ +import InjectionNext +import XCTest + +final class EmptyTest: XCTestCase { + func test_anything() { + _ = InjectionNext.self + XCTAssertTrue(true) + } +} diff --git a/examples/injectionnext_example/WORKSPACE b/examples/injectionnext_example/WORKSPACE new file mode 100644 index 000000000..d251ab7ba --- /dev/null +++ b/examples/injectionnext_example/WORKSPACE @@ -0,0 +1 @@ +# Intentionally blank: Using bzlmod diff --git a/examples/injectionnext_example/WORKSPACE.bzlmod b/examples/injectionnext_example/WORKSPACE.bzlmod new file mode 100644 index 000000000..af8a0e896 --- /dev/null +++ b/examples/injectionnext_example/WORKSPACE.bzlmod @@ -0,0 +1 @@ +# Intentionally blank: Force bzlmod to strict mode diff --git a/examples/injectionnext_example/do_test b/examples/injectionnext_example/do_test new file mode 100755 index 000000000..bf114c0d8 --- /dev/null +++ b/examples/injectionnext_example/do_test @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +set -o errexit -o nounset -o pipefail + +# Use the Bazel binary specified by the integration test. Otherise, fall back +# to bazel. +bazel="${BIT_BAZEL_BINARY:-bazel}" + +# Generate Swift external deps and update build files +"${bazel}" run //:tidy + +# Ensure that it builds and tests pass +"${bazel}" test //... diff --git a/swiftpkg/internal/swiftpkg_build_files.bzl b/swiftpkg/internal/swiftpkg_build_files.bzl index 54f296be2..7f9d32111 100644 --- a/swiftpkg/internal/swiftpkg_build_files.bzl +++ b/swiftpkg/internal/swiftpkg_build_files.bzl @@ -456,6 +456,51 @@ def _clang_target_build_file(repository_ctx, pkg_ctx, target): ) attrs["aspect_hints"] = [aspect_hint_target_name] + rule_kind = clang_kinds.library + + if clang_src_info.organized_srcs.c_srcs: + child_name = "{}_c".format(bzl_target_name) + child_dep_names.append(child_name) + decls.append( + _c_child_library( + repository_ctx, + name = child_name, + attrs = attrs, + rule_kind = rule_kind, + srcs = clang_src_info.organized_srcs.c_srcs + + clang_src_info.organized_srcs.other_srcs, + language_standard = pkg_ctx.pkg_info.c_language_standard, + ), + ) + if clang_src_info.organized_srcs.cxx_srcs: + child_name = "{}_cxx".format(bzl_target_name) + child_dep_names.append(child_name) + decls.append( + _c_child_library( + repository_ctx, + name = child_name, + attrs = attrs, + rule_kind = rule_kind, + srcs = clang_src_info.organized_srcs.cxx_srcs + + clang_src_info.organized_srcs.other_srcs, + language_standard = pkg_ctx.pkg_info.cxx_language_standard, + ), + ) + + if clang_src_info.organized_srcs.assembly_srcs: + child_name = "{}_assembly".format(bzl_target_name) + child_dep_names.append(child_name) + decls.append( + _c_child_library( + repository_ctx, + name = child_name, + attrs = attrs, + rule_kind = rule_kind, + srcs = clang_src_info.organized_srcs.assembly_srcs + + clang_src_info.organized_srcs.other_srcs, + ), + ) + if target.objc_src_info != None: rule_kind = objc_kinds.library @@ -520,8 +565,7 @@ def _clang_target_build_file(repository_ctx, pkg_ctx, target): name = child_name, attrs = attrs, rule_kind = rule_kind, - srcs = clang_src_info.organized_srcs.c_srcs + - clang_src_info.organized_srcs.objc_srcs + + srcs = clang_src_info.organized_srcs.objc_srcs + clang_src_info.organized_srcs.other_srcs + res_objc_srcs, language_standard = pkg_ctx.pkg_info.c_language_standard, @@ -537,60 +581,13 @@ def _clang_target_build_file(repository_ctx, pkg_ctx, target): name = child_name, attrs = attrs, rule_kind = rule_kind, - srcs = clang_src_info.organized_srcs.assembly_srcs + - clang_src_info.organized_srcs.cxx_srcs + - clang_src_info.organized_srcs.objcxx_srcs + + srcs = clang_src_info.organized_srcs.objcxx_srcs + clang_src_info.organized_srcs.other_srcs + res_objcxx_srcs, language_standard = pkg_ctx.pkg_info.cxx_language_standard, res_copts = res_copts, ), ) - else: - rule_kind = clang_kinds.library - - if clang_src_info.organized_srcs.c_srcs: - child_name = "{}_c".format(bzl_target_name) - child_dep_names.append(child_name) - decls.append( - _c_child_library( - repository_ctx, - name = child_name, - attrs = attrs, - rule_kind = rule_kind, - srcs = clang_src_info.organized_srcs.c_srcs + - clang_src_info.organized_srcs.other_srcs, - language_standard = pkg_ctx.pkg_info.c_language_standard, - ), - ) - if clang_src_info.organized_srcs.cxx_srcs: - child_name = "{}_cxx".format(bzl_target_name) - child_dep_names.append(child_name) - decls.append( - _c_child_library( - repository_ctx, - name = child_name, - attrs = attrs, - rule_kind = rule_kind, - srcs = clang_src_info.organized_srcs.cxx_srcs + - clang_src_info.organized_srcs.other_srcs, - language_standard = pkg_ctx.pkg_info.cxx_language_standard, - ), - ) - - if clang_src_info.organized_srcs.assembly_srcs: - child_name = "{}_assembly".format(bzl_target_name) - child_dep_names.append(child_name) - decls.append( - _c_child_library( - repository_ctx, - name = child_name, - attrs = attrs, - rule_kind = rule_kind, - srcs = clang_src_info.organized_srcs.assembly_srcs + - clang_src_info.organized_srcs.other_srcs, - ), - ) # Add the {cc,objc}_library that brings all of the child targets together. parent_attrs = {