Package@swift-6.swift 26 KB

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