diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt --- a/libc/CMakeLists.txt +++ b/libc/CMakeLists.txt @@ -44,10 +44,34 @@ endif() option(LIBC_CMAKE_VERBOSE_LOGGING - "Log details warnings and notifications during CMake configuration." OFF) + "Log details warnings and notifications during CMake configuration." OFF) + # Path libc/scripts directory. set(LIBC_BUILD_SCRIPTS_DIR "${LIBC_SOURCE_DIR}/utils/build_scripts") +# Defining a global namespace to enclose all libc functions. +set(LIBC_CMAKE_NAMESPACE "" CACHE STRING "The namespace to use to enclose internal implementations. Must start with '__llvm_libc'." FORCE) + +if(LIBC_CMAKE_NAMESPACE) + set(LLVM_LIBC_NAMESPACE "${LIBC_CMAKE_NAMESPACE}") +else() + set(LLVM_LIBC_NAMESPACE "__llvm_libc_${LLVM_VERSION_MAJOR}_${LLVM_VERSION_MINOR}_${LLVM_VERSION_PATCH}_${LLVM_VERSION_SUFFIX}") +endif() + +if(NOT LLVM_LIBC_NAMESPACE MATCHES "^__llvm_libc") + message(FATAL_ERROR "Invalid LLVM_LIBC_NAMESPACE. Must start with '__llvm_libc' was '${LLVM_LIBC_NAMESPACE}'") +endif() + +message(STATUS "Setting LLVM_LIBC_NAMESPACE namespace to '${LLVM_LIBC_NAMESPACE}'") + +if(LLVM_COMPILER_IS_GCC_COMPATIBLE) + add_definitions("-DLIBC_NAMESPACE=${LLVM_LIBC_NAMESPACE}") +elseif(MSVC) + add_definitions("/DLIBC_NAMESPACE=${LLVM_LIBC_NAMESPACE}") +else() + message(FATAL_ERROR "Unsupported compiler") +endif() + # Flags to pass down to the compiler while building the libc functions. set(LIBC_COMPILE_OPTIONS_DEFAULT "" CACHE STRING "Architecture to tell clang to optimize for (e.g. -march=... or -mcpu=...)") @@ -137,7 +161,8 @@ OUTPUT_VARIABLE CLANG_TIDY_OUTPUT) string(REGEX MATCH "[0-9]+" CLANG_TIDY_VERSION "${CLANG_TIDY_OUTPUT}") string(REGEX MATCH "[0-9]+" CLANG_MAJOR_VERSION - "${CMAKE_CXX_COMPILER_VERSION}") + "${CMAKE_CXX_COMPILER_VERSION}") + if(NOT CLANG_TIDY_VERSION EQUAL CLANG_MAJOR_VERSION) set(LLVM_LIBC_ENABLE_LINTING OFF) message(WARNING " diff --git a/libc/src/__support/common.h b/libc/src/__support/common.h --- a/libc/src/__support/common.h +++ b/libc/src/__support/common.h @@ -9,6 +9,10 @@ #ifndef LLVM_LIBC_SUPPORT_COMMON_H #define LLVM_LIBC_SUPPORT_COMMON_H +#ifndef LIBC_NAMESPACE +#error "LIBC_NAMESPACE macro is not defined." +#endif + #include "src/__support/macros/attributes.h" #include "src/__support/macros/properties/architectures.h" diff --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel --- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel +++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel @@ -12,6 +12,7 @@ load(":platforms.bzl", "PLATFORM_CPU_ARM64", "PLATFORM_CPU_X86_64") load("@bazel_skylib//lib:selects.bzl", "selects") load("@bazel_skylib//rules:common_settings.bzl", "string_flag") +load("//:vars.bzl", "LLVM_VERSION_MAJOR", "LLVM_VERSION_MINOR", "LLVM_VERSION_PATCH") package( default_visibility = ["//visibility:public"], @@ -34,6 +35,8 @@ # "LIBC_COPT_MEMCPY_X86_USE_SOFTWARE_PREFETCHING", ] +llvm_libc_namespace = "__llvm_libc_{}_{}_{}_git".format(LLVM_VERSION_MAJOR, LLVM_VERSION_MINOR, LLVM_VERSION_PATCH) + # A flag to pick which `mpfr` to use for math tests. # Usage: `--@llvm-project//libc:mpfr=`. # Flag documentation: https://bazel.build/extending/config @@ -69,6 +72,7 @@ # paths of the kind "../../" to other libc targets. cc_library( name = "libc_root", + defines = ["LIBC_NAMESPACE=" + llvm_libc_namespace], includes = ["."], )