Skip to content

Commit c008446

Browse files
committed
Add support for automatically emit API descriptor files
1 parent 94317a7 commit c008446

File tree

2 files changed

+95
-25
lines changed

2 files changed

+95
-25
lines changed

Sources/SwiftDriver/Driver/Driver.swift

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -957,14 +957,26 @@ public struct Driver {
957957
outputFileMap: self.outputFileMap,
958958
moduleName: moduleOutputInfo.name)
959959

960-
self.apiDescriptorFilePath = try Self.computeSupplementaryOutputPath(
961-
&parsedOptions, type: .jsonAPIDescriptor, isOutputOptions: [],
962-
outputPath: .emitApiDescriptorPath,
963-
compilerOutputType: compilerOutputType,
964-
compilerMode: compilerMode,
965-
emitModuleSeparately: emitModuleSeparately,
966-
outputFileMap: self.outputFileMap,
967-
moduleName: moduleOutputInfo.name)
960+
let apiDescriptorDirectory: VirtualPath? = if let apiDescriptorDirectoryEnvVar = env["TAPI_SDKDB_OUTPUT_PATH"] {
961+
try VirtualPath(path: apiDescriptorDirectoryEnvVar)
962+
} else if let ldTraceFileEnvVar = env["LD_TRACE_FILE"] {
963+
try VirtualPath(path: ldTraceFileEnvVar).parentDirectory.appending(component: "SDKDB")
964+
} else { nil }
965+
966+
if let apiDescriptorDirectory {
967+
self.apiDescriptorFilePath = apiDescriptorDirectory
968+
.appending(component: "\(moduleOutputInfo.name).\(frontendTargetInfo.target.moduleTriple.triple).swift.sdkdb")
969+
.intern()
970+
} else {
971+
self.apiDescriptorFilePath = try Self.computeSupplementaryOutputPath(
972+
&parsedOptions, type: .jsonAPIDescriptor, isOutputOptions: [],
973+
outputPath: .emitApiDescriptorPath,
974+
compilerOutputType: compilerOutputType,
975+
compilerMode: compilerMode,
976+
emitModuleSeparately: emitModuleSeparately,
977+
outputFileMap: self.outputFileMap,
978+
moduleName: moduleOutputInfo.name)
979+
}
968980

969981
Self.validateDigesterArgs(&parsedOptions,
970982
moduleOutputInfo: moduleOutputInfo,

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 75 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7219,30 +7219,88 @@ final class SwiftDriverTests: XCTestCase {
72197219

72207220
func testEmitAPIDescriptorEmitModule() throws {
72217221
try withTemporaryDirectory { path in
7222-
let apiDescriptorPath = path.appending(component: "api.json").nativePathString(escaped: true)
7223-
var driver = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "baz.swift",
7224-
"-emit-module", "-module-name", "Test",
7225-
"-emit-api-descriptor-path", apiDescriptorPath])
7222+
do {
7223+
let apiDescriptorPath = path.appending(component: "api.json").nativePathString(escaped: true)
7224+
var driver = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "baz.swift",
7225+
"-emit-module", "-module-name", "Test",
7226+
"-emit-api-descriptor-path", apiDescriptorPath])
72267227

7227-
let jobs = try driver.planBuild().removingAutolinkExtractJobs()
7228-
let emitModuleJob = try jobs.findJob(.emitModule)
7229-
XCTAssert(emitModuleJob.commandLine.contains(.flag("-emit-api-descriptor-path")))
7228+
let jobs = try driver.planBuild().removingAutolinkExtractJobs()
7229+
let emitModuleJob = try jobs.findJob(.emitModule)
7230+
XCTAssert(emitModuleJob.commandLine.contains(.flag("-emit-api-descriptor-path")))
7231+
}
7232+
7233+
do {
7234+
var env = ProcessEnv.vars
7235+
env["TAPI_SDKDB_OUTPUT_PATH"] = path.appending(component: "SDKDB").nativePathString(escaped: false)
7236+
var driver = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "baz.swift",
7237+
"-emit-module", "-module-name", "Test"], env: env)
7238+
let jobs = try driver.planBuild().removingAutolinkExtractJobs()
7239+
let emitModuleJob = try jobs.findJob(.emitModule)
7240+
XCTAssert(emitModuleJob.commandLine.contains(subsequence: [
7241+
.flag("-emit-api-descriptor-path"),
7242+
.path(.absolute(path.appending(components: "SDKDB", "Test.\(driver.frontendTargetInfo.target.moduleTriple.triple).swift.sdkdb"))),
7243+
]))
7244+
}
7245+
7246+
do {
7247+
var env = ProcessEnv.vars
7248+
env["LD_TRACE_FILE"] = path.appending(component: ".LD_TRACE").nativePathString(escaped: false)
7249+
var driver = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "baz.swift",
7250+
"-emit-module", "-module-name", "Test"], env: env)
7251+
let jobs = try driver.planBuild().removingAutolinkExtractJobs()
7252+
let emitModuleJob = try jobs.findJob(.emitModule)
7253+
XCTAssert(emitModuleJob.commandLine.contains(subsequence: [
7254+
.flag("-emit-api-descriptor-path"),
7255+
.path(.absolute(path.appending(components: "SDKDB", "Test.\(driver.frontendTargetInfo.target.moduleTriple.triple).swift.sdkdb"))),
7256+
]))
7257+
}
72307258
}
72317259
}
72327260

