Skip to content

Commit 23f7cc5

Browse files
committed
Add OPENGRAPH_SWIFT_TOOLCHAIN support
1 parent f2b16a1 commit 23f7cc5

File tree

2 files changed

+77
-7
lines changed

2 files changed

+77
-7
lines changed

Package.swift

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,56 @@ default:
4949
]
5050
}
5151

52+
// Source: https://github.com/swiftlang/swift/blob/main/SwiftCompilerSources/Package.swift
53+
// To successfully build, you'll need to create a couple of symlinks to an
54+
// existing Ninja build:
55+
//
56+
// cd $OPENGRAPH_SWIFT_TOOLCHAIN_PATH
57+
// mkdir -p build/Default
58+
// ln -s build/<Ninja-Build>/llvm-<os+arch> build/Default/llvm
59+
// ln -s build/<Ninja-Build>/swift-<os+arch> build/Default/swift
60+
//
61+
// where <project-root> is the parent directory of the swift repository.
62+
//
63+
// FIXME: We may want to consider generating Package.swift as a part of the
64+
// build.
65+
66+
let swiftToolchainVersion = Context.environment["OPENGRAPH_SWIFT_TOOLCHAIN_VERSION"] ?? "6.0.2"
67+
let swiftToolchainPath = Context.environment["OPENGRAPH_SWIFT_TOOLCHAIN_PATH"] ?? "/Volumes/BuildMachine/swift-project"
68+
69+
var sharedCXXSettings: [CXXSetting] = []
70+
71+
if !swiftToolchainPath.isEmpty {
72+
sharedCXXSettings.append(
73+
.unsafeFlags(
74+
[
75+
"-static",
76+
"-DCOMPILED_WITH_SWIFT",
77+
"-DPURE_BRIDGING_MODE",
78+
"-UIBOutlet", "-UIBAction", "-UIBInspectable",
79+
"-I\(swiftToolchainPath)/swift/include",
80+
"-I\(swiftToolchainPath)/swift/stdlib/public/SwiftShims",
81+
"-I\(swiftToolchainPath)/llvm-project/llvm/include",
82+
"-I\(swiftToolchainPath)/llvm-project/clang/include",
83+
"-I\(swiftToolchainPath)/build/Default/swift/include",
84+
"-I\(swiftToolchainPath)/build/Default/llvm/include",
85+
"-I\(swiftToolchainPath)/build/Default/llvm/tools/clang/include",
86+
]
87+
)
88+
)
89+
}
90+
91+
if !swiftToolchainVersion.isEmpty {
92+
sharedCXXSettings.append(
93+
.define("OPENGRAPH_SWIFT_TOOLCHAIN_VERSION", to: swiftToolchainVersion)
94+
)
95+
}
96+
5297
var sharedSwiftSettings: [SwiftSetting] = [
5398
.enableUpcomingFeature("InternalImportsByDefault"),
5499
.define("OPENGRAPH_RELEASE_\(releaseVersion)"),
55100
.swiftLanguageMode(.v5),
101+
.interoperabilityMode(.Cxx),
56102
]
57103

58104
if releaseVersion >= 2021 {
@@ -106,8 +152,9 @@ let package = Package(
106152
name: "OpenGraph",
107153
platforms: platforms,
108154
products: [
109-
.library(name: "OpenGraphShims", targets: ["OpenGraphShims"]),
155+
.library(name: "OpenGraph_SPI", targets: ["OpenGraph_SPI"]),
110156
.library(name: "OpenGraph", targets: ["OpenGraph"]),
157+
.library(name: "OpenGraphShims", targets: ["OpenGraphShims"]),
111158
],
112159
dependencies: [
113160
.package(url: "https://github.com/apple/swift-numerics", from: "1.0.2"),
@@ -118,11 +165,7 @@ let package = Package(
118165
// The SwiftPM support for such usage is still in progress.
119166
.target(
120167
name: "OpenGraph_SPI",
121-
cSettings: [
122-
.unsafeFlags(["-I", includePath], .when(platforms: .nonDarwinPlatforms)),
123-
.define("__COREFOUNDATION_FORSWIFTFOUNDATIONONLY__", to: "1", .when(platforms: .nonDarwinPlatforms)),
124-
],
125-
cxxSettings: [
168+
cxxSettings: sharedCXXSettings + [
126169
.unsafeFlags(["-I", includePath], .when(platforms: .nonDarwinPlatforms)),
127170
.define("__COREFOUNDATION_FORSWIFTFOUNDATIONONLY__", to: "1", .when(platforms: .nonDarwinPlatforms)),
128171
]

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)