Re: [PATCH 1/4] Document new hard requirement on GNU make

Pedro Alves
2016-11-17T12:39:31Z

[-- Attachment #1: Type: text/plain, Size: 2705 bytes --]

On 11/16/2016 11:34 PM, Pedro Alves wrote:
> On 11/16/2016 10:04 PM, Simon Marchi wrote:
>> On 2016-11-16 12:23, Eli Zaretskii wrote:
>>>> With make >= 3.82, it would do the right thing (choose the second one),
>>>> by choosing the rule with the shorter stem. Before that, it used the
>>>> order of definition (the first that matches wins). So it would be nice
>>>> for that reason to require >= 3.82, but it's also possible to work
>>>> around if that's too recent.
>>>
>>> 3.82 shouldn't be a problem, I think.
>>
>> Oops, I said that without even checking the version I have on my system.
>> Ubuntu 14.04, strangely, has make 3.81. Apparently that was because of
>> a critical bug on Debian with 3.82, which stayed open for a long time,
>> preventing the upgrade. Debian and its derivatives, including Ubuntu,
>> were stuck with that for a long time.
>>
>> Refs:
>> http://stackoverflow.com/questions/31912233/how-to-update-make-3-81-linux
>> https://lwn.net/Articles/569920/
>>
>> I don't think it's worth complicating the lives of those users just to
>> get the benefit of the behaviour change I mentioned.
>>
>> So I'm back at having no idea what version we should require.
>
> I think we should go with the same requirement as gcc (3.80), as
> seen on the top level Makefile.in:
>
> @if gcc
> ifeq (,$(.VARIABLES)) # The variable .VARIABLES, new with 3.80, is never
> empty.
> $(error GNU make version 3.80 or newer is required.)
> endif
> @endif gcc

Actually, I take that back. I was just using "makes it easier
to have a single top level check", but that's not really a good
rationale. I wouldn't want to be stuck if gcc decides to
move at a glacial pace.

Probably a policy similar to the C++NN one makes more sense.

I see now that 3.81 was released in 2006, so should not be
a problem to require it.

OOC, I wrote a quick&dirty script (attached) to check for GNU Make
availability in the GCC compile farm. It tries all gcc*.fsffrance.org
from 1 to 250. I don't have access to all machines setup, as some are
multiplexed on a single IP with different ports, requiring tweaking
the local ssh config. However, what I found was already interesting,
I believe. Here's the result:

Number of accessible hostnames: 66
Number of inaccessible hostnames: 184
Hostnames with GNU Make: 66
Hostnames without GNU Make: 0
Distribution:
56 GNU Make 3.81
2 GNU Make 3.82
7 GNU Make 4.0
1 GNU Make 4.1
Unique hosts with GNU Make: 20
Unique hosts without GNU Make: 0
Distribution:
10 GNU Make 3.81
2 GNU Make 3.82
7 GNU Make 4.0
1 GNU Make 4.1

I.e., I didn't find a single machine still stuck with GNU Make 3.80.

Thanks,
Pedro Alves

[-- Attachment #2: check-make-ver --]
[-- Type: text/plain, Size: 2064 bytes --]

#!/bin/bash

rm -f make-ver.gcc*.fsffrance.org

function kill_ssh() {
ps | grep ssh | awk '{print $1}' | xargs kill
}

function ctrl_c() {
kill_ssh
}

trap ctrl_c INT

function do_ssh() {
cmd="sh -c '[ -f /etc/os-release ] && cat /etc/os-release; printf \"hostname: \"; hostname; printf \"uname: \"; uname -a; ((make -v 2>&1 | grep -q GNU) && make -v) || ((gmake -v 2>&1 | grep -q GNU) && gmake -v)' 2>&1"

# Retry 5 times, wait 5 seconds between attempts.
for i in {1..5}
do
ssh -q -o UserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no -oBatchMode=yes gcc$h.fsffrance.org "$cmd" >make-ver.gcc$h.fsffrance.org 2>&1 && break || sleep 5;
done
}

for h in `seq 1 250`
do
do_ssh &
done

echo "waiting 30s..."
sleep 30
kill_ssh

# Move inaccessible hosts out of the way.
mkdir -p nohost
find . -maxdepth 1 -size 0 | while read line; do mv $line nohost/; done
grep -l "Network is unreachable" make-ver.gcc* | while read line; do mv $line nohost/; done
grep -l "Connection timed out" make-ver.gcc* | while read line; do mv $line nohost/; done
grep -l "Permission denied" make-ver.gcc* | while read line; do mv $line nohost/; done
grep -l "Could not resolve hostname" make-ver.gcc* | while read line; do mv $line nohost/; done
grep -l "Connection refused" make-ver.gcc* | while read line; do mv $line nohost/; done

printf "Number of accessible hostnames: "
ls make-ver.gcc* | wc -l

printf "Number of inaccessible hostnames: "
ls nohost/make-ver.gcc* | wc -l

printf "Hostnames with GNU Make: "
grep -l "GNU Make" make-ver.gcc* | wc -l

printf "Hostnames without GNU Make: "
grep -L "GNU Make" make-ver.gcc* | wc -l

echo "Distribution: "
grep -h "GNU Make" make-ver.gcc* | sort | uniq -c

# Kill dups (found via uname in the ssh command)
(fdupes -f . | grep -v '^$' | xargs rm -v)2>&1 >/dev/null

printf "Unique hosts with GNU Make: "
grep -l "GNU Make" make-ver.gcc* | wc -l

printf "Unique hosts without GNU Make: "
grep -L "GNU Make" make-ver.gcc* | wc -l

echo "Distribution: "
grep -h "GNU Make" make-ver.gcc* | sort | uniq -c