# =================================================================================================
# Generic Makefile for a research paper
#
# Colin Perkins <csp@csperkins.org>
# Copyright (C) 2016-2019 University of Glasgow
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
#    this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
#    this list of conditions and the following disclaimer in the documentation
#    and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

# =================================================================================================
# Configuration for make:
#
# Nothing in this section should need to change on a per-project basis.

# Warn if the Makefile references undefined variables and remove built-in rules:
MAKEFLAGS += --output-sync --warn-undefined-variables --no-builtin-rules --no-builtin-variables

# Remove output of failed commands, to avoid confusing later runs of make:
.DELETE_ON_ERROR:

# Remove obsolete old-style default suffix rules:
.SUFFIXES:

# List of targets that don't represent files:
.PHONY: all clean check-make check-downloads

# =================================================================================================
# Configuration for the project:

PDF_FILE = papers/rfc-errata.pdf

TABLES = tables/errata-stats-area.tex \
         tables/errata-stats-stream.tex \
         tables/errata-stats-status.tex \
         tables/top-filers-errata.tex \
         tables/top-rfcs-errata.tex \

DATA = data/errata-by-area.csv \
       data/errata-by-rfc.csv \
       data/errata-by-year.csv \
       data/errata-by-status.csv \
       data/errata-submission-dates.csv \
       data/errata-submission-dates-area.csv \
       data/errata-by-status.csv \
       data/errata-by-submitter.csv \
       data/errata-by-type-filing-year.csv \
       data/errata-by-status-filing-year.csv \
       data/errata-by-area-filing-year.csv \
       data/errata-by-filing-year.csv \
       data/errata-by-rfc-by-area.csv \
       data/errata-by-submitter-alldata.csv \
       data/maillist_yearly_monthly_type_active_status.json \
       data/overall_email_uri_mapping.csv \
       data/maillist_area_type_status.json \
       data/overall_email_unique.csv \
       data/yang-rfc-stats.csv \
       data/errata-location-sections.csv \
       data/errata-location-percentiles.csv \
       data/RFC-all \
       data/inline-errata \
       data/personID_to_personID_graph_new_with_mlisttype.csv \
       data/pid_count_emailing_yearly.csv \
       data/maillist_yearly_monthly_status.json \
       data/overall_unique_email_uri_mapping.csv \
       data/pid_emailID_dict.json \
       data/pid_name_dict.json \
       data/name_pid_dict.json \
       data/emailID_pid_dict.json \
       data/datatracker_pid_dict.json \
       data/pid_datatracker_dict.json \
       data/emailID_yearly_monthly_vol_dict.json \
       data/emailID_first_email.json \
       data/automated_email_IDs_newData.txt \
       data/role_based_emailIDs_newData.txt \
       data/frequency_emails_yearly_categories2.csv \
       data/pid_count_emailing_yearly.csv \
       data/email-discussion-inwg-emails.csv \
       data/email-discussion-outwg-emails.csv \
       data/errata.db \
       data/mail-archive-download.txt \
       data/rfc_draft_stats.csv \
       data/rfc_inbound_citations.csv \
       data/errata-by-citation-count.csv \
       data/draft_pid_discuss_map.csv \
       data/draft-area-discussion-counts.csv \
       data/people_aliases.csv \
       data/rfc_author_data.csv \
       data/pid_area_map.csv \
       data/errata-by-submitter-rfcs.csv \

FIGURES = figures/errata-by-year.pdf \
          figures/errata-submission-dates-area.pdf \
          figures/errata-by-status.pdf \
          figures/errata-by-rfc-by-area.pdf \
          figures/errata-by-citation-count.pdf \
          figures/location-percent.pdf \
          figures/section-title-counts.pdf \
          figures/errata-by-submitter-status.pdf \
          figures/errata-by-submitter-type.pdf \
          figures/errata-by-submitter-status-rejected.pdf \
          figures/yang-drafts.pdf \
          figures/rfcs-areas-discussion-filings-hist.pdf \
          figures/num_of_emails_inwg_CDF.pdf \
          figures/num_of_emails_outwg_CDF.pdf \

DOWNLOADS = data/errata.json data/all-rfc-txt.tar.gz

# Master build rule:
all: check-make $(DOWNLOADS) $(PDF_FILE)

$(PDF_FILE): $(FIGURES) $(TABLES) 

# =================================================================================================
# Project specific rules to download files:

data/errata.json: bin/download.sh check-downloads
	@sh bin/download.sh https://www.rfc-editor.org/errata.json $@

data/all-rfc-txt.tar.gz: bin/download.sh check-downloads
	@sh bin/download.sh https://www.rfc-editor.org/in-notes/tar/RFC-all.tar.gz $@

data/RFC-all: data/all-rfc-txt.tar.gz
	mkdir -p $@
	tar -xf data/all-rfc-txt.tar.gz -C data/RFC-all

data/inline-errata:
	rsync -avz --delete ftp.rfc-editor.org::rfcs/inline-errata data

download: $(DOWNLOADS)

check-downloads:

