cb424d7448
verify-patch-sanity.py validates every active recipe .patch has internally- consistent hunk line counts — catching the 'malformed patch at line N' failure at commit/CI/preflight time instead of hours into a cook. This cycle hit that class three times (qtwaylandscanner, sddm, xwayland), each only discovered when cookbook tried to apply the patch. Running it across the repo found 29 latent malformed patches (validated against GNU patch: e.g. relibc/P3-sysv-ipc reproduces 'malformed patch at line 22'). They were harmless only because they sit in vendored recipes (baked, not re- applied) — but would fail on any version-bump re-derivation. --fix recounts the hunk headers (body untouched) and repaired all 29. Wired into build-preflight.sh (Phase 1.0D) and redbear-ci.yml, with a unit test (test-patch-sanity.sh). Skips archived/legacy trees and unvalidatable formats (empty placeholders, bare-@@ git hunks).
352 lines
12 KiB
C++
352 lines
12 KiB
C++
// This checks that clang-scan-deps properly outputs named module dependencies
|
|
// when using the the scanning output format 'experimental-full'.
|
|
//
|
|
// See PR #72304.
|
|
// UNSUPPORTED: target={{.*}}-aix{{.*}}
|
|
//
|
|
// RUN: rm -fr %t
|
|
// RUN: mkdir -p %t
|
|
// RUN: split-file %s %t
|
|
//
|
|
// Check the separated dependency format.
|
|
// RUN: sed "s|DIR|%/t|g" %t/compile_commands.json.in > %t/compile_commands.json
|
|
// RUN: clang-scan-deps -format=experimental-full \
|
|
// RUN: -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/M.cppm -o %t/M.o \
|
|
// RUN: | sed 's:\\\\\?:/:g' \
|
|
// RUN: | FileCheck %t/M.cppm -DPREFIX=%/t
|
|
// RUN: clang-scan-deps -format=experimental-full \
|
|
// RUN: -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/Impl.cpp -o %t/Impl.o \
|
|
// RUN: | sed 's:\\\\\?:/:g' \
|
|
// RUN: | FileCheck %t/Impl.cpp -DPREFIX=%/t
|
|
// RUN: clang-scan-deps -format=experimental-full \
|
|
// RUN: -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/impl_part.cppm -o %t/impl_part.o \
|
|
// RUN: | sed 's:\\\\\?:/:g' \
|
|
// RUN: | FileCheck %t/impl_part.cppm -DPREFIX=%/t
|
|
// RUN: clang-scan-deps -format=experimental-full \
|
|
// RUN: -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/interface_part.cppm -o %t/interface_part.o \
|
|
// RUN: | sed 's:\\\\\?:/:g' \
|
|
// RUN: | FileCheck %t/interface_part.cppm -DPREFIX=%/t
|
|
// RUN: clang-scan-deps -format=experimental-full \
|
|
// RUN: -- %clang++ -std=c++20 -c -fprebuilt-module-path=%t %t/User.cpp -o %t/User.o \
|
|
// RUN: | sed 's:\\\\\?:/:g' \
|
|
// RUN: | FileCheck %t/User.cpp -DPREFIX=%/t
|
|
//
|
|
// Check the combined dependency format.
|
|
// RUN: clang-scan-deps -compilation-database %t/compile_commands.json -format=experimental-full \
|
|
// RUN: | sed 's:\\\\\?:/:g' \
|
|
// RUN: | FileCheck %t/Checks.cpp -DPREFIX=%/t
|
|
// RUN: clang-scan-deps --mode=preprocess-dependency-directives -compilation-database %t/compile_commands.json -format=experimental-full \
|
|
// RUN: | sed 's:\\\\\?:/:g' \
|
|
// RUN: | FileCheck %t/Checks.cpp -DPREFIX=%/t
|
|
|
|
//--- compile_commands.json.in
|
|
[
|
|
{
|
|
"directory": "DIR",
|
|
"command": "clang++ -std=c++20 DIR/M.cppm -c -o DIR/M.o -MT DIR/M.o.ddi -MD -MF DIR/P1689.dep",
|
|
"file": "DIR/M.cppm",
|
|
"output": "DIR/M.o"
|
|
},
|
|
{
|
|
"directory": "DIR",
|
|
"command": "clang++ -std=c++20 DIR/Impl.cpp -c -o DIR/Impl.o -MT DIR/Impl.o.ddi -MD -MF DIR/P1689.dep",
|
|
"file": "DIR/Impl.cpp",
|
|
"output": "DIR/Impl.o"
|
|
},
|
|
{
|
|
"directory": "DIR",
|
|
"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",
|
|
"file": "DIR/impl_part.cppm",
|
|
"output": "DIR/impl_part.o"
|
|
},
|
|
{
|
|
"directory": "DIR",
|
|
"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",
|
|
"file": "DIR/interface_part.cppm",
|
|
"output": "DIR/interface_part.o"
|
|
},
|
|
{
|
|
"directory": "DIR",
|
|
"command": "clang++ -std=c++20 DIR/User.cpp -c -o DIR/User.o -MT DIR/User.o.ddi -MD -MF DIR/P1689.dep",
|
|
"file": "DIR/User.cpp",
|
|
"output": "DIR/User.o"
|
|
}
|
|
]
|
|
|
|
//--- M.cppm
|
|
export module M;
|
|
export import :interface_part;
|
|
import :impl_part;
|
|
export void Hello();
|
|
|
|
// CHECK: {
|
|
// CHECK: "modules": []
|
|
// CHECK: "translation-units": [
|
|
// CHECK-NEXT: {
|
|
// CHECK: "commands": [
|
|
// CHECK-NEXT: {
|
|
// CHECK: "named-module": "M"
|
|
// CHECK-NEXT: "named-module-deps": [
|
|
// CHECK-NEXT: "M:interface_part",
|
|
// CHECK-NEXT: "M:impl_part"
|
|
// CHECK-NEXT: ]
|
|
// CHECK: "command-line": [
|
|
// CHECK: "-o",
|
|
// CHECK-NEXT: "{{.*}}/M-{{.*}}.pcm"
|
|
// CHECK: ]
|
|
// CHECK: "input-file": "[[PREFIX]]/M.cppm"
|
|
// CHECK: },
|
|
// CHECK-NEXT: {
|
|
// CHECK: "command-line": [
|
|
// CHECK: "-o",
|
|
// CHECK-NEXT: "[[PREFIX]]/M.o"
|
|
// CHECK: ]
|
|
// CHECK: "input-file": "[[PREFIX]]/M.cppm"
|
|
// CHECK: }
|
|
// CHECK: ]
|
|
// CHECK: }
|
|
// CHECK: ]
|
|
// CHECK: }
|
|
|
|
//--- Impl.cpp
|
|
module;
|
|
#include "header.mock"
|
|
module M;
|
|
void Hello() {
|
|
std::cout << "Hello ";
|
|
}
|
|
|
|
// CHECK: {
|
|
// CHECK: "modules": []
|
|
// CHECK: "translation-units": [
|
|
// CHECK-NEXT: {
|
|
// CHECK: "commands": [
|
|
// CHECK-NEXT: {
|
|
// CHECK-NOT: "named-module":
|
|
// CHECK: "named-module-deps": [
|
|
// CHECK-NEXT: "M"
|
|
// CHECK-NEXT: ]
|
|
// CHECK: "command-line": [
|
|
// CHECK: "-o",
|
|
// CHECK-NEXT: "[[PREFIX]]/Impl.o"
|
|
// CHECK: ]
|
|
// CHECK: "input-file": "[[PREFIX]]/Impl.cpp"
|
|
// CHECK: }
|
|
// CHECK: ]
|
|
// CHECK: }
|
|
// CHECK: ]
|
|
// CHECK: }
|
|
|
|
//--- impl_part.cppm
|
|
module;
|
|
#include "header.mock"
|
|
module M:impl_part;
|
|
import :interface_part;
|
|
|
|
std::string W = "World.";
|
|
void World() {
|
|
std::cout << W << std::endl;
|
|
}
|
|
|
|
// CHECK: {
|
|
// CHECK: "modules": [],
|
|
// CHECK: "translation-units": [
|
|
// CHECK-NEXT: {
|
|
// CHECK: "commands": [
|
|
// CHECK-NEXT: {
|
|
// CHECK: "named-module": "M:impl_part"
|
|
// CHECK-NEXT: "named-module-deps": [
|
|
// CHECK-NEXT: "M:interface_part"
|
|
// CHECK-NEXT: ]
|
|
// CHECK: "command-line": [
|
|
// CHECK: "-o",
|
|
// CHECK-NEXT: "{{.*}}/impl_part-{{.*}}.pcm",
|
|
// CHECK: ]
|
|
// CHECK: "input-file": "[[PREFIX]]/impl_part.cppm"
|
|
// CHECK: },
|
|
// CHECK-NEXT: {
|
|
// CHECK: "named-module": "M:impl_part"
|
|
// CHECK-NEXT: "named-module-deps": [
|
|
// CHECK-NEXT: "M:interface_part"
|
|
// CHECK-NEXT: ]
|
|
// CHECK: "command-line": [
|
|
// CHECK: "-o",
|
|
// CHECK-NEXT: "[[PREFIX]]/impl_part.o",
|
|
// CHECK: ]
|
|
// CHECK: "input-file": "[[PREFIX]]/impl_part.cppm"
|
|
// CHECK: }
|
|
// CHECK: ]
|
|
// CHECK: }
|
|
// CHECK: ]
|
|
// CHECK: }
|
|
|
|
//--- interface_part.cppm
|
|
export module M:interface_part;
|
|
export void World();
|
|
|
|
// CHECK: {
|
|
// CHECK: "modules": []
|
|
// CHECK: "translation-units": [
|
|
// CHECK-NEXT: {
|
|
// CHECK: "commands": [
|
|
// CHECK-NEXT: {
|
|
// CHECK: "named-module": "M:interface_part"
|
|
// CHECK-NOT: "named-module-deps": []
|
|
// CHECK: "command-line": [
|
|
// CHECK: "-o",
|
|
// CHECK-NEXT: "{{.*}}/interface_part-{{.*}}.pcm",
|
|
// CHECK: ]
|
|
// CHECK: "input-file": "[[PREFIX]]/interface_part.cppm"
|
|
// CHECK: },
|
|
// CHECK-NEXT: {
|
|
// CHECK: "named-module": "M:interface_part"
|
|
// CHECK-NOT: "named-module-deps": []
|
|
// CHECK: "command-line": [
|
|
// CHECK: "-o",
|
|
// CHECK-NEXT: "[[PREFIX]]/interface_part.o",
|
|
// CHECK: ]
|
|
// CHECK: "input-file": "[[PREFIX]]/interface_part.cppm"
|
|
// CHECK: }
|
|
// CHECK: ]
|
|
// CHECK: }
|
|
// CHECK: ]
|
|
// CHECK: }
|
|
|
|
//--- User.cpp
|
|
import M;
|
|
import third_party_module;
|
|
int main() {
|
|
Hello();
|
|
World();
|
|
return 0;
|
|
}
|
|
|
|
// CHECK: {
|
|
// CHECK-NEXT: "modules": []
|
|
// CHECK-NEXT: "translation-units": [
|
|
// CHECK-NEXT: {
|
|
// CHECK-NEXT: "commands": [
|
|
// CHECK-NEXT: {
|
|
// CHECK-NOT: "named-module":
|
|
// CHECK: "named-module-deps": [
|
|
// CHECK-NEXT: "M"
|
|
// CHECK-NEXT: "third_party_module"
|
|
// CHECK-NEXT: ]
|
|
// CHECK: "command-line": [
|
|
// CHECK: "-o",
|
|
// CHECK-NEXT: "[[PREFIX]]/User.o",
|
|
// CHECK: ]
|
|
// CHECK: "input-file": "[[PREFIX]]/User.cpp
|
|
// CHECK: }
|
|
// CHECK: ]
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: ]
|
|
// CHECK: }
|
|
|
|
//--- header.mock
|
|
|
|
//--- Checks.cpp
|
|
// CHECK: {
|
|
// CHECK: "modules": []
|
|
// CHECK: "translation-units": [
|
|
// CHECK-NEXT: {
|
|
// CHECK: "commands": [
|
|
// CHECK-NEXT: {
|
|
// CHECK: "named-module": "M"
|
|
// CHECK-NEXT: "named-module-deps": [
|
|
// CHECK-NEXT: "M:interface_part",
|
|
// CHECK-NEXT: "M:impl_part"
|
|
// CHECK-NEXT: ]
|
|
// CHECK: "command-line": [
|
|
// CHECK: "-o",
|
|
// CHECK-NEXT: "{{.*}}/M-{{.*}}.pcm"
|
|
// CHECK: ]
|
|
// CHECK: "input-file": "[[PREFIX]]/M.cppm"
|
|
// CHECK: },
|
|
// CHECK-NEXT: {
|
|
// CHECK: "command-line": [
|
|
// CHECK: "-o",
|
|
// CHECK-NEXT: "[[PREFIX]]/M.o"
|
|
// CHECK: ]
|
|
// CHECK: "input-file": "[[PREFIX]]/M.cppm"
|
|
// CHECK: },
|
|
// CHECK: {
|
|
// CHECK-NOT: "named-module":
|
|
// CHECK: "named-module-deps": [
|
|
// CHECK-NEXT: "M"
|
|
// CHECK-NEXT: ]
|
|
// CHECK: "command-line": [
|
|
// CHECK: "-o",
|
|
// CHECK-NEXT: "[[PREFIX]]/Impl.o"
|
|
// CHECK: ]
|
|
// CHECK: "input-file": "[[PREFIX]]/Impl.cpp"
|
|
// CHECK: }
|
|
// CHECK: ]
|
|
// CHECK-NEXT: },
|
|
// CHECK-NEXT: {
|
|
// CHECK: "commands": [
|
|
// CHECK-NEXT: {
|
|
// CHECK: "named-module": "M:impl_part"
|
|
// CHECK-NEXT: "named-module-deps": [
|
|
// CHECK-NEXT: "M:interface_part"
|
|
// CHECK-NEXT: ]
|
|
// CHECK: "command-line": [
|
|
// CHECK: "-o",
|
|
// CHECK-NEXT: "{{.*}}/impl_part-{{.*}}.pcm",
|
|
// CHECK: ]
|
|
// CHECK: "input-file": "[[PREFIX]]/impl_part.cppm"
|
|
// CHECK: },
|
|
// CHECK-NEXT: {
|
|
// CHECK: "named-module": "M:impl_part"
|
|
// CHECK-NEXT: "named-module-deps": [
|
|
// CHECK-NEXT: "M:interface_part"
|
|
// CHECK-NEXT: ]
|
|
// CHECK: "command-line": [
|
|
// CHECK: "-o",
|
|
// CHECK-NEXT: "[[PREFIX]]/impl_part.o",
|
|
// CHECK: ]
|
|
// CHECK: "input-file": "[[PREFIX]]/impl_part.cppm"
|
|
// CHECK: }
|
|
// CHECK: ]
|
|
// CHECK-NEXT: },
|
|
// CHECK-NEXT: {
|
|
// CHECK: "commands": [
|
|
// CHECK-NEXT: {
|
|
// CHECK: "named-module": "M:interface_part"
|
|
// CHECK-NOT: "named-module-deps": []
|
|
// CHECK: "command-line": [
|
|
// CHECK: "-o",
|
|
// CHECK-NEXT: "{{.*}}/interface_part-{{.*}}.pcm",
|
|
// CHECK: ]
|
|
// CHECK: "input-file": "[[PREFIX]]/interface_part.cppm"
|
|
// CHECK: },
|
|
// CHECK-NEXT: {
|
|
// CHECK: "named-module": "M:interface_part"
|
|
// CHECK-NOT: "named-module-deps": []
|
|
// CHECK: "command-line": [
|
|
// CHECK: "-o",
|
|
// CHECK-NEXT: "[[PREFIX]]/interface_part.o",
|
|
// CHECK: ]
|
|
// CHECK: "input-file": "[[PREFIX]]/interface_part.cppm"
|
|
// CHECK: }
|
|
// CHECK: ]
|
|
// CHECK-NEXT: },
|
|
// CHECK-NEXT: {
|
|
// CHECK: "commands": [
|
|
// CHECK-NEXT: {
|
|
// CHECK-NOT: "named-module":
|
|
// CHECK: "named-module-deps": [
|
|
// CHECK-NEXT: "M"
|
|
// CHECK-NEXT: "third_party_module"
|
|
// CHECK-NEXT: ]
|
|
// CHECK: "command-line": [
|
|
// CHECK: "-o",
|
|
// CHECK-NEXT: "[[PREFIX]]/User.o",
|
|
// CHECK: ]
|
|
// CHECK: "input-file": "[[PREFIX]]/User.cpp
|
|
// CHECK: }
|
|
// CHECK: ]
|
|
// CHECK: }
|
|
// CHECK: ]
|
|
// CHECK: }
|