Skip to content
Snippets Groups Projects
  • David L. Jones's avatar
    133fae62
    Simplify Clang's version number configuration in CMake. · 133fae62
    David L. Jones authored
    Currently, the Clang version is computed as follows:
    
     1. LLVM defines major, minor, and patch versions, all statically set. Today,
        these are 4, 0, and 0, respectively.
     2. The static version numbers are combined into PACKAGE_VERSION along with a
        suffix, so the result today looks like "4.0.0svn".
     3. Clang extracts CLANG_VERSION from PACKAGE_VERSION using a regexp. The regexp
        allows the patch level to omitted, and drops any non-digit trailing values.
        Today, this result looks like "4.0.0".
     4. CLANG_VERSION is then split further into CLANG_VERSION_MAJOR and
        CLANG_VERSION_MINOR. Today, these resolve to 4 and 0, respectively.
     5. If CLANG_VERSION matches a regexp with three version components, then
        CLANG_VERSION_PATCHLEVEL is extracted and the CLANG_HAS_VERSION_PATCHLEVEL
        variable is set to 1. Today, these values are 0 and 1, respectively.
     6. The CLANG_VERSION_* variables (and CLANG_HAS_VERSION_PATCHLEVEL) are
        configured into [llvm/tools/clang/]include/clang/Basic/Version.inc
        verbatim by CMake.
     7. In [llvm/tools/clang/]include/clang/Basic/Version.h, macros are defined
        conditionally, based on CLANG_HAS_VERSION_PATCHLEVEL, to compute
        CLANG_VERSION_STRING as either a two- or three-level version number. Today,
        this value is "4.0.0", because despite the patchlevel being 0, it was
        matched by regexp and is thus "HAS"ed by the preprocessor. This string is
        then used wherever Clang's "version" is needed [*].
    
    [*] Including, notably, by compiler-rt, for computing its installation path.
    
    This change collapses steps 2-5 by defaulting Clang to use LLVM's (non-string)
    version components for the Clang version (see [*] for why not PACKAGE_VERSION),
    and collapses steps 6 and 7 by simply writing CLANG_VERSION_STRING into
    Version.inc. The Clang version today always uses the patchlevel form, so the
    collapsed Version.inc does not have logic for a version without a patch level.
    
    Historically speaking, this technique began with the VER file in r82085 (which
    survives in the form of the regexp in #3). The major, minor, and patchlevel
    versions were introduced by r106863 (which remains in #4-6). The VER file itself
    was deleted in favor of the LLVM version number in r106914. On the LLVM side,
    the individual LLVM_VERSION_MAJOR, LLVM_VERSION_MINOR, and PACKAGE_VERSION
    weren't introduced for nearly two more years, until r150405.
    
    git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@281666 91177308-0d34-0410-b5e6-96231b3b80d8
    133fae62
    History
    Simplify Clang's version number configuration in CMake.
    David L. Jones authored
    Currently, the Clang version is computed as follows:
    
     1. LLVM defines major, minor, and patch versions, all statically set. Today,
        these are 4, 0, and 0, respectively.
     2. The static version numbers are combined into PACKAGE_VERSION along with a
        suffix, so the result today looks like "4.0.0svn".
     3. Clang extracts CLANG_VERSION from PACKAGE_VERSION using a regexp. The regexp
        allows the patch level to omitted, and drops any non-digit trailing values.
        Today, this result looks like "4.0.0".
     4. CLANG_VERSION is then split further into CLANG_VERSION_MAJOR and
        CLANG_VERSION_MINOR. Today, these resolve to 4 and 0, respectively.
     5. If CLANG_VERSION matches a regexp with three version components, then
        CLANG_VERSION_PATCHLEVEL is extracted and the CLANG_HAS_VERSION_PATCHLEVEL
        variable is set to 1. Today, these values are 0 and 1, respectively.
     6. The CLANG_VERSION_* variables (and CLANG_HAS_VERSION_PATCHLEVEL) are
        configured into [llvm/tools/clang/]include/clang/Basic/Version.inc
        verbatim by CMake.
     7. In [llvm/tools/clang/]include/clang/Basic/Version.h, macros are defined
        conditionally, based on CLANG_HAS_VERSION_PATCHLEVEL, to compute
        CLANG_VERSION_STRING as either a two- or three-level version number. Today,
        this value is "4.0.0", because despite the patchlevel being 0, it was
        matched by regexp and is thus "HAS"ed by the preprocessor. This string is
        then used wherever Clang's "version" is needed [*].
    
    [*] Including, notably, by compiler-rt, for computing its installation path.
    
    This change collapses steps 2-5 by defaulting Clang to use LLVM's (non-string)
    version components for the Clang version (see [*] for why not PACKAGE_VERSION),
    and collapses steps 6 and 7 by simply writing CLANG_VERSION_STRING into
    Version.inc. The Clang version today always uses the patchlevel form, so the
    collapsed Version.inc does not have logic for a version without a patch level.
    
    Historically speaking, this technique began with the VER file in r82085 (which
    survives in the form of the regexp in #3). The major, minor, and patchlevel
    versions were introduced by r106863 (which remains in #4-6). The VER file itself
    was deleted in favor of the LLVM version number in r106914. On the LLVM side,
    the individual LLVM_VERSION_MAJOR, LLVM_VERSION_MINOR, and PACKAGE_VERSION
    weren't introduced for nearly two more years, until r150405.
    
    git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@281666 91177308-0d34-0410-b5e6-96231b3b80d8
Code owners
Assign users and groups as approvers for specific file changes. Learn more.