Skip to content

Commit 8248f9c

Browse files
authored
Merge pull request swiftlang#32856 from nkcsgexi/65488510
ModuleInterface: teach the compiler to look into SDK-versioned prebuilt module cache dir
2 parents cff144a + f5477d6 commit 8248f9c

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
@@ -88,6 +88,20 @@ void CompilerInvocation::setDefaultPrebuiltCacheIfNecessary() {
8888
platform = getPlatformNameForTriple(LangOpts.Target);
8989
}
9090
llvm::sys::path::append(defaultPrebuiltPath, platform, "prebuilt-modules");
91+
92+
// If the SDK version is given, we should check if SDK-versioned prebuilt
93+
// module cache is available and use it if so.
94+
if (auto ver = LangOpts.SDKVersion) {
95+
// "../macosx/prebuilt-modules"
96+
SmallString<64> defaultPrebuiltPathWithSDKVer = defaultPrebuiltPath;
97+
// "../macosx/prebuilt-modules/10.15"
98+
llvm::sys::path::append(defaultPrebuiltPathWithSDKVer, ver->getAsString());
99+
// If the versioned prebuilt module cache exists in the disk, use it.
100+
if (llvm::sys::fs::exists(defaultPrebuiltPathWithSDKVer)) {
101+
FrontendOpts.PrebuiltModuleCachePath = defaultPrebuiltPathWithSDKVer.str();
102+
return;
103+
}
104+
}
91105
FrontendOpts.PrebuiltModuleCachePath = defaultPrebuiltPath.str();
92106
}
93107

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-swiftmodule-name -module-name PrebuiltModule -parse-stdlib -emit-module-interface-path %t/PrebuiltModule.swiftmodule/%target-swiftinterface-name
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-swiftmodule-name -module-name PrebuiltModule -parse-stdlib -emit-module-interface-path %t/PrebuiltModule.swiftmodule/%target-swiftinterface-name
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)