MINIFICPP-952 - Use GitHub Actions

Signed-off-by: Arpad Boda <aboda@apache.org>

This closes #853
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..185d05f
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,266 @@
+name: "MiNiFi-CPP CI"
+on: [push, pull_request, workflow_dispatch]
+jobs:
+  macos_xcode_10_3:
+    name: "macos-xcode10.3"
+    runs-on: macos-10.15
+    timeout-minutes: 60
+    steps:
+      - id: checkout
+        uses: actions/checkout@v2
+      - id: install_dependencies
+        run: brew install ossp-uuid boost flex openssl python lua libpcap xz libssh2
+      - id: setup_env
+        run: |
+          echo -e "127.0.0.1\t$HOSTNAME" | sudo tee -a /etc/hosts > /dev/null
+          echo "::set-env name=CMAKE_BUILD_OPTIONS::-DENABLE_PCAP=TRUE -DENABLE_LUA_SCRIPTING=1"
+          sudo xcode-select -switch /Applications/Xcode_10.3.app
+      - id: build
+        run: ./bootstrap.sh -e -t && cd build  && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_RULE_MESSAGES=OFF -DSTRICT_GSL_CHECKS=AUDIT .. && cmake --build . --parallel 4 && make test ARGS="--timeout 300 -j4 --output-on-failure" && make linter
+  macos_xcode_11_2_1:
+    name: "macos-xcode11.2.1"
+    runs-on: macos-10.15
+    timeout-minutes: 60
+    steps:
+      - id: checkout
+        uses: actions/checkout@v2
+      - id: install_dependencies
+        run: brew install ossp-uuid boost flex openssl python lua libpcap xz libssh2
+      - id: setup_env
+        run: |
+          echo -e "127.0.0.1\t$HOSTNAME" | sudo tee -a /etc/hosts > /dev/null
+          echo "::set-env name=CMAKE_BUILD_OPTIONS::-DENABLE_PCAP=TRUE -DENABLE_LUA_SCRIPTING=1"
+          sudo xcode-select -switch /Applications/Xcode_11.2.1.app
+      - id: build
+        run: ./bootstrap.sh -e -t && cd build  && cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_RULE_MESSAGES=OFF -DSTRICT_GSL_CHECKS=AUDIT .. && cmake --build . --parallel 4 && make test ARGS="--timeout 300 -j4 --output-on-failure" && make linter
+  windows:
+    name: "windows"
+    runs-on: windows-2016
+    timeout-minutes: 90
+    steps:
+      - id: checkout
+        uses: actions/checkout@v2
+      - id: build
+        run: |
+          PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\Tools\;%path%
+          PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\;%path%
+          PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;%path%
+          PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin;%path%
+          PATH=C:\Program Files (x86)\Windows Kits\10\bin\x86;%path%
+          PATH=C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x86;%path%
+          PATH=C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\;%path%
+          PATH=C:\Program Files (x86)\Microsoft Visual Studio\Shared\Common\VSPerfCollectionTools\;%path%
+          PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Team Tools\Performance Tools;%path%
+          PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\bin\Roslyn;%path%
+          PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer;%path%
+          PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TestWindow;%path%
+          PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VC\VCPackages;%path%
+          PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\bin\HostX86\x86;%path%
+          PATH=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin;%path%
+          PATH=C:\Windows\System32\;%path%
+          win_build_vs.bat build /CI
+        shell: cmd
+  ubuntu_16_04:
+    name: "ubuntu-16.04"
+    runs-on: ubuntu-16.04
+    timeout-minutes: 60
+    steps:
+      - id: checkout
+        uses: actions/checkout@v2
+      - id: cache
+        uses: actions/cache@v2
+        with:
+          path: ~/.ccache
+          key: ubuntu-16.04-ccache-${{github.ref}}-${{github.sha}}
+          restore-keys: |
+            ubuntu-16.04-ccache-${{github.ref}}-
+            ubuntu-16.04-ccache-refs/heads/main-
+      - id: install_deps
+        run: |
+          echo "::set-env name=CMAKE_BUILD_OPTIONS::-DENABLE_PCAP=TRUE"
+          sudo apt install -y ccache
+          echo "::set-env name=PATH::/usr/lib/ccache:$PATH"
+      - id: build
+        run: ./bootstrap.sh -e -t && cd build  && cmake -DUSE_SHARED_LIBS= -DCMAKE_BUILD_TYPE=Release -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_RULE_MESSAGES=OFF -DSTRICT_GSL_CHECKS=AUDIT .. && cmake --build . --parallel 4   && make test ARGS="--timeout 300 -j2 --output-on-failure"
+  ubuntu_16_04_gcc_4_8:
+    name: "ubuntu-16.04-gcc-4.8"
+    runs-on: ubuntu-16.04
+    timeout-minutes: 60
+    steps:
+      - id: checkout
+        uses: actions/checkout@v2
+      - id: cache
+        uses: actions/cache@v2
+        with:
+          path: ~/.ccache
+          key: ubuntu-16.04-gcc-4.8-ccache-${{github.ref}}-${{github.sha}}
+          restore-keys: |
+            ubuntu-16.04-gcc-4.8-ccache-${{github.ref}}-
+            ubuntu-16.04-gcc-4.8-ccache-refs/heads/main-
+      - id: install_deps
+        run: |
+          echo "::set-env name=CMAKE_BUILD_OPTIONS::-DENABLE_PCAP=TRUE"
+          sudo apt-add-repository -y "ppa:ubuntu-toolchain-r/test"
+          sudo apt update
+          sudo apt install -y gcc-4.8 g++-4.8 bison flex libboost-all-dev uuid-dev openssl libcurl4-openssl-dev ccache libpython3-dev liblua5.1-0-dev libpcap-dev libssh2-1-dev
+          echo "::set-env name=PATH::/usr/lib/ccache:$PATH"
+          sudo unlink /usr/bin/gcc && sudo ln -s /usr/bin/gcc-4.8 /usr/bin/gcc
+          sudo unlink /usr/bin/g++ && sudo ln -s /usr/bin/g++-4.8 /usr/bin/g++
+      - id: build
+        run: ./bootstrap.sh -e -t && cd build  && cmake -DUSE_SHARED_LIBS= -DCMAKE_BUILD_TYPE=Release -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_RULE_MESSAGES=OFF -DSTRICT_GSL_CHECKS=AUDIT .. && cmake --build . --parallel 4   && make test ARGS="--timeout 300 -j2 --output-on-failure"
+  ubuntu_20_04:
+    name: "ubuntu-20.04"
+    runs-on: ubuntu-20.04
+    timeout-minutes: 60
+    steps:
+      - id: checkout
+        uses: actions/checkout@v2
+      - id: cache
+        uses: actions/cache@v2
+        with:
+          path: ~/.ccache
+          key: ubuntu-20.04-ccache-${{github.ref}}-${{github.sha}}
+          restore-keys: |
+            ubuntu-20.04-ccache-${{github.ref}}-
+            ubuntu-20.04-ccache-refs/heads/main-
+      - id: install_deps
+        run: |
+          echo "::set-env name=CMAKE_BUILD_OPTIONS::-DENABLE_PCAP=TRUE"
+          sudo apt install -y ccache libfl-dev
+          echo "::set-env name=PATH::/usr/lib/ccache:$PATH"
+      - id: build
+        run: ./bootstrap.sh -e -t && cd build  && cmake -DUSE_SHARED_LIBS= -DSTRICT_GSL_CHECKS=AUDIT .. && make -j4 VERBOSE=1  && make test ARGS="--timeout 300 -j2 --output-on-failure"
+  ubuntu_16_04_all:
+    name: "ubuntu-16.04-all"
+    runs-on: ubuntu-16.04
+    timeout-minutes: 60
+    steps:
+      - id: checkout
+        uses: actions/checkout@v2
+      - id: cache
+        uses: actions/cache@v2
+        with:
+          path: ~/.ccache
+          key: ubuntu-16.04-all-ccache-${{github.ref}}-${{github.sha}}
+          restore-keys: |
+            ubuntu-16.04-all-ccache-${{github.ref}}-
+            ubuntu-16.04-all-ccache-refs/heads/main-
+      - id: install_deps
+        run: |
+          echo "::set-env name=CMAKE_BUILD_OPTIONS::-DENABLE_PCAP=TRUE"
+          sudo apt-add-repository -y "ppa:ubuntu-toolchain-r/test"
+          sudo apt update
+          sudo apt install -y ccache openjdk-8-jdk maven
+          echo "::set-env name=PATH::/usr/lib/ccache:$PATH"
+      - id: build
+        run: ./bootstrap.sh -e -t && cd build  && cmake -DUSE_SHARED_LIBS= -DENABLE_LIBRDKAFKA=ON -DENABLE_OPC=ON -DENABLE_SFTP=ON -DENABLE_MQTT=ON -DENABLE_COAP=ON -DENABLE_PYTHON=ON -DSTRICT_GSL_CHECKS=AUDIT .. &&  cmake --build . --parallel 4  && make test ARGS="--timeout 300 -j8 --output-on-failure"
+  debian:
+    name: "debian"
+    runs-on: ubuntu-18.04
+    timeout-minutes: 60
+    steps:
+      - id: checkout
+        uses: actions/checkout@v2
+      - id: cache
+        uses: actions/cache@v2
+        with:
+          path: ~/.ccache
+          key: debian-ccache-${{github.ref}}-${{github.sha}}
+          restore-keys: |
+            debian-ccache-${{github.ref}}-
+            debian-ccache-refs/heads/main-
+      - id: install_deps
+        run: |
+          echo "::set-env name=CMAKE_BUILD_OPTIONS::-DENABLE_PCAP=TRUE"
+          sudo apt install -y ccache
+          echo "::set-env name=PATH::/usr/lib/ccache:$PATH"
+      - id: build
+        run: mkdir -p build && cd build && cmake -DSTRICT_GSL_CHECKS=AUDIT .. && make debian
+  centos:
+    name: "centos"
+    runs-on: ubuntu-18.04
+    timeout-minutes: 60
+    steps:
+      - id: checkout
+        uses: actions/checkout@v2
+      - id: cache
+        uses: actions/cache@v2
+        with:
+          path: ~/.ccache
+          key: centos-ccache-${{github.ref}}-${{github.sha}}
+          restore-keys: |
+            centos-ccache-${{github.ref}}-
+            centos-ccache-refs/heads/main-
+      - id: install_deps
+        run: |
+          echo "::set-env name=CMAKE_BUILD_OPTIONS::-DENABLE_PCAP=TRUE"
+          sudo apt install -y ccache
+          echo "::set-env name=PATH::/usr/lib/ccache:$PATH"
+      - id: build
+        run: mkdir -p build && cd build && cmake -DSTRICT_GSL_CHECKS=AUDIT .. && make centos
+  fedora:
+    name: "fedora"
+    runs-on: ubuntu-18.04
+    timeout-minutes: 60
+    steps:
+      - id: checkout
+        uses: actions/checkout@v2
+      - id: cache
+        uses: actions/cache@v2
+        with:
+          path: ~/.ccache
+          key: fedora-ccache-${{github.ref}}-${{github.sha}}
+          restore-keys: |
+            fedora-ccache-${{github.ref}}-
+            fedora-ccache-refs/heads/main-
+      - id: install_deps
+        run: |
+          echo "::set-env name=CMAKE_BUILD_OPTIONS::-DENABLE_PCAP=TRUE"
+          sudo apt install -y ccache
+          echo "::set-env name=PATH::/usr/lib/ccache:$PATH"
+      - id: build
+        run: mkdir -p build && cd build && cmake -DSTRICT_GSL_CHECKS=AUDIT .. && make fedora
+  ubuntu_18_04:
+    name: "ubuntu-18.04"
+    runs-on: ubuntu-18.04
+    timeout-minutes: 60
+    steps:
+      - id: checkout
+        uses: actions/checkout@v2
+      - id: cache
+        uses: actions/cache@v2
+        with:
+          path: ~/.ccache
+          key: ubuntu-18.04-ccache-${{github.ref}}-${{github.sha}}
+          restore-keys: |
+            ubuntu-18.04-ccache-${{github.ref}}-
+            ubuntu-18.04-ccache-refs/heads/main
+      - id: install_deps
+        run: |
+          echo "::set-env name=CMAKE_BUILD_OPTIONS::-DENABLE_PCAP=TRUE"
+          sudo apt install -y ccache
+          echo "::set-env name=PATH::/usr/lib/ccache:$PATH"
+      - id: build
+        run: mkdir -p build && cd build && cmake -DSTRICT_GSL_CHECKS=AUDIT .. && make u18
+  ubuntu_16_04_shared:
+    name: "ubuntu-16.04-shared"
+    runs-on: ubuntu-16.04
+    timeout-minutes: 60
+    steps:
+      - id: checkout
+        uses: actions/checkout@v2
+      - id: cache
+        uses: actions/cache@v2
+        with:
+          path: ~/.ccache
+          key: ubuntu-16.04-shared-ccache-${{github.ref}}-${{github.sha}}
+          restore-keys: |
+            ubuntu-16.04-shared-ccache-${{github.ref}}-
+            ubuntu-16.04-shared-ccache-refs/heads/main-
+      - id: install_deps
+        run: |
+          echo "::set-env name=CMAKE_BUILD_OPTIONS::-DENABLE_PCAP=TRUE"
+          sudo apt install -y ccache
+          echo "::set-env name=PATH::/usr/lib/ccache:$PATH"
+      - id: build
+        run: ./bootstrap.sh -e -t && cd build  && cmake -DUSE_SHARED_LIBS=ON -DSTRICT_GSL_CHECKS=AUDIT .. &&  cmake --build . --parallel 4  && make test ARGS="--timeout 300 -j4 --output-on-failure"
diff --git a/.gitignore b/.gitignore
index d014fd5..273800a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -53,7 +53,7 @@
 thirdparty/**/*.o
 thirdparty/**/*.a
 libminifi/test/**/*.a