72337261
func testEmitAPIDescriptorWholeModuleOptimization() throws {
72347262
try withTemporaryDirectory { path in
7235-
let apiDescriptorPath = path.appending(component: "api.json").nativePathString(escaped: true)
7236-
var driver = try Driver(args: ["swiftc", "-whole-module-optimization",
7237-
"-driver-filelist-threshold=0",
7238-
"foo.swift", "bar.swift", "baz.swift",
7239-
"-module-name", "Test", "-emit-module",
7240-
"-emit-api-descriptor-path", apiDescriptorPath])
7263+
do {
7264+
let apiDescriptorPath = path.appending(component: "api.json").nativePathString(escaped: true)
7265+
var driver = try Driver(args: ["swiftc", "-whole-module-optimization",
7266+
"-driver-filelist-threshold=0",
7267+
"foo.swift", "bar.swift", "baz.swift",
7268+
"-module-name", "Test", "-emit-module",
7269+
"-emit-api-descriptor-path", apiDescriptorPath])
72417270

7242-
let jobs = try driver.planBuild().removingAutolinkExtractJobs()
7243-
let compileJob = try jobs.findJob(.compile)
7244-
let supplementaryOutputs = try XCTUnwrap(compileJob.commandLine.supplementaryOutputFilemap)
7245-
XCTAssertNotNil(supplementaryOutputs.entries.values.first?[.jsonAPIDescriptor])
7271+
let jobs = try driver.planBuild().removingAutolinkExtractJobs()
7272+
let compileJob = try jobs.findJob(.compile)
7273+
let supplementaryOutputs = try XCTUnwrap(compileJob.commandLine.supplementaryOutputFilemap)
7274+
XCTAssertNotNil(supplementaryOutputs.entries.values.first?[.jsonAPIDescriptor])
7275+
}
7276+
7277+
do {
7278+
var env = ProcessEnv.vars
7279+
env["TAPI_SDKDB_OUTPUT_PATH"] = path.appending(component: "SDKDB").nativePathString(escaped: false)
7280+
var driver = try Driver(args: ["swiftc", "-whole-module-optimization",
7281+
"-driver-filelist-threshold=0",
7282+
"foo.swift", "bar.swift", "baz.swift",
7283+
"-module-name", "Test", "-emit-module"], env: env)
7284+
7285+
let jobs = try driver.planBuild().removingAutolinkExtractJobs()
7286+
let compileJob = try jobs.findJob(.compile)
7287+
let supplementaryOutputs = try XCTUnwrap(compileJob.commandLine.supplementaryOutputFilemap)
7288+
XCTAssertNotNil(supplementaryOutputs.entries.values.first?[.jsonAPIDescriptor])
7289+
}
7290+
7291+
do {
7292+
var env = ProcessEnv.vars
7293+
env["LD_TRACE_FILE"] = path.appending(component: ".LD_TRACE").nativePathString(escaped: false)
7294+
var driver = try Driver(args: ["swiftc", "-whole-module-optimization",
7295+
"-driver-filelist-threshold=0",
7296+
"foo.swift", "bar.swift", "baz.swift",
7297+
"-module-name", "Test", "-emit-module"], env: env)
7298+
7299+
let jobs = try driver.planBuild().removingAutolinkExtractJobs()
7300+
let compileJob = try jobs.findJob(.compile)
7301+
let supplementaryOutputs = try XCTUnwrap(compileJob.commandLine.supplementaryOutputFilemap)
7302+
XCTAssertNotNil(supplementaryOutputs.entries.values.first?[.jsonAPIDescriptor])
7303+
}
72467304
}
72477305
}
72487306
}

0 commit comments

Comments
 (0)