build_dir = build
target = $(build_dir)/ubel.exe
source = ubel.c
chop_source = chop6.rb
prime_detector_source = prime_cut2.c

cc = gcc
cxx = g++
cflags = -O2 -Wall -Werror -pedantic -march=native

# ................................................................
# Executables.

$(target): $(source) | make_build_dir
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/head.exe: head.c | make_build_dir
	$(cc) $(cflags) $< -o $@

$(build_dir)/tail.exe: tail.c | make_build_dir
	$(cc) $(cflags) $< -o $@

$(build_dir)/slash.exe: slash.c | make_build_dir
	$(cc) $(cflags) $< -o $@

$(build_dir)/generate_prime_cut.exe: generate_prime_cut5.c | make_build_dir
	$(cc) $(cflags) $< -o $@

$(build_dir)/repeated_substrings.exe: repeated_substrings.cc | make_build_dir
	$(cxx) $(cflags) -std=c++20 $< -o $@

$(build_dir)/crc32.exe: crc32.c | make_build_dir
	$(cc) $(cflags) $< -o $@

$(build_dir)/force_crc.exe: force_crc.cc | make_build_dir
	$(cxx) $(cflags) $< -o $@

$(build_dir)/force_crc_list_variations.exe: force_crc.cc | make_build_dir
	$(cxx) $(cflags) -DLIST_ALL_VARIATIONS $< -o $@

$(build_dir)/bf.exe: bf.c | make_build_dir
	$(cc) $(cflags) $< -o $@

# ................................................................
# Generated executables.

$(build_dir)/ubel_head_1.exe: $(build_dir)/ubel_head_1.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_2.exe: $(build_dir)/ubel_head_2.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_3.exe: $(build_dir)/ubel_head_3.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_4.exe: $(build_dir)/ubel_head_4.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_5.exe: $(build_dir)/ubel_head_5.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_6.exe: $(build_dir)/ubel_head_6.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_7.exe: $(build_dir)/ubel_head_7.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_8.exe: $(build_dir)/ubel_head_8.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_9.exe: $(build_dir)/ubel_head_9.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_10.exe: $(build_dir)/ubel_head_10.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_11.exe: $(build_dir)/ubel_head_11.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_12.exe: $(build_dir)/ubel_head_12.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_13.exe: $(build_dir)/ubel_head_13.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_14.exe: $(build_dir)/ubel_head_14.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_15.exe: $(build_dir)/ubel_head_15.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_16.exe: $(build_dir)/ubel_head_16.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_17.exe: $(build_dir)/ubel_head_17.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_18.exe: $(build_dir)/ubel_head_18.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_19.exe: $(build_dir)/ubel_head_19.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_20.exe: $(build_dir)/ubel_head_20.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_21.exe: $(build_dir)/ubel_head_21.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_22.exe: $(build_dir)/ubel_head_22.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_23.exe: $(build_dir)/ubel_head_23.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_24.exe: $(build_dir)/ubel_head_24.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_25.exe: $(build_dir)/ubel_head_25.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_26.exe: $(build_dir)/ubel_head_26.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_27.exe: $(build_dir)/ubel_head_27.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_28.exe: $(build_dir)/ubel_head_28.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_29.exe: $(build_dir)/ubel_head_29.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_30.exe: $(build_dir)/ubel_head_30.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_31.exe: $(build_dir)/ubel_head_31.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_32.exe: $(build_dir)/ubel_head_32.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_33.exe: $(build_dir)/ubel_head_33.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_34.exe: $(build_dir)/ubel_head_34.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_35.exe: $(build_dir)/ubel_head_35.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_36.exe: $(build_dir)/ubel_head_36.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_37.exe: $(build_dir)/ubel_head_37.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_38.exe: $(build_dir)/ubel_head_38.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_39.exe: $(build_dir)/ubel_head_39.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_40.exe: $(build_dir)/ubel_head_40.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_41.exe: $(build_dir)/ubel_head_41.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_1.exe: $(build_dir)/ubel_tail_1.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_2.exe: $(build_dir)/ubel_tail_2.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_3.exe: $(build_dir)/ubel_tail_3.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_4.exe: $(build_dir)/ubel_tail_4.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_5.exe: $(build_dir)/ubel_tail_5.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_6.exe: $(build_dir)/ubel_tail_6.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_7.exe: $(build_dir)/ubel_tail_7.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_8.exe: $(build_dir)/ubel_tail_8.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_9.exe: $(build_dir)/ubel_tail_9.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_10.exe: $(build_dir)/ubel_tail_10.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_11.exe: $(build_dir)/ubel_tail_11.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_12.exe: $(build_dir)/ubel_tail_12.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_13.exe: $(build_dir)/ubel_tail_13.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_14.exe: $(build_dir)/ubel_tail_14.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_15.exe: $(build_dir)/ubel_tail_15.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_16.exe: $(build_dir)/ubel_tail_16.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_17.exe: $(build_dir)/ubel_tail_17.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_18.exe: $(build_dir)/ubel_tail_18.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_19.exe: $(build_dir)/ubel_tail_19.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_20.exe: $(build_dir)/ubel_tail_20.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_tail_21.exe: $(build_dir)/ubel_tail_21.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_generate.exe: $(build_dir)/ubel_generate.c
	$(cc) $(cflags) -I. $< -o $@