# =================================================================================================
# Data generation:

data/mail-archive-download.txt: data/mailarchive-download.py
	python data/mailarchive-download.py

data/errata-by-area.csv: data/errata.json data/errata-areas.py data/rfcerrata.py
	python data/errata-areas.py

data/errata-by-rfc.csv: data/errata.json data/errata-rfcs.py data/rfcerrata.py
	python data/errata-rfcs.py

tables/top-rfcs-errata.tex: data/errata.json tables/top-rfcs.py data/errata-by-rfc.csv
	python tables/top-rfcs.py
	
data/errata-by-year.csv: data/errata.json data/errata-by-year.py data/rfcerrata.py
	python data/errata-by-year.py

data/errata-submission-dates.csv: data/errata.json data/errata-submission-dates.py data/rfcerrata.py
	python data/errata-submission-dates.py

data/errata-submission-dates-area.csv: data/errata.json data/errata-submission-dates-area.py data/rfcerrata.py
	python data/errata-submission-dates-area.py

data/errata-by-status.csv: data/errata.json data/errata-by-status.py data/rfcerrata.py
	python data/errata-by-status.py

data/errata-by-submitter.csv: data/errata.json data/errata-by-submitter.py data/rfcerrata.py
	python data/errata-by-submitter.py

data/errata-by-type-filing-year.csv: data/errata.json data/errata-by-type-filing-year.py data/rfcerrata.py
	python data/errata-by-type-filing-year.py

data/errata-by-status-filing-year.csv: data/errata.json data/errata-by-status-filing-year.py data/rfcerrata.py
	python data/errata-by-status-filing-year.py

data/errata-by-area-filing-year.csv: data/errata.json data/errata-by-area-filing-year.py data/rfcerrata.py
	python data/errata-by-area-filing-year.py

data/errata-by-filing-year.csv: data/errata.json data/errata-by-filing-year.py data/rfcerrata.py
	python data/errata-by-filing-year.py

data/errata-by-rfc-by-area.csv: data/errata.json data/errata-by-rfc-by-area.py data/rfcerrata.py
	python data/errata-by-rfc-by-area.py

data/errata-by-submitter-alldata.csv: data/errata.json data/errata-by-submitter-alldata.py data/rfcerrata.py
	python data/errata-by-submitter-alldata.py

data/errata-by-citation-count.csv: data/errata.json data/errata-citation-counts.py data/rfcerrata.py data/rfc_inbound_citations.csv
	python data/errata-citation-counts.py

data/errata-location-sections.csv data/errata-location-percentiles.csv: data/errata-location-data.py data/errata.json | data/inline-errata
	python data/errata-location-data.py

data/yang-rfc-stats.csv: data/yang-rfc-stats.py | data/RFC-all
	python data/yang-rfc-stats.py

data/overall_email_unique.csv: data/overall_email_unique.py | data/mail-archive-download.txt
	python data/overall_email_unique.py

data/maillist_area_type_status.json: data/mailing-list-status.py | data/mail-archive-download.txt
	python data/mailing-list-status.py

data/overall_email_uri_mapping.csv: data/email-uri-mapping.py data/overall_email_unique.csv | data/mail-archive-download.txt
	python data/email-uri-mapping.py

data/overall_unique_email_uri_mapping.csv data/pid_emailID_dict.json data/pid_name_dict.json data/name_pid_dict.json data/emailID_pid_dict.json data/datatracker_pid_dict.json data/pid_datatracker_dict.json data/emailID_yearly_monthly_vol_dict.json data/emailID_first_email.json data/automated_email_IDs_newData.txt data/role_based_emailIDs_newData.txt data/frequency_emails_yearly_categories2.csv data/pid_count_emailing_yearly.csv \
: data/email-messages-year.py data/maillist_yearly_monthly_status.json data/overall_email_uri_mapping.csv | data/mail-archive-download.txt
	python data/email-messages-year.py

data/draft-area-discussion-counts.csv: data/pid-discussion-map.py data/maillist_area_type_status.json data/emailID_pid_dict.json | data/mail-archive-download.txt
	python data/pid-discussion-map.py

data/maillist_yearly_monthly_status.json: data/generate_maillist_yearly_monthly_status.py | data/mail-archive-download.txt
	python data/generate_maillist_yearly_monthly_status.py

data/maillist_yearly_monthly_type_active_status.json: data/generate_maillist_yearly_monthly_type_active_status.py | data/mail-archive-download.txt
	python data/generate_maillist_yearly_monthly_type_active_status.py

data/personID_to_personID_graph_new_with_mlisttype.csv: data/V2-generate_personID_pesonID_mappings.py data/emailID_pid_dict.json data/role_based_emailIDs_newData.txt data/automated_email_IDs_newData.txt data/emailID_yearly_monthly_vol_dict.json data/emailID_first_email.json data/pid_emailID_dict.json data/maillist_yearly_monthly_type_active_status.json | data/mail-archive-download.txt
	python data/V2-generate_personID_pesonID_mappings.py