-libminifi/include/agent/agent_version.h
+libminifi/src/agent/agent_version.cpp
 docs/generated
 thirdparty/apache-rat/apache-rat*
 /compile_commands.json
@@ -75,4 +75,4 @@
 .vs/VSWorkspaceState.json
 .vs/slnx.sqlite
 /.ccls-cache
-/.vscode
\ No newline at end of file
+/.vscode
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e38993f..1e7da8f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -580,7 +580,7 @@
 			"${CMAKE_CURRENT_SOURCE_DIR}/generateVersion.bat"
 			"${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}"
 			${CMAKE_CURRENT_SOURCE_DIR}
-			${CMAKE_CURRENT_SOURCE_DIR}/libminifi/include/agent/
+			${CMAKE_CURRENT_SOURCE_DIR}/libminifi/src/agent/
 			"${CMAKE_CXX_COMPILER}"
 			"${CMAKE_CXX_COMPILER_VERSION}"
 			"${CMAKE_CXX_FLAGS}"
@@ -592,7 +592,7 @@
 			"${CMAKE_CURRENT_SOURCE_DIR}/generateVersion.sh"
 			"${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}"
 			${CMAKE_CURRENT_SOURCE_DIR}
-			${CMAKE_CURRENT_SOURCE_DIR}/libminifi/include/agent/
+			${CMAKE_CURRENT_SOURCE_DIR}/libminifi/src/agent/
 			"${CMAKE_CXX_COMPILER}"
 			"${CMAKE_CXX_COMPILER_VERSION}"
 			"${CMAKE_CXX_FLAGS}"
diff --git a/extensions/standard-processors/tests/unit/TailFileTests.cpp b/extensions/standard-processors/tests/unit/TailFileTests.cpp
index 66e84a1..4bd803b 100644
--- a/extensions/standard-processors/tests/unit/TailFileTests.cpp
+++ b/extensions/standard-processors/tests/unit/TailFileTests.cpp
@@ -1521,8 +1521,8 @@
     REQUIRE(LogTestController::getInstance().contains("Logged 2 flow files"));
   }
 
-  SECTION("Lookup frequency set to 10 ms => new files are only picked up after 10 ms") {
-    plan->setProperty(tail_file, processors::TailFile::LookupFrequency.getName(), "10 ms");
+  SECTION("Lookup frequency set to 100 ms => new files are only picked up after 100 ms") {
+    plan->setProperty(tail_file, processors::TailFile::LookupFrequency.getName(), "100 ms");
 
     plan->reset(true);
     LogTestController::getInstance().resetStream(LogTestController::getInstance().log_output);
@@ -1536,7 +1536,7 @@
     plan->reset(false);
     LogTestController::getInstance().resetStream(LogTestController::getInstance().log_output);
 
-    std::this_thread::sleep_for(std::chrono::milliseconds(11));
+    std::this_thread::sleep_for(std::chrono::milliseconds(110));
     testController.runSession(plan, true);
     REQUIRE(LogTestController::getInstance().contains("Logged 2 flow files"));
   }
diff --git a/generateVersion.bat b/generateVersion.bat
index a1a3ad5..ac2187d 100644
--- a/generateVersion.bat
+++ b/generateVersion.bat
@@ -45,51 +45,45 @@
 )
 
 (
-	echo #ifndef AGENT_BUILD_H
-	echo #define AGENT_BUILD_H
-
+    echo #include ^<string^>
 	echo #include ^<vector^>
+	echo #include "agent/agent_version.h"
 
 	echo namespace org {
 	echo namespace apache {
 	echo namespace nifi {
 	echo namespace minifi {
 
-	echo class AgentBuild {
-	echo public:
-	echo static constexpr const char* VERSION = "%version%";
-	echo static constexpr const char* BUILD_IDENTIFIER = "%buildident%";
-	echo   static constexpr const char* BUILD_REV = "%buildrev%";
-	echo   static constexpr const char* BUILD_DATE = "%builddate%";
-	echo   static constexpr const char* COMPILER = "%compiler%";
-	echo   static constexpr const char* COMPILER_VERSION = "%compiler_version%";
-	echo   static constexpr const char* COMPILER_FLAGS = "%flags%";
-	echo   static std^:^:vector^<std^:^:string^> getExtensions^(^) {
+	echo const char* const AgentBuild::VERSION = "%version%";
+	echo const char* const AgentBuild::BUILD_IDENTIFIER = "%buildident%";
+	echo const char* const AgentBuild::BUILD_REV = "%buildrev%";
+	echo const char* const AgentBuild::BUILD_DATE = "%builddate%";
+	echo const char* const AgentBuild::COMPILER = "%compiler%";
+	echo const char* const AgentBuild::COMPILER_VERSION = "%compiler_version%";
+	echo const char* const AgentBuild::COMPILER_FLAGS = "%flags%";
+	echo std^:^:vector^<std^:^:string^> AgentBuild::getExtensions^(^) {
   	echo 	static std^:^:vector^<std^:^:string^> extensions;
   	echo 	if ^(extensions.empty^(^)^){
-	) > "%out_dir%/agent_version.h"
+	) > "%out_dir%/agent_version.cpp"
 
 	for /l %%i in (1,1,%count%) do (
 	   (
 				echo extensions.push_back^("!extension%%i!"^);
-		)>> "%out_dir%/agent_version.h"
+		)>> "%out_dir%/agent_version.cpp"
 	)
 
 	
 (
-	echo 	  extensions.push_back^("minifi-system"^);
-	echo 	}
-  	echo 	return extensions;
+	echo 	 extensions.push_back^("minifi-system"^);
 	echo   }
-	echo };
+  	echo   return extensions;
+	echo }
 
 	echo } /* namespace minifi */
 	echo } /* namespace nifi */
 	echo } /* namespace apache */
 	echo } /* namespace org */
