Skip to content

Commit

Permalink
[CMake] Unify scripts for generating VCS headers
Browse files Browse the repository at this point in the history
Previously, there were two different scripts for generating VCS headers:
one used by LLVM and one used by Clang and lldb. They were both similar,
but different. They were both broken in their own ways, for example the
one used by Clang didn't properly handle monorepo resulting in an
incorrect version information reported by Clang.

This change unifies two the scripts by introducing a new script that's
used from both LLVM, Clang and lldb, ensures that the new script
supports both monorepo and standalone SVN and Git setups, and removes
the old scripts.

Differential Revision: https://reviews.llvm.org/D57063

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@353268 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
petrhosek committed Feb 6, 2019
1 parent 741e845 commit 0187963
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 39 deletions.
56 changes: 24 additions & 32 deletions lib/Basic/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,45 +4,37 @@ set(LLVM_LINK_COMPONENTS
Support
)

find_first_existing_vc_file(llvm_vc "${LLVM_MAIN_SRC_DIR}")
find_first_existing_vc_file(clang_vc "${CLANG_SOURCE_DIR}")
find_first_existing_vc_file("${LLVM_MAIN_SRC_DIR}" llvm_vc)
find_first_existing_vc_file("${CLANG_SOURCE_DIR}" clang_vc)

# The VC revision include that we want to generate.
set(version_inc "${CMAKE_CURRENT_BINARY_DIR}/SVNVersion.inc")
set(version_inc "${CMAKE_CURRENT_BINARY_DIR}/VCSVersion.inc")

set(get_svn_script "${LLVM_CMAKE_PATH}/GetSVN.cmake")
set(generate_vcs_version_script "${LLVM_CMAKE_PATH}/GenerateVersionFromVCS.cmake")

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}")
if(llvm_vc)
set(llvm_source_dir ${LLVM_MAIN_SRC_DIR})
endif()
if(clang_vc)
set(clang_source_dir ${CLANG_SOURCE_DIR})
endif()

# Mark the generated header as being generated.
set_source_files_properties("${version_inc}"
PROPERTIES GENERATED TRUE
HEADER_FILE_ONLY TRUE)
# Create custom target to generate the VC revision include.
add_custom_command(OUTPUT "${version_inc}"
DEPENDS "${llvm_vc}" "${clang_vc}" "${generate_vcs_version_script}"
COMMAND ${CMAKE_COMMAND} "-DNAMES=\"LLVM;CLANG\""
"-DLLVM_SOURCE_DIR=${llvm_source_dir}"
"-DCLANG_SOURCE_DIR=${clang_source_dir}"
"-DHEADER_FILE=${version_inc}"
-P "${generate_vcs_version_script}")

# 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)
# Mark the generated header as being generated.
set_source_files_properties("${version_inc}"
PROPERTIES GENERATED TRUE
HEADER_FILE_ONLY TRUE)

# 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()
set_property(SOURCE Version.cpp APPEND PROPERTY
COMPILE_DEFINITIONS "HAVE_VCS_VERSION_INC")

add_clang_library(clangBasic
Attributes.cpp
Expand Down
14 changes: 7 additions & 7 deletions lib/Basic/Version.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
#include <cstdlib>
#include <cstring>

#ifdef HAVE_SVN_VERSION_INC
# include "SVNVersion.inc"
#ifdef HAVE_VCS_VERSION_INC
#include "VCSVersion.inc"
#endif

namespace clang {
Expand All @@ -27,13 +27,13 @@ std::string getClangRepositoryPath() {
#if defined(CLANG_REPOSITORY_STRING)
return CLANG_REPOSITORY_STRING;
#else
#ifdef SVN_REPOSITORY
StringRef URL(SVN_REPOSITORY);
#ifdef CLANG_REPOSITORY
StringRef URL(CLANG_REPOSITORY);
#else
StringRef URL("");
#endif

// If the SVN_REPOSITORY is empty, try to use the SVN keyword. This helps us
// If the CLANG_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()) {
Expand Down Expand Up @@ -71,8 +71,8 @@ std::string getLLVMRepositoryPath() {
}

std::string getClangRevision() {
#ifdef SVN_REVISION
return SVN_REVISION;
#ifdef CLANG_REVISION
return CLANG_REVISION;
#else
return "";
#endif
Expand Down

0 comments on commit 0187963

Please sign in to comment.