diff --git a/Source/cmFileAPI.cxx b/Source/cmFileAPI.cxx index eec9ecf5bc..d3104bcb07 100644 --- a/Source/cmFileAPI.cxx +++ b/Source/cmFileAPI.cxx @@ -72,7 +72,8 @@ void cmFileAPI::ReadQueries() { std::string const query_dir = cmStrCat(this->APIv1, "/query"); std::string const user_query_dir = cmStrCat(this->UserAPIv1, "/query"); - this->QueryExists = cmSystemTools::FileIsDirectory(query_dir); + this->QueryExists = + this->QueryExists || cmSystemTools::FileIsDirectory(query_dir); if (!this->UserAPIv1.empty()) { this->QueryExists = this->QueryExists || cmSystemTools::FileIsDirectory(user_query_dir); diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 95dce3a2ef..40cb855c64 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -738,6 +738,8 @@ bool cmake::SetCacheArgs(std::vector const& args) // Resolve script path specified on command line // relative to $PWD. auto path = cmSystemTools::ToNormalizedPathOnDisk(value); + state->InitializeFileAPI(); + state->InitializeInstrumentation(); state->ReadListFile(args, path); return true; } }, @@ -2688,13 +2690,9 @@ int cmake::ActualConfigure() } #if !defined(CMAKE_BOOTSTRAP) - this->FileAPI = cm::make_unique(this); + this->InitializeFileAPI(); this->FileAPI->ReadQueries(); - - this->Instrumentation = cm::make_unique( - this->State->GetBinaryDirectory(), - cmInstrumentation::LoadQueriesAfter::No); - this->Instrumentation->ClearGeneratedQueries(); + this->InitializeInstrumentation(); if (!this->GetIsInTryCompile()) { this->TruncateOutputLog("CMakeConfigureLog.yaml"); @@ -2952,6 +2950,27 @@ void cmake::StopDebuggerIfNeeded(int exitCode) #endif +void cmake::InitializeFileAPI() +{ +#ifndef CMAKE_BOOTSTRAP + if (!this->FileAPI) { + this->FileAPI = cm::make_unique(this); + } +#endif +} + +void cmake::InitializeInstrumentation() +{ +#ifndef CMAKE_BOOTSTRAP + if (!this->Instrumentation) { + this->Instrumentation = cm::make_unique( + this->State->GetBinaryDirectory(), + cmInstrumentation::LoadQueriesAfter::No); + this->Instrumentation->ClearGeneratedQueries(); + } +#endif +} + // handle a command line invocation int cmake::Run(std::vector const& args, bool noconfigure) { diff --git a/Source/cmake.h b/Source/cmake.h index 1dea41ad79..3bef347805 100644 --- a/Source/cmake.h +++ b/Source/cmake.h @@ -694,6 +694,8 @@ public: return this->Instrumentation.get(); } #endif + void InitializeFileAPI(); + void InitializeInstrumentation(); cmState* GetState() const { return this->State.get(); } void SetCurrentSnapshot(cmStateSnapshot const& snapshot) diff --git a/Tests/RunCMake/FileAPI/InitialCache-check.cmake b/Tests/RunCMake/FileAPI/InitialCache-check.cmake new file mode 100644 index 0000000000..3767f15168 --- /dev/null +++ b/Tests/RunCMake/FileAPI/InitialCache-check.cmake @@ -0,0 +1,8 @@ +set(expect + reply + reply/codemodel-v2-[0-9a-f]+.json + .*reply/index-[0-9.T-]+.json.* +) + +# Only need to check for existence. Other tests check the reply contents. +check_api("^${expect}$") diff --git a/Tests/RunCMake/FileAPI/InitialCache-script.cmake b/Tests/RunCMake/FileAPI/InitialCache-script.cmake new file mode 100644 index 0000000000..9d8505fb55 --- /dev/null +++ b/Tests/RunCMake/FileAPI/InitialCache-script.cmake @@ -0,0 +1,5 @@ +cmake_file_api( + QUERY + API_VERSION 1 + CODEMODEL 2 +) diff --git a/Tests/RunCMake/FileAPI/InitialCache.cmake b/Tests/RunCMake/FileAPI/InitialCache.cmake new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Tests/RunCMake/FileAPI/RunCMakeTest.cmake b/Tests/RunCMake/FileAPI/RunCMakeTest.cmake index a74cec99b2..6e0d118943 100644 --- a/Tests/RunCMake/FileAPI/RunCMakeTest.cmake +++ b/Tests/RunCMake/FileAPI/RunCMakeTest.cmake @@ -140,6 +140,7 @@ run_cmake(ClientStateless) run_cmake(MixedStateless) run_cmake(DuplicateStateless) run_cmake(ClientStateful) +run_cmake_with_options(InitialCache -C ${RunCMake_SOURCE_DIR}/InitialCache-script.cmake) run_cmake(ProjectQueryGood) run_cmake(ProjectQueryBad) run_cmake(FailConfigure) diff --git a/Tests/RunCMake/Instrumentation/RunCMakeTest.cmake b/Tests/RunCMake/Instrumentation/RunCMakeTest.cmake index 6809e4719f..5d298aeb57 100644 --- a/Tests/RunCMake/Instrumentation/RunCMakeTest.cmake +++ b/Tests/RunCMake/Instrumentation/RunCMakeTest.cmake @@ -29,6 +29,7 @@ function(instrument test) set(v1 ${RunCMake_TEST_BINARY_DIR}/.cmake/instrumentation-${uuid}/v1) set(v1 ${v1} PARENT_SCOPE) set(query_dir ${CMAKE_CURRENT_LIST_DIR}/query) + configure_file(${RunCMake_SOURCE_DIR}/initial.cmake.in ${RunCMake_BINARY_DIR}/initial.cmake) # Clear previous instrumentation data # We can't use RunCMake_TEST_NO_CLEAN 0 because we preserve queries placed in the build tree after @@ -218,6 +219,10 @@ instrument(cmake-command-bad-arg) instrument(cmake-command-parallel-install BUILD INSTALL TEST INSTALL_PARALLEL DYNAMIC_QUERY CHECK_SCRIPT check-data-dir.cmake) +instrument(cmake-command-initial-cache + CONFIGURE_ARG "-C ${RunCMake_BINARY_DIR}/initial.cmake" + CHECK_SCRIPT check-data-dir.cmake +) instrument(cmake-command-resets-generated COPY_QUERIES_GENERATED CHECK_SCRIPT check-data-dir.cmake diff --git a/Tests/RunCMake/Instrumentation/cmake-command-initial-cache-stderr.txt b/Tests/RunCMake/Instrumentation/cmake-command-initial-cache-stderr.txt new file mode 100644 index 0000000000..a1935a04a7 --- /dev/null +++ b/Tests/RunCMake/Instrumentation/cmake-command-initial-cache-stderr.txt @@ -0,0 +1,4 @@ +CMake Warning \(dev\) at .* + CMake's support for collecting instrumentation data is experimental. It is + meant only for experimentation and feedback to CMake developers. +This warning is for project developers. Use -Wno-dev to suppress it. diff --git a/Tests/RunCMake/Instrumentation/initial.cmake.in b/Tests/RunCMake/Instrumentation/initial.cmake.in new file mode 100644 index 0000000000..0d6285d8e8 --- /dev/null +++ b/Tests/RunCMake/Instrumentation/initial.cmake.in @@ -0,0 +1,5 @@ +set(CMAKE_EXPERIMENTAL_INSTRUMENTATION @uuid@) +cmake_instrumentation( + API_VERSION 1 + DATA_VERSION 1 +) diff --git a/Tests/RunCMake/Instrumentation/query/cmake-command-initial-cache.cmake b/Tests/RunCMake/Instrumentation/query/cmake-command-initial-cache.cmake new file mode 100644 index 0000000000..e69de29bb2