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