Index: clang/test/ClangScanDeps/diagnostics.c =================================================================== --- clang/test/ClangScanDeps/diagnostics.c +++ clang/test/ClangScanDeps/diagnostics.c @@ -3,7 +3,7 @@ // RUN: sed "s|DIR|%/t|g" %S/Inputs/diagnostics/cdb.json.template > %t/cdb.json // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full 2>&1 > %t/result.json -// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t +// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} // Check that the '-Wno-error=invalid-ios-deployment-target' option is being // respected and invalid arguments like '-target i386-apple-ios14.0-simulator' @@ -14,7 +14,7 @@ // CHECK-NEXT: "modules": [ // CHECK-NEXT: { // CHECK-NEXT: "clang-module-deps": [], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK-NEXT: "-cc1" // CHECK: ], Index: clang/test/ClangScanDeps/header-search-pruning-transitive.c =================================================================== --- clang/test/ClangScanDeps/header-search-pruning-transitive.c +++ clang/test/ClangScanDeps/header-search-pruning-transitive.c @@ -56,7 +56,7 @@ // RUN: clang-scan-deps -compilation-database %t/cdb_with_a.json -format experimental-full -optimize-args > %t/results.json // RUN: clang-scan-deps -compilation-database %t/cdb_without_a.json -format experimental-full -optimize-args >> %t/results.json -// RUN: cat %t/results.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t +// RUN: cat %t/results.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} // CHECK: { // CHECK-NEXT: "modules": [ @@ -67,7 +67,7 @@ // CHECK-NEXT: "module-name": "Y" // CHECK-NEXT: } // CHECK-NEXT: ], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK: ], // CHECK-NEXT: "context-hash": "[[HASH_X:.*]]", @@ -79,7 +79,7 @@ // CHECK-NEXT: }, // CHECK-NEXT: { // CHECK-NEXT: "clang-module-deps": [], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK: ], // CHECK-NEXT: "context-hash": "[[HASH_Y_WITH_A]]", @@ -119,7 +119,7 @@ // CHECK-NEXT: "module-name": "Y" // CHECK-NEXT: } // CHECK-NEXT: ], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK: ], // Here is the actual check that this module X (which imports different version of Y) @@ -133,7 +133,7 @@ // CHECK-NEXT: }, // CHECK-NEXT: { // CHECK-NEXT: "clang-module-deps": [], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK: ], // CHECK-NEXT: "context-hash": "[[HASH_Y_WITHOUT_A]]", Index: clang/test/ClangScanDeps/modules-context-hash.c =================================================================== --- clang/test/ClangScanDeps/modules-context-hash.c +++ clang/test/ClangScanDeps/modules-context-hash.c @@ -17,14 +17,14 @@ // RUN: clang-scan-deps -compilation-database %t/cdb_a.json -format experimental-full -j 1 > %t/result_a.json // RUN: clang-scan-deps -compilation-database %t/cdb_b.json -format experimental-full -j 1 > %t/result_b.json // RUN: clang-scan-deps -compilation-database %t/cdb_b2.json -format experimental-full -j 1 > %t/result_b2.json -// RUN: cat %t/result_a.json %t/result_b.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK +// RUN: cat %t/result_a.json %t/result_b.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} -check-prefix=CHECK // RUN: cat %t/result_b.json %t/result_b2.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=FLAG_ONLY // CHECK: { // CHECK-NEXT: "modules": [ // CHECK-NEXT: { // CHECK-NEXT: "clang-module-deps": [], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK-NEXT: "-cc1" // CHECK: "-emit-module" @@ -61,7 +61,7 @@ // CHECK: "modules": [ // CHECK-NEXT: { // CHECK-NEXT: "clang-module-deps": [], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK-NEXT: "-cc1" // CHECK: "-emit-module" Index: clang/test/ClangScanDeps/modules-dep-args.c =================================================================== --- clang/test/ClangScanDeps/modules-dep-args.c +++ clang/test/ClangScanDeps/modules-dep-args.c @@ -24,19 +24,19 @@ // Check that the PCM path defaults to the modules cache from implicit build. // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full > %t/result_cache.json -// RUN: cat %t/result_cache.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t --check-prefixes=CHECK,CHECK_CACHE +// RUN: cat %t/result_cache.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} --check-prefixes=CHECK,CHECK_CACHE // Check that the PCM path can be customized. // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full -module-files-dir %t/build > %t/result_build.json -// RUN: cat %t/result_build.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t --check-prefixes=CHECK,CHECK_BUILD +// RUN: cat %t/result_build.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} --check-prefixes=CHECK,CHECK_BUILD // Check that the PCM file is loaded lazily by default. // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full > %t/result_lazy.json -// RUN: cat %t/result_lazy.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t --check-prefixes=CHECK,CHECK_LAZY +// RUN: cat %t/result_lazy.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} --check-prefixes=CHECK,CHECK_LAZY // Check that the PCM file can be loaded eagerly. // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full -eager-load-pcm > %t/result_eager.json -// RUN: cat %t/result_eager.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t --check-prefixes=CHECK,CHECK_EAGER +// RUN: cat %t/result_eager.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} --check-prefixes=CHECK,CHECK_EAGER // CHECK: { // CHECK-NEXT: "modules": [ @@ -47,7 +47,7 @@ // CHECK-NEXT: "module-name": "Transitive" // CHECK-NEXT: } // CHECK-NEXT: ], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK_CACHE: "-fmodule-file={{.*}}/cache/{{.*}}/Transitive-{{.*}}.pcm" // CHECK_BUILD: "-fmodule-file={{.*}}/build/{{.*}}/Transitive-{{.*}}.pcm" @@ -65,7 +65,7 @@ // CHECK-NEXT: }, // CHECK-NEXT: { // CHECK-NEXT: "clang-module-deps": [], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK: ], // CHECK-NEXT: "context-hash": "{{.*}}", @@ -88,7 +88,7 @@ // CHECK-NEXT: "command-line": [ // CHECK_CACHE: "-fmodule-file={{.*}}/cache/{{.*}}/Direct-{{.*}}.pcm" // CHECK_BUILD: "-fmodule-file={{.*}}/build/{{.*}}/Direct-{{.*}}.pcm" -// CHECK_LAZY: "-fmodule-map-file=[[PREFIX]]/module.modulemap" +// CHECK_LAZY: "-fmodule-map-file=[[SUBMODULE_PREFIX]]/module.modulemap" // CHECK_LAZY: "-fmodule-file=Direct=[[PREFIX]]/{{.*}}/Direct-{{.*}}.pcm" // CHECK_EAGER-NOT: "-fmodule-map-file={{.*}}" // CHECK_EAGER: "-fmodule-file=[[PREFIX]]/{{.*}}/Direct-{{.*}}.pcm" Index: clang/test/ClangScanDeps/modules-excluded-header.m =================================================================== --- clang/test/ClangScanDeps/modules-excluded-header.m +++ clang/test/ClangScanDeps/modules-excluded-header.m @@ -28,13 +28,13 @@ // RUN: sed -e "s|DIR|%/t|g" %t/cdb.json.template > %t/cdb.json // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full > %t/result.json -// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t +// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} // CHECK: { // CHECK-NEXT: "modules": [ // CHECK-NEXT: { // CHECK-NEXT: "clang-module-deps": [], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/mod/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/mod/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK: "-fmodule-map-file=[[PREFIX]]/frameworks/X.framework/Modules/module.modulemap" // CHECK-NOT: "-fmodule-file={{.*}}" Index: clang/test/ClangScanDeps/modules-extern-submodule.c =================================================================== --- clang/test/ClangScanDeps/modules-extern-submodule.c +++ clang/test/ClangScanDeps/modules-extern-submodule.c @@ -28,7 +28,7 @@ // RUN: sed "s|DIR|%/t|g" %t/cdb.json.template > %t/cdb.json // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full > %t/result.json -// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t +// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} // CHECK: { // CHECK-NEXT: "modules": [ @@ -39,7 +39,7 @@ // CHECK-NEXT: "module-name": "second" // CHECK-NEXT: } // CHECK-NEXT: ], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/first/first/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/first/first/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK-NEXT: "-cc1", // CHECK: "-fmodule-map-file=[[PREFIX]]/second/second/module.modulemap" @@ -63,7 +63,7 @@ // CHECK-NEXT: "module-name": "third" // CHECK-NEXT: } // CHECK-NEXT: ], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/second/second/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/second/second/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK-NEXT: "-cc1", // CHECK: "-fmodule-map-file=[[PREFIX]]/third/module.modulemap", @@ -80,7 +80,7 @@ // CHECK-NEXT: }, // CHECK-NEXT: { // CHECK-NEXT: "clang-module-deps": [], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/third/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/third/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK-NEXT: "-cc1", // CHECK-NOT: "-fmodule-map-file= @@ -106,7 +106,7 @@ // CHECK-NEXT: ], // CHECK-NEXT: "command-line": [ // CHECK-NEXT: "-cc1", -// CHECK: "-fmodule-map-file=[[PREFIX]]/first/first/module.modulemap", +// CHECK: "-fmodule-map-file=[[SUBMODULE_PREFIX]]/first/first/module.modulemap", // CHECK: "-fmodule-file=first=[[PREFIX]]/cache/{{.*}}/first-{{.*}}.pcm", // CHECK: ], // CHECK-NEXT: "executable": "clang", Index: clang/test/ClangScanDeps/modules-extern-unrelated.m =================================================================== --- clang/test/ClangScanDeps/modules-extern-unrelated.m +++ clang/test/ClangScanDeps/modules-extern-unrelated.m @@ -31,13 +31,13 @@ // RUN: sed -e "s|DIR|%/t|g" -e "s|INPUTS|%/S/Inputs|g" %t/cdb.json.template > %t/cdb.json // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full > %t/result.json -// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t +// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} // CHECK: { // CHECK-NEXT: "modules": [ // CHECK-NEXT: { // CHECK-NEXT: "clang-module-deps": [], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/first/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/first/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK: ], // CHECK-NEXT: "context-hash": "{{.*}}", @@ -48,7 +48,7 @@ // CHECK-NEXT: }, // CHECK-NEXT: { // CHECK-NEXT: "clang-module-deps": [], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/first/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/first/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK: ], // CHECK-NEXT: "context-hash": "{{.*}}", @@ -65,7 +65,7 @@ // CHECK-NEXT: "module-name": "first_other" // CHECK-NEXT: } // CHECK-NEXT: ], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/second/second.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/second/second.modulemap", // CHECK-NEXT: "command-line": [ // CHECK: ], // CHECK-NEXT: "context-hash": "{{.*}}", @@ -87,7 +87,7 @@ // CHECK-NEXT: "module-name": "second" // CHECK-NEXT: } // CHECK-NEXT: ], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/zeroth/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/zeroth/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK: ], // CHECK-NEXT: "context-hash": "{{.*}}", Index: clang/test/ClangScanDeps/modules-fmodule-name-no-module-built.m =================================================================== --- clang/test/ClangScanDeps/modules-fmodule-name-no-module-built.m +++ clang/test/ClangScanDeps/modules-fmodule-name-no-module-built.m @@ -11,7 +11,7 @@ // RUN: clang-scan-deps -compilation-database %t.cdb -j 1 -format experimental-full \ // RUN: -mode preprocess-dependency-directives > %t.result -// RUN: cat %t.result | sed 's:\\\\\?:/:g' | FileCheck -DPREFIX=%/t.dir --check-prefixes=CHECK %s +// RUN: cat %t.result | sed 's:\\\\\?:/:g' | FileCheck -DPREFIX=%/t.dir -DSUBMODULE_PREFIX=%{/t:real}.dir --check-prefixes=CHECK %s #import "header3.h" #import "header.h" @@ -20,7 +20,7 @@ // CHECK-NEXT: "modules": [ // CHECK-NEXT: { // CHECK-NEXT: "clang-module-deps": [] -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/Inputs/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/Inputs/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK: ], // CHECK-NEXT: "context-hash": "[[HASH_H2:[A-Z0-9]+]]", Index: clang/test/ClangScanDeps/modules-full.cpp =================================================================== --- clang/test/ClangScanDeps/modules-full.cpp +++ clang/test/ClangScanDeps/modules-full.cpp @@ -12,11 +12,11 @@ // // RUN: clang-scan-deps -compilation-database %t.cdb -j 4 -format experimental-full \ // RUN: -mode preprocess-dependency-directives > %t.result -// RUN: cat %t.result | sed 's:\\\\\?:/:g' | FileCheck -DPREFIX=%/t.dir %s +// RUN: cat %t.result | sed 's:\\\\\?:/:g' | FileCheck -DPREFIX=%/t.dir -DSUBMODULE_PREFIX=%{/t:real}.dir %s // // RUN: clang-scan-deps -compilation-database %t_clangcl.cdb -j 4 -format experimental-full \ // RUN: -mode preprocess-dependency-directives > %t_clangcl.result -// RUN: cat %t_clangcl.result | sed 's:\\\\\?:/:g' | FileCheck -DPREFIX=%/t.dir %s +// RUN: cat %t_clangcl.result | sed 's:\\\\\?:/:g' | FileCheck -DPREFIX=%/t.dir -DSUBMODULE_PREFIX=%{/t:real}.dir %s #include "header.h" @@ -29,7 +29,7 @@ // CHECK-NEXT: "module-name": "header2" // CHECK-NEXT: } // CHECK-NEXT: ], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/Inputs/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/Inputs/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK-NEXT: "-cc1" // CHECK: "-emit-module" @@ -47,7 +47,7 @@ // CHECK-NEXT: }, // CHECK-NEXT: { // CHECK-NEXT: "clang-module-deps": [], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/Inputs/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/Inputs/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK-NEXT: "-cc1", // CHECK: "-emit-module", @@ -64,7 +64,7 @@ // CHECK-NEXT: }, // CHECK-NEXT: { // CHECK-NEXT: "clang-module-deps": [], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/Inputs/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/Inputs/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK-NEXT: "-cc1", // CHECK: "-emit-module", Index: clang/test/ClangScanDeps/modules-implementation-private.m =================================================================== --- clang/test/ClangScanDeps/modules-implementation-private.m +++ clang/test/ClangScanDeps/modules-implementation-private.m @@ -26,13 +26,13 @@ // RUN: sed "s|DIR|%/t|g" %t/cdb.json.template > %t/cdb.json // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full > %t/result.json -// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t +// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} // CHECK: { // CHECK-NEXT: "modules": [ // CHECK-NEXT: { // CHECK-NEXT: "clang-module-deps": [], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/frameworks/FW.framework/Modules/module.private.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/frameworks/FW.framework/Modules/module.private.modulemap", // CHECK-NEXT: "command-line": [ // CHECK: ], // CHECK-NEXT: "context-hash": "{{.*}}", Index: clang/test/ClangScanDeps/modules-implementation-vfs.m =================================================================== --- clang/test/ClangScanDeps/modules-implementation-vfs.m +++ clang/test/ClangScanDeps/modules-implementation-vfs.m @@ -74,7 +74,7 @@ // RUN: sed -e "s|DIR|%/t|g" %t/overlay.json.template > %t/overlay.json // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full -j 1 > %t/result.json -// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t +// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} // CHECK: { // CHECK: "modules": [ // CHECK: { @@ -96,7 +96,7 @@ // CHECK: "-fmodule-map-file=[[PREFIX]]/frameworks/A.framework/Modules/module.modulemap", // CHECK: "-x" // CHECK-NEXT: "objective-c" -// CHECK-NEXT: "[[PREFIX]]/frameworks/B.framework/Modules/module.modulemap" +// CHECK-NEXT: "[[SUBMODULE_PREFIX]]/frameworks/B.framework/Modules/module.modulemap" // CHECK: ] // CHECK: "name": "B" // CHECK: } @@ -134,7 +134,7 @@ // CHECK: ] // CHECK: "command-line": [ // CHECK: "-fmodule-map-file=[[PREFIX]]/frameworks/A.framework/Modules/module.modulemap" -// CHECK: "-fmodule-map-file=[[PREFIX]]/frameworks/B.framework/Modules/module.modulemap" +// CHECK: "-fmodule-map-file=[[SUBMODULE_PREFIX]]/frameworks/B.framework/Modules/module.modulemap" // CHECK: "-fmodule-name=A" // CHECK: ], // CHECK: "input-file": "[[PREFIX]]/tu3.m" Index: clang/test/ClangScanDeps/modules-implicit-dot-private.m =================================================================== --- clang/test/ClangScanDeps/modules-implicit-dot-private.m +++ clang/test/ClangScanDeps/modules-implicit-dot-private.m @@ -22,12 +22,12 @@ // RUN: sed -e "s|DIR|%/t|g" %t/cdb.json.template > %t/cdb.json // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full > %t/result.json -// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t +// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} // CHECK: { // CHECK-NEXT: "modules": [ // CHECK-NEXT: { // CHECK: "clang-module-deps": [], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/frameworks/FW.framework/Modules/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/frameworks/FW.framework/Modules/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK: ], // CHECK-NEXT: "context-hash": "{{.*}}", @@ -39,7 +39,7 @@ // CHECK: }, // CHECK: { // CHECK: "clang-module-deps": [], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/frameworks/FW.framework/Modules/module.private.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/frameworks/FW.framework/Modules/module.private.modulemap", // CHECK-NEXT: "command-line": [ // CHECK: ], // CHECK-NEXT: "context-hash": "{{.*}}", Index: clang/test/ClangScanDeps/modules-incomplete-umbrella.c =================================================================== --- clang/test/ClangScanDeps/modules-incomplete-umbrella.c +++ clang/test/ClangScanDeps/modules-incomplete-umbrella.c @@ -34,12 +34,12 @@ // RUN: sed -e "s|DIR|%/t|g" %t/from_tu.cdb.json.template > %t/from_tu.cdb.json // RUN: clang-scan-deps -compilation-database %t/from_tu.cdb.json -format experimental-full > %t/from_tu_result.json -// RUN: cat %t/from_tu_result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t --check-prefixes=CHECK_TU +// RUN: cat %t/from_tu_result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} --check-prefixes=CHECK_TU // CHECK_TU: { // CHECK_TU-NEXT: "modules": [ // CHECK_TU-NEXT: { // CHECK_TU-NEXT: "clang-module-deps": [], -// CHECK_TU-NEXT: "clang-modulemap-file": "[[PREFIX]]/frameworks/FW.framework/Modules/module.modulemap", +// CHECK_TU-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/frameworks/FW.framework/Modules/module.modulemap", // CHECK_TU-NEXT: "command-line": [ // CHECK_TU: ], // CHECK_TU-NEXT: "context-hash": "{{.*}}", @@ -51,7 +51,7 @@ // CHECK_TU-NEXT: }, // CHECK_TU-NEXT: { // CHECK_TU-NEXT: "clang-module-deps": [], -// CHECK_TU-NEXT: "clang-modulemap-file": "[[PREFIX]]/frameworks/FW.framework/Modules/module.private.modulemap", +// CHECK_TU-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/frameworks/FW.framework/Modules/module.private.modulemap", // CHECK_TU-NEXT: "command-line": [ // CHECK_TU: ], // CHECK_TU-NEXT: "context-hash": "{{.*}}", @@ -112,12 +112,12 @@ // RUN: sed -e "s|DIR|%/t|g" %t/from_module.cdb.json.template > %t/from_module.cdb.json // RUN: clang-scan-deps -compilation-database %t/from_module.cdb.json -format experimental-full > %t/from_module_result.json -// RUN: cat %t/from_module_result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t --check-prefixes=CHECK_MODULE +// RUN: cat %t/from_module_result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} --check-prefixes=CHECK_MODULE // CHECK_MODULE: { // CHECK_MODULE-NEXT: "modules": [ // CHECK_MODULE-NEXT: { // CHECK_MODULE-NEXT: "clang-module-deps": [], -// CHECK_MODULE-NEXT: "clang-modulemap-file": "[[PREFIX]]/frameworks/FW.framework/Modules/module.modulemap", +// CHECK_MODULE-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/frameworks/FW.framework/Modules/module.modulemap", // CHECK_MODULE-NEXT: "command-line": [ // CHECK_MODULE: ], // CHECK_MODULE-NEXT: "context-hash": "{{.*}}", @@ -129,7 +129,7 @@ // CHECK_MODULE-NEXT: }, // CHECK_MODULE-NEXT: { // CHECK_MODULE-NEXT: "clang-module-deps": [], -// CHECK_MODULE-NEXT: "clang-modulemap-file": "[[PREFIX]]/frameworks/FW.framework/Modules/module.private.modulemap", +// CHECK_MODULE-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/frameworks/FW.framework/Modules/module.private.modulemap", // CHECK_MODULE-NEXT: "command-line": [ // CHECK_MODULE: ], // CHECK_MODULE-NEXT: "context-hash": "{{.*}}", @@ -151,7 +151,7 @@ // CHECK_MODULE-NEXT: "module-name": "FW_Private" // CHECK_MODULE-NEXT: } // CHECK_MODULE-NEXT: ], -// CHECK_MODULE-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK_MODULE-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK_MODULE-NEXT: "command-line": [ // CHECK_MODULE: "-fmodule-file={{.*}}/FW-{{.*}}.pcm" // CHECK_MODULE: "-fmodule-file={{.*}}/FW_Private-{{.*}}.pcm" Index: clang/test/ClangScanDeps/modules-inferred.m =================================================================== --- clang/test/ClangScanDeps/modules-inferred.m +++ clang/test/ClangScanDeps/modules-inferred.m @@ -26,20 +26,20 @@ // RUN: sed "s|DIR|%/t|g" %t/cdb.json.template > %t/cdb.json // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full > %t/result.json -// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t +// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} // CHECK: { // CHECK-NEXT: "modules": [ // CHECK-NEXT: { // CHECK-NEXT: "clang-module-deps": [], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/frameworks/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/frameworks/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK: ], // CHECK-NEXT: "context-hash": "{{.*}}", // CHECK-NEXT: "file-deps": [ -// CHECK-NEXT: "[[PREFIX]]/frameworks/Inferred.framework/Frameworks/Sub.framework/Headers/Sub.h", -// CHECK-NEXT: "[[PREFIX]]/frameworks/Inferred.framework/Headers/Inferred.h", -// CHECK-NEXT: "[[PREFIX]]/frameworks/module.modulemap" +// CHECK-NEXT: "[[PREFIX]]/frameworks/Inferred.framework/Frameworks/Sub.framework/Headers/Sub.h", +// CHECK-NEXT: "[[PREFIX]]/frameworks/Inferred.framework/Headers/Inferred.h", +// CHECK-NEXT: "[[PREFIX]]/frameworks/module.modulemap" // CHECK-NEXT: ], // CHECK-NEXT: "name": "Inferred" // CHECK-NEXT: } Index: clang/test/ClangScanDeps/modules-no-undeclared-includes.c =================================================================== --- clang/test/ClangScanDeps/modules-no-undeclared-includes.c +++ clang/test/ClangScanDeps/modules-no-undeclared-includes.c @@ -31,13 +31,13 @@ // RUN: sed "s|DIR|%/t|g" %t/cdb.json.template > %t/cdb.json // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full \ // RUN: -module-files-dir %t/build > %t/result.json -// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t +// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} // CHECK: { // CHECK-NEXT: "modules": [ // CHECK-NEXT: { // CHECK-NEXT: "clang-module-deps": [], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK: "-fmodule-map-file=[[PREFIX]]/undeclared/module.modulemap" // CHECK: ], Index: clang/test/ClangScanDeps/modules-pch-common-submodule.c =================================================================== --- clang/test/ClangScanDeps/modules-pch-common-submodule.c +++ clang/test/ClangScanDeps/modules-pch-common-submodule.c @@ -16,13 +16,13 @@ // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-pch-common-submodule/cdb_pch.json > %t/cdb.json // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full \ // RUN: -module-files-dir %t/build > %t/result_pch.json -// RUN: cat %t/result_pch.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK-PCH +// RUN: cat %t/result_pch.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} -check-prefix=CHECK-PCH // // CHECK-PCH: { // CHECK-PCH-NEXT: "modules": [ // CHECK-PCH-NEXT: { // CHECK-PCH-NEXT: "clang-module-deps": [], -// CHECK-PCH-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-PCH-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-PCH-NEXT: "command-line": [ // CHECK-PCH: ], // CHECK-PCH-NEXT: "context-hash": "[[HASH_MOD_COMMON:.*]]", @@ -64,13 +64,13 @@ // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-pch-common-submodule/cdb_tu.json > %t/cdb.json // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full \ // RUN: -module-files-dir %t/build > %t/result_tu.json -// RUN: cat %t/result_tu.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK-TU +// RUN: cat %t/result_tu.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} -check-prefix=CHECK-TU // // CHECK-TU: { // CHECK-TU-NEXT: "modules": [ // CHECK-TU-NEXT: { // CHECK-TU-NEXT: "clang-module-deps": [], -// CHECK-TU-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-TU-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-TU-NEXT: "command-line": [ // CHECK-TU: ], // CHECK-TU-NEXT: "context-hash": "[[HASH_MOD_TU:.*]]", Index: clang/test/ClangScanDeps/modules-pch-common-via-submodule.c =================================================================== --- clang/test/ClangScanDeps/modules-pch-common-via-submodule.c +++ clang/test/ClangScanDeps/modules-pch-common-via-submodule.c @@ -13,13 +13,13 @@ // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-pch-common-via-submodule/cdb_pch.json > %t/cdb.json // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full \ // RUN: -module-files-dir %t/build > %t/result_pch.json -// RUN: cat %t/result_pch.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK-PCH +// RUN: cat %t/result_pch.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} -check-prefix=CHECK-PCH // // CHECK-PCH: { // CHECK-PCH-NEXT: "modules": [ // CHECK-PCH-NEXT: { // CHECK-PCH-NEXT: "clang-module-deps": [], -// CHECK-PCH-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-PCH-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-PCH-NEXT: "command-line": [ // CHECK-PCH: ], // CHECK-PCH-NEXT: "context-hash": "[[HASH_MOD_COMMON:.*]]", @@ -60,13 +60,13 @@ // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-pch-common-via-submodule/cdb_tu.json > %t/cdb.json // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full \ // RUN: -module-files-dir %t/build > %t/result_tu.json -// RUN: cat %t/result_tu.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK-TU +// RUN: cat %t/result_tu.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} -check-prefix=CHECK-TU // // CHECK-TU: { // CHECK-TU-NEXT: "modules": [ // CHECK-TU-NEXT: { // CHECK-TU-NEXT: "clang-module-deps": [], -// CHECK-TU-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-TU-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-TU-NEXT: "command-line": [ // CHECK-TU: ], // CHECK-TU-NEXT: "context-hash": "[[HASH_MOD_TU:.*]]", Index: clang/test/ClangScanDeps/modules-pch-imports.c =================================================================== --- clang/test/ClangScanDeps/modules-pch-imports.c +++ clang/test/ClangScanDeps/modules-pch-imports.c @@ -24,7 +24,7 @@ // RUN: -format experimental-full -mode preprocess-dependency-directives \ // RUN: > %t/deps.json -// RUN: cat %t/deps.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t +// RUN: cat %t/deps.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} // Verify that the only modular import in C is E and not the unrelated modules // A or B that come from the PCH. @@ -37,7 +37,7 @@ // CHECK: "module-name": "E" // CHECK: } // CHECK-NEXT: ] -// CHECK: "clang-modulemap-file": "[[PREFIX]]/module.modulemap" +// CHECK: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap" // CHECK: "command-line": [ // CHECK-NOT: "-fmodule-file= // CHECK: "-fmodule-file={{(E=)?}}[[PREFIX]]/{{.*}}/E-{{.*}}.pcm" Index: clang/test/ClangScanDeps/modules-pch.c =================================================================== --- clang/test/ClangScanDeps/modules-pch.c +++ clang/test/ClangScanDeps/modules-pch.c @@ -11,7 +11,7 @@ // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-pch/cdb_pch.json > %t/cdb_pch.json // RUN: clang-scan-deps -compilation-database %t/cdb_pch.json -format experimental-full \ // RUN: -module-files-dir %t/build > %t/result_pch.json -// RUN: cat %t/result_pch.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK-PCH +// RUN: cat %t/result_pch.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} -check-prefix=CHECK-PCH // // Check we didn't build the PCH during dependency scanning. // RUN: not cat %/t/pch.h.gch @@ -20,7 +20,7 @@ // CHECK-PCH-NEXT: "modules": [ // CHECK-PCH-NEXT: { // CHECK-PCH-NEXT: "clang-module-deps": [], -// CHECK-PCH-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-PCH-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-PCH-NEXT: "command-line": [ // CHECK-PCH: ], // CHECK-PCH-NEXT: "context-hash": "[[HASH_MOD_COMMON_1:.*]]", @@ -32,7 +32,7 @@ // CHECK-PCH-NEXT: }, // CHECK-PCH-NEXT: { // CHECK-PCH-NEXT: "clang-module-deps": [], -// CHECK-PCH-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-PCH-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-PCH-NEXT: "command-line": [ // CHECK-PCH: ], // CHECK-PCH-NEXT: "context-hash": "[[HASH_MOD_COMMON_2:.*]]", @@ -49,7 +49,7 @@ // CHECK-PCH-NEXT: "module-name": "ModCommon2" // CHECK-PCH-NEXT: } // CHECK-PCH-NEXT: ], -// CHECK-PCH-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-PCH-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-PCH-NEXT: "command-line": [ // CHECK-PCH: ], // CHECK-PCH-NEXT: "context-hash": "[[HASH_MOD_PCH:.*]]", @@ -99,13 +99,13 @@ // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-pch/cdb_tu.json > %t/cdb_tu.json // RUN: clang-scan-deps -compilation-database %t/cdb_tu.json -format experimental-full \ // RUN: -module-files-dir %t/build > %t/result_tu.json -// RUN: cat %t/result_tu.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK-TU +// RUN: cat %t/result_tu.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} -check-prefix=CHECK-TU // // CHECK-TU: { // CHECK-TU-NEXT: "modules": [ // CHECK-TU-NEXT: { // CHECK-TU-NEXT: "clang-module-deps": [], -// CHECK-TU-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-TU-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-TU-NEXT: "command-line": [ // CHECK-TU: ], // CHECK-TU-NEXT: "context-hash": "[[HASH_MOD_TU:.*]]", @@ -148,13 +148,13 @@ // RUN: sed "s|DIR|%/t|g" %S/Inputs/modules-pch/cdb_tu_with_common.json > %t/cdb_tu_with_common.json // RUN: clang-scan-deps -compilation-database %t/cdb_tu_with_common.json -format experimental-full \ // RUN: -module-files-dir %t/build > %t/result_tu_with_common.json -// RUN: cat %t/result_tu_with_common.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -check-prefix=CHECK-TU-WITH-COMMON +// RUN: cat %t/result_tu_with_common.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} -check-prefix=CHECK-TU-WITH-COMMON // // CHECK-TU-WITH-COMMON: { // CHECK-TU-WITH-COMMON-NEXT: "modules": [ // CHECK-TU-WITH-COMMON-NEXT: { // CHECK-TU-WITH-COMMON-NEXT: "clang-module-deps": [], -// CHECK-TU-WITH-COMMON-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-TU-WITH-COMMON-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-TU-WITH-COMMON-NEXT: "command-line": [ // CHECK-TU-WITH-COMMON: ], // CHECK-TU-WITH-COMMON-NEXT: "context-hash": "[[HASH_MOD_TU_WITH_COMMON:.*]]", Index: clang/test/ClangScanDeps/modules-redefinition.m =================================================================== --- clang/test/ClangScanDeps/modules-redefinition.m +++ clang/test/ClangScanDeps/modules-redefinition.m @@ -30,7 +30,7 @@ // RUN: sed -e "s|DIR|%/t|g" %t/cdb.json.template > %t/cdb.json // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full > %t/result.json -// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t +// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} // CHECK: { // CHECK-NEXT: "modules": [ // CHECK-NEXT: { @@ -40,7 +40,7 @@ // CHECK-NEXT: "module-name": "third" // CHECK-NEXT: } // CHECK-NEXT: ], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/first/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/first/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK: ], // CHECK-NEXT: "context-hash": "{{.*}}", Index: clang/test/ClangScanDeps/modules-symlink-dir-from-module.c =================================================================== --- clang/test/ClangScanDeps/modules-symlink-dir-from-module.c +++ clang/test/ClangScanDeps/modules-symlink-dir-from-module.c @@ -14,13 +14,13 @@ // RUN: -format experimental-full -mode=preprocess-dependency-directives \ // RUN: -optimize-args -module-files-dir %t/build > %t/deps.json -// RUN: cat %t/deps.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t +// RUN: cat %t/deps.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} // CHECK: "modules": [ // CHECK: { // CHECK: "command-line": [ // CHECK-NOT: ] -// CHECK: "-fmodule-map-file=[[PREFIX]]/include/module/module.modulemap" +// CHECK: "-fmodule-map-file=[[SUBMODULE_PREFIX]]/include/module/module.modulemap" // CHECK: ] // CHECK: "name": "Foo" // CHECK: } Index: clang/test/ClangScanDeps/modules-symlink-dir.c =================================================================== --- clang/test/ClangScanDeps/modules-symlink-dir.c +++ clang/test/ClangScanDeps/modules-symlink-dir.c @@ -16,7 +16,7 @@ // RUN: -format experimental-full -mode=preprocess-dependency-directives \ // RUN: -optimize-args -module-files-dir %t/build > %t/deps.json -// RUN: cat %t/deps.json | sed 's:\\\\\?:/:g' | FileCheck -DPREFIX=%/t %s +// RUN: cat %t/deps.json | sed 's:\\\\\?:/:g' | FileCheck -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} %s // Check the module commands actually build. // RUN: %deps-to-rsp %t/deps.json --module-name=Mod > %t/Mod.rsp @@ -27,7 +27,7 @@ // CHECK: "modules": [ // CHECK: { // CHECK: "clang-module-deps": [], -// CHECK: "clang-modulemap-file": "[[PREFIX]]/module/F.framework/Modules/module.modulemap" +// CHECK: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module/F.framework/Modules/module.modulemap" // CHECK: "command-line": [ // CHECK-NOT: symlink-to-module // CHECK: "[[PREFIX]]/module/F.framework/Modules/module.modulemap" @@ -37,7 +37,7 @@ // CHECK: "name": "F" // CHECK-NEXT: } // CHECK-NEXT: { -// CHECK: "clang-modulemap-file": "[[PREFIX]]/module/module.modulemap" +// CHECK: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module/module.modulemap" // CHECK: "command-line": [ // CHECK-NOT: symlink-to-module // CHECK: "[[PREFIX]]/module/module.modulemap" @@ -55,7 +55,7 @@ // CHECK: } // CHECK-NEXT: ], // CHECK: "command-line": [ -// CHECK: "-fmodule-map-file=[[PREFIX]]/module/module.modulemap" +// CHECK: "-fmodule-map-file=[[SUBMODULE_PREFIX]]/module/module.modulemap" // CHECK: ] // CHECK: "clang-module-deps": [ // CHECK: { @@ -64,7 +64,7 @@ // CHECK: } // CHECK-NEXT: ] // CHECK: "command-line": [ -// CHECK: "-fmodule-map-file=[[PREFIX]]/module/module.modulemap" +// CHECK: "-fmodule-map-file=[[SUBMODULE_PREFIX]]/module/module.modulemap" // CHECK: ] // CHECK: "clang-module-deps": [ // CHECK: { @@ -73,7 +73,7 @@ // CHECK: } // CHECK-NEXT: ] // CHECK: "command-line": [ -// CHECK: "-fmodule-map-file=[[PREFIX]]/module/F.framework/Modules/module.modulemap" +// CHECK: "-fmodule-map-file=[[SUBMODULE_PREFIX]]/module/F.framework/Modules/module.modulemap" // CHECK: ] // CHECK: "clang-module-deps": [ // CHECK: { @@ -82,7 +82,7 @@ // CHECK: } // CHECK-NEXT: ] // CHECK: "command-line": [ -// CHECK: "-fmodule-map-file=[[PREFIX]]/module/F.framework/Modules/module.modulemap" +// CHECK: "-fmodule-map-file=[[SUBMODULE_PREFIX]]/module/F.framework/Modules/module.modulemap" // CHECK: ] //--- cdb.json.in Index: clang/test/ClangScanDeps/modules-transitive.c =================================================================== --- clang/test/ClangScanDeps/modules-transitive.c +++ clang/test/ClangScanDeps/modules-transitive.c @@ -28,7 +28,7 @@ // RUN: sed "s|DIR|%/t|g" %t/cdb.json.template > %t/cdb.json // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full > %t/result.json -// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t +// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} // CHECK: { // CHECK-NEXT: "modules": [ @@ -39,7 +39,7 @@ // CHECK-NEXT: "module-name": "second" // CHECK-NEXT: } // CHECK-NEXT: ], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/first/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/first/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK-NEXT: "-cc1", // CHECK-NOT: "-fmodule-map-file=[[PREFIX]]/third/module.modulemap" Index: clang/test/ClangScanDeps/multiple-commands.c =================================================================== --- clang/test/ClangScanDeps/multiple-commands.c +++ clang/test/ClangScanDeps/multiple-commands.c @@ -14,7 +14,7 @@ // RUN: -j 1 -format experimental-full -mode preprocess-dependency-directives \ // RUN: > %t/deps.json -// RUN: cat %t/deps.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t +// RUN: cat %t/deps.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} // Build the -save-temps + -fmodules case // RUN: %deps-to-rsp %t/deps.json --module-name=Mod > %t/Mod.rsp @@ -35,7 +35,7 @@ // CHECK: "modules": [ // CHECK-NEXT: { -// CHECK: "clang-modulemap-file": "[[PREFIX]]{{.}}module.modulemap" +// CHECK: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]{{.}}module.modulemap" // CHECK: "name": "Mod" // CHECK: } // CHECK-NEXT: ] Index: clang/test/ClangScanDeps/removed-args.c =================================================================== --- clang/test/ClangScanDeps/removed-args.c +++ clang/test/ClangScanDeps/removed-args.c @@ -12,13 +12,13 @@ // RUN: sed "s|DIR|%/t|g" %S/Inputs/removed-args/cdb.json.template > %t/cdb.json // RUN: clang-scan-deps -compilation-database %t/cdb.json -format experimental-full > %t/result.json -// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t +// RUN: cat %t/result.json | sed 's:\\\\\?:/:g' | FileCheck %s -DPREFIX=%/t -DSUBMODULE_PREFIX=%{/t:real} // // CHECK: { // CHECK-NEXT: "modules": [ // CHECK-NEXT: { // CHECK-NEXT: "clang-module-deps": [], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK-NEXT: "-cc1" // CHECK-NOT: "-fdebug-compilation-dir=" @@ -43,7 +43,7 @@ // CHECK-NEXT: }, // CHECK-NEXT: { // CHECK-NEXT: "clang-module-deps": [], -// CHECK-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-NEXT: "clang-modulemap-file": "[[SUBMODULE_PREFIX]]/module.modulemap", // CHECK-NEXT: "command-line": [ // CHECK-NEXT: "-cc1" // CHECK-NOT: "-fdebug-compilation-dir= Index: clang/test/ExtractAPI/relative_include.m =================================================================== --- clang/test/ExtractAPI/relative_include.m +++ clang/test/ExtractAPI/relative_include.m @@ -6,22 +6,22 @@ // RUN: cp %t/MyFramework.h %t/Frameworks/MyFramework.framework/Headers/ // RUN: cp %t/MyHeader.h %t/Frameworks/MyFramework.framework/Headers/ -// RUN: sed -e "s@SRCROOT@%{/t:regex_replacement}@g" \ +// RUN: sed -e "s@SRCROOT@%{/t:real}@g" \ // RUN: %t/reference.output.json.in >> %t/reference.output.json // Headermap maps headers to the source root SRCROOT -// RUN: sed -e "s@SRCROOT@%{/t:regex_replacement}@g" \ +// RUN: sed -e "s@SRCROOT@%{/t:real}@g" \ // RUN: %t/headermap.hmap.json.in >> %t/headermap.hmap.json // RUN: %hmaptool write %t/headermap.hmap.json %t/headermap.hmap // Input headers use paths to the framework root/DSTROOT // RUN: %clang_cc1 -extract-api -v --product-name=MyFramework \ // RUN: -triple arm64-apple-macosx \ -// RUN: -iquote%t -I%t/headermap.hmap -F%t/Frameworks \ +// RUN: -iquote%{/t:real} -I%t/headermap.hmap -F%{/t:real}/Frameworks \ // RUN: -x objective-c-header \ -// RUN: %t/Frameworks/MyFramework.framework/Headers/MyFramework.h \ -// RUN: %t/Frameworks/MyFramework.framework/Headers/MyHeader.h \ -// RUN: %t/QuotedHeader.h \ +// RUN: %{/t:real}/Frameworks/MyFramework.framework/Headers/MyFramework.h \ +// RUN: %{/t:real}/Frameworks/MyFramework.framework/Headers/MyHeader.h \ +// RUN: %{/t:real}/QuotedHeader.h \ // RUN: -o %t/output.json 2>&1 -verify | FileCheck -allow-empty %s // Generator version is not consistent across test runs, normalize it. Index: clang/test/Lexer/case-insensitive-include-win.c =================================================================== --- clang/test/Lexer/case-insensitive-include-win.c +++ clang/test/Lexer/case-insensitive-include-win.c @@ -5,6 +5,6 @@ // REQUIRES: system-windows // RUN: mkdir -p %t.dir // RUN: touch %t.dir/foo.h -// RUN: not %clang_cl /FI\\?\%t.dir\FOO.h /WX -fsyntax-only %s 2>&1 | FileCheck %s +// RUN: not %clang_cl /FI\\?\%{t:real}.dir\FOO.h /WX -fsyntax-only %s 2>&1 | FileCheck %s // CHECK: non-portable path to file '"\\?\ Index: clang/test/VFS/module-header-mismatches.m =================================================================== --- clang/test/VFS/module-header-mismatches.m +++ clang/test/VFS/module-header-mismatches.m @@ -1,6 +1,6 @@ // RUN: rm -rf %t // RUN: split-file %s %t -// RUN: sed -e "s;TEST_DIR;%/t;g" %t/sed-overlay.yaml > %t/overlay.yaml +// RUN: sed -e "s;TEST_DIR;%{/t:real};g" %t/sed-overlay.yaml > %t/overlay.yaml // These tests first build with an overlay such that the header is resolved // to %t/other/Mismatch.h. They then build again with the header resolved @@ -11,20 +11,20 @@ // since this does happen in real projects (with a different copy of the same // file). -// RUN: %clang_cc1 -Werror -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/hf-mcp -ivfsoverlay %t/overlay.yaml -F %t/header-frameworks -fsyntax-only -verify %t/use.m -// RUN: %clang_cc1 -Werror -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/hf-mcp -F %t/header-frameworks -fsyntax-only -verify %t/use.m +// RUN: %clang_cc1 -Werror -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/hf-mcp -ivfsoverlay %t/overlay.yaml -F %{t:real}/header-frameworks -fsyntax-only -verify %t/use.m +// RUN: %clang_cc1 -Werror -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/hf-mcp -F %{t:real}/header-frameworks -fsyntax-only -verify %t/use.m // RUN: find %t/hf-mcp -name "Mismatch-*.pcm" | count 1 // RUN: %clang_cc1 -Werror -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/df-mcp -ivfsoverlay %t/overlay.yaml -F %t/dir-frameworks -fsyntax-only -verify %t/use.m // RUN: %clang_cc1 -Werror -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/hf-mcp -F %t/dir-frameworks -fsyntax-only -verify %t/use.m // RUN: find %t/df-mcp -name "Mismatch-*.pcm" | count 1 -// RUN: %clang_cc1 -Werror -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/nf-mcp -ivfsoverlay %t/overlay.yaml -F %t/norm-frameworks -fsyntax-only -verify %t/use.m -// RUN: %clang_cc1 -Werror -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/nf-mcp -F %t/norm-frameworks -fsyntax-only -verify %t/use.m +// RUN: %clang_cc1 -Werror -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/nf-mcp -ivfsoverlay %t/overlay.yaml -F %{t:real}/norm-frameworks -fsyntax-only -verify %t/use.m +// RUN: %clang_cc1 -Werror -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/nf-mcp -F %{t:real}/norm-frameworks -fsyntax-only -verify %t/use.m // RUN: find %t/nf-mcp -name "Mismatch-*.pcm" | count 1 -// RUN: %clang_cc1 -Werror -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/m-mcp -ivfsoverlay %t/overlay.yaml -I %t/mod -fsyntax-only -verify %t/use.m -// RUN: %clang_cc1 -Werror -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/m-mcp -I %t/mod -fsyntax-only -verify %t/use.m +// RUN: %clang_cc1 -Werror -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/m-mcp -ivfsoverlay %t/overlay.yaml -I %{t:real}/mod -fsyntax-only -verify %t/use.m +// RUN: %clang_cc1 -Werror -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/m-mcp -I %{t:real}/mod -fsyntax-only -verify %t/use.m // RUN: find %t/m-mcp -name "Mismatch-*.pcm" | count 1 //--- use.m Index: llvm/cmake/modules/AddLLVM.cmake =================================================================== --- llvm/cmake/modules/AddLLVM.cmake +++ llvm/cmake/modules/AddLLVM.cmake @@ -1705,10 +1705,15 @@ # use it and can't be in a lit module. Use with make_paths_relative(). string(CONCAT LLVM_LIT_PATH_FUNCTION "# Allow generated file to be relocatable.\n" - "from pathlib import Path\n" + "import os\n" + "import platform\n" "def path(p):\n" " if not p: return ''\n" - " return str((Path(__file__).parent / p).resolve())\n" + " # Follows lit.util.abs_path_preserve_drive, which cannot be imported here.\n" + " if platform.system() == 'Windows':\n" + " return os.path.abspath(os.path.join(os.path.dirname(__file__), p))\n" + " else:\n" + " return os.path.realpath(os.path.join(os.path.dirname(__file__), p))\n" ) # This function provides an automatic way to 'configure'-like generate a file Index: llvm/docs/CommandGuide/lit.rst =================================================================== --- llvm/docs/CommandGuide/lit.rst +++ llvm/docs/CommandGuide/lit.rst @@ -541,6 +541,16 @@ %/p %p but ``\`` is replaced by ``/`` %/t %t but ``\`` is replaced by ``/`` %/T %T but ``\`` is replaced by ``/`` + %{s:real} %s after expanding all symbolic links and substitute drives + %{S:real} %S after expanding all symbolic links and substitute drives + %{p:real} %p after expanding all symbolic links and substitute drives + %{t:real} %t after expanding all symbolic links and substitute drives + %{T:real} %T after expanding all symbolic links and substitute drives + %{/s:real} %/s after expanding all symbolic links and substitute drives + %{/S:real} %/S after expanding all symbolic links and substitute drives + %{/p:real} %/p after expanding all symbolic links and substitute drives + %{/t:real} %/t after expanding all symbolic links and substitute drives + %{/T:real} %/T after expanding all symbolic links and substitute drives %{/s:regex_replacement} %/s but escaped for use in the replacement of a ``s@@@`` command in sed %{/S:regex_replacement} %/S but escaped for use in the replacement of a ``s@@@`` command in sed %{/p:regex_replacement} %/p but escaped for use in the replacement of a ``s@@@`` command in sed Index: llvm/docs/TestingGuide.rst =================================================================== --- llvm/docs/TestingGuide.rst +++ llvm/docs/TestingGuide.rst @@ -662,7 +662,7 @@ ``${fs-sep}`` Expands to the file system separator, i.e. ``/`` or ``\`` on Windows. -``%/s, %/S, %/t, %/T:`` +``%/s, %/S, %/t, %/T`` Act like the corresponding substitution above but replace any ``\`` character with a ``/``. This is useful to normalize path separators. @@ -671,7 +671,17 @@ Example: ``%/s: C:/Desktop Files/foo_test.s.tmp`` -``%:s, %:S, %:t, %:T:`` +``%{s:real}, %{S:real}, %{t:real}, %{T:real}`` +``%{/s:real}, %{/S:real}, %{/t:real}, %{/T:real}`` + + Act like the corresponding substitution, including with ``/``, but use + the real path by expanding all symbolic links and substitute drives. + + Example: ``%s: S:\foo_test.s.tmp`` + + Example: ``%{/s:real}: C:/SDrive/foo_test.s.tmp`` + +``%:s, %:S, %:t, %:T`` Act like the corresponding substitution above but remove colons at the beginning of Windows paths. This is useful to allow concatenation Index: llvm/utils/lit/lit/LitConfig.py =================================================================== --- llvm/utils/lit/lit/LitConfig.py +++ llvm/utils/lit/lit/LitConfig.py @@ -189,7 +189,7 @@ f = inspect.currentframe() # Step out of _write_message, and then out of wrapper. f = f.f_back.f_back - file = os.path.abspath(inspect.getsourcefile(f)) + file = lit.util.abs_path_preserve_drive(inspect.getsourcefile(f)) line = inspect.getlineno(f) sys.stderr.write( "%s: %s:%d: %s: %s\n" % (self.progname, file, line, kind, message) Index: llvm/utils/lit/lit/TestRunner.py =================================================================== --- llvm/utils/lit/lit/TestRunner.py +++ llvm/utils/lit/lit/TestRunner.py @@ -74,7 +74,7 @@ if os.path.isabs(newdir): self.cwd = newdir else: - self.cwd = os.path.realpath(os.path.join(self.cwd, newdir)) + self.cwd = lit.util.abs_path_preserve_drive(os.path.join(self.cwd, newdir)) class TimeoutHelper(object): @@ -427,7 +427,7 @@ dir = to_unicode(dir) if kIsWindows else to_bytes(dir) cwd = to_unicode(cwd) if kIsWindows else to_bytes(cwd) if not os.path.isabs(dir): - dir = os.path.realpath(os.path.join(cwd, dir)) + dir = lit.util.abs_path_preserve_drive(os.path.join(cwd, dir)) if parent: lit.util.mkdir_p(dir) else: @@ -473,7 +473,7 @@ path = to_unicode(path) if kIsWindows else to_bytes(path) cwd = to_unicode(cwd) if kIsWindows else to_bytes(cwd) if not os.path.isabs(path): - path = os.path.realpath(os.path.join(cwd, path)) + path = lit.util.abs_path_preserve_drive(os.path.join(cwd, path)) if force and not os.path.exists(path): continue try: @@ -519,7 +519,7 @@ SHFileOperationW = windll.shell32.SHFileOperationW SHFileOperationW.argtypes = [POINTER(SHFILEOPSTRUCTW)] - path = os.path.abspath(path) + path = lit.util.abs_path_preserve_drive(path) pFrom = create_unicode_buffer(path, len(path) + 2) pFrom[len(path)] = pFrom[len(path) + 1] = "\0" @@ -686,7 +686,7 @@ named_temp_files = [] builtin_commands = set(["cat", "diff"]) builtin_commands_dir = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "builtin_commands" + os.path.dirname(lit.util.abs_path_preserve_drive(__file__)), "builtin_commands" ) inproc_builtins = { "cd": executeBuiltinCd, @@ -772,7 +772,7 @@ # commands. if args[0] in builtin_commands: args.insert(0, sys.executable) - cmd_shenv.env["PYTHONPATH"] = os.path.dirname(os.path.abspath(__file__)) + cmd_shenv.env["PYTHONPATH"] = os.path.dirname(lit.util.abs_path_preserve_drive(__file__)) args[1] = os.path.join(builtin_commands_dir, args[1] + ".py") # We had to search through the 'not' commands to find all the 'env' @@ -1228,18 +1228,10 @@ substitutions.extend(test.config.substitutions) tmpName = tmpBase + ".tmp" baseName = os.path.basename(tmpBase) - substitutions.extend( - [ - ("%s", sourcepath), - ("%S", sourcedir), - ("%p", sourcedir), - ("%{pathsep}", os.pathsep), - ("%t", tmpName), - ("%basename_t", baseName), - ("%T", tmpDir), - ] - ) + substitutions.append(("%{pathsep}", os.pathsep)) + substitutions.append(("%basename_t", baseName)) + substitutions.extend( [ ("%{fs-src-root}", pathlib.Path(sourcedir).anchor), @@ -1248,49 +1240,47 @@ ] ) - # "%/[STpst]" should be normalized. - substitutions.extend( - [ - ("%/s", sourcepath.replace("\\", "/")), - ("%/S", sourcedir.replace("\\", "/")), - ("%/p", sourcedir.replace("\\", "/")), - ("%/t", tmpBase.replace("\\", "/") + ".tmp"), - ("%/T", tmpDir.replace("\\", "/")), - ("%/et", tmpName.replace("\\", "\\\\\\\\\\\\\\\\")), - ] - ) + substitutions.append(("%/et", tmpName.replace("\\", "\\\\\\\\\\\\\\\\"))) - # "%{/[STpst]:regex_replacement}" should be normalized like "%/[STpst]" but we're - # also in a regex replacement context of a s@@@ regex. def regex_escape(s): s = s.replace("@", r"\@") s = s.replace("&", r"\&") return s - substitutions.extend( - [ - ("%{/s:regex_replacement}", regex_escape(sourcepath.replace("\\", "/"))), - ("%{/S:regex_replacement}", regex_escape(sourcedir.replace("\\", "/"))), - ("%{/p:regex_replacement}", regex_escape(sourcedir.replace("\\", "/"))), - ( - "%{/t:regex_replacement}", - regex_escape(tmpBase.replace("\\", "/")) + ".tmp", - ), - ("%{/T:regex_replacement}", regex_escape(tmpDir.replace("\\", "/"))), - ] - ) + path_substitutions = [ + ("s", sourcepath), ("S", sourcedir), ("p", sourcedir), + ("t", tmpName), ("T", tmpDir) + ] + for path_substitution in path_substitutions: + letter = path_substitution[0] + path = path_substitution[1] + + # Original path variant + substitutions.append(("%" + letter, path)) + + # Normalized path separator variant + substitutions.append(("%/" + letter, path.replace("\\", "/"))) + + # realpath variants + # Windows paths with substitute drives are not expanded by default + # as they are used to avoid MAX_PATH issues, but sometimes we do + # need the fully expanded path. + real_path = os.path.realpath(path) + substitutions.append(("%{" + letter + ":real}", real_path)) + substitutions.append(("%{/" + letter + ":real}", + real_path.replace("\\", "/"))) + + # "%{/[STpst]:regex_replacement}" should be normalized like + # "%/[STpst]" but we're also in a regex replacement context + # of a s@@@ regex. + substitutions.append( + ("%{/" + letter + ":regex_replacement}", + regex_escape(path.replace("\\", "/")))) + + # "%:[STpst]" are normalized paths without colons and without + # a leading slash. + substitutions.append(("%:" + letter, colonNormalizePath(path))) - # "%:[STpst]" are normalized paths without colons and without a leading - # slash. - substitutions.extend( - [ - ("%:s", colonNormalizePath(sourcepath)), - ("%:S", colonNormalizePath(sourcedir)), - ("%:p", colonNormalizePath(sourcedir)), - ("%:t", colonNormalizePath(tmpBase + ".tmp")), - ("%:T", colonNormalizePath(tmpDir)), - ] - ) return substitutions Index: llvm/utils/lit/lit/builtin_commands/diff.py =================================================================== --- llvm/utils/lit/lit/builtin_commands/diff.py +++ llvm/utils/lit/lit/builtin_commands/diff.py @@ -281,7 +281,7 @@ try: for file in args: if file != "-" and not os.path.isabs(file): - file = os.path.realpath(os.path.join(os.getcwd(), file)) + file = util.abs_path_preserve_drive(file) if flags.recursive_diff: if file == "-": Index: llvm/utils/lit/lit/cl_arguments.py =================================================================== --- llvm/utils/lit/lit/cl_arguments.py +++ llvm/utils/lit/lit/cl_arguments.py @@ -122,7 +122,7 @@ help="Additional paths to add to testing environment", action="append", default=[], - type=os.path.abspath, + type=lit.util.abs_path_preserve_drive, ) execution_group.add_argument( "--vg", dest="useValgrind", help="Run tests under valgrind", action="store_true" Index: llvm/utils/lit/lit/discovery.py =================================================================== --- llvm/utils/lit/lit/discovery.py +++ llvm/utils/lit/lit/discovery.py @@ -7,7 +7,7 @@ import sys from lit.TestingConfig import TestingConfig -from lit import LitConfig, Test +from lit import LitConfig, Test, util def chooseConfigFileFromDir(dir, config_names): @@ -56,8 +56,8 @@ # configuration to load instead. config_map = litConfig.params.get("config_map") if config_map: - cfgpath = os.path.realpath(cfgpath) - target = config_map.get(os.path.normcase(cfgpath)) + cfgpath = util.abs_path_preserve_drive(cfgpath) + target = config_map.get(cfgpath) if target: cfgpath = target @@ -67,13 +67,13 @@ cfg = TestingConfig.fromdefaults(litConfig) cfg.load_from_path(cfgpath, litConfig) - source_root = os.path.realpath(cfg.test_source_root or path) - exec_root = os.path.realpath(cfg.test_exec_root or path) + source_root = util.abs_path_preserve_drive(cfg.test_source_root or path) + exec_root = util.abs_path_preserve_drive(cfg.test_exec_root or path) return Test.TestSuite(cfg.name, source_root, exec_root, cfg), () def search(path): # Check for an already instantiated test suite. - real_path = os.path.realpath(path) + real_path = util.abs_path_preserve_drive(path) res = cache.get(real_path) if res is None: cache[real_path] = res = search1(path) Index: llvm/utils/lit/lit/util.py =================================================================== --- llvm/utils/lit/lit/util.py +++ llvm/utils/lit/lit/util.py @@ -127,6 +127,23 @@ return n +def abs_path_preserve_drive(path): + """Return the absolute path without resolving drive mappings on Windows. + + """ + if platform.system() == "Windows": + # Windows has limitations on path length (MAX_PATH) that + # can be worked around using substitute drives, which map + # a drive letter to a longer path on another drive. + # Since Python 3.8, os.path.realpath resolves sustitute drives, + # so we should not use it. In Python 3.7, os.path.realpath + # was implemented as os.path.abspath. + return os.path.normpath(os.path.abspath(path)) + else: + # On UNIX, the current directory always has symbolic links resolved, + # so any program accepting relative paths cannot preserve symbolic + # links in paths and we should always use os.path.realpath. + return os.path.normpath(os.path.realpath(path)) def mkdir(path): try: Index: llvm/utils/lit/setup.py =================================================================== --- llvm/utils/lit/setup.py +++ llvm/utils/lit/setup.py @@ -7,7 +7,7 @@ # is nice to allow: # python path/to/setup.py install # to work (for scripts, etc.) -os.chdir(os.path.dirname(os.path.abspath(__file__))) +os.chdir(os.path.dirname(lit.util.abs_path_preserve_drive(__file__))) sys.path.insert(0, ".") import lit Index: llvm/utils/lit/tests/Inputs/config-map-discovery/driver.py =================================================================== --- llvm/utils/lit/tests/Inputs/config-map-discovery/driver.py +++ llvm/utils/lit/tests/Inputs/config-map-discovery/driver.py @@ -2,9 +2,7 @@ import os import sys -main_config = sys.argv[1] -main_config = os.path.realpath(main_config) -main_config = os.path.normcase(main_config) +main_config = lit.util.abs_path_preserve_drive(sys.argv[1]) config_map = {main_config: sys.argv[2]} builtin_parameters = {"config_map": config_map} Index: llvm/utils/lit/tests/Inputs/config-map-discovery/lit.alt.cfg =================================================================== --- llvm/utils/lit/tests/Inputs/config-map-discovery/lit.alt.cfg +++ llvm/utils/lit/tests/Inputs/config-map-discovery/lit.alt.cfg @@ -5,5 +5,5 @@ config.test_format = lit.formats.ShTest() import os -config.test_exec_root = os.path.realpath(os.path.dirname(__file__)) +config.test_exec_root = os.path.dirname(lit.util.abs_path_preserve_drive(__file__)) config.test_source_root = os.path.join(config.test_exec_root, "tests") Index: llvm/utils/lit/tests/Inputs/use-llvm-tool-required/lit.cfg =================================================================== --- llvm/utils/lit/tests/Inputs/use-llvm-tool-required/lit.cfg +++ llvm/utils/lit/tests/Inputs/use-llvm-tool-required/lit.cfg @@ -1,4 +1,5 @@ import lit.formats +import lit.util config.name = "use-llvm-tool-required" config.suffixes = [".txt"] @@ -7,7 +8,7 @@ config.test_exec_root = None import os.path -config.llvm_tools_dir = os.path.realpath(os.path.dirname(__file__)) +config.llvm_tools_dir = os.path.dirname(lit.util.abs_path_preserve_drive(__file__)) import lit.llvm lit.llvm.initialize(lit_config, config) Index: llvm/utils/lit/tests/Inputs/use-llvm-tool/lit.cfg =================================================================== --- llvm/utils/lit/tests/Inputs/use-llvm-tool/lit.cfg +++ llvm/utils/lit/tests/Inputs/use-llvm-tool/lit.cfg @@ -1,4 +1,5 @@ import lit.formats +import lit.util config.name = "use-llvm-tool" config.suffixes = [".txt"] @@ -7,7 +8,7 @@ config.test_exec_root = None import os.path -this_dir = os.path.realpath(os.path.dirname(__file__)) +this_dir = os.path.dirname(lit.util.abs_path_preserve_drive(__file__)) config.llvm_tools_dir = os.path.join(this_dir, "build") import lit.llvm Index: llvm/utils/lit/tests/lit.cfg =================================================================== --- llvm/utils/lit/tests/lit.cfg +++ llvm/utils/lit/tests/lit.cfg @@ -6,6 +6,7 @@ import subprocess import lit.formats +import lit.util from lit.llvm import llvm_config # Configuration file for the 'lit' test runner. @@ -35,7 +36,7 @@ lit_path = os.path.join(llvm_src_root, "utils", "lit") else: lit_path = os.path.join(config.test_source_root, "..") -lit_path = os.path.abspath(lit_path) +lit_path = lit.util.abs_path_preserve_drive(lit_path) # Required because some tests import the lit module if llvm_config: Index: llvm/utils/llvm-lit/llvm-lit.in =================================================================== --- llvm/utils/llvm-lit/llvm-lit.in +++ llvm/utils/llvm-lit/llvm-lit.in @@ -8,7 +8,7 @@ def map_config(source_dir, site_config): global config_map - source_dir = os.path.realpath(source_dir) + source_dir = os.path.abspath(source_dir) source_dir = os.path.normcase(source_dir) site_config = os.path.normpath(site_config) config_map[source_dir] = site_config