about summary refs log tree commit diff
path: root/src/tools/libcxx-version/main.cpp
blob: 79df7ef457c4f3ca04800b9bf330ff3dba6aef4e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Detecting the standard library version manually using a bunch of shell commands is very
// complicated and fragile across different platforms. This program provides the major version
// of the standard library on any target platform without requiring any messy work.
//
// It's nothing more than specifying the name of the standard library implementation (either libstdc++ or libc++)
// and its major version.

#include <iostream>

int main() {
    #ifdef _GLIBCXX_RELEASE
        std::cout << "libstdc++ version: " << _GLIBCXX_RELEASE << std::endl;
    #elif defined(_LIBCPP_VERSION)
        // _LIBCPP_VERSION follows "XXYYZZ" format (e.g., 170001 for 17.0.1).
        // ref: https://github.com/llvm/llvm-project/blob/f64732195c1030ee2627ff4e4142038e01df1d26/libcxx/include/__config#L51-L54
        //
        // Since we use the major version from _GLIBCXX_RELEASE, we need to extract only the first 2 characters of _LIBCPP_VERSION
        // to provide the major version for consistency.
        std::cout << "libc++ version: " << std::to_string(_LIBCPP_VERSION).substr(0, 2) << std::endl;
    #else
        std::cerr << "Coudln't recognize the standard library version." << std::endl;
        return 1;
    #endif

    return 0;
}