blob: 72a4dc949b0f5422abc6426ab3c1dd35436e1499 [file] [log] [blame]
// 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 \
// 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 \
// 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
// RUN: echo "#define MOD_COMMON_MACRO 1" > %t/mod_common.h
// Incremental: scan the PCH.
// RUN: clang-scan-deps -format experimental-full -o %t/deps_pch_incremental.json -- \
// RUN: %clang -x c-header %t/prefix.h -o %t/prefix.h.pch \
// RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache
// Incremental: build the PCH.
// RUN: %deps-to-rsp %t/deps_pch_incremental.json --module-name mod_common > %t/mod_common.rsp
// RUN: %deps-to-rsp %t/deps_pch_incremental.json --tu-index 0 > %t/pch.rsp
// RUN: %clang @%t/mod_common.rsp
// RUN: %clang @%t/pch.rsp
// Incremental: scan the TU. This needs to invalidate modules imported from the
// TU that depend on modules imported from the PCH and discover the
// new dependency on 'mod_tu_extra'.
// RUN: clang-scan-deps -format experimental-full -o %t/deps_tu_incremental.json -- \
// RUN: %clang -c %t/tu.c -o %t/tu.o -include %t/prefix.h \
// RUN: -fmodules -fimplicit-module-maps -fmodules-cache-path=%t/cache
// RUN: cat %t/deps_tu_incremental.json | sed 's:\\\\\?:/:g' | FileCheck %s --check-prefix=CHECK-TU-INCREMENTAL -DPREFIX=%/t
// CHECK-TU-INCREMENTAL: {
// CHECK-TU-INCREMENTAL-NEXT: "modules": [
// CHECK-TU-INCREMENTAL-NEXT: {
// CHECK-TU-INCREMENTAL-NEXT: "clang-module-deps": [
// CHECK-TU-INCREMENTAL-NEXT: {
// CHECK-TU-INCREMENTAL-NEXT: "context-hash": "{{.*}}",
// CHECK-TU-INCREMENTAL-NEXT: "module-name": "mod_tu_extra"
// CHECK-TU-INCREMENTAL-NEXT: }
// CHECK-TU-INCREMENTAL-NEXT: ],
// CHECK-TU-INCREMENTAL-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap",
// CHECK-TU-INCREMENTAL-NEXT: "command-line": [
// CHECK-TU-INCREMENTAL: ],
// CHECK-TU-INCREMENTAL-NEXT: "context-hash": "{{.*}}",
// CHECK-TU-INCREMENTAL-NEXT: "file-deps": [
// CHECK-TU-INCREMENTAL-NEXT: "[[PREFIX]]/module.modulemap",
// CHECK-TU-INCREMENTAL-NEXT: "[[PREFIX]]/mod_tu.h"
// CHECK-TU-INCREMENTAL-NEXT: ],
// CHECK-TU-INCREMENTAL-NEXT: "link-libraries": [],
// CHECK-TU-INCREMENTAL-NEXT: "name": "mod_tu"
// CHECK-TU-INCREMENTAL-NEXT: },
// CHECK-TU-INCREMENTAL-NEXT: {
// CHECK-TU-INCREMENTAL-NEXT: "clang-module-deps": [],
// CHECK-TU-INCREMENTAL-NEXT: "clang-modulemap-file": "[[PREFIX]]/module.modulemap",
// CHECK-TU-INCREMENTAL-NEXT: "command-line": [
// CHECK-TU-INCREMENTAL: ],
// CHECK-TU-INCREMENTAL-NEXT: "context-hash": "{{.*}}",
// CHECK-TU-INCREMENTAL-NEXT: "file-deps": [
// CHECK-TU-INCREMENTAL-NEXT: "[[PREFIX]]/module.modulemap",
// CHECK-TU-INCREMENTAL-NEXT: "[[PREFIX]]/mod_tu_extra.h"
// CHECK-TU-INCREMENTAL-NEXT: ],
// CHECK-TU-INCREMENTAL-NEXT: "link-libraries": [],
// CHECK-TU-INCREMENTAL-NEXT: "name": "mod_tu_extra"
// CHECK-TU-INCREMENTAL-NEXT: }
// CHECK-TU-INCREMENTAL-NEXT: ],
// CHECK-TU-INCREMENTAL-NEXT: "translation-units": [
// CHECK-TU-INCREMENTAL-NEXT: {
// CHECK-TU-INCREMENTAL-NEXT: "commands": [
// CHECK-TU-INCREMENTAL-NEXT: {
// CHECK-TU-INCREMENTAL-NEXT: "clang-context-hash": "{{.*}}",
// CHECK-TU-INCREMENTAL-NEXT: "clang-module-deps": [
// CHECK-TU-INCREMENTAL-NEXT: {
// CHECK-TU-INCREMENTAL-NEXT: "context-hash": "{{.*}}",
// CHECK-TU-INCREMENTAL-NEXT: "module-name": "mod_tu"
// CHECK-TU-INCREMENTAL-NEXT: }
// CHECK-TU-INCREMENTAL-NEXT: ],
// CHECK-TU-INCREMENTAL-NEXT: "command-line": [
// CHECK-TU-INCREMENTAL: ],
// CHECK-TU-INCREMENTAL-NEXT: "executable": "{{.*}}",
// CHECK-TU-INCREMENTAL-NEXT: "file-deps": [
// CHECK-TU-INCREMENTAL-NEXT: "[[PREFIX]]/tu.c",
// CHECK-TU-INCREMENTAL-NEXT: "[[PREFIX]]/prefix.h.pch"
// CHECK-TU-INCREMENTAL-NEXT: ],
// CHECK-TU-INCREMENTAL-NEXT: "input-file": "[[PREFIX]]/tu.c"
// CHECK-TU-INCREMENTAL-NEXT: }
// CHECK-TU-INCREMENTAL-NEXT: ]
// CHECK-TU-INCREMENTAL-NEXT: }
// CHECK-TU-INCREMENTAL: ]
// CHECK-TU-INCREMENTAL: }
// Incremental: build the TU.
// RUN: %deps-to-rsp %t/deps_tu_incremental.json --module-name mod_tu_extra > %t/mod_tu_extra.rsp
// RUN: %deps-to-rsp %t/deps_tu_incremental.json --module-name mod_tu > %t/mod_tu.rsp
// RUN: %deps-to-rsp %t/deps_tu_incremental.json --tu-index 0 > %t/tu.rsp
// RUN: %clang @%t/mod_tu_extra.rsp
// RUN: %clang @%t/mod_tu.rsp
// RUN: %clang @%t/tu.rsp