The default C library is normally computed based on the target triplet. However, for embedded systems, it can be useful to leave the triplet alone while changing which C library is used by default. Other C libraries may still be available on the system so the compiler and can be used by specifying suitable include and library paths at build time.
If an unknown --with-default-libc= value is provided, emit an error and stop. Signed-off-by: Keith Packard <kei...@keithp.com> --- gcc/config.gcc | 63 +++++++++++++++++++++++++++++++++++++++--------- gcc/configure.ac | 4 +++ 2 files changed, 56 insertions(+), 11 deletions(-) diff --git a/gcc/config.gcc b/gcc/config.gcc index f57897b0298..76fca94c409 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -697,6 +697,8 @@ esac # Common C libraries. tm_defines="$tm_defines LIBC_GLIBC=1 LIBC_UCLIBC=2 LIBC_BIONIC=3 LIBC_MUSL=4 LIBC_PICOLIBC=5" +default_libc="" + # 32-bit x86 processors supported by --with-arch=. Each processor # MUST be separated by exactly one space. x86_archs="athlon athlon-4 athlon-fx athlon-mp athlon-tbird \ @@ -913,16 +915,16 @@ case ${target} in esac case $target in *-*-*android*) - tm_defines="$tm_defines DEFAULT_LIBC=LIBC_BIONIC" + default_libc=LIBC_BIONIC ;; *-*-*uclibc* | *-*-uclinuxfdpiceabi) - tm_defines="$tm_defines DEFAULT_LIBC=LIBC_UCLIBC" + default_libc=LIBC_UCLIBC ;; *-*-*musl*) - tm_defines="$tm_defines DEFAULT_LIBC=LIBC_MUSL" + default_libc=LIBC_MUSL ;; *) - tm_defines="$tm_defines DEFAULT_LIBC=LIBC_GLIBC" + default_libc=LIBC_GLIBC ;; esac # Assume that glibc or uClibc or Bionic are being used and so __cxa_atexit @@ -1037,7 +1039,8 @@ case ${target} in case ${enable_threads} in "" | yes | posix) thread_file='posix' ;; esac - tm_defines="$tm_defines DEFAULT_LIBC=LIBC_UCLIBC SINGLE_LIBC" + tm_defines="$tm_defines SINGLE_LIBC" + default_libc=LIBC_UCLIBC ;; *-*-rdos*) use_gcc_stdint=wrap @@ -1164,7 +1167,7 @@ case ${target} in esac ;; *-picolibc-*) - tm_defines="$tm_defines DEFAULT_LIBC=LIBC_PICOLIBC" + default_libc=LIBC_PICOLIBC ;; *-*-elf|arc*-*-elf*) @@ -1752,13 +1755,13 @@ csky-*-*) case ${target} in csky-*-linux-gnu*) - tm_defines="$tm_defines DEFAULT_LIBC=LIBC_GLIBC" + default_libc=LIBC_GLIBC # Force .init_array support. The configure script cannot always # automatically detect that GAS supports it, yet we require it. gcc_cv_initfini_array=yes ;; csky-*-linux-uclibc*) - tm_defines="$tm_defines DEFAULT_LIBC=LIBC_UCLIBC" + default_libc=LIBC_UCLIBC default_use_cxa_atexit=no ;; *) @@ -3149,7 +3152,7 @@ powerpc*-wrs-vxworks7r*) tmake_file="${tmake_file} t-linux rs6000/t-linux64 rs6000/t-fprules rs6000/t-ppccomm" tmake_file="${tmake_file} rs6000/t-vxworks" - tm_defines="$tm_defines DEFAULT_LIBC=LIBC_GLIBC" + default_libc=LIBC_GLIBC extra_objs="$extra_objs linux.o rs6000-linux.o" ;; powerpc-wrs-vxworks*) @@ -6168,10 +6171,48 @@ i[34567]86-*-* | x86_64-*-*) esac +case "${with_default_libc}" in +glibc) + default_libc=LIBC_GLIBC + ;; +uclibc) + default_libc=LIBC_UCLIBC + ;; +bionic) + default_libc=LIBC_BIONIC + ;; +musl) + default_libc=LIBC_MUSL + ;; +newlib) + # Newlib configurations don't set the DEFAULT_LIBC variable, so + # avoid changing those by allowing --with-default-libc=newlib but + # not actually setting the DEFAULT_LIBC variable. + default_libc= + ;; +picolibc) + default_libc=LIBC_PICOLIBC + ;; +"") + ;; +*) + echo "Unknown libc in --with-default-libc=$with_default_libc" 1>&2 + exit 1 + ;; +esac + +case "$default_libc" in +"") + ;; +*) + tm_defines="$tm_defines DEFAULT_LIBC=$default_libc" + ;; +esac + # Targets for picolibc should include picolibc-spec.h to allow # use of picolibc-specific compiler flags -case ${target} in -*picolibc*) +case "$default_libc" in +LIBC_PICOLIBC) # __cxa_atexit is provided. default_use_cxa_atexit=yes use_gcc_stdint=wrap diff --git a/gcc/configure.ac b/gcc/configure.ac index 5a178e056ef..b8ae10d66fc 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -2559,6 +2559,10 @@ if { { test x$host != x$target && test "x$with_sysroot" = x ; } || fi AC_SUBST(inhibit_libc) +AC_ARG_WITH(default-libc, + [AS_HELP_STRING([--with-default-libc], + [Use specified default C library])]) + # When building gcc with a cross-compiler, we need to adjust things so # that the generator programs are still built with the native compiler. # Also, we cannot run fixincludes. -- 2.45.2