# Requires GNU Make >= 4.3 (grouped targets &:) — use gmake on macOS BINARY := ../src/target/release/obikmer VENV_PY := ../.venv/bin/python3 GENOMES := $(wildcard genomes/*.fna.gz) # SPECIMENS, SPECIES, and the full dependency graph are generated by # make_deps.py from the genome FASTA headers — like .d files in C. # Make rebuilds deps.mk whenever genomes/ changes and restarts. -include deps.mk REF_NPZS := $(SPECIMENS:%=reference_index/%.npz) PRESENCE_DONE := $(SPECIMENS:%=specimen_index_presence/%/index.done) PRESENCE_STATS := $(SPECIMENS:%=stats/indexing_presence/%.stats) COUNT_DONE := $(SPECIMENS:%=specimen_index_count/%/index.done) COUNT_STATS := $(SPECIMENS:%=stats/indexing_count/%.stats) VERIFY_PRESENCE_STATS := $(SPECIMENS:%=stats/verify_presence/%.stats) VERIFY_COUNT_STATS := $(SPECIMENS:%=stats/verify_count/%.stats) SPECIFIC_PRESENCE_DONE := $(SPECIES:%=specific_index_presence/%/index.done) SPECIFIC_PRESENCE_STATS := $(SPECIES:%=stats/specific_kmer_presence/%.stats) SPECIFIC_COUNT_DONE := $(SPECIES:%=specific_index_count/%/index.done) SPECIFIC_COUNT_STATS := $(SPECIES:%=stats/specific_kmer_count/%.stats) SIMULATED_READS := $(foreach s,$(SPECIMENS),simulated_data/$(subst --,/,$s)/reads_R1.fastq.gz) .NOTPARALLEL: .PHONY: all simulate reference \ index_presence index_count \ aggregate_index_presence aggregate_index_count \ merge_presence merge_count \ verify_presence verify_count \ aggregate_verify_presence aggregate_verify_count \ verify_merge_presence verify_merge_count \ filter_presence filter_count \ aggregate_filter_presence aggregate_filter_count verify_merge_presence: stats/verify_merge_presence/current.csv verify_merge_count: stats/verify_merge_count/current.csv all: aggregate_verify_presence aggregate_verify_count \ verify_merge_presence verify_merge_count \ aggregate_filter_presence aggregate_filter_count # ── dependency file ─────────────────────────────────────────────────────────── deps.mk: $(GENOMES) $(VENV_PY) make_deps.py $^ > $@ # ── simulation ──────────────────────────────────────────────────────────────── # Prerequisites (genome → reads) are in deps.mk; $< is the genome file. $(SIMULATED_READS): bash simulate_one.sh $< $(dir $@) simulate: $(SIMULATED_READS) # ── reference kmer sets ─────────────────────────────────────────────────────── # Prerequisites (reads → npz) are in deps.mk. reference_index/%.npz: bash build_reference.sh $* reference: $(REF_NPZS) # ── per-specimen indexing ───────────────────────────────────────────────────── # Prerequisites (reads → index.done + .stats) are in deps.mk. specimen_index_presence/%/index.done \ stats/indexing_presence/%.stats &: $(BINARY) bash index_one_presence.sh $* specimen_index_count/%/index.done \ stats/indexing_count/%.stats &: $(BINARY) bash index_one_count.sh $* index_presence: $(PRESENCE_DONE) index_count: $(COUNT_DONE) # ── indexing stats aggregation ──────────────────────────────────────────────── aggregate_index_presence: $(PRESENCE_STATS) bash aggregate_stats.sh indexing_presence aggregate_index_count: $(COUNT_STATS) bash aggregate_stats.sh indexing_count # ── global merge ────────────────────────────────────────────────────────────── global_index_presence/index.done: $(PRESENCE_DONE) $(BINARY) bash merge_presence.sh global_index_count/index.done: $(COUNT_DONE) $(BINARY) bash merge_count.sh merge_presence: global_index_presence/index.done merge_count: global_index_count/index.done # ── per-specimen verification ───────────────────────────────────────────────── # Prerequisites (index.done + npz → .stats) are in deps.mk. stats/verify_presence/%.stats: bash verify_one_presence.sh $* stats/verify_count/%.stats: bash verify_one_count.sh $* verify_presence: $(VERIFY_PRESENCE_STATS) verify_count: $(VERIFY_COUNT_STATS) # ── verification stats aggregation ─────────────────────────────────────────── aggregate_verify_presence: $(VERIFY_PRESENCE_STATS) bash aggregate_stats.sh verify_presence aggregate_verify_count: $(VERIFY_COUNT_STATS) bash aggregate_stats.sh verify_count # ── species-specific indexes ────────────────────────────────────────────────── # Prerequisites (global index → specific index) are in deps.mk. specific_index_presence/%/index.done \ stats/specific_kmer_presence/%.stats &: $(BINARY) bash filter_one_presence.sh $* specific_index_count/%/index.done \ stats/specific_kmer_count/%.stats &: $(BINARY) bash filter_one_count.sh $* filter_presence: $(SPECIFIC_PRESENCE_DONE) filter_count: $(SPECIFIC_COUNT_DONE) aggregate_filter_presence: $(SPECIFIC_PRESENCE_STATS) bash aggregate_stats.sh specific_kmer_presence aggregate_filter_count: $(SPECIFIC_COUNT_STATS) bash aggregate_stats.sh specific_kmer_count # ── merged index verification ───────────────────────────────────────────────── stats/verify_merge_presence/current.csv: $(REF_NPZS) global_index_presence/index.done bash verify_merge_presence.sh stats/verify_merge_count/current.csv: $(REF_NPZS) global_index_count/index.done bash verify_merge_count.sh