\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 $ 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 $ $ 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} % --------------------------------------------------