Package@swift-6.swift 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080
  1. // swift-tools-version:6.0
  2. /*
  3. * Copyright 2024, gRPC Authors All rights reserved.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. import PackageDescription
  18. // swiftformat puts the next import before the tools version.
  19. // swiftformat:disable:next sortImports
  20. import class Foundation.ProcessInfo
  21. let grpcPackageName = "grpc-swift"
  22. let grpcProductName = "GRPC"
  23. let cgrpcZlibProductName = "CGRPCZlib"
  24. let grpcTargetName = grpcProductName
  25. let cgrpcZlibTargetName = cgrpcZlibProductName
  26. let includeNIOSSL = ProcessInfo.processInfo.environment["GRPC_NO_NIO_SSL"] == nil
  27. // Temporary shim: nightly toolchains renamed 'swiftLanguageVersion' to 'swiftLanguageMode'. This
  28. // isn't yet available in a beta Xcode.
  29. //
  30. // See also: https://github.com/swiftlang/swift-package-manager/issues/7823
  31. extension SwiftSetting {
  32. static func _swiftLanguageMode(_ version: SwiftVersion) -> SwiftSetting {
  33. #if os(Linux)
  34. return .swiftLanguageMode(version)
  35. #else
  36. return .swiftLanguageVersion(version)
  37. #endif
  38. }
  39. }
  40. // MARK: - Package Dependencies
  41. let packageDependencies: [Package.Dependency] = [
  42. .package(
  43. url: "https://github.com/apple/swift-nio.git",
  44. from: "2.65.0"
  45. ),
  46. .package(
  47. url: "https://github.com/apple/swift-nio-http2.git",
  48. from: "1.32.0"
  49. ),
  50. .package(
  51. url: "https://github.com/apple/swift-nio-transport-services.git",
  52. from: "1.15.0"
  53. ),
  54. .package(
  55. url: "https://github.com/apple/swift-nio-extras.git",
  56. from: "1.4.0"
  57. ),
  58. .package(
  59. url: "https://github.com/apple/swift-collections.git",
  60. from: "1.0.5"
  61. ),
  62. .package(
  63. url: "https://github.com/apple/swift-atomics.git",
  64. from: "1.2.0"
  65. ),
  66. .package(
  67. url: "https://github.com/apple/swift-protobuf.git",
  68. from: "1.27.0"
  69. ),
  70. .package(
  71. url: "https://github.com/apple/swift-log.git",
  72. from: "1.4.4"
  73. ),
  74. .package(
  75. url: "https://github.com/apple/swift-argument-parser.git",
  76. // Version is higher than in other Package@swift manifests: 1.1.0 raised the minimum Swift
  77. // version and indluded async support.
  78. from: "1.1.1"
  79. ),
  80. .package(
  81. url: "https://github.com/apple/swift-distributed-tracing.git",
  82. from: "1.0.0"
  83. ),
  84. ].appending(
  85. .package(
  86. url: "https://github.com/apple/swift-nio-ssl.git",
  87. from: "2.23.0"
  88. ),
  89. if: includeNIOSSL
  90. )
  91. // MARK: - Target Dependencies
  92. extension Target.Dependency {
  93. // Target dependencies; external
  94. static var grpc: Self { .target(name: grpcTargetName) }
  95. static var cgrpcZlib: Self { .target(name: cgrpcZlibTargetName) }
  96. static var protocGenGRPCSwift: Self { .target(name: "protoc-gen-grpc-swift") }
  97. static var performanceWorker: Self { .target(name: "performance-worker") }
  98. static var reflectionService: Self { .target(name: "GRPCReflectionService") }
  99. static var grpcCodeGen: Self { .target(name: "GRPCCodeGen") }
  100. static var grpcProtobuf: Self { .target(name: "GRPCProtobuf") }
  101. static var grpcProtobufCodeGen: Self { .target(name: "GRPCProtobufCodeGen") }
  102. // Target dependencies; internal
  103. static var grpcSampleData: Self { .target(name: "GRPCSampleData") }
  104. static var echoModel: Self { .target(name: "EchoModel") }
  105. static var echoImplementation: Self { .target(name: "EchoImplementation") }
  106. static var helloWorldModel: Self { .target(name: "HelloWorldModel") }
  107. static var routeGuideModel: Self { .target(name: "RouteGuideModel") }
  108. static var interopTestModels: Self { .target(name: "GRPCInteroperabilityTestModels") }
  109. static var interopTestImplementation: Self {
  110. .target(name: "GRPCInteroperabilityTestsImplementation")
  111. }
  112. static var interoperabilityTests: Self { .target(name: "InteroperabilityTests") }
  113. // Product dependencies
  114. static var argumentParser: Self {
  115. .product(
  116. name: "ArgumentParser",
  117. package: "swift-argument-parser"
  118. )
  119. }
  120. static var nio: Self { .product(name: "NIO", package: "swift-nio") }
  121. static var nioConcurrencyHelpers: Self {
  122. .product(
  123. name: "NIOConcurrencyHelpers",
  124. package: "swift-nio"
  125. )
  126. }
  127. static var nioCore: Self { .product(name: "NIOCore", package: "swift-nio") }
  128. static var nioEmbedded: Self { .product(name: "NIOEmbedded", package: "swift-nio") }
  129. static var nioExtras: Self { .product(name: "NIOExtras", package: "swift-nio-extras") }
  130. static var nioFoundationCompat: Self { .product(name: "NIOFoundationCompat", package: "swift-nio") }
  131. static var nioHTTP1: Self { .product(name: "NIOHTTP1", package: "swift-nio") }
  132. static var nioHTTP2: Self { .product(name: "NIOHTTP2", package: "swift-nio-http2") }
  133. static var nioPosix: Self { .product(name: "NIOPosix", package: "swift-nio") }
  134. static var nioSSL: Self { .product(name: "NIOSSL", package: "swift-nio-ssl") }
  135. static var nioTLS: Self { .product(name: "NIOTLS", package: "swift-nio") }
  136. static var nioTransportServices: Self {
  137. .product(
  138. name: "NIOTransportServices",
  139. package: "swift-nio-transport-services"
  140. )
  141. }
  142. static var nioTestUtils: Self { .product(name: "NIOTestUtils", package: "swift-nio") }
  143. static var nioFileSystem: Self { .product(name: "_NIOFileSystem", package: "swift-nio") }
  144. static var logging: Self { .product(name: "Logging", package: "swift-log") }
  145. static var protobuf: Self { .product(name: "SwiftProtobuf", package: "swift-protobuf") }
  146. static var protobufPluginLibrary: Self {
  147. .product(
  148. name: "SwiftProtobufPluginLibrary",
  149. package: "swift-protobuf"
  150. )
  151. }
  152. static var dequeModule: Self { .product(name: "DequeModule", package: "swift-collections") }
  153. static var atomics: Self { .product(name: "Atomics", package: "swift-atomics") }
  154. static var tracing: Self { .product(name: "Tracing", package: "swift-distributed-tracing") }
  155. static var grpcCore: Self { .target(name: "GRPCCore") }
  156. static var grpcInProcessTransport: Self { .target(name: "GRPCInProcessTransport") }
  157. static var grpcInterceptors: Self { .target(name: "GRPCInterceptors") }
  158. static var grpcHTTP2Core: Self { .target(name: "GRPCHTTP2Core") }
  159. static var grpcHTTP2TransportNIOPosix: Self { .target(name: "GRPCHTTP2TransportNIOPosix") }
  160. static var grpcHTTP2TransportNIOTransportServices: Self { .target(name: "GRPCHTTP2TransportNIOTransportServices") }
  161. static var grpcHealth: Self { .target(name: "GRPCHealth") }
  162. }
  163. // MARK: - Targets
  164. extension Target {
  165. static var grpc: Target {
  166. .target(
  167. name: grpcTargetName,
  168. dependencies: [
  169. .cgrpcZlib,
  170. .nio,
  171. .nioCore,
  172. .nioPosix,
  173. .nioEmbedded,
  174. .nioFoundationCompat,
  175. .nioTLS,
  176. .nioTransportServices,
  177. .nioHTTP1,
  178. .nioHTTP2,
  179. .nioExtras,
  180. .logging,
  181. .protobuf,
  182. .dequeModule,
  183. ].appending(
  184. .nioSSL, if: includeNIOSSL
  185. ),
  186. path: "Sources/GRPC",
  187. swiftSettings: [._swiftLanguageMode(.v5)]
  188. )
  189. }
  190. static var grpcCore: Target {
  191. .target(
  192. name: "GRPCCore",
  193. dependencies: [
  194. .dequeModule,
  195. .atomics
  196. ],
  197. path: "Sources/GRPCCore",
  198. swiftSettings: [
  199. ._swiftLanguageMode(.v5),
  200. .enableUpcomingFeature("ExistentialAny"),
  201. .enableUpcomingFeature("InternalImportsByDefault")
  202. ]
  203. )
  204. }
  205. static var grpcInProcessTransport: Target {
  206. .target(
  207. name: "GRPCInProcessTransport",
  208. dependencies: [
  209. .grpcCore
  210. ],
  211. swiftSettings: [
  212. ._swiftLanguageMode(.v6),
  213. .enableUpcomingFeature("ExistentialAny"),
  214. .enableUpcomingFeature("InternalImportsByDefault")
  215. ]
  216. )
  217. }
  218. static var grpcInterceptors: Target {
  219. .target(
  220. name: "GRPCInterceptors",
  221. dependencies: [
  222. .grpcCore,
  223. .tracing
  224. ],
  225. swiftSettings: [
  226. ._swiftLanguageMode(.v6),
  227. .enableUpcomingFeature("ExistentialAny"),
  228. .enableUpcomingFeature("InternalImportsByDefault")
  229. ]
  230. )
  231. }
  232. static var grpcHTTP2Core: Target {
  233. .target(
  234. name: "GRPCHTTP2Core",
  235. dependencies: [
  236. .grpcCore,
  237. .nioCore,
  238. .nioHTTP2,
  239. .cgrpcZlib,
  240. .dequeModule,
  241. .atomics
  242. ],
  243. swiftSettings: [
  244. ._swiftLanguageMode(.v6),
  245. .enableUpcomingFeature("ExistentialAny"),
  246. .enableUpcomingFeature("InternalImportsByDefault")
  247. ]
  248. )
  249. }
  250. static var grpcHTTP2TransportNIOPosix: Target {
  251. .target(
  252. name: "GRPCHTTP2TransportNIOPosix",
  253. dependencies: [
  254. .grpcCore,
  255. .grpcHTTP2Core,
  256. .nioPosix,
  257. .nioExtras
  258. ],
  259. swiftSettings: [
  260. ._swiftLanguageMode(.v6),
  261. .enableUpcomingFeature("ExistentialAny"),
  262. .enableUpcomingFeature("InternalImportsByDefault")
  263. ]
  264. )
  265. }
  266. static var grpcHTTP2TransportNIOTransportServices: Target {
  267. .target(
  268. name: "GRPCHTTP2TransportNIOTransportServices",
  269. dependencies: [
  270. .grpcCore,
  271. .grpcHTTP2Core,
  272. .nioCore,
  273. .nioExtras,
  274. .nioTransportServices
  275. ],
  276. swiftSettings: [
  277. ._swiftLanguageMode(.v6),
  278. .enableUpcomingFeature("ExistentialAny"),
  279. .enableUpcomingFeature("InternalImportsByDefault")
  280. ]
  281. )
  282. }
  283. static var grpcHTTP2Transport: Target {
  284. .target(
  285. name: "GRPCHTTP2Transport",
  286. dependencies: [
  287. .grpcCore,
  288. .grpcHTTP2Core,
  289. .grpcHTTP2TransportNIOPosix,
  290. .grpcHTTP2TransportNIOTransportServices,
  291. ],
  292. swiftSettings: [
  293. ._swiftLanguageMode(.v6),
  294. .enableUpcomingFeature("ExistentialAny"),
  295. .enableUpcomingFeature("InternalImportsByDefault")
  296. ]
  297. )
  298. }
  299. static var cgrpcZlib: Target {
  300. .target(
  301. name: cgrpcZlibTargetName,
  302. path: "Sources/CGRPCZlib",
  303. linkerSettings: [
  304. .linkedLibrary("z"),
  305. ]
  306. )
  307. }
  308. static var protocGenGRPCSwift: Target {
  309. .executableTarget(
  310. name: "protoc-gen-grpc-swift",
  311. dependencies: [
  312. .protobuf,
  313. .protobufPluginLibrary,
  314. .grpcCodeGen,
  315. .grpcProtobufCodeGen
  316. ],
  317. exclude: [
  318. "README.md",
  319. ],
  320. swiftSettings: [._swiftLanguageMode(.v5)]
  321. )
  322. }
  323. static var performanceWorker: Target {
  324. .executableTarget(
  325. name: "performance-worker",
  326. dependencies: [
  327. .grpcCore,
  328. .grpcHTTP2Core,
  329. .grpcHTTP2TransportNIOPosix,
  330. .grpcProtobuf,
  331. .nioCore,
  332. .nioFileSystem,
  333. .argumentParser
  334. ],
  335. swiftSettings: [._swiftLanguageMode(.v6), .enableUpcomingFeature("ExistentialAny")]
  336. )
  337. }
  338. static var grpcSwiftPlugin: Target {
  339. .plugin(
  340. name: "GRPCSwiftPlugin",
  341. capability: .buildTool(),
  342. dependencies: [
  343. .protocGenGRPCSwift,
  344. ]
  345. )
  346. }
  347. static var grpcTests: Target {
  348. .testTarget(
  349. name: "GRPCTests",
  350. dependencies: [
  351. .grpc,
  352. .echoModel,
  353. .echoImplementation,
  354. .helloWorldModel,
  355. .interopTestModels,
  356. .interopTestImplementation,
  357. .grpcSampleData,
  358. .nioCore,
  359. .nioConcurrencyHelpers,
  360. .nioPosix,
  361. .nioTLS,
  362. .nioHTTP1,
  363. .nioHTTP2,
  364. .nioEmbedded,
  365. .nioTransportServices,
  366. .logging,
  367. .reflectionService
  368. ].appending(
  369. .nioSSL, if: includeNIOSSL
  370. ),
  371. exclude: [
  372. "Codegen/Serialization/echo.grpc.reflection"
  373. ],
  374. swiftSettings: [._swiftLanguageMode(.v5)]
  375. )
  376. }
  377. static var grpcCoreTests: Target {
  378. .testTarget(
  379. name: "GRPCCoreTests",
  380. dependencies: [
  381. .grpcCore,
  382. .grpcInProcessTransport,
  383. .dequeModule,
  384. .atomics,
  385. .protobuf,
  386. ],
  387. swiftSettings: [._swiftLanguageMode(.v6), .enableUpcomingFeature("ExistentialAny")]
  388. )
  389. }
  390. static var grpcInProcessTransportTests: Target {
  391. .testTarget(
  392. name: "GRPCInProcessTransportTests",
  393. dependencies: [
  394. .grpcCore,
  395. .grpcInProcessTransport
  396. ],
  397. swiftSettings: [._swiftLanguageMode(.v6), .enableUpcomingFeature("ExistentialAny")]
  398. )
  399. }
  400. static var grpcInterceptorsTests: Target {
  401. .testTarget(
  402. name: "GRPCInterceptorsTests",
  403. dependencies: [
  404. .grpcCore,
  405. .tracing,
  406. .nioCore,
  407. .grpcInterceptors
  408. ],
  409. swiftSettings: [._swiftLanguageMode(.v6), .enableUpcomingFeature("ExistentialAny")]
  410. )
  411. }
  412. static var grpcHTTP2CoreTests: Target {
  413. .testTarget(
  414. name: "GRPCHTTP2CoreTests",
  415. dependencies: [
  416. .grpcHTTP2Core,
  417. .nioCore,
  418. .nioHTTP2,
  419. .nioEmbedded,
  420. .nioTestUtils,
  421. ],
  422. swiftSettings: [._swiftLanguageMode(.v6), .enableUpcomingFeature("ExistentialAny")]
  423. )
  424. }
  425. static var grpcHTTP2TransportTests: Target {
  426. .testTarget(
  427. name: "GRPCHTTP2TransportTests",
  428. dependencies: [
  429. .grpcHTTP2Core,
  430. .grpcHTTP2TransportNIOPosix,
  431. .grpcHTTP2TransportNIOTransportServices,
  432. .grpcProtobuf
  433. ],
  434. swiftSettings: [._swiftLanguageMode(.v6), .enableUpcomingFeature("ExistentialAny")]
  435. )
  436. }
  437. static var grpcCodeGenTests: Target {
  438. .testTarget(
  439. name: "GRPCCodeGenTests",
  440. dependencies: [
  441. .grpcCodeGen
  442. ],
  443. swiftSettings: [._swiftLanguageMode(.v6), .enableUpcomingFeature("ExistentialAny")]
  444. )
  445. }
  446. static var grpcProtobufTests: Target {
  447. .testTarget(
  448. name: "GRPCProtobufTests",
  449. dependencies: [
  450. .grpcProtobuf,
  451. .grpcCore,
  452. .protobuf
  453. ],
  454. swiftSettings: [._swiftLanguageMode(.v6), .enableUpcomingFeature("ExistentialAny")]
  455. )
  456. }
  457. static var grpcProtobufCodeGenTests: Target {
  458. .testTarget(
  459. name: "GRPCProtobufCodeGenTests",
  460. dependencies: [
  461. .grpcCodeGen,
  462. .grpcProtobufCodeGen,
  463. .protobuf,
  464. .protobufPluginLibrary
  465. ],
  466. swiftSettings: [._swiftLanguageMode(.v6), .enableUpcomingFeature("ExistentialAny")]
  467. )
  468. }
  469. static var inProcessInteroperabilityTests: Target {
  470. .testTarget(
  471. name: "InProcessInteroperabilityTests",
  472. dependencies: [
  473. .grpcInProcessTransport,
  474. .interoperabilityTests,
  475. .grpcCore
  476. ],
  477. swiftSettings: [._swiftLanguageMode(.v6), .enableUpcomingFeature("ExistentialAny")]
  478. )
  479. }
  480. static var grpcHealthTests: Target {
  481. .testTarget(
  482. name: "GRPCHealthTests",
  483. dependencies: [
  484. .grpcHealth,
  485. .grpcProtobuf,
  486. .grpcInProcessTransport
  487. ],
  488. path: "Tests/Services/HealthTests",
  489. swiftSettings: [._swiftLanguageMode(.v6), .enableUpcomingFeature("ExistentialAny")]
  490. )
  491. }
  492. static var interopTestModels: Target {
  493. .target(
  494. name: "GRPCInteroperabilityTestModels",
  495. dependencies: [
  496. .grpc,
  497. .nio,
  498. .protobuf,
  499. ],
  500. exclude: [
  501. "README.md",
  502. "generate.sh",
  503. "src/proto/grpc/testing/empty.proto",
  504. "src/proto/grpc/testing/empty_service.proto",
  505. "src/proto/grpc/testing/messages.proto",
  506. "src/proto/grpc/testing/test.proto",
  507. "unimplemented_call.patch",
  508. ],
  509. swiftSettings: [._swiftLanguageMode(.v5)]
  510. )
  511. }
  512. static var interoperabilityTestImplementation: Target {
  513. .target(
  514. name: "InteroperabilityTests",
  515. dependencies: [
  516. .grpcCore,
  517. .grpcProtobuf
  518. ],
  519. swiftSettings: [._swiftLanguageMode(.v6), .enableUpcomingFeature("ExistentialAny")]
  520. )
  521. }
  522. static var interoperabilityTestsExecutable: Target {
  523. .executableTarget(
  524. name: "interoperability-tests",
  525. dependencies: [
  526. .grpcCore,
  527. .grpcHTTP2Core,
  528. .grpcHTTP2TransportNIOPosix,
  529. .interoperabilityTests,
  530. .argumentParser
  531. ],
  532. swiftSettings: [._swiftLanguageMode(.v6), .enableUpcomingFeature("ExistentialAny")]
  533. )
  534. }
  535. static var interopTestImplementation: Target {
  536. .target(
  537. name: "GRPCInteroperabilityTestsImplementation",
  538. dependencies: [
  539. .grpc,
  540. .interopTestModels,
  541. .nioCore,
  542. .nioPosix,
  543. .nioHTTP1,
  544. .logging,
  545. ].appending(
  546. .nioSSL, if: includeNIOSSL
  547. ),
  548. swiftSettings: [._swiftLanguageMode(.v5)]
  549. )
  550. }
  551. static var interopTests: Target {
  552. .executableTarget(
  553. name: "GRPCInteroperabilityTests",
  554. dependencies: [
  555. .grpc,
  556. .interopTestImplementation,
  557. .nioCore,
  558. .nioPosix,
  559. .logging,
  560. .argumentParser,
  561. ],
  562. swiftSettings: [._swiftLanguageMode(.v5)]
  563. )
  564. }
  565. static var backoffInteropTest: Target {
  566. .executableTarget(
  567. name: "GRPCConnectionBackoffInteropTest",
  568. dependencies: [
  569. .grpc,
  570. .interopTestModels,
  571. .nioCore,
  572. .nioPosix,
  573. .logging,
  574. .argumentParser,
  575. ],
  576. exclude: [
  577. "README.md",
  578. ],
  579. swiftSettings: [._swiftLanguageMode(.v5)]
  580. )
  581. }
  582. static var perfTests: Target {
  583. .executableTarget(
  584. name: "GRPCPerformanceTests",
  585. dependencies: [
  586. .grpc,
  587. .grpcSampleData,
  588. .nioCore,
  589. .nioEmbedded,
  590. .nioPosix,
  591. .nioHTTP2,
  592. .argumentParser,
  593. ],
  594. swiftSettings: [._swiftLanguageMode(.v5)]
  595. )
  596. }
  597. static var grpcSampleData: Target {
  598. .target(
  599. name: "GRPCSampleData",
  600. dependencies: includeNIOSSL ? [.nioSSL] : [],
  601. exclude: [
  602. "bundle.p12",
  603. ],
  604. swiftSettings: [._swiftLanguageMode(.v5)]
  605. )
  606. }
  607. static var echoModel: Target {
  608. .target(
  609. name: "EchoModel",
  610. dependencies: [
  611. .grpc,
  612. .nio,
  613. .protobuf,
  614. ],
  615. path: "Sources/Examples/v1/Echo/Model",
  616. swiftSettings: [._swiftLanguageMode(.v5)]
  617. )
  618. }
  619. static var echoImplementation: Target {
  620. .target(
  621. name: "EchoImplementation",
  622. dependencies: [
  623. .echoModel,
  624. .grpc,
  625. .nioCore,
  626. .nioHTTP2,
  627. .protobuf,
  628. ],
  629. path: "Sources/Examples/v1/Echo/Implementation",
  630. swiftSettings: [._swiftLanguageMode(.v5)]
  631. )
  632. }
  633. static var echo: Target {
  634. .executableTarget(
  635. name: "Echo",
  636. dependencies: [
  637. .grpc,
  638. .echoModel,
  639. .echoImplementation,
  640. .grpcSampleData,
  641. .nioCore,
  642. .nioPosix,
  643. .logging,
  644. .argumentParser,
  645. ].appending(
  646. .nioSSL, if: includeNIOSSL
  647. ),
  648. path: "Sources/Examples/v1/Echo/Runtime",
  649. swiftSettings: [._swiftLanguageMode(.v5)]
  650. )
  651. }
  652. static var echo_v2: Target {
  653. .executableTarget(
  654. name: "echo-v2",
  655. dependencies: [
  656. .grpcCore,
  657. .grpcProtobuf,
  658. .grpcHTTP2Core,
  659. .grpcHTTP2TransportNIOPosix,
  660. .argumentParser,
  661. ].appending(
  662. .nioSSL, if: includeNIOSSL
  663. ),
  664. path: "Sources/Examples/v2/Echo",
  665. swiftSettings: [._swiftLanguageMode(.v6), .enableUpcomingFeature("ExistentialAny")]
  666. )
  667. }
  668. static var helloWorldModel: Target {
  669. .target(
  670. name: "HelloWorldModel",
  671. dependencies: [
  672. .grpc,
  673. .nio,
  674. .protobuf,
  675. ],
  676. path: "Sources/Examples/v1/HelloWorld/Model",
  677. swiftSettings: [._swiftLanguageMode(.v5)]
  678. )
  679. }
  680. static var helloWorldClient: Target {
  681. .executableTarget(
  682. name: "HelloWorldClient",
  683. dependencies: [
  684. .grpc,
  685. .helloWorldModel,
  686. .nioCore,
  687. .nioPosix,
  688. .argumentParser,
  689. ],
  690. path: "Sources/Examples/v1/HelloWorld/Client",
  691. swiftSettings: [._swiftLanguageMode(.v5)]
  692. )
  693. }
  694. static var helloWorldServer: Target {
  695. .executableTarget(
  696. name: "HelloWorldServer",
  697. dependencies: [
  698. .grpc,
  699. .helloWorldModel,
  700. .nioCore,
  701. .nioPosix,
  702. .argumentParser,
  703. ],
  704. path: "Sources/Examples/v1/HelloWorld/Server",
  705. swiftSettings: [._swiftLanguageMode(.v5)]
  706. )
  707. }
  708. static var routeGuideModel: Target {
  709. .target(
  710. name: "RouteGuideModel",
  711. dependencies: [
  712. .grpc,
  713. .nio,
  714. .protobuf,
  715. ],
  716. path: "Sources/Examples/v1/RouteGuide/Model",
  717. swiftSettings: [._swiftLanguageMode(.v5)]
  718. )
  719. }
  720. static var routeGuideClient: Target {
  721. .executableTarget(
  722. name: "RouteGuideClient",
  723. dependencies: [
  724. .grpc,
  725. .routeGuideModel,
  726. .nioCore,
  727. .nioPosix,
  728. .argumentParser,
  729. ],
  730. path: "Sources/Examples/v1/RouteGuide/Client",
  731. swiftSettings: [._swiftLanguageMode(.v5)]
  732. )
  733. }
  734. static var routeGuideServer: Target {
  735. .executableTarget(
  736. name: "RouteGuideServer",
  737. dependencies: [
  738. .grpc,
  739. .routeGuideModel,
  740. .nioCore,
  741. .nioConcurrencyHelpers,
  742. .nioPosix,
  743. .argumentParser,
  744. ],
  745. path: "Sources/Examples/v1/RouteGuide/Server",
  746. swiftSettings: [._swiftLanguageMode(.v5)]
  747. )
  748. }
  749. static var packetCapture: Target {
  750. .executableTarget(
  751. name: "PacketCapture",
  752. dependencies: [
  753. .grpc,
  754. .echoModel,
  755. .nioCore,
  756. .nioPosix,
  757. .nioExtras,
  758. .argumentParser,
  759. ],
  760. path: "Sources/Examples/v1/PacketCapture",
  761. exclude: [
  762. "README.md",
  763. ],
  764. swiftSettings: [._swiftLanguageMode(.v5)]
  765. )
  766. }
  767. static var reflectionService: Target {
  768. .target(
  769. name: "GRPCReflectionService",
  770. dependencies: [
  771. .grpc,
  772. .nio,
  773. .protobuf,
  774. ],
  775. path: "Sources/GRPCReflectionService",
  776. swiftSettings: [._swiftLanguageMode(.v5)]
  777. )
  778. }
  779. static var reflectionServer: Target {
  780. .executableTarget(
  781. name: "ReflectionServer",
  782. dependencies: [
  783. .grpc,
  784. .reflectionService,
  785. .helloWorldModel,
  786. .nioCore,
  787. .nioPosix,
  788. .argumentParser,
  789. .echoModel,
  790. .echoImplementation
  791. ],
  792. path: "Sources/Examples/v1/ReflectionService",
  793. resources: [
  794. .copy("Generated")
  795. ],
  796. swiftSettings: [._swiftLanguageMode(.v5)]
  797. )
  798. }
  799. static var grpcCodeGen: Target {
  800. .target(
  801. name: "GRPCCodeGen",
  802. path: "Sources/GRPCCodeGen",
  803. swiftSettings: [
  804. ._swiftLanguageMode(.v6),
  805. .enableUpcomingFeature("ExistentialAny"),
  806. .enableUpcomingFeature("InternalImportsByDefault")
  807. ]
  808. )
  809. }
  810. static var grpcProtobuf: Target {
  811. .target(
  812. name: "GRPCProtobuf",
  813. dependencies: [
  814. .grpcCore,
  815. .protobuf,
  816. ],
  817. path: "Sources/GRPCProtobuf",
  818. swiftSettings: [
  819. ._swiftLanguageMode(.v6),
  820. .enableUpcomingFeature("ExistentialAny"),
  821. .enableUpcomingFeature("InternalImportsByDefault")
  822. ]
  823. )
  824. }
  825. static var grpcProtobufCodeGen: Target {
  826. .target(
  827. name: "GRPCProtobufCodeGen",
  828. dependencies: [
  829. .protobuf,
  830. .protobufPluginLibrary,
  831. .grpcCodeGen
  832. ],
  833. path: "Sources/GRPCProtobufCodeGen",
  834. swiftSettings: [
  835. ._swiftLanguageMode(.v6),
  836. .enableUpcomingFeature("ExistentialAny"),
  837. .enableUpcomingFeature("InternalImportsByDefault")
  838. ]
  839. )
  840. }
  841. static var grpcHealth: Target {
  842. .target(
  843. name: "GRPCHealth",
  844. dependencies: [
  845. .grpcCore,
  846. .grpcProtobuf
  847. ],
  848. path: "Sources/Services/Health",
  849. swiftSettings: [
  850. ._swiftLanguageMode(.v6),
  851. .enableUpcomingFeature("ExistentialAny")
  852. ]
  853. )
  854. }
  855. }
  856. // MARK: - Products
  857. extension Product {
  858. static var grpc: Product {
  859. .library(
  860. name: grpcProductName,
  861. targets: [grpcTargetName]
  862. )
  863. }
  864. static var _grpcCore: Product {
  865. .library(
  866. name: "_GRPCCore",
  867. targets: ["GRPCCore"]
  868. )
  869. }
  870. static var _grpcProtobuf: Product {
  871. .library(
  872. name: "_GRPCProtobuf",
  873. targets: ["GRPCProtobuf"]
  874. )
  875. }
  876. static var _grpcInProcessTransport: Product {
  877. .library(
  878. name: "_GRPCInProcessTransport",
  879. targets: ["GRPCInProcessTransport"]
  880. )
  881. }
  882. static var _grpcHTTP2Transport: Product {
  883. .library(
  884. name: "_GRPCHTTP2Transport",
  885. targets: ["GRPCHTTP2Transport"]
  886. )
  887. }
  888. static var cgrpcZlib: Product {
  889. .library(
  890. name: cgrpcZlibProductName,
  891. targets: [cgrpcZlibTargetName]
  892. )
  893. }
  894. static var grpcReflectionService: Product {
  895. .library(
  896. name: "GRPCReflectionService",
  897. targets: ["GRPCReflectionService"]
  898. )
  899. }
  900. static var protocGenGRPCSwift: Product {
  901. .executable(
  902. name: "protoc-gen-grpc-swift",
  903. targets: ["protoc-gen-grpc-swift"]
  904. )
  905. }
  906. static var grpcSwiftPlugin: Product {
  907. .plugin(
  908. name: "GRPCSwiftPlugin",
  909. targets: ["GRPCSwiftPlugin"]
  910. )
  911. }
  912. }
  913. // MARK: - Package
  914. let package = Package(
  915. name: grpcPackageName,
  916. products: [
  917. // v1
  918. .grpc,
  919. .cgrpcZlib,
  920. .grpcReflectionService,
  921. .protocGenGRPCSwift,
  922. .grpcSwiftPlugin,
  923. // v2
  924. ._grpcCore,
  925. ._grpcProtobuf,
  926. ._grpcHTTP2Transport,
  927. ._grpcInProcessTransport,
  928. ],
  929. dependencies: packageDependencies,
  930. targets: [
  931. // Products
  932. .grpc,
  933. .cgrpcZlib,
  934. .protocGenGRPCSwift,
  935. .grpcSwiftPlugin,
  936. .reflectionService,
  937. // Tests etc.
  938. .grpcTests,
  939. .interopTestModels,
  940. .interopTestImplementation,
  941. .interopTests,
  942. .backoffInteropTest,
  943. .perfTests,
  944. .grpcSampleData,
  945. // Examples
  946. .echoModel,
  947. .echoImplementation,
  948. .echo,
  949. .helloWorldModel,
  950. .helloWorldClient,
  951. .helloWorldServer,
  952. .routeGuideModel,
  953. .routeGuideClient,
  954. .routeGuideServer,
  955. .packetCapture,
  956. .reflectionServer,
  957. // v2
  958. .grpcCore,
  959. .grpcCodeGen,
  960. // v2 transports
  961. .grpcInProcessTransport,
  962. .grpcHTTP2Core,
  963. .grpcHTTP2TransportNIOPosix,
  964. .grpcHTTP2TransportNIOTransportServices,
  965. .grpcHTTP2Transport,
  966. // v2 Protobuf support
  967. .grpcProtobuf,
  968. .grpcProtobufCodeGen,
  969. // v2 add-ons
  970. .grpcInterceptors,
  971. .grpcHealth,
  972. // v2 integration testing
  973. .interoperabilityTestImplementation,
  974. .interoperabilityTestsExecutable,
  975. .performanceWorker,
  976. // v2 unit tests
  977. .grpcCoreTests,
  978. .grpcInProcessTransportTests,
  979. .grpcCodeGenTests,
  980. .grpcInterceptorsTests,
  981. .grpcHTTP2CoreTests,
  982. .grpcHTTP2TransportTests,
  983. .grpcHealthTests,
  984. .grpcProtobufTests,
  985. .grpcProtobufCodeGenTests,
  986. .inProcessInteroperabilityTests,
  987. // v2 examples
  988. .echo_v2,
  989. ]
  990. )
  991. extension Array {
  992. func appending(_ element: Element, if condition: Bool) -> [Element] {
  993. if condition {
  994. return self + [element]
  995. } else {
  996. return self
  997. }
  998. }
  999. }