https://gcc.gnu.org/g:0ebb94fe20846407ae22cc08b1d877d57b2a46ac

commit r16-6260-g0ebb94fe20846407ae22cc08b1d877d57b2a46ac
Author: Lewis Hyatt <[email protected]>
Date:   Tue Dec 16 00:15:14 2025 -0500

    configure: Support disabling specific languages [PR12407]
    
    Sometimes it can be desirable to get the semantics of
    --enable-languages=all, but to exclude one or more languages from the
    build. Currently this is not directly supported; the best you can do is to
    list the ones you do want to be built as arguments to --enable-languages.
    In addition to being inconvenient, this also complicates cross-platform
    portability, since --enable-languages=all carries the useful semantics that
    unsupported languages will be skipped automatically; by contrast, languages
    listed explicitly as arguments to --enable-languages will produce a hard
    error if they are not supported.
    
    This patch extends the syntax of --enable-languages so that, e.g.:
    
    --enable-languages=all,^xyz,^abc
    
    would build every supported language other than xyz and abc.
    
    ChangeLog:
    
            PR bootstrap/12407
            * configure.ac: Add feature to parsing of --enable-languages so that
            a language can be disabled by prefixing it with a caret.
            * configure: Regenerate.
    
    gcc/ChangeLog:
    
            PR bootstrap/12407
            * doc/install.texi (--enable-languages): Document the new language
            exclusion feature.

Diff:
---
 configure            | 189 +++++++++++++++++++++++++++++++++++++--------------
 configure.ac         | 189 +++++++++++++++++++++++++++++++++++++--------------
 gcc/doc/install.texi |  14 +++-
 3 files changed, 290 insertions(+), 102 deletions(-)

diff --git a/configure b/configure
index e59746f3d000..5a2e9547b07d 100755
--- a/configure
+++ b/configure
@@ -10093,16 +10093,40 @@ if test -d ${srcdir}/gcc; then
   # 'f95' is the old name for the 'fortran' language. We issue a warning
   # and make the substitution.
   case ,${enable_languages}, in
-    *,f95,*)
+    *,f95,* | *,^f95,*)
       echo configure.ac: warning: 'f95' as language name is deprecated, use 
'fortran' instead 1>&2
       enable_languages=`echo "${enable_languages}" | sed -e 's/f95/fortran/g'`
       ;;
   esac
 
+  # Extract the language disable requests.  N.B. some non-GNU sed, e.g. on 
SunOS,
+  # will ignore a line without a trailing newline.
+  disable_languages=`echo "$enable_languages" | tr , "$as_nl" | grep '^\^' | 
(tr "$as_nl" , ; echo) | sed -e 's/\^//g' -e 's/,$//'`
+  new_enable_languages=
+  for lang in `echo "$enable_languages" | tr , ' '`; do
+    case "${lang}:,${disable_languages}," in
+      ^default:* | ^all:*)
+        as_fn_error $? "only specific individual languages may be disabled, 
not \"$lang\"" "$LINENO" 5
+        ;;
+      ^lto:*)
+       as_fn_error $? "LTO should be disabled with the \"--disable-lto\" 
argument, not via \"--enable-languages=^lto\"" "$LINENO" 5
+       ;;
+      ^c:*)
+       as_fn_error $? "language \"c\" cannot be disabled" "$LINENO" 5
+       ;;
+      ^* | ${lang}:*,${lang},*) ;;
+      *) new_enable_languages="${new_enable_languages}${lang}," ;;
+    esac
+  done
+  enable_languages=`echo "$new_enable_languages" | sed -e 's/,$//'`
+
   # If bootstrapping, C++ must be enabled.
-  case ",$enable_languages,:$enable_bootstrap" in
-    *,c++,*:*) ;;
-    *:yes)
+  case ",${enable_languages},:${enable_bootstrap}:,${disable_languages}," in
+    *:yes:*,c++,*)
+      as_fn_error $? "c++ cannot be disabled for a bootstrap build" "$LINENO" 5
+      ;;
+    *,c++,*:*:*) ;;
+    *:yes:*)
       if test -f ${srcdir}/gcc/cp/config-lang.in; then
         enable_languages="${enable_languages},c++"
       else
