Skip to content

Commit e3d4597

Browse files
authored
Merge pull request #1478 from zixu-w/api-descriptor
Add support for automatically emit API descriptor files
2 parents 2626ccd + 13a3bbf commit e3d4597

File tree

2 files changed

+95
-25
lines changed

2 files changed

+95
-25
lines changed

Sources/SwiftDriver/Driver/Driver.swift

+20-8
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+
var apiDescriptorDirectory: VirtualPath? = nil
961+
if let apiDescriptorDirectoryEnvVar = env["TAPI_SDKDB_OUTPUT_PATH"] {
962+
apiDescriptorDirectory = try VirtualPath(path: apiDescriptorDirectoryEnvVar)
963+
} else if let ldTraceFileEnvVar = env["LD_TRACE_FILE"] {
964+
apiDescriptorDirectory = try VirtualPath(path: ldTraceFileEnvVar).parentDirectory.appending(component: "SDKDB")
965+
}
966+
if let apiDescriptorDirectory = 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

+75-17
Original file line numberDiff line numberDiff line change
@@ -7232,30 +7232,88 @@ final class SwiftDriverTests: XCTestCase {
72327232

72337233
func testEmitAPIDescriptorEmitModule() throws {
72347234
try withTemporaryDirectory { path in
7235-
let apiDescriptorPath = path.appending(component: "api.json").nativePathString(escaped: true)
7236-
var driver = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "baz.swift",
7237-
"-emit-module", "-module-name", "Test",
7238-
"-emit-api-descriptor-path", apiDescriptorPath])
7235+
do {
7236+
let apiDescriptorPath = path.appending(component: "api.json").nativePathString(escaped: true)
7237+
var driver = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "baz.swift",
7238+
"-emit-module", "-module-name", "Test",
7239+
"-emit-api-descriptor-path", apiDescriptorPath])
72397240

7240-
let jobs = try driver.planBuild().removingAutolinkExtractJobs()
7241-
let emitModuleJob = try jobs.findJob(.emitModule)
7242-
XCTAssert(emitModuleJob.commandLine.contains(.flag("-emit-api-descriptor-path")))
7241+
let jobs = try driver.planBuild().removingAutolinkExtractJobs()
7242+
let emitModuleJob = try jobs.findJob(.emitModule)
7243+
XCTAssert(emitModuleJob.commandLine.contains(.flag("-emit-api-descriptor-path")))
7244+
}
7245+
7246+
do {
7247+
var env = ProcessEnv.vars
7248+
env["TAPI_SDKDB_OUTPUT_PATH"] = path.appending(component: "SDKDB").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+
}
7258+
7259+
do {
7260+
var env = ProcessEnv.vars
7261+
env["LD_TRACE_FILE"] = path.appending(component: ".LD_TRACE").nativePathString(escaped: false)
7262+
var driver = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "baz.swift",
7263+
"-emit-module", "-module-name", "Test"], env: env)
7264+
let jobs = try driver.planBuild().removingAutolinkExtractJobs()
7265+
let emitModuleJob = try jobs.findJob(.emitModule)
7266+
XCTAssert(emitModuleJob.commandLine.contains(subsequence: [
7267+
.flag("-emit-api-descriptor-path"),
7268+
.path(.absolute(path.appending(components: "SDKDB", "Test.\(driver.frontendTargetInfo.target.moduleTriple.triple).swift.sdkdb"))),
7269+
]))
7270+
}
72437271
}
72447272
}
72457273

72467274
func testEmitAPIDescriptorWholeModuleOptimization() throws {
72477275
try withTemporaryDirectory { path in
7248-
let apiDescriptorPath = path.appending(component: "api.json").nativePathString(escaped: true)
7249-
var driver = try Driver(args: ["swiftc", "-whole-module-optimization",
7250-
"-driver-filelist-threshold=0",
7251-
"foo.swift", "bar.swift", "baz.swift",
7252-
"-module-name", "Test", "-emit-module",
7253-
"-emit-api-descriptor-path", apiDescriptorPath])
7276+
do {
7277+
let apiDescriptorPath = path.appending(component: "api.json").nativePathString(escaped: true)
7278+
var driver = try Driver(args: ["swiftc", "-whole-module-optimization",
7279+
"-driver-filelist-threshold=0",
7280+
"foo.swift", "bar.swift", "baz.swift",
7281+
"-module-name", "Test", "-emit-module",
7282+
"-emit-api-descriptor-path", apiDescriptorPath])
72547283

7255-
let jobs = try driver.planBuild().removingAutolinkExtractJobs()
7256-
let compileJob = try jobs.findJob(.compile)
7257-
let supplementaryOutputs = try XCTUnwrap(compileJob.commandLine.supplementaryOutputFilemap)
7258-
XCTAssertNotNil(supplementaryOutputs.entries.values.first?[.jsonAPIDescriptor])
7284+
let jobs = try driver.planBuild().removingAutolinkExtractJobs()
7285+
let compileJob = try jobs.findJob(.compile)
7286+
let supplementaryOutputs = try XCTUnwrap(compileJob.commandLine.supplementaryOutputFilemap)
7287+
XCTAssertNotNil(supplementaryOutputs.entries.values.first?[.jsonAPIDescriptor])
7288+
}
7289+
7290+
do {
7291+
var env = ProcessEnv.vars
7292+
env["TAPI_SDKDB_OUTPUT_PATH"] = path.appending(component: "SDKDB").nativePathString(escaped: false)
7293+
var driver = try Driver(args: ["swiftc", "-whole-module-optimization",
7294+
"-driver-filelist-threshold=0",
7295+
"foo.swift", "bar.swift", "baz.swift",
7296+
"-module-name", "Test", "-emit-module"], env: env)
7297+
7298+
let jobs = try driver.planBuild().removingAutolinkExtractJobs()
7299+
let compileJob = try jobs.findJob(.compile)
7300+
let supplementaryOutputs = try XCTUnwrap(compileJob.commandLine.supplementaryOutputFilemap)
7301+
XCTAssertNotNil(supplementaryOutputs.entries.values.first?[.jsonAPIDescriptor])
7302+
}
7303+
7304+
do {
7305+
var env = ProcessEnv.vars
7306+
env["LD_TRACE_FILE"] = path.appending(component: ".LD_TRACE").nativePathString(escaped: false)
7307+
var driver = try Driver(args: ["swiftc", "-whole-module-optimization",
7308+
"-driver-filelist-threshold=0",
7309+
"foo.swift", "bar.swift", "baz.swift",
7310+
"-module-name", "Test", "-emit-module"], env: env)
7311+
7312+
let jobs = try driver.planBuild().removingAutolinkExtractJobs()
7313+
let compileJob = try jobs.findJob(.compile)
7314+
let supplementaryOutputs = try XCTUnwrap(compileJob.commandLine.supplementaryOutputFilemap)
7315+
XCTAssertNotNil(supplementaryOutputs.entries.values.first?[.jsonAPIDescriptor])
7316+
}
72597317
}
72607318
}
72617319
}

0 commit comments

Comments
 (0)