# ----------------------------------------
# Makefile for phenio
# Generated using ontology-development-kit
# ODK Version: v1.6
# ----------------------------------------
# IMPORTANT: DO NOT EDIT THIS FILE. To override default make goals, use phenio.Makefile instead


# ----------------------------------------
# More information: https://github.com/INCATools/ontology-development-kit/

# Fingerprint of the configuration file when this Makefile was last generated
CONFIG_HASH=                8a1e7113eb999f6d8e09c96cc08cc2dcec13f87d8e4d4ef643c332d1fa5da07b


# ----------------------------------------
# Standard Constants
# ----------------------------------------
# these can be overwritten on the command line

OBOBASE=                    http://purl.obolibrary.org/obo
URIBASE=                    http://purl.obolibrary.org/obo
ONT=                        phenio
ONTBASE=                    http://purl.obolibrary.org/obo/phenio
EDIT_FORMAT=                owl
SRC =                       $(ONT)-edit.$(EDIT_FORMAT)
MAKE_FAST=                  $(MAKE) IMP=false PAT=false COMP=false MIR=false
CATALOG=                    catalog-v001.xml
ROBOT=                      robot --catalog $(CATALOG)
REASONER=                   ELK
OWLTOOLS =                  owltools --use-catalog
RELEASEDIR=                 ../..
DOCSDIR=                    ../../docs
REPORTDIR=                  reports
TEMPLATEDIR=                ../templates
TMPDIR=                     tmp
MIRRORDIR=                  mirror
IMPORTDIR=                  imports
SUBSETDIR=                  subsets
SCRIPTSDIR=                 ../scripts
UPDATEREPODIR=              target
SPARQLDIR =                 ../sparql
EXTENDED_PREFIX_MAP=        $(TMPDIR)/obo.epm.json
COMPONENTSDIR =             components
REPORT_FAIL_ON =            none
REPORT_LABEL =              
REPORT_PROFILE_OPTS =       
OBO_FORMAT_OPTIONS =        --clean-obo "strict drop-untranslatable-axioms"
SPARQL_VALIDATION_CHECKS =  owldef-self-reference iri-range label-with-iri multiple-replaced_by 
SPARQL_EXPORTS =            basic-report class-count-by-prefix edges xrefs obsoletes synonyms 
ODK_VERSION_MAKEFILE =      v1.6
RELAX_OPTIONS =             --include-subclass-of true
REDUCE_OPTIONS =            --include-subproperties true

TODAY ?=                    $(shell date +%Y-%m-%d)
OBODATE ?=                  $(shell date +'%d:%m:%Y %H:%M')
VERSION=                    $(TODAY)
ANNOTATE_ONTOLOGY_VERSION = annotate -V $(ONTBASE)/releases/$(VERSION)/$@ --annotation owl:versionInfo $(VERSION)
ANNOTATE_CONVERT_FILE =     annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) convert -f ofn --output $@.tmp.owl && mv $@.tmp.owl $@
OTHER_SRC =                 $(COMPONENTSDIR)/go.owl $(COMPONENTSDIR)/mondo.owl $(COMPONENTSDIR)/maxo.owl $(COMPONENTSDIR)/upheno.owl $(COMPONENTSDIR)/oba.owl $(COMPONENTSDIR)/hp.owl $(COMPONENTSDIR)/fypo.owl $(COMPONENTSDIR)/zp.owl $(COMPONENTSDIR)/xpo.owl $(COMPONENTSDIR)/mp.owl $(COMPONENTSDIR)/wbphenotype.owl $(COMPONENTSDIR)/ddpheno.owl $(COMPONENTSDIR)/dpo.owl $(COMPONENTSDIR)/uberon.owl $(COMPONENTSDIR)/cl.owl $(COMPONENTSDIR)/ddanat.owl $(COMPONENTSDIR)/wbbt.owl $(COMPONENTSDIR)/fbbt.owl $(COMPONENTSDIR)/zfa.owl $(COMPONENTSDIR)/xao.owl $(COMPONENTSDIR)/emapa.owl $(COMPONENTSDIR)/hsapdv.owl 
ONTOLOGYTERMS =             $(TMPDIR)/ontologyterms.txt
EDIT_PREPROCESSED =         $(TMPDIR)/$(ONT)-preprocess.owl

MAPPINGDIR=                 ../mappings
MAPPING_TESTER=             sssom validate
SSSOMPY=                    sssom
MAPPINGS=                   uberon cl upheno-oba 
MAPPING_RELEASE_FILES=      $(foreach n,$(MAPPINGS), $(MAPPINGDIR)/$(n).sssom.tsv)


FORMATS = $(sort  owl json owl)
FORMATS_INCL_TSV = $(sort $(FORMATS) tsv)
RELEASE_ARTEFACTS = $(sort $(ONT)-base $(ONT)-full phenio-sspo-equivalent )

ifeq ($(ODK_DEBUG),yes)
ODK_DEBUG_FILE = debug.log
SHELL = $(SCRIPTSDIR)/run-command.sh
endif

# ----------------------------------------
# Workflow control
# ----------------------------------------
# Set any of the following variables to false to completely disable the
# corresponding workflows.

# Refresh of mirrors (and all remote resources more generally)
MIR = true

# Re-generation of import modules
IMP = true

# Re-generation of "large" import modules
# Note that IMP=false takes precedence over IMP_LARGE=true, that is,
# IMP=false disables the generation of all import modules, large or not.
IMP_LARGE = true

# Re-generation of component modules
COMP = true

# Re-generation of pattern-derived files
PAT = true

# ----------------------------------------
# Top-level targets
# ----------------------------------------

.PHONY: .FORCE

.PHONY: all
all: all_odk

.PHONY: all_odk
all_odk: odkversion config_check test custom_reports all_assets

.PHONY: test
test: odkversion validate_idranges reason_test sparql_test robot_reports 
	echo "Finished running all tests successfully."

.PHONY: test
test_fast:
	$(MAKE_FAST) test

.PHONY: release_diff
release_diff: $(REPORTDIR)/release-diff.md

.PHONY: reason_test
reason_test: $(EDIT_PREPROCESSED)
	$(ROBOT) reason --input $< --reasoner $(REASONER) --equivalent-classes-allowed all \
		--exclude-tautologies structural --output test.owl && rm test.owl

.PHONY: odkversion
odkversion:
	@echo "ODK Makefile $(ODK_VERSION_MAKEFILE)"
	@odk-info --tools
.PHONY: config_check
config_check:
	@if [ "$$(tr -d '\r' < $(ONT)-odk.yaml | sha256sum | cut -c1-64)" = "$(CONFIG_HASH)" ]; then \
		echo "Repository is up-to-date." ; else \
		echo "Your ODK configuration has changed since this Makefile was generated. You may need to run 'make update_repo'." ; fi


$(TMPDIR) $(REPORTDIR) $(MIRRORDIR) $(IMPORTDIR) $(COMPONENTSDIR) $(SUBSETDIR):
	mkdir -p $@

# ----------------------------------------
# ODK-managed ROBOT plugins
# ----------------------------------------

# Make sure ROBOT knows where to find plugins
export ROBOT_PLUGINS_DIRECTORY=$(TMPDIR)/plugins

# Override this rule in phenio.Makefile to install custom plugins
.PHONY: custom_robot_plugins
custom_robot_plugins:


.PHONY: extra_robot_plugins
extra_robot_plugins:  $(ROBOT_PLUGINS_DIRECTORY)/upheno.jar 


