Walter
Walter

Reputation: 45414

What is the difference between "clang" and "Apple clang"?

I just upgraded to OS X 10.8.2, which comes with clang. The output of clang -v is:

Apple clang version 4.1 (tags/Apple/clang-421.11.65) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.2.0
Thread model: posix

On macports, there are several different versions of clang available (port search clang):

clang @2.9 (lang)
    C, C++, Objective C and Objective C++ compiler
clang-2.9 @2.9 (lang)
    C, C++, Objective C and Objective C++ compiler
clang-3.0 @3.0 (lang)
    C, C++, Objective C and Objective C++ compiler
clang-3.1 @3.1 (lang)
    C, C++, Objective C and Objective C++ compiler
clang-3.2 @3.2-r164372 (lang)
    C, C++, Objective C and Objective C++ compiler

Is the "Apple clang 4.1" that comes with OS X the same (nearly or exactly) as clang-3.1 from macports?

Also, what is different in 3.2 as compared to 3.1?

Upvotes: 30

Views: 9698

Answers (2)

Mecki
Mecki

Reputation: 132869

Apple ships Xcode with their own version of clang. That means Apple decides how clang is built (e.g. which built settings are used, which optional features are enabled/disabled) and Apple may also patch the source code of clang to their needs prior to building it. Since clang is released under Apache 2.0 license, Apple does not have to make their changes open source or publicly available or tell anyone what they changed, how they changed it, or why they did that.

However, Apple does have an own project fork on GitHub. This is the original LLVM repo:

https://github.com/llvm/llvm-project

and this is the fork from Apple:

https://github.com/apple/llvm-project

so if they made any changes, maybe you can find them there.

The default version tells you nothing:

 # clang --version
Apple clang version 15.0.0 (clang-1500.1.0.2.4)

That's just Apple's internal version scheme, but there is a list on Wikipedia mapping those versions to LLVM release versions:

https://en.wikipedia.org/wiki/Xcode#Toolchain_versions

The way how this list is updated is by finding the appropriate release tag in the Apple fork and looking at the CMakeLists.txt. This file reveals the LLVM version:

if(NOT DEFINED LLVM_VERSION_MAJOR)
  set(LLVM_VERSION_MAJOR 16)
endif()
if(NOT DEFINED LLVM_VERSION_MINOR)
  set(LLVM_VERSION_MINOR 0)
endif()
if(NOT DEFINED LLVM_VERSION_PATCH)
  set(LLVM_VERSION_PATCH 0)
endif()

https://github.com/apple/llvm-project/blob/swift-5.9-DEVELOPMENT-SNAPSHOT-2023-10-09-a/llvm/CMakeLists.txt

This is the current Xcode 15.1 Beta 2 tag and the CMake file reveals that is is based on LLVM 16.0.0.

Upvotes: 4

Michael Spencer
Michael Spencer

Reputation: 1055

LLVM 3.1svn means that it was branched sometime after 3.1 was released but before 3.2 (which has not been released yet). Apple doesn't work off of released versions of LLVM/Clang.

The changes from clang 3.1 to 3.2 (as well as future versions) can be found in the Release Notes.

Note that since 3.2 has not been released, the release notes will not contain a complete list of the changes.

Upvotes: -5

Related Questions