#!/bin/bash

rm -rf test
mkdir -p test/src/a test/src/b test/res
cat > test/src/a/foo.c <<'EOF'
#include <stdio.h>

int main() {
  printf("CMD\n");
  return 0;
}
EOF

cat > test/Makefile <<'EOF'
all: foo

VPATH = src/a src/b res

foo: res/foo.o
	$(CC) -o $@ $<

res/%.o: %.c
	$(info found $<, actual $(wildcard src/*/*.c))
	$(CC) -o $@ -c $< -Wp,-MD,$@.d; \
	perl -ne 'print $$_; $$_ =~ s/.*: //; push @a, $$_; END { $$a[-1]  =~ s/$$/ :/; print join("", @a, ); }' $@.d > $@.d.cmd

include $(wildcard res/*.d.cmd)

EOF

cat > test/mine.out <<EOF
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for x86_64-redhat-linux-gnu
First build works
found src/a/foo.c, actual src/a/foo.c
cc -o res/foo.o -c src/a/foo.c -Wp,-MD,res/foo.o.d; \
	perl -ne 'print $_; $_ =~ s/.*: //; push @a, $_; END { $a[-1]  =~ s/$/ :/; print join("", @a, ); }' res/foo.o.d > res/foo.o.d.cmd
cc -o foo res/foo.o
mv src/a/foo.c src/b/foo.c
Second build fails
found src/a/foo.c, actual src/b/foo.c
cc -o res/foo.o -c src/a/foo.c -Wp,-MD,res/foo.o.d; \
	perl -ne 'print $_; $_ =~ s/.*: //; push @a, $_; END { $a[-1]  =~ s/$/ :/; print join("", @a, ); }' res/foo.o.d > res/foo.o.d.cmd
cc: src/a/foo.c: No such file or directory
cc: no input files
EOF

cd test
make --version
echo
echo -------------------------------------------- First build works
echo
make
echo
echo -------------------------------------------- mv src/a/foo.c src/b/foo.c
echo
mv src/a/foo.c src/b/foo.c
echo -------------------------------------------- Second build fails
echo
make
echo
echo -------------------------------------------- Please compare your results with mine in test/mine.out 
echo
