Tokamak/Package.swift

223 lines
5.3 KiB
Swift
Raw Normal View History

// swift-tools-version:5.6
2018-12-07 19:21:37 +08:00
import PackageDescription
let package = Package(
name: "Tokamak",
platforms: [
.macOS(.v11),
.iOS(.v13),
],
2018-12-29 05:54:16 +08:00
products: [
// Products define the executables and libraries produced by a package,
// and make them visible to other packages.
2020-06-17 07:58:10 +08:00
.executable(
name: "TokamakDemo",
targets: ["TokamakDemo"]
),
2018-12-29 05:54:16 +08:00
.library(
2020-06-23 06:01:11 +08:00
name: "TokamakDOM",
targets: ["TokamakDOM"]
2018-12-29 05:54:16 +08:00
),
.library(
name: "TokamakStaticHTML",
targets: ["TokamakStaticHTML"]
),
.executable(
name: "TokamakStaticHTMLDemo",
targets: ["TokamakStaticHTMLDemo"]
),
.library(
name: "TokamakGTK",
targets: ["TokamakGTK"]
),
.executable(
name: "TokamakGTKDemo",
targets: ["TokamakGTKDemo"]
),
.library(
name: "TokamakShim",
targets: ["TokamakShim"]
),
.executable(
name: "TokamakStaticHTMLBenchmark",
targets: ["TokamakStaticHTMLBenchmark"]
),
2018-12-29 05:54:16 +08:00
],
dependencies: [
.package(
url: "https://github.com/swiftwasm/JavaScriptKit.git",
from: "0.15.0"
),
.package(
url: "https://github.com/OpenCombine/OpenCombine.git",
from: "0.12.0"
),
.package(
url: "https://github.com/swiftwasm/OpenCombineJS.git",
from: "0.2.0"
),
.package(
url: "https://github.com/google/swift-benchmark",
from: "0.1.2"
),
.package(
url: "https://github.com/pointfreeco/swift-snapshot-testing.git",
from: "1.9.0"
),
2018-12-29 05:54:16 +08:00
],
targets: [
// Targets are the basic building blocks of a package. A target can define
// a module or a test suite.
// Targets can depend on other targets in this package, and on products
// in packages which this package depends on.
2018-12-29 05:54:16 +08:00
.target(
2020-06-23 18:47:54 +08:00
name: "TokamakCore",
dependencies: [
.product(
name: "OpenCombineShim",
package: "OpenCombine"
),
]
2018-12-29 05:54:16 +08:00
),
.target(
name: "TokamakShim",
dependencies: [
.target(name: "TokamakDOM", condition: .when(platforms: [.wasi])),
.target(name: "TokamakGTK", condition: .when(platforms: [.linux])),
]
),
.systemLibrary(
name: "CGTK",
pkgConfig: "gtk+-3.0",
providers: [
.apt(["libgtk+-3.0", "gtk+-3.0"]),
// .yum(["gtk3-devel"]),
.brew(["gtk+3"]),
]
),
.systemLibrary(
name: "CGDK",
pkgConfig: "gdk-3.0",
providers: [
.apt(["libgtk+-3.0", "gtk+-3.0"]),
// .yum(["gtk3-devel"]),
.brew(["gtk+3"]),
]
),
.target(
name: "TokamakGTKCHelpers",
dependencies: ["CGTK"]
),
.target(
name: "TokamakGTK",
dependencies: [
"TokamakCore", "CGTK", "CGDK", "TokamakGTKCHelpers",
.product(
name: "OpenCombineShim",
package: "OpenCombine"
),
]
),
.executableTarget(
name: "TokamakGTKDemo",
dependencies: ["TokamakGTK"],
resources: [.copy("logo-header.png")]
),
.target(
name: "TokamakStaticHTML",
dependencies: [
"TokamakCore",
]
),
.executableTarget(
name: "TokamakCoreBenchmark",
dependencies: [
.product(name: "Benchmark", package: "swift-benchmark"),
"TokamakCore",
"TokamakTestRenderer",
]
),
.executableTarget(
name: "TokamakStaticHTMLBenchmark",
dependencies: [
.product(name: "Benchmark", package: "swift-benchmark"),
"TokamakStaticHTML",
]
),
.target(
name: "TokamakDOM",
dependencies: [
"TokamakCore",
"TokamakStaticHTML",
.product(
name: "OpenCombineShim",
package: "OpenCombine"
),
.product(
name: "JavaScriptKit",
package: "JavaScriptKit",
condition: .when(platforms: [.wasi])
),
.product(
name: "JavaScriptEventLoop",
package: "JavaScriptKit",
condition: .when(platforms: [.wasi])
),
"OpenCombineJS",
]
),
.executableTarget(
name: "TokamakDemo",
dependencies: [
"TokamakShim",
.product(
name: "JavaScriptKit",
package: "JavaScriptKit",
condition: .when(platforms: [.wasi])
2020-11-09 20:27:17 +08:00
),
],
2021-07-28 21:40:12 +08:00
resources: [.copy("logo-header.png")],
linkerSettings: [
.unsafeFlags(
["-Xlinker", "--stack-first", "-Xlinker", "-z", "-Xlinker", "stack-size=16777216"],
.when(platforms: [.wasi])
),
]
),
.executableTarget(
name: "TokamakStaticHTMLDemo",
dependencies: [
"TokamakStaticHTML",
]
),
2018-12-29 05:54:16 +08:00
.target(
name: "TokamakTestRenderer",
2020-06-23 18:47:54 +08:00
dependencies: ["TokamakCore"]
2018-12-29 05:54:16 +08:00
),
.testTarget(
name: "TokamakReconcilerTests",
dependencies: [
"TokamakCore",
"TokamakTestRenderer",
]
),
2018-12-29 05:54:16 +08:00
.testTarget(
name: "TokamakTests",
dependencies: ["TokamakTestRenderer"]
2018-12-29 05:54:16 +08:00
),
Replace `ViewDeferredToRenderer`, fix renderer tests (#408) This allows writing tests for `TokamakStaticHTML`, `TokamakDOM`, and `TokamakGTK` targets. The issue was caused by conflicting `ViewDeferredToRenderer` conformances declared in different modules, including the `TokamakTestRenderer` module. This works around a general limitation in Swift, which was [discussed at length on Swift Forums previously](https://forums.swift.org/t/an-implementation-model-for-rational-protocol-conformance-behavior/37171). When multiple conflicting conformances to the same protocol (`ViewDeferredToRenderer` in our case) exist in different modules, only one of them is available in a given binary (even a test binary). Also, only of them can be loaded and used. Which one exactly is loaded can't be known at compile-time, which is hard to debug and leads to breaking tests that cover code in different renderers. We had to disable `TokamakStaticHTMLTests` for this reason. The workaround is to declare two new functions in the `Renderer` protocol: ```swift public protocol Renderer: AnyObject { // ... // Functions unrelated to the issue at hand skipped for brevity. /** Returns a body of a given pritimive view, or `nil` if `view` is not a primitive view for this renderer. */ func body(for view: Any) -> AnyView? /** Returns `true` if a given view type is a primitive view that should be deferred to this renderer. */ func isPrimitiveView(_ type: Any.Type) -> Bool } ``` Now each renderer can declare their own protocols for their primitive views, i.e. `HTMLPrimitive`, `DOMPrimitive`, `GTKPrimitive` etc, delegating to them from the implementations of `body(for view:)` and `isPrimitiveView(_:)`. Conformances to these protocols can't conflict across different modules. Also, these protocols can have `internal` visibility, as opposed to `ViewDeferredToRenderer`, which had to be declared as `public` in `TokamakCore` to be visible in renderer modules.
2021-06-08 00:24:02 +08:00
.testTarget(
name: "TokamakStaticHTMLTests",
dependencies: [
"TokamakStaticHTML",
.product(
name: "SnapshotTesting",
package: "swift-snapshot-testing",
condition: .when(platforms: [.macOS])
),
],
exclude: ["__Snapshots__", "RenderingTests/__Snapshots__"]
Replace `ViewDeferredToRenderer`, fix renderer tests (#408) This allows writing tests for `TokamakStaticHTML`, `TokamakDOM`, and `TokamakGTK` targets. The issue was caused by conflicting `ViewDeferredToRenderer` conformances declared in different modules, including the `TokamakTestRenderer` module. This works around a general limitation in Swift, which was [discussed at length on Swift Forums previously](https://forums.swift.org/t/an-implementation-model-for-rational-protocol-conformance-behavior/37171). When multiple conflicting conformances to the same protocol (`ViewDeferredToRenderer` in our case) exist in different modules, only one of them is available in a given binary (even a test binary). Also, only of them can be loaded and used. Which one exactly is loaded can't be known at compile-time, which is hard to debug and leads to breaking tests that cover code in different renderers. We had to disable `TokamakStaticHTMLTests` for this reason. The workaround is to declare two new functions in the `Renderer` protocol: ```swift public protocol Renderer: AnyObject { // ... // Functions unrelated to the issue at hand skipped for brevity. /** Returns a body of a given pritimive view, or `nil` if `view` is not a primitive view for this renderer. */ func body(for view: Any) -> AnyView? /** Returns `true` if a given view type is a primitive view that should be deferred to this renderer. */ func isPrimitiveView(_ type: Any.Type) -> Bool } ``` Now each renderer can declare their own protocols for their primitive views, i.e. `HTMLPrimitive`, `DOMPrimitive`, `GTKPrimitive` etc, delegating to them from the implementations of `body(for view:)` and `isPrimitiveView(_:)`. Conformances to these protocols can't conflict across different modules. Also, these protocols can have `internal` visibility, as opposed to `ViewDeferredToRenderer`, which had to be declared as `public` in `TokamakCore` to be visible in renderer modules.
2021-06-08 00:24:02 +08:00
),
2018-12-29 05:54:16 +08:00
]
2018-12-07 19:21:37 +08:00
)