Skip to content

Commit 86fb886

Browse files
authored
Update Metadata implementation (#95)
* Add OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED support * Update OGTypeID * Update metadata.cpp * Add OGTypeNominalDescriptorName * Merge OGSwiftMetadata into OGTypeID file * Fix Linux build issue * Update DarwinPrivateFrameworks version * Fix OGTypeKind issue
1 parent 6040b4d commit 86fb886

22 files changed

+344
-218
lines changed

Package.resolved

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 45 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -22,37 +22,36 @@ func envEnable(_ key: String, default defaultValue: Bool = false) -> Bool {
2222
let isXcodeEnv = Context.environment["__CFBundleIdentifier"] == "com.apple.dt.Xcode"
2323
let development = envEnable("OPENGRAPH_DEVELOPMENT", default: false)
2424

25-
let releaseVersion = Context.environment["OPENGRAPH_TARGET_RELEASE"].flatMap { Int($0) } ?? 2024
26-
2725
let swiftBinPath = Context.environment["_"] ?? "/usr/bin/swift"
2826
let swiftBinURL = URL(fileURLWithPath: swiftBinPath)
2927
let SDKPath = swiftBinURL.deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent().path
3028
let includePath = SDKPath.appending("/usr/lib/swift")
3129

32-
// MARK: - C/CXX Settings
30+
var sharedCSettings: [CSetting] = [
31+
.unsafeFlags(["-I", includePath], .when(platforms: .nonDarwinPlatforms)),
32+
]
3333

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:
34+
var sharedSwiftSettings: [SwiftSetting] = [
35+
.enableUpcomingFeature("InternalImportsByDefault"),
36+
.swiftLanguageMode(.v5),
37+
]
38+
39+
// MARK: [env] OPENGRAPH_SWIFT_TOOLCHAIN_PATH
40+
41+
// Modified from: https://github.com/swiftlang/swift/blob/main/SwiftCompilerSources/Package.swift
3742
//
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
43+
// Create a couple of symlinks to an existing Ninja build:
4244
//
43-
// where <project-root> is the parent directory of the swift repository.
45+
// ```shell
46+
// cd $OPENGRAPH_SWIFT_TOOLCHAIN_PATH
47+
// mkdir -p build/Default
48+
// ln -s build/<Ninja-Build>/llvm-<os+arch> build/Default/llvm
49+
// ln -s build/<Ninja-Build>/swift-<os+arch> build/Default/swift
50+
// ```
4451
//
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-
]
52+
// where <$OPENGRAPH_SWIFT_TOOLCHAIN_PATH> is the parent directory of the swift repository.
5553

54+
let swiftToolchainPath = Context.environment["OPENGRAPH_SWIFT_TOOLCHAIN_PATH"] ?? (development ? "/Volumes/BuildMachine/swift-project" : "")
5655
if !swiftToolchainPath.isEmpty {
5756
sharedCSettings.append(
5857
.unsafeFlags(
@@ -68,31 +67,42 @@ if !swiftToolchainPath.isEmpty {
6867
"-I\(swiftToolchainPath)/build/Default/swift/include",
6968
"-I\(swiftToolchainPath)/build/Default/llvm/include",
7069
"-I\(swiftToolchainPath)/build/Default/llvm/tools/clang/include",
70+
"-DLLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING", // Required to fix LLVM link issue
7171
]
7272
)
7373
)
7474
}
7575

76+
// MARK: [env] OPENGRAPH_SWIFT_TOOLCHAIN_VERSION
77+
78+
let swiftToolchainVersion = Context.environment["OPENGRAPH_SWIFT_TOOLCHAIN_VERSION"] ?? (development ? "6.0.2" : "")
7679
if !swiftToolchainVersion.isEmpty {
7780
sharedCSettings.append(
7881
.define("OPENGRAPH_SWIFT_TOOLCHAIN_VERSION", to: swiftToolchainVersion)
7982
)
8083
}
8184

82-
// MARK: - Swift Settings
85+
// MARK: - [env] OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
8386

84-
var sharedSwiftSettings: [SwiftSetting] = [
85-
.enableUpcomingFeature("InternalImportsByDefault"),
86-
.define("OPENGRAPH_RELEASE_\(releaseVersion)"),
87-
.swiftLanguageMode(.v5),
88-
]
87+
let swiftToolchainSupported = envEnable("OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED", default: !swiftToolchainVersion.isEmpty)
88+
if swiftToolchainSupported {
89+
sharedCSettings.append(.define("OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED"))
90+
sharedSwiftSettings.append(.define("OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED"))
91+
}
92+
93+
// MARK: - [env] OPENGRAPH_TARGET_RELEASE
8994

95+
let releaseVersion = Context.environment["OPENGRAPH_TARGET_RELEASE"].flatMap { Int($0) } ?? 2024
96+
sharedCSettings.append(.define("OPENGRAPH_RELEASE", to: "\(releaseVersion)"))
97+
sharedSwiftSettings.append(.define("OPENGRAPH_RELEASE_\(releaseVersion)"))
9098
if releaseVersion >= 2021 {
9199
for year in 2021 ... releaseVersion {
92100
sharedSwiftSettings.append(.define("OPENGRAPH_SUPPORT_\(year)_API"))
93101
}
94102
}
95103

104+
// MARK: - [env] OPENGRAPH_WERROR
105+
96106
let warningsAsErrorsCondition = envEnable("OPENGRAPH_WERROR", default: isXcodeEnv && development)
97107
if warningsAsErrorsCondition {
98108
sharedSwiftSettings.append(.unsafeFlags(["-warnings-as-errors"]))
@@ -102,6 +112,7 @@ if warningsAsErrorsCondition {
102112

103113
let openGraphShimsTarget = Target.target(
104114
name: "OpenGraphShims",
115+
cSettings: sharedCSettings,
105116
swiftSettings: sharedSwiftSettings
106117
)
107118

@@ -111,6 +122,7 @@ let openGraphShimsTestTarget = Target.testTarget(
111122
"OpenGraphShims",
112123
],
113124
exclude: ["README.md"],
125+
cSettings: sharedCSettings,
114126
swiftSettings: sharedSwiftSettings
115127
)
116128

@@ -120,6 +132,7 @@ let openGraphTestTarget = Target.testTarget(
120132
"OpenGraph",
121133
],
122134
exclude: ["README.md"],
135+
cSettings: sharedCSettings,
123136
swiftSettings: sharedSwiftSettings
124137
)
125138
let openGraphCompatibilityTestTarget = Target.testTarget(
@@ -128,6 +141,7 @@ let openGraphCompatibilityTestTarget = Target.testTarget(
128141
.product(name: "RealModule", package: "swift-numerics"),
129142
],
130143
exclude: ["README.md"],
144+
cSettings: sharedCSettings,
131145
swiftSettings: sharedSwiftSettings
132146
)
133147

@@ -149,11 +163,14 @@ let package = Package(
149163
// The SwiftPM support for such usage is still in progress.
150164
.target(
151165
name: "OpenGraph_SPI",
152-
cSettings: sharedCSettings
166+
cSettings: sharedCSettings + [
167+
.define("__COREFOUNDATION_FORSWIFTFOUNDATIONONLY__", to: "1", .when(platforms: .nonDarwinPlatforms)),
168+
]
153169
),
154170
.target(
155171
name: "OpenGraph",
156172
dependencies: ["OpenGraph_SPI"],
173+
cSettings: sharedCSettings,
157174
swiftSettings: sharedSwiftSettings
158175
),
159176
openGraphShimsTarget,

Sources/OpenGraphShims/GraphShims.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
//
22
// GraphShims.swift
3+
// OpenGraphShims
34

45
#if OPENGRAPH_ATTRIBUTEGRAPH
56
@_exported public import AttributeGraph
@@ -21,13 +22,18 @@ public typealias OGSubgraph = AGSubgraph
2122
public typealias OGSwiftMetadata = AGSwiftMetadata
2223
public typealias OGTupleType = AGTupleType
2324
public typealias OGTypeApplyOptions = AGTypeApplyOptions
24-
public typealias OGTypeKind = AGTypeKind
2525
public typealias OGUniqueID = AGUniqueID
2626
public typealias OGValue = AGValue
2727
public typealias OGValueOptions = AGValueOptions
2828
public typealias OGValueState = AGValueState
2929
public let attributeGraphEnabled = true
30+
public let swiftToolchainSupported = true
3031
#else
3132
@_exported import OpenGraph
3233
public let attributeGraphEnabled = false
34+
#if OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
35+
public let swiftToolchainSupported = true
36+
#else
37+
public let swiftToolchainSupported = false
38+
#endif
3339
#endif

Sources/OpenGraphShims/Metadata+Debug.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
//
22
// Metadata+Debug.swift
3+
// OpenGraphShims
34

45
import Foundation
56

Sources/OpenGraph_SPI/Graph/OGSubgraph.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,14 +196,14 @@ void OGSubgraphSetShouldRecordTree() {
196196
void OGSubgraphBeginTreeElement(OGAttribute attribute, OGTypeID type, uint32_t flags) {
197197
OG::Subgraph * subgraph = OG::Subgraph::get_current();
198198
if (subgraph) {
199-
subgraph->begin_tree(attribute, type, flags);
199+
subgraph->begin_tree(attribute, reinterpret_cast<OG::swift::metadata const*>(type), flags);
200200
}
201201
}
202202

203203
void OGSubgraphAddTreeValue(OGAttribute attribute, OGTypeID type, const char * key, uint32_t flags) {
204204
OG::Subgraph * subgraph = OG::Subgraph::get_current();
205205
if (subgraph) {
206-
subgraph->add_tree_value(attribute, type, key, flags);
206+
subgraph->add_tree_value(attribute, reinterpret_cast<OG::swift::metadata const*>(type), key, flags);
207207
}
208208
}
209209

Sources/OpenGraph_SPI/Runtime/OGSwiftMetadata.h

Lines changed: 0 additions & 11 deletions
This file was deleted.

Sources/OpenGraph_SPI/Runtime/OGTupleType.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
#define OGTupleType_h
1010

1111
#include "OGBase.h"
12-
#include "OGSwiftMetadata.h"
1312
#include "OGTypeID.h"
1413

1514
typedef const OGSwiftMetadata *OGTupleType OG_SWIFT_STRUCT;

Sources/OpenGraph_SPI/Runtime/OGTypeDescription.cpp

Lines changed: 0 additions & 17 deletions
This file was deleted.

Sources/OpenGraph_SPI/Runtime/OGTypeDescription.h

Lines changed: 0 additions & 29 deletions
This file was deleted.
Lines changed: 67 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,36 @@
11
//
22
// OGTypeID.cpp
3+
// OpenGraph_SPI
34
//
4-
//
5-
// Created by Kyle on 2024/1/7.
6-
//
5+
// Audited for iOS 18.0
6+
// Status: WIP
77

88
#include "OGTypeID.h"
9+
#include "metadata.hpp"
910

10-
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_VERSION
11+
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
1112
#include <swift/Runtime/Metadata.h>
1213
#endif
1314

1415
OGTypeKind OGTypeGetKind(OGTypeID typeID) {
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:
16+
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
17+
auto metadata = reinterpret_cast<OG::swift::metadata const*>(typeID);
18+
switch (metadata->getKind()) {
19+
case swift::MetadataKind::Class: // 0x0
1920
return OGTypeKindClass;
20-
case swift::MetadataKind::Struct:
21+
case swift::MetadataKind::Struct: // 0x200
2122
return OGTypeKindStruct;
22-
case swift::MetadataKind::Enum:
23+
case swift::MetadataKind::Enum: // 0x201
2324
return OGTypeKindEnum;
24-
case swift::MetadataKind::Optional:
25+
case swift::MetadataKind::Optional: // 0x202
2526
return OGTypeKindOptional;
26-
case swift::MetadataKind::Tuple:
27+
case swift::MetadataKind::Tuple: // 0x301
2728
return OGTypeKindTuple;
28-
case swift::MetadataKind::Function:
29+
case swift::MetadataKind::Function: // 0x302
2930
return OGTypeKindFunction;
30-
case swift::MetadataKind::Existential:
31+
case swift::MetadataKind::Existential: // 0x303
3132
return OGTypeKindExistential;
32-
case swift::MetadataKind::Metatype:
33+
case swift::MetadataKind::Metatype: // 0x304
3334
return OGTypeKindMetatype;
3435
default:
3536
return OGTypeKindNone;
@@ -39,6 +40,56 @@ OGTypeKind OGTypeGetKind(OGTypeID typeID) {
3940
#endif
4041
}
4142

42-
const void * OGTypeNominalDescriptor(OGTypeID typeID) {
43+
#if OPENGRAPH_RELEASE >= 2024
44+
45+
void const* OGTypeGetSignature(OGTypeID typeID) {
46+
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
47+
auto metadata = reinterpret_cast<OG::swift::metadata const*>(typeID);
48+
// TODO
4349
return nullptr;
50+
#else
51+
return nullptr;
52+
#endif
53+
}
54+
void const* OGTypeGetDescriptor(OGTypeID typeID) {
55+
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
56+
auto metadata = reinterpret_cast<OG::swift::metadata const*>(typeID);
57+
return metadata->descriptor();
58+
#else
59+
return nullptr;
60+
#endif
61+
}
62+
63+
#endif /* OPENGRAPH_RELEASE */
64+
65+
CFStringRef OGTypeDescription(OGTypeID typeID) {
66+
CFMutableStringRef ref = CFStringCreateMutable(CFAllocatorGetDefault(), 0);
67+
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
68+
auto metadata = reinterpret_cast<OG::swift::metadata const*>(typeID);
69+
metadata->append_description(ref);
70+
#endif
71+
return ref;
72+
}
73+
74+
void const* OGTypeNominalDescriptor(OGTypeID typeID) {
75+
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
76+
auto metadata = reinterpret_cast<OG::swift::metadata const*>(typeID);
77+
78+
return metadata->nominal_descriptor();
79+
#else
80+
return nullptr;
81+
#endif
82+
}
83+
84+
char const* OGTypeNominalDescriptorName(OGTypeID typeID) {
85+
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
86+
auto metadata = reinterpret_cast<OG::swift::metadata const*>(typeID);
87+
auto nominal_descriptor = metadata->nominal_descriptor();
88+
if (nominal_descriptor == nullptr) {
89+
return nullptr;
90+
}
91+
return nominal_descriptor->Name.get();
92+
#else
93+
return nullptr;
94+
#endif
4495
}

0 commit comments

Comments
 (0)