@@ -10111,9 +10135,9 @@ if test -d ${srcdir}/gcc; then
       ;;
   esac
 
-  # First scan to see if an enabled language requires some other language.
-  # We assume that a given config-lang.in will list all the language
-  # front ends it requires, even if some are required indirectly.
+  # Collect the list of default languages; keep it prefixed and suffixed with
+  # commas for later convenience.
+  default_languages=,
   for lang_frag in ${srcdir}/gcc/*/config-lang.in .. ; do
     case ${lang_frag} in
       ..) ;;
@@ -10121,28 +10145,85 @@ if test -d ${srcdir}/gcc; then
       # an apparent bug in bash 1.12 on linux.
       ${srcdir}/gcc/[*]/config-lang.in) ;;
       *)
-        # From the config-lang.in, get $language, $lang_requires, and
-        # $lang_requires_boot_languages.
+        # From the config-lang.in, get $language and $build_by_default.
         language=
-        lang_requires=
-        lang_requires_boot_languages=
-        # set srcdir during sourcing lang_frag to the gcc dir.
-        # Sadly overriding srcdir on the . line doesn't work in plain sh as it
-        # pollutes this shell
+        build_by_default=yes
+        # See note below about saving srcdir.
         saved_srcdir=${srcdir}
         srcdir=${srcdir}/gcc . ${lang_frag}
         srcdir=${saved_srcdir}
-        for other in ${lang_requires} ${lang_requires_boot_languages}; do
-          case ,${enable_languages}, in
-           *,$other,*) ;;
-           *,default,*) ;;
-           *,all,*) ;;
-           *,$language,*)
-             echo " \`$other' language required by \`$language'; enabling" 1>&2
-             enable_languages="${enable_languages},${other}"
+        if test x"$build_by_default" = xyes; then
+          default_languages="${default_languages}${language},"
+        fi
+        ;;
+    esac
+  done
+
+  # First scan to see if an enabled language requires some other language.
+  # We assume that a given config-lang.in will list all the language
+  # front ends it requires, even if some are required indirectly.
+  delayed_error_languages=,
+  for lang_frag in ${srcdir}/gcc/*/config-lang.in .. ; do
+    case ${lang_frag} in
+      ..) ;;
+      # The odd quoting in the next line works around
+      # an apparent bug in bash 1.12 on linux.
+      ${srcdir}/gcc/[*]/config-lang.in) ;;
+      *)
+       # From the config-lang.in, get $language, $lang_requires, and
+       # $lang_requires_boot_languages.
+       language=
+       lang_requires=
+       lang_requires_boot_languages=
+       # set srcdir during sourcing lang_frag to the gcc dir.
+       # Sadly overriding srcdir on the . line doesn't work in plain sh as it
+       # pollutes this shell
+       saved_srcdir=${srcdir}
+       srcdir=${srcdir}/gcc . ${lang_frag}
+       srcdir=${saved_srcdir}
+
+       # Determine if this language was requested; if not, don't bring in its
+       # dependencies.  To match historical behavior, do bring in the 
dependencies
+       # for unsupported languages that were not explicitly disabled.
+       case ,${disable_languages}, in
+         *,${language},*) continue ;;
+       esac
+       case ,${enable_languages}, in
+         *,${language},* | *,all,*) ;;
+         *,default,*)
+            case ${default_languages} in
+              *,${language},*) ;;
+              *) continue ;;
+            esac
+            ;;
+         *) continue ;;
+       esac
+
+       # This language was indeed requested; make sure all dependencies are
+       # also enabled.
+       for other in ${lang_requires} ${lang_requires_boot_languages}; do
+         need_to_add=0
+         case ,${enable_languages},:,${disable_languages}, in
+            *:*,${other},*)
+             # This language cannot be built because one of its dependencies
+             # was explicitly disabled.  Don't complain just yet, though; other
+             # checks later may decide the language won't be built anyway.
+             
delayed_error_languages="${delayed_error_languages}${language}:${other},"
+              ;;
+            *,${other},*:* | *,all,*:*) ;;
+            *,default,*:*)
+             case ${default_languages} in
+               *,${other},*) ;;
+               *) need_to_add=1 ;;
+             esac
              ;;
