all: .PHONY
.PHONY:

CFLAGS = -pipe -g -Og -Wall -Wextra -Werror -std=c99
CPPFLAGS = -D_POSIX_C_SOURCE=200809L
LDFLAGS = -Wl,-dynamic-linker=/home/riastradh/netbsd/9/src/libexec/ld.elf_so/obj.amd64/ld.elf_so

clean: .PHONY

all:
	@echo success

# Verify that every pair of {program, library} works or fails as
# expected.
#
.for v in 1.0 2.0 3.0 3.1 4.0 5.0
all: use10-${v}
use10-${v}: .PHONY use10 ${v}/libtest.so
	LD_LIBRARY_PATH=${v} ./use10
.endfor
.for u in 30 31 40 50		# 20
all: use${u}-1.0
use${u}-1.0: .PHONY use${u} 1.0/libtest.so
	! LD_LIBRARY_PATH=1.0 ./use${u}
.endfor

.for v in 2.0 3.0 3.1 4.0 5.0
all: abuse20-${v}
abuse20-${v}: .PHONY abuse20 ${v}/libtest.so
	LD_LIBRARY_PATH=${v} ./abuse20
all: use20-${v}
use20-${v}: .PHONY use20 ${v}/libtest.so
	LD_LIBRARY_PATH=${v} ./use20
.endfor
.for u in 30 31 40 50
all: use${u}-2.0
use${u}-2.0: .PHONY use${u} 2.0/libtest.so
	! LD_LIBRARY_PATH=2.0 ./use${u}
.endfor

.for v in 3.0 3.1 4.0 5.0
all: use30-${v}
use30-${v}: .PHONY use30 ${v}/libtest.so
	LD_LIBRARY_PATH=${v} ./use30
.endfor
.for u in 31 40 50
all: use${u}-3.0
use${u}-3.0: .PHONY use${u} 3.0/libtest.so
	! LD_LIBRARY_PATH=3.0 ./use${u}
.endfor

.for v in 3.1 4.0 5.0
all: use31-${v}
use31-${v}: .PHONY use31 ${v}/libtest.so
	LD_LIBRARY_PATH=${v} ./use31
.endfor
.for u in 40 50
all: use${u}-3.1
use${u}-3.1: .PHONY use${u} 3.1/libtest.so
	! LD_LIBRARY_PATH=3.1 ./use${u}
.endfor

.for v in 4.0 5.0
all: use40-${v}
use40-${v}: .PHONY use40 ${v}/libtest.so
	LD_LIBRARY_PATH=${v} ./use40
.endfor
.for u in 50
all: use${u}-4.0
use${u}-4.0: .PHONY use${u} 4.0/libtest.so
	! LD_LIBRARY_PATH=4.0 ./use${u}
.endfor

.for v in 5.0
all: use50-${v}
use50-${v}: .PHONY use50 ${v}/libtest.so
	LD_LIBRARY_PATH=${v} ./use50
.endfor

# Build every library version in a subdirectory.
#
.for v in 1.0 2.0 3.0 3.1 4.0 5.0
all: ${v}/libtest.so
${v}/libtest.so: .PHONY
	cd ${v} && $(MAKE)
clean: clean-${v}
clean-${v}: .PHONY
	cd ${v} && $(MAKE) clean
.endfor

# Build use.c against every library version.
#
.for u v in  10 1.0  20 2.0  30 3.0  31 3.1  40 4.0  50 5.0
all: use${u}
use${u}: use.c ${v}/libtest.so
	$(CC) -o $@ $(LDFLAGS) $(CFLAGS) $(CPPFLAGS) -I${v} -L${v} use.c -ltest
clean: clean-use${u}
clean-use${u}: .PHONY
	-rm -f use${u}
.endfor

# Verify that a program can link against the version that accidentally
# exported a symbol it shouldn't have, but not newer versions.
#
all: abuse20
abuse20: abuse.c 2.0/libtest.so
	$(CC) -o $@ $(LDFLAGS) $(CFLAGS) $(CPPFLAGS) \
		-I2.0 -L2.0 abuse.c -ltest

.for u v in 30 3.0  31 3.1  40 4.0  50 5.0
all: abuse${u}
abuse${u}: .PHONY ${v}/libtest.so
	! $(CC) -o $@ $(LDFLAGS) $(CFLAGS) $(CPPFLAGS) \
		-I${v} -L${v} abuse.c -ltest
.endfor

clean: clean-abuse
clean-abuse: .PHONY
	-rm -rf abuse20

# Verify that if we try to use a nonexistent or private symbol, we
# can't -- even if the private symbol is actually exported, but with a
# nondefault version, in order for a compat library shim to get at it
# from the real library.
#
.for u v in 20 2.0  30 3.0  31 3.1  40 4.0  50 5.0
all: abuseone${u}
abuseone${u}: .PHONY ${v}/libtest.so
	! $(CC) -o $@ $(LDFLAGS) $(CFLAGS) $(CPPFLAGS) \
		-I${v} -L${v} abuseone.c -ltest
.endfor
