
\begin{frame}
  \frametitle{Starting from today}

  \begin{center}
    \huge Things you can start doing\newline Right Now™
  \end{center}
\end{frame}

% --------------------------------------------------

\begin{frame}[containsverbatim]
  \frametitle{Use targets in place of variables}

\begin{codebox}[minted options={fontsize=\scriptsize}]{CMake}{}
find_package(GTest REQUIRED)
find_package(Boost REQUIRED COMPONENTS system thread)
find_package(EXPAT REQUIRED) # only vars

add_library(alexandria …)
\end{codebox}

  \begin{columns}
    \begin{column}{.5\textwidth}
\begin{badcodebox}[equal height group=targets1]{CMake}
target_link_libraries(alexandria
  PRIVATE
    ${BOOST_LIBRARIES}
    ${EXPAT_LIBRARIES}
    ${GTEST_MAIN_LIBRARIES})
\end{badcodebox}
    \end{column}

    \begin{column}{.5\textwidth}
\begin{goodcodebox}[equal height group=targets1]{CMake}
target_link_libraries(alexandria
  PRIVATE
    Boost::system
    Boost::thread
    GTest::Main
    ${EXPAT_LIBRARIES}) # legacy
\end{goodcodebox}
    \end{column}
  \end{columns}

\end{frame}


% --------------------------------------------------

\begin{frame}[containsverbatim]
  \frametitle{Use target-specific commands\footnote{An exception is of
      course in toolchain files.}}

  Some commands propagate to all subfolders and included files. This
  can lead to potential problems where some targets get extra
  unintended flags.

  \vspace{.3em}

  \begin{columns}
    \begin{column}{.5\textwidth}
\begin{badcodebox}[equal height group=tgtspecific1]{CMake}
add_definitions(-DDEFINE_SOMETHING=1)
add_compile_options(-fvisibility=hidden)
set(CMAKE_CXX_FLAGS
  "${CMAKE_CXX_FLAGS} -fno-exceptions")
\end{badcodebox}
    \end{column}

    \begin{column}{.5\textwidth}
\begin{goodcodebox}[equal height group=tgtspecific1]{CMake}
target_compile_definitions(tgt PRIVATE
  DEFINE_SOMETHING=1)
target_compile_options(tgt PRIVATE
  "-fno-tree-vrp")
\end{goodcodebox}
    \end{column}
  \end{columns}

\end{frame}

% --------------------------------------------------

\begin{frame}[containsverbatim]
  \frametitle{Avoid \texttt{target\_include\_directories}}

\begin{codebox}[minted options={fontsize=\scriptsize}]{CMake}{}
find_package(EXPAT REQUIRED) # external, has only vars
find_package(Boost REQUIRED) # external, has targets
add_library(alexandria egypt.cc)
target_link_libraries(alexandria
  PUBLIC calliope clio Boost::filesystem
  PRIVATE euterpe erato ${EXPAT_LIBRARIES})
\end{codebox}

\vspace{.2em}

  \begin{columns}
    \begin{column}{.5\textwidth}
\begin{badcodebox}[equal height group=tgtincdir1]{CMake}
target_include_directories(alexandria
  PUBLIC  ${PROJECT_SOURCE_DIR}/include
          $<TARGET_PROPERTY:calliope,#
            INTERFACE_INCLUDE_DIRECTORIES>
  PRIVATE ${EUTERPE_INCLUDE_DIRS} # ...
          ${CMAKE_SOURCE_DIR}/calliope/inc
          ${BOOST_INCLUDE_DIRS}
          ${EXPAT_INCLUDE_DIRS})
\end{badcodebox}
    \end{column}

    \begin{column}{.5\textwidth}
\begin{goodcodebox}[equal height group=tgtincdir1]{CMake}
target_include_directories(alexandria
  PUBLIC  $<BUILD_INTERFACE:#
            ${PROJECT_SOURCE_DIR}/include>
          $<INSTALL_INTERFACE:#
            ${include_install_rel_dir}>
  PRIVATE ${EXPAT_INCLUDE_DIRS})
\end{goodcodebox}
    \end{column}
  \end{columns}

\end{frame}

% --------------------------------------------------

\begin{frame}[containsverbatim]
  \frametitle{Use PRIVATE and PUBLIC}

  \begin{columns}
    \begin{column}{.5\textwidth}
\begin{badcodebox}[equal height group=privpub1]{CMake}
target_link_libraries(tgt
  libA
  libB
  libC)

target_compile_definitions(tgt
  HAVE_THINGIE)
\end{badcodebox}
    \end{column}

    \begin{column}{.5\textwidth}
\begin{goodcodebox}[equal height group=privpub1]{CMake}
target_link_libraries(tgt
  PRIVATE libA
          libB
  PUBLIC  libC)

target_compile_definitions(tgt
  PRIVATE HAVE_THINGIE)
\end{goodcodebox}
    \end{column}
  \end{columns}

\end{frame}

% --------------------------------------------------

\begin{frame}[containsverbatim]
  \frametitle{Prefer feature checks}

  \begin{columns}
    \begin{column}{.5\textwidth}
\begin{badcodebox}[equal height group=feat1]{CMake}
if(APPLE OR IOS OR (UNIX AND NOT ANDROID))
  target_compile_definitions(lua PRIVATE
    HAVE_POSIX_SPAWN)
endif()
\end{badcodebox}
    \end{column}

    \begin{column}{.5\textwidth}
\begin{goodcodebox}[equal height group=feat1]{CMake}
check_symbol_exists("posix_spawn" "spawn.h"
  has_posix_spawn)
if(has_posix_spawn)
  target_compile_definitions(lua PRIVATE
    HAVE_POSIX_SPAWN)
endif()
\end{goodcodebox}
    \end{column}
  \end{columns}

\end{frame}

% --------------------------------------------------

\begin{frame}[containsverbatim]
  \frametitle{Make your package relocatable}

  \begin{columns}
    \begin{column}{.5\textwidth}
\begin{badcodebox}[equal height group=relocatable1]{CMake}
install(FILES "example.conf"
        DESTINATION some/strange/folder)
\end{badcodebox}

\begin{badcodebox}[equal height group=relocatable2]{C++}
char buf[2048];
getcwd(buf, 2048);

using boost::filesystem::path;
path rez = path(buf) /
  HARDCODED_ABSOLUTE_PREFIX_PATH 
    / "some" / "strange" / "folder" / 
    "example.conf";
\end{badcodebox}
    \end{column}

    \begin{column}{.5\textwidth}
\begin{goodcodebox}[equal height group=relocatable1]{CMake}
include(GNUInstallDirs)
install(RESOURCES "example.conf"
  DESTINATION
    ${CMAKE_INSTALL_SYSCONFDIR}/appname)
\end{goodcodebox}

\begin{goodcodebox}[equal height group=relocatable2]{C++}
using your_ns::some_enum::ResourceType;

using boost::filesystem::path;
path = your_ns::get_resource_path(
    ResourceType::CONFIG,
    { "appname", "example.conf" });
\end{goodcodebox}
    \end{column}
  \end{columns}

\end{frame}

% --------------------------------------------------
