332 lines · plain
1// UNSUPPORTED: target={{.*}}-aix{{.*}}2//3// RUN: rm -fr %t4// RUN: mkdir -p %t5// RUN: split-file %s %t6//7// RUN: sed "s|DIR|%/t|g" %t/P1689.json.in > %t/P1689.json8// RUN: clang-scan-deps -compilation-database %t/P1689.json -format=p1689 | FileCheck %t/Checks.cpp -DPREFIX=%/t9// RUN: clang-scan-deps --mode=preprocess-dependency-directives -compilation-database %t/P1689.json -format=p1689 \10// RUN: | sed 's:\\\\\?:/:g' \11// RUN: | FileCheck %t/Checks.cpp -DPREFIX=%/t12//13// Check the separated dependency format. This is required by CMake for the case14// that we have non-exist files in a fresh build and potentially out-of-date after that.15// So the build system need to wrtie a compilation database just for scanning purposes,16// which is not so good. So here is the per file mode for P1689.17// RUN: clang-scan-deps -format=p1689 \18// RUN: -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/M.cppm -o %t/M.o \19// RUN: | sed 's:\\\\\?:/:g' \20// RUN: | FileCheck %t/M.cppm -DPREFIX=%/t21// RUN: clang-scan-deps -format=p1689 \22// RUN: -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/Impl.cpp -o %t/Impl.o \23// RUN: | sed 's:\\\\\?:/:g' \24// RUN: | FileCheck %t/Impl.cpp -DPREFIX=%/t25// RUN: clang-scan-deps -format=p1689 \26// RUN: -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/impl_part.cppm -o %t/impl_part.o \27// RUN: | sed 's:\\\\\?:/:g' \28// RUN: | FileCheck %t/impl_part.cppm -DPREFIX=%/t29// RUN: clang-scan-deps -format=p1689 \30// RUN: -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/interface_part.cppm -o %t/interface_part.o \31// RUN: | sed 's:\\\\\?:/:g' \32// RUN: | FileCheck %t/interface_part.cppm -DPREFIX=%/t33// RUN: clang-scan-deps -format=p1689 \34// RUN: -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/User.cpp -o %t/User.o \35// RUN: | sed 's:\\\\\?:/:g' \36// RUN: | FileCheck %t/User.cpp -DPREFIX=%/t37//38// Check we can generate the make-style dependencies as expected.39// RUN: clang-scan-deps -format=p1689 \40// RUN: -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/impl_part.cppm -o %t/impl_part.o \41// RUN: -MT %t/impl_part.o.ddi -MD -MF %t/impl_part.dep42// RUN: cat %t/impl_part.dep \43// RUN: | sed 's:\\\\\?:/:g' \44// RUN: | FileCheck %t/impl_part.cppm -DPREFIX=%/t --check-prefix=CHECK-MAKE45//46// Check that we can generate multiple make-style dependency information with compilation database.47// RUN: cat %t/P1689.dep | FileCheck %t/Checks.cpp -DPREFIX=%/t --check-prefix=CHECK-MAKE48//49// Check that we can mix the use of -format=p1689 and -fmodules.50// RUN: clang-scan-deps -format=p1689 \51// RUN: -- %clang++ -std=c++20 -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache -c %t/impl_part.cppm -o %t/impl_part.o \52// RUN: | sed 's:\\\\\?:/:g' \53// RUN: | FileCheck %t/impl_part.cppm -DPREFIX=%/t54//55// Check the path in the make style dependencies are generated in relative path form56// RUN: cd %t57// RUN: clang-scan-deps -format=p1689 \58// RUN: -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t impl_part.cppm -o impl_part.o \59// RUN: -MT impl_part.o.ddi -MD -MF impl_part.dep60// RUN: cat impl_part.dep \61// RUN: | sed 's:\\\\\?:/:g' \62// RUN: | FileCheck impl_part.cppm -DPREFIX=%/t --check-prefix=CHECK-MAKE-RELATIVE63 64 65//--- P1689.json.in66[67{68 "directory": "DIR",69 "command": "clang++ -std=c++20 DIR/M.cppm -c -o DIR/M.o -MT DIR/M.o.ddi -MD -MF DIR/P1689.dep",70 "file": "DIR/M.cppm",71 "output": "DIR/M.o"72},73{74 "directory": "DIR",75 "command": "clang++ -std=c++20 DIR/Impl.cpp -c -o DIR/Impl.o -MT DIR/Impl.o.ddi -MD -MF DIR/P1689.dep",76 "file": "DIR/Impl.cpp",77 "output": "DIR/Impl.o"78},79{80 "directory": "DIR",81 "command": "clang++ -std=c++20 DIR/impl_part.cppm -c -o DIR/impl_part.o -MT DIR/impl_part.o.ddi -MD -MF DIR/P1689.dep",82 "file": "DIR/impl_part.cppm",83 "output": "DIR/impl_part.o"84},85{86 "directory": "DIR",87 "command": "clang++ -std=c++20 DIR/interface_part.cppm -c -o DIR/interface_part.o -MT DIR/interface_part.o.ddi -MD -MF DIR/P1689.dep",88 "file": "DIR/interface_part.cppm",89 "output": "DIR/interface_part.o"90},91{92 "directory": "DIR",93 "command": "clang++ -std=c++20 DIR/User.cpp -c -o DIR/User.o -MT DIR/User.o.ddi -MD -MF DIR/P1689.dep",94 "file": "DIR/User.cpp",95 "output": "DIR/User.o"96}97]98 99//--- M.cppm100export module M;101export import :interface_part;102import :impl_part;103export void Hello();104 105// CHECK: {106// CHECK-NEXT: "revision": 0,107// CHECK-NEXT: "rules": [108// CHECK-NEXT: {109// CHECK-NEXT: "primary-output": "[[PREFIX]]/M.o",110// CHECK-NEXT: "provides": [111// CHECK-NEXT: {112// CHECK-NEXT: "is-interface": true,113// CHECK-NEXT: "logical-name": "M",114// CHECK-NEXT: "source-path": "[[PREFIX]]/M.cppm"115// CHECK-NEXT: }116// CHECK-NEXT: ],117// CHECK-NEXT: "requires": [118// CHECK-NEXT: {119// CHECK-NEXT: "logical-name": "M:interface_part"120// CHECK-NEXT: },121// CHECK-NEXT: {122// CHECK-NEXT: "logical-name": "M:impl_part"123// CHECK-NEXT: }124// CHECK-NEXT: ]125// CHECK-NEXT: }126// CHECK-NEXT: ],127// CHECK-NEXT: "version": 1128// CHECK-NEXT: }129 130//--- Impl.cpp131module;132#include "header.mock"133module M;134void Hello() {135 std::cout << "Hello ";136}137 138// CHECK: {139// CHECK-NEXT: "revision": 0,140// CHECK-NEXT: "rules": [141// CHECK-NEXT: {142// CHECK-NEXT: "primary-output": "[[PREFIX]]/Impl.o",143// CHECK-NEXT: "requires": [144// CHECK-NEXT: {145// CHECK-NEXT: "logical-name": "M"146// CHECK-NEXT: }147// CHECK-NEXT: ]148// CHECK-NEXT: }149// CHECK-NEXT: ],150// CHECK-NEXT: "version": 1151// CHECK-NEXT: }152 153//--- impl_part.cppm154module;155#include "header.mock"156module M:impl_part;157import :interface_part;158 159std::string W = "World.";160void World() {161 std::cout << W << std::endl;162}163 164// CHECK: {165// CHECK-NEXT: "revision": 0,166// CHECK-NEXT: "rules": [167// CHECK-NEXT: {168// CHECK-NEXT: "primary-output": "[[PREFIX]]/impl_part.o",169// CHECK-NEXT: "provides": [170// CHECK-NEXT: {171// CHECK-NEXT: "is-interface": false,172// CHECK-NEXT: "logical-name": "M:impl_part",173// CHECK-NEXT: "source-path": "[[PREFIX]]/impl_part.cppm"174// CHECK-NEXT: }175// CHECK-NEXT: ],176// CHECK-NEXT: "requires": [177// CHECK-NEXT: {178// CHECK-NEXT: "logical-name": "M:interface_part"179// CHECK-NEXT: }180// CHECK-NEXT: ]181// CHECK-NEXT: }182// CHECK-NEXT: ],183// CHECK-NEXT: "version": 1184// CHECK-NEXT: }185 186// CHECK-MAKE: [[PREFIX]]/impl_part.o.ddi:187// CHECK-MAKE: [[PREFIX]]/impl_part.cppm188// CHECK-MAKE: [[PREFIX]]/header.mock189 190// CHECK-MAKE-RELATIVE: impl_part.o.ddi: impl_part.cppm header.mock191 192//--- interface_part.cppm193export module M:interface_part;194export void World();195 196// CHECK: {197// CHECK-NEXT: "revision": 0,198// CHECK-NEXT: "rules": [199// CHECK-NEXT: {200// CHECK-NEXT: "primary-output": "[[PREFIX]]/interface_part.o",201// CHECK-NEXT: "provides": [202// CHECK-NEXT: {203// CHECK-NEXT: "is-interface": true,204// CHECK-NEXT: "logical-name": "M:interface_part",205// CHECK-NEXT: "source-path": "[[PREFIX]]/interface_part.cppm"206// CHECK-NEXT: }207// CHECK-NEXT: ]208// CHECK-NEXT: }209// CHECK-NEXT: ],210// CHECK-NEXT: "version": 1211// CHECK-NEXT: }212 213//--- User.cpp214import M;215import third_party_module;216int main() {217 Hello();218 World();219 return 0;220}221 222// CHECK: {223// CHECK-NEXT: "revision": 0,224// CHECK-NEXT: "rules": [225// CHECK-NEXT: {226// CHECK-NEXT: "primary-output": "[[PREFIX]]/User.o",227// CHECK-NEXT: "requires": [228// CHECK-NEXT: {229// CHECK-NEXT: "logical-name": "M"230// CHECK-NEXT: },231// CHECK-NEXT: {232// CHECK-NEXT: "logical-name": "third_party_module"233// CHECK-NEXT: }234// CHECK-NEXT: ]235// CHECK-NEXT: }236// CHECK-NEXT: ],237// CHECK-NEXT: "version": 1238// CHECK-NEXT: }239 240//--- Checks.cpp241// CHECK: {242// CHECK-NEXT: "revision": 0,243// CHECK-NEXT: "rules": [244// CHECK-NEXT: {245// CHECK-NEXT: "primary-output": "[[PREFIX]]/Impl.o",246// CHECK-NEXT: "requires": [247// CHECK-NEXT: {248// CHECK-NEXT: "logical-name": "M",249// CHECK-NEXT: "source-path": "[[PREFIX]]/M.cppm"250// CHECK-NEXT: }251// CHECK-NEXT: ]252// CHECK-NEXT: },253// CHECK-NEXT: {254// CHECK-NEXT: "primary-output": "[[PREFIX]]/M.o",255// CHECK-NEXT: "provides": [256// CHECK-NEXT: {257// CHECK-NEXT: "is-interface": true,258// CHECK-NEXT: "logical-name": "M",259// CHECK-NEXT: "source-path": "[[PREFIX]]/M.cppm"260// CHECK-NEXT: }261// CHECK-NEXT: ],262// CHECK-NEXT: "requires": [263// CHECK-NEXT: {264// CHECK-NEXT: "logical-name": "M:interface_part",265// CHECK-NEXT: "source-path": "[[PREFIX]]/interface_part.cppm"266// CHECK-NEXT: },267// CHECK-NEXT: {268// CHECK-NEXT: "logical-name": "M:impl_part",269// CHECK-NEXT: "source-path": "[[PREFIX]]/impl_part.cppm"270// CHECK-NEXT: }271// CHECK-NEXT: ]272// CHECK-NEXT: },273// CHECK-NEXT: {274// CHECK-NEXT: "primary-output": "[[PREFIX]]/User.o",275// CHECK-NEXT: "requires": [276// CHECK-NEXT: {277// CHECK-NEXT: "logical-name": "M",278// CHECK-NEXT: "source-path": "[[PREFIX]]/M.cppm"279// CHECK-NEXT: },280// CHECK-NEXT: {281// CHECK-NEXT: "logical-name": "third_party_module"282// CHECK-NEXT: }283// CHECK-NEXT: ]284// CHECK-NEXT: },285// CHECK-NEXT: {286// CHECK-NEXT: "primary-output": "[[PREFIX]]/impl_part.o",287// CHECK-NEXT: "provides": [288// CHECK-NEXT: {289// CHECK-NEXT: "is-interface": false,290// CHECK-NEXT: "logical-name": "M:impl_part",291// CHECK-NEXT: "source-path": "[[PREFIX]]/impl_part.cppm"292// CHECK-NEXT: }293// CHECK-NEXT: ],294// CHECK-NEXT: "requires": [295// CHECK-NEXT: {296// CHECK-NEXT: "logical-name": "M:interface_part",297// CHECK-NEXT: "source-path": "[[PREFIX]]/interface_part.cppm"298// CHECK-NEXT: }299// CHECK-NEXT: ]300// CHECK-NEXT: },301// CHECK-NEXT: {302// CHECK-NEXT: "primary-output": "[[PREFIX]]/interface_part.o",303// CHECK-NEXT: "provides": [304// CHECK-NEXT: {305// CHECK-NEXT: "is-interface": true,306// CHECK-NEXT: "logical-name": "M:interface_part",307// CHECK-NEXT: "source-path": "[[PREFIX]]/interface_part.cppm"308// CHECK-NEXT: }309// CHECK-NEXT: ]310// CHECK-NEXT: }311// CHECK-NEXT: ],312// CHECK-NEXT: "version": 1313// CHECK-NEXT: }314 315// CHECK-MAKE-DAG: [[PREFIX]]/impl_part.o.ddi: \316// CHECK-MAKE-DAG-NEXT: [[PREFIX]]/impl_part.cppm \317// CHECK-MAKE-DAG-NEXT: [[PREFIX]]/header.mock318// CHECK-MAKE-DAG: [[PREFIX]]/interface_part.o.ddi: \319// CHECK-MAKE-DAG-NEXT: [[PREFIX]]/interface_part.cppm320// CHECK-MAKE-DAG: [[PREFIX]]/M.o.ddi: \321// CHECK-MAKE-DAG-NEXT: [[PREFIX]]/M.cppm322// CHECK-MAKE-DAG: [[PREFIX]]/User.o.ddi: \323// CHECK-MAKE-DAG-NEXT: [[PREFIX]]/User.cpp324// CHECK-MAKE-DAG: [[PREFIX]]/Impl.o.ddi: \325// CHECK-MAKE-DAG-NEXT: [[PREFIX]]/Impl.cpp \326// CHECK-MAKE-DAG-NEXT: [[PREFIX]]/header.mock327 328//--- module.modulemap329module Mock { header "header.mock" }330 331//--- header.mock332