{"id":22,"date":"2013-05-05T15:12:48","date_gmt":"2013-05-05T20:12:48","guid":{"rendered":"https:\/\/104.236.124.184\/cmake-tutorial-4-libraries-and-subdirectories.html"},"modified":"2013-05-05T15:12:48","modified_gmt":"2013-05-05T20:12:48","slug":"cmake-tutorial-4-libraries-and-subdirectories","status":"publish","type":"post","link":"https:\/\/www.johnlamp.net\/?p=22","title":{"rendered":"CMake Tutorial &#8211; Chapter&#160;4: Libraries and Subdirectories"},"content":{"rendered":"<nav class=\"contents\">\n<h1>Contents<\/h1>\n<ol>\n<li><a href=\"#section-Introduction\">Introduction<\/a><\/li>\n<li><a href=\"#section-TheLibraryInASubdirectory\">The Library in a Subdirectory<\/a><\/li>\n<li><a href=\"#section-TestingForReal\">Testing &ndash; for Real<\/a><\/li>\n<\/ol>\n<\/nav>\n<section>\n<h1 id=\"section-Introduction\">Introduction<\/h1>\n<p>\n    So far our project is rather simple. A real project would be more<br \/>\n    complicated than the one we&#8217;ve created. Let&#8217;s add subdirectories, libraries,<br \/>\n    and proper unit tests to make our project more realistic.\n  <\/p>\n<p>\n    In this chapter we will split up our project to have a library which we can<br \/>\n    put in a subdirectory. Then we will use<br \/>\n    <a href=\"https:\/\/code.google.com\/p\/googletest\/\">Google Test<\/a>    and<br \/>\n    <a href=\"https:\/\/code.google.com\/p\/googlemock\/\">Google Mock<\/a>    to add a more realistic unit test.\n  <\/p>\n<\/section>\n<section>\n<h1 id=\"section-TheLibraryInASubdirectory\">The Library in a Subdirectory<\/h1>\n<p>\n    We will make the ToDo class its own library, and put it in a subdirectory. Even<br \/>\n    though it is a single source file making it a library actually has one<br \/>\n    significant advantage. CMake will compile source files once for each target<br \/>\n    that includes them. So if the ToDo class is used by our command line tool, a<br \/>\n    unit test, and perhaps a GUI App it would be compiled three times. Imagine<br \/>\n    if we had a collection of classes instead of just one. This results in a<br \/>\n    lot of unnecessary compilation.\n  <\/p>\n<p>\n    There were some minor changes to the C++, grab the files here:<br \/>\n    <a class=\"sources\" href=\"https:\/\/www.johnlamp.net\/sources\/chapter4-1.zip\"><img src=\"https:\/\/www.johnlamp.net\/images\/zip.png\" alt=\"[zip file] \" \/>Source<\/a>    <br \/>\n    (<code>CMakeLists.txt<\/code> listed below)\n  <\/p>\n<section class=\"code cmake\">\n<header class=\"clear-after\">\n<h1>CMakeLists.txt<\/h1>\n<div class=\"hll legend\">New or modified lines in bold.<\/div>\n<\/header>\n<div class=\"highlight\">\n<pre><a id=\"CMakeLists.txt-1\" class=\"line-number\" href=\"#CMakeLists.txt-1\"><\/a><span class=\"nb\">cmake_minimum_required<\/span><span class=\"p\">(<\/span><span class=\"s\">VERSION<\/span> <span class=\"s\">2.8<\/span> <span class=\"s\">FATAL_ERROR<\/span><span class=\"p\">)<\/span>\n<a id=\"CMakeLists.txt-2\" class=\"line-number\" href=\"#CMakeLists.txt-2\"><\/a><span class=\"nb\">set<\/span><span class=\"p\">(<\/span><span class=\"s\">CMAKE_LEGACY_CYGWIN_WIN32<\/span> <span class=\"s\">0<\/span><span class=\"p\">)<\/span>\n<a id=\"CMakeLists.txt-3\" class=\"line-number\" href=\"#CMakeLists.txt-3\"><\/a>\n<a id=\"CMakeLists.txt-4\" class=\"line-number\" href=\"#CMakeLists.txt-4\"><\/a><span class=\"nb\">project<\/span><span class=\"p\">(<\/span><span class=\"s2\">&quot;To Do List&quot;<\/span><span class=\"p\">)<\/span>\n<a id=\"CMakeLists.txt-5\" class=\"line-number\" href=\"#CMakeLists.txt-5\"><\/a>\n<a id=\"CMakeLists.txt-6\" class=\"line-number\" href=\"#CMakeLists.txt-6\"><\/a><span class=\"nb\">enable_testing<\/span><span class=\"p\">()<\/span>\n<a id=\"CMakeLists.txt-7\" class=\"line-number\" href=\"#CMakeLists.txt-7\"><\/a>\n<a id=\"CMakeLists.txt-8\" class=\"line-number\" href=\"#CMakeLists.txt-8\"><\/a>\n<a id=\"CMakeLists.txt-9\" class=\"line-number\" href=\"#CMakeLists.txt-9\"><\/a><span class=\"nb\">if<\/span> <span class=\"p\">(<\/span><span class=\"s2\">&quot;${CMAKE_CXX_COMPILER_ID}&quot;<\/span> <span class=\"s\">STREQUAL<\/span> <span class=\"s2\">&quot;GNU&quot;<\/span> <span class=\"s\">OR<\/span>\n<a id=\"CMakeLists.txt-10\" class=\"line-number\" href=\"#CMakeLists.txt-10\"><\/a>    <span class=\"s2\">&quot;${CMAKE_CXX_COMPILER_ID}&quot;<\/span> <span class=\"s\">STREQUAL<\/span> <span class=\"s2\">&quot;Clang&quot;<\/span><span class=\"p\">)<\/span>\n<a id=\"CMakeLists.txt-11\" class=\"line-number\" href=\"#CMakeLists.txt-11\"><\/a>    <span class=\"nb\">set<\/span><span class=\"p\">(<\/span><span class=\"s\">warnings<\/span> <span class=\"s2\">&quot;-Wall -Wextra -Werror&quot;<\/span><span class=\"p\">)<\/span>\n<a id=\"CMakeLists.txt-12\" class=\"line-number\" href=\"#CMakeLists.txt-12\"><\/a><span class=\"nb\">elseif<\/span> <span class=\"p\">(<\/span><span class=\"s2\">&quot;${CMAKE_CXX_COMPILER_ID}&quot;<\/span> <span class=\"s\">STREQUAL<\/span> <span class=\"s2\">&quot;MSVC&quot;<\/span><span class=\"p\">)<\/span>\n<a id=\"CMakeLists.txt-13\" class=\"line-number\" href=\"#CMakeLists.txt-13\"><\/a>    <span class=\"nb\">set<\/span><span class=\"p\">(<\/span><span class=\"s\">warnings<\/span> <span class=\"s2\">&quot;\/W4 \/WX \/EHsc&quot;<\/span><span class=\"p\">)<\/span>\n<a id=\"CMakeLists.txt-14\" class=\"line-number\" href=\"#CMakeLists.txt-14\"><\/a><span class=\"nb\">endif<\/span><span class=\"p\">()<\/span>\n<a id=\"CMakeLists.txt-15\" class=\"line-number\" href=\"#CMakeLists.txt-15\"><\/a><span class=\"nb\">if<\/span> <span class=\"p\">(<\/span><span class=\"s\">NOT<\/span> <span class=\"s\">CONFIGURED_ONCE<\/span><span class=\"p\">)<\/span>\n<a id=\"CMakeLists.txt-16\" class=\"line-number\" href=\"#CMakeLists.txt-16\"><\/a>    <span class=\"nb\">set<\/span><span class=\"p\">(<\/span><span class=\"s\">CMAKE_CXX_FLAGS<\/span> <span class=\"s2\">&quot;${warnings}&quot;<\/span>\n<a id=\"CMakeLists.txt-17\" class=\"line-number\" href=\"#CMakeLists.txt-17\"><\/a>        <span class=\"s\">CACHE<\/span> <span class=\"s\">STRING<\/span> <span class=\"s2\">&quot;Flags used by the compiler during all build types.&quot;<\/span> <span class=\"s\">FORCE<\/span><span class=\"p\">)<\/span>\n<a id=\"CMakeLists.txt-18\" class=\"line-number\" href=\"#CMakeLists.txt-18\"><\/a>    <span class=\"nb\">set<\/span><span class=\"p\">(<\/span><span class=\"s\">CMAKE_C_FLAGS<\/span>   <span class=\"s2\">&quot;${warnings}&quot;<\/span>\n<a id=\"CMakeLists.txt-19\" class=\"line-number\" href=\"#CMakeLists.txt-19\"><\/a>        <span class=\"s\">CACHE<\/span> <span class=\"s\">STRING<\/span> <span class=\"s2\">&quot;Flags used by the compiler during all build types.&quot;<\/span> <span class=\"s\">FORCE<\/span><span class=\"p\">)<\/span>\n<a id=\"CMakeLists.txt-20\" class=\"line-number\" href=\"#CMakeLists.txt-20\"><\/a><span class=\"nb\">endif<\/span><span class=\"p\">()<\/span>\n<a id=\"CMakeLists.txt-21\" class=\"line-number\" href=\"#CMakeLists.txt-21\"><\/a>\n<a id=\"CMakeLists.txt-22\" class=\"line-number\" href=\"#CMakeLists.txt-22\"><\/a>\n<a id=\"CMakeLists.txt-23\" class=\"line-number\" href=\"#CMakeLists.txt-23\"><\/a><span class=\"hll\"><span class=\"nb\">include_directories<\/span><span class=\"p\">(<\/span><span class=\"o\">${<\/span><span class=\"nv\">CMAKE_CURRENT_SOURCE_DIR<\/span><span class=\"o\">}<\/span><span class=\"p\">)<\/span>\n<\/span><a id=\"CMakeLists.txt-24\" class=\"line-number\" href=\"#CMakeLists.txt-24\"><\/a><span class=\"hll\">\n<\/span><a id=\"CMakeLists.txt-25\" class=\"line-number\" href=\"#CMakeLists.txt-25\"><\/a><span class=\"hll\"><span class=\"nb\">add_subdirectory<\/span><span class=\"p\">(<\/span><span class=\"s\">ToDoCore<\/span><span class=\"p\">)<\/span>\n<\/span><a id=\"CMakeLists.txt-26\" class=\"line-number\" href=\"#CMakeLists.txt-26\"><\/a><span class=\"hll\">\n<\/span><a id=\"CMakeLists.txt-27\" class=\"line-number\" href=\"#CMakeLists.txt-27\"><\/a><span class=\"hll\"><span class=\"nb\">add_executable<\/span><span class=\"p\">(<\/span><span class=\"s\">toDo<\/span> <span class=\"s\">main.cc<\/span><span class=\"p\">)<\/span>\n<\/span><a id=\"CMakeLists.txt-28\" class=\"line-number\" href=\"#CMakeLists.txt-28\"><\/a><span class=\"hll\"><span class=\"nb\">target_link_libraries<\/span><span class=\"p\">(<\/span><span class=\"s\">toDo<\/span> <span class=\"s\">toDoCore<\/span><span class=\"p\">)<\/span>\n<\/span><a id=\"CMakeLists.txt-29\" class=\"line-number\" href=\"#CMakeLists.txt-29\"><\/a>\n<a id=\"CMakeLists.txt-30\" class=\"line-number\" href=\"#CMakeLists.txt-30\"><\/a><span class=\"nb\">add_test<\/span><span class=\"p\">(<\/span><span class=\"s\">toDoTest<\/span> <span class=\"s\">toDo<\/span><span class=\"p\">)<\/span>\n<a id=\"CMakeLists.txt-31\" class=\"line-number\" href=\"#CMakeLists.txt-31\"><\/a>\n<a id=\"CMakeLists.txt-32\" class=\"line-number\" href=\"#CMakeLists.txt-32\"><\/a>\n<a id=\"CMakeLists.txt-33\" class=\"line-number\" href=\"#CMakeLists.txt-33\"><\/a><span class=\"nb\">set<\/span><span class=\"p\">(<\/span><span class=\"s\">CONFIGURED_ONCE<\/span> <span class=\"s\">TRUE<\/span> <span class=\"s\">CACHE<\/span> <span class=\"s\">INTERNAL<\/span>\n<a id=\"CMakeLists.txt-34\" class=\"line-number\" href=\"#CMakeLists.txt-34\"><\/a>    <span class=\"s2\">&quot;A flag showing that CMake has configured at least once.&quot;<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/section>\n<p>\n    So now our executable &#8220;toDo&#8221; only depends on the file &#8220;main.cc&#8221; and the new<br \/>\n    library &#8220;toDoCore&#8221;. Our project also has a new subdirectory &#8220;ToDoCore&#8221;.\n  <\/p>\n<dl>\n<dt class=\"code\">\n      include_directories(<span class=\"arg\">directories<\/span>)\n    <\/dt>\n<dd>\n      Add <code class=\"arg\">directories<\/code> to the end of this directory&#8217;s<br \/>\n      include paths. We didn&#8217;t need this before because all of our files were in<br \/>\n      the same directory.\n    <\/dd>\n<dd>\n      <a href=\"http:\/\/www.cmake.org\/cmake\/help\/v2.8.10\/cmake.html#command:include_directories\"><code>include_directories()<\/code> documentation<\/a>      <time class=\"access\">(2013-04-20)<\/time>\n    <\/dd>\n<dt class=\"code\">\n      CMAKE_CURRENT_SOURCE_DIR\n    <\/dt>\n<dd>\n      The full path to the source directory that CMake is currently processing.\n    <\/dd>\n<dd>\n      <a href=\"http:\/\/www.cmake.org\/cmake\/help\/v2.8.10\/cmake.html#variable:CMAKE_CURRENT_SOURCE_DIR\"><code>CMAKE_CURRENT_SOURCE_DIR<\/code> documentation<\/a>      <time class=\"access\">(2013-04-20)<\/time>\n    <\/dd>\n<dt class=\"code\">\n      add_subdirectory(<span class=\"arg\">source_dir<\/span>)\n    <\/dt>\n<dd>\n      Include the directory <code class=\"arg\">source_dir<\/code> in your<br \/>\n      project. This directory <em>must<\/em> contain a<br \/>\n      <code>CMakeLists.txt<\/code> file.\n    <\/dd>\n<dd class=\"note\">\n      <em class=\"call-out\">Note:<\/em> We&#8217;re omitting the optional second<br \/>\n      parameter.  This only works with subdirectories of the current directory.<br \/>\n      We will see how to add external directories later.\n    <\/dd>\n<dd>\n      <a href=\"http:\/\/www.cmake.org\/cmake\/help\/v2.8.10\/cmake.html#command:add_subdirectory\"><code>add_subdirectory<\/code> documentation<\/a>      <time class=\"access\">(2013-04-20)<\/time>\n    <\/dd>\n<dt class=\"code\">\n      target_link_libraries(<span class=\"arg\">target<\/span><br \/>\n      <span class=\"arg\">library&hellip;<\/span>)\n    <\/dt>\n<dd>\n      Specify that <code class=\"arg\">target<\/code> needs to be linked against<br \/>\n      one or more libraries. If a library name matches another target<br \/>\n      dependencies are setup automatically so that the libraries will be built<br \/>\n      first and <code class=\"arg\">target<\/code> will be updated whenever any of<br \/>\n      the libraries are.\n    <\/dd>\n<dd>\n      If the <code class=\"arg\">target<\/code> is an executable then it will be<br \/>\n      linked against the listed libraries.\n    <\/dd>\n<dd>\n      If the target is a library then its dependency on these libraries will<br \/>\n      be recorded. Then when something else links against<br \/>\n      <code class=\"arg\">target<\/code> it will also link against<br \/>\n      <code class=\"arg\">target<\/code>&#8216;s dependencies. This makes it much easier<br \/>\n      to handle a library&#8217;s dependencies since you only have to define them once<br \/>\n      when you define library itself.\n    <\/dd>\n<dd>\n      For the moment we are using the simplest form of this command. For more<br \/>\n      information see the<br \/>\n      <a href=\"http:\/\/www.cmake.org\/cmake\/help\/v2.8.10\/cmake.html#command:target_link_libraries\">documentation<\/a>      <time class=\"access\">(2013-04-20)<\/time>.\n    <\/dd>\n<\/dl>\n<p>\n    When describing <code>add_subdirectory()<\/code> I stated that the<br \/>\n    subdirectory must contain a <code>CMakeLists.txt<\/code> file. So here&#8217;s the<br \/>\n    new file.\n  <\/p>\n<section class=\"code cmake\">\n<header class=\"clear-after\">\n<h1>ToDoCore\/CMakeLists.txt<\/h1>\n<\/header>\n<div class=\"highlight\">\n<pre><a id=\"ToDoCore\/CMakeLists.txt-1\" class=\"line-number\" href=\"#ToDoCore\/CMakeLists.txt-1\"><\/a><span class=\"nb\">add_library<\/span><span class=\"p\">(<\/span><span class=\"s\">toDoCore<\/span> <span class=\"s\">ToDo.cc<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/section>\n<p>\n    Conveniently this file is rather simple.\n  <\/p>\n<dl>\n<dt class=\"code\">\n      add_library(<span class=\"arg\">target<\/span><br \/>\n      <span class=\"optional\">STATIC | SHARED | MODULE<\/span><br \/>\n      <span class=\"arg\">sources&hellip;<\/span>)\n    <\/dt>\n<dd>\n      This command creates a new library <code class=\"arg\">target<\/code> built<br \/>\n      from <code class=\"arg\">sources<\/code>. As you may have noticed<br \/>\n      this command is very similar to <code>add_executable<\/code>.\n    <\/dd>\n<dd>\n      With <code>STATIC<\/code>, <code>SHARED<\/code>, and <code>MODULE<\/code> you<br \/>\n      can specify what kind of library to build. <code>STATIC<\/code> libraries<br \/>\n      are archives of object files that are linked directly into other targets.<br \/>\n      <code>SHARED<\/code> libraries are linked dynamically and loaded at<br \/>\n      runtime. <code>MODULE<\/code> libraries are plug-ins that aren&#8217;t linked<br \/>\n      against but can be loaded dynamically at runtime.\n    <\/dd>\n<dd>\n      If the library type is not specified it will be either <code>STATIC<\/code><br \/>\n      or <code>SHARED<\/code>. The default type is controlled by the<br \/>\n      <a href=\"http:\/\/www.cmake.org\/cmake\/help\/v2.8.10\/cmake.html#variable:BUILD_SHARED_LIBS\"><code>BUILD_SHARED_LIBS<\/code><\/a>      variable. By default static libraries are created.\n    <\/dd>\n<dd>\n      <a href=\"http:\/\/www.cmake.org\/cmake\/help\/v2.8.10\/cmake.html#command:add_library\"><code>add_library()<\/code> documentation<\/a>      <time class=\"access\">(2013-04-20)<\/time>\n    <\/dd>\n<\/dl>\n<\/section>\n<section>\n<h1 id=\"section-TestingForReal\">Testing &ndash; for Real<\/h1>\n<p>\n    We have a rudimentary test but if we were really developing software we&#8217;d<br \/>\n    write a real test using a real testing framework. As mentioned earlier we<br \/>\n    will use<br \/>\n    <a href=\"https:\/\/code.google.com\/p\/googletest\/\">Google Test 1.6.0<\/a> and    <a href=\"https:\/\/code.google.com\/p\/googlemock\/\">Google Mock 1.6.0<\/a>.    Conveniently they include their own<br \/>\n    <code>CMakeLists.txt<\/code> files, which makes them easy for us to use.\n  <\/p>\n<p>\n    First the test:\n  <\/p>\n<section class=\"code\">\n<header class=\"clear-after\">\n<h1>ToDoCore\/unit_test\/ToDoTest.cc<\/h1>\n<\/header>\n<div class=\"highlight\">\n<pre><a id=\"ToDoCore\/unit_test\/ToDoTest.cc-1\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-1\"><\/a><span class=\"cp\">#include &quot;ToDoCore\/ToDo.h&quot;<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-2\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-2\"><\/a>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-3\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-3\"><\/a><span class=\"cp\">#include &lt;string&gt;<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-4\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-4\"><\/a>  <span class=\"k\">using<\/span> <span class=\"n\">std<\/span><span class=\"o\">::<\/span><span class=\"n\">string<\/span><span class=\"p\">;<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-5\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-5\"><\/a>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-6\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-6\"><\/a><span class=\"cp\">#include &lt;gmock\/gmock.h&gt;<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-7\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-7\"><\/a>  <span class=\"k\">using<\/span> <span class=\"o\">::<\/span><span class=\"n\">testing<\/span><span class=\"o\">::<\/span><span class=\"n\">Eq<\/span><span class=\"p\">;<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-8\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-8\"><\/a><span class=\"cp\">#include &lt;gtest\/gtest.h&gt;<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-9\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-9\"><\/a>  <span class=\"k\">using<\/span> <span class=\"o\">::<\/span><span class=\"n\">testing<\/span><span class=\"o\">::<\/span><span class=\"n\">Test<\/span><span class=\"p\">;<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-10\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-10\"><\/a>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-11\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-11\"><\/a>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-12\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-12\"><\/a><span class=\"k\">namespace<\/span> <span class=\"n\">ToDoCore<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-13\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-13\"><\/a><span class=\"p\">{<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-14\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-14\"><\/a><span class=\"k\">namespace<\/span> <span class=\"n\">testing<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-15\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-15\"><\/a><span class=\"p\">{<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-16\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-16\"><\/a>    <span class=\"k\">class<\/span> <span class=\"nc\">ToDoTest<\/span> <span class=\"o\">:<\/span> <span class=\"k\">public<\/span> <span class=\"n\">Test<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-17\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-17\"><\/a>    <span class=\"p\">{<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-18\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-18\"><\/a>    <span class=\"nl\">protected:<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-19\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-19\"><\/a>        <span class=\"n\">ToDoTest<\/span><span class=\"p\">(){}<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-20\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-20\"><\/a>        <span class=\"o\">~<\/span><span class=\"n\">ToDoTest<\/span><span class=\"p\">(){}<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-21\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-21\"><\/a>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-22\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-22\"><\/a>        <span class=\"k\">virtual<\/span> <span class=\"kt\">void<\/span> <span class=\"n\">SetUp<\/span><span class=\"p\">(){}<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-23\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-23\"><\/a>        <span class=\"k\">virtual<\/span> <span class=\"kt\">void<\/span> <span class=\"n\">TearDown<\/span><span class=\"p\">(){}<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-24\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-24\"><\/a>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-25\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-25\"><\/a>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-26\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-26\"><\/a>        <span class=\"n\">ToDo<\/span> <span class=\"n\">list<\/span><span class=\"p\">;<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-27\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-27\"><\/a>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-28\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-28\"><\/a>        <span class=\"k\">static<\/span> <span class=\"k\">const<\/span> <span class=\"kt\">size_t<\/span> <span class=\"n\">taskCount<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">3<\/span><span class=\"p\">;<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-29\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-29\"><\/a>        <span class=\"k\">static<\/span> <span class=\"k\">const<\/span> <span class=\"n\">string<\/span> <span class=\"n\">tasks<\/span><span class=\"p\">[<\/span><span class=\"n\">taskCount<\/span><span class=\"p\">];<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-30\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-30\"><\/a>    <span class=\"p\">};<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-31\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-31\"><\/a>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-32\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-32\"><\/a>    <span class=\"k\">const<\/span> <span class=\"n\">string<\/span> <span class=\"n\">ToDoTest<\/span><span class=\"o\">::<\/span><span class=\"n\">tasks<\/span><span class=\"p\">[<\/span><span class=\"n\">taskCount<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"s\">&quot;write code&quot;<\/span><span class=\"p\">,<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-33\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-33\"><\/a>                                               <span class=\"s\">&quot;compile&quot;<\/span><span class=\"p\">,<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-34\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-34\"><\/a>                                               <span class=\"s\">&quot;test&quot;<\/span><span class=\"p\">};<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-35\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-35\"><\/a>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-36\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-36\"><\/a>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-37\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-37\"><\/a>    <span class=\"n\">TEST_F<\/span><span class=\"p\">(<\/span><span class=\"n\">ToDoTest<\/span><span class=\"p\">,<\/span> <span class=\"n\">constructor_createsEmptyList<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-38\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-38\"><\/a>    <span class=\"p\">{<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-39\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-39\"><\/a>        <span class=\"n\">EXPECT_THAT<\/span><span class=\"p\">(<\/span><span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"n\">size<\/span><span class=\"p\">(),<\/span> <span class=\"n\">Eq<\/span><span class=\"p\">(<\/span><span class=\"kt\">size_t<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">)));<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-40\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-40\"><\/a>    <span class=\"p\">}<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-41\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-41\"><\/a>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-42\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-42\"><\/a>    <span class=\"n\">TEST_F<\/span><span class=\"p\">(<\/span><span class=\"n\">ToDoTest<\/span><span class=\"p\">,<\/span> <span class=\"n\">addTask_threeTimes_sizeIsThree<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-43\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-43\"><\/a>    <span class=\"p\">{<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-44\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-44\"><\/a>        <span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"n\">addTask<\/span><span class=\"p\">(<\/span><span class=\"n\">tasks<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]);<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-45\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-45\"><\/a>        <span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"n\">addTask<\/span><span class=\"p\">(<\/span><span class=\"n\">tasks<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]);<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-46\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-46\"><\/a>        <span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"n\">addTask<\/span><span class=\"p\">(<\/span><span class=\"n\">tasks<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">]);<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-47\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-47\"><\/a>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-48\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-48\"><\/a>        <span class=\"n\">EXPECT_THAT<\/span><span class=\"p\">(<\/span><span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"n\">size<\/span><span class=\"p\">(),<\/span> <span class=\"n\">Eq<\/span><span class=\"p\">(<\/span><span class=\"n\">taskCount<\/span><span class=\"p\">));<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-49\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-49\"><\/a>    <span class=\"p\">}<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-50\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-50\"><\/a>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-51\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-51\"><\/a>    <span class=\"n\">TEST_F<\/span><span class=\"p\">(<\/span><span class=\"n\">ToDoTest<\/span><span class=\"p\">,<\/span> <span class=\"n\">getTask_withOneTask_returnsCorrectString<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-52\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-52\"><\/a>    <span class=\"p\">{<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-53\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-53\"><\/a>        <span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"n\">addTask<\/span><span class=\"p\">(<\/span><span class=\"n\">tasks<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]);<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-54\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-54\"><\/a>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-55\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-55\"><\/a>        <span class=\"n\">ASSERT_THAT<\/span><span class=\"p\">(<\/span><span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"n\">size<\/span><span class=\"p\">(),<\/span>     <span class=\"n\">Eq<\/span><span class=\"p\">(<\/span><span class=\"kt\">size_t<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">)));<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-56\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-56\"><\/a>        <span class=\"n\">EXPECT_THAT<\/span><span class=\"p\">(<\/span><span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"n\">getTask<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">),<\/span> <span class=\"n\">Eq<\/span><span class=\"p\">(<\/span><span class=\"n\">tasks<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]));<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-57\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-57\"><\/a>    <span class=\"p\">}<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-58\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-58\"><\/a>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-59\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-59\"><\/a>    <span class=\"n\">TEST_F<\/span><span class=\"p\">(<\/span><span class=\"n\">ToDoTest<\/span><span class=\"p\">,<\/span> <span class=\"n\">getTask_withThreeTasts_returnsCorrectStringForEachIndex<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-60\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-60\"><\/a>    <span class=\"p\">{<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-61\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-61\"><\/a>        <span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"n\">addTask<\/span><span class=\"p\">(<\/span><span class=\"n\">tasks<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]);<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-62\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-62\"><\/a>        <span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"n\">addTask<\/span><span class=\"p\">(<\/span><span class=\"n\">tasks<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]);<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-63\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-63\"><\/a>        <span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"n\">addTask<\/span><span class=\"p\">(<\/span><span class=\"n\">tasks<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">]);<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-64\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-64\"><\/a>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-65\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-65\"><\/a>        <span class=\"n\">ASSERT_THAT<\/span><span class=\"p\">(<\/span><span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"n\">size<\/span><span class=\"p\">(),<\/span>     <span class=\"n\">Eq<\/span><span class=\"p\">(<\/span><span class=\"n\">taskCount<\/span><span class=\"p\">));<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-66\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-66\"><\/a>        <span class=\"n\">EXPECT_THAT<\/span><span class=\"p\">(<\/span><span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"n\">getTask<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">),<\/span> <span class=\"n\">Eq<\/span><span class=\"p\">(<\/span><span class=\"n\">tasks<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]));<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-67\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-67\"><\/a>        <span class=\"n\">EXPECT_THAT<\/span><span class=\"p\">(<\/span><span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"n\">getTask<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">),<\/span> <span class=\"n\">Eq<\/span><span class=\"p\">(<\/span><span class=\"n\">tasks<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]));<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-68\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-68\"><\/a>        <span class=\"n\">EXPECT_THAT<\/span><span class=\"p\">(<\/span><span class=\"n\">list<\/span><span class=\"p\">.<\/span><span class=\"n\">getTask<\/span><span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">),<\/span> <span class=\"n\">Eq<\/span><span class=\"p\">(<\/span><span class=\"n\">tasks<\/span><span class=\"p\">[<\/span><span class=\"mi\">2<\/span><span class=\"p\">]));<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-69\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-69\"><\/a>    <span class=\"p\">}<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-70\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-70\"><\/a>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-71\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-71\"><\/a><span class=\"p\">}<\/span> <span class=\"c1\">\/\/ namespace testing<\/span>\n<a id=\"ToDoCore\/unit_test\/ToDoTest.cc-72\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/ToDoTest.cc-72\"><\/a><span class=\"p\">}<\/span> <span class=\"c1\">\/\/ namespace ToDoCore<\/span>\n<\/pre>\n<\/div>\n<\/section>\n<p>\n    This is a rather simple test, but <code>ToDo<\/code> is still a rather simple<br \/>\n    class. It may look strange if you are unfamiliar with Google Test, taking a<br \/>\n    look at<br \/>\n    <a href=\"https:\/\/code.google.com\/p\/googletest\/wiki\/V1_6_Primer\">Google Test Primer<\/a>    may be helpful. I also use a little functionality from Google Mock so<br \/>\n    <a href=\"https:\/\/code.google.com\/p\/googlemock\/wiki\/V1_6_ForDummies\">Google Mock for Dummies<\/a>    may also be useful.\n  <\/p>\n<p>\n    Now we need to build the test:\n  <\/p>\n<section class=\"code cmake\">\n<header class=\"clear-after\">\n<h1>ToDoCore\/CMakeLists.txt<\/h1>\n<div class=\"hll legend\">New or modified lines in bold.<\/div>\n<\/header>\n<div class=\"highlight\">\n<pre><a id=\"ToDoCore\/CMakeLists.txt-1-1\" class=\"line-number\" href=\"#ToDoCore\/CMakeLists.txt-1-1\"><\/a><span class=\"nb\">add_library<\/span><span class=\"p\">(<\/span><span class=\"s\">toDoCore<\/span> <span class=\"s\">ToDo.cc<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/CMakeLists.txt-1-2\" class=\"line-number\" href=\"#ToDoCore\/CMakeLists.txt-1-2\"><\/a><span class=\"hll\">\n<\/span><a id=\"ToDoCore\/CMakeLists.txt-1-3\" class=\"line-number\" href=\"#ToDoCore\/CMakeLists.txt-1-3\"><\/a><span class=\"hll\"><span class=\"nb\">add_subdirectory<\/span><span class=\"p\">(<\/span><span class=\"s\">unit_test<\/span><span class=\"p\">)<\/span>\n<\/span><\/pre>\n<\/div>\n<\/section>\n<section class=\"code cmake\">\n<header class=\"clear-after\">\n<h1>ToDoCore\/unit_test\/CMakeLists.txt<\/h1>\n<\/header>\n<div class=\"highlight\">\n<pre><a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1\"><\/a><span class=\"nb\">set<\/span><span class=\"p\">(<\/span><span class=\"s\">GMOCK_DIR<\/span> <span class=\"s2\">&quot;..\/..\/..\/..\/..\/gmock\/gmock-1.6.0&quot;<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-2\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-2\"><\/a>    <span class=\"s\">CACHE<\/span> <span class=\"s\">PATH<\/span> <span class=\"s2\">&quot;The path to the GoogleMock test framework.&quot;<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-3\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-3\"><\/a>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-4\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-4\"><\/a><span class=\"nb\">if<\/span> <span class=\"p\">(<\/span><span class=\"s2\">&quot;${CMAKE_CXX_COMPILER_ID}&quot;<\/span> <span class=\"s\">STREQUAL<\/span> <span class=\"s2\">&quot;MSVC&quot;<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-5\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-5\"><\/a>    <span class=\"c\"># force this option to ON so that Google Test will use \/MD instead of \/MT<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-6\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-6\"><\/a>    <span class=\"c\"># \/MD is now the default for Visual Studio, so it should be our default, too<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-7\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-7\"><\/a>    <span class=\"nb\">option<\/span><span class=\"p\">(<\/span><span class=\"s\">gtest_force_shared_crt<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-8\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-8\"><\/a>           <span class=\"s2\">&quot;Use shared (DLL) run-time lib even when Google Test is built as static lib.&quot;<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-9\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-9\"><\/a>           <span class=\"s\">ON<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-10\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-10\"><\/a><span class=\"nb\">elseif<\/span> <span class=\"p\">(<\/span><span class=\"s\">APPLE<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-11\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-11\"><\/a>    <span class=\"nb\">add_definitions<\/span><span class=\"p\">(<\/span><span class=\"s\">-DGTEST_USE_OWN_TR1_TUPLE=1<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-12\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-12\"><\/a><span class=\"nb\">endif<\/span><span class=\"p\">()<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-13\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-13\"><\/a><span class=\"nb\">add_subdirectory<\/span><span class=\"p\">(<\/span><span class=\"o\">${<\/span><span class=\"nv\">GMOCK_DIR<\/span><span class=\"o\">}<\/span> <span class=\"o\">${<\/span><span class=\"nv\">CMAKE_BINARY_DIR<\/span><span class=\"o\">}<\/span><span class=\"s\">\/gmock<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-14\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-14\"><\/a>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-15\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-15\"><\/a><span class=\"nb\">include_directories<\/span><span class=\"p\">(<\/span><span class=\"s\">SYSTEM<\/span> <span class=\"o\">${<\/span><span class=\"nv\">GMOCK_DIR<\/span><span class=\"o\">}<\/span><span class=\"s\">\/gtest\/include<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-16\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-16\"><\/a>                           <span class=\"o\">${<\/span><span class=\"nv\">GMOCK_DIR<\/span><span class=\"o\">}<\/span><span class=\"s\">\/include<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-17\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-17\"><\/a>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-18\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-18\"><\/a>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-19\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-19\"><\/a><span class=\"nb\">add_executable<\/span><span class=\"p\">(<\/span><span class=\"s\">ToDoTest<\/span> <span class=\"s\">ToDoTest.cc<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-20\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-20\"><\/a><span class=\"nb\">target_link_libraries<\/span><span class=\"p\">(<\/span><span class=\"s\">ToDoTest<\/span> <span class=\"s\">toDoCore<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-21\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-21\"><\/a>                               <span class=\"s\">gmock_main<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-22\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-22\"><\/a>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-23\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-23\"><\/a><span class=\"nb\">add_test<\/span><span class=\"p\">(<\/span><span class=\"s\">ToDoTest<\/span> <span class=\"s\">ToDoTest<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/section>\n<p>\n    First we add the Google Mock directory to our project then we add our<br \/>\n    test. The path to Google Mock is stored in a cached variable so that you can<br \/>\n    easily set it to the correct value either from the command line or via one<br \/>\n    of the GUIs. There are several potential problems with that line but we will<br \/>\n    worry about those later, for now it&#8217;s good enough. Okay I oversimplified a<br \/>\n    little. We don&#8217;t just add the Google Mock directory, we also work around<br \/>\n    some OS-specific problems.\n  <\/p>\n<p>\n    When using Visual Studio to build our test we would run into a problem. Even<br \/>\n    when building static libraries, CMake&#8217;s default, MSVC defaults to linking<br \/>\n    against the multi-threaded, DLL-specific version of the standard library. By<br \/>\n    default Google Test overrides this so that the non-DLL version of the<br \/>\n    multi-threaded standard library is used. Then when our test links against<br \/>\n    both <code>toDoCore<\/code> and <code>gmock_main<\/code> the linker will<br \/>\n    output a large number of errors since we would be linking against two<br \/>\n    different copies of the standard library. To avoid this problem we force<br \/>\n    Google Test to use the DLL-specific version to match Visual Studio&#8217;s default<br \/>\n    by setting the <code>gtest_force_shared_crt<\/code> option to<br \/>\n    <code>ON<\/code>. See<br \/>\n    <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/2kzt1wy3.aspx\">Microsoft C\/C++ Compiler Run-Time Library<\/a>.  <\/p>\n<p>\n    The second problem occurs on newer version of Mac OS X which default to<br \/>\n    using a different standard library that fully supports C++11. GTest uses the<br \/>\n    <code>tuple<\/code> class from the draft TR1 standard and therefore looks for<br \/>\n    it in the <code>std::tr1<\/code> namespace. The <code>tr1<\/code> namespace is<br \/>\n    not present in the C++11 standard library that Apple uses so GTest cannot<br \/>\n    find it and won&#8217;t compile. We fix this by telling GTest to use its own<br \/>\n    <code>tuple<\/code> implementation.\n  <\/p>\n<dl>\n<dt class=\"code\">\n      add_subdirectory(<span class=\"arg\">source_dir<\/span><br \/>\n      <span class=\"optional arg\">binary_dir<\/span>)\n    <\/dt>\n<dd>\n      Add the directory <code class=\"arg\">source_dir<\/code> to the current<br \/>\n      project with <code class=\"arg\">binary_dir<\/code> as its corresponding<br \/>\n      binary output directory. When adding a directory that is a subdirectory of<br \/>\n      the current directory CMake will automatically determine what the binary<br \/>\n      output directory should be, making the second argument optional. However<br \/>\n      if you add a directory that isn&#8217;t a subdirectory you need to specify the<br \/>\n      binary output directory.\n    <\/dd>\n<dd>\n      <a href=\"http:\/\/www.cmake.org\/cmake\/help\/v2.8.10\/cmake.html#command:add_subdirectory\"><code>add_subdirectory<\/code> documentation<\/a>      <time class=\"access\">(2013-04-20)<\/time>\n    <\/dd>\n<dt class=\"code\">\n      CMAKE_BINARY_DIR\n    <\/dt>\n<dd>\n      This variable holds the path to the top level binary output directory,<br \/>\n      i.e. the directory in which you ran the <kbd>cmake<\/kbd> command or the<br \/>\n      path you chose for &#8220;Where to build the binaries&#8221; in the GUI.\n    <\/dd>\n<dd>\n      <a href=\"http:\/\/www.cmake.org\/cmake\/help\/v2.8.10\/cmake.html#variable:CMAKE_BINARY_DIR\"><code>CMAKE_BINARY_DIR<\/code> documentation<\/a>      <time class=\"access\">(2013-04-27)<\/time>\n    <\/dd>\n<dt class=\"code\">\n      include_directories(<span class=\"optional\">AFTER|BEFORE<\/span><br \/>\n      <span class=\"optional\">SYSTEM<\/span><br \/>\n      <span class=\"arg\">directory&hellip;<\/span>)\n    <\/dt>\n<dd>\n<dl>\n<dt class=\"code\">\n          AFTER|BEFORE\n        <\/dt>\n<dd>\n          Specify whether or not these include directories should be appended or<br \/>\n          prepended to the list of include directories. If omitted then the<br \/>\n          default behavior is used.\n        <\/dd>\n<dd>\n          By default directories are appended to the list. This behavior can be<br \/>\n          changed by setting <code>CMAKE_INCLUDE_DIRECTORIES_BEFORE<\/code> to<br \/>\n          <code>TRUE<\/code>.\n        <\/dd>\n<dt class=\"code\">\n          SYSTEM\n        <\/dt>\n<dd>\n          Specify that these directories are system include directories. This<br \/>\n          only has an affect on compilers that support the distinction. This can<br \/>\n          change the order in which the compiler searches include directories or<br \/>\n          the handling of warnings from headers found in these directories.\n        <\/dd>\n<dt class=\"code arg\">\n          directory&hellip;\n        <\/dt>\n<dd>\n          The directories to be added to the list of include directories.\n        <\/dd>\n<\/dl>\n<\/dd>\n<dd>\n      <a href=\"http:\/\/www.cmake.org\/cmake\/help\/v2.8.10\/cmake.html#command:include_directories\"><code>include_directories()<\/code> documentation<\/a>      <time class=\"access\">(2013-04-20)<\/time>\n    <\/dd>\n<dt class=\"code\">\n      option(<span class=\"arg\">name<\/span><br \/>\n      <span class=\"arg\">docstring<\/span><br \/>\n      <span class=\"optional arg\">initialValue<\/span>)\n    <\/dt>\n<dd>\n      Provide a boolean option to the user. This will be displayed in the GUI as<br \/>\n      a checkbox. Once created the value of the option can be accessed as the<br \/>\n      variable <code class=\"arg\">name<\/code>. The<br \/>\n      <code class=\"arg\">docstring<\/code> will be displayed in the GUI to tell<br \/>\n      the user what this option does. If no initial value is provided it<br \/>\n      defaults to OFF.\n    <\/dd>\n<dd>\n      While this boolean option is stored in the cache and accessible as a<br \/>\n      variable you cannot override the <code class=\"arg\">initialValue<\/code> by<br \/>\n      setting a variable of the same name beforehand, not even by passing a<br \/>\n      <kbd>-D<\/kbd> command line option to CMake. Which is why we have to define<br \/>\n      the option ourselves before Google Test does.\n    <\/dd>\n<dd>\n      <a href=\"http:\/\/www.cmake.org\/cmake\/help\/v2.8.10\/cmake.html#command:option\"><code>option()<\/code> documentation<\/a>      <time class=\"access\">(2013-05-3)<\/time>\n    <\/dd>\n<dt class=\"code\">\n      add_definitions(<span class=\"arg\">flags&hellip;<\/span>)\n    <\/dt>\n<dd>\n      Add preprocessor definitions to the compiler command line for targets in<br \/>\n      the current directory and those below it. While this command is intended<br \/>\n      for adding definitions you still need to precede them with<br \/>\n      <code>-D<\/code>.\n    <\/dd>\n<dd>\n      Because this command modifies the <code>COMPILE_DEFINITIONS<\/code><br \/>\n      directory property it affects <em>all<\/em> targets in the directory, even<br \/>\n      those that were defined <strong>before<\/strong> this command was used. If<br \/>\n      this is not the desired effect then modifying the<br \/>\n      <code>COMPILE_DEFINITIONS<\/code> property of particular targets or source<br \/>\n      files will work better. (Properties are introduced below.)\n    <\/dd>\n<dd>\n      <a href=\"http:\/\/www.cmake.org\/cmake\/help\/v2.8.10\/cmake.html#command:add_definitions\"><code>add_definitions()<\/code> documentation<\/a>      <time class=\"access\">(2014-09-28)<\/time>\n    <\/dd>\n<dd>\n      <a href=\"http:\/\/www.cmake.org\/cmake\/help\/v2.8.10\/cmake.html#prop_dir:COMPILE_DEFINITIONS\"><code>COMPILE_DEFINITIONS<\/code> directory property documentation<\/a>      <time class=\"access\">(2014-09-28)<\/time>\n    <\/dd>\n<dd>\n      <a href=\"http:\/\/www.cmake.org\/cmake\/help\/v2.8.10\/cmake.html#prop_tgt:COMPILE_DEFINITIONS\"><code>COMPILE_DEFINITIONS<\/code> target property documentation<\/a>      <time class=\"access\">(2014-09-28)<\/time>\n    <\/dd>\n<dd>\n      <a href=\"http:\/\/www.cmake.org\/cmake\/help\/v2.8.10\/cmake.html#prop_sf:COMPILE_DEFINITIONS\"><code>COMPILE_DEFINITIONS<\/code> source file property documentation<\/a>      <time class=\"access\">(2014-09-28)<\/time>\n    <\/dd>\n<\/dl>\n<p>\n    Let&#8217;s go ahead and try out our new test!<br \/>\n    <br \/>\n    <a class=\"sources\" href=\"https:\/\/www.johnlamp.net\/sources\/chapter4-2.zip\"><img src=\"https:\/\/www.johnlamp.net\/images\/zip.png\" alt=\"[zip file] \" \/>Source<\/a>  <\/p>\n<section class=\"terminal\">\n<pre>\n <span class=\"ansiBold ansiForeground-blue\">&gt;<\/span> mkdir build\n <span class=\"ansiBold ansiForeground-blue\">&gt;<\/span> cd build\n <span class=\"ansiBold ansiForeground-blue\">&gt;<\/span> cmake -G &quot;Unix Makefiles&quot; ..\n-- The C compiler identification is Clang 4.2.0\n-- The CXX compiler identification is Clang 4.2.0\n-- Check for working C compiler: \/usr\/bin\/cc\n-- Check for working C compiler: \/usr\/bin\/cc -- works\n-- Detecting C compiler ABI info\n-- Detecting C compiler ABI info - done\n-- Check for working CXX compiler: \/usr\/bin\/c++\n-- Check for working CXX compiler: \/usr\/bin\/c++ -- works\n-- Detecting CXX compiler ABI info\n-- Detecting CXX compiler ABI info - done\n-- Found PythonInterp: \/usr\/local\/bin\/python (found version &quot;2.7.3&quot;)\n-- Looking for include file pthread.h\n-- Looking for include file pthread.h - found\n-- Looking for pthread_create\n-- Looking for pthread_create - found\n-- Found Threads: TRUE\n-- Configuring done\n-- Generating done\n-- Build files have been written to: \/Documents\/Programming\/C++\/CMake Tutorial\/flavors\/part4_step2\/build\n <span class=\"ansiBold ansiForeground-blue\">&gt;<\/span> make\n<span class=\"ansiBold ansiForeground-magenta\">Scanning dependencies of target toDoCore\n<\/span>[ 14%] <span class=\"ansiForeground-green\">Building CXX object ToDoCore\/CMakeFiles\/toDoCore.dir\/ToDo.cc.o\n<\/span><span class=\"ansiBold ansiForeground-red\">Linking CXX static library libtoDoCore.a\n<\/span>[ 14%] Built target toDoCore\n<span class=\"ansiBold ansiForeground-magenta\">Scanning dependencies of target toDo\n<\/span>[ 28%] <span class=\"ansiForeground-green\">Building CXX object CMakeFiles\/toDo.dir\/main.cc.o\n<\/span><span class=\"ansiBold ansiForeground-red\">Linking CXX executable toDo\n<\/span>[ 28%] Built target toDo\n<span class=\"ansiBold ansiForeground-magenta\">Scanning dependencies of target gtest\n<\/span>[ 42%] <span class=\"ansiForeground-green\">Building CXX object gmock\/gtest\/CMakeFiles\/gtest.dir\/src\/gtest-all.cc.o\n<\/span>In file included from \/Documents\/Programming\/C++\/gmock\/gmock-1.6.0\/gtest\/src\/gtest-all.cc:42:\nIn file included from \/Documents\/Programming\/C++\/gmock\/gmock-1.6.0\/gtest\/src\/gtest.cc:132:\n<span class=\"ansiBold\">\/Documents\/Programming\/C++\/gmock\/gmock-1.6.0\/gtest\/src\/gtest-internal-inl.h:206:8: <\/span><span class=\"ansiBold ansiForeground-red\">error: <\/span><span class=\"ansiBold\">\n      private field 'pretty_' is not used [-Werror,-Wunused-private-field]<\/span>\n  bool pretty_;\n<span class=\"ansiBold ansiForeground-green\">       ^\n<\/span>1 error generated.\nmake[2]: *** [gmock\/gtest\/CMakeFiles\/gtest.dir\/src\/gtest-all.cc.o] Error 1\nmake[1]: *** [gmock\/gtest\/CMakeFiles\/gtest.dir\/all] Error 2\nmake: *** [all] Error 2\n<\/pre>\n<\/section>\n<p>\n    Oh noes! Newer versions of Clang have some pretty strict warnings and we<br \/>\n    have just run afoul of one. So we have a problem: we want to use strict<br \/>\n    compiler settings to ensure we write good code but we also don&#8217;t want to go<br \/>\n    changing Google Test. As it turns out CMake actually provides us the<br \/>\n    flexibility we need to disable warnings for just the <code>gtest<\/code><br \/>\n    target.\n  <\/p>\n<p>\n    This is a capability that can easily be abused. In the case of Google Test<br \/>\n    we didn&#8217;t write it and we know, or at least assume, that it works<br \/>\n    fine. Because of that we don&#8217;t care about any warnings we might find in<br \/>\n    Google Test&#8217;s code. We need to be careful not to use this feature to allow<br \/>\n    ourselves to write poor code.\n  <\/p>\n<section class=\"code cmake\">\n<header class=\"clear-after\">\n<h1>ToDoCore\/unit_test\/CMakeLists.txt<\/h1>\n<div class=\"hll legend\">New or modified lines in bold.<\/div>\n<\/header>\n<div class=\"highlight\">\n<pre><a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-1\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-1\"><\/a><span class=\"nb\">set<\/span><span class=\"p\">(<\/span><span class=\"s\">GMOCK_DIR<\/span> <span class=\"s2\">&quot;..\/..\/..\/..\/..\/gmock\/gmock-1.6.0&quot;<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-2\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-2\"><\/a>    <span class=\"s\">CACHE<\/span> <span class=\"s\">PATH<\/span> <span class=\"s2\">&quot;The path to the GoogleMock test framework.&quot;<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-3\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-3\"><\/a>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-4\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-4\"><\/a><span class=\"nb\">if<\/span> <span class=\"p\">(<\/span><span class=\"s2\">&quot;${CMAKE_CXX_COMPILER_ID}&quot;<\/span> <span class=\"s\">STREQUAL<\/span> <span class=\"s2\">&quot;MSVC&quot;<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-5\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-5\"><\/a>    <span class=\"c\"># force this option to ON so that Google Test will use \/MD instead of \/MT<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-6\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-6\"><\/a>    <span class=\"c\"># \/MD is now the default for Visual Studio, so it should be our default, too<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-7\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-7\"><\/a>    <span class=\"nb\">option<\/span><span class=\"p\">(<\/span><span class=\"s\">gtest_force_shared_crt<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-8\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-8\"><\/a>           <span class=\"s2\">&quot;Use shared (DLL) run-time lib even when Google Test is built as static lib.&quot;<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-9\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-9\"><\/a>           <span class=\"s\">ON<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-10\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-10\"><\/a><span class=\"nb\">elseif<\/span> <span class=\"p\">(<\/span><span class=\"s\">APPLE<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-11\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-11\"><\/a>    <span class=\"nb\">add_definitions<\/span><span class=\"p\">(<\/span><span class=\"s\">-DGTEST_USE_OWN_TR1_TUPLE=1<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-12\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-12\"><\/a><span class=\"nb\">endif<\/span><span class=\"p\">()<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-13\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-13\"><\/a><span class=\"nb\">add_subdirectory<\/span><span class=\"p\">(<\/span><span class=\"o\">${<\/span><span class=\"nv\">GMOCK_DIR<\/span><span class=\"o\">}<\/span> <span class=\"o\">${<\/span><span class=\"nv\">CMAKE_BINARY_DIR<\/span><span class=\"o\">}<\/span><span class=\"s\">\/gmock<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-14\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-14\"><\/a><span class=\"hll\"><span class=\"nb\">set_property<\/span><span class=\"p\">(<\/span><span class=\"s\">TARGET<\/span> <span class=\"s\">gtest<\/span> <span class=\"s\">APPEND_STRING<\/span> <span class=\"s\">PROPERTY<\/span> <span class=\"s\">COMPILE_FLAGS<\/span> <span class=\"s2\">&quot; -w&quot;<\/span><span class=\"p\">)<\/span>\n<\/span><a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-15\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-15\"><\/a>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-16\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-16\"><\/a><span class=\"nb\">include_directories<\/span><span class=\"p\">(<\/span><span class=\"s\">SYSTEM<\/span> <span class=\"o\">${<\/span><span class=\"nv\">GMOCK_DIR<\/span><span class=\"o\">}<\/span><span class=\"s\">\/gtest\/include<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-17\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-17\"><\/a>                           <span class=\"o\">${<\/span><span class=\"nv\">GMOCK_DIR<\/span><span class=\"o\">}<\/span><span class=\"s\">\/include<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-18\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-18\"><\/a>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-19\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-19\"><\/a>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-20\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-20\"><\/a><span class=\"nb\">add_executable<\/span><span class=\"p\">(<\/span><span class=\"s\">ToDoTest<\/span> <span class=\"s\">ToDoTest.cc<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-21\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-21\"><\/a><span class=\"nb\">target_link_libraries<\/span><span class=\"p\">(<\/span><span class=\"s\">ToDoTest<\/span> <span class=\"s\">toDoCore<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-22\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-22\"><\/a>                               <span class=\"s\">gmock_main<\/span><span class=\"p\">)<\/span>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-23\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-23\"><\/a>\n<a id=\"ToDoCore\/unit_test\/CMakeLists.txt-1-24\" class=\"line-number\" href=\"#ToDoCore\/unit_test\/CMakeLists.txt-1-24\"><\/a><span class=\"nb\">add_test<\/span><span class=\"p\">(<\/span><span class=\"s\">ToDoTest<\/span> <span class=\"s\">ToDoTest<\/span><span class=\"p\">)<\/span>\n<\/pre>\n<\/div>\n<\/section>\n<dl>\n<dt class=\"code\">\n      set_property(TARGET gtest APPEND_STRING PROPERTY COMPILE_FLAGS &#8221; -w&#8221;)\n    <\/dt>\n<dd>\n      There are a variety of things that have properties in CMake, in this case<br \/>\n      we are interested in a target&#8217;s properties. Each target can have it&#8217;s own<br \/>\n      compiler flags in addition the ones set in<br \/>\n      <code>CMAKE_<i>&lt;LANG&gt;<\/i>_FLAGS<\/code>. Here we append<br \/>\n      &#8220;<code class=\"nw\"> -w<\/code>&#8221; to <code>gtest<\/code>&#8216;s<br \/>\n      <code>COMPILE_FLAGS<\/code>. The flag &#8220;<code>-w<\/code>&#8221; disables all<br \/>\n      warnings for both GCC and Clang. When compiling with MSVC the<br \/>\n      &#8220;<code class=\"nw\">-w<\/code>&#8221; will be automatically converted to<br \/>\n      &#8220;<code class=\"nw\">\/w<\/code>&#8221; which has the same function.<br \/>\n      <span class=\"subtle\">(Although it will warn that<br \/>\n      &#8220;<code class=\"nw\">\/w<\/code>&#8221; is overriding<br \/>\n      &#8220;<code class=\"nw\">\/W4<\/code>&#8220;)<\/span>\n    <\/dd>\n<dd>\n      <a href=\"http:\/\/www.cmake.org\/cmake\/help\/v2.8.10\/cmake.html#prop_tgt:COMPILE_FLAGS\"><code>COMPILE_FLAGS<\/code> documentation<\/a>      <time class=\"access\">(2013-04-28)<\/time>\n    <\/dd>\n<dd>\n      <a href=\"http:\/\/gcc.gnu.org\/onlinedocs\/gcc\/Warning-Options.html\">GCC Warning Options<\/a>      <time class=\"access\">(2013-04-28)<\/time>, currently these work for Clang too.\n    <\/dd>\n<dd>\n      <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/thxezb7y.aspx\">Microsoft C\/C++ Compiler Warning Level<\/a>      <time class=\"access\">(2013-04-28)<\/time>\n    <\/dd>\n<\/dl>\n<dl>\n<dt class=\"code\">\n      set_property(TARGET<br \/>\n      <span class=\"arg\">target_name&hellip;<\/span><br \/>\n      <span class=\"optional\">APPEND|APPEND_STRING<\/span><br \/>\n      PROPERTY <span class=\"arg\">name<\/span> <span class=\"arg\">value&hellip;<\/span>)\n    <\/dt>\n<dd>\n<dl>\n<dt class=\"code\">\n          TARGET\n        <\/dt>\n<dd>\n          Specify that we want to set the property of a target. Several other<br \/>\n          types of things have properties you can set. For the moment we are<br \/>\n          only going to deal with targets, but the concept is the same for the<br \/>\n          rest.\n        <\/dd>\n<dt class=\"code arg\">\n          target_name&hellip;\n        <\/dt>\n<dd>\n          The name of the target whose property you want to set. You can list<br \/>\n          multiple targets and all will have the property set the same way for<br \/>\n          each.\n        <\/dd>\n<dt class=\"code optional\">\n          APPEND | APPEND_STRING\n        <\/dt>\n<dd>\n          Append to the property&#8217;s existing value instead of setting<br \/>\n          it. <code>APPEND<\/code> appends to the property as a<br \/>\n          list. <code>APPEND_STRING<\/code> appends to the property as a string.\n        <\/dd>\n<dd class=\"note\">\n          <em class=\"call-out\">Note:<\/em> Do not provide a multiple values when<br \/>\n          using <code>APPEND_STRING<\/code> as the results will not be what you<br \/>\n          expect.\n        <\/dd>\n<dd class=\"subtle\">\n          Don&#8217;t worry about lists we will cover them in the next<br \/>\n          <a href=\"https:\/\/www.johnlamp.net\/cmake-tutorial-5-functionally-improved-testing.html#section-Lists!\">chapter<\/a>.        <\/dd>\n<dt class=\"code\">\n          PROPERTY\n        <\/dt>\n<dt class=\"code arg\">\n          name\n        <\/dt>\n<dd>\n          The name of the property you want to set. See<br \/>\n          <a href=\"http:\/\/www.cmake.org\/cmake\/help\/v2.8.10\/cmake.html#section_PropertiesonTargets\">Properties on Targets<\/a>.        <\/dd>\n<dt class=\"code arg\">\n          value&hellip;\n        <\/dt>\n<dd>\n          The value to set for the property. If multiple values are provided<br \/>\n          they are treated as a list. Only provide one value if also using<br \/>\n          <code>APPEND_STRING<\/code>.\n        <\/dd>\n<dd class=\"subtle\">\n          Don&#8217;t worry about<br \/>\n          <a href=\"https:\/\/www.johnlamp.net\/cmake-tutorial-5-functionally-improved-testing.html#section-Lists!\">lists<\/a>          yet.\n        <\/dd>\n<\/dl>\n<\/dd>\n<dd>\n      <a href=\"http:\/\/www.cmake.org\/cmake\/help\/v2.8.10\/cmake.html#command:set_property\"><code>set_property()<\/code> documentation<\/a>      <time class=\"access\">(2013-04-28)<\/time>\n    <\/dd>\n<\/dl>\n<p>\n    Let&#8217;s give this version a try.<br \/>\n    <br \/>\n    <a class=\"sources\" href=\"https:\/\/www.johnlamp.net\/sources\/chapter4-3.zip\"><img src=\"https:\/\/www.johnlamp.net\/images\/zip.png\" alt=\"[zip file] \" \/>Source<\/a>  <\/p>\n<section class=\"terminal\">\n<pre>\n <span class=\"ansiBold ansiForeground-blue\">&gt;<\/span> mkdir build\n <span class=\"ansiBold ansiForeground-blue\">&gt;<\/span> cd build\n <span class=\"ansiBold ansiForeground-blue\">&gt;<\/span> cmake -G &quot;Unix Makefiles&quot; ..\n-- The C compiler identification is Clang 4.2.0\n-- The CXX compiler identification is Clang 4.2.0\n-- Check for working C compiler: \/usr\/bin\/cc\n-- Check for working C compiler: \/usr\/bin\/cc -- works\n-- Detecting C compiler ABI info\n-- Detecting C compiler ABI info - done\n-- Check for working CXX compiler: \/usr\/bin\/c++\n-- Check for working CXX compiler: \/usr\/bin\/c++ -- works\n-- Detecting CXX compiler ABI info\n-- Detecting CXX compiler ABI info - done\n-- Found PythonInterp: \/usr\/local\/bin\/python (found version &quot;2.7.3&quot;)\n-- Looking for include file pthread.h\n-- Looking for include file pthread.h - found\n-- Looking for pthread_create\n-- Looking for pthread_create - found\n-- Found Threads: TRUE\n-- Configuring done\n-- Generating done\n-- Build files have been written to: \/Documents\/Programming\/C++\/CMake Tutorial\/flavors\/part4_step3\/build\n <span class=\"ansiBold ansiForeground-blue\">&gt;<\/span> make\n<span class=\"ansiBold ansiForeground-magenta\">Scanning dependencies of target toDoCore\n<\/span>[ 14%] <span class=\"ansiForeground-green\">Building CXX object ToDoCore\/CMakeFiles\/toDoCore.dir\/ToDo.cc.o\n<\/span><span class=\"ansiBold ansiForeground-red\">Linking CXX static library libtoDoCore.a\n<\/span>[ 14%] Built target toDoCore\n<span class=\"ansiBold ansiForeground-magenta\">Scanning dependencies of target toDo\n<\/span>[ 28%] <span class=\"ansiForeground-green\">Building CXX object CMakeFiles\/toDo.dir\/main.cc.o\n<\/span><span class=\"ansiBold ansiForeground-red\">Linking CXX executable toDo\n<\/span>[ 28%] Built target toDo\n<span class=\"ansiBold ansiForeground-magenta\">Scanning dependencies of target gtest\n<\/span>[ 42%] <span class=\"ansiForeground-green\">Building CXX object gmock\/gtest\/CMakeFiles\/gtest.dir\/src\/gtest-all.cc.o\n<\/span><span class=\"ansiBold ansiForeground-red\">Linking CXX static library libgtest.a\n<\/span>[ 42%] Built target gtest\n<span class=\"ansiBold ansiForeground-magenta\">Scanning dependencies of target gmock\n<\/span>[ 57%] <span class=\"ansiForeground-green\">Building CXX object gmock\/CMakeFiles\/gmock.dir\/src\/gmock-all.cc.o\n<\/span><span class=\"ansiBold ansiForeground-red\">Linking CXX static library libgmock.a\n<\/span>[ 57%] Built target gmock\n<span class=\"ansiBold ansiForeground-magenta\">Scanning dependencies of target gmock_main\n<\/span>[ 71%] <span class=\"ansiForeground-green\">Building CXX object gmock\/CMakeFiles\/gmock_main.dir\/src\/gmock_main.cc.o\n<\/span><span class=\"ansiBold ansiForeground-red\">Linking CXX static library libgmock_main.a\n<\/span>[ 71%] Built target gmock_main\n<span class=\"ansiBold ansiForeground-magenta\">Scanning dependencies of target ToDoTest\n<\/span>[ 85%] <span class=\"ansiForeground-green\">Building CXX object ToDoCore\/unit_test\/CMakeFiles\/ToDoTest.dir\/ToDoTest.cc.o\n<\/span><span class=\"ansiBold ansiForeground-red\">Linking CXX executable ToDoTest\n<\/span>[ 85%] Built target ToDoTest\n<span class=\"ansiBold ansiForeground-magenta\">Scanning dependencies of target gtest_main\n<\/span>[100%] <span class=\"ansiForeground-green\">Building CXX object gmock\/gtest\/CMakeFiles\/gtest_main.dir\/src\/gtest_main.cc.o\n<\/span><span class=\"ansiBold ansiForeground-red\">Linking CXX static library libgtest_main.a\n<\/span>[100%] Built target gtest_main\n <span class=\"ansiBold ansiForeground-blue\">&gt;<\/span> make test\n<span class=\"ansiForeground-cyan\">Running tests...\n<\/span>Test project \/Documents\/Programming\/C++\/CMake Tutorial\/flavors\/part4_step3\/build\n    Start 1: ToDoTest\n1\/1 Test #1: ToDoTest .........................   Passed    0.00 sec\n100% tests passed, 0 tests failed out of 1\nTotal Test time (real) =   0.01 sec\n <span class=\"ansiBold ansiForeground-blue\">&gt;<\/span> ToDoCore\/unit_test\/ToDoTest\nRunning main() from gmock_main.cc\n<span class=\"ansiForeground-green\">[==========] <\/span>Running 4 tests from 1 test case.\n<span class=\"ansiForeground-green\">[----------] <\/span>Global test environment set-up.\n<span class=\"ansiForeground-green\">[----------] <\/span>4 tests from ToDoTest\n<span class=\"ansiForeground-green\">[ RUN      ] <\/span>ToDoTest.constructior_createsEmptyList\n<span class=\"ansiForeground-green\">[       OK ] <\/span>ToDoTest.constructior_createsEmptyList (0 ms)\n<span class=\"ansiForeground-green\">[ RUN      ] <\/span>ToDoTest.addTask_threeTimes_sizeIsThree\n<span class=\"ansiForeground-green\">[       OK ] <\/span>ToDoTest.addTask_threeTimes_sizeIsThree (0 ms)\n<span class=\"ansiForeground-green\">[ RUN      ] <\/span>ToDoTest.getTask_withOneTask_returnsCorrectString\n<span class=\"ansiForeground-green\">[       OK ] <\/span>ToDoTest.getTask_withOneTask_returnsCorrectString (0 ms)\n<span class=\"ansiForeground-green\">[ RUN      ] <\/span>ToDoTest.getTask_withThreeTasts_returnsCorrectStringForEachIndex\n<span class=\"ansiForeground-green\">[       OK ] <\/span>ToDoTest.getTask_withThreeTasts_returnsCorrectStringForEachIndex (1 ms)\n<span class=\"ansiForeground-green\">[----------] <\/span>4 tests from ToDoTest (1 ms total)\n<span class=\"ansiForeground-green\">[----------] <\/span>Global test environment tear-down\n<span class=\"ansiForeground-green\">[==========] <\/span>4 tests from 1 test case ran. (1 ms total)\n<span class=\"ansiForeground-green\">[  PASSED  ] <\/span>4 tests.\n<\/pre>\n<\/section>\n<p>\n    Yay! Everything works now and our test passes, too.\n  <\/p>\n<p>\n    Next we will focus on how we could add more unit tests<br \/>\n    <span class=\"subtle\">(if we had more units)<\/span> without duplicating the<br \/>\n    work we&#8217;ve done here. Also we will make it so that our unit tests are<br \/>\n    automatically run as needed whenever we build.\n  <\/p>\n<\/section>\n<section id=\"revision-history\"><span class=\"heading\">Revision History<\/span><\/p>\n<table summary=\"Revision History\">\n<thead>\n<tr>\n<td>Version<\/td>\n<td>Date<\/td>\n<td>Comment<\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>2013-05-05<\/td>\n<td>Original version.<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>2013-07-14<\/td>\n<td>Added line numbers and indication of changes to code samples. Added a link to the section on lists.<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>2014-10-01<\/td>\n<td>Added the work around for a problem with Google Test and newer versions of Mac OS X along with an explanation and a description of <code>add_definitions()<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/section>\n","protected":false},"excerpt":{"rendered":"<p>So far our project is rather simple. A real project would be more<br \/>\n    complicated than the one we&#8217;ve created. Let&#8217;s add subdirectories, libraries,<br \/>\n    and proper unit tests to make our project more realistic.<\/p>\n<p>    In this chapter we will split up our project to have a library which we can<br \/>\n    put in a subdirectory. Then we &hellip;<br \/><a href=\"https:\/\/www.johnlamp.net\/?p=22\" rel=\"bookmark\">Continue reading &quot;CMake Tutorial &#8211; Chapter&#160;4: Libraries and Subdirectories&quot;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[3,4,5],"_links":{"self":[{"href":"https:\/\/www.johnlamp.net\/index.php?rest_route=\/wp\/v2\/posts\/22"}],"collection":[{"href":"https:\/\/www.johnlamp.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.johnlamp.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.johnlamp.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.johnlamp.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=22"}],"version-history":[{"count":0,"href":"https:\/\/www.johnlamp.net\/index.php?rest_route=\/wp\/v2\/posts\/22\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.johnlamp.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=22"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.johnlamp.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=22"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.johnlamp.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=22"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}