\documentclass{beamer}
\usepackage{slides}
\usepackage{setspace}
\usepackage{placeins}  % \FloatBarrier

\usepackage{booktabs}
%\usepackage{tabularx}  % \extrarowheight

% Title.
%
\title{C++ Dependency Management}
\subtitle{from Package Consumption to Project Development}
\author{Boris Kolpackov}
\institute{Code Synthesis}
\date{v1.1, September 2018}

% Logo.
%
\pgfdeclareimage[height=0.7cm]{logo}{cs-logo}
\titlegraphic{
\begin{beamercolorbox}[sep=20pt,center]{black}
\pgfuseimage{logo}
\end{beamercolorbox}}

% Document.
%
\begin{document}

%
%
\begin{frame}
\titlepage
\end{frame}

%
%
\begin{frame}[fragile]
\frametitle{Packages}
\begin{center}
{\Large
%\setlength{\extrarowheight}{.5em}
\begin{tabular}{p{2.2cm}p{2.2cm}rr}
Node   & (npm)   & 600,000 &          \\ \addlinespace[.5em]
Python & (PyPI)  & 140,000 &          \\ \addlinespace[.5em]
Rust   & (cargo) & 18,000  & \uncover<2->{(16,000)} \\ \addlinespace[.5em]
C++    & (?)     & ?       &          \\
\end{tabular}}
\end{center}
\end{frame}


