[5/5] gcc: Pass sysroot options to cpp for preprocessed source

Message ID 20211027200505.3340725-6-richard.purdie@linuxfoundation.org
State New
Headers
Series OpenEmbedded/Yocto Project gcc patches |

Commit Message

Richard Purdie Oct. 27, 2021, 8:05 p.m. UTC
  OpenEmbedded/Yocto Project extensively uses the --sysroot support within gcc.
We discovered that when compiling preprocessed source (.i or .ii files), the
compiler will try and access the builtin sysroot location rather than the
--sysroot option specified on the commandline. If access to that directory is
permission denied (unreadable), gcc will error. This is particularly problematic
when ccache is involved.

This patch adds %I to the cpp-output spec macro so the default substitutions for
-iprefix, -isystem, -isysroot happen and the correct sysroot is used.

2021-10-27 Richard Purdie <richard.purdie@linuxfoundation.org>

gcc/cp/ChangeLog:

    * lang-specs.h: Pass sysroot options to cpp for preprocessed source

gcc/ChangeLog:

    * gcc.c: Pass sysroot options to cpp for preprocessed source

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 gcc/cp/lang-specs.h | 2 +-
 gcc/gcc.c           | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)
  

Comments

Jeff Law Dec. 14, 2021, 11:47 p.m. UTC | #1
On 10/27/2021 2:05 PM, Richard Purdie via Gcc-patches wrote:
> OpenEmbedded/Yocto Project extensively uses the --sysroot support within gcc.
> We discovered that when compiling preprocessed source (.i or .ii files), the
> compiler will try and access the builtin sysroot location rather than the
> --sysroot option specified on the commandline. If access to that directory is
> permission denied (unreadable), gcc will error. This is particularly problematic
> when ccache is involved.
>
> This patch adds %I to the cpp-output spec macro so the default substitutions for
> -iprefix, -isystem, -isysroot happen and the correct sysroot is used.
>
> 2021-10-27 Richard Purdie <richard.purdie@linuxfoundation.org>
>
> gcc/cp/ChangeLog:
>
>      * lang-specs.h: Pass sysroot options to cpp for preprocessed source
>
> gcc/ChangeLog:
>
>      * gcc.c: Pass sysroot options to cpp for preprocessed source
So generally OK, though I think this is incomplete.  If I understand the 
underlying bits correctly a similar change is needed in:

{lto,objc,fortran,ada/gcc-interface,objcp}/lang-specs.h.

I think d/lang-specs.h is OK, though it'd probably be useful to double 
check that.

jeff
  

Patch

diff --git a/gcc/cp/lang-specs.h b/gcc/cp/lang-specs.h
index 8902ae1d2ed..e99e2fcd6ad 100644
--- a/gcc/cp/lang-specs.h
+++ b/gcc/cp/lang-specs.h
@@ -116,7 +116,7 @@  along with GCC; see the file COPYING3.  If not see
   {".ii", "@c++-cpp-output", 0, 0, 0},
   {"@c++-cpp-output",
       "%{!E:%{!M:%{!MM:"
-      "  cc1plus -fpreprocessed %i %(cc1_options) %2"
+      "  cc1plus -fpreprocessed %i %I %(cc1_options) %2"
       "  %{!fsyntax-only:"
       "    %{fmodule-only:%{!S:-o %g.s%V}}"
       "    %{!fmodule-only:%{!fmodule-header*:%(invoke_as)}}}"
diff --git a/gcc/gcc.c b/gcc/gcc.c
index abb900a4247..51176becb86 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -1472,7 +1472,7 @@  static const struct compiler default_compilers[] =
 					   %W{o*:--output-pch=%*}}%V}}}}}}}", 0, 0, 0},
   {".i", "@cpp-output", 0, 0, 0},
   {"@cpp-output",
-   "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
+   "%{!M:%{!MM:%{!E:cc1 -fpreprocessed %i %I %(cc1_options) %{!fsyntax-only:%(invoke_as)}}}}", 0, 0, 0},
   {".s", "@assembler", 0, 0, 0},
   {"@assembler",
    "%{!M:%{!MM:%{!E:%{!S:as %(asm_debug) %(asm_options) %i %A }}}}", 0, 0, 0},