+           *) need_to_add=1 ;;
          esac
-        done
+         if test $need_to_add = 1; then
+           echo " \`$other' language required by \`$language'; enabling" 1>&2
+           enable_languages="${enable_languages},${other}"
+         fi
+       done
        for other in ${lang_requires_boot_languages} ; do
          if test "$other" != "c"; then
            case ,${enable_stage1_languages}, in
@@ -10150,17 +10231,13 @@ if test -d ${srcdir}/gcc; then
              *,default,*) ;;
              *,all,*) ;;
              *)
-               case ,${enable_languages}, in
-                 *,$language,*)
-                   echo " '$other' language required by '$language' in stage 
1; enabling" 1>&2
-                   enable_stage1_languages="$enable_stage1_languages,${other}"
-                   ;;
-               esac
+               echo " '$other' language required by '$language' in stage 1; 
enabling" 1>&2
+               enable_stage1_languages="$enable_stage1_languages,${other}"
                ;;
            esac
-          fi
-        done
-        ;;
+         fi
+       done
+       ;;
     esac
   done
 
@@ -10199,13 +10276,12 @@ if test -d ${srcdir}/gcc; then
       ${srcdir}/gcc/[*]/config-lang.in) ;;
       *)
         # From the config-lang.in, get $language, $target_libs,
-        # $lang_dirs, $boot_language, and $build_by_default
+        # $lang_dirs, and $boot_language.
         language=
         target_libs=
         lang_dirs=
         subdir_requires=
         boot_language=no
-        build_by_default=yes
         # set srcdir during sourcing.  See above about save & restore
         saved_srcdir=${srcdir}
         srcdir=${srcdir}/gcc . ${lang_frag}
@@ -10221,21 +10297,29 @@ if test -d ${srcdir}/gcc; then
 
         add_this_lang=no
         # C is always enabled, so no need to add it again
-        if test "$language" != "c"; then
-          case ,${enable_languages}, in
-            *,${language},*)
-              # Language was explicitly selected; include it
-             add_this_lang=yes
-              ;;
-           *,all,*)
-             # All languages are enabled
-             add_this_lang=all
-              ;;
-            *,default,*)
-              # 'default' was selected, select it if it is a default language
-             add_this_lang=${build_by_default}
-              ;;
-          esac
+       if test "$language" != "c"; then
+           # Determine if this language was requested.
+           case ,${disable_languages}, in
+             *,${language},* ) ;;
+             *)
+               case ,${enable_languages}, in
+                 *,${language},*)
+                   # Language was explicitly selected; include it
+                   add_this_lang=yes
+                   ;;
+                 *,all,*)
+                   # All languages are enabled, and this one not excluded.
+                   add_this_lang=all
+                   ;;
+                 *,default,*)
+                   # 'default' was selected, select it if it is a default 
language
+                   case ${default_languages} in
+                     *,${language},*) add_this_lang=yes ;;
+                   esac
+                   ;;
+               esac
+               ;;
+           esac
         fi
 
         # Disable languages that need other directories if these aren't 
available.
@@ -10341,7 +10425,7 @@ $as_echo "$as_me: WARNING: --enable-host-shared 
required to build $language" >&2
               # Silently disable.
               add_this_lang=unsupported
               ;;
-               esac
+         esac
           ;;
         esac
 
@@ -10400,6 +10484,11 @@ $as_echo "$as_me: WARNING: ${language} not supported 
for this target" >&2;}
             potential_languages="${potential_languages}${language},"
            ;;
           all|yes)
+           case "$delayed_error_languages" in
+             *,${language}:*,*)
+               as_fn_error $? "invalid configuration for language 
\"${language}\"; at least one of the dependencies \"$delayed_error_languages\" 
was explicitly disabled" "$LINENO" 5
+               ;;
+           esac
            new_enable_languages="${new_enable_languages}${language},"
             potential_languages="${potential_languages}${language},"
            missing_languages=`echo "$missing_languages" | sed 
"s/,$language,/,/"`
diff --git a/configure.ac b/configure.ac
index 2fb385961df6..5f19663289a1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2255,16 +2255,40 @@ if test -d ${srcdir}/gcc; then
   # 'f95' is the old name for the 'fortran' language. We issue a warning
   # and make the substitution.
   case ,${enable_languages}, in
-    *,f95,*)
+    *,f95,* | *,^f95,*)
       echo configure.ac: warning: 'f95' as language name is deprecated, use 
'fortran' instead 1>&2
       enable_languages=`echo "${enable_languages}" | sed -e 's/f95/fortran/g'`
       ;;
   esac
 
+  # Extract the language disable requests.  N.B. some non-GNU sed, e.g. on 
SunOS,
+  # will ignore a line without a trailing newline.
+  disable_languages=`echo "$enable_languages" | tr , "$as_nl" | grep '^\^' | 
(tr "$as_nl" , ; echo) | sed -e 's/\^//g' -e 's/,$//'`
+  new_enable_languages=
+  for lang in `echo "$enable_languages" | tr , ' '`; do
+    case "${lang}:,${disable_languages}," in
+      ^default:* | ^all:*)
+        AC_MSG_ERROR([only specific individual languages may be disabled, not 
"$lang"])
+        ;;
+      ^lto:*)
+       AC_MSG_ERROR([LTO should be disabled with the "--disable-lto" argument, 
not via "--enable-languages=^lto"])
+       ;;
+      ^c:*)
+       AC_MSG_ERROR([language "c" cannot be disabled])
+       ;;
+      ^* | ${lang}:*,${lang},*) ;;
+      *) new_enable_languages="${new_enable_languages}${lang}," ;;
+    esac
+  done
+  enable_languages=`echo "$new_enable_languages" | sed -e 's/,$//'`
+
   # If bootstrapping, C++ must be enabled.
-  case ",$enable_languages,:$enable_bootstrap" in
-    *,c++,*:*) ;;
-    *:yes)
+  case ",${enable_languages},:${enable_bootstrap}:,${disable_languages}," in
+    *:yes:*,c++,*)
+      AC_MSG_ERROR([c++ cannot be disabled for a bootstrap build])
+      ;;
+    *,c++,*:*:*) ;;
+    *:yes:*)
       if test -f ${srcdir}/gcc/cp/config-lang.in; then
         enable_languages="${enable_languages},c++"
       else
@@ -2273,9 +2297,9 @@ if test -d ${srcdir}/gcc; then
       ;;
   esac
 
-  # First scan to see if an enabled language requires some other language.
-  # We assume that a given config-lang.in will list all the language
-  # front ends it requires, even if some are required indirectly.
+  # Collect the list of default languages; keep it prefixed and suffixed with
+  # commas for later convenience.
+  default_languages=,
   for lang_frag in ${srcdir}/gcc/*/config-lang.in .. ; do
     case ${lang_frag} in
       ..) ;;
@@ -2283,28 +2307,85 @@ if test -d ${srcdir}/gcc; then
       # an apparent bug in bash 1.12 on linux.
       ${srcdir}/gcc/[[*]]/config-lang.in) ;;
       *)
-        # From the config-lang.in, get $language, $lang_requires, and
-        # $lang_requires_boot_languages.
+        # From the config-lang.in, get $language and $build_by_default.
         language=
-        lang_requires=
-        lang_requires_boot_languages=
-        # set srcdir during sourcing lang_frag to the gcc dir.
-        # Sadly overriding srcdir on the . line doesn't work in plain sh as it
-        # pollutes this shell
+        build_by_default=yes
+        # See note below about saving srcdir.
         saved_srcdir=${srcdir}
         srcdir=${srcdir}/gcc . ${lang_frag}
         srcdir=${saved_srcdir}
-        for other in ${lang_requires} ${lang_requires_boot_languages}; do
-          case ,${enable_languages}, in
-           *,$other,*) ;;
-           *,default,*) ;;
-           *,all,*) ;;
-           *,$language,*)
-             echo " \`$other' language required by \`$language'; enabling" 1>&2
-             enable_languages="${enable_languages},${other}"
+        if test x"$build_by_default" = xyes; then
+          default_languages="${default_languages}${language},"
+        fi
+        ;;
+    esac
+  done
+
+  # First scan to see if an enabled language requires some other language.
+  # We assume that a given config-lang.in will list all the language
+  # front ends it requires, even if some are required indirectly.
+  delayed_error_languages=,
+  for lang_frag in ${srcdir}/gcc/*/config-lang.in .. ; do
+    case ${lang_frag} in
+      ..) ;;
+      # The odd quoting in the next line works around
+      # an apparent bug in bash 1.12 on linux.
+      ${srcdir}/gcc/[[*]]/config-lang.in) ;;
+      *)
+       # From the config-lang.in, get $language, $lang_requires, and
+       # $lang_requires_boot_languages.
+       language=
+       lang_requires=
+       lang_requires_boot_languages=
+       # set srcdir during sourcing lang_frag to the gcc dir.
+       # Sadly overriding srcdir on the . line doesn't work in plain sh as it
+       # pollutes this shell
+       saved_srcdir=${srcdir}
+       srcdir=${srcdir}/gcc . ${lang_frag}
+       srcdir=${saved_srcdir}
+
+       # Determine if this language was requested; if not, don't bring in its
+       # dependencies.  To match historical behavior, do bring in the 
dependencies
+       # for unsupported languages that were not explicitly disabled.
+       case ,${disable_languages}, in
+         *,${language},*) continue ;;
+       esac
+       case ,${enable_languages}, in
+         *,${language},* | *,all,*) ;;
+         *,default,*)
+            case ${default_languages} in
+              *,${language},*) ;;
+              *) continue ;;
+            esac
+            ;;
+         *) continue ;;
+       esac
+
+       # This language was indeed requested; make sure all dependencies are
+       # also enabled.
+       for other in ${lang_requires} ${lang_requires_boot_languages}; do
+         need_to_add=0
+         case ,${enable_languages},:,${disable_languages}, in
+            *:*,${other},*)
+             # This language cannot be built because one of its dependencies
+             # was explicitly disabled.  Don't complain just yet, though; other
+             # checks later may decide the language won't be built anyway.
+             
delayed_error_languages="${delayed_error_languages}${language}:${other},"
+              ;;
+            *,${other},*:* | *,all,*:*) ;;
+            *,default,*:*)
+             case ${default_languages} in
+               *,${other},*) ;;
+               *) need_to_add=1 ;;
+             esac
              ;;
+           *) need_to_add=1 ;;
          esac
-        done
+         if test $need_to_add = 1; then
+           echo " \`$other' language required by \`$language'; enabling" 1>&2
+           enable_languages="${enable_languages},${other}"
+         fi
+       done
        for other in ${lang_requires_boot_languages} ; do
          if test "$other" != "c"; then
            case ,${enable_stage1_languages}, in
@@ -2312,17 +2393,13 @@ if test -d ${srcdir}/gcc; then
              *,default,*) ;;
              *,all,*) ;;
              *)
-               case ,${enable_languages}, in
-                 *,$language,*)
-                   echo " '$other' language required by '$language' in stage 
1; enabling" 1>&2
-                   enable_stage1_languages="$enable_stage1_languages,${other}"
-                   ;;
-               esac
+               echo " '$other' language required by '$language' in stage 1; 
enabling" 1>&2
+               enable_stage1_languages="$enable_stage1_languages,${other}"
                ;;
            esac
-          fi
-        done
-        ;;
+         fi
+       done
+       ;;
     esac
   done
 
@@ -2361,13 +2438,12 @@ if test -d ${srcdir}/gcc; then
       ${srcdir}/gcc/[[*]]/config-lang.in) ;;
       *)
         # From the config-lang.in, get $language, $target_libs, 
-        # $lang_dirs, $boot_language, and $build_by_default
+        # $lang_dirs, and $boot_language.
         language=
         target_libs=
         lang_dirs=
         subdir_requires=
         boot_language=no
-        build_by_default=yes
         # set srcdir during sourcing.  See above about save & restore
         saved_srcdir=${srcdir}
         srcdir=${srcdir}/gcc . ${lang_frag}
@@ -2383,21 +2459,29 @@ if test -d ${srcdir}/gcc; then
 
         add_this_lang=no
         # C is always enabled, so no need to add it again
-        if test "$language" != "c"; then
-          case ,${enable_languages}, in
-            *,${language},*)
-              # Language was explicitly selected; include it
-             add_this_lang=yes
-              ;;
-           *,all,*)
-             # All languages are enabled
-             add_this_lang=all
-              ;;
-            *,default,*)
-              # 'default' was selected, select it if it is a default language
-             add_this_lang=${build_by_default}
-              ;;
-          esac
+       if test "$language" != "c"; then
+           # Determine if this language was requested.
+           case ,${disable_languages}, in
+             *,${language},* ) ;;
+             *)
+               case ,${enable_languages}, in
+                 *,${language},*)
+                   # Language was explicitly selected; include it
+                   add_this_lang=yes
+                   ;;
+                 *,all,*)
+                   # All languages are enabled, and this one not excluded.
+                   add_this_lang=all
+                   ;;
+                 *,default,*)
+                   # 'default' was selected, select it if it is a default 
language
+                   case ${default_languages} in
+                     *,${language},*) add_this_lang=yes ;;
+                   esac
+                   ;;
+               esac
+               ;;
+           esac
         fi
 
         # Disable languages that need other directories if these aren't 
available.
@@ -2498,7 +2582,7 @@ directories, to avoid imposing the performance cost of
               # Silently disable.
               add_this_lang=unsupported
               ;;
-               esac
+         esac
           ;;
         esac
 
@@ -2554,6 +2638,11 @@ directories, to avoid imposing the performance cost of
             potential_languages="${potential_languages}${language},"
            ;;
           all|yes)
+           case "$delayed_error_languages" in
+             *,${language}:*,*)
+               AC_MSG_ERROR([invalid configuration for language "${language}"; 
at least one of the dependencies "$delayed_error_languages" was explicitly 
disabled])
+               ;;
+           esac
            new_enable_languages="${new_enable_languages}${language},"
             potential_languages="${potential_languages}${language},"
            missing_languages=`echo "$missing_languages" | sed 
"s/,$language,/,/"`
diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi
index 76ab36e53f3c..862d61165c67 100644
--- a/gcc/doc/install.texi
+++ b/gcc/doc/install.texi
@@ -2099,7 +2099,7 @@ this option is still experimental and not for normal use 
yet.
 
 Default is the traditional behavior @option{--with-aix-soname=@samp{aix}}.
 
-@item --enable-languages=@var{lang1},@var{lang2},@dots{}
+@item --enable-languages=[^]@var{lang1},[^]@var{lang2},@dots{}
 Specify that only a particular subset of compilers and
 their runtime libraries should be built.  For a list of valid values for
 @var{langN} you can issue the following command in the
@@ -2119,9 +2119,19 @@ LTO is not a
 default language, but is built by default because @option{--enable-lto} is
 enabled by default.  The other languages are default languages.  If
 @code{all} is specified, then all available languages are built.  An
-exception is @code{jit} language, which requires
+exception is the @code{jit} language, which requires
 @option{--enable-host-shared} to be included with @code{all}.
 
+If a language name is prefixed with a caret, such as
+@samp{--enable-languages=all,^obj-c++}, then that language will
+not be built.  This is most useful when combined with @code{all} or
+@code{default}.  A language disabled in this way will be disabled even
+if it is also included without the leading caret earlier or later in
+the argument to @option{--enable-languages}.  An attempt to disable a
+language that is a prerequisite for an enabled languaged---(whether
+the latter language was enabled explicitly, or implicitly via the
+@code{default} or @code{all} directives)---is invalid.
+
 @item --enable-stage1-languages=@var{lang1},@var{lang2},@dots{}
 Specify that a particular subset of compilers and their runtime
 libraries should be built with the system C compiler during stage 1 of

Reply via email to