From: Petr Hosek Date: Thu, 31 Jan 2019 07:12:43 +0000 (+0000) Subject: Revert "[CMake] Unify scripts for generating VCS headers" X-Git-Tag: llvmorg-10-init~13184 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=12062e06674070df972a3a561705f227e733cb06;p=platform%2Fupstream%2Fllvm.git Revert "[CMake] Unify scripts for generating VCS headers" This reverts commits r352729 and r352731: this broke Sanitizer Windows bots llvm-svn: 352733 --- diff --git a/clang/lib/Basic/CMakeLists.txt b/clang/lib/Basic/CMakeLists.txt index 7e1543b..8b3aa0f 100644 --- a/clang/lib/Basic/CMakeLists.txt +++ b/clang/lib/Basic/CMakeLists.txt @@ -4,34 +4,45 @@ set(LLVM_LINK_COMPONENTS Support ) -find_first_existing_vc_file("${LLVM_MAIN_SRC_DIR}" llvm_vc) -find_first_existing_vc_file("${CLANG_SOURCE_DIR}" clang_vc) +find_first_existing_vc_file(llvm_vc "${LLVM_MAIN_SRC_DIR}") +find_first_existing_vc_file(clang_vc "${CLANG_SOURCE_DIR}") # The VC revision include that we want to generate. -set(version_inc "${CMAKE_CURRENT_BINARY_DIR}/VCSRevision.h") +set(version_inc "${CMAKE_CURRENT_BINARY_DIR}/SVNVersion.inc") -set(get_svn_script "${LLVM_CMAKE_PATH}/GenerateVersionFromVCS.cmake") +set(get_svn_script "${LLVM_CMAKE_PATH}/GetSVN.cmake") -if(llvm_vc) - set(llvm_source_dir ${LLVM_MAIN_SRC_DIR}) -endif() -if(clang_vc) - set(clang_source_dir ${CLANG_SOURCE_DIR}) -endif() +if(DEFINED llvm_vc AND DEFINED clang_vc) + # Create custom target to generate the VC revision include. + add_custom_command(OUTPUT "${version_inc}" + DEPENDS "${llvm_vc}" "${clang_vc}" "${get_svn_script}" + COMMAND + ${CMAKE_COMMAND} "-DFIRST_SOURCE_DIR=${LLVM_MAIN_SRC_DIR}" + "-DFIRST_NAME=LLVM" + "-DSECOND_SOURCE_DIR=${CLANG_SOURCE_DIR}" + "-DSECOND_NAME=SVN" + "-DHEADER_FILE=${version_inc}" + -P "${get_svn_script}") -# Create custom target to generate the VC revision include. -add_custom_command(OUTPUT "${version_inc}" - DEPENDS "${llvm_vc}" "${clang_vc}" "${get_svn_script}" - COMMAND ${CMAKE_COMMAND} "-DNAMES=LLVM\;CLANG" - "-DLLVM_SOURCE_DIR=${llvm_source_dir}" - "-DCLANG_SOURCE_DIR=${clang_source_dir}" - "-DHEADER_FILE=${version_inc}" - -P "${get_svn_script}") + # Mark the generated header as being generated. + set_source_files_properties("${version_inc}" + PROPERTIES GENERATED TRUE + HEADER_FILE_ONLY TRUE) -# Mark the generated header as being generated. -set_source_files_properties("${version_inc}" - PROPERTIES GENERATED TRUE - HEADER_FILE_ONLY TRUE) + # Tell Version.cpp that it needs to build with -DHAVE_SVN_VERSION_INC. + set_source_files_properties(Version.cpp + PROPERTIES COMPILE_DEFINITIONS "HAVE_SVN_VERSION_INC") +else() + # Not producing a VC revision include. + set(version_inc) + + # Being able to force-set the SVN revision in cases where it isn't available + # is useful for performance tracking, and matches compatibility from autoconf. + if(SVN_REVISION) + set_source_files_properties(Version.cpp + PROPERTIES COMPILE_DEFINITIONS "SVN_REVISION=\"${SVN_REVISION}\"") + endif() +endif() add_clang_library(clangBasic Attributes.cpp diff --git a/clang/lib/Basic/Version.cpp b/clang/lib/Basic/Version.cpp index bbaeafe..4ed081d 100644 --- a/clang/lib/Basic/Version.cpp +++ b/clang/lib/Basic/Version.cpp @@ -10,7 +10,6 @@ // //===----------------------------------------------------------------------===// -#include "VCSRevision.h" #include "clang/Basic/Version.h" #include "clang/Basic/LLVM.h" #include "clang/Config/config.h" @@ -18,19 +17,23 @@ #include #include +#ifdef HAVE_SVN_VERSION_INC +# include "SVNVersion.inc" +#endif + namespace clang { std::string getClangRepositoryPath() { #if defined(CLANG_REPOSITORY_STRING) return CLANG_REPOSITORY_STRING; #else -#ifdef CLANG_REPOSITORY - StringRef URL(CLANG_REPOSITORY); +#ifdef SVN_REPOSITORY + StringRef URL(SVN_REPOSITORY); #else StringRef URL(""); #endif - // If the CLANG_REPOSITORY is empty, try to use the SVN keyword. This helps us + // If the SVN_REPOSITORY is empty, try to use the SVN keyword. This helps us // pick up a tag in an SVN export, for example. StringRef SVNRepository("$URL$"); if (URL.empty()) { @@ -68,8 +71,8 @@ std::string getLLVMRepositoryPath() { } std::string getClangRevision() { -#ifdef CLANG_REVISION - return CLANG_REVISION; +#ifdef SVN_REVISION + return SVN_REVISION; #else return ""; #endif diff --git a/lldb/source/CMakeLists.txt b/lldb/source/CMakeLists.txt index fac4913..e9d8e79 100644 --- a/lldb/source/CMakeLists.txt +++ b/lldb/source/CMakeLists.txt @@ -15,26 +15,29 @@ foreach(file endif() endforeach() -set(version_inc "${CMAKE_CURRENT_BINARY_DIR}/VCSRevision.h") -set(get_svn_script "${LLVM_CMAKE_PATH}/GenerateVersionFromVCS.cmake") +if(DEFINED lldb_vc) + set(version_inc "${CMAKE_CURRENT_BINARY_DIR}/SVNVersion.inc") + set(get_svn_script "${LLVM_CMAKE_PATH}/GetSVN.cmake") -if(lldb_vc) - set(lldb_source_dir ${LLDB_SOURCE_DIR}) -endif() - -add_custom_command(OUTPUT "${version_inc}" - DEPENDS "${lldb_vc}" "${get_svn_script}" - COMMAND ${CMAKE_COMMAND} "-DNAMES=LLDB" - "-DLLDB_SOURCE_DIR=${LLDB_SOURCE_DIR}" - "-DHEADER_FILE=${version_inc}" - -P "${get_svn_script}") + # Create custom target to generate the VC revision include. + add_custom_command(OUTPUT "${version_inc}" + DEPENDS "${lldb_vc}" "${get_svn_script}" + COMMAND + ${CMAKE_COMMAND} "-DFIRST_SOURCE_DIR=${LLDB_SOURCE_DIR}" + "-DFIRST_NAME=LLDB" + "-DHEADER_FILE=${version_inc}" + -P "${get_svn_script}") -# Mark the generated header as being generated. -set_source_files_properties("${version_inc}" - PROPERTIES GENERATED TRUE - HEADER_FILE_ONLY TRUE) + # Mark the generated header as being generated. + set_source_files_properties("${version_inc}" + PROPERTIES GENERATED TRUE + HEADER_FILE_ONLY TRUE) -list(APPEND lldbBase_SOURCES ${version_inc}) + # Tell Version.cpp that it needs to build with -DHAVE_SVN_VERSION_INC. + set_property(SOURCE lldb.cpp APPEND PROPERTY + COMPILE_DEFINITIONS "HAVE_SVN_VERSION_INC") + list(APPEND lldbBase_SOURCES ${version_inc}) +endif() if(APPLE) set(apple_version_inc "${CMAKE_CURRENT_BINARY_DIR}/AppleVersion.inc") diff --git a/lldb/source/lldb.cpp b/lldb/source/lldb.cpp index 8613d03..2bf6a7a 100644 --- a/lldb/source/lldb.cpp +++ b/lldb/source/lldb.cpp @@ -11,9 +11,12 @@ using namespace lldb; using namespace lldb_private; -#include "VCSRevision.h" #include "clang/Basic/Version.h" +#ifdef HAVE_SVN_VERSION_INC +#include "SVNVersion.inc" +#endif + #ifdef HAVE_APPLE_VERSION_INC #include "AppleVersion.inc" #endif diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index d16a70c..168ec6a 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -200,7 +200,7 @@ endif() include(VersionFromVCS) option(LLVM_APPEND_VC_REV - "Embed the version control system revision in LLVM" ON) + "Embed the version control system revision id in LLVM" ON) set(PACKAGE_NAME LLVM) set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") @@ -752,12 +752,13 @@ set(LLVM_SRPM_USER_BINARY_SPECFILE ${CMAKE_CURRENT_SOURCE_DIR}/llvm.spec.in set(LLVM_SRPM_BINARY_SPECFILE ${CMAKE_CURRENT_BINARY_DIR}/llvm.spec) set(LLVM_SRPM_DIR "${CMAKE_CURRENT_BINARY_DIR}/srpm") -get_source_info(${CMAKE_CURRENT_SOURCE_DIR} revision repository) -string(LENGTH "${revision}" revision_length) -if(revision MATCHES "^[0-9]+$" AND revision_length LESS 40) - set(LLVM_RPM_SPEC_REVISION "r${revision}") -else() - set(LLVM_RPM_SPEC_REVISION "${revision}") +# SVN_REVISION and GIT_COMMIT get set by the call to add_version_info_from_vcs. +# DUMMY_VAR contains a version string which we don't care about. +add_version_info_from_vcs(DUMMY_VAR) +if ( SVN_REVISION ) + set(LLVM_RPM_SPEC_REVISION "r${SVN_REVISION}") +elseif ( GIT_COMMIT ) + set (LLVM_RPM_SPEC_REVISION "g${GIT_COMMIT}") endif() configure_file( diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake index d4d5209..39781bf 100644 --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -1707,35 +1707,35 @@ function(setup_dependency_debugging name) set_target_properties(${name} PROPERTIES RULE_LAUNCH_COMPILE ${sandbox_command}) endfunction() -function(find_first_existing_vc_file path out_var) - if(EXISTS "${path}/.svn") - set(svn_files - "${path}/.svn/wc.db" # SVN 1.7 - "${path}/.svn/entries" # SVN 1.6 - ) - foreach(file IN LISTS svn_files) - if(EXISTS "${file}") - set(${out_var} "${file}" PARENT_SCOPE) - return() - endif() - endforeach() - else() - find_package(Git) - if(GIT_FOUND) - execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --git-dir - WORKING_DIRECTORY ${path} - RESULT_VARIABLE git_result - OUTPUT_VARIABLE git_output - ERROR_QUIET) - if(git_result EQUAL 0) - string(STRIP "${git_output}" git_output) - 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" "") - endif() - set(${out_var} "${git_dir}/logs/HEAD" PARENT_SCOPE) - endif() +# Figure out if we can track VC revisions. +function(find_first_existing_file out_var) + foreach(file ${ARGN}) + if(EXISTS "${file}") + set(${out_var} "${file}" PARENT_SCOPE) + return() endif() - endif() + endforeach() endfunction() + +macro(find_first_existing_vc_file out_var path) + find_program(git_executable NAMES git git.exe git.cmd) + # Run from a subdirectory to force git to print an absolute path. + execute_process(COMMAND ${git_executable} rev-parse --git-dir + WORKING_DIRECTORY ${path}/cmake + RESULT_VARIABLE git_result + OUTPUT_VARIABLE git_dir + ERROR_QUIET) + if(git_result EQUAL 0) + string(STRIP "${git_dir}" git_dir) + set(${out_var} "${git_dir}/logs/HEAD") + # 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" "") + endif() + else() + find_first_existing_file(${out_var} + "${path}/.svn/wc.db" # SVN 1.7 + "${path}/.svn/entries" # SVN 1.6 + ) + endif() +endmacro() diff --git a/llvm/cmake/modules/GenerateVersionFromCVS.cmake b/llvm/cmake/modules/GenerateVersionFromCVS.cmake new file mode 100644 index 0000000..6b1c719 --- /dev/null +++ b/llvm/cmake/modules/GenerateVersionFromCVS.cmake @@ -0,0 +1,39 @@ +# CMake project that writes Subversion revision information to a header. +# +# Input variables: +# SRC - Source directory +# HEADER_FILE - The header file to write +# +# The output header will contain macros FIRST_REPOSITORY and FIRST_REVISION, +# and SECOND_REPOSITORY and SECOND_REVISION if requested, where "FIRST" and +# "SECOND" are substituted with the names specified in the input variables. + + + +# Chop off cmake/modules/GetSVN.cmake +get_filename_component(LLVM_DIR "${CMAKE_SCRIPT_MODE_FILE}" PATH) +get_filename_component(LLVM_DIR "${LLVM_DIR}" PATH) +get_filename_component(LLVM_DIR "${LLVM_DIR}" PATH) + +set(CMAKE_MODULE_PATH + ${CMAKE_MODULE_PATH} + "${LLVM_DIR}/cmake/modules") +include(VersionFromVCS) + +# Handle strange terminals +set(ENV{TERM} "dumb") + +function(append_info name path) + add_version_info_from_vcs(REVISION ${path}) + string(STRIP "${REVISION}" REVISION) + file(APPEND "${HEADER_FILE}.txt" + "#define ${name} \"${REVISION}\"\n") +endfunction() + +append_info(${NAME} "${SOURCE_DIR}") + +# Copy the file only if it has changed. +execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${HEADER_FILE}.txt" "${HEADER_FILE}") +file(REMOVE "${HEADER_FILE}.txt") + diff --git a/llvm/cmake/modules/GenerateVersionFromVCS.cmake b/llvm/cmake/modules/GenerateVersionFromVCS.cmake deleted file mode 100644 index a38480c..0000000 --- a/llvm/cmake/modules/GenerateVersionFromVCS.cmake +++ /dev/null @@ -1,53 +0,0 @@ -# CMake script that writes version control information to a header. -# -# Input variables: -# NAMES - A list of names for each of the source directories. -# _SOURCE_DIR - A path to source directory for each name in NAMES. -# HEADER_FILE - The header file to write -# -# The output header will contain macros _REPOSITORY and _REVISION, -# where "" is substituted with the names specified in the input variables, -# for each of the _SOURCE_DIR given. - -get_filename_component(LLVM_DIR "${CMAKE_SCRIPT_MODE_FILE}" PATH) -get_filename_component(LLVM_DIR "${LLVM_DIR}" PATH) -get_filename_component(LLVM_DIR "${LLVM_DIR}" PATH) - -list(APPEND CMAKE_MODULE_PATH "${LLVM_DIR}/cmake/modules") - -include(VersionFromVCS) - -# Handle strange terminals -set(ENV{TERM} "dumb") - -function(append_info name path) - if(path) - get_source_info("${path}" revision repository) - endif() - if(revision) - file(APPEND "${HEADER_FILE}.tmp" - "#define ${name}_REVISION \"${revision}\"\n") - else() - file(APPEND "${HEADER_FILE}.tmp" - "#undef ${name}_REVISION\n") - endif() - if(repository) - file(APPEND "${HEADER_FILE}.tmp" - "#define ${name}_REPOSITORY \"${repository}\"\n") - else() - file(APPEND "${HEADER_FILE}.tmp" - "#undef ${name}_REPOSITORY\n") - endif() -endfunction() - -foreach(name IN LISTS NAMES) - if(NOT DEFINED ${name}_SOURCE_DIR) - message(FATAL_ERROR "${name}_SOURCE_DIR is not defined") - endif() - append_info(${name} "${${name}_SOURCE_DIR}") -endforeach() - -# Copy the file only if it has changed. -execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different - "${HEADER_FILE}.tmp" "${HEADER_FILE}") -file(REMOVE "${HEADER_FILE}.tmp") diff --git a/llvm/cmake/modules/GetSVN.cmake b/llvm/cmake/modules/GetSVN.cmake new file mode 100644 index 0000000..f729395 --- /dev/null +++ b/llvm/cmake/modules/GetSVN.cmake @@ -0,0 +1,141 @@ +# CMake project that writes Subversion revision information to a header. +# +# Input variables: +# SOURCE_DIRS - A list of source directories. +# NAMES - A list of macro prefixes for each of the source directories. +# HEADER_FILE - The header file to write +# +# The output header will contain macros _REPOSITORY and _REVISION, +# where "" and is substituted with the names specified in the input +# variables, for each of the SOURCE_DIRS given. + +# Chop off cmake/modules/GetSVN.cmake +get_filename_component(LLVM_DIR "${CMAKE_SCRIPT_MODE_FILE}" PATH) +get_filename_component(LLVM_DIR "${LLVM_DIR}" PATH) +get_filename_component(LLVM_DIR "${LLVM_DIR}" PATH) + +# Handle strange terminals +set(ENV{TERM} "dumb") + +macro(get_source_info_svn path revision repository) + # If svn is a bat file, find_program(Subversion) doesn't find it. + # Explicitly search for that here; Subversion_SVN_EXECUTABLE will override + # the find_program call in FindSubversion.cmake. + find_program(Subversion_SVN_EXECUTABLE NAMES svn svn.bat) + + # FindSubversion does not work with symlinks. See PR 8437 + if (NOT IS_SYMLINK "${path}") + find_package(Subversion) + endif() + if (Subversion_FOUND) + subversion_wc_info( ${path} Project ) + if (Project_WC_REVISION) + set(${revision} ${Project_WC_REVISION} PARENT_SCOPE) + endif() + if (Project_WC_URL) + set(${repository} ${Project_WC_URL} PARENT_SCOPE) + endif() + endif() +endmacro() + +macro(get_source_info_git_svn path revision repository) + find_program(git_executable NAMES git git.exe git.cmd) + if (git_executable) + execute_process(COMMAND ${git_executable} svn info + WORKING_DIRECTORY ${path} + TIMEOUT 5 + RESULT_VARIABLE git_result + OUTPUT_VARIABLE git_output) + if (git_result EQUAL 0) + string(REGEX REPLACE "^(.*\n)?Revision: ([^\n]+).*" + "\\2" git_svn_rev "${git_output}") + set(${revision} ${git_svn_rev} PARENT_SCOPE) + string(REGEX REPLACE "^(.*\n)?URL: ([^\n]+).*" + "\\2" git_url "${git_output}") + set(${repository} ${git_url} PARENT_SCOPE) + endif() + endif() +endmacro() + +macro(get_source_info_git path revision repository) + find_program(git_executable NAMES git git.exe git.cmd) + if (git_executable) + execute_process(COMMAND ${git_executable} log -1 --pretty=format:%H + WORKING_DIRECTORY ${path} + TIMEOUT 5 + RESULT_VARIABLE git_result + OUTPUT_VARIABLE git_output) + if (git_result EQUAL 0) + set(${revision} ${git_output} PARENT_SCOPE) + endif() + execute_process(COMMAND ${git_executable} remote -v + WORKING_DIRECTORY ${path} + TIMEOUT 5 + RESULT_VARIABLE git_result + OUTPUT_VARIABLE git_output) + if (git_result EQUAL 0) + string(REGEX REPLACE "^(.*\n)?[^ \t]+[ \t]+([^ \t\n]+)[ \t]+\\(fetch\\).*" + "\\2" git_url "${git_output}") + set(${repository} "${git_url}" PARENT_SCOPE) + endif() + endif() +endmacro() + +function(get_source_info path revision repository) + if (EXISTS "${path}/.svn") + get_source_info_svn("${path}" revision repository) + elseif (EXISTS "${path}/.git/svn/refs") + get_source_info_git_svn("${path}" revision repository) + elseif (EXISTS "${path}/.git") + get_source_info_git("${path}" revision repository) + endif() +endfunction() + +function(append_info name path) + get_source_info("${path}" revision repository) + string(STRIP "${revision}" revision) + string(STRIP "${repository}" repository) + file(APPEND "${HEADER_FILE}.txt" + "#define ${name}_REVISION \"${revision}\"\n") + file(APPEND "${HEADER_FILE}.txt" + "#define ${name}_REPOSITORY \"${repository}\"\n") +endfunction() + +function(validate_inputs source_dirs names) + list(LENGTH source_dirs source_dirs_length) + list(LENGTH names names_length) + if (NOT source_dirs_length EQUAL names_length) + message(FATAL_ERROR + "GetSVN.cmake takes two arguments: a list of source directories, " + "and a list of names. Expected two lists must be of equal length, " + "but got ${source_dirs_length} source directories and " + "${names_length} names.") + endif() +endfunction() + +if (DEFINED SOURCE_DIRS AND DEFINED NAMES) + validate_inputs("${SOURCE_DIRS}" "${NAMES}") + + list(LENGTH SOURCE_DIRS source_dirs_length) + math(EXPR source_dirs_max_index ${source_dirs_length}-1) + foreach(index RANGE ${source_dirs_max_index}) + list(GET SOURCE_DIRS ${index} source_dir) + list(GET NAMES ${index} name) + append_info(${name} ${source_dir}) + endforeach() +endif() + +# Allow -DFIRST_SOURCE_DIR arguments until Clang migrates to the new +# -DSOURCE_DIRS argument. +if(DEFINED FIRST_SOURCE_DIR) + append_info(${FIRST_NAME} "${FIRST_SOURCE_DIR}") + if(DEFINED SECOND_SOURCE_DIR) + append_info(${SECOND_NAME} "${SECOND_SOURCE_DIR}") + endif() +endif() + +# Copy the file only if it has changed. +execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${HEADER_FILE}.txt" "${HEADER_FILE}") +file(REMOVE "${HEADER_FILE}.txt") + diff --git a/llvm/cmake/modules/VersionFromVCS.cmake b/llvm/cmake/modules/VersionFromVCS.cmake index 9826ce6..552fe77 100644 --- a/llvm/cmake/modules/VersionFromVCS.cmake +++ b/llvm/cmake/modules/VersionFromVCS.cmake @@ -3,88 +3,90 @@ # existence of certain subdirectories under SOURCE_DIR (if provided as an # extra argument, otherwise uses CMAKE_CURRENT_SOURCE_DIR). -function(get_source_info_svn path revision repository) - # If svn is a bat file, find_program(Subversion) doesn't find it. - # Explicitly search for that here; Subversion_SVN_EXECUTABLE will override - # the find_program call in FindSubversion.cmake. - find_program(Subversion_SVN_EXECUTABLE NAMES svn svn.bat) - find_package(Subversion) - - # Subversion module does not work with symlinks, see PR8437. - get_filename_component(realpath ${path} REALPATH) - if(Subversion_FOUND) - subversion_wc_info(${realpath} Project) - if(Project_WC_REVISION) - set(${revision} ${Project_WC_REVISION} PARENT_SCOPE) +function(add_version_info_from_vcs VERS) + SET(SOURCE_DIR ${ARGV1}) + if("${SOURCE_DIR}" STREQUAL "") + SET(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + endif() + string(REPLACE "svn" "" result "${${VERS}}") + if( EXISTS "${SOURCE_DIR}/.svn" ) + set(result "${result}svn") + # FindSubversion does not work with symlinks. See PR 8437 + if( NOT IS_SYMLINK "${SOURCE_DIR}" ) + find_package(Subversion) endif() - if(Project_WC_URL) - set(${repository} ${Project_WC_URL} PARENT_SCOPE) + if( Subversion_FOUND ) + subversion_wc_info( ${SOURCE_DIR} Project ) + if( Project_WC_REVISION ) + set(SVN_REVISION ${Project_WC_REVISION} PARENT_SCOPE) + set(result "${result}-r${Project_WC_REVISION}") + endif() + if( Project_WC_URL ) + set(LLVM_REPOSITORY ${Project_WC_URL} PARENT_SCOPE) + endif() endif() - endif() -endfunction() + else() + find_program(git_executable NAMES git git.exe git.cmd) -function(get_source_info_git path revision repository) - find_package(Git) - if(GIT_FOUND) - execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --git-dir - WORKING_DIRECTORY ${path} - RESULT_VARIABLE git_result - OUTPUT_VARIABLE git_output - ERROR_QUIET) - if(git_result EQUAL 0) - string(STRIP "${git_output}" git_output) - get_filename_component(git_dir ${git_output} ABSOLUTE BASE_DIR ${path}) - if(EXISTS "${git_dir}/svn/refs") - execute_process(COMMAND ${GIT_EXECUTABLE} svn info - WORKING_DIRECTORY ${path} - RESULT_VARIABLE git_result - OUTPUT_VARIABLE git_output) - if(git_result EQUAL 0) - string(REGEX REPLACE "^(.*\n)?Revision: ([^\n]+).*" - "\\2" git_svn_rev "${git_output}") - set(${revision} ${git_svn_rev} PARENT_SCOPE) - string(REGEX REPLACE "^(.*\n)?URL: ([^\n]+).*" - "\\2" git_url "${git_output}") - set(${repository} ${git_url} PARENT_SCOPE) - endif() - else() - execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD - WORKING_DIRECTORY ${path} - RESULT_VARIABLE git_result - OUTPUT_VARIABLE git_output) - if(git_result EQUAL 0) - string(STRIP "${git_output}" git_output) - set(${revision} ${git_output} PARENT_SCOPE) - endif() - execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref --symbolic-full-name @{upstream} - WORKING_DIRECTORY ${path} - RESULT_VARIABLE git_result - OUTPUT_VARIABLE git_output) - if(git_result EQUAL 0) - string(REPLACE "/" ";" branch ${git_output}) - list(GET branch 0 remote) - execute_process(COMMAND ${GIT_EXECUTABLE} remote get-url ${remote} - WORKING_DIRECTORY ${path} + if( git_executable ) + # Run from a subdirectory to force git to print an absoute path. + execute_process(COMMAND ${git_executable} rev-parse --git-dir + WORKING_DIRECTORY ${SOURCE_DIR}/cmake + RESULT_VARIABLE git_result + OUTPUT_VARIABLE git_dir + ERROR_QUIET) + if(git_result EQUAL 0) + # Try to get a ref-id + string(STRIP "${git_dir}" git_dir) + set(result "${result}git") + if( EXISTS ${git_dir}/svn ) + # Get the repository URL + execute_process(COMMAND + ${git_executable} svn info + WORKING_DIRECTORY ${SOURCE_DIR} + TIMEOUT 5 RESULT_VARIABLE git_result - OUTPUT_VARIABLE git_output) - if(git_result EQUAL 0) - string(STRIP "${git_output}" git_output) - set(${repository} ${git_output} PARENT_SCOPE) + OUTPUT_VARIABLE git_output + ERROR_QUIET) + if( git_result EQUAL 0 ) + string(REGEX MATCH "URL: ([^ \n]*)" svn_url ${git_output}) + if(svn_url) + set(LLVM_REPOSITORY ${CMAKE_MATCH_1} PARENT_SCOPE) + endif() endif() + + # Get the svn revision number for this git commit if one exists. + execute_process(COMMAND ${git_executable} svn find-rev HEAD + WORKING_DIRECTORY ${SOURCE_DIR} + TIMEOUT 5 + RESULT_VARIABLE git_result + OUTPUT_VARIABLE git_head_svn_rev_number + OUTPUT_STRIP_TRAILING_WHITESPACE) + if( git_result EQUAL 0 AND git_output) + set(SVN_REVISION ${git_head_svn_rev_number} PARENT_SCOPE) + set(git_svn_rev "-svn-${git_head_svn_rev_number}") + else() + set(git_svn_rev "") + endif() + endif() + + # Get the git ref id + execute_process(COMMAND + ${git_executable} rev-parse --short HEAD + WORKING_DIRECTORY ${SOURCE_DIR} + TIMEOUT 5 + RESULT_VARIABLE git_result + OUTPUT_VARIABLE git_ref_id + OUTPUT_STRIP_TRAILING_WHITESPACE) + + if( git_result EQUAL 0 ) + set(GIT_COMMIT ${git_ref_id} PARENT_SCOPE) + set(result "${result}${git_svn_rev}-${git_ref_id}") else() - set(${repository} ${path} PARENT_SCOPE) + set(result "${result}${git_svn_rev}") endif() endif() endif() endif() -endfunction() - -function(get_source_info path revision repository) - if(EXISTS "${path}/.svn") - get_source_info_svn("${path}" revision_info repository_info) - else() - get_source_info_git("${path}" revision_info repository_info) - endif() - set(${repository} "${repository_info}" PARENT_SCOPE) - set(${revision} "${revision_info}" PARENT_SCOPE) -endfunction() + set(${VERS} ${result} PARENT_SCOPE) +endfunction(add_version_info_from_vcs) diff --git a/llvm/include/llvm/Support/CMakeLists.txt b/llvm/include/llvm/Support/CMakeLists.txt index b264d2e..bba962a 100644 --- a/llvm/include/llvm/Support/CMakeLists.txt +++ b/llvm/include/llvm/Support/CMakeLists.txt @@ -1,21 +1,38 @@ -find_first_existing_vc_file("${LLVM_MAIN_SRC_DIR}" llvm_vc) +find_first_existing_vc_file(llvm_vc "${LLVM_MAIN_SRC_DIR}") # The VC revision include that we want to generate. set(version_inc "${CMAKE_CURRENT_BINARY_DIR}/VCSRevision.h") -set(get_svn_script "${LLVM_CMAKE_PATH}/GenerateVersionFromVCS.cmake") +set(get_svn_script "${LLVM_CMAKE_PATH}/GenerateVersionFromCVS.cmake") -if(llvm_vc AND LLVM_APPEND_VC_REV) - set(llvm_source_dir ${LLVM_MAIN_SRC_DIR}) -endif() +file(WRITE "${version_inc}.undef" "#undef LLVM_REVISION\n") +if((DEFINED llvm_vc) AND LLVM_APPEND_VC_REV) + + execute_process(COMMAND ${CMAKE_COMMAND} -E compare_files + "${version_inc}.undef" "${version_inc}" + RESULT_VARIABLE files_not_equal + OUTPUT_QUIET + ERROR_QUIET) + # Remove ${version_inc} if it doesn't define a revision. This will force it + # to be regenerated when toggling LLVM_APPEND_VC_REV from OFF to ON. + if(NOT files_not_equal) + file(REMOVE "${version_inc}") + endif() -# Create custom target to generate the VC revision include. -add_custom_command(OUTPUT "${version_inc}" - DEPENDS "${llvm_vc}" "${get_svn_script}" - COMMAND ${CMAKE_COMMAND} "-DNAMES=LLVM" - "-DLLVM_SOURCE_DIR=${llvm_source_dir}" - "-DHEADER_FILE=${version_inc}" - -P "${get_svn_script}") + # Create custom target to generate the VC revision include. + add_custom_command(OUTPUT "${version_inc}" + DEPENDS "${llvm_vc}" "${get_svn_script}" + COMMAND + ${CMAKE_COMMAND} "-DSOURCE_DIR=${LLVM_MAIN_SRC_DIR}" + "-DNAME=LLVM_REVISION" + "-DHEADER_FILE=${version_inc}" + -P "${get_svn_script}") +else() + # Make sure ${version_inc} doesn't define a revision + execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${version_inc}.undef" "${version_inc}") +endif() +file(REMOVE "${version_inc}.undef") # Mark the generated header as being generated. set_source_files_properties("${version_inc}"