-
-	echo #endif /* AGENT_BUILD_H */
-) >> "%out_dir%/agent_version.h"
+) >> "%out_dir%/agent_version.cpp"
 
  goto :EOF
 
diff --git a/generateVersion.sh b/generateVersion.sh
index 1a667c4..2e00930 100755
--- a/generateVersion.sh
+++ b/generateVersion.sh
@@ -36,7 +36,7 @@
 
 extension_list="${extension_list} } "
 
-cat >"$out_dir/agent_version.h" <<EOF
+cat >"$out_dir/agent_version.cpp" <<EOF
 /**
  *
  * Licensed to the Apache Software Foundation (ASF) under one or more
@@ -54,48 +54,45 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#ifndef LIBMINIFI_INCLUDE_AGENT_AGENT_VERSION_H_
-#define LIBMINIFI_INCLUDE_AGENT_AGENT_VERSION_H_
 
+#include <string>
 #include <vector>
+#include "agent/agent_version.h"
 
 namespace org {
 namespace apache {
 namespace nifi {
 namespace minifi {
 
-class AgentBuild {
- public:
-  static constexpr const char* VERSION = "$version";
-  static constexpr const char* BUILD_IDENTIFIER = "$buildident";
-  static constexpr const char* BUILD_REV = "$buildrev";
-  static constexpr const char* BUILD_DATE = "$date";
-  static constexpr const char* COMPILER = "$compiler";
-  static constexpr const char* COMPILER_VERSION = "$compiler_version";
-  static constexpr const char* COMPILER_FLAGS = "$flags";
-  static std::vector<std::string> getExtensions() {
-    static std::vector<std::string> extensions;
-    if (extensions.empty()) {
+const char* const AgentBuild::VERSION = "$version";
+const char* const AgentBuild::BUILD_IDENTIFIER = "$buildident";
+const char* const AgentBuild::BUILD_REV = "$buildrev";
+const char* const AgentBuild::BUILD_DATE = "$date";
+const char* const AgentBuild::COMPILER = "$compiler";
+const char* const AgentBuild::COMPILER_VERSION = "$compiler_version";
+const char* const AgentBuild::COMPILER_FLAGS = "$flags";
+
+std::vector<std::string> AgentBuild::getExtensions() {
+  static std::vector<std::string> extensions;
+  if (extensions.empty()) {
 EOF
 
 for EXTENSION in "${extensions_array[@]}"
 do
-cat <<EOF >> "$out_dir/agent_version.h"
-      extensions.push_back("${EXTENSION}");
+cat <<EOF >> "$out_dir/agent_version.cpp"
+    extensions.push_back("${EXTENSION}");
 EOF
 done
 
-cat <<EOF >> "$out_dir/agent_version.h"
-      extensions.push_back("minifi-system");
-    }
-    return extensions;
+cat <<EOF >> "$out_dir/agent_version.cpp"
+    extensions.push_back("minifi-system");
   }
-};
+  return extensions;
+}
 
 }  // namespace minifi
 }  // namespace nifi
 }  // namespace apache
 }  // namespace org
 
-#endif  // LIBMINIFI_INCLUDE_AGENT_AGENT_VERSION_H_
 EOF
diff --git a/libminifi/CMakeLists.txt b/libminifi/CMakeLists.txt
index 5981711..dad1ab1 100644
--- a/libminifi/CMakeLists.txt
+++ b/libminifi/CMakeLists.txt
@@ -90,6 +90,8 @@
 endif()
 
 file(GLOB SOURCES  "src/utils/file/*.cpp" "src/sitetosite/*.cpp"  "src/core/logging/*.cpp"  "src/core/state/*.cpp" "src/core/state/nodes/*.cpp" "src/c2/protocols/*.cpp" "src/c2/triggers/*.cpp" "src/c2/*.cpp" "src/io/*.cpp" ${SOCKET_SOURCES} ${TLS_SOURCES} "src/core/controller/*.cpp" "src/controllers/*.cpp" "src/controllers/keyvalue/*.cpp" "src/core/*.cpp"  "src/core/repository/*.cpp" "src/core/yaml/*.cpp" "src/core/reporting/*.cpp"  "src/provenance/*.cpp" "src/utils/*.cpp" "src/*.cpp")
+# manually add this as it might not yet be present when this executes
+list(APPEND SOURCES "src/agent/agent_version.cpp")
 
 if(WIN32)
 	include(FindMessageCompiler)
diff --git a/libminifi/include/agent/CPPLINT.cfg b/libminifi/include/agent/CPPLINT.cfg
deleted file mode 100644
index 6d127a8..0000000
--- a/libminifi/include/agent/CPPLINT.cfg
+++ /dev/null
@@ -1 +0,0 @@
-exclude_files=agent_version.h
diff --git a/libminifi/include/agent/agent_version.h b/libminifi/include/agent/agent_version.h
new file mode 100644
index 0000000..d7a70a1
--- /dev/null
+++ b/libminifi/include/agent/agent_version.h
@@ -0,0 +1,46 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIBMINIFI_INCLUDE_AGENT_AGENT_VERSION_H_
+#define LIBMINIFI_INCLUDE_AGENT_AGENT_VERSION_H_
+
+#include <string>
+#include <vector>
+
+namespace org {
+namespace apache {
+namespace nifi {
+namespace minifi {
+
+class AgentBuild {
+ public:
+  static const char* const VERSION;
+  static const char* const BUILD_IDENTIFIER;
+  static const char* const BUILD_REV;
+  static const char* const BUILD_DATE;
+  static const char* const COMPILER;
+  static const char* const COMPILER_VERSION;
+  static const char* const COMPILER_FLAGS;
+  static std::vector<std::string> getExtensions();
+};
+
+}  // namespace minifi
+}  // namespace nifi
+}  // namespace apache
+}  // namespace org
+
+#endif  // LIBMINIFI_INCLUDE_AGENT_AGENT_VERSION_H_
diff --git a/libminifi/src/agent/CPPLINT.cfg b/libminifi/src/agent/CPPLINT.cfg
new file mode 100644
index 0000000..39231e4
--- /dev/null
+++ b/libminifi/src/agent/CPPLINT.cfg
@@ -0,0 +1 @@
+exclude_files=agent_version.cpp
diff --git a/win_build_vs.bat b/win_build_vs.bat
index 3099c1c..a2beefa 100644
--- a/win_build_vs.bat
+++ b/win_build_vs.bat
@@ -79,7 +79,7 @@
     IF !ERRORLEVEL! NEQ 0 ( popd & exit /b !ERRORLEVEL! )
 )
 if [%skiptests%] NEQ [ON] (
-    ctest --parallel 8 -C %cmake_build_type% --output-on-failure
+    ctest --timeout 300 --parallel 8 -C %cmake_build_type% --output-on-failure
     IF !ERRORLEVEL! NEQ 0 ( popd & exit /b !ERRORLEVEL! )
 )
 popd