$(build_dir)/ubel_head_1.c: $(target) $(source)
	$< 1 < $(source) > $@

$(build_dir)/ubel_head_2.c: $(target) $(source)
	$< 2 < $(source) > $@

$(build_dir)/ubel_head_3.c: $(target) $(source)
	$< 3 < $(source) > $@

$(build_dir)/ubel_head_4.c: $(target) $(source)
	$< 4 < $(source) > $@

$(build_dir)/ubel_head_5.c: $(target) $(source)
	$< 5 < $(source) > $@

$(build_dir)/ubel_head_6.c: $(target) $(source)
	$< 6 < $(source) > $@

$(build_dir)/ubel_head_7.c: $(target) $(source)
	$< 7 < $(source) > $@

$(build_dir)/ubel_head_8.c: $(target) $(source)
	$< 8 < $(source) > $@

$(build_dir)/ubel_head_9.c: $(target) $(source)
	$< 9 < $(source) > $@

$(build_dir)/ubel_head_10.c: $(target) $(source)
	$< 10 < $(source) > $@

$(build_dir)/ubel_head_11.c: $(target) $(source)
	$< 11 < $(source) > $@

$(build_dir)/ubel_head_12.c: $(target) $(source)
	$< 12 < $(source) > $@

$(build_dir)/ubel_head_13.c: $(target) $(source)
	$< 13 < $(source) > $@

$(build_dir)/ubel_head_14.c: $(target) $(source)
	$< 14 < $(source) > $@

$(build_dir)/ubel_head_15.c: $(target) $(source)
	$< 15 < $(source) > $@

$(build_dir)/ubel_head_16.c: $(target) $(source)
	$< 16 < $(source) > $@

$(build_dir)/ubel_head_17.c: $(target) $(source)
	$< 17 < $(source) > $@

$(build_dir)/ubel_head_18.c: $(target) $(source)
	$< 18 < $(source) > $@

$(build_dir)/ubel_head_19.c: $(target) $(source)
	$< 19 < $(source) > $@

$(build_dir)/ubel_head_20.c: $(target) $(source)
	$< 20 < $(source) > $@

$(build_dir)/ubel_head_21.c: $(target) $(source)
	$< 21 < $(source) > $@

$(build_dir)/ubel_head_22.c: $(target) $(source)
	$< 22 < $(source) > $@

$(build_dir)/ubel_head_23.c: $(target) $(source)
	$< 23 < $(source) > $@

$(build_dir)/ubel_head_24.c: $(target) $(source)
	$< 24 < $(source) > $@

$(build_dir)/ubel_head_25.c: $(target) $(source)
	$< 25 < $(source) > $@

$(build_dir)/ubel_head_26.c: $(target) $(source)
	$< 26 < $(source) > $@

$(build_dir)/ubel_head_27.c: $(target) $(source)
	$< 27 < $(source) > $@

$(build_dir)/ubel_head_28.c: $(target) $(source)
	$< 28 < $(source) > $@

