================ @@ -0,0 +1,178 @@ +// Test that modifications to a common header (imported from both a PCH and a TU) +// cause rebuilds of dependent modules imported from the TU on incremental build. + +// RUN: rm -rf %t +// RUN: split-file %s %t + +//--- module.modulemap +module mod_common { header "mod_common.h" } +module mod_tu { header "mod_tu.h" } +module mod_tu_extra { header "mod_tu_extra.h" } + +//--- mod_common.h +#define MOD_COMMON_MACRO 0 +//--- mod_tu.h +#include "mod_common.h" +#if MOD_COMMON_MACRO +#include "mod_tu_extra.h" +#endif + +//--- mod_tu_extra.h + +//--- prefix.h +#include "mod_common.h" + +//--- tu.c +#include "mod_tu.h" + +// Clean: scan the PCH. +// RUN: clang-scan-deps -format experimental-full -o %t/deps_pch_clean.json -- \ +// RUN: %clang -x c-header %t/prefix.h -o %t/prefix.h.pch -F %t \ +// RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache + +// Clean: build the PCH. +// RUN: %deps-to-rsp %t/deps_pch_clean.json --module-name mod_common > %t/mod_common.rsp +// RUN: %deps-to-rsp %t/deps_pch_clean.json --tu-index 0 > %t/pch.rsp +// RUN: %clang @%t/mod_common.rsp +// RUN: %clang @%t/pch.rsp + +// Clean: scan the TU. +// RUN: clang-scan-deps -format experimental-full -o %t/deps_tu_clean.json -- \ +// RUN: %clang -c %t/tu.c -o %t/tu.o -include %t/prefix.h -F %t \ +// RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache +// RUN: cat %t/deps_tu_clean.json | sed 's:\\\\\?:/:g' | FileCheck %s --check-prefix=CHECK-TU-CLEAN -DPREFIX=%/t +// CHECK-TU-CLEAN: { +// CHECK-TU-CLEAN-NEXT: "modules": [ +// CHECK-TU-CLEAN-NEXT: { +// CHECK-TU-CLEAN-NEXT: "clang-module-deps": [], +// CHECK-TU-CLEAN-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap", +// CHECK-TU-CLEAN-NEXT: "command-line": [ +// CHECK-TU-CLEAN: ], +// CHECK-TU-CLEAN-NEXT: "context-hash": "{{.*}}", +// CHECK-TU-CLEAN-NEXT: "file-deps": [ +// CHECK-TU-CLEAN-NEXT: "[[PREFIX]]/module.modulemap", +// CHECK-TU-CLEAN-NEXT: "[[PREFIX]]/mod_tu.h" +// CHECK-TU-CLEAN-NEXT: ], +// CHECK-TU-CLEAN-NEXT: "link-libraries": [], +// CHECK-TU-CLEAN-NEXT: "name": "mod_tu" +// CHECK-TU-CLEAN-NEXT: } +// CHECK-TU-CLEAN-NEXT: ], +// CHECK-TU-CLEAN-NEXT: "translation-units": [ +// CHECK-TU-CLEAN-NEXT: { +// CHECK-TU-CLEAN-NEXT: "commands": [ +// CHECK-TU-CLEAN-NEXT: { +// CHECK-TU-CLEAN-NEXT: "clang-context-hash": "{{.*}}", +// CHECK-TU-CLEAN-NEXT: "clang-module-deps": [ +// CHECK-TU-CLEAN-NEXT: { +// CHECK-TU-CLEAN-NEXT: "context-hash": "{{.*}}", +// CHECK-TU-CLEAN-NEXT: "module-name": "mod_tu" +// CHECK-TU-CLEAN-NEXT: } +// CHECK-TU-CLEAN-NEXT: ], +// CHECK-TU-CLEAN-NEXT: "command-line": [ +// CHECK-TU-CLEAN: ], +// CHECK-TU-CLEAN-NEXT: "executable": "{{.*}}", +// CHECK-TU-CLEAN-NEXT: "file-deps": [ +// CHECK-TU-CLEAN-NEXT: "[[PREFIX]]/tu.c", +// CHECK-TU-CLEAN-NEXT: "[[PREFIX]]/prefix.h.pch" +// CHECK-TU-CLEAN-NEXT: ], +// CHECK-TU-CLEAN-NEXT: "input-file": "[[PREFIX]]/tu.c" +// CHECK-TU-CLEAN-NEXT: } +// CHECK-TU-CLEAN-NEXT: ] +// CHECK-TU-CLEAN-NEXT: } +// CHECK-TU-CLEAN: ] +// CHECK-TU-CLEAN: } + +// Clean: build the TU. +// RUN: %deps-to-rsp %t/deps_tu_clean.json --module-name mod_tu > %t/mod_tu.rsp +// RUN: %deps-to-rsp %t/deps_tu_clean.json --tu-index 0 > %t/tu.rsp +// RUN: %clang @%t/mod_tu.rsp +// RUN: %clang @%t/tu.rsp + +// Incremental: modify the common module. +// RUN: sleep 1 ---------------- jansvoboda11 wrote:
So that the modification time of `%t/mod_common.h` is guaranteed to not be the same as when it was created by `split-file`. Without this, the timing might work out such that the timestamp of this file is the same and the invalidation logic doesn't trigger. https://github.com/llvm/llvm-project/pull/138920 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits