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