$(build_dir)/ubel_head_29.c: $(target) $(source)
	$< 29 < $(source) > $@

$(build_dir)/ubel_head_30.c: $(target) $(source)
	$< 30 < $(source) > $@

$(build_dir)/ubel_head_31.c: $(target) $(source)
	$< 31 < $(source) > $@

$(build_dir)/ubel_head_32.c: $(target) $(source)
	$< 32 < $(source) > $@

$(build_dir)/ubel_head_33.c: $(target) $(source)
	$< 33 < $(source) > $@

$(build_dir)/ubel_head_34.c: $(target) $(source)
	$< 34 < $(source) > $@

$(build_dir)/ubel_head_35.c: $(target) $(source)
	$< 35 < $(source) > $@

$(build_dir)/ubel_head_36.c: $(target) $(source)
	$< 36 < $(source) > $@

$(build_dir)/ubel_head_37.c: $(target) $(source)
	$< 37 < $(source) > $@

$(build_dir)/ubel_head_38.c: $(target) $(source)
	$< 38 < $(source) > $@

$(build_dir)/ubel_head_39.c: $(target) $(source)
	$< 39 < $(source) > $@

$(build_dir)/ubel_head_40.c: $(target) $(source)
	$< 40 < $(source) > $@

$(build_dir)/ubel_head_41.c: $(target) $(source)
	$< 41 < $(source) > $@

$(build_dir)/ubel_tail_1.c: $(target) $(source)
	$< -1 < $(source) > $@

$(build_dir)/ubel_tail_2.c: $(target) $(source)
	$< -2 < $(source) > $@

$(build_dir)/ubel_tail_3.c: $(target) $(source)
	$< -3 < $(source) > $@

$(build_dir)/ubel_tail_4.c: $(target) $(source)
	$< -4 < $(source) > $@

$(build_dir)/ubel_tail_5.c: $(target) $(source)
	$< -5 < $(source) > $@

$(build_dir)/ubel_tail_6.c: $(target) $(source)
	$< -6 < $(source) > $@

$(build_dir)/ubel_tail_7.c: $(target) $(source)
	$< -7 < $(source) > $@

$(build_dir)/ubel_tail_8.c: $(target) $(source)
	$< -8 < $(source) > $@

$(build_dir)/ubel_tail_9.c: $(target) $(source)
	$< -9 < $(source) > $@

$(build_dir)/ubel_tail_10.c: $(target) $(source)
	$< -10 < $(source) > $@

$(build_dir)/ubel_tail_11.c: $(target) $(source)
	$< -11 < $(source) > $@

$(build_dir)/ubel_tail_12.c: $(target) $(source)
	$< -12 < $(source) > $@

$(build_dir)/ubel_tail_13.c: $(target) $(source)
	$< -13 < $(source) > $@

$(build_dir)/ubel_tail_14.c: $(target) $(source)
	$< -14 < $(source) > $@

$(build_dir)/ubel_tail_15.c: $(target) $(source)
	$< -15 < $(source) > $@

$(build_dir)/ubel_tail_16.c: $(target) $(source)
	$< -16 < $(source) > $@

$(build_dir)/ubel_tail_17.c: $(target) $(source)
	$< -17 < $(source) > $@

$(build_dir)/ubel_tail_18.c: $(target) $(source)
	$< -18 < $(source) > $@

$(build_dir)/ubel_tail_19.c: $(target) $(source)
	$< -19 < $(source) > $@

$(build_dir)/ubel_tail_20.c: $(target) $(source)
	$< -20 < $(source) > $@

$(build_dir)/ubel_tail_21.c: $(target) $(source)
	$< -21 < $(source) > $@

$(build_dir)/ubel_generate.c: $(target) $(source)
	grep -A99 '#elif[ ]*0' $(source) | grep -B99 '#elif.*__LINE__' | $< 1 | $< -1 > $@