% frictionless
%
\begin{frame}[fragile]
\frametitle{What's our Problem?}
\begin{center}\alert{\Large Handle Entire Project Development Lifecycle}\end{center}
\bigskip
{\large
\begin{itemize}
  \itemsep0.7em
  \item Creation
  \item Building and Testing
  \item Dependency Management
  \item Releasing and Publishing
\end{itemize}}
\end{frame}

%
%
\begin{frame}[fragile]
\frametitle{\texttt{build2} Toolchain Overview}
\begin{center}
{\large
\setlength{\aboverulesep}{.5em}
\setlength{\belowrulesep}{.5em}
\begin{tabular}{p{1.6cm}l}
\verb|b|    & build system driver                  \\ \addlinespace[.5em]
\verb|bpkg| & package manager (\emph{consumption}) \\ \addlinespace[.5em]
\verb|bdep| & project manager (\emph{development}) \\
\midrule
\verb|git|  & version control system \\
\end{tabular}}
\end{center}
\end{frame}

%
%
\begin{frame}[fragile]
\frametitle{Example}
\begin{center}{\Large Another \emph{``Hello, World?''}}\end{center}
\bigskip
\pause
\begin{center}\alert{\Large How About Something Real?}\end{center}
\bigskip
\pause
\begin{center}{\Large Like a UUID Library?}\end{center}
\end{frame}

%
%
\begin{frame}[fragile]
\frametitle{Creating Libraries}
\begin{center}\alert{\Large Born out of a Real Need}\end{center}
\bigskip
{\large
\begin{itemize}
  \itemsep0.7em
  \item Scratch your own itch
  \item Do one thing but well
  \item Don't overengineer
  \item Have a test
\end{itemize}}
\end{frame}

%
%
\begin{frame}[fragile]
\frametitle{Versioning}
\begin{center}\alert{\Large Version is a \emph{Signaling Mechanism}}\end{center}
\end{frame}

%
%
\begin{frame}[fragile]
\frametitle{Versioning}
\begin{center}\alert{\Large Use \emph{SemVer} \texttt{MAJOR.MINOR.PATCH}}\end{center}
\bigskip
{\large
\begin{itemize}
  \itemsep0.7em
  \item Patch versions are \emph{binary-compatible}
  \item ... so use \verb|PATCH| primarily for bug fixes.
  \item Minor versions are \emph{source-compatible}
  \item ... so use \verb|MINOR| for additional features.
  \item If unsure, increment \verb|MAJOR|.
\end{itemize}}
\end{frame}

%
%
\begin{frame}[fragile]
\frametitle{Versioning Between Releases}
\begin{center}
\begin{tikzpicture}[
  node distance=8mm,
  action/.style={rounded corners,
                 fill=blue!50!black!20,
                 minimum height=.8cm,
                 draw=blue!50!black},
  code/.style={fill=green!50!black!20,
               minimum width=2cm,
               minimum height=.8cm,
               draw=green!50!black},
  group/.style={fill=black!10,draw=none,rounded corners,inner sep=6pt},
  arrow/.style={->,shorten >=1pt,>=stealth',thick},
  rarrow/.style={<-,shorten <=1pt,>=stealth',thick}]

  \fontsize{8pt}{9pt}\selectfont

  \tikzstyle{every node}=
  [
    inner sep=3pt,
    thick,
    anchor=north west
  ]

  \coordinate (DUMMY1) at (0,0);
  \coordinate (DUMMY2) at (11,2);
  \path (DUMMY1) (DUMMY2);

  \coordinate (TL) at (0,0.1);
  \coordinate (TR) at (11,0.1);
  \path (TL) edge[arrow] node[auto,swap] {} (TR);

  \node (V100) at (0.5, 1.5) [action,minimum width=1.5cm] {\texttt{1.0.0}};
  \filldraw       (1.25,0.1) circle (3pt);

  \node (V110) at (8.5, 1.5) [action,minimum width=1.5cm] {\texttt{1.1.0}};
  \filldraw       (9.25,0.1) circle (3pt);

  \pause

  \node (VXXX) at              (4.5, 1.5) [action,minimum width=1.5cm] {\texttt{???}};
  \filldraw[fill=red,draw=red] (5.25,0.1) circle (3pt);

\end{tikzpicture}
\end{center}
\end{frame}

%
%
\begin{frame}[fragile]
\frametitle{Versioning Between Releases}
\begin{center}\alert{\Large Pre-Release}\end{center}
\bigskip
\begin{center}
\begin{tikzpicture}[
  node distance=8mm,
  action/.style={rounded corners,
                 fill=blue!50!black!20,
                 minimum height=.8cm,
                 draw=blue!50!black},
  code/.style={fill=green!50!black!20,
               minimum width=2cm,
               minimum height=.8cm,
               draw=green!50!black},
  group/.style={fill=black!10,draw=none,rounded corners,inner sep=6pt},
  arrow/.style={->,shorten >=1pt,>=stealth',thick},
  rarrow/.style={<-,shorten <=1pt,>=stealth',thick}]

  \fontsize{8pt}{9pt}\selectfont

  \tikzstyle{every node}=
  [
    inner sep=3pt,
    thick,
    anchor=north west
  ]

  \coordinate (DUMMY1) at (0,0);
  \coordinate (DUMMY2) at (11,2);
  \path (DUMMY1) (DUMMY2);

  \coordinate (TL) at (0,0.1);
  \coordinate (TR) at (11,0.1);
  \path (TL) edge[arrow] node[auto,swap] {} (TR);

  \node (V100) at (0.5, 1.5) [action,minimum width=1.5cm] {\texttt{1.0.0}};
  \filldraw       (1.25,0.1) circle (3pt);

  \node (V110) at (8.5, 1.5) [action,minimum width=1.5cm] {\texttt{1.1.0}};
  \filldraw       (9.25,0.1) circle (3pt);

  \node (VXXX) at (4.25,1.5) [action,minimum width=2cm] {\texttt{1.1.0-a.1}};
  \filldraw       (5.25, 0.1) circle (3pt);

  \pause

  \filldraw[fill=red,draw=red] (3.25,0.1) circle (3pt);
  \filldraw[fill=red,draw=red] (7.25,0.1) circle (3pt);

\end{tikzpicture}
\end{center}
\end{frame}

%
%
\begin{frame}[fragile]
\frametitle{Versioning Between Releases}
\begin{center}\alert{\Large \emph{Continuous Versioning}}\end{center}
\bigskip
\bigskip
\begin{code}{text}
1.2.3                                   release
1.2.3-a.1                               pre-release
1.2.3-b.2                               pre-release
1.2.3-a.0.20180531072540.e4d2d772de35   snapshot
\end{code}
\end{frame}

%
%
\begin{frame}[fragile]
\frametitle{Package Repositories}
{\Large
\begin{itemize}
  \itemsep0.7em
  \item \emph{Version Control}-based
  \item \emph{Archive}-based
\end{itemize}}
\end{frame}

%
%
\begin{frame}[fragile]
\frametitle{Version Control-Based Repositories}
\begin{center}\alert{\Large Convenient for Package Developers}\end{center}
\bigskip
{\large
\begin{itemize}
  \itemsep0.7em
  \item Easy to setup (GitHub)
  \item Project Repository == Package Repository
\end{itemize}}
\end{frame}

%
%
\begin{frame}[fragile]
\frametitle{Archive-Based Repositories}
\begin{center}\alert{\Large Convenient for Package Consumers}\end{center}
\bigskip
{\large
\begin{itemize}
  \itemsep0.7em
  \item Searchable (packages are easy to discover)
  \item Reliable (packages won't disappear)
  \item Secure (packages are signed)
  \item Fast (packages are indexed and archived)
\end{itemize}}
\end{frame}

%
%
\begin{frame}[fragile]
\frametitle{\texttt{build2} Central Repository}
\begin{center}\colorhref{\LARGE \texttt{cppget.org}}{https://cppget.org}\end{center}
\end{frame}

%
%
\begin{frame}[fragile]
\frametitle{\texttt{cppget.org} Repository Policies}
\begin{center}\alert{\Large ``Rule of One''}\end{center}
\bigskip
{\large
\begin{itemize}
  \itemsep0.7em
  \item \verb|queue   --> testing  | builds on one platform
  \item \verb|testing --> stable   | has one test
  \item \verb|stable  --> legacy   | fails to build on one platform
\end{itemize}}
\end{frame}

%
%
\begin{frame}[fragile]
\frametitle{Version Constraints}
\begin{center}
{\large
\begin{tabular}{p{3cm}l}
\verb|^1.2.3|  & \verb|1.X.Y  | (recommended)    \\ \addlinespace[.5em]
\verb|~1.2.3|  & \verb|1.2.X  | (conservative)   \\ \addlinespace[.5em]
\verb|>=1.2.3| &                                 \\ \addlinespace[.5em]
\verb|[1.2.3 1.2.9)| &                           \\
\end{tabular}}
\end{center}
\end{frame}

%
%
\begin{frame}[fragile]
\frametitle{Summary}
{\Large
\begin{itemize}
  \itemsep0.7em
  \item \verb|genuuid|
  \item \verb|genuuid      --> libstud-uuid|
  \item \verb|libstud-uuid --> cppget.org|
\end{itemize}}
\end{frame}

%
%
\begin{frame}[fragile]
\frametitle{\texttt{build2} Key Points}
{\large
\begin{itemize}
  \itemsep0.7em
  \item Integrated build toolchain for C++
  \item Covers creation, development, testing, and delivery
  \item Uniform interface across platforms/compilers
  \item Archive and version control-based repositories
  \item Dependency-free, all you need is a C++ compiler
\end{itemize}}
\end{frame}

%
%
\begin{frame}[fragile]
\frametitle{Offer to C++ Community}
\smallskip
\begin{center}
{
\begin{tabular}{p{4.7cm}l}
\verb|linux-gcc_7.3|          & \verb|macos_10.12-clang_9.1|        \\ \addlinespace[.5em]
\verb|linux-gcc_8.2|          & \verb|macos_10.13-clang_10.0|       \\ \addlinespace[.5em]
\verb|linux-clang_5.0|        & \verb|macos_10.13-homebrew_gcc_8.1| \\ \addlinespace[.5em]
\verb|linux-clang_6.0|        &                                     \\ \addlinespace[.5em]
\verb|linux-clang_6.0_libc++| & \verb|windows_10-msvc_14u3|         \\ \addlinespace[.5em]
                              & \verb|windows_10-msvc_15u8|         \\ \addlinespace[.5em]
\verb|freebsd_11-clang_3.8|   & \verb|windows_10-mingw_w64_gcc_7.3| \\
\end{tabular}}
\end{center}
\smallskip
\begin{center}\colorhref{\Large \texttt{build2.org}}{https://build2.org}\end{center}
\end{frame}

%
%
\end{document}
