SRCS=$(filter-out main.swift $(wildcard Pages/*/*/main.swift),$(wildcard *.swift Pages/*/*.swift))
EXES=$(SRCS:%.swift=%)

SWIFTCFLAGS=-O

all: $(EXES) $(EXES:%=outs/%.out)

%: %.swift
	swiftc $(SWIFTCFLAGS) -o $@ $^

Pages/0.xcplaygroundpage/Contents: Pages/0.xcplaygroundpage/Contents.swift
	cp -p $< $(dir $<)main.swift
	swiftc $(SWIFTCFLAGS) -o $@ $(dir $<)main.swift $(wildcard Sources/*.swift)
	rm -f $(dir $<)main.swift

Pages/3_2_UInt128.xcplaygroundpage/Contents: Pages/3_2_UInt128.xcplaygroundpage/Contents.swift
	cp -p $< $(dir $<)main.swift
	swiftc $(SWIFTCFLAGS) -o $@ $(dir $<)main.swift Sources/UInt128.swift
	rm -f $(dir $<)main.swift

Pages/3_2_UInt256.xcplaygroundpage/Contents: Pages/3_2_UInt256.xcplaygroundpage/Contents.swift
	cp -p $< $(dir $<)main.swift
	swiftc $(SWIFTCFLAGS) -o $@ $(dir $<)main.swift $(wildcard Sources/*.swift)
	rm -f $(dir $<)main.swift

Pages/3_2_UInt512.xcplaygroundpage/Contents: Pages/3_2_UInt512.xcplaygroundpage/Contents.swift
	cp -p $< $(dir $<)main.swift
	swiftc $(SWIFTCFLAGS) -o $@ $(dir $<)main.swift $(wildcard Sources/*.swift)
	rm -f $(dir $<)main.swift

Pages/3_2_UInt1024.xcplaygroundpage/Contents: Pages/3_2_UInt1024.xcplaygroundpage/Contents.swift
	cp -p $< $(dir $<)main.swift
	swiftc $(SWIFTCFLAGS) -o $@ $(dir $<)main.swift $(wildcard Sources/*.swift)
	rm -f $(dir $<)main.swift

outs/%.out: %.swift
	[ -d $(dir $@) ] || mkdir -p $(dir $@)
	[ $(FORCE) -f $@.bak ] || ./$* | dd of=$@.bak 2> /dev/null
	./$* | dd of=$@ 2> /dev/null
	-diff -u $@.bak $@

clean:
	rm -f $(EXES)

fullclean: clean
	rm -f $(EXES:%=outs/%.out) $(EXES:%=outs/%.out.bak)