# ................................................................
# Tests.
test: \
	$(build_dir)/ubel.test_passed \
	$(build_dir)/ubel_slash.test_passed \
	$(build_dir)/ubel_head_1.test_passed \
	$(build_dir)/ubel_head_2.test_passed \
	$(build_dir)/ubel_head_3.test_passed \
	$(build_dir)/ubel_head_4.test_passed \
	$(build_dir)/ubel_head_5.test_passed \
	$(build_dir)/ubel_head_6.test_passed \
	$(build_dir)/ubel_head_7.test_passed \
	$(build_dir)/ubel_head_8.test_passed \
	$(build_dir)/ubel_head_9.test_passed \
	$(build_dir)/ubel_head_10.test_passed \
	$(build_dir)/ubel_head_11.test_passed \
	$(build_dir)/ubel_head_12.test_passed \
	$(build_dir)/ubel_head_13.test_passed \
	$(build_dir)/ubel_head_14.test_passed \
	$(build_dir)/ubel_head_15.test_passed \
	$(build_dir)/ubel_head_16.test_passed \
	$(build_dir)/ubel_head_17.test_passed \
	$(build_dir)/ubel_head_18.test_passed \
	$(build_dir)/ubel_head_19.test_passed \
	$(build_dir)/ubel_head_20.test_passed \
	$(build_dir)/ubel_head_21.test_passed \
	$(build_dir)/ubel_head_22.test_passed \
	$(build_dir)/ubel_head_23.test_passed \
	$(build_dir)/ubel_head_24.test_passed \
	$(build_dir)/ubel_head_25.test_passed \
	$(build_dir)/ubel_head_26.test_passed \
	$(build_dir)/ubel_head_27.test_passed \
	$(build_dir)/ubel_head_28.test_passed \
	$(build_dir)/ubel_head_29.test_passed \
	$(build_dir)/ubel_head_30.test_passed \
	$(build_dir)/ubel_head_31.test_passed \
	$(build_dir)/ubel_head_32.test_passed \
	$(build_dir)/ubel_head_33.test_passed \
	$(build_dir)/ubel_head_34.test_passed \
	$(build_dir)/ubel_head_35.test_passed \
	$(build_dir)/ubel_head_36.test_passed \
	$(build_dir)/ubel_head_37.test_passed \
	$(build_dir)/ubel_head_38.test_passed \
	$(build_dir)/ubel_head_39.test_passed \
	$(build_dir)/ubel_head_40.test_passed \
	$(build_dir)/ubel_head_41.test_passed \
	$(build_dir)/ubel_tail_1.test_passed \
	$(build_dir)/ubel_tail_2.test_passed \
	$(build_dir)/ubel_tail_3.test_passed \
	$(build_dir)/ubel_tail_4.test_passed \
	$(build_dir)/ubel_tail_5.test_passed \
	$(build_dir)/ubel_tail_6.test_passed \
	$(build_dir)/ubel_tail_7.test_passed \
	$(build_dir)/ubel_tail_8.test_passed \
	$(build_dir)/ubel_tail_9.test_passed \
	$(build_dir)/ubel_tail_10.test_passed \
	$(build_dir)/ubel_tail_11.test_passed \
	$(build_dir)/ubel_tail_12.test_passed \
	$(build_dir)/ubel_tail_13.test_passed \
	$(build_dir)/ubel_tail_14.test_passed \
	$(build_dir)/ubel_tail_15.test_passed \
	$(build_dir)/ubel_tail_16.test_passed \
	$(build_dir)/ubel_tail_17.test_passed \
	$(build_dir)/ubel_tail_18.test_passed \
	$(build_dir)/ubel_tail_19.test_passed \
	$(build_dir)/ubel_tail_20.test_passed \
	$(build_dir)/ubel_tail_21.test_passed \
	$(build_dir)/ubel_generate.test_passed \
	$(build_dir)/ubel_chop.test_passed \
	$(build_dir)/ubel_scissor.test_passed \
	$(build_dir)/ubel_bf.test_passed \
	$(build_dir)/compile_source.test_passed \
	$(build_dir)/embed_inner_crc.test_passed \
	$(build_dir)/embed_outer_crc.test_passed \
	$(build_dir)/head.test_passed \
	$(build_dir)/tail.test_passed \
	$(build_dir)/slash.test_passed \
	$(build_dir)/chop.test_passed \
	$(build_dir)/prime_cut_gcc.test_passed \
	$(build_dir)/prime_cut_clang.test_passed \
	$(build_dir)/generate_prime_cut.test_passed \
	$(build_dir)/crc32.test_passed \
	$(build_dir)/force_crc.test_passed \
	$(build_dir)/repeated_substrings.test_passed \
	$(build_dir)/bf.test_passed

