# Adding a Version Number and Configured Header File #

The first feature we will add is to provide our executable and project with a
version number. While we could do this exclusively in the source code, using
CMakeLists provides more flexibility.

To add a version number we modify the CMakeLists file as follows:

  cmake_minimum_required(VERSION 3.3)
  project(Tutorial)

  # the version number.
  set(Tutorial_VERSION_MAJOR 1)
  set(Tutorial_VERSION_MINOR 0)

  # configure a header file to pass some of the CMake settings
  # to the source code
  configure_file(
    "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
    "${PROJECT_BINARY_DIR}/TutorialConfig.h"
    )

  # add the executable
  add_executable(Tutorial tutorial.cxx)

  # add the binary tree to the search path for include files
  # so that we will find TutorialConfig.h
  target_include_directories(Tutorial PUBLIC
                             "${PROJECT_BINARY_DIR}"
                             )


We then create a TutorialConfig.h.in file in the source tree with the
following contents:

  // the configured options and settings for Tutorial
  #define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
  #define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@

When CMake configures this header file the values for @Tutorial_VERSION_MAJOR@
and @Tutorial_VERSION_MINOR@ will be replaced by the values from the CMakeLists
file. Next we modify tutorial.cxx to include the configured header file and to
make use of the version numbers. The resulting source code is listed below.

  // A simple program that computes the square root of a number
  #include <cmath>
  #include <iostream>
  #include <string>
  #include <sstream>

  #include "TutorialConfig.h"

  int main (int argc, char *argv[])
  {
    if (argc < 2) {
      std::cout << argv[0] << " Version "
                << Tutorial_VERSION_MAJOR << "." << Tutorial_VERSION_MINOR
                << std::endl;
      std::cout << "Usage: " << argv[0] << " number" << std::endl;
      return 1;
    }

    double inputValue = atof(argv[1]);

    double outputValue = sqrt(inputValue);
    std::cout << "The square root of "
              << inputValue << " is " << outputValue << std::endl;
    return 0;
  }

# Adding C++11 support #

Let's add some C++11 features to our project. We will need to explicitly state
in the CMake code that it should use the correct flags. The easiest way to
enable C++11 support for CMake is by using the CMAKE_CXX_STANDARD
and CMAKE_CXX_STANDARD_REQUIRED variables.

First, replace `atof` with `std::stod` in tutorial.cxx.

Then, add the CMAKE_CXX_STANDARD and CMAKE_CXX_STANDARD_REQUIRED variables to
the CMakeLists file. The STANADARD value should be set to 11, and REQUIRED
should be set to True.


# Build and Test #

Run cmake or cmake-gui to configure the project and then build it with your
chosen build tool

cd to the directory where Tutorial was built (likely the make directory or
a Debug or Release build configuration subdirectory) and run these commands:

  Tutorial 4294967296
  Tutorial 10
  Tutorial