# Install all ROBOT plugins to the runtime plugins directory
.PHONY: all_robot_plugins
all_robot_plugins: $(foreach plugin,$(notdir $(wildcard /tools/robot-plugins/*.jar)),$(ROBOT_PLUGINS_DIRECTORY)/$(plugin)) \
		   $(foreach plugin,$(notdir $(wildcard ../../plugins/*.jar)),$(ROBOT_PLUGINS_DIRECTORY)/$(plugin)) \
		   custom_robot_plugins extra_robot_plugins  \

# Default rule to install plugins
$(ROBOT_PLUGINS_DIRECTORY)/%.jar:
	@mkdir -p $(ROBOT_PLUGINS_DIRECTORY)
	@if [ -f ../../plugins/$*.jar ]; then        \
		ln ../../plugins/$*.jar $@ ;         \
	elif [ -f /tools/robot-plugins/$*.jar ]; then \
		cp /tools/robot-plugins/$*.jar $@ ;  \
	fi

# Specific rules for supplementary plugins defined in configuration

$(ROBOT_PLUGINS_DIRECTORY)/upheno.jar:
	curl -L -o $@ https://github.com/monarch-initiative/monarch-robot-plugins/releases/latest/download/monarch-robot-extensions.jar


# ----------------------------------------
# Release assets
# ----------------------------------------

MAIN_PRODUCTS = $(sort $(foreach r,$(RELEASE_ARTEFACTS), $(r)) $(ONT))
MAIN_GZIPPED  = 
MAIN_FILES    = $(foreach n,$(MAIN_PRODUCTS), $(foreach f,$(FORMATS), $(n).$(f))) $(MAIN_GZIPPED)
SRCMERGED     = $(TMPDIR)/merged-$(ONT)-edit.ofn

.PHONY: all_main
all_main: $(MAIN_FILES)

# ----------------------------------------
# Import assets
# ----------------------------------------


IMPORTS =  monochrom ncbigene hgnc so bspo wbls zfs fbdv chebi pr eco bfo ro ncbitaxon-taxslim pato mpath nbo foodon upheno-bridge upheno-alignments

IMPORT_ROOTS =  $(IMPORTDIR)/merged_import
IMPORT_OWL_FILES = $(foreach n,$(IMPORT_ROOTS), $(n).owl)
IMPORT_FILES = $(IMPORT_OWL_FILES)


.PHONY: all_imports
all_imports: $(IMPORT_FILES)

# ----------------------------------------
# Subset assets
# ----------------------------------------


SUBSETS = 

SUBSET_ROOTS = $(patsubst %, $(SUBSETDIR)/%, $(SUBSETS))
SUBSET_FILES = $(foreach n,$(SUBSET_ROOTS), $(foreach f,$(FORMATS_INCL_TSV), $(n).$(f)))

.PHONY: all_subsets
all_subsets: $(SUBSET_FILES)

# ----------------------------------------
# Mapping assets
# ----------------------------------------


MAPPINGS =  uberon cl upheno-oba


MAPPING_FILES = $(foreach p, $(MAPPINGS), $(MAPPINGDIR)/$(p).sssom.tsv)
RELEASED_MAPPING_FILES = $(foreach p, $(RELEASED_MAPPINGS), $(MAPPINGDIR)/$(p).sssom.tsv)

.PHONY: all_mappings
all_mappings: $(MAPPING_FILES)


# ----------------------------------------
# QC Reports & Utilities
# ----------------------------------------

OBO_REPORT =  $(SRC)-obo-report
ALIGNMENT_REPORT =  $(SRC)-align-report
REPORTS = $(OBO_REPORT)
REPORT_FILES = $(patsubst %, $(REPORTDIR)/%.tsv, $(REPORTS))

.PHONY: robot_reports
robot_reports: $(REPORT_FILES)

.PHONY: all_reports
all_reports: custom_reports robot_reports

# ----------------------------------------
# ROBOT OWL Profile checking
# ----------------------------------------

# The merge step is necessary to avoid undeclared entity violations.
$(REPORTDIR)/validate_profile_owl2dl_%.txt: % | $(REPORTDIR) $(TMPDIR)
	$(ROBOT) merge -i $< convert -f ofn -o $(TMPDIR)/validate.ofn
	$(ROBOT) validate-profile --profile DL -i $(TMPDIR)/validate.ofn -o $@ || { cat $@ && exit 1; }
.PRECIOUS: $(REPORTDIR)/validate_profile_owl2dl_%.txt

validate_profile_%: $(REPORTDIR)/validate_profile_owl2dl_%.txt
	echo "$* profile validation completed."

# ----------------------------------------
# Sparql queries: Q/C
# ----------------------------------------

# these live in the ../sparql directory, and have suffix -violation.sparql
# adding the name here will make the violation check live.

SPARQL_VALIDATION_QUERIES = $(foreach V,$(SPARQL_VALIDATION_CHECKS),$(SPARQLDIR)/$(V)-violation.sparql)

sparql_test:  $(SRCMERGED) | $(REPORTDIR)
ifneq ($(SPARQL_VALIDATION_QUERIES),)
  
	$(ROBOT) verify -i $(SRCMERGED) --queries $(SPARQL_VALIDATION_QUERIES) -O $(REPORTDIR)
endif

# ----------------------------------------
# ROBOT report
# ----------------------------------------

$(REPORTDIR)/$(SRC)-obo-report.tsv: $(SRCMERGED) | $(REPORTDIR)
	$(ROBOT) report -i $< $(REPORT_LABEL) $(REPORT_PROFILE_OPTS) --fail-on $(REPORT_FAIL_ON) --print 5 -o $@

$(REPORTDIR)/%-obo-report.tsv: % | $(REPORTDIR)
	$(ROBOT) report -i $< $(REPORT_LABEL) $(REPORT_PROFILE_OPTS) --fail-on $(REPORT_FAIL_ON) --print 5 -o $@

check_for_robot_updates:
	echo "You are not using a custom profile, so you are getting the joy of the latest ROBOT report!"


# ----------------------------------------
# Release assets
# ----------------------------------------

ASSETS = \
  $(IMPORT_FILES) \
  $(MAIN_FILES) \
  $(REPORT_FILES) \
  $(SUBSET_FILES) \
  $(MAPPING_FILES)

RELEASE_ASSETS = \
  $(MAIN_FILES) \
  $(SUBSET_FILES) \
  $(REPORT_FILES)

.PHONY: all_assets
all_assets: $(ASSETS) check_rdfxml_assets

.PHONY: show_assets
show_assets:
	echo $(ASSETS)
	du -sh $(ASSETS)

check_rdfxml_%: %
	@check-rdfxml  $<

.PHONY: check_rdfxml_assets
check_rdfxml_assets: $(foreach product,$(MAIN_PRODUCTS),check_rdfxml_$(product).owl)

# ----------------------------------------
# Release Management
# ----------------------------------------

CLEANFILES=$(MAIN_FILES) $(SRCMERGED) $(EDIT_PREPROCESSED)

# This should be executed by the release manager whenever time comes to make a release.
# It will ensure that all assets/files are fresh, and will copy to release folder
.PHONY: prepare_release
prepare_release: all_odk
	$(MAKE) copy_release_files
	rm -f $(CLEANFILES)
	@echo "Release files are now in $(RELEASEDIR) - now you should commit, push and make a release \
        on your git hosting site such as GitHub or GitLab"

.PHONY: prepare_release_fast
prepare_release_fast:
	$(MAKE) prepare_release IMP=false PAT=false MIR=false COMP=false

# This rule does the bulk of the work for prepare_release, copying all
# files to the release directory. It is mostly intended for internal
# use, by the prepare_release rule itself or by other ODK scripts.
.PHONY: copy_release_files
copy_release_files:
	rsync -R $(RELEASE_ASSETS) $(RELEASEDIR)

# All released assets, in their final location within the release
RELEASE_ASSETS_AFTER_RELEASE=$(foreach n,$(RELEASE_ASSETS), $(RELEASEDIR)/$(n))

.PHONY: show_release_assets
show_release_assets:
	@echo $(RELEASE_ASSETS_AFTER_RELEASE)

CURRENT_RELEASE=$(ONTBASE).owl

$(TMPDIR)/current-release.owl:
	wget $(CURRENT_RELEASE) -O $@

$(REPORTDIR)/release-diff.md: $(ONT).owl $(TMPDIR)/current-release.owl
	$(ROBOT) diff --labels true --left $(TMPDIR)/current-release.owl --right $(ONT).owl -f markdown -o $@

# ------------------------
# Imports: Seeding system 
# ------------------------

# pre_seed.txt contains all entities referenced from the -edit file
# and its components
PRESEED=$(TMPDIR)/pre_seed.txt
$(PRESEED): $(SRCMERGED)
	$(ROBOT) query --input $< --format --csv \
		       --query $(SPARQLDIR)/terms.sparql $@

$(SRCMERGED): $(EDIT_PREPROCESSED) $(OTHER_SRC)
	$(ROBOT) remove --input $< --select imports --trim false \
		 merge $(foreach src, $(OTHER_SRC), --input $(src)) \
		       --output $@

$(EDIT_PREPROCESSED): $(SRC)
	$(ROBOT) convert --input $< --format ofn --output $@

# seed.txt contains all entities to import in addition to those defined
# in the individual _terms.txt files.
IMPORTSEED = $(TMPDIR)/seed.txt
$(IMPORTSEED): $(PRESEED) | $(TMPDIR)
	cat $^ | sort | uniq > $@

T_IMPORTSEED = --term-file $(IMPORTSEED)

ANNOTATION_PROPERTIES=rdfs:label IAO:0000115 OMO:0002000 

# ----------------------------------------
# Import modules
# ----------------------------------------
# Most ontologies are modularly constructed using portions of other ontologies
# These live in the imports/ folder
# This pattern uses ROBOT to generate an import module

ifeq ($(IMP),true)

ALL_TERMS = $(foreach imp, $(IMPORTS), $(IMPORTDIR)/$(imp)_terms.txt)

$(IMPORTDIR)/merged_import.owl: $(MIRRORDIR)/merged.owl $(ALL_TERMS) \
				$(IMPORTSEED) | all_robot_plugins
	$(ROBOT) merge --input $< \
		 remove --select "<http://birdgenenames.org/cgnc/*>" \
		 remove --select "<http://flybase.org/reports/*>" \
		 remove --select "<http://purl.obolibrary.org/obo/CARO_*>" \
		 remove --select "<http://purl.obolibrary.org/obo/ECTO_*>" \
		 remove --select "<http://purl.obolibrary.org/obo/ENVO_*>" \
		 remove --select "<http://purl.obolibrary.org/obo/FAO_*>" \
		 remove --select "<http://purl.obolibrary.org/obo/GOCHE_*>" \
		 remove --select "<http://purl.obolibrary.org/obo/MFOMD_*>" \
		 remove --select "<http://purl.obolibrary.org/obo/MF_*>" \
		 remove --select "<http://purl.obolibrary.org/obo/MOD_*>" \
		 remove --select "<http://purl.obolibrary.org/obo/NCBITaxon_Union_*>" \
		 remove --select "<http://purl.obolibrary.org/obo/NCIT_*>" \
		 remove --select "<http://purl.obolibrary.org/obo/OBI_*>" \
		 remove --select "<http://purl.obolibrary.org/obo/OGMS_*>" \
		 remove --select "<http://purl.obolibrary.org/obo/PCO_*>" \
		 remove --select "<http://purl.obolibrary.org/obo/PO_*>" \
		 remove --select "<http://purl.obolibrary.org/obo/TS_*>" \
		 remove --select "<http://www.informatics.jax.org/marker/MGI:*>" \
		 remove --select "<https://swisslipids.org/rdf/SLM_*>" \
		 remove --select "<https://w3id.org/biolink/vocab/*>" \
		 remove --select "<http://www.ensembl.org/id/*>" \
		 remove --select "<http://purl.obolibrary.org/obo/OPL_*>" \
		 remove --select "<https://w3id.org/linkml/*>" \
		 remove --select "<https://bioregistry.io/lipidmaps*>" \
		 remove --select "<http://www.ncbi.nlm.nih.gov/gene/*>" \
		 extract $(foreach f, $(ALL_TERMS), --term-file $(f)) $(T_IMPORTSEED) \
		         --force true --copy-ontology-annotations false \
		         --individuals exclude \
		         --method BOT \
		 remove $(foreach p, $(ANNOTATION_PROPERTIES), --term $(p)) \
		        $(foreach f, $(ALL_TERMS), --term-file $(f)) $(T_IMPORTSEED) \
		        --select complement --select annotation-properties \
		 odk:normalize --base-iri http://purl.obolibrary.org/obo \
		               --subset-decls true --synonym-decls true \
		 repair --merge-axiom-annotations true \
		 $(ANNOTATE_CONVERT_FILE)

endif # IMP=true

.PHONY: refresh-imports
refresh-imports:
	$(MAKE) IMP=true MIR=true PAT=false IMP_LARGE=true clean all_imports

.PHONY: no-mirror-refresh-imports
no-mirror-refresh-imports:
	$(MAKE) --assume-new=$(SRC) \
		$(foreach imp,$(IMPORTS),--assume-new=$(IMPORTDIR)/$(imp)_terms.txt) \
		IMP=true MIR=false PAT=false IMP_LARGE=true all_imports

.PHONY: refresh-imports-excluding-large
refresh-imports-excluding-large:
	$(MAKE) IMP=true MIR=true PAT=false IMP_LARGE=false clean all_imports

.PHONY: refresh-%
refresh-%:
	$(MAKE) --assume-new=$(SRC) --assume-new=$(IMPORTDIR)/$*_terms.txt \
		IMP=true IMP_LARGE=true MIR=true PAT=false $(IMPORTDIR)/$*_import.owl

.PHONY: no-mirror-refresh-%
no-mirror-refresh-%:
	$(MAKE) --assume-new=$(SRC) --assume-new=$(IMPORTDIR)/$*_terms.txt \
		IMP=true IMP_LARGE=true MIR=false PAT=false $(IMPORTDIR)/$*_import.owl

# ----------------------------------------
# Components
# ----------------------------------------
# Some ontologies contain external and internal components. A component is included in the ontology in its entirety.

ifeq ($(COMP),true)
.PHONY: all_components
all_components: $(OTHER_SRC)

.PHONY: recreate-components
recreate-components:
	$(MAKE) --assume-new=$(TMPDIR)/stamp-component-go.owl \
		--assume-new=$(TMPDIR)/stamp-component-mondo.owl \
		--assume-new=$(TMPDIR)/stamp-component-maxo.owl \
		--assume-new=$(TMPDIR)/stamp-component-upheno.owl \
		--assume-new=$(TMPDIR)/stamp-component-oba.owl \
		--assume-new=$(TMPDIR)/stamp-component-hp.owl \
		--assume-new=$(TMPDIR)/stamp-component-fypo.owl \
		--assume-new=$(TMPDIR)/stamp-component-zp.owl \
		--assume-new=$(TMPDIR)/stamp-component-xpo.owl \
		--assume-new=$(TMPDIR)/stamp-component-mp.owl \
		--assume-new=$(TMPDIR)/stamp-component-wbphenotype.owl \
		--assume-new=$(TMPDIR)/stamp-component-ddpheno.owl \
		--assume-new=$(TMPDIR)/stamp-component-dpo.owl \
		--assume-new=$(TMPDIR)/stamp-component-uberon.owl \
		--assume-new=$(TMPDIR)/stamp-component-cl.owl \
		--assume-new=$(TMPDIR)/stamp-component-ddanat.owl \
		--assume-new=$(TMPDIR)/stamp-component-wbbt.owl \
		--assume-new=$(TMPDIR)/stamp-component-fbbt.owl \
		--assume-new=$(TMPDIR)/stamp-component-zfa.owl \
		--assume-new=$(TMPDIR)/stamp-component-xao.owl \
		--assume-new=$(TMPDIR)/stamp-component-emapa.owl \
		--assume-new=$(TMPDIR)/stamp-component-hsapdv.owl \
		COMP=true IMP=false MIR=true PAT=true all_components

.PHONY: no-mirror-recreate-components
no-mirror-recreate-components:
	$(MAKE) --assume-new=$(TMPDIR)/stamp-component-go.owl \
		--assume-new=$(TMPDIR)/stamp-component-mondo.owl \
		--assume-new=$(TMPDIR)/stamp-component-maxo.owl \
		--assume-new=$(TMPDIR)/stamp-component-upheno.owl \
		--assume-new=$(TMPDIR)/stamp-component-oba.owl \
		--assume-new=$(TMPDIR)/stamp-component-hp.owl \
		--assume-new=$(TMPDIR)/stamp-component-fypo.owl \
		--assume-new=$(TMPDIR)/stamp-component-zp.owl \
		--assume-new=$(TMPDIR)/stamp-component-xpo.owl \
		--assume-new=$(TMPDIR)/stamp-component-mp.owl \
		--assume-new=$(TMPDIR)/stamp-component-wbphenotype.owl \
		--assume-new=$(TMPDIR)/stamp-component-ddpheno.owl \
		--assume-new=$(TMPDIR)/stamp-component-dpo.owl \
		--assume-new=$(TMPDIR)/stamp-component-uberon.owl \
		--assume-new=$(TMPDIR)/stamp-component-cl.owl \
		--assume-new=$(TMPDIR)/stamp-component-ddanat.owl \
		--assume-new=$(TMPDIR)/stamp-component-wbbt.owl \
		--assume-new=$(TMPDIR)/stamp-component-fbbt.owl \
		--assume-new=$(TMPDIR)/stamp-component-zfa.owl \
		--assume-new=$(TMPDIR)/stamp-component-xao.owl \
		--assume-new=$(TMPDIR)/stamp-component-emapa.owl \
		--assume-new=$(TMPDIR)/stamp-component-hsapdv.owl \
		COMP=true IMP=false MIR=false PAT=true all_components

.PHONY: recreate-%
recreate-%:
	$(MAKE) --assume-new=$(TMPDIR)/stamp-component-$*.owl \
		COMP=true IMP=false MIR=true PAT=true $(COMPONENTSDIR)/$*.owl

.PHONY: no-mirror-recreate-%
no-mirror-recreate-%:
	$(MAKE) --assume-new=$(TMPDIR)/stamp-component-$*.owl \
		COMP=true IMP=false MIR=false PAT=true $(COMPONENTSDIR)/$*.owl

$(COMPONENTSDIR)/%.owl: $(TMPDIR)/stamp-component-%.owl | $(COMPONENTSDIR)
	test -f $@ || touch $@
.PRECIOUS: $(COMPONENTSDIR)/%.owl

$(TMPDIR)/stamp-component-%.owl: | $(TMPDIR)
	touch $@
.PRECIOUS: $(TMPDIR)/stamp-component-%.owl

ifeq ($(MIR),true)
.PHONY: component-download-go.owl
component-download-go.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/go/go-base.owl \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/go.owl: component-download-go.owl $(TMPDIR)/stamp-component-go.owl
	@if cmp -s $(TMPDIR)/component-download-go.owl.owl $(TMPDIR)/component-download-go.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-go.owl.owl $(TMPDIR)/component-download-go.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-go.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/go.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-mondo.owl
component-download-mondo.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/mondo/mondo-base.owl \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/mondo.owl: component-download-mondo.owl $(TMPDIR)/stamp-component-mondo.owl
	@if cmp -s $(TMPDIR)/component-download-mondo.owl.owl $(TMPDIR)/component-download-mondo.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-mondo.owl.owl $(TMPDIR)/component-download-mondo.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-mondo.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/mondo.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-maxo.owl
component-download-maxo.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/maxo/maxo-base.owl \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/maxo.owl: component-download-maxo.owl $(TMPDIR)/stamp-component-maxo.owl
	@if cmp -s $(TMPDIR)/component-download-maxo.owl.owl $(TMPDIR)/component-download-maxo.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-maxo.owl.owl $(TMPDIR)/component-download-maxo.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-maxo.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/maxo.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-upheno.owl
component-download-upheno.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/upheno/upheno-base.owl \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/upheno.owl: component-download-upheno.owl $(TMPDIR)/stamp-component-upheno.owl
	@if cmp -s $(TMPDIR)/component-download-upheno.owl.owl $(TMPDIR)/component-download-upheno.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-upheno.owl.owl $(TMPDIR)/component-download-upheno.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-upheno.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/upheno.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-oba.owl
component-download-oba.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/oba/oba-base.owl \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/oba.owl: component-download-oba.owl $(TMPDIR)/stamp-component-oba.owl
	@if cmp -s $(TMPDIR)/component-download-oba.owl.owl $(TMPDIR)/component-download-oba.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-oba.owl.owl $(TMPDIR)/component-download-oba.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-oba.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/oba.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-hp.owl
component-download-hp.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/hp/hp-base.owl \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/hp.owl: component-download-hp.owl $(TMPDIR)/stamp-component-hp.owl
	@if cmp -s $(TMPDIR)/component-download-hp.owl.owl $(TMPDIR)/component-download-hp.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-hp.owl.owl $(TMPDIR)/component-download-hp.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-hp.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/hp.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-fypo.owl
component-download-fypo.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/fypo/fypo-base.owl \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/fypo.owl: component-download-fypo.owl $(TMPDIR)/stamp-component-fypo.owl
	@if cmp -s $(TMPDIR)/component-download-fypo.owl.owl $(TMPDIR)/component-download-fypo.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-fypo.owl.owl $(TMPDIR)/component-download-fypo.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-fypo.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/fypo.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-zp.owl
component-download-zp.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/zp/zp-base.owl \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/zp.owl: component-download-zp.owl $(TMPDIR)/stamp-component-zp.owl
	@if cmp -s $(TMPDIR)/component-download-zp.owl.owl $(TMPDIR)/component-download-zp.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-zp.owl.owl $(TMPDIR)/component-download-zp.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-zp.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/zp.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-xpo.owl
component-download-xpo.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/xpo/xpo-base.owl \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/xpo.owl: component-download-xpo.owl $(TMPDIR)/stamp-component-xpo.owl
	@if cmp -s $(TMPDIR)/component-download-xpo.owl.owl $(TMPDIR)/component-download-xpo.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-xpo.owl.owl $(TMPDIR)/component-download-xpo.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-xpo.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/xpo.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-mp.owl
component-download-mp.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/mp/mp-base.owl \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/mp.owl: component-download-mp.owl $(TMPDIR)/stamp-component-mp.owl
	@if cmp -s $(TMPDIR)/component-download-mp.owl.owl $(TMPDIR)/component-download-mp.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-mp.owl.owl $(TMPDIR)/component-download-mp.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-mp.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/mp.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-wbphenotype.owl
component-download-wbphenotype.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/wbphenotype/wbphenotype-base.owl \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/wbphenotype.owl: component-download-wbphenotype.owl $(TMPDIR)/stamp-component-wbphenotype.owl
	@if cmp -s $(TMPDIR)/component-download-wbphenotype.owl.owl $(TMPDIR)/component-download-wbphenotype.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-wbphenotype.owl.owl $(TMPDIR)/component-download-wbphenotype.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-wbphenotype.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/wbphenotype.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-ddpheno.owl
component-download-ddpheno.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/ddpheno/ddpheno-base.owl \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/ddpheno.owl: component-download-ddpheno.owl $(TMPDIR)/stamp-component-ddpheno.owl
	@if cmp -s $(TMPDIR)/component-download-ddpheno.owl.owl $(TMPDIR)/component-download-ddpheno.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-ddpheno.owl.owl $(TMPDIR)/component-download-ddpheno.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-ddpheno.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/ddpheno.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-dpo.owl
component-download-dpo.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/dpo/dpo-base.owl \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/dpo.owl: component-download-dpo.owl $(TMPDIR)/stamp-component-dpo.owl
	@if cmp -s $(TMPDIR)/component-download-dpo.owl.owl $(TMPDIR)/component-download-dpo.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-dpo.owl.owl $(TMPDIR)/component-download-dpo.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-dpo.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/dpo.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-uberon.owl
component-download-uberon.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/uberon/uberon-base.owl \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/uberon.owl: component-download-uberon.owl $(TMPDIR)/stamp-component-uberon.owl
	@if cmp -s $(TMPDIR)/component-download-uberon.owl.owl $(TMPDIR)/component-download-uberon.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-uberon.owl.owl $(TMPDIR)/component-download-uberon.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-uberon.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/uberon.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-cl.owl
component-download-cl.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/cl/cl-base.owl \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/cl.owl: component-download-cl.owl $(TMPDIR)/stamp-component-cl.owl
	@if cmp -s $(TMPDIR)/component-download-cl.owl.owl $(TMPDIR)/component-download-cl.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-cl.owl.owl $(TMPDIR)/component-download-cl.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-cl.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/cl.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-ddanat.owl
component-download-ddanat.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/ddanat.owl \
		 remove --base-iri http://purl.obolibrary.org/obo/ddanat# \
		        --base-iri http://purl.obolibrary.org/obo/DDANAT_ \
		        --axioms external --preserve-structure false --trim false \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/ddanat.owl: component-download-ddanat.owl $(TMPDIR)/stamp-component-ddanat.owl
	@if cmp -s $(TMPDIR)/component-download-ddanat.owl.owl $(TMPDIR)/component-download-ddanat.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-ddanat.owl.owl $(TMPDIR)/component-download-ddanat.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-ddanat.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/ddanat.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-wbbt.owl
component-download-wbbt.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/wbbt.owl \
		 remove --base-iri http://purl.obolibrary.org/obo/wbbt# \
		        --base-iri http://purl.obolibrary.org/obo/WBbt_ \
		        --axioms external --preserve-structure false --trim false \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/wbbt.owl: component-download-wbbt.owl $(TMPDIR)/stamp-component-wbbt.owl
	@if cmp -s $(TMPDIR)/component-download-wbbt.owl.owl $(TMPDIR)/component-download-wbbt.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-wbbt.owl.owl $(TMPDIR)/component-download-wbbt.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-wbbt.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/wbbt.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-fbbt.owl
component-download-fbbt.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/fbbt.owl \
		 remove --base-iri http://purl.obolibrary.org/obo/fbbt# \
		        --base-iri http://purl.obolibrary.org/obo/FBbt_ \
		        --axioms external --preserve-structure false --trim false \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/fbbt.owl: component-download-fbbt.owl $(TMPDIR)/stamp-component-fbbt.owl
	@if cmp -s $(TMPDIR)/component-download-fbbt.owl.owl $(TMPDIR)/component-download-fbbt.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-fbbt.owl.owl $(TMPDIR)/component-download-fbbt.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-fbbt.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/fbbt.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-zfa.owl
component-download-zfa.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/zfa.owl \
		 remove --base-iri http://purl.obolibrary.org/obo/ZFA_ \
		        --axioms external --preserve-structure false --trim false \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/zfa.owl: component-download-zfa.owl $(TMPDIR)/stamp-component-zfa.owl
	@if cmp -s $(TMPDIR)/component-download-zfa.owl.owl $(TMPDIR)/component-download-zfa.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-zfa.owl.owl $(TMPDIR)/component-download-zfa.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-zfa.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/zfa.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-xao.owl
component-download-xao.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/xao.owl \
		 remove --base-iri http://purl.obolibrary.org/obo/XAO_ \
		        --axioms external --preserve-structure false --trim false \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/xao.owl: component-download-xao.owl $(TMPDIR)/stamp-component-xao.owl
	@if cmp -s $(TMPDIR)/component-download-xao.owl.owl $(TMPDIR)/component-download-xao.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-xao.owl.owl $(TMPDIR)/component-download-xao.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-xao.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/xao.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-emapa.owl
component-download-emapa.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/emapa.owl \
		 remove --base-iri http://purl.obolibrary.org/obo/emapa# \
		        --base-iri http://purl.obolibrary.org/obo/EMAPA_ \
		        --axioms external --preserve-structure false --trim false \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/emapa.owl: component-download-emapa.owl $(TMPDIR)/stamp-component-emapa.owl
	@if cmp -s $(TMPDIR)/component-download-emapa.owl.owl $(TMPDIR)/component-download-emapa.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-emapa.owl.owl $(TMPDIR)/component-download-emapa.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-emapa.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/emapa.owl
endif # MIR=true

ifeq ($(MIR),true)
.PHONY: component-download-hsapdv.owl
component-download-hsapdv.owl: | $(TMPDIR)
	$(ROBOT) merge -I http://purl.obolibrary.org/obo/hsapdv.owl \
		 remove --base-iri http://purl.obolibrary.org/obo/hsapdv# \
		        --base-iri http://purl.obolibrary.org/obo/HsapDv_ \
		        --axioms external --preserve-structure false --trim false \
		 annotate --annotation owl:versionInfo $(VERSION) --output $(TMPDIR)/$@.owl

$(COMPONENTSDIR)/hsapdv.owl: component-download-hsapdv.owl $(TMPDIR)/stamp-component-hsapdv.owl
	@if cmp -s $(TMPDIR)/component-download-hsapdv.owl.owl $(TMPDIR)/component-download-hsapdv.owl.tmp.owl ; then \
	        echo "Component identical." ; \
	else \
	        echo "Component different, updating." && \
	        cp $(TMPDIR)/component-download-hsapdv.owl.owl $(TMPDIR)/component-download-hsapdv.owl.tmp.owl && \
	        $(ROBOT) annotate --input $(TMPDIR)/component-download-hsapdv.owl.owl \
	                          --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
	                          --output $@ ; \
	fi
.PRECIOUS: $(COMPONENTSDIR)/hsapdv.owl
endif # MIR=true

endif # COMP=true
# ----------------------------------------
# Mirroring upstream ontologies
# ----------------------------------------

ifeq ($(MIR),true)


## ONTOLOGY: monochrom
.PHONY: mirror-monochrom
.PRECIOUS: $(MIRRORDIR)/monochrom.owl
mirror-monochrom: | $(TMPDIR)
	$(ROBOT) remove -I https://raw.githubusercontent.com/monarch-initiative/monochrom/refs/heads/master/chr-base.owl --base-iri http://purl.obolibrary.org/obo/CHR_  --axioms external --preserve-structure false --trim false -o $(TMPDIR)/$@.owl


## ONTOLOGY: ncbigene
.PHONY: mirror-ncbigene
.PRECIOUS: $(MIRRORDIR)/ncbigene.owl
mirror-ncbigene: | $(TMPDIR)
	curl -L $(OBOBASE)/ncbigene.owl --create-dirs -o $(TMPDIR)/ncbigene-download.owl --retry 4 --max-time 400 && \
	$(ROBOT) remove -i $(TMPDIR)/ncbigene-download.owl --base-iri http://identifiers.org/ncbigene/ --axioms external --preserve-structure false --trim false -o $(TMPDIR)/$@.owl


## ONTOLOGY: hgnc
.PHONY: mirror-hgnc
.PRECIOUS: $(MIRRORDIR)/hgnc.owl
mirror-hgnc: | $(TMPDIR)
	curl -L $(OBOBASE)/hgnc.owl --create-dirs -o $(TMPDIR)/hgnc-download.owl --retry 4 --max-time 400 && \
	$(ROBOT) remove -i $(TMPDIR)/hgnc-download.owl --base-iri http://identifiers.org/hgnc/ --axioms external --preserve-structure false --trim false -o $(TMPDIR)/$@.owl


## ONTOLOGY: so
.PHONY: mirror-so
.PRECIOUS: $(MIRRORDIR)/so.owl
mirror-so: | $(TMPDIR)
	curl -L $(OBOBASE)/so.owl --create-dirs -o $(TMPDIR)/so-download.owl --retry 4 --max-time 400 && \
	$(ROBOT) remove -i $(TMPDIR)/so-download.owl --base-iri http://purl.obolibrary.org/obo/SO_ --axioms external --preserve-structure false --trim false -o $(TMPDIR)/$@.owl


## ONTOLOGY: bspo
.PHONY: mirror-bspo
.PRECIOUS: $(MIRRORDIR)/bspo.owl
mirror-bspo: | $(TMPDIR)
	curl -L $(OBOBASE)/bspo/bspo-base.owl --create-dirs -o $(TMPDIR)/bspo-download.owl --retry 4 --max-time 400 && \
	$(ROBOT) convert -i $(TMPDIR)/bspo-download.owl -o $(TMPDIR)/$@.owl


## ONTOLOGY: wbls
.PHONY: mirror-wbls
.PRECIOUS: $(MIRRORDIR)/wbls.owl
mirror-wbls: | $(TMPDIR)
	curl -L $(OBOBASE)/wbls/wbls-base.owl --create-dirs -o $(TMPDIR)/wbls-download.owl --retry 4 --max-time 400 && \
	$(ROBOT) convert -i $(TMPDIR)/wbls-download.owl -o $(TMPDIR)/$@.owl


## ONTOLOGY: zfs
.PHONY: mirror-zfs
.PRECIOUS: $(MIRRORDIR)/zfs.owl
mirror-zfs: | $(TMPDIR)
	$(ROBOT) remove -I http://purl.obolibrary.org/obo/zfa.owl --base-iri http://purl.obolibrary.org/obo/ZFS_  --axioms external --preserve-structure false --trim false -o $(TMPDIR)/$@.owl


## ONTOLOGY: fbdv
.PHONY: mirror-fbdv
.PRECIOUS: $(MIRRORDIR)/fbdv.owl
mirror-fbdv: | $(TMPDIR)
	curl -L $(OBOBASE)/fbdv/fbdv-base.owl --create-dirs -o $(TMPDIR)/fbdv-download.owl --retry 4 --max-time 400 && \
	$(ROBOT) convert -i $(TMPDIR)/fbdv-download.owl -o $(TMPDIR)/$@.owl


## ONTOLOGY: chebi
.PHONY: mirror-chebi
.PRECIOUS: $(MIRRORDIR)/chebi.owl
mirror-chebi: | $(TMPDIR)
	$(ROBOT) remove -I https://github.com/obophenotype/chebi_obo_slim/releases/latest/download/chebi_slim.owl --base-iri http://purl.obolibrary.org/obo/CHEBI_  --axioms external --preserve-structure false --trim false -o $(TMPDIR)/$@.owl


## ONTOLOGY: pr
.PHONY: mirror-pr
.PRECIOUS: $(MIRRORDIR)/pr.owl
mirror-pr: | $(TMPDIR)
	$(ROBOT) remove -I https://raw.githubusercontent.com/obophenotype/pro_obo_slim/master/pr_slim.owl --base-iri http://purl.obolibrary.org/obo/PR_  --axioms external --preserve-structure false --trim false -o $(TMPDIR)/$@.owl


## ONTOLOGY: eco
.PHONY: mirror-eco
.PRECIOUS: $(MIRRORDIR)/eco.owl
mirror-eco: | $(TMPDIR)
	curl -L $(OBOBASE)/eco.owl --create-dirs -o $(TMPDIR)/eco-download.owl --retry 4 --max-time 400 && \
	$(ROBOT) remove -i $(TMPDIR)/eco-download.owl --base-iri http://purl.obolibrary.org/obo/ECO_ --axioms external --preserve-structure false --trim false -o $(TMPDIR)/$@.owl


## ONTOLOGY: bfo
.PHONY: mirror-bfo
.PRECIOUS: $(MIRRORDIR)/bfo.owl
mirror-bfo: | $(TMPDIR)
	curl -L $(OBOBASE)/bfo.owl --create-dirs -o $(TMPDIR)/bfo-download.owl --retry 4 --max-time 400 && \
	$(ROBOT) remove -i $(TMPDIR)/bfo-download.owl --base-iri http://purl.obolibrary.org/obo/BFO_ --axioms external --preserve-structure false --trim false -o $(TMPDIR)/$@.owl


## ONTOLOGY: ro
.PHONY: mirror-ro
.PRECIOUS: $(MIRRORDIR)/ro.owl
mirror-ro: | $(TMPDIR)
	curl -L $(OBOBASE)/ro/ro-base.owl --create-dirs -o $(TMPDIR)/ro-download.owl --retry 4 --max-time 400 && \
	$(ROBOT) convert -i $(TMPDIR)/ro-download.owl -o $(TMPDIR)/$@.owl


## ONTOLOGY: ncbitaxon-taxslim
.PHONY: mirror-ncbitaxon-taxslim
.PRECIOUS: $(MIRRORDIR)/ncbitaxon-taxslim.owl
mirror-ncbitaxon-taxslim: | $(TMPDIR)
	$(ROBOT) remove -I http://purl.obolibrary.org/obo/ncbitaxon/subsets/taxslim.owl --base-iri http://purl.obolibrary.org/obo/NCBITaxon_  --axioms external --preserve-structure false --trim false -o $(TMPDIR)/$@.owl


## ONTOLOGY: pato
.PHONY: mirror-pato
.PRECIOUS: $(MIRRORDIR)/pato.owl
mirror-pato: | $(TMPDIR)
	curl -L $(OBOBASE)/pato/pato-base.owl --create-dirs -o $(TMPDIR)/pato-download.owl --retry 4 --max-time 400 && \
	$(ROBOT) convert -i $(TMPDIR)/pato-download.owl -o $(TMPDIR)/$@.owl


## ONTOLOGY: mpath
.PHONY: mirror-mpath
.PRECIOUS: $(MIRRORDIR)/mpath.owl
mirror-mpath: | $(TMPDIR)
	curl -L $(OBOBASE)/mpath.owl --create-dirs -o $(TMPDIR)/mpath-download.owl --retry 4 --max-time 400 && \
	$(ROBOT) remove -i $(TMPDIR)/mpath-download.owl --base-iri http://purl.obolibrary.org/obo/MPATH_ --axioms external --preserve-structure false --trim false -o $(TMPDIR)/$@.owl


## ONTOLOGY: nbo
.PHONY: mirror-nbo
.PRECIOUS: $(MIRRORDIR)/nbo.owl
mirror-nbo: | $(TMPDIR)
	curl -L $(OBOBASE)/nbo.owl --create-dirs -o $(TMPDIR)/nbo-download.owl --retry 4 --max-time 400 && \
	$(ROBOT) remove -i $(TMPDIR)/nbo-download.owl --base-iri http://purl.obolibrary.org/obo/NBO_ --axioms external --preserve-structure false --trim false -o $(TMPDIR)/$@.owl


## ONTOLOGY: foodon
.PHONY: mirror-foodon
.PRECIOUS: $(MIRRORDIR)/foodon.owl
mirror-foodon: | $(TMPDIR)
	curl -L $(OBOBASE)/foodon.owl --create-dirs -o $(TMPDIR)/foodon-download.owl --retry 4 --max-time 400 && \
	$(ROBOT) remove -i $(TMPDIR)/foodon-download.owl --base-iri http://purl.obolibrary.org/obo/FOODON_ --axioms external --preserve-structure false --trim false -o $(TMPDIR)/$@.owl


## ONTOLOGY: upheno-bridge
.PHONY: mirror-upheno-bridge
.PRECIOUS: $(MIRRORDIR)/upheno-bridge.owl
mirror-upheno-bridge: | $(TMPDIR)
	$(ROBOT) convert -I https://raw.githubusercontent.com/obophenotype/upheno/refs/heads/master/src/ontology/components/upheno-bridge.owl -o $(TMPDIR)/$@.owl


## ONTOLOGY: upheno-alignments
.PHONY: mirror-upheno-alignments
.PRECIOUS: $(MIRRORDIR)/upheno-alignments.owl
mirror-upheno-alignments: | $(TMPDIR)
	$(ROBOT) convert -I https://raw.githubusercontent.com/obophenotype/upheno/refs/heads/master/src/ontology/components/upheno-alignments.owl -o $(TMPDIR)/$@.owl

ALL_MIRRORS = $(patsubst %, $(MIRRORDIR)/%.owl, $(IMPORTS))
MERGE_MIRRORS = true

ifeq ($(MERGE_MIRRORS),true)
$(MIRRORDIR)/merged.owl: $(ALL_MIRRORS)
	$(ROBOT) merge $(patsubst %, -i %, $^)  -o $@
.PRECIOUS: $(MIRRORDIR)/merged.owl
endif


$(MIRRORDIR)/%.owl: mirror-% | $(MIRRORDIR)
	if [ -f $(TMPDIR)/mirror-$*.owl ]; then if cmp -s $(TMPDIR)/mirror-$*.owl $@ ; then echo "Mirror identical, ignoring."; else echo "Mirrors different, updating." &&\
		cp $(TMPDIR)/mirror-$*.owl $@; fi; fi

endif # MIR=true



# ----------------------------------------
# Subsets
# ----------------------------------------
$(SUBSETDIR)/%.tsv: $(SUBSETDIR)/%.owl
	$(ROBOT) export -i $< --include classes \
		        --header "ID [IRI]|LABEL" --format tsv --export $@
.PRECIOUS: $(SUBSETDIR)/%.tsv

$(SUBSETDIR)/%.owl: $(ONT).owl | $(SUBSETDIR) all_robot_plugins
	$(ROBOT) odk:subset -i $< --subset $* --fill-gaps true \
		 annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) -o $@
.PRECIOUS: $(SUBSETDIR)/%.owl


$(SUBSETDIR)/%.json: $(SUBSETDIR)/%.owl
	$(ROBOT) convert --input $< --check false -f json -o $@.tmp.json &&\
	mv $@.tmp.json $@


# ---------------------------------------------
# Sparql queries: Table exports / Query Reports
# ---------------------------------------------

SPARQL_EXPORTS_ARGS = $(foreach V,$(SPARQL_EXPORTS),-s $(SPARQLDIR)/$(V).sparql $(REPORTDIR)/$(V).tsv)
# This combines all into one single command

.PHONY: custom_reports
custom_reports: $(EDIT_PREPROCESSED) | $(REPORTDIR)
ifneq ($(SPARQL_EXPORTS_ARGS),)
	$(ROBOT) query -f tsv --use-graphs true -i $< $(SPARQL_EXPORTS_ARGS)
endif

# ----------------------------------------
# SSSOM Mapping Files
# ----------------------------------------

validate-sssom-%:
	tsvalid $(MAPPINGDIR)/$*.sssom.tsv --comment "#"
	sssom validate $(MAPPINGDIR)/$*.sssom.tsv

validate_mappings:
	$(MAKE_FAST) $(foreach n,$(MAPPINGS),validate-sssom-$(n))

normalize-sssom-%:
	sssom-cli --output $(MAPPINGDIR)/$*.sssom.tsv $(MAPPINGDIR)/$*.sssom.tsv

normalize_mappings:
	$(MAKE_FAST) $(foreach n,$(MAPPINGS),normalize-sssom-$(n))

ifeq ($(MIR),true)
$(MAPPINGDIR)/uberon.sssom.tsv:
	wget "http://purl.obolibrary.org/obo/uberon/uberon.sssom.tsv" -O $@
endif

ifeq ($(MIR),true)
$(MAPPINGDIR)/cl.sssom.tsv:
	wget "http://purl.obolibrary.org/obo/cl/cl.sssom.tsv" -O $@
endif

ifeq ($(MIR),true)
$(MAPPINGDIR)/upheno-oba.sssom.tsv:
	wget "https://raw.githubusercontent.com/obophenotype/upheno/refs/heads/master/src/mappings/upheno-oba.sssom.tsv" -O $@
endif

# ----------------------------------------
# Release artefacts: export formats
# ----------------------------------------


$(ONT)-base.json: $(ONT)-base.owl
	$(ROBOT) annotate --input $< --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
		convert --check false -f json -o $@.tmp.json &&\
		mv $@.tmp.json $@
$(ONT)-full.json: $(ONT)-full.owl
	$(ROBOT) annotate --input $< --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
		convert --check false -f json -o $@.tmp.json &&\
		mv $@.tmp.json $@
phenio-sspo-equivalent.json: phenio-sspo-equivalent.owl
	$(ROBOT) annotate --input $< --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
		convert --check false -f json -o $@.tmp.json &&\
		mv $@.tmp.json $@
# ----------------------------------------
# Release artefacts: main release artefacts
# ----------------------------------------

$(ONT).owl: $(ONT)-full.owl
	$(ROBOT) annotate --input $< --ontology-iri $(URIBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
		convert -o $@.tmp.owl && mv $@.tmp.owl $@

$(ONT).json: $(ONT).owl
	$(ROBOT) annotate --input $< --ontology-iri $(URIBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
		convert --check false -f json -o $@.tmp.json &&\
		mv $@.tmp.json $@
# -----------------------------------------------------
# Release artefacts: variants (base, full, simple, etc)
# -----------------------------------------------------
SHARED_ROBOT_COMMANDS = 

$(ONTOLOGYTERMS): $(SRCMERGED)
	$(ROBOT) query -f csv -i $< --query ../sparql/phenio_terms.sparql $@

# ROBOT pipeline that merges imports, including components.
ROBOT_RELEASE_IMPORT_MODE=$(ROBOT) merge --input $< 

# ROBOT pipeline that removes imports, then merges components. This is for release artefacts that start from "base"
ROBOT_RELEASE_IMPORT_MODE_BASE=$(ROBOT) remove --input $< --select imports --trim false merge $(patsubst %, -i %, $(OTHER_SRC)) 

# base: A version of the ontology that does not include any externally imported axioms.
$(ONT)-base.owl: $(EDIT_PREPROCESSED) $(OTHER_SRC) $(IMPORT_FILES)
	$(ROBOT_RELEASE_IMPORT_MODE) \
	reason --reasoner $(REASONER) --equivalent-classes-allowed all --exclude-tautologies structural --annotate-inferred-axioms false \
	relax $(RELAX_OPTIONS) \
	reduce -r $(REASONER) $(REDUCE_OPTIONS) \
	remove --base-iri $(URIBASE)/PHENIO --axioms external --preserve-structure false --trim false \
	$(SHARED_ROBOT_COMMANDS) \
	annotate --link-annotation http://purl.org/dc/elements/1.1/type http://purl.obolibrary.org/obo/IAO_8000001 \
		--ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) \
		--output $@.tmp.owl && mv $@.tmp.owl $@
# Full: The full artefacts with imports merged, reasoned.
$(ONT)-full.owl: $(EDIT_PREPROCESSED) $(OTHER_SRC) $(IMPORT_FILES)
	$(ROBOT_RELEASE_IMPORT_MODE) \
		reason --reasoner $(REASONER) --equivalent-classes-allowed all --exclude-tautologies structural \
		relax $(RELAX_OPTIONS) \
		reduce -r $(REASONER) $(REDUCE_OPTIONS) \
		$(SHARED_ROBOT_COMMANDS) annotate --ontology-iri $(ONTBASE)/$@ $(ANNOTATE_ONTOLOGY_VERSION) --output $@.tmp.owl && mv $@.tmp.owl $@

phenio-sspo-equivalent.owl:
	echo "ERROR: You have configured a custom release artefact ($@); this release artefact needs to be define in phenio.Makefile!" && false
# ----------------------------------------
# Debugging Tools
# ----------------------------------------

explain_unsat: $(EDIT_PREPROCESSED) 
	$(ROBOT) explain -i $< -M unsatisfiability --unsatisfiable random:10 --explanation $(TMPDIR)/$@.md



GHVERSION=v$(VERSION)

.PHONY: public_release
public_release:
	@test $(GHVERSION)
	ls -alt $(RELEASE_ASSETS_AFTER_RELEASE)
	gh release create $(GHVERSION) --title "$(VERSION) Release" --draft $(RELEASE_ASSETS_AFTER_RELEASE) --generate-notes

# ----------------------------------------
# General Validation
# ----------------------------------------
TSV=
ALL_TSV_FILES=

validate-tsv: $(TSV) | $(TMPDIR)
	for FILE in $< ; do \
		tsvalid $$FILE > $(TMPDIR)/validate.txt; \
		if [ -s $(TMPDIR)/validate.txt ]; then cat $(TMPDIR)/validate.txt && exit 1; fi ; \
	done

validate-all-tsv: $(ALL_TSV_FILES)
	$(MAKE) validate-tsv TSV="$^"

# ----------------------------------------
# Editors Utilities
# ----------------------------------------

# This is an experimental target people that want to use ODK Extended Prefix Map (EPM)
# can use to pull the (currently inofficial) OBO EPM into the workspace.
# Users are instructed to refer to the EPM only through the variable $(EXTENDED_PREFIX_MAP) as 
# its location might change in a feature version of ODK.
$(EXTENDED_PREFIX_MAP): /tools/obo.epm.json
	cp $< $@



.PHONY: normalize_src
normalize_src: $(SRC)
	$(ROBOT) convert -i $< -f ofn -o $(TMPDIR)/normalise && mv $(TMPDIR)/normalise $<

.PHONY: validate_idranges
validate_idranges:
	if [ -f phenio-idranges.owl ]; then \
		dicer-cli policy --assume-manchester --show-owlapi-error phenio-idranges.owl ; \
	fi

# Deprecated: Use 'sh run.sh odk.py update' without using the Makefile.
.PHONY: update_repo
update_repo:
	odk.py update
	

update_docs:
	mkdocs gh-deploy --config-file ../../mkdocs.yaml

# Note to future generations: computing the real path relative to the
# current directory is a way to ensure we only clean up directories that
# are located below the current directory, regardless of the contents of
# the *DIR variables.
.PHONY: clean
clean:
	for dir in $(MIRRORDIR) $(TMPDIR) $(UPDATEREPODIR) ; do      \
		reldir=$$(realpath --relative-to=$$(pwd) $$dir) ;    \
		case $$reldir in .*|"") ;; *) rm -rf $$reldir/* ;; esac \
	done
	rm -f $(CLEANFILES)

.PHONY: help
help:
	@echo "$$data"

define data
Usage: [IMAGE=(odklite|odkfull)] [ODK_DEBUG=yes] sh run.sh make [(IMP|MIR|IMP_LARGE|PAT)=(false|true)] command

----------------------------------------
	Command reference
----------------------------------------

Core commands:
* prepare_release:	Run the entire release pipeline. Use make IMP=false prepare_release to avoid rerunning the imports
* prepare_release_fast:	Run the entire release pipeline without refreshing imports, recreating components or recompiling patterns.
* update_repo:		Update the ODK repository setup using the config file phenio-odk.yaml (DEPRECATED)
* test:			Running all validation tests
* test_fast:		Runs the test suite, but without updating imports or components
* odkversion:		Show the current version of the ODK Makefile and ROBOT.
* clean:		Delete all temporary files
* help:			Print ODK Usage information
* public_release:	Uploads the release file to a release management system, such as GitHub releases. Must be configured.


Imports management:
* refresh-imports:			Refresh all imports and mirrors.
* recreate-components:			Recreate all components.
* no-mirror-refresh-imports:		Refresh all imports without downloading mirrors.
* refresh-imports-excluding-large:	Refresh all imports and mirrors, but skipping the ones labelled as 'is_large'.
* refresh-%:				Refresh a single import, i.e. refresh-go will refresh 'imports/go_import.owl'.
* no-mirror-refresh-%:			Refresh a single import without updating the mirror, i.e. refresh-go will refresh 'imports/go_import.owl'.
* mirror-%:				Refresh a single mirror.

Editor utilities:
* validate_idranges:	Make sure your ID ranges file is formatted correctly
* normalize_src:	Load and save your phenio-edit file after you to make sure its serialised correctly
* explain_unsat:	If you have unsatisfiable classes, this command will create a markdown file (tmp/explain_unsat.md) which will explain all your unsatisfiable classes
* validate-all-tsv:	Check all your tsv files for possible problems in syntax. Use ALL_TSV_FILES variable to list files
* validate-tsv:		Check a tsv file for syntactic problems with tsvalid. Use TSV variable to pass filepath, e.g. make TSV=../my.tsv validate-tsv.
* release_diff:	Create a diff between the current release and the new release

Additional build commands (advanced users)
* all:			Run the entire pipeline (like prepare_release), but without copying the release files to the release directory.
* all_subsets:		Build all subsets
* custom_reports:	Generate all custom sparql reports you have configured in your phenio-odk.yaml file.
* all_assets:		Build all assets
* show_assets:		Print a list of all assets that would be build by the release pipeline
* all_mappings:		Update all SSSOM mapping sets

Additional QC commands (advanced users)
* robot_reports:	Run all configured ROBOT reports
* validate_profile_%:	Run an OWL2 DL profile validation check, for example validate_profile_phenio-edit.owl.
* reason_test: Run a basic reasoning test

Examples: 
* sh run.sh make IMP=false prepare_release
* sh run.sh make test

Tricks:
* To forcefully rebuild a target even if nothing has changed, either
  invoke the 'clean' target (which will wipe out intermediate files)
  or touch a file that your target depends on (typically the -edit file).
* Use the IMAGE parameter to the run.sh script to use a different image like odklite
* Use ODK_DEBUG=yes sh run.sh make ... to print information about timing and debugging

Updating the repository:
(to apply changes to the ODK configuration or switch to a newer ODK version)
* sh run.sh update_repo

endef
export data

include phenio.Makefile