# Functional test.
$(build_dir)/ubel.test_passed: $(source) ubel_test.sh | make_build_dir
	bash ubel_test.sh $< && touch $@

$(build_dir)/ubel_slash.test_passed: $(target) slash_test.sh
	bash slash_test.sh $< && touch $@

$(build_dir)/ubel_head_1.test_passed: $(build_dir)/ubel_head_1.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_2.test_passed: $(build_dir)/ubel_head_2.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_3.test_passed: $(build_dir)/ubel_head_3.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_4.test_passed: $(build_dir)/ubel_head_4.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_5.test_passed: $(build_dir)/ubel_head_5.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_6.test_passed: $(build_dir)/ubel_head_6.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_7.test_passed: $(build_dir)/ubel_head_7.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_8.test_passed: $(build_dir)/ubel_head_8.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_9.test_passed: $(build_dir)/ubel_head_9.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_10.test_passed: $(build_dir)/ubel_head_10.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_11.test_passed: $(build_dir)/ubel_head_11.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_12.test_passed: $(build_dir)/ubel_head_12.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_13.test_passed: $(build_dir)/ubel_head_13.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_14.test_passed: $(build_dir)/ubel_head_14.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_15.test_passed: $(build_dir)/ubel_head_15.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_16.test_passed: $(build_dir)/ubel_head_16.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_17.test_passed: $(build_dir)/ubel_head_17.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_18.test_passed: $(build_dir)/ubel_head_18.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_19.test_passed: $(build_dir)/ubel_head_19.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_20.test_passed: $(build_dir)/ubel_head_20.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_21.test_passed: $(build_dir)/ubel_head_21.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_22.test_passed: $(build_dir)/ubel_head_22.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_23.test_passed: $(build_dir)/ubel_head_23.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_24.test_passed: $(build_dir)/ubel_head_24.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_25.test_passed: $(build_dir)/ubel_head_25.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_26.test_passed: $(build_dir)/ubel_head_26.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_27.test_passed: $(build_dir)/ubel_head_27.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_28.test_passed: $(build_dir)/ubel_head_28.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_29.test_passed: $(build_dir)/ubel_head_29.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_30.test_passed: $(build_dir)/ubel_head_30.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_31.test_passed: $(build_dir)/ubel_head_31.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_32.test_passed: $(build_dir)/ubel_head_32.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_33.test_passed: $(build_dir)/ubel_head_33.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_34.test_passed: $(build_dir)/ubel_head_34.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_35.test_passed: $(build_dir)/ubel_head_35.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_36.test_passed: $(build_dir)/ubel_head_36.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_37.test_passed: $(build_dir)/ubel_head_37.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_38.test_passed: $(build_dir)/ubel_head_38.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_39.test_passed: $(build_dir)/ubel_head_39.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_40.test_passed: $(build_dir)/ubel_head_40.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_head_41.test_passed: $(build_dir)/ubel_head_41.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/ubel_tail_1.test_passed: $(build_dir)/ubel_tail_1.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_2.test_passed: $(build_dir)/ubel_tail_2.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_3.test_passed: $(build_dir)/ubel_tail_3.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_4.test_passed: $(build_dir)/ubel_tail_4.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_5.test_passed: $(build_dir)/ubel_tail_5.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_6.test_passed: $(build_dir)/ubel_tail_6.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_7.test_passed: $(build_dir)/ubel_tail_7.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_8.test_passed: $(build_dir)/ubel_tail_8.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_9.test_passed: $(build_dir)/ubel_tail_9.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_10.test_passed: $(build_dir)/ubel_tail_10.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_11.test_passed: $(build_dir)/ubel_tail_11.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_12.test_passed: $(build_dir)/ubel_tail_12.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_13.test_passed: $(build_dir)/ubel_tail_13.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_14.test_passed: $(build_dir)/ubel_tail_14.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_15.test_passed: $(build_dir)/ubel_tail_15.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_16.test_passed: $(build_dir)/ubel_tail_16.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_17.test_passed: $(build_dir)/ubel_tail_17.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_18.test_passed: $(build_dir)/ubel_tail_18.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_19.test_passed: $(build_dir)/ubel_tail_19.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_20.test_passed: $(build_dir)/ubel_tail_20.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_tail_21.test_passed: $(build_dir)/ubel_tail_21.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/ubel_generate.test_passed: $(build_dir)/ubel_generate.exe $(prime_detector_source)
	( $< | diff -q $(prime_detector_source) - ) && touch $@

