CLI's main() scaffolding

Again, this is mostly a copy-paste from the other project.

Change-Id: Ic72aee3a46644afc91d9f1d7ca8ab22d477608ef
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 76f07e7..8986d4f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -31,12 +31,30 @@
 # configurations. They are warnings, not errors.
 set(CMAKE_CXX_FLAGS "-Wall -Wextra -pedantic ${CMAKE_CXX_FLAGS}")
 
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
+
+add_custom_target(git-version-cmake-ide
+    cmake/ProjectGitVersion.cmake
+    cmake/ProjectGitVersionRunner.cmake
+    )
+include(cmake/ProjectGitVersion.cmake)
+prepare_git_version(NETCONF_CLI_VERSION "0.0")
+
 find_package(Doxygen)
 option(WITH_DOCS "Create and install internal documentation (needs Doxygen)" ${DOXYGEN_FOUND})
 
 find_package(docopt REQUIRED)
 find_package(spdlog REQUIRED)
 
+set(netconf-cli_SRCS
+    src/main.cpp
+    )
+
+add_executable(netconf-cli ${netconf-cli_SRCS})
+target_link_libraries(netconf-cli docopt)
+add_dependencies(netconf-cli target-NETCONF_CLI_VERSION)
+target_include_directories(netconf-cli PRIVATE ${PROJECT_BINARY_DIR})
+
 include(CTest)
 if(BUILD_TESTING)
     enable_testing()
diff --git a/cmake/ProjectGitVersion.cmake b/cmake/ProjectGitVersion.cmake
new file mode 100644
index 0000000..4e4327f
--- /dev/null
+++ b/cmake/ProjectGitVersion.cmake
@@ -0,0 +1,18 @@
+find_package(Git REQUIRED)
+
+macro(prepare_git_version VERSION_VARIABLE FALLBACK_VERSION)
+    set(${VERSION_VARIABLE}-version_files ${PROJECT_BINARY_DIR}/${VERSION_VARIABLE}.h)
+    add_custom_target(target-${VERSION_VARIABLE} DEPENDS build_version_fake_file-${VERSION_VARIABLE})
+    add_custom_command(OUTPUT build_version_fake_file-${VERSION_VARIABLE} ${${VERSION_VARIABLE}-version_files}
+        COMMAND ${CMAKE_COMMAND} -DGIT_EXECUTABLE=${GIT_EXECUTABLE}
+            -DVERSION_VARIABLE=${VERSION_VARIABLE}
+            -DFALLBACK_VERSION=${FALLBACK_VERSION}
+            -DPROJECT_NAME=${PROJECT_NAME}
+            -DPROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}
+            -DPROJECT_BINARY_DIR=${PROJECT_BINARY_DIR}
+            -P ${PROJECT_SOURCE_DIR}/cmake/ProjectGitVersionRunner.cmake)
+    set_source_files_properties(${PROJECT_BINARY_DIR}/${${VERSION_VARIABLE}.h}
+        PROPERTIES
+        GENERATED TRUE
+        HEADER_FILE_ONLY TRUE)
+endmacro()
diff --git a/cmake/ProjectGitVersionRunner.cmake b/cmake/ProjectGitVersionRunner.cmake
new file mode 100644
index 0000000..38fdf28
--- /dev/null
+++ b/cmake/ProjectGitVersionRunner.cmake
@@ -0,0 +1,22 @@
+if(GIT_EXECUTABLE AND EXISTS ${PROJECT_SOURCE_DIR}/.git)
+    execute_process(COMMAND ${GIT_EXECUTABLE} describe --dirty --long --always --tags
+        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+        OUTPUT_VARIABLE ${VERSION_VARIABLE})
+    string(REPLACE "\n" "" "${VERSION_VARIABLE}" ${${VERSION_VARIABLE}})
+endif()
+
+if(${VERSION_VARIABLE})
+    set(${VERSION_VARIABLE}_H
+        "#define ${VERSION_VARIABLE} \"${${VERSION_VARIABLE}}\"\n"
+        )
+    message(STATUS "Building ${PROJECT_NAME} Git version ${${VERSION_VARIABLE}}")
+else()
+    set(${VERSION_VARIABLE}_H
+        "#define ${VERSION_VARIABLE} \"${FALLBACK_VERSION}\"\n"
+        )
+    message(STATUS "Building ${PROJECT_NAME} version: ${${VERSION_VARIABLE}}")
+endif()
+
+file(WRITE ${PROJECT_BINARY_DIR}/${VERSION_VARIABLE}.h.in ${${VERSION_VARIABLE}_H})
+execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different
+    ${PROJECT_BINARY_DIR}/${VERSION_VARIABLE}.h.in ${PROJECT_BINARY_DIR}/${VERSION_VARIABLE}.h)
diff --git a/src/main.cpp b/src/main.cpp
new file mode 100644
index 0000000..e94ede8
--- /dev/null
+++ b/src/main.cpp
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2018 CESNET, https://photonics.cesnet.cz/
+ *
+ * Written by Jan Kundrát <jan.kundrat@cesnet.cz>
+ *
+*/
+
+#include <docopt.h>
+#include <string>
+#include "NETCONF_CLI_VERSION.h"
+
+static const char usage[] =
+R"(CLI interface to remote NETCONF hosts
+
+Usage:
+  netconf-cli (-h | --help)
+  netconf-cli --version
+)";
+
+int main(int argc, char* argv[])
+{
+    auto args = docopt::docopt(usage,
+                               {argv + 1, argv + argc},
+                               true,
+                               "netconf-cli " NETCONF_CLI_VERSION,
+                               true);
+    return 0;
+}