diff --git a/libc/cmake/modules/LibcConfig.cmake b/libc/cmake/modules/LibcConfig.cmake index 7a3e6066b3cc06e..da166dd6cc3fccc 100644 --- a/libc/cmake/modules/LibcConfig.cmake +++ b/libc/cmake/modules/LibcConfig.cmake @@ -113,7 +113,7 @@ function(load_libc_config config_file) message(FATAL_ERROR ${json_error}) endif() if(NOT DEFINED ${opt_name}) - message(FATAL_ERROR: " Option ${opt_name} defined in ${config_file} is invalid.") + message(FATAL_ERROR " Option ${opt_name} defined in ${config_file} is invalid.") endif() if(ARGN) list(FIND ARGN ${opt_name} optname_exists) diff --git a/libc/config/config.json b/libc/config/config.json index 2005f4297bfc1d5..2bf432ecae3425e 100644 --- a/libc/config/config.json +++ b/libc/config/config.json @@ -1,8 +1,8 @@ { "errno": { "LIBC_CONF_ERRNO_MODE": { - "value": "", - "doc": "The implementation used for errno, acceptable values are LIBC_ERRNO_MODE_UNDEFINED, LIBC_ERRNO_MODE_THREAD_LOCAL, LIBC_ERRNO_MODE_SHARED, LIBC_ERRNO_MODE_EXTERNAL, and LIBC_ERRNO_MODE_SYSTEM." + "value": "LIBC_ERRNO_MODE_DEFAULT", + "doc": "The implementation used for errno, acceptable values are LIBC_ERRNO_MODE_DEFAULT, LIBC_ERRNO_MODE_UNDEFINED, LIBC_ERRNO_MODE_THREAD_LOCAL, LIBC_ERRNO_MODE_SHARED, LIBC_ERRNO_MODE_EXTERNAL, and LIBC_ERRNO_MODE_SYSTEM." } }, "printf": { diff --git a/libc/src/errno/libc_errno.cpp b/libc/src/errno/libc_errno.cpp index 7a17a5a8217c755..d1600d1b050e333 100644 --- a/libc/src/errno/libc_errno.cpp +++ b/libc/src/errno/libc_errno.cpp @@ -9,6 +9,8 @@ #include "libc_errno.h" #include "src/__support/macros/config.h" +// libc uses a fallback default value, either system or thread local. +#define LIBC_ERRNO_MODE_DEFAULT 0 // libc never stores a value; `errno` macro uses get link-time failure. #define LIBC_ERRNO_MODE_UNDEFINED 1 // libc maintains per-thread state (requires C++ `thread_local` support). @@ -23,7 +25,8 @@ // fullbuild mode, effectively the same as `LIBC_ERRNO_MODE_EXTERNAL`. #define LIBC_ERRNO_MODE_SYSTEM 5 -#ifndef LIBC_ERRNO_MODE +#if !defined(LIBC_ERRNO_MODE) || LIBC_ERRNO_MODE == LIBC_ERRNO_MODE_DEFAULT +#undef LIBC_ERRNO_MODE #if defined(LIBC_FULL_BUILD) || !defined(LIBC_COPT_PUBLIC_PACKAGING) #define LIBC_ERRNO_MODE LIBC_ERRNO_MODE_THREAD_LOCAL #else @@ -31,12 +34,14 @@ #endif #endif // LIBC_ERRNO_MODE -#if LIBC_ERRNO_MODE != LIBC_ERRNO_MODE_UNDEFINED && \ +#if LIBC_ERRNO_MODE != LIBC_ERRNO_MODE_DEFAULT && \ + LIBC_ERRNO_MODE != LIBC_ERRNO_MODE_UNDEFINED && \ LIBC_ERRNO_MODE != LIBC_ERRNO_MODE_THREAD_LOCAL && \ LIBC_ERRNO_MODE != LIBC_ERRNO_MODE_SHARED && \ LIBC_ERRNO_MODE != LIBC_ERRNO_MODE_EXTERNAL && \ LIBC_ERRNO_MODE != LIBC_ERRNO_MODE_SYSTEM #error LIBC_ERRNO_MODE must be one of the following values: \ +LIBC_ERRNO_MODE_DEFAULT, \ LIBC_ERRNO_MODE_UNDEFINED, \ LIBC_ERRNO_MODE_THREAD_LOCAL, \ LIBC_ERRNO_MODE_SHARED, \