Skip to content

Commit b528731

Browse files
authored
Merge pull request swiftlang#32878 from nkcsgexi/65488510-3
[5.3] ModuleInterface: teach the compiler to look into SDK-versioned prebuilt module cache dir
2 parents ec48de5 + ede098d commit b528731

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

lib/Frontend/CompilerInvocation.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,20 @@ void CompilerInvocation::setDefaultPrebuiltCacheIfNecessary() {
7676
platform = getPlatformNameForTriple(LangOpts.Target);
7777
}
7878
llvm::sys::path::append(defaultPrebuiltPath, platform, "prebuilt-modules");
79+
80+
// If the SDK version is given, we should check if SDK-versioned prebuilt
81+
// module cache is available and use it if so.
82+
if (auto ver = LangOpts.SDKVersion) {
83+
// "../macosx/prebuilt-modules"
84+
SmallString<64> defaultPrebuiltPathWithSDKVer = defaultPrebuiltPath;
85+
// "../macosx/prebuilt-modules/10.15"
86+
llvm::sys::path::append(defaultPrebuiltPathWithSDKVer, ver->getAsString());
87+
// If the versioned prebuilt module cache exists in the disk, use it.
88+
if (llvm::sys::fs::exists(defaultPrebuiltPathWithSDKVer)) {
89+
FrontendOpts.PrebuiltModuleCachePath = defaultPrebuiltPathWithSDKVer.str();
90+
return;
91+
}
92+
}
7993
FrontendOpts.PrebuiltModuleCachePath = defaultPrebuiltPath.str();
8094
}
8195

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// 1. Create folders for a) our Swift module, b) the module cache, and c) a
2+
// fake resource dir with a default prebuilt module cache inside.
3+
// RUN: %empty-directory(%t/PrebuiltModule.swiftmodule)
4+
// RUN: %empty-directory(%t/ModuleCache)
5+
// RUN: %empty-directory(%t/ResourceDir/%target-sdk-name/prebuilt-modules/10.15/PrebuiltModule.swiftmodule)
6+
// RUN: %empty-directory(%t/ResourceDir/%target-sdk-name/prebuilt-modules/PrebuiltModule.swiftmodule)
7+
8+
// 2. Define some public API
9+
// RUN: echo 'public struct InPrebuiltModule {}' > %t/PrebuiltModule.swift
10+
11+
// 3. Compile this into a module and put it into the default SKD-versioned prebuilt cache
12+
// location relative to the fake resource dir. Also drop an interface into
13+
// the build dir.
14+
// RUN: %target-swift-frontend -emit-module %t/PrebuiltModule.swift -o %t/ResourceDir/%target-sdk-name/prebuilt-modules/10.15/PrebuiltModule.swiftmodule/%target-cpu.swiftmodule -module-name PrebuiltModule -parse-stdlib -emit-module-interface-path %t/PrebuiltModule.swiftmodule/%target-cpu.swiftinterface
15+
16+
// 4. Compile this into a module and put it into the default non-versioned prebuilt cache
17+
// location relative to the fake resource dir. Also drop an interface into
18+
// the build dir.
19+
// RUN: %target-swift-frontend -emit-module %t/PrebuiltModule.swift -o %t/ResourceDir/%target-sdk-name/prebuilt-modules/PrebuiltModule.swiftmodule/%target-cpu.swiftmodule -module-name PrebuiltModule -parse-stdlib -emit-module-interface-path %t/PrebuiltModule.swiftmodule/%target-cpu.swiftinterface
20+
21+
// 5. Import this prebuilt module, but DON'T pass in -prebuilt-module-cache-path, it should use the implicit one from the SDK-versioned prebuilt module cache dir.
22+
// RUN: %target-swift-frontend -typecheck -resource-dir %t/ResourceDir -I %t %s -parse-stdlib -module-cache-path %t/ModuleCache -sdk %t -target-sdk-version 10.15
23+
24+
// 6. Make sure we installed a forwarding module in the module cache.
25+
// RUN: %{python} %S/ModuleCache/Inputs/check-is-forwarding-module.py %t/ModuleCache/PrebuiltModule-*.swiftmodule
26+
27+
// 7. Remove the prebuilt module from the SDK-versioned prebuilt module cache dir.
28+
// RUN: %empty-directory(%t/ResourceDir/%target-sdk-name/prebuilt-modules/10.15)
29+
30+
// 8. Import this prebuilt module, it should not find the prebuilt module cache.
31+
// RUN: %target-swift-frontend -typecheck -resource-dir %t/ResourceDir -I %t %s -parse-stdlib -module-cache-path %t/ModuleCache -sdk %t -target-sdk-version 10.15
32+
33+
// 9. Make sure we built a binary module in the module cache.
34+
// RUN: not %{python} %S/ModuleCache/Inputs/check-is-forwarding-module.py %t/ModuleCache/PrebuiltModule-*.swiftmodule
35+
36+
import PrebuiltModule
37+
38+
func x<T>(_ x: T) {}
39+
40+
x(InPrebuiltModule.self)

0 commit comments

Comments
 (0)