From 760d781e957ff42e3599d01feee615a6063a4264 Mon Sep 17 00:00:00 2001 From: Pushpinder Singh Date: Fri, 29 May 2020 01:22:48 -0400 Subject: [PATCH] Fix build failure when source is read only cmake configure fails when it tries to setup target for llvm_vcsrevision_h This happens only when source is checked out using repo in a read only filesystem, because cmake tries to create `.git/logs/HEAD` file. This patch: 1. Recovers from failure gracefully. 2. Ensures that VCSRevision.h is successfully created and updated in above scenarios. Differential Revision: https://reviews.llvm.org/D79400 --- cmake/modules/AddLLVM.cmake | 8 +++++++- include/llvm/Support/CMakeLists.txt | 13 ++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/cmake/modules/AddLLVM.cmake b/cmake/modules/AddLLVM.cmake index 9f14561fe0a..f16f63c32c9 100644 --- a/cmake/modules/AddLLVM.cmake +++ b/cmake/modules/AddLLVM.cmake @@ -2118,7 +2118,13 @@ function(find_first_existing_vc_file path out_var) get_filename_component(git_dir ${git_output} ABSOLUTE BASE_DIR ${path}) # Some branchless cases (e.g. 'repo') may not yet have .git/logs/HEAD if (NOT EXISTS "${git_dir}/logs/HEAD") - file(WRITE "${git_dir}/logs/HEAD" "") + execute_process(COMMAND ${CMAKE_COMMAND} -E touch HEAD + WORKING_DIRECTORY "${git_dir}/logs" + RESULT_VARIABLE touch_head_result + ERROR_QUIET) + if (NOT touch_head_result EQUAL 0) + return() + endif() endif() set(${out_var} "${git_dir}/logs/HEAD" PARENT_SCOPE) endif() diff --git a/include/llvm/Support/CMakeLists.txt b/include/llvm/Support/CMakeLists.txt index 680be8fdf39..da8a4da443e 100644 --- a/include/llvm/Support/CMakeLists.txt +++ b/include/llvm/Support/CMakeLists.txt @@ -5,12 +5,19 @@ set(version_inc "${CMAKE_CURRENT_BINARY_DIR}/VCSRevision.h") set(generate_vcs_version_script "${LLVM_CMAKE_PATH}/GenerateVersionFromVCS.cmake") -if(llvm_vc AND LLVM_APPEND_VC_REV) +if(LLVM_APPEND_VC_REV) set(llvm_source_dir ${LLVM_MAIN_SRC_DIR}) + + # A fake version file and is not expected to exist. It is being used to + # force regeneration of VCSRevision.h for source directory with no write + # permission available. + if (NOT llvm_vc) + set(fake_version_inc "${CMAKE_CURRENT_BINARY_DIR}/__FakeVCSRevision.h") + endif() endif() # Create custom target to generate the VC revision include. -add_custom_command(OUTPUT "${version_inc}" +add_custom_command(OUTPUT "${version_inc}" "${fake_version_inc}" DEPENDS "${llvm_vc}" "${generate_vcs_version_script}" COMMAND ${CMAKE_COMMAND} "-DNAMES=LLVM" "-DLLVM_SOURCE_DIR=${llvm_source_dir}" @@ -22,5 +29,5 @@ set_source_files_properties("${version_inc}" PROPERTIES GENERATED TRUE HEADER_FILE_ONLY TRUE) -add_custom_target(llvm_vcsrevision_h DEPENDS "${version_inc}") +add_custom_target(llvm_vcsrevision_h ALL DEPENDS "${version_inc}" "${fake_version_inc}") set_target_properties(llvm_vcsrevision_h PROPERTIES FOLDER "Misc")