// This tests the behavior of -fmodules-validate-once-per-build-session with // different combinations of flags and states of the module cache. // Note: The `sleep 1` commands sprinkled throughout this test make the strict // comparisons of epoch mtimes work as expected. Some may be unnecessary, // but make the intent clearer. // RUN: rm -rf %t // RUN: split-file %s %t // RUN: echo "-fsyntax-only -fmodules -fmodules-cache-path=%/t/module-cache" > %t/ctx.rsp // RUN: echo "-fbuild-session-file=%/t/module-cache/session.timestamp" >> %t/ctx.rsp // RUN: echo "-fmodules-validate-once-per-build-session" >> %t/ctx.rsp // RUN: echo "-Rmodule-build -Rmodule-validation" >> %t/ctx.rsp //--- include/foo.h //--- include/module.modulemap module Foo { header "foo.h" } //--- clean.c // Clean module cache. Modules will get compiled regardless of validation settings. // RUN: mkdir %t/module-cache // RUN: sleep 1 // RUN: touch %t/module-cache/session.timestamp // RUN: sleep 1 // RUN: %clang @%t/ctx.rsp %t/clean.c -DCTX=1 \ // RUN: -isystem %t/include -fmodules-validate-system-headers \ // RUN: 2>&1 | FileCheck %t/clean.c // RUN: %clang @%t/ctx.rsp %t/clean.c -DCTX=2 \ // RUN: -I %t/include -fmodules-validate-system-headers \ // RUN: 2>&1 | FileCheck %t/clean.c // RUN: %clang @%t/ctx.rsp %t/clean.c -DCTX=3 \ // RUN: -I %t/include -fmodules-validate-system-headers -Xclang -fno-modules-force-validate-user-headers \ // RUN: 2>&1 | FileCheck %t/clean.c #include "foo.h" // CHECK: building module 'Foo' //--- no-change-same-session.c // Populated module cache in the same build session with unchanged inputs. // Validation only happens when it's forced for user headers. No compiles. // RUN: sleep 1 // RUN: %clang @%t/ctx.rsp %t/no-change-same-session.c -DCTX=1 \ // RUN: -isystem %t/include -fmodules-validate-system-headers \ // RUN: 2>&1 | FileCheck %t/no-change-same-session.c --check-prefix=CHECK-NO-VALIDATION-OR-BUILD --allow-empty // RUN: %clang @%t/ctx.rsp %t/no-change-same-session.c -DCTX=2 \ // RUN: -I %t/include -fmodules-validate-system-headers \ // RUN: 2>&1 | FileCheck %t/no-change-same-session.c --check-prefix=CHECK-VALIDATION-ONLY // RUN: %clang @%t/ctx.rsp %t/no-change-same-session.c -DCTX=3 \ // RUN: -I %t/include -fmodules-validate-system-headers -Xclang -fno-modules-force-validate-user-headers \ // RUN: 2>&1 | FileCheck %t/no-change-same-session.c --check-prefix=CHECK-NO-VALIDATION-OR-BUILD --allow-empty #include "foo.h" // CHECK-NO-VALIDATION-OR-BUILD-NOT: validating {{[0-9]+}} input files in module 'Foo' // CHECK-NO-VALIDATION-OR-BUILD-NOT: building module 'Foo' // CHECK-VALIDATION-ONLY: validating {{[0-9]+}} input files in module 'Foo' // CHECK-VALIDATION-ONLY-NOT: building module 'Foo' //--- change-same-session.c // Populated module cache in the same build session with changed inputs. // Validation only happens when it's forced for user headers and results in compilation. // RUN: sleep 1 // RUN: touch %t/include/foo.h // RUN: sleep 1 // RUN: %clang @%t/ctx.rsp %t/change-same-session.c -DCTX=1 \ // RUN: -isystem %t/include -fmodules-validate-system-headers \ // RUN: 2>&1 | FileCheck %t/change-same-session.c --check-prefix=CHECK-NO-VALIDATION-OR-BUILD --allow-empty // RUN: %clang @%t/ctx.rsp %t/change-same-session.c -DCTX=2 \ // RUN: -I %t/include -fmodules-validate-system-headers \ // RUN: 2>&1 | FileCheck %t/change-same-session.c --check-prefix=CHECK-VALIDATION-AND-BUILD // RUN: %clang @%t/ctx.rsp %t/change-same-session.c -DCTX=3 \ // RUN: -I %t/include -fmodules-validate-system-headers -Xclang -fno-modules-force-validate-user-headers \ // RUN: 2>&1 | FileCheck %t/change-same-session.c --check-prefix=CHECK-NO-VALIDATION-OR-BUILD --allow-empty #include "foo.h" // CHECK-NO-VALIDATION-OR-BUILD-NOT: validating {{[0-9]+}} input files in module 'Foo' // CHECK-NO-VALIDATION-OR-BUILD-NOT: building module 'Foo' // CHECK-VALIDATION-AND-BUILD: validating {{[0-9]+}} input files in module 'Foo' // CHECK-VALIDATION-AND-BUILD: building module 'Foo' //--- change-new-session.c // Populated module cache in a new build session with changed inputs. // All configurations validate and recompile. // RUN: sleep 1 // RUN: touch %t/include/foo.h // RUN: sleep 1 // RUN: touch %t/module-cache/session.timestamp // RUN: sleep 1 // RUN: %clang @%t/ctx.rsp %t/change-new-session.c -DCTX=1 \ // RUN: -isystem %t/include -fmodules-validate-system-headers \ // RUN: 2>&1 | FileCheck %t/change-new-session.c --check-prefixes=CHECK,CHECK-VALIDATE-ONCE // NOTE: Forced user headers validation causes redundant validation of the just-built module. // RUN: %clang @%t/ctx.rsp %t/change-new-session.c -DCTX=2 \ // RUN: -I %t/include -fmodules-validate-system-headers \ // RUN: 2>&1 | FileCheck %t/change-new-session.c --check-prefixes=CHECK,CHECK-FORCE-VALIDATE-TWICE // RUN: %clang @%t/ctx.rsp %t/change-new-session.c -DCTX=3 \ // RUN: -I %t/include -fmodules-validate-system-headers -Xclang -fno-modules-force-validate-user-headers \ // RUN: 2>&1 | FileCheck %t/change-new-session.c --check-prefixes=CHECK,CHECK-VALIDATE-ONCE #include "foo.h" // CHECK: validating {{[0-9]+}} input files in module 'Foo' // CHECK: building module 'Foo' // CHECK-VALIDATE-ONCE-NOT: validating {{[0-9]+}} input files in module 'Foo' // CHECK-FORCE-VALIDATE-TWICE: validating {{[0-9]+}} input files in module 'Foo' //--- no-change-new-session-twice.c // Populated module cache in a new build session with unchanged inputs. // At first, all configurations validate but don't recompile. // RUN: sleep 1 // RUN: touch %t/module-cache/session.timestamp // RUN: sleep 1 // RUN: %clang @%t/ctx.rsp %t/no-change-new-session-twice.c -DCTX=1 \ // RUN: -isystem %t/include -fmodules-validate-system-headers \ // RUN: 2>&1 | FileCheck %t/no-change-new-session-twice.c --check-prefix=CHECK-ONCE // RUN: %clang @%t/ctx.rsp %t/no-change-new-session-twice.c -DCTX=2 \ // RUN: -I %t/include -fmodules-validate-system-headers \ // RUN: 2>&1 | FileCheck %t/no-change-new-session-twice.c --check-prefix=CHECK-ONCE // RUN: %clang @%t/ctx.rsp %t/no-change-new-session-twice.c -DCTX=3 \ // RUN: -I %t/include -fmodules-validate-system-headers -Xclang -fno-modules-force-validate-user-headers \ // RUN: 2>&1 | FileCheck %t/no-change-new-session-twice.c --check-prefix=CHECK-ONCE // // Then, only the forced user header validation performs redundant validation (but no compilation). // All other configurations do not validate and do not compile. // RUN: sleep 1 // RUN: %clang @%t/ctx.rsp %t/no-change-new-session-twice.c -DCTX=1 \ // RUN: -isystem %t/include -fmodules-validate-system-headers \ // RUN: 2>&1 | FileCheck %t/no-change-new-session-twice.c --check-prefix=CHECK-NOT-TWICE --allow-empty // NOTE: Forced user headers validation causes redundant validation of the just-validated module. // RUN: %clang @%t/ctx.rsp %t/no-change-new-session-twice.c -DCTX=2 \ // RUN: -I %t/include -fmodules-validate-system-headers \ // RUN: 2>&1 | FileCheck %t/no-change-new-session-twice.c --check-prefix=CHECK-ONCE // RUN: %clang @%t/ctx.rsp %t/no-change-new-session-twice.c -DCTX=3 \ // RUN: -I %t/include -fmodules-validate-system-headers -Xclang -fno-modules-force-validate-user-headers \ // RUN: 2>&1 | FileCheck %t/no-change-new-session-twice.c --check-prefix=CHECK-NOT-TWICE --allow-empty #include "foo.h" // CHECK-ONCE: validating {{[0-9]+}} input files in module 'Foo' // CHECK-ONCE-NOT: building module 'Foo' // CHECK-NOT-TWICE-NOT: validating {{[0-9]+}} input files in module 'Foo' // CHECK-NOT-TWICE-NOT: building module 'Foo'