Skip to content

Commit 747e47b

Browse files
committed
Add OPENGRAPH_SWIFT_TOOLCHAIN support
1 parent 1039cd1 commit 747e47b

File tree

3 files changed

+94
-15
lines changed

3 files changed

+94
-15
lines changed

Package.resolved

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 65 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,70 @@ func envEnable(_ key: String, default defaultValue: Bool = false) -> Bool {
1717
}
1818
}
1919

20+
// MARK: - Env and Config
21+
2022
let isXcodeEnv = Context.environment["__CFBundleIdentifier"] == "com.apple.dt.Xcode"
2123
let development = envEnable("OPENGRAPH_DEVELOPMENT", default: false)
2224

2325
let releaseVersion = Context.environment["OPENGRAPH_TARGET_RELEASE"].flatMap { Int($0) } ?? 2024
2426

27+
let swiftBinPath = Context.environment["_"] ?? "/usr/bin/swift"
28+
let swiftBinURL = URL(fileURLWithPath: swiftBinPath)
29+
let SDKPath = swiftBinURL.deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent().path
30+
let includePath = SDKPath.appending("/usr/lib/swift")
31+
32+
// MARK: - C/CXX Settings
33+
34+
// Source: https://github.com/swiftlang/swift/blob/main/SwiftCompilerSources/Package.swift
35+
// To successfully build, you'll need to create a couple of symlinks to an
36+
// existing Ninja build:
37+
//
38+
// cd $OPENGRAPH_SWIFT_TOOLCHAIN_PATH
39+
// mkdir -p build/Default
40+
// ln -s build/<Ninja-Build>/llvm-<os+arch> build/Default/llvm
41+
// ln -s build/<Ninja-Build>/swift-<os+arch> build/Default/swift
42+
//
43+
// where <project-root> is the parent directory of the swift repository.
44+
//
45+
// FIXME: We may want to consider generating Package.swift as a part of the
46+
// build.
47+
48+
let swiftToolchainVersion = Context.environment["OPENGRAPH_SWIFT_TOOLCHAIN_VERSION"] ?? ""
49+
let swiftToolchainPath = Context.environment["OPENGRAPH_SWIFT_TOOLCHAIN_PATH"] ?? ""
50+
51+
var sharedCSettings: [CSetting] = [
52+
.unsafeFlags(["-I", includePath], .when(platforms: .nonDarwinPlatforms)),
53+
.define("__COREFOUNDATION_FORSWIFTFOUNDATIONONLY__", to: "1", .when(platforms: .nonDarwinPlatforms)),
54+
]
55+
56+
if !swiftToolchainPath.isEmpty {
57+
sharedCSettings.append(
58+
.unsafeFlags(
59+
[
60+
"-static",
61+
"-DCOMPILED_WITH_SWIFT",
62+
"-DPURE_BRIDGING_MODE",
63+
"-UIBOutlet", "-UIBAction", "-UIBInspectable",
64+
"-I\(swiftToolchainPath)/swift/include",
65+
"-I\(swiftToolchainPath)/swift/stdlib/public/SwiftShims",
66+
"-I\(swiftToolchainPath)/llvm-project/llvm/include",
67+
"-I\(swiftToolchainPath)/llvm-project/clang/include",
68+
"-I\(swiftToolchainPath)/build/Default/swift/include",
69+
"-I\(swiftToolchainPath)/build/Default/llvm/include",
70+
"-I\(swiftToolchainPath)/build/Default/llvm/tools/clang/include",
71+
]
72+
)
73+
)
74+
}
75+
76+
if !swiftToolchainVersion.isEmpty {
77+
sharedCSettings.append(
78+
.define("OPENGRAPH_SWIFT_TOOLCHAIN_VERSION", to: swiftToolchainVersion)
79+
)
80+
}
81+
82+
// MARK: - Swift Settings
83+
2584
var sharedSwiftSettings: [SwiftSetting] = [
2685
.enableUpcomingFeature("InternalImportsByDefault"),
2786
.define("OPENGRAPH_RELEASE_\(releaseVersion)"),
@@ -39,6 +98,8 @@ if warningsAsErrorsCondition {
3998
sharedSwiftSettings.append(.unsafeFlags(["-warnings-as-errors"]))
4099
}
41100

101+
// MARK: - Targets
102+
42103
let openGraphShimsTarget = Target.target(
43104
name: "OpenGraphShims",
44105
swiftSettings: sharedSwiftSettings
@@ -70,16 +131,14 @@ let openGraphCompatibilityTestTarget = Target.testTarget(
70131
swiftSettings: sharedSwiftSettings
71132
)
72133

73-
let swiftBinPath = Context.environment["_"] ?? "/usr/bin/swift"
74-
let swiftBinURL = URL(fileURLWithPath: swiftBinPath)
75-
let SDKPath = swiftBinURL.deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent().path
76-
let includePath = SDKPath.appending("/usr/lib/swift")
134+
// MARK: - Package
77135

78136
let package = Package(
79137
name: "OpenGraph",
80138
products: [
81-
.library(name: "OpenGraphShims", targets: ["OpenGraphShims"]),
139+
.library(name: "OpenGraph_SPI", targets: ["OpenGraph_SPI"]),
82140
.library(name: "OpenGraph", targets: ["OpenGraph"]),
141+
.library(name: "OpenGraphShims", targets: ["OpenGraphShims"]),
83142
],
84143
dependencies: [
85144
.package(url: "https://github.com/apple/swift-numerics", from: "1.0.2"),
@@ -90,14 +149,7 @@ let package = Package(
90149
// The SwiftPM support for such usage is still in progress.
91150
.target(
92151
name: "OpenGraph_SPI",
93-
cSettings: [
94-
.unsafeFlags(["-I", includePath], .when(platforms: .nonDarwinPlatforms)),
95-
.define("__COREFOUNDATION_FORSWIFTFOUNDATIONONLY__", to: "1", .when(platforms: .nonDarwinPlatforms)),
96-
],
97-
cxxSettings: [
98-
.unsafeFlags(["-I", includePath], .when(platforms: .nonDarwinPlatforms)),
99-
.define("__COREFOUNDATION_FORSWIFTFOUNDATIONONLY__", to: "1", .when(platforms: .nonDarwinPlatforms)),
100-
]
152+
cSettings: sharedCSettings
101153
),
102154
.target(
103155
name: "OpenGraph",

Sources/OpenGraph_SPI/Runtime/OGTypeID.cpp

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,36 @@
77

88
#include "OGTypeID.h"
99

10+
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_VERSION
11+
#include <swift/Runtime/Metadata.h>
12+
#endif
13+
1014
OGTypeKind OGTypeGetKind(OGTypeID typeID) {
11-
// FIXME: Unimplemented
15+
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_VERSION
16+
const swift::Metadata *type = reinterpret_cast<const swift::Metadata *>(typeID);
17+
switch (type->getKind()) {
18+
case swift::MetadataKind::Class:
19+
return OGTypeKindClass;
20+
case swift::MetadataKind::Struct:
21+
return OGTypeKindStruct;
22+
case swift::MetadataKind::Enum:
23+
return OGTypeKindEnum;
24+
case swift::MetadataKind::Optional:
25+
return OGTypeKindOptional;
26+
case swift::MetadataKind::Tuple:
27+
return OGTypeKindTuple;
28+
case swift::MetadataKind::Function:
29+
return OGTypeKindFunction;
30+
case swift::MetadataKind::Existential:
31+
return OGTypeKindExistential;
32+
case swift::MetadataKind::Metatype:
33+
return OGTypeKindMetatype;
34+
default:
35+
return OGTypeKindNone;
36+
}
37+
#else
1238
return OGTypeKindNone;
39+
#endif
1340
}
1441

1542
const void * OGTypeNominalDescriptor(OGTypeID typeID) {

0 commit comments

Comments
 (0)