xref: /llvm-project/clang/test/ClangScanDeps/modules-priv-fw-from-pub.m (revision 9d4837f47c48c634d4a0ac799188e1f5332495ef)
1a3efd892SJan Svoboda// This test checks that importing private headers from the public headers of
2a3efd892SJan Svoboda// a framework is consistent between the dependency scanner and the explicit build.
3a3efd892SJan Svoboda
4a3efd892SJan Svoboda// RUN: rm -rf %t
5a3efd892SJan Svoboda// RUN: split-file %s %t
6a3efd892SJan Svoboda
7a3efd892SJan Svoboda//--- frameworks/FW.framework/Modules/module.modulemap
8a3efd892SJan Svobodaframework module FW { header "FW.h" }
9a3efd892SJan Svoboda//--- frameworks/FW.framework/Modules/module.private.modulemap
10a3efd892SJan Svobodaframework module FW_Private { header "FW_Private.h"}
11a3efd892SJan Svoboda//--- frameworks/FW.framework/Headers/FW.h
12a3efd892SJan Svoboda#include <FW/FW_Private.h>
13a3efd892SJan Svoboda//--- frameworks/FW.framework/PrivateHeaders/FW_Private.h
14a3efd892SJan Svoboda@import Dependency;
15a3efd892SJan Svoboda
16a3efd892SJan Svoboda//--- modules/module.modulemap
17a3efd892SJan Svobodamodule Dependency { header "dependency.h" }
18a3efd892SJan Svoboda//--- modules/dependency.h
19a3efd892SJan Svoboda// empty
20a3efd892SJan Svoboda
21a3efd892SJan Svoboda//--- tu.m
22a3efd892SJan Svoboda#include <FW/FW.h>
23a3efd892SJan Svoboda
24a3efd892SJan Svoboda//--- cdb.json.in
25a3efd892SJan Svoboda[{
26a3efd892SJan Svoboda  "file": "DIR/tu.m",
27a3efd892SJan Svoboda  "directory": "DIR",
28a3efd892SJan Svoboda  "command": "clang -fmodules -fmodules-cache-path=DIR/cache -fimplicit-module-maps -I DIR/modules -F DIR/frameworks -Wno-framework-include-private-from-public -Wno-atimport-in-framework-header -c DIR/tu.m -o DIR/tu.o"
29a3efd892SJan Svoboda}]
30a3efd892SJan Svoboda
31a3efd892SJan Svoboda// RUN: sed -e "s|DIR|%/t|g" %t/cdb.json.in > %t/cdb.json
32a3efd892SJan Svoboda// RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full > %t/deps.json
33a3efd892SJan Svoboda
34a3efd892SJan Svoboda// Check that FW is reported to depend on FW_Private.
35a3efd892SJan Svoboda// RUN: cat %t/deps.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t
36a3efd892SJan Svoboda// CHECK:      {
37a3efd892SJan Svoboda// CHECK-NEXT:   "modules": [
38a3efd892SJan Svoboda// CHECK-NEXT:     {
39a3efd892SJan Svoboda// CHECK-NEXT:       "clang-module-deps": [],
40a3efd892SJan Svoboda// CHECK-NEXT:       "clang-modulemap-file": "[[PREFIX]]/modules/module.modulemap",
41a3efd892SJan Svoboda// CHECK-NEXT:       "command-line": [
42a3efd892SJan Svoboda// CHECK:            ],
43a3efd892SJan Svoboda// CHECK-NEXT:       "context-hash": "{{.*}}",
44a3efd892SJan Svoboda// CHECK-NEXT:       "file-deps": [
45*9d4837f4SJan Svoboda// CHECK-NEXT:         "[[PREFIX]]/modules/module.modulemap",
46*9d4837f4SJan Svoboda// CHECK-NEXT:         "[[PREFIX]]/modules/dependency.h"
47a3efd892SJan Svoboda// CHECK-NEXT:       ],
4868eb3b20SArtem Chikin// CHECK-NEXT:       "link-libraries": [],
49a3efd892SJan Svoboda// CHECK-NEXT:       "name": "Dependency"
50a3efd892SJan Svoboda// CHECK-NEXT:     },
51a3efd892SJan Svoboda// CHECK-NEXT:     {
52a3efd892SJan Svoboda// CHECK-NEXT:       "clang-module-deps": [
53a3efd892SJan Svoboda// CHECK-NEXT:         {
54a3efd892SJan Svoboda// CHECK-NEXT:           "context-hash": "{{.*}}",
55a3efd892SJan Svoboda// CHECK-NEXT:           "module-name": "FW_Private"
56a3efd892SJan Svoboda// CHECK-NEXT:         }
57a3efd892SJan Svoboda// CHECK-NEXT:       ],
58a3efd892SJan Svoboda// CHECK-NEXT:       "clang-modulemap-file": "[[PREFIX]]/frameworks/FW.framework/Modules/module.modulemap",
59a3efd892SJan Svoboda// CHECK-NEXT:       "command-line": [
60a3efd892SJan Svoboda// CHECK:            ],
61a3efd892SJan Svoboda// CHECK-NEXT:       "context-hash": "{{.*}}",
62a3efd892SJan Svoboda// CHECK-NEXT:       "file-deps": [
63a3efd892SJan Svoboda// CHECK-NEXT:         "[[PREFIX]]/frameworks/FW.framework/Modules/module.modulemap",
64*9d4837f4SJan Svoboda// CHECK-NEXT:         "[[PREFIX]]/frameworks/FW.framework/Modules/module.private.modulemap",
65*9d4837f4SJan Svoboda// CHECK-NEXT:         "[[PREFIX]]/frameworks/FW.framework/Headers/FW.h"
66a3efd892SJan Svoboda// CHECK-NEXT:       ],
6768eb3b20SArtem Chikin// CHECK-NEXT:       "link-libraries": [
6868eb3b20SArtem Chikin// CHECK-NEXT:         {
6968eb3b20SArtem Chikin// CHECK-NEXT:           "isFramework": true,
7068eb3b20SArtem Chikin// CHECK-NEXT:           "link-name": "FW"
7168eb3b20SArtem Chikin// CHECK-NEXT:         }
7268eb3b20SArtem Chikin// CHECK-NEXT:       ],
73a3efd892SJan Svoboda// CHECK-NEXT:       "name": "FW"
74a3efd892SJan Svoboda// CHECK-NEXT:     },
75a3efd892SJan Svoboda// CHECK-NEXT:     {
76a3efd892SJan Svoboda// CHECK-NEXT:       "clang-module-deps": [
77a3efd892SJan Svoboda// CHECK-NEXT:         {
78a3efd892SJan Svoboda// CHECK-NEXT:           "context-hash": "{{.*}}",
79a3efd892SJan Svoboda// CHECK-NEXT:           "module-name": "Dependency"
80a3efd892SJan Svoboda// CHECK-NEXT:         }
81a3efd892SJan Svoboda// CHECK-NEXT:       ],
82a3efd892SJan Svoboda// CHECK-NEXT:       "clang-modulemap-file": "[[PREFIX]]/frameworks/FW.framework/Modules/module.private.modulemap",
83a3efd892SJan Svoboda// CHECK-NEXT:       "command-line": [
84a3efd892SJan Svoboda// CHECK:            ],
85a3efd892SJan Svoboda// CHECK-NEXT:       "context-hash": "{{.*}}",
86a3efd892SJan Svoboda// CHECK-NEXT:       "file-deps": [
87a3efd892SJan Svoboda// CHECK-NEXT:         "[[PREFIX]]/frameworks/FW.framework/Modules/module.private.modulemap",
88a3efd892SJan Svoboda// CHECK-NEXT:         "[[PREFIX]]/frameworks/FW.framework/PrivateHeaders/FW_Private.h",
89a3efd892SJan Svoboda// CHECK-NEXT:         "[[PREFIX]]/modules/module.modulemap"
90a3efd892SJan Svoboda// CHECK-NEXT:       ],
9168eb3b20SArtem Chikin// CHECK-NEXT:       "link-libraries": [
9268eb3b20SArtem Chikin// CHECK-NEXT:         {
9368eb3b20SArtem Chikin// CHECK-NEXT:           "isFramework": true,
9468eb3b20SArtem Chikin// CHECK-NEXT:           "link-name": "FW"
9568eb3b20SArtem Chikin// CHECK-NEXT:         }
9668eb3b20SArtem Chikin// CHECK-NEXT:       ],
97a3efd892SJan Svoboda// CHECK-NEXT:       "name": "FW_Private"
98a3efd892SJan Svoboda// CHECK-NEXT:     }
99a3efd892SJan Svoboda// CHECK-NEXT:   ],
100a3efd892SJan Svoboda// CHECK-NEXT:   "translation-units": [
101a3efd892SJan Svoboda// CHECK-NEXT:     {
102a3efd892SJan Svoboda// CHECK-NEXT:       "commands": [
103a3efd892SJan Svoboda// CHECK-NEXT:         {
104a3efd892SJan Svoboda// CHECK-NEXT:           "clang-context-hash": "{{.*}}",
105a3efd892SJan Svoboda// CHECK-NEXT:           "clang-module-deps": [
106a3efd892SJan Svoboda// CHECK-NEXT:             {
107a3efd892SJan Svoboda// CHECK-NEXT:               "context-hash": "{{.*}}",
108a3efd892SJan Svoboda// CHECK-NEXT:               "module-name": "FW"
109a3efd892SJan Svoboda// CHECK-NEXT:             }
110a3efd892SJan Svoboda// CHECK-NEXT:           ],
111a3efd892SJan Svoboda// CHECK-NEXT:           "command-line": [
112a3efd892SJan Svoboda// CHECK:                ],
113a26ec542SMartin Storsjö// CHECK:                "file-deps": [
114a3efd892SJan Svoboda// CHECK-NEXT:             "[[PREFIX]]/tu.m"
115a3efd892SJan Svoboda// CHECK-NEXT:           ],
116a3efd892SJan Svoboda// CHECK-NEXT:           "input-file": "[[PREFIX]]/tu.m"
117a3efd892SJan Svoboda// CHECK-NEXT:         }
118a3efd892SJan Svoboda// CHECK-NEXT:       ]
119a3efd892SJan Svoboda// CHECK-NEXT:     }
120a3efd892SJan Svoboda// CHECK-NEXT:   ]
121a3efd892SJan Svoboda// CHECK-NEXT: }
122a3efd892SJan Svoboda
123a3efd892SJan Svoboda// Check that building FW succeeds. If FW_Private was to be treated textually,
124a3efd892SJan Svoboda// building FW would fail due to Dependency not being present on the command line.
125a3efd892SJan Svoboda// RUN: %deps-to-rsp %t/deps.json --module-name=Dependency > %t/Dependency.cc1.rsp
126a3efd892SJan Svoboda// RUN: %deps-to-rsp %t/deps.json --module-name=FW_Private > %t/FW_Private.cc1.rsp
127a3efd892SJan Svoboda// RUN: %deps-to-rsp %t/deps.json --module-name=FW > %t/FW.cc1.rsp
128a3efd892SJan Svoboda// RUN: %deps-to-rsp %t/deps.json --tu-index=0 > %t/tu.rsp
129a3efd892SJan Svoboda
130a3efd892SJan Svoboda// RUN: %clang @%t/Dependency.cc1.rsp
131a3efd892SJan Svoboda// RUN: %clang @%t/FW_Private.cc1.rsp
132a3efd892SJan Svoboda// RUN: %clang @%t/FW.cc1.rsp
133a3efd892SJan Svoboda// RUN: %clang @%t/tu.rsp
134