data/email-discussion-inwg-emails.csv data/email-discussion-outwg-emails.csv: data/email-discussion-data.py data/name_pid_dict.json data/emailID_pid_dict.json data/emailID_first_email.json data/emailID_yearly_monthly_vol_dict.json data/maillist_area_type_status.json data/pid_emailID_dict.json data/personID_to_personID_graph_new_with_mlisttype.csv | data/mail-archive-download.txt
	python data/email-discussion-data.py

data/rfc_draft_stats.csv: data/rfc-draft-stats.py
	python data/rfc-draft-stats.py

data/rfc_inbound_citations.csv: data/rfc_inbound_citations.py data/rfc_draft_stats.csv
	python data/rfc_inbound_citations.py

data/people_aliases.csv: data/people_aliases.py
	python data/people_aliases.py

data/rfc_author_data.csv: data/rfc-author-data.py
	python data/rfc-author-data.py

data/errata-by-submitter-rfcs.csv: data/people_aliases.csv data/rfc_author_data.csv data/errata-by-submitter-alldata.csv data/errata-prev-author-counts.py
	python data/errata-prev-author-counts.py

# =================================================================================================
# Figure generation:

cat: tables/top-filers.py data/errata-by-submitter-alldata.csv data/errata-by-submitter-rfcs.csv
	python tables/top-filers.py

tables/errata-stats-area.tex tables/errata-stats-stream.tex tables/errata-stats-status.tex: tables/errata-stats.py data/errata.json
	python tables/errata-stats.py

tables/tables/top-rfcs-errata.tex: tables/top-rfcs.py data/errata-by-rfc.csv
	python tables/top-rfcs.py

figures/errata-by-submitter-status.pdf: data/errata-by-submitter-alldata.csv figures/errata-by-submitter-status.py
	python figures/errata-by-submitter-status.py

figures/errata-by-submitter-type.pdf: data/errata-by-submitter-alldata.csv figures/errata-by-submitter-type.py
	python figures/errata-by-submitter-type.py

figures/errata-by-submitter-status-rejected.pdf: data/errata-by-submitter-alldata.csv figures/errata-by-submitter-status-rejected.py
	python figures/errata-by-submitter-status-rejected.py

figures/location-percent.pdf: data/errata-location-percentiles.csv figures/location-percent.py
	python figures/location-percent.py

figures/section-title-counts.pdf: data/errata-location-sections.csv figures/section-title-counts.py
	python figures/section-title-counts.py

figures/yang-drafts.pdf: data/yang-rfc-stats.csv figures/yang-drafts.py
	python figures/yang-drafts.py

figures/rfcs-areas-discussion-filings-hist.pdf: data/draft-area-discussion-counts.csv figures/rfcs-areas-discussion-filings-hist.py
	python figures/rfcs-areas-discussion-filings-hist.py

figures/num_of_emails_inwg_CDF.pdf: figures/num_of_emails_inwg_CDF.py data/email-discussion-inwg-emails.csv
	python figures/num_of_emails_inwg_CDF.py

figures/num_of_emails_outwg_CDF.pdf: figures/num_of_emails_outwg_CDF.py data/email-discussion-outwg-emails.csv
	python figures/num_of_emails_outwg_CDF.py

figures/errata-by-citation-count.pdf: figures/errata-by-citation-count.py data/errata-by-citation-count.csv
	python figures/errata-by-citation-count.py

# =================================================================================================
# Generic rules:

# This Makefile requires GNU make:
check-make:
	$(if $(findstring GNU Make,$(shell $(MAKE) --version)),,$(error Not GNU make))

# =================================================================================================
# Generic rules to build PDF files and figures:

%.pdf: %.tex bin/latex-build.sh
	@sh   bin/latex-build.sh $<
	@perl bin/check-for-duplicate-words.perl $<
	@sh   bin/check-for-todo.sh              $<
	@sh   bin/check-for-ack.sh               $<

# Include dependency information for PDF files, if it exists:
-include $(PDF_FILE:%.pdf=%.dep)

figures/%.pdf: data/%.csv figures/%.py
	python figures/$*.py

# =================================================================================================
# Generic rules to build code:

# Pattern rules to build C programs comprising a single file:
CC     = clang
CFLAGS = -W -Wall -Wextra -O2 -g -std=c99

bin/%: src/%.c
	$(CC) $(CFLAGS) -o $@ $^

# =================================================================================================
# Generic rules to clean-up:

define xargs
$(if $(2),$(1) $(firstword $(2)))
$(if $(word 2,$(2)),$(call xargs,$(1),$(wordlist 2,$(words $(2)),$(2))))
endef

define remove
$(call xargs,rm -rf,$(1))
endef

define remove-latex
$(call xargs,sh bin/latex-build.sh --clean,$(1))
endef

clean:
	$(call remove,$(DOWNLOADS))
	$(call remove,$(FIGURES))
	$(call remove,$(TABLES))
	$(call remove,$(DATA))
	@$(call remove-latex,$(PDF_FILE:%.pdf=%.tex))

# =================================================================================================
# vim: set ts=2 sw=2 tw=0 ai: