>
> Hello,
>
> As part of jobserver detection, the jobserver_info constructor looks
> for the last occurence of "--jobserver-auth=", and parses the argument
> for that option to look for either a named pipe (has a "fifo:" prefix)
> or read and write pipe fds separated by a comma.
>
> With GNU Make 4.4 and above, named pipes are used by default because
> anonymous pipe fds cannot be used reliably (see
> https://savannah.gnu.org/bugs/?57242), but it still supports a
> --jobserver-style=pipe option for compatibility reasons. With that
> flag enabled, or with older GNU Make versions, the jobserver detection
> code checks if the provided fds are greater than 0 and valid. If
> invalid, it drops them from MAKEFLAGS used for subsequent child
> processes.
>
> However, GNU Make explicitly provides negative jobserver pipe fds if
> the command is not marked as recursive (i.e is missing a '+' prefix in
> the Makefile) - see https://savannah.gnu.org/bugs/?57242#comment13.
>
> The MAKEFLAGS look like this in that case.
>
> -j4 --jobserver-auth=3,4 --jobserver-auth=-2,-2
>
> Stripping off the final --jobserver-auth with negative fds undoes this
> helpful hint from GNU Make, and exposes child processes (like
> lto-wrapper) to all the issues with anonymous pipe fds that forced GNU
> Make to switch to named pipes by default.
>
> This patch prevents that stripping if jobserver communication is *not*
> via a named pipe *and* file descriptors are negative. As a result,
> child processes receive MAKEFLAGS with negative file descriptors too,
> and correctly decide that a jobserver is not available.
>
> Ok for master?
>
> Regards
> Senthil
>
> gcc/ChangeLog:
>
> * opts-common.cc (jobserver_info::jobserver_info): Do not strip jobserver
> auth flags with negative file descriptors.
>
> diff --git gcc/opts-common.cc gcc/opts-common.cc
> index 379402e68a6..aaed63d1344 100644
> --- gcc/opts-common.cc
> +++ gcc/opts-common.cc
> @@ -2110,7 +2110,8 @@ jobserver_info::jobserver_info ()
> if (n != string::npos)
> {
> string ending = makeflags.substr (n + js_needle.size ());
> - if (ending.find (fifo_prefix) == 0)
> + bool is_named_pipe = ending.find (fifo_prefix) == 0;
> + if (is_named_pipe)
> {
> ending = ending.substr (fifo_prefix.size ());
> pipe_path = ending.substr (0, ending.find (' '));
> @@ -2125,11 +2126,15 @@ jobserver_info::jobserver_info ()
> is_active = true;
> else
> {
> - string dup = makeflags.substr (0, n);
> - size_t pos = makeflags.find (' ', n);
> - if (pos != string::npos)
> - dup += makeflags.substr (pos);
> - skipped_makeflags = "MAKEFLAGS=" + dup;
> + bool negative_fds = !is_named_pipe && rfd < 0 && wfd < 0;
> + if (!negative_fds)
> + {
> + string dup = makeflags.substr (0, n);
> + size_t pos = makeflags.find (' ', n);
> + if (pos != string::npos)
> + dup += makeflags.substr (pos);
> + skipped_makeflags = "MAKEFLAGS=" + dup;
> + }
> error_msg
> = "cannot access %<" + js_needle + "%> file descriptors";