\subject{make for science}
\begin{document}
+\IfFileExists{./relevant_xkcd.png}{\frame[plain]{\centering \includegraphics[width=\textwidth,height=\textheight,keepaspectratio]{./relevant_xkcd.png}}}
+
\frame[plain]{\titlepage}
\mode<article>{\maketitle}
\item Simple rules -- all of the rules are in a simple text file
which is easily edited and version controlled
\item Reasonable debugging -- you can see the commands that make is
- going to run fairly easily: \mintinline{shell}{make -n tgt;}
+ going to run fairly easily: \mintinline{shell}{make -n target;}
\item Parallel -- make can make targets in parallel:
\mintinline{shell}{make -j8 all;}
\item Language agnostic -- make doesn't care what language your code
\item Variables can come from the environment and can be overridden on
the command line: \mintinline{shell}{make FOO=bleargh} or
\mintinline{shell}{FOO=blah make}.
-\item \mintinline{make}{$@} -- tgt name %$
+\item \mintinline{make}{$@} -- target name %$
\item \mintinline{make}{$*} -- current stem %$
\item \mintinline{make}{$^} -- all prerequisites %$
\item \mintinline{make}{$<} -- first prerequisite %$
\begin{frame}[fragile]{How does make know what to build?}
\begin{minted}[showtabs]{make}
-first_tgt:
+first_target:
touch $@
-second_tgt: first_tgt
+second_target: first_target
touch $@
\end{minted}
\begin{itemize}
- \item By default, make builds the first tgt.
- \item You can specify a specific tgt to build on the command line
- (\mintinline{shell}{make first_tgt}).
- \item You can change the default tgt by using the variable
- \mintinline{make}{.DEFAULT_GOAL := second_tgt}
+ \item By default, make builds the first target.
+ \item You can specify a specific target to build on the command line
+ (\mintinline{shell}{make first_target}).
+ \item You can change the default target by using the variable
+ \mintinline{make}{.DEFAULT_GOAL := second_target}
\end{itemize}
\end{frame}
.PHONY: clean
clean:
- rm -f first_tgt second_tgt
+ rm -f first_target second_target
\end{minted}
\begin{itemize}
\item \mintinline{make}{.PHONY} -- any time make considers this
- tgt, it is run unconditionally, even if a file exists.
- \item \mintinline{make}{.ONESHELL} -- when a tgt is built, all
+ target, it is run unconditionally, even if a file exists.
+ \item \mintinline{make}{.ONESHELL} -- when a target is built, all
lines will be given to a single invocation of the shell.
\item Lots of other special targets which are not described here.
\end{itemize}
\subsection{This Presentation}
\begin{frame}[fragile]{How this presentation is made}
-\inputminted[showtabs]{make}{Makefile}
+\inputminted[showtabs,breaklines,firstline=3]{make}{Makefile}
+\end{frame}
+\begin{frame}[fragile]{How this presentation is made}
\begin{itemize}
- \item all is the default tgt
+ \item all is the default
+ \item Download the optional relevant\_xkcd.png
\item Make .tex files from the knitr source.
\item The third rule uses latexmk to build the pdf using \XeLaTeX.
\end{itemize}
endif
make_fastq: $(FASTQ_FILES)
+\end{minted}
+%$
+\begin{itemize}
+\item Use ifeq/else/endif to handle paired reads differently from
+ unpaired reads
+\item FASTQ\_FILES is the full set of fastq files dumped from the SRAs.
+\end{itemize}
+\end{frame}
+\begin{frame}[fragile]{Calling records from SRA: Dumping fastq #2}
+\begin{minted}[showtabs,breaklines]{make}
ifeq ($(NREADS),1)
$(FASTQ_FILES): %.fastq.gz: %.sra
else
\end{minted}
%$
\begin{itemize}
- \item Call fastq-dump to dump the fastq files
\item Handles NREADS of 1 and 2 differently
+ \item Call fastq-dump to dump the fastq files
\end{itemize}
\end{frame}
\subsection{Complicated Workflows}
-\begin{frame}{What about complicated workflows?}
+\begin{frame}[fragile]{What about complicated workflows?}
\begin{itemize}
\item If your workflow is really complicated, what then?
\item Use some other language to write your workflow in
\item Use a simple makefile which just runs the workflow
\end{itemize}
+ \begin{minted}[showtabs,breaklines]{make}
+complicated_workflow_done: req1 req2 req3
+ ./complicated_workflow.sh $^;
+ touch $@;
+\end{minted}
\end{frame}
\section{Further Resources}