$(build_dir)/ubel_chop.test_passed: $(source) chop_test.sh | make_build_dir
	bash chop_test.sh $< && touch $@

$(build_dir)/ubel_bf.test_passed: $(source) $(build_dir)/bf.exe
	( $(build_dir)/bf.exe $< | grep -qF "8<" ) && touch $@

$(build_dir)/ubel_scissor.test_passed: $(source) | make_build_dir
	( perl -w $< | grep -q '\S' ) && touch $@

# Verify that input source is compatible with various compilers and C standards.
$(build_dir)/compile_source.test_passed: $(source) test_compile_c99.sh | make_build_dir
	bash test_compile_c99.sh $< && touch $@

# Verify that CRC of source code is embedded in the source code.
$(build_dir)/embed_inner_crc.test_passed: $(build_dir)/ubel_generate.c $(build_dir)/crc32.exe
	grep -qF `$(build_dir)/crc32.exe $<` $< && touch $@

$(build_dir)/embed_outer_crc.test_passed: $(source) $(build_dir)/crc32.exe
	grep -qF `$(build_dir)/crc32.exe $<` $< && touch $@

# Test head/tail/slash/chop functions.
$(build_dir)/head.test_passed: $(build_dir)/head.exe head_tail_test.sh
	bash head_tail_test.sh head $< && touch $@

$(build_dir)/tail.test_passed: $(build_dir)/tail.exe head_tail_test.sh
	bash head_tail_test.sh tail $< && touch $@

$(build_dir)/slash.test_passed: $(build_dir)/slash.exe slash_test.sh
	bash slash_test.sh $< && touch $@

$(build_dir)/chop.test_passed: $(chop_source) chop_test.sh | make_build_dir
	bash chop_test.sh $< && touch $@

# Test prime detector.
$(build_dir)/prime_cut_gcc.test_passed: $(prime_detector_source) prime_cut_test.sh | make_build_dir
	bash prime_cut_test.sh gcc $< && touch $@

$(build_dir)/prime_cut_clang.test_passed: $(prime_detector_source) prime_cut_test.sh | make_build_dir
	bash prime_cut_test.sh clang $< && touch $@

$(build_dir)/generate_prime_cut.test_passed: $(prime_detector_source) $(build_dir)/generate_prime_cut.exe
	./$(build_dir)/generate_prime_cut.exe | diff -q $< - && touch $@

# Test crc32 tool.
$(build_dir)/crc32.test_passed: $(build_dir)/crc32.exe crc32_test.sh
	bash crc32_test.sh $< && touch $@

# Test force_crc tool.
$(build_dir)/force_crc.test_passed: $(build_dir)/force_crc.exe $(build_dir)/crc32.exe force_crc_test.sh
	bash force_crc_test.sh $< $(build_dir)/crc32.exe && touch $@

# Test repeated_substrings tool.
$(build_dir)/repeated_substrings.test_passed: $(build_dir)/repeated_substrings.exe repeated_substrings_test.sh
	bash repeated_substrings_test.sh $< && touch $@

# Test BF tool.
$(build_dir)/bf.test_passed: $(build_dir)/bf.exe bf_test.sh
	bash bf_test.sh $< && touch $@

# ................................................................
# Maintenance rules.
make_build_dir: $(build_dir)

$(build_dir):
	mkdir -p $@

clean:
	-rm -rf $(build_dir)
