This is an automated email from the ASF dual-hosted git repository.

szaszm pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git

commit 7f37f62f5ef86ed922959b25fb0096a2eac51020
Author: Martin Zink <martinz...@apache.org>
AuthorDate: Thu Mar 14 14:03:37 2024 +0100

    MINIFICPP-1797 Python bootstrap (part 1)
    
    Closes #1681
    
    Signed-off-by: Marton Szasz <sza...@apache.org>
---
 .github/workflows/ci.yml                           | 334 +++++++++++++++++----
 .github/workflows/gcc13-compat.yml                 |   2 +-
 .gitignore                                         |   1 +
 CMakeLists.txt                                     |  41 +--
 CMakeSettings.json                                 |  14 +-
 README.md                                          |  40 ++-
 Windows.md                                         |  29 +-
 bootstrap.sh                                       |  22 +-
 bootstrap/.gitignore                               |   3 +
 bootstrap/cli.py                                   | 154 ++++++++++
 bootstrap/cmake_parser.py                          |  74 +++++
 bootstrap/main.py                                  |  61 ++++
 bootstrap/minifi_option.py                         |  60 ++++
 bootstrap/package_manager.py                       | 318 ++++++++++++++++++++
 bootstrap/py_bootstrap.bat                         |  26 ++
 bootstrap/py_bootstrap.sh                          |  26 ++
 bootstrap/requirements.txt                         |   6 +
 bootstrap/system_dependency.py                     |  58 ++++
 bstrp_functions.sh                                 |   6 +-
 centos.sh                                          |   2 +-
 cmake/Abseil.cmake                                 |   1 +
 cmake/BuildTests.cmake                             |   2 +-
 cmake/BundledLibArchive.cmake                      |  18 +-
 cmake/BundledLibcURL.cmake                         |   6 +-
 cmake/MiNiFiOptions.cmake                          |  47 +--
 cmake/PahoMqttC.cmake                              |   4 +-
 cmake/prep_for_win_package.cmake                   |   1 +
 controller/CMakeLists.txt                          |   3 -
 extensions/civetweb/CMakeLists.txt                 |   2 +-
 extensions/civetweb/tests/CMakeLists.txt           |   2 +-
 extensions/coap/tests/CMakeLists.txt               |   2 +-
 extensions/expression-language/CMakeLists.txt      |   2 +-
 extensions/expression-language/Expression.cpp      |   6 +-
 .../expression-language/tests/CMakeLists.txt       |   4 +-
 .../tests/ExpressionLanguageTests.cpp              |   4 +-
 extensions/grafana-loki/CMakeLists.txt             |   6 +-
 .../grafana-loki/tests/PushGrafanaLokiRESTTest.cpp |   9 +
 extensions/http-curl/CMakeLists.txt                |   2 +-
 extensions/http-curl/tests/CMakeLists.txt          |   4 +-
 extensions/kubernetes/CMakeLists.txt               |   2 +-
 extensions/libarchive/CMakeLists.txt               |   4 +-
 extensions/openwsman/CMakeLists.txt                |   2 +-
 extensions/pcap/CMakeLists.txt                     |   8 +-
 extensions/rocksdb-repos/CMakeLists.txt            |   2 +-
 extensions/sftp/CMakeLists.txt                     |   2 +-
 extensions/sftp/tests/CMakeLists.txt               |   4 +-
 extensions/sql/tests/SQLTestController.h           |   2 +-
 extensions/sql/tests/SQLTestPlan.h                 |   2 +-
 .../standard-processors/tests/CMakeLists.txt       |   4 +-
 libminifi/CMakeLists.txt                           |   4 +-
 libminifi/test/flow-tests/CMakeLists.txt           |   2 +-
 libminifi/test/keyvalue-tests/CMakeLists.txt       |   4 +-
 nanofi/CMakeLists.txt                              |   2 +-
 run_shellcheck.sh                                  |   2 +-
 win_build_vs.bat                                   |   6 +-
 55 files changed, 1253 insertions(+), 201 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 97fbb76ed..faaf0ba1f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,7 +1,7 @@
 name: "MiNiFi-CPP CI"
 on: [push, pull_request, workflow_dispatch]
 env:
-  DOCKER_CMAKE_FLAGS: -DDOCKER_VERIFY_THREAD=3 -DUSE_SHARED_LIBS= 
-DSTRICT_GSL_CHECKS=AUDIT -DCI_BUILD=ON -DDISABLE_JEMALLOC=ON -DENABLE_AWS=ON 
-DENABLE_LIBRDKAFKA=ON -DENABLE_MQTT=ON -DENABLE_AZURE=ON -DENABLE_SQL=ON \
+  DOCKER_CMAKE_FLAGS: -DDOCKER_VERIFY_THREAD=3 -DUSE_SHARED_LIBS= 
-DSTRICT_GSL_CHECKS=AUDIT -DCI_BUILD=ON -DENABLE_AWS=ON -DENABLE_LIBRDKAFKA=ON 
-DENABLE_MQTT=ON -DENABLE_AZURE=ON -DENABLE_SQL=ON \
     -DENABLE_SPLUNK=ON -DENABLE_GCP=ON -DENABLE_OPC=ON 
-DENABLE_PYTHON_SCRIPTING=ON -DENABLE_LUA_SCRIPTING=ON -DENABLE_KUBERNETES=ON 
-DENABLE_TEST_PROCESSORS=ON -DENABLE_PROMETHEUS=ON \
     -DENABLE_ELASTICSEARCH=OFF -DENABLE_GRAFANA_LOKI=ON -DDOCKER_BUILD_ONLY=ON
   SCCACHE_GHA_ENABLE: true
@@ -11,6 +11,60 @@ jobs:
     name: "macos-xcode"
     runs-on: macos-13
     timeout-minutes: 180
+    env:
+      MACOS_MINIFI_OPTIONS: >-
+        -DCMAKE_BUILD_TYPE=Release
+        -DCI_BUILD=ON
+        -DCUSTOM_MALLOC=OFF
+        -DDOCKER_BUILD_ONLY=OFF
+        -DDOCKER_PUSH=OFF
+        -DDOCKER_SKIP_TESTS=ON
+        -DENABLE_ALL=OFF
+        -DENABLE_AWS=ON
+        -DENABLE_AZURE=ON
+        -DENABLE_BUSTACHE=OFF
+        -DENABLE_BZIP2=ON
+        -DENABLE_CIVET=ON
+        -DENABLE_COAP=OFF
+        -DENABLE_CONTROLLER=ON
+        -DENABLE_CURL=ON
+        -DENABLE_ELASTICSEARCH=ON
+        -DENABLE_ENCRYPT_CONFIG=ON
+        -DENABLE_EXPRESSION_LANGUAGE=ON
+        -DENABLE_GCP=ON
+        -DENABLE_GPS=OFF
+        -DENABLE_JNI=OFF
+        -DENABLE_KUBERNETES=ON
+        -DENABLE_LIBARCHIVE=ON
+        -DENABLE_LIBRDKAFKA=ON
+        -DENABLE_LUA_SCRIPTING=ON
+        -DENABLE_LZMA=ON
+        -DENABLE_MQTT=ON
+        -DENABLE_NANOFI=OFF
+        -DENABLE_OPC=ON
+        -DENABLE_OPENCV=ON
+        -DENABLE_OPENWSMAN=OFF
+        -DENABLE_OPS=ON
+        -DENABLE_PCAP=OFF
+        -DENABLE_PROMETHEUS=ON
+        -DENABLE_PYTHON_SCRIPTING=ON
+        -DENABLE_ROCKSDB=ON
+        -DENABLE_SENSORS=OFF
+        -DENABLE_SFTP=OFF
+        -DENABLE_SPLUNK=ON
+        -DENABLE_SQL=ON
+        -DENABLE_TEST_PROCESSORS=OFF
+        -DENABLE_USB_CAMERA=OFF
+        -DFORCE_COLORED_OUTPUT=OFF
+        -DLIBC_STATIC=OFF
+        -DMINIFI_ADVANCED_ASAN_BUILD=OFF
+        -DMINIFI_ADVANCED_CODE_COVERAGE=OFF
+        -DMINIFI_FAIL_ON_WARNINGS=OFF
+        -DMINIFI_OPENSSL=ON
+        -DMINIFI_USE_REAL_ODBC_TEST_DRIVER=ON
+        -DPORTABLE=ON
+        -DSKIP_TESTS=OFF
+        -DUSE_SHARED_LIBS=ON
     steps:
       - id: checkout
         uses: actions/checkout@v4
@@ -26,7 +80,7 @@ jobs:
         run: |
           # Skip brew update until 
https://github.com/actions/setup-python/issues/577 is fixed
           # brew update
-          HOMEBREW_NO_AUTO_UPDATE=1 brew install ossp-uuid flex lua ccache 
sqliteodbc automake autoconf ninja
+          HOMEBREW_NO_AUTO_UPDATE=1 brew install ossp-uuid bison flex lua 
ccache sqliteodbc automake autoconf ninja
       - id: setup_env
         name: setup enviroment
         run: |
@@ -36,11 +90,11 @@ jobs:
           echo -e "127.0.0.1\t$HOSTNAME" | sudo tee -a /etc/hosts > /dev/null
       - name: build
         run: |
-          export PATH="/usr/local/opt/flex/bin:$PATH"
-          export LDFLAGS="-L/usr/local/opt/flex/lib"
+          export PATH="/usr/local/opt/flex/bin:/usr/local/opt/bison/bin:$PATH"
+          export LDFLAGS="-L/usr/local/opt/flex/lib,-L/usr/local/opt/bison/lib"
           export CPPFLAGS="-I/usr/local/opt/flex/include"
-          # CPPFLAGS are not recognized by cmake, so we have to force them to 
CFLAGS and CXXFLAGS to have flex 2.6 working
-          ./bootstrap.sh -e -t && cd build  && cmake -G Ninja 
-DCMAKE_BUILD_TYPE=Release -DCI_BUILD=ON -DCMAKE_C_FLAGS="${CPPFLAGS} 
${CFLAGS}" -DCMAKE_CXX_FLAGS="${CPPFLAGS} ${CXXFLAGS}" 
-DENABLE_PYTHON_SCRIPTING=ON -DENABLE_LUA_SCRIPTING=ON -DENABLE_SQL=ON 
-DUSE_REAL_ODBC_TEST_DRIVER=ON -DENABLE_AZURE=ON -DENABLE_GCP=ON 
-DENABLE_OPENCV=ON -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_RULE_MESSAGES=OFF 
-DSTRICT_GSL_CHECKS=AUDIT -DFAIL_ON_WARNINGS=ON .. && cmake --build . 
--parallel 4
+          python -m venv venv && source venv/bin/activate && pip install -r 
requirements.txt && python main.py --noninteractive --skip-compiler-install 
--cmake-options="-DCMAKE_C_FLAGS=${CPPFLAGS} ${CFLAGS} 
-DCMAKE_CXX_FLAGS=${CPPFLAGS} ${CXXFLAGS}" 
--minifi-options="${MACOS_MINIFI_OPTIONS}"
+        working-directory: bootstrap
       - name: cache save
         uses: actions/cache/save@v4
         if: always()
@@ -52,9 +106,11 @@ jobs:
         run: |
           # Set core file size limit to unlimited
           ulimit -c unlimited
-          cd build && ctest -j4 --output-on-failure --timeout 300
+          ctest -j4 --output-on-failure --timeout 300
+        working-directory: build
       - name: linter
-        run: cd build && ninja linter
+        run: ninja linter
+        working-directory: build
       - name: check-cores
         if: ${{ failure() && steps.test.conclusion == 'failure' }}
         run: |
@@ -75,12 +131,72 @@ jobs:
     timeout-minutes: 240
     env:
       LUA_DIR: D:\a\nifi-minifi-cpp\nifi-minifi-cpp\.lua
+      WINDOWS_MINIFI_OPTIONS: >-
+        -DCMAKE_BUILD_TYPE=Release
+        -DBUILD_ROCKSDB=ON
+        -DBUILD_SHARED_LIBS=OFF
+        -DCI_BUILD=ON
+        -DCUSTOM_MALLOC=OFF
+        -DDOCKER_BUILD_ONLY=OFF
+        -DDOCKER_PUSH=OFF
+        -DDOCKER_SKIP_TESTS=ON
+        -DENABLE_ALL=OFF
+        -DENABLE_AWS=ON
+        -DENABLE_AZURE=ON
+        -DENABLE_BUSTACHE=OFF
+        -DENABLE_BZIP2=ON
+        -DENABLE_CIVET=ON
+        -DENABLE_COAP=OFF
+        -DENABLE_CONTROLLER=ON
+        -DENABLE_COVERAGE=
+        -DENABLE_CURL=ON
+        -DENABLE_ELASTICSEARCH=ON
+        -DENABLE_ENCRYPT_CONFIG=ON
+        -DENABLE_EXPRESSION_LANGUAGE=ON
+        -DENABLE_GCP=ON
+        -DENABLE_GPS=OFF
+        -DENABLE_GRAFANA_LOKI=ON
+        -DENABLE_JNI=OFF
+        -DENABLE_KUBERNETES=ON
+        -DENABLE_LIBARCHIVE=ON
+        -DENABLE_LIBRDKAFKA=ON
+        -DENABLE_LUA_SCRIPTING=OFF
+        -DENABLE_LZMA=ON
+        -DENABLE_MQTT=ON
+        -DENABLE_NANOFI=ON
+        -DENABLE_OPC=ON
+        -DENABLE_OPENCV=OFF
+        -DENABLE_OPENWSMAN=OFF
+        -DENABLE_OPS=ON
+        -DENABLE_PCAP=OFF
+        -DENABLE_PDH=ON
+        -DENABLE_PROMETHEUS=ON
+        -DENABLE_PYTHON_SCRIPTING=ON
+        -DENABLE_ROCKSDB=ON
+        -DENABLE_SENSORS=OFF
+        -DENABLE_SFTP=OFF
+        -DENABLE_SMB=ON
+        -DENABLE_SPLUNK=ON
+        -DENABLE_SQL=ON
+        -DENABLE_TEST_PROCESSORS=OFF
+        -DENABLE_USB_CAMERA=OFF
+        -DENABLE_WEL=ON
+        -DFORCE_COLORED_OUTPUT=ON
+        -DINSTALLER_MERGE_MODULES=OFF
+        -DMINIFI_FAIL_ON_WARNINGS=OFF
+        -DMINIFI_OPENSSL=ON
+        -DMSI_REDISTRIBUTE_UCRT_NONASL=OFF
+        -DPORTABLE=ON
+        -DSKIP_TESTS=OFF
+        -DSTATIC_BUILD=ON
+        -DMINIFI_USE_REAL_ODBC_TEST_DRIVER=ON
+        -DUSE_SHARED_LIBS=OFF
     steps:
       - name: Support longpaths
         run: git config --system core.longpaths true
-      - id: checkout
+      - name: Checkout project
         uses: actions/checkout@v4
-      - name: sccache cache restore
+      - name: Restore cache
         uses: actions/cache/restore@v4
         with:
           path: ~/AppData/Local/Mozilla/sccache/cache
@@ -91,49 +207,100 @@ jobs:
             ${{ runner.os }}-2022-sccache
       - name: Run sccache-cache
         uses: mozilla-actions/sccache-action@v0.0.4
-      - name: Install ninja-build tool
-        uses: seanmiddleditch/gha-setup-ninja@v4
       - name: Set up Python
-        uses: actions/setup-python@v5
-        with:
-          python-version: '3.11'
-      - name: Set up Lua
-        uses: xpol/setup-lua@v0.3
-      - name: Set up NASM for OpenSSL
-        uses: ilammy/setup-nasm@v1
-      - id: install-sqliteodbc-driver
+        run: choco -y install python & refreshenv
+        shell: cmd
+      - name: Install sqliteodbc driver
         run: |
           Invoke-WebRequest -Uri 
"http://www.ch-werner.de/sqliteodbc/sqliteodbc_w64.exe"; -OutFile 
"sqliteodbc_w64.exe"
           if ((Get-FileHash 'sqliteodbc_w64.exe').Hash -ne 
"a4804e4f54f42c721df1323c5fcac101a8c7a577e7f20979227324ceab572d51") {Write 
"Hash mismatch"; Exit 1}
           Start-Process -FilePath ".\sqliteodbc_w64.exe" -ArgumentList "/S" 
-Wait
         shell: powershell
-      - id: remove-strawberry-perl-tool-executables
-        run: |
-          # Remove conflicting Strawberry Perl executables like patch.exe and 
cmcldeps.exe (More information in the note under System Requirements in 
README.md)
-          Remove-Item -Path "C:\Strawberry\c\bin" -Recurse -Force
-        shell: pwsh
+      - name: Add sccache to path
+        run: '[Environment]::SetEnvironmentVariable("PATH", 
[Environment]::GetEnvironmentVariable("PATH", 
[EnvironmentVariableTarget]::Machine) + 
";C:\hostedtoolcache\windows\sccache\0.7.7\x64\", 
[EnvironmentVariableTarget]::Machine);'
+        shell: powershell
       - name: build
         run: |
-          for /f "usebackq delims=" %%i in (`vswhere.exe -latest -property 
installationPath`) do if exist "%%i\Common7\Tools\vsdevcmd.bat" call 
"%%i\Common7\Tools\vsdevcmd.bat" -arch=x64 -host_arch=x64
-          win_build_vs.bat ..\b /64 /CI /PDH /R /N /LOKI /RO /SCCACHE /NINJA
-          sccache --show-stats
+          python -m venv venv & venv\Scripts\activate & pip install -r 
requirements.txt & python main.py --noninteractive --skip-compiler-install 
--minifi-options="%WINDOWS_MINIFI_OPTIONS%" 
--cmake-options="-DCMAKE_C_COMPILER_LAUNCHER=sccache 
-DCMAKE_CXX_COMPILER_LAUNCHER=sccache"
         shell: cmd
-      - name: sccache cache save
+        working-directory: bootstrap
+      - name: Save cache
         uses: actions/cache/save@v4
         if: always()
         with:
           path: ~/AppData/Local/Mozilla/sccache/cache
           key: ${{ runner.os }}-2022-sccache-${{ github.ref }}-${{ github.sha 
}}
-      - name: test
-        run: cd ..\b && ctest --timeout 300 --parallel %NUMBER_OF_PROCESSORS% 
-C Release --output-on-failure
+      - name: Run tests
+        run: ctest --timeout 300 --parallel %NUMBER_OF_PROCESSORS% -C Release 
--output-on-failure
         shell: cmd
-      - name: linter
-        run: cd ..\b && cmake --build . --target linter --config Release -j 8
+        working-directory: ./build
+      - name: Run linter
+        run: cmake --build . --target linter --config Release -j 8
         shell: cmd
+        working-directory: ./build
+      - name: Upload artifact
+        if: failure()
+        uses: actions/upload-artifact@v3
+        with:
+          name: cpack_error
+          path: 
D:/a/nifi-minifi-cpp/nifi-minifi-cpp/build/_CPack_Packages/win64/WIX/wix.log
   ubuntu_20_04:
     name: "ubuntu-20.04"
     runs-on: ubuntu-20.04
     timeout-minutes: 120
+    env:
+      UBUNTU_GCC_MINIFI_OPTIONS: >-
+        -DCMAKE_BUILD_TYPE=Release
+        -DCI_BUILD=OFF
+        -DCUSTOM_MALLOC=OFF
+        -DDOCKER_BUILD_ONLY=OFF
+        -DDOCKER_PUSH=OFF
+        -DDOCKER_SKIP_TESTS=ON
+        -DENABLE_ALL=OFF
+        -DENABLE_AWS=OFF
+        -DENABLE_AZURE=OFF
+        -DENABLE_BUSTACHE=ON
+        -DENABLE_BZIP2=ON
+        -DENABLE_CIVET=ON
+        -DENABLE_COAP=OFF
+        -DENABLE_CONTROLLER=ON
+        -DENABLE_CURL=ON
+        -DENABLE_ELASTICSEARCH=OFF
+        -DENABLE_ENCRYPT_CONFIG=ON
+        -DENABLE_EXPRESSION_LANGUAGE=ON
+        -DENABLE_GCP=OFF
+        -DENABLE_GPS=OFF
+        -DENABLE_JNI=ON
+        -DENABLE_KUBERNETES=OFF
+        -DENABLE_LIBARCHIVE=ON
+        -DENABLE_LIBRDKAFKA=OFF
+        -DENABLE_LUA_SCRIPTING=OFF
+        -DENABLE_LZMA=ON
+        -DENABLE_MQTT=OFF
+        -DENABLE_NANOFI=OFF
+        -DENABLE_OPC=OFF
+        -DENABLE_OPENCV=OFF
+        -DENABLE_OPENWSMAN=OFF
+        -DENABLE_OPS=ON
+        -DENABLE_PCAP=ON
+        -DENABLE_PROCFS=OFF
+        -DENABLE_PROMETHEUS=ON
+        -DENABLE_PYTHON_SCRIPTING=OFF
+        -DENABLE_ROCKSDB=ON
+        -DENABLE_SENSORS=OFF
+        -DENABLE_SFTP=ON
+        -DENABLE_SPLUNK=OFF
+        -DENABLE_SQL=OFF
+        -DENABLE_SYSTEMD=ON
+        -DENABLE_TEST_PROCESSORS=OFF
+        -DENABLE_USB_CAMERA=OFF
+        -DFORCE_COLORED_OUTPUT=ON
+        -DMINIFI_FAIL_ON_WARNINGS=ON
+        -DMINIFI_OPENSSL=ON
+        -DPORTABLE=ON
+        -DSKIP_TESTS=OFF
+        -DMINIFI_USE_REAL_ODBC_TEST_DRIVER=OFF
+        -DUSE_SHARED_LIBS=ON
     steps:
       - id: checkout
         uses: actions/checkout@v4
@@ -148,19 +315,15 @@ jobs:
       - id: install_deps
         run: |
           sudo apt update
-          sudo apt install -y ccache libfl-dev libpcap-dev
+          sudo apt install -y ccache libfl-dev libpcap-dev python3 python3-venv
           echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV
           echo -e "127.0.0.1\t$HOSTNAME" | sudo tee -a /etc/hosts > /dev/null
       - name: build
         run: |
-          export CC=gcc-11
-          export CXX=g++-11
-          ./bootstrap.sh -e -t
-          cd build
-          cmake -DUSE_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release -DCI_BUILD=ON 
-DSTRICT_GSL_CHECKS=AUDIT -DFAIL_ON_WARNINGS=ON -DENABLE_SQL=OFF 
-DENABLE_LIBRDKAFKA=OFF -DENABLE_AWS=OFF \
-              -DENABLE_AZURE=OFF -DENABLE_SPLUNK=OFF -DENABLE_GCP=OFF 
-DENABLE_PROCFS=OFF -DENABLE_BUSTACHE=ON -DENABLE_PCAP=ON -DENABLE_JNI=ON 
-DENABLE_SFTP=ON  \
-              -DENABLE_LUA_SCRIPTING=OFF -DENABLE_PYTHON_SCRIPTING=OFF 
-DENABLE_MQTT=OFF -DENABLE_ELASTICSEARCH=OFF -DENABLE_KUBERNETES=OFF 
-DENABLE_OPC=OFF ..
-          make -j$(nproc) VERBOSE=1
+          python3 -m venv venv && source venv/bin/activate \
+            && pip install -r requirements.txt \
+            && python main.py --noninteractive 
--minifi-options="${UBUNTU_GCC_MINIFI_OPTIONS}" 
--cmake-options="-DSTRICT_GSL_CHECKS=AUDIT"
+        working-directory: bootstrap
       - name: cache save
         uses: actions/cache/save@v4
         if: always()
@@ -172,7 +335,8 @@ jobs:
         run: |
           # Set core file size limit to unlimited
           ulimit -c unlimited
-          cd build && make test ARGS="--timeout 300 -j8 --output-on-failure"
+          ctest -j$(nproc) --output-on-failure
+        working-directory: build
       - name: check-cores
         if: ${{ failure() && steps.test.conclusion == 'failure' }}
         run: |
@@ -191,6 +355,60 @@ jobs:
     name: "ubuntu-22.04-clang"
     runs-on: ubuntu-22.04
     timeout-minutes: 240
+    env:
+      UBUNTU_CLANG_MINIFI_OPTIONS: >-
+        -DCMAKE_BUILD_TYPE=RelWithDebInfo
+        -DCI_BUILD=OFF
+        -DCUSTOM_MALLOC=OFF
+        -DDOCKER_BUILD_ONLY=OFF
+        -DDOCKER_PUSH=OFF
+        -DDOCKER_SKIP_TESTS=ON
+        -DENABLE_ALL=OFF
+        -DENABLE_AWS=ON
+        -DENABLE_AZURE=ON
+        -DENABLE_BUSTACHE=ON
+        -DENABLE_BZIP2=ON
+        -DENABLE_CIVET=ON
+        -DENABLE_COAP=ON
+        -DENABLE_CONTROLLER=ON
+        -DENABLE_CURL=ON
+        -DENABLE_ELASTICSEARCH=ON
+        -DENABLE_ENCRYPT_CONFIG=ON
+        -DENABLE_EXPRESSION_LANGUAGE=ON
+        -DENABLE_GCP=ON
+        -DENABLE_GPS=ON
+        -DENABLE_GRAFANA_LOKI=ON
+        -DENABLE_JNI=OFF
+        -DENABLE_KUBERNETES=ON
+        -DENABLE_LIBARCHIVE=ON
+        -DENABLE_LIBRDKAFKA=ON
+        -DENABLE_LUA_SCRIPTING=ON
+        -DENABLE_LZMA=ON
+        -DENABLE_MQTT=ON
+        -DENABLE_NANOFI=ON
+        -DENABLE_OPC=ON
+        -DENABLE_OPENCV=ON
+        -DENABLE_OPENWSMAN=ON
+        -DENABLE_OPS=ON
+        -DENABLE_PCAP=ON
+        -DENABLE_PROCFS=ON
+        -DENABLE_PROMETHEUS=ON
+        -DENABLE_PYTHON_SCRIPTING=ON
+        -DENABLE_ROCKSDB=ON
+        -DENABLE_SENSORS=ON
+        -DENABLE_SFTP=ON
+        -DENABLE_SPLUNK=ON
+        -DENABLE_SQL=ON
+        -DENABLE_SYSTEMD=ON
+        -DENABLE_TEST_PROCESSORS=OFF
+        -DENABLE_USB_CAMERA=ON
+        -DFORCE_COLORED_OUTPUT=ON
+        -DMINIFI_FAIL_ON_WARNINGS=ON
+        -DMINIFI_OPENSSL=ON
+        -DPORTABLE=ON
+        -DSKIP_TESTS=OFF
+        -DMINIFI_USE_REAL_ODBC_TEST_DRIVER=OFF
+        -DUSE_SHARED_LIBS=ON
     steps:
       - id: checkout
         uses: actions/checkout@v4
@@ -225,18 +443,10 @@ jobs:
           sudo rm -rf "$AGENT_TOOLSDIRECTORY"
       - name: build
         run: |
-          export CC=clang-16
-          export CXX=clang++-16
-          ./bootstrap.sh -e -t
-          cd build
-          export CXXFLAGS="${CXXFLAGS} -stdlib=libc++"
-          export LDFLAGS="${LDFLAGS} -stdlib=libc++"
-          cmake -DUSE_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo 
-DCI_BUILD=ON -DSTRICT_GSL_CHECKS=AUDIT -DFAIL_ON_WARNINGS=ON -DENABLE_AWS=ON 
-DENABLE_AZURE=ON -DENABLE_BUSTACHE=ON -DENABLE_COAP=ON \
-              -DENABLE_ENCRYPT_CONFIG=ON -DENABLE_GPS=ON 
-DENABLE_LIBRDKAFKA=ON -DENABLE_MQTT=ON -DENABLE_NANOFI=ON -DENABLE_OPC=ON 
-DENABLE_OPENCV=ON \
-              -DENABLE_OPENWSMAN=ON -DENABLE_OPS=ON -DENABLE_PCAP=ON 
-DENABLE_SENSORS=ON -DENABLE_SFTP=ON -DENABLE_SQL=ON -DENABLE_SYSTEMD=ON \
-              -DENABLE_USB_CAMERA=ON -DENABLE_PYTHON_SCRIPTING=ON 
-DENABLE_LUA_SCRIPTING=ON -DENABLE_KUBERNETES=ON -DENABLE_GCP=ON 
-DENABLE_PROCFS=ON -DENABLE_PROMETHEUS=ON -DENABLE_ELASTICSEARCH=ON \
-              -DENABLE_GRAFANA_LOKI=ON -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
-          cmake --build . --parallel $(nproc)
+          python3 -m venv venv && source venv/bin/activate \
+            && pip install -r requirements.txt \
+            && python main.py --noninteractive --skip-compiler-install 
--cmake-options="-DCMAKE_C_COMPILER=clang-16 -DCMAKE_CXX_COMPILER=clang++-16 
-DSTRICT_GSL_CHECKS=AUDIT -DCMAKE_EXPORT_COMPILE_COMMANDS=ON" 
--minifi-options="${UBUNTU_CLANG_MINIFI_OPTIONS}"
+        working-directory: bootstrap
       - id: cache_save
         uses: actions/cache/save@v4
         if: always()
@@ -248,13 +458,17 @@ jobs:
         run: |
           # Set core file size limit to unlimited
           ulimit -c unlimited
-          cd build && make test ARGS="--timeout 300 -j8 --output-on-failure"
+          ctest -j$(nproc) --output-on-failure
+        working-directory: build
       - name: linter
-        run: cd build && make -j$(nproc) linter
+        run: cmake --build . --target linter
+        working-directory: ./build
       - name: shellcheck
-        run: cd build && make shellcheck
+        run: cmake --build . --target shellcheck
+        working-directory: ./build
       - id: flake8_check
-        run: cd build && make flake8
+        run: cmake --build . --target flake8
+        working-directory: ./build
       - id: files
         uses: Ana06/get-changed-files@v2.3.0
         continue-on-error: true
@@ -321,7 +535,7 @@ jobs:
       - id: build
         run: |
           # centos build can run out of the github runners' disk space if 
built with RelWithDebInfo so we keep the Release build here
-          mkdir build && cd build && cmake -DUSE_SHARED_LIBS=ON -DCI_BUILD=ON 
-DCMAKE_BUILD_TYPE=Release -DSTRICT_GSL_CHECKS=AUDIT -DFAIL_ON_WARNINGS=ON 
-DENABLE_AWS=ON -DENABLE_AZURE=ON \
+          mkdir build && cd build && cmake -DUSE_SHARED_LIBS=ON -DCI_BUILD=ON 
-DCMAKE_BUILD_TYPE=Release -DSTRICT_GSL_CHECKS=AUDIT 
-DMINIFI_FAIL_ON_WARNINGS=ON -DENABLE_AWS=ON -DENABLE_AZURE=ON \
               -DENABLE_COAP=ON -DENABLE_ENCRYPT_CONFIG=ON -DENABLE_GPS=ON 
-DENABLE_LIBRDKAFKA=ON -DENABLE_MQTT=ON -DENABLE_NANOFI=ON -DENABLE_OPC=ON \
               -DENABLE_OPENCV=ON -DENABLE_OPENWSMAN=ON -DENABLE_OPS=ON 
-DENABLE_SENSORS=ON -DENABLE_SQL=ON -DENABLE_SYSTEMD=ON \
               -DENABLE_USB_CAMERA=ON -DENABLE_PYTHON_SCRIPTING=ON 
-DENABLE_LUA_SCRIPTING=ON -DENABLE_KUBERNETES=ON -DENABLE_GCP=ON 
-DENABLE_PROCFS=ON -DENABLE_PROMETHEUS=ON \
diff --git a/.github/workflows/gcc13-compat.yml 
b/.github/workflows/gcc13-compat.yml
index af9735fb9..baa06f5b9 100644
--- a/.github/workflows/gcc13-compat.yml
+++ b/.github/workflows/gcc13-compat.yml
@@ -31,7 +31,7 @@ jobs:
           export CXX=g++-13
           ./bootstrap.sh -e -t
           cd build
-          cmake -DUSE_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release -DCI_BUILD=ON 
-DSTRICT_GSL_CHECKS=AUDIT -DFAIL_ON_WARNINGS=ON -DENABLE_ALL=ON ..
+          cmake -DUSE_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release -DCI_BUILD=ON 
-DSTRICT_GSL_CHECKS=AUDIT -DMINIFI_FAIL_ON_WARNINGS=ON -DENABLE_ALL=ON ..
           make -j$(nproc) VERBOSE=1
       - name: test
         id: test
diff --git a/.gitignore b/.gitignore
index 38cd99d85..ff879f82d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -48,6 +48,7 @@ cmake-build-debug
 *flowfile_checkpoint
 build
 /*build*
+!win_build_vs.bat
 bt_state
 target
 thirdparty/**/*.o
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 99a3f3665..29d0e86b4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -75,8 +75,8 @@ if (${FORCE_COLORED_OUTPUT})
     endif()
 endif()
 
-if (USE_REAL_ODBC_TEST_DRIVER)
-    add_definitions("-DUSE_REAL_ODBC_TEST_DRIVER")
+if (MINIFI_USE_REAL_ODBC_TEST_DRIVER)
+    add_definitions("-DMINIFI_USE_REAL_ODBC_TEST_DRIVER")
 endif()
 
 # Use ccache if present
@@ -87,15 +87,6 @@ if(CCACHE_FOUND)
     message("-- Found ccache: ${CCACHE_FOUND}")
 endif(CCACHE_FOUND)
 
-# Use gold linker if instructed
-if (UNIX AND USE_GOLD_LINKER AND NOT APPLE )
-    execute_process(COMMAND ${CMAKE_C_COMPILER} -fuse-ld=gold -Wl,--version 
ERROR_QUIET OUTPUT_VARIABLE ld_version)
-    if ("${ld_version}" MATCHES "GNU gold")
-        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold 
-Wl,--disable-new-dtags")
-        set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} 
-fuse-ld=gold -Wl,--disable-new-dtags")
-    endif()
-endif()
-
 # Check for exec info before we enable the backtrace features.
 CHECK_INCLUDE_FILE("execinfo.h" HAS_EXECINFO)
 if (ENABLE_OPS AND HAS_EXECINFO AND NOT WIN32)
@@ -137,7 +128,7 @@ message("THREADS_HAVE_PTHREAD_ARG is 
${THREADS_HAVE_PTHREAD_ARG}")
 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
 
 # Use ASAN if instructed
-if (ASAN_BUILD)
+if (MINIFI_ADVANCED_ASAN_BUILD)
     set(ASAN_FLAGS "-g -fsanitize=address -fsanitize-address-use-after-scope 
-fno-omit-frame-pointer")
     set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ASAN_FLAGS}")
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ASAN_FLAGS}")
@@ -145,7 +136,7 @@ if (ASAN_BUILD)
     set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${ASAN_FLAGS}")
 endif()
 
-if (ENABLE_COVERAGE)
+if (MINIFI_ADVANCED_CODE_COVERAGE)
     include(CodeCoverage)
     append_coverage_compiler_flags()
 endif()
@@ -222,7 +213,7 @@ else()
     message(VERBOSE "No custom malloc implementation")
 endif()
 
-if (NOT DISABLE_BZIP2 AND (NOT DISABLE_LIBARCHIVE OR (NOT DISABLE_ROCKSDB AND 
NOT WIN32)))
+if (ENABLE_BZIP2 AND (ENABLE_LIBARCHIVE OR (ENABLE_ROCKSDB AND NOT WIN32)))
     include(BundledBZip2)
     use_bundled_bzip2(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR})
     list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/bzip2/dummy")
@@ -246,7 +237,7 @@ if(NOT WIN32)
 endif()
 
 # OpenSSL
-if (NOT OPENSSL_OFF)
+if (MINIFI_OPENSSL)
     include(BundledOpenSSL)
     use_openssl("${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}")
     list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/ssl")
@@ -269,12 +260,11 @@ add_library(ut INTERFACE)
 target_include_directories(ut SYSTEM INTERFACE 
"${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/ut")
 
 # cURL
-if(NOT DISABLE_CURL)
+if(ENABLE_CURL)
     include(BundledLibcURL)
     use_bundled_curl(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
     list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/curl/dummy")
-else()
-    list(APPEND MINIFI_CPP_COMPILE_DEFINITIONS DISABLE_CURL)
+    list(APPEND MINIFI_CPP_COMPILE_DEFINITIONS ENABLE_CURL)
 endif()
 
 # spdlog
@@ -325,12 +315,12 @@ include(MagicEnum)
 # Setup warning flags
 if(MSVC)
     list(APPEND MINIFI_CPP_COMPILE_OPTIONS /W3)
-    if(FAIL_ON_WARNINGS)
+    if(MINIFI_FAIL_ON_WARNINGS)
         list(APPEND MINIFI_CPP_COMPILE_OPTIONS /WX)
     endif()
 else()
     list(APPEND MINIFI_CPP_COMPILE_OPTIONS -Wall -Wextra)
-    if(FAIL_ON_WARNINGS)
+    if(MINIFI_FAIL_ON_WARNINGS)
         list(APPEND MINIFI_CPP_COMPILE_OPTIONS -Werror)
         # -Wrestrict may cause build failure in GCC 12  
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104336
         if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
@@ -357,13 +347,13 @@ include(Extensions)
 
 add_subdirectory(libminifi)
 
-if ((ENABLE_OPENWSMAN AND NOT DISABLE_CIVET AND NOT DISABLE_CURL) OR 
ENABLE_ALL OR ENABLE_AZURE)
+if ((ENABLE_OPENWSMAN AND ENABLE_CIVET AND ENABLE_CURL) OR ENABLE_ALL OR 
ENABLE_AZURE)
     include(BundledLibXml2)
     use_bundled_libxml2(${CMAKE_CURRENT_SOURCE_DIR} 
${CMAKE_CURRENT_BINARY_DIR})
     list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/libxml2/dummy")
 endif()
 
-if (ENABLE_ALL OR ENABLE_PROMETHEUS OR NOT DISABLE_CIVET)
+if (ENABLE_ALL OR ENABLE_PROMETHEUS OR ENABLE_CIVET)
     include(CivetWeb)
     list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/civetweb/dummy")
 endif()
@@ -387,7 +377,7 @@ if (ENABLE_ENCRYPT_CONFIG)
     add_subdirectory(encrypt-config)
 endif()
 
-if (NOT DISABLE_CURL AND ENABLE_CONTROLLER)
+if (ENABLE_CURL AND ENABLE_CONTROLLER)
     add_subdirectory(controller)
 endif()
 
@@ -428,6 +418,7 @@ endif()
 # Generate source assembly
 set(ASSEMBLY_BASE_NAME 
"${CMAKE_PROJECT_NAME}-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
 if(WIN32)
+    set(CPACK_PRE_BUILD_SCRIPTS 
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/prep_for_win_package.cmake")
     set(CPACK_ALL_INSTALL_TYPES Full Developer)
     set(CPACK_COMPONENT_LIBRARIES_INSTALL_TYPES Developer Full)
     set(CPACK_COMPONENT_HEADERS_INSTALL_TYPES Developer Full)
@@ -653,7 +644,7 @@ registerTest("${TEST_DIR}/flow-tests")
 
 registerTest("${TEST_DIR}/schema-tests")
 
-if (NOT DISABLE_ROCKSDB AND NOT DISABLE_LIBARCHIVE)
+if (ENABLE_ROCKSDB AND ENABLE_LIBARCHIVE)
     registerTest("${TEST_DIR}/persistence-tests")
 endif()
 
@@ -707,7 +698,7 @@ add_custom_target(
 
 feature_summary(WHAT ALL FILENAME ${CMAKE_BINARY_DIR}/all.log)
 
-if (ENABLE_COVERAGE)
+if (MINIFI_ADVANCED_CODE_COVERAGE)
     set(GCOVR_ADDITIONAL_ARGS --gcov-ignore-parse-errors=negative_hits.warn 
--gcov-ignore-errors=no_working_dir_found)
     setup_target_for_coverage_gcovr_html(
         NAME coverage
diff --git a/CMakeSettings.json b/CMakeSettings.json
index 68c3cb4a8..bc7f19a9a 100644
--- a/CMakeSettings.json
+++ b/CMakeSettings.json
@@ -36,8 +36,8 @@
           "value": "OFF"
         },
         {
-          "name": "OPENSSL_OFF",
-          "value": "OFF"
+          "name": "MINIFI_OPENSSL",
+          "value": "ON"
         },
         {
           "name": "ENABLE_COAP",
@@ -55,17 +55,13 @@
           "name": "BUILD_ROCKSDB",
           "value": "ON"
         },
-        {
-          "name": "FORCE_WINDOWS",
-          "value": "ON"
-        },
         {
           "name": "USE_SYSTEM_UUID",
           "value": "OFF"
         },
         {
-          "name": "DISABLE_LIBARCHIVE",
-          "value": "OFF"
+          "name": "ENABLE_LIBARCHIVE",
+          "value": "ON"
         },
         {
           "name": "ENABLE_PYTHON_SCRIPTING",
@@ -76,7 +72,7 @@
           "value": "TRUE"
         },
         {
-          "name": "FAIL_ON_WARNINGS",
+          "name": "MINIFI_FAIL_ON_WARNINGS",
           "value": "OFF"
         },
         {
diff --git a/README.md b/README.md
index 449591457..135c5096d 100644
--- a/README.md
+++ b/README.md
@@ -77,8 +77,8 @@ Through JNI extensions you can run NiFi processors using 
NARs. The JNI extension
 | Archive Extensions          | 
[ApplyTemplate](PROCESSORS.md#applytemplate)<br/>[BinFiles](PROCESSORS.md#binfiles)<br/>[CompressContent](PROCESSORS.md#compresscontent)<br/>[ManipulateArchive](PROCESSORS.md#manipulatearchive)<br/>[MergeContent](PROCESSORS.md#mergecontent)<br/>[FocusArchiveEntry](PROCESSORS.md#focusarchiveentry)<br/>[UnfocusArchiveEntry](PROCESSORS.md#unfocusarchiveentry)
                                                                                
                       [...]
 | AWS                         | 
[AWSCredentialsService](CONTROLLERS.md#awscredentialsservice)<br/>[PutS3Object](PROCESSORS.md#puts3object)<br/>[DeleteS3Object](PROCESSORS.md#deletes3object)<br/>[FetchS3Object](PROCESSORS.md#fetchs3object)<br/>[ListS3](PROCESSORS.md#lists3)
                                                                                
                                                                                
                                                            [...]
 | Azure                       | 
[AzureStorageCredentialsService](CONTROLLERS.md#azurestoragecredentialsservice)<br/>[PutAzureBlobStorage](PROCESSORS.md#putazureblobstorage)<br/>[DeleteAzureBlobStorage](PROCESSORS.md#deleteazureblobstorage)<br/>[FetchAzureBlobStorage](PROCESSORS.md#fetchazureblobstorage)<br/>[ListAzureBlobStorage](PROCESSORS.md#listazureblobstorage)<br/>[PutAzureDataLakeStorage](PROCESSORS.md#putazuredatalakestorage)<br/>[DeleteAzureDataLakeStorage](PROCESSORS.md#deleteaz
 [...]
-| CivetWeb                    | [ListenHTTP](PROCESSORS.md#listenhttp)         
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
              [...]
-| CURL                        | [InvokeHTTP](PROCESSORS.md#invokehttp)         
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
              [...]
+| CivetWeb                    | [ListenHTTP](PROCESSORS.md#listenhttp)         
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
              [...]
+| CURL                        | [InvokeHTTP](PROCESSORS.md#invokehttp)         
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
              [...]
 | Elasticsearch               | 
[ElasticsearchCredentialsControllerService](CONTROLLERS.md#elasticsearchcredentialscontrollerservice)<br/>[PostElasticsearch](PROCESSORS.md#postelasticsearch)
                                                                                
                                                                                
                                                                                
                                                               [...]
 | GPS (Linux and macOS)       | [GetGPS](PROCESSORS.md#getgps)                 
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
              [...]
 | Google Cloud Platform       | 
[DeleteGCSObject](PROCESSORS.md#deletegcsobject)<br>[FetchGCSObject](PROCESSORS.md#fetchgcsobject)<br>[GCPCredentialsControllerService](CONTROLLERS.md#gcpcredentialscontrollerservice)<br>[ListGCSBucket](PROCESSORS.md#listgcsbucket)<br>[PutGCSObject](PROCESSORS.md#putgcsobject)
                                                                                
                                                                                
                        [...]
@@ -305,8 +305,40 @@ sudo brew install libpcap
 
 ### Bootstrapping
 
-- MiNiFi C++ offers a bootstrap script in the root of our github repo that 
will bootstrap the cmake and build process for you without the need to install 
dependencies yourself. To use this
-  process, please run the command `bootstrap.sh` from the root of the MiNiFi 
C++ source tree.
+MiNiFi C++ offers bootstrap scripts that will bootstrap the cmake and build 
process for you without the need to install dependencies yourself.
+
+#### Python based bootstrapping (recommended)
+##### Linux
+Prerequisites:
+- [python](https://docs.python.org/)
+- [venv](https://docs.python.org/3/library/venv.html)
+
+```bash
+./bootstrap/py_bootstrap.sh
+```
+
+#### macOS
+Prerequisites:
+- [python](https://docs.python.org/)
+- [venv](https://docs.python.org/3/library/venv.html)
+- [Homebrew](https://brew.sh/)
+```bash
+./bootstrap/py_bootstrap.sh
+```
+
+#### Windows
+Prerequisites:
+- [python](https://docs.python.org/)
+- [venv](https://docs.python.org/3/library/venv.html)
+- [chocolatey](https://chocolatey.org/)
+```dos
+.\bootstrap\py_bootstrap.bat
+```
+
+This will set up a virtual environment in the bootstrap folder, and guide you 
through the build process.
+
+#### Shell based bootstrapping (linux and macOS)
+- Please run the command `bootstrap.sh` from the root of the MiNiFi C++ source 
tree.
 
 - Per the table, below, you will be presented with a menu guided bootstrap 
process. You may enable and disable extensions ( further defined below ). Once 
you are finished selecting the features
   you wish to build, enter P to continue with the process. CMAKE dependencies 
will be resolved for your distro. You may enter command line options -n to 
force yes to all prompts
diff --git a/Windows.md b/Windows.md
index c1f7ca7ee..9244794d4 100644
--- a/Windows.md
+++ b/Windows.md
@@ -15,13 +15,28 @@
 
 # Apache NiFi -  MiNiFi - C++ Windows Build Guide
 
-## Requirements
+## Python based bootstrapping (recommended)
+Prerequisites:
+- [python](https://docs.python.org/)
+- [venv](https://docs.python.org/3/library/venv.html)
+- [chocolatey](https://chocolatey.org/)
+```dos
+.\bootstrap\py_bootstrap.bat
+```
+
+This will set up a virtual environment in the bootstrap folder, and guide you 
through the build process.
+This will also download and install all dependencies required for the selected 
components.
+It will also create a batch file (.\bootstrap\build_environment.bat),
+which sets the necessary environment variables for the build, so it can be 
built without bootstrapping everytime.
+
+
+## Alternative: Building via build script (advanced)
 
 Apache NiFi MiNiFi C++ has been built on Window Server 2016, 2019, and Windows 
10 operating systems. The project is CMake focused we suggest building via 
Visual Studio 2022 or our `win_build_vs.bat` script.
 
 The project previously required OpenSSL to be installed. If you follow our 
build procedures, below, you will not need to install that dependency.
 
-### Required software
+#### Required software
 
  - Visual Studio 2022
  - [CMake](https://cmake.org/download/)
@@ -31,11 +46,11 @@ The project previously required OpenSSL to be installed. If 
you follow our build
  - (Optional) [WiX Toolset](https://wixtoolset.org/releases/) (only for 
building the MSI)
  - (Optional) JDK (only for JNI support)
 
-### JNI support
+#### JNI support
 Though the project is written in C++, JNI functionality supports running Java 
processors stored in NiFi Archives. These can be run
 in a much smaller memory footprint and consume fewer resources. If your 
systems do not support Java or you do not want a JDK installed, please use 
non-JNI builds.
 
-## Building with Visual Studio
+### Building with Visual Studio
 
 Make sure your Visual Studio installation includes the "Visual C++ tools for 
CMake" and "Visual C++ ATL for x86 and x64" options.
 You can also add these after installation using the Visual Studio Installer 
app. We also advise
@@ -49,7 +64,7 @@ that you build `minifi.lib` then `minifi.exe` targets.  
`Build All` works, too,
 Once you have built these targets, you may use the `cpack` command to build 
your MSI. If you are building with JNI functionality the MSI will be
 significantly larger (about 160 MB) since it contains the base NARs to run the 
standard set of Apache NiFi processors.
 
-## Building via the build script
+### Building via the build script
 
 The preferred way of building the project is via the `win_build_vs.bat` script 
found in our root source folder. Its first parameter is mandatory, the 
directory in which it will build the project. `build` is a good default choice 
for this.
 
@@ -109,7 +124,7 @@ You can specify additional CMake arguments by setting the 
EXTRA_CMAKE_ARGUMENTS
 > win_build_vs.bat ...
 ```
 
-## Building directly with CMake
+### Alternative building: Manual bootstrapping (advanced)
 
 The project can also be built manually using CMake. It requires the same 
environment the build script does (the proper Native Tools Command Prompt).
 
@@ -120,7 +135,7 @@ A basic working CMake configuration can be inferred from 
the `win_build_vs.bat`.
 ```
 mkdir build
 cd build
-cmake -G "Visual Studio 17 2022" -A x64 -DINSTALLER_MERGE_MODULES=OFF 
-DTEST_CUSTOM_WEL_PROVIDER=OFF -DENABLE_SQL=OFF -DUSE_REAL_ODBC_TEST_DRIVER=OFF 
-DCMAKE_BUILD_TYPE_INIT=Release -DCMAKE_BUILD_TYPE=Release -DWIN32=WIN32 
-DENABLE_LIBRDKAFKA=OFF -DENABLE_JNI=OFF -DOPENSSL_OFF=OFF -DENABLE_COAP=OFF 
-DENABLE_AWS=OFF -DENABLE_PDH= -DENABLE_AZURE=OFF -DENABLE_SFTP=OFF 
-DENABLE_SPLUNK= -DENABLE_GCP= -DENABLE_NANOFI=OFF -DENABLE_OPENCV=OFF 
-DENABLE_PROMETHEUS=OFF -DENABLE_ELASTICSEARCH= -DUSE [...]
+cmake -G "Visual Studio 17 2022" -A x64 -DINSTALLER_MERGE_MODULES=OFF 
-DTEST_CUSTOM_WEL_PROVIDER=OFF -DENABLE_SQL=OFF 
-DMINIFI_USE_REAL_ODBC_TEST_DRIVER=OFF -DCMAKE_BUILD_TYPE_INIT=Release 
-DCMAKE_BUILD_TYPE=Release -DWIN32=WIN32 -DENABLE_LIBRDKAFKA=OFF 
-DENABLE_JNI=OFF -DMINIFI_OPENSSL=ON -DENABLE_COAP=OFF -DENABLE_AWS=OFF 
-DENABLE_PDH= -DENABLE_AZURE=OFF -DENABLE_SFTP=OFF -DENABLE_SPLUNK= 
-DENABLE_GCP= -DENABLE_NANOFI=OFF -DENABLE_OPENCV=OFF -DENABLE_PROMETHEUS=OFF 
-DENABLE_ELASTICSEAR [...]
 msbuild /m nifi-minifi-cpp.sln /property:Configuration=Release 
/property:Platform=x64
 copy minifi_main\Release\minifi.exe minifi_main\
 cpack
diff --git a/bootstrap.sh b/bootstrap.sh
index dfeed741a..550a4d3fd 100755
--- a/bootstrap.sh
+++ b/bootstrap.sh
@@ -258,12 +258,12 @@ add_cmake_option PORTABLE_BUILD ${TRUE}
 add_cmake_option DEBUG_SYMBOLS ${FALSE}
 add_cmake_option BUILD_ROCKSDB ${TRUE}
 ## uses the source from the third party directory
-add_option ROCKSDB_ENABLED ${TRUE} "DISABLE_ROCKSDB"
+add_option ROCKSDB_ENABLED ${TRUE} "ENABLE_ROCKSDB"
 ## need libcurl installed
-add_option HTTP_CURL_ENABLED ${TRUE} "DISABLE_CURL"
+add_option HTTP_CURL_ENABLED ${TRUE} "ENABLE_CURL"
 
 # third party directory
-add_option LIBARCHIVE_ENABLED ${TRUE} "DISABLE_LIBARCHIVE"
+add_option LIBARCHIVE_ENABLED ${TRUE} "ENABLE_LIBARCHIVE"
 add_dependency LIBARCHIVE_ENABLED "libarchive"
 
 add_option PYTHON_SCRIPTING_ENABLED ${TRUE} "ENABLE_PYTHON_SCRIPTING"
@@ -271,7 +271,7 @@ add_dependency PYTHON_SCRIPTING_ENABLED "python"
 add_option LUA_SCRIPTING_ENABLED ${TRUE} "ENABLE_LUA_SCRIPTING"
 add_dependency LUA_SCRIPTING_ENABLED "lua"
 
-add_option EXPRESSION_LANGUAGE_ENABLED ${TRUE} "DISABLE_EXPRESSION_LANGUAGE"
+add_option EXPRESSION_LANGUAGE_ENABLED ${TRUE} "ENABLE_EXPRESSION_LANGUAGE"
 add_dependency EXPRESSION_LANGUAGE_ENABLED "bison"
 add_dependency EXPRESSION_LANGUAGE_ENABLED "flex"
 
@@ -339,12 +339,12 @@ add_option PROCFS_ENABLED ${TRUE} "ENABLE_PROCFS"
 
 add_option PROMETHEUS_ENABLED ${TRUE} "ENABLE_PROMETHEUS"
 
-add_option OPENSSL_ENABLED ${TRUE} "OPENSSL_OFF"
+add_option OPENSSL_ENABLED ${TRUE} "MINIFI_OPENSSL"
 add_dependency OPENSSL_ENABLED "opensslbuild"
 
 USE_SHARED_LIBS=${TRUE}
 ASAN_ENABLED=${FALSE}
-FAIL_ON_WARNINGS=${FALSE}
+MINIFI_FAIL_ON_WARNINGS=${FALSE}
 TESTS_ENABLED=${TRUE}
 
 ## name, default, values
@@ -464,9 +464,9 @@ build_cmake_command(){
   fi
 
   if [ "${ASAN_ENABLED}" = "${TRUE}" ]; then
-    CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -DASAN_BUILD=ON "
+    CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} 
-DMINIFI_ADVANCED_ASAN_BUILD=ON "
   else
-    CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -DASAN_BUILD=OFF"
+    CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} 
-DMINIFI_ADVANCED_ASAN_BUILD=OFF"
   fi
 
   if [ "${USE_SHARED_LIBS}" = "${TRUE}" ]; then
@@ -489,10 +489,10 @@ build_cmake_command(){
     CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -DBUILD_ROCKSDB= "
   fi
 
-  if [ "${FAIL_ON_WARNINGS}" = "${TRUE}" ]; then
-    CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -DFAIL_ON_WARNINGS=ON "
+  if [ "${MINIFI_FAIL_ON_WARNINGS}" = "${TRUE}" ]; then
+    CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -DMINIFI_FAIL_ON_WARNINGS=ON "
   else
-    CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -DFAIL_ON_WARNINGS=OFF"
+    CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} -DMINIFI_FAIL_ON_WARNINGS=OFF"
   fi
 
   CMAKE_BUILD_COMMAND="${CMAKE_BUILD_COMMAND} 
-DBUILD_IDENTIFIER=${BUILD_IDENTIFIER}"
diff --git a/bootstrap/.gitignore b/bootstrap/.gitignore
new file mode 100644
index 000000000..13166f334
--- /dev/null
+++ b/bootstrap/.gitignore
@@ -0,0 +1,3 @@
+venv
+build_environment.bat
+
diff --git a/bootstrap/cli.py b/bootstrap/cli.py
new file mode 100644
index 000000000..e383771c8
--- /dev/null
+++ b/bootstrap/cli.py
@@ -0,0 +1,154 @@
+# 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.
+
+
+import os
+
+import inquirer
+
+from minifi_option import MinifiOptions
+from package_manager import PackageManager
+from system_dependency import install_required
+
+
+def install_dependencies(minifi_options: MinifiOptions, package_manager: 
PackageManager) -> bool:
+    res = install_required(minifi_options, package_manager)
+    print("Installation went smoothly" if res else "There were some error 
during installation")
+    return res
+
+
+def run_cmake(minifi_options: MinifiOptions, package_manager: PackageManager):
+    if not os.path.exists(minifi_options.build_dir):
+        os.mkdir(minifi_options.build_dir)
+    cmake_cmd = f"cmake -G Ninja {minifi_options.create_cmake_options_str()} 
{minifi_options.source_dir} -B {minifi_options.build_dir}"
+    res = package_manager.run_cmd(cmake_cmd)
+    print("CMake command run successfully" if res else "CMake command run 
unsuccessfully")
+    return res
+
+
+def do_build(minifi_options: MinifiOptions, package_manager: PackageManager):
+    build_cmd = f"cmake --build {str(minifi_options.build_dir)}"
+    res = package_manager.run_cmd(build_cmd)
+    print("Build was successful" if res else "Build was unsuccessful")
+    return res
+
+
+def do_package(minifi_options: MinifiOptions, package_manager: PackageManager):
+    build_cmd = f"cmake --build {str(minifi_options.build_dir)} --target 
package"
+    return package_manager.run_cmd(build_cmd)
+
+
+def do_one_click_build(minifi_options: MinifiOptions, package_manager: 
PackageManager) -> bool:
+    assert install_dependencies(minifi_options, package_manager)
+    assert run_cmake(minifi_options, package_manager)
+    assert do_build(minifi_options, package_manager)
+    assert do_package(minifi_options, package_manager)
+    return True
+
+
+def main_menu(minifi_options: MinifiOptions, package_manager: PackageManager):
+    done = False
+    while not done:
+        main_menu_options = {
+            f"Build dir: {minifi_options.build_dir}": build_dir_menu,
+            f"Build type: {minifi_options.build_type.value}": build_type_menu,
+            "Build options": bool_menu,
+            "One click build": do_one_click_build,
+            "Step by step build": step_by_step_menu,
+            "Exit": lambda _options, _manager: True,
+        }
+
+        questions = [
+            inquirer.List(
+                "sub_menu",
+                message="Main Menu",
+                choices=[menu_option_name for menu_option_name in 
main_menu_options],
+            ),
+        ]
+
+        main_menu_prompt = inquirer.prompt(questions)
+        done = main_menu_options[main_menu_prompt["sub_menu"]](minifi_options, 
package_manager)
+
+
+def build_type_menu(minifi_options: MinifiOptions, _package_manager: 
PackageManager) -> bool:
+    questions = [
+        inquirer.List(
+            "build_type",
+            message="Build type",
+            choices=minifi_options.build_type.possible_values,
+        ),
+    ]
+
+    answers = inquirer.prompt(questions)
+    minifi_options.build_type.value = answers["build_type"]
+    return False
+
+
+def build_dir_menu(minifi_options: MinifiOptions, _package_manager: 
PackageManager) -> bool:
+    questions = [
+        inquirer.Path('build_dir',
+                      message="Build directory",
+                      default=minifi_options.build_dir
+                      ),
+    ]
+    minifi_options.build_dir = inquirer.prompt(questions)["build_dir"]
+    return False
+
+
+def bool_menu(minifi_options: MinifiOptions, _package_manager: PackageManager) 
-> bool:
+    possible_values = [option_name for option_name in 
minifi_options.bool_options]
+    selected_values = [option.name for option in 
minifi_options.bool_options.values() if option.value == "ON"]
+    questions = [
+        inquirer.Checkbox(
+            "options",
+            message="MiNiFi C++ Options (space to select, enter to confirm)",
+            choices=possible_values,
+            default=selected_values
+        ),
+    ]
+
+    answers = inquirer.prompt(questions)
+    for bool_option in minifi_options.bool_options.values():
+        if bool_option.name in answers["options"]:
+            bool_option.value = "ON"
+        else:
+            bool_option.value = "OFF"
+
+    return False
+
+
+def step_by_step_menu(minifi_options: MinifiOptions, package_manager: 
PackageManager) -> bool:
+    done = False
+    while not done:
+        step_by_step_options = {
+            f"Build dir: {minifi_options.build_dir}": build_dir_menu,
+            "Install dependencies": install_dependencies,
+            "Run cmake": run_cmake,
+            "Build": do_build,
+            "Package": do_package,
+            "Back": lambda _options, _manager: True,
+        }
+        questions = [
+            inquirer.List(
+                "selection",
+                message="Step by step menu",
+                choices=[step_by_step_menu_option_name for 
step_by_step_menu_option_name in step_by_step_options],
+            ),
+        ]
+
+        step_by_step_prompt = inquirer.prompt(questions)
+        step_by_step_options[step_by_step_prompt["selection"]](minifi_options, 
package_manager)
+        done = step_by_step_prompt['selection'] == 'Back'
+    return False
diff --git a/bootstrap/cmake_parser.py b/bootstrap/cmake_parser.py
new file mode 100644
index 000000000..4c9fae362
--- /dev/null
+++ b/bootstrap/cmake_parser.py
@@ -0,0 +1,74 @@
+# 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.
+
+import os
+import re
+
+from package_manager import PackageManager
+
+
+class CMakeCacheValue:
+    def __init__(self, description: str, name: str, value_type: str, value: 
str):
+        self.description = description
+        self.name = name
+        self.value_type = value_type
+        self.value = value
+        self.possible_values = None
+
+    def __str__(self):
+        return f"CMakeCacheVariable, description:{self.description} 
name:{self.name}, type:{self.value_type}, value:{self.value}"
+
+    def __repr__(self):
+        return self.__str__()
+
+    def create_cmake_option_str(self):
+        return f"-D{self.name}={self.value}"
+
+
+def create_cmake_cache(cmake_path: str, cmake_options: str, directory: str, 
package_manager: PackageManager):
+    cmake_lists_path = os.path.join(directory, 'CMakeLists.txt')
+
+    with open(cmake_lists_path, 'w') as cmake_lists_file:
+        cmake_lists_file.write('cmake_minimum_required(VERSION 3.5)\n')
+        cmake_lists_file.write(f'include("{cmake_path}")\n')
+
+    if cmake_options is None:
+        assert package_manager.run_cmd(f'cmake -G Ninja -Wno-dev 
--log-level=ERROR {directory} -B {directory}')
+    else:
+        assert package_manager.run_cmd(
+            f'cmake -G Ninja -Wno-dev --no-warn-unused-cli --log-level=ERROR 
{cmake_options} {directory} -B {directory}')
+    return os.path.join(directory, 'CMakeCache.txt')
+
+
+def parse_cmake_cache_values(path: str):
+    parsed_variables = {}
+    with open(path, 'r') as file:
+        contents = file.read()
+        pattern = 
r'\/\/(?P<description>[\s\S]*?)\n(?P<variable>.+?):(?P<type>\w+?)=(?P<value>.+)\n'
+        matches = re.findall(pattern, contents)
+
+        for match in matches:
+            cmake_cache_value = 
CMakeCacheValue(description=match[0].replace("//", "").replace("\n", " "),
+                                                name=match[1],
+                                                value_type=match[2], 
value=match[3])
+            if cmake_cache_value.name.endswith("-STRINGS"):
+                possible_values_of = cmake_cache_value.name[:-len("-STRINGS")]
+                if possible_values_of not in parsed_variables:
+                    raise ValueError(f"Did not parse {possible_values_of} yet")
+                parsed_variables[possible_values_of].possible_values = 
cmake_cache_value.value.split(";")
+                continue
+
+            parsed_variables[cmake_cache_value.name] = cmake_cache_value
+    return parsed_variables
diff --git a/bootstrap/main.py b/bootstrap/main.py
new file mode 100644
index 000000000..9fd92ebcb
--- /dev/null
+++ b/bootstrap/main.py
@@ -0,0 +1,61 @@
+# 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.
+import tempfile
+
+import argparse
+import pathlib
+
+from cli import main_menu, do_one_click_build
+from minifi_option import parse_minifi_options
+from package_manager import get_package_manager
+
+if __name__ == '__main__':
+    with tempfile.TemporaryDirectory() as cmake_cache_dir:
+        parser = argparse.ArgumentParser()
+        parser.add_argument('--noconfirm', action="store_true", default=False,
+                            help="Bypass any and all “Are you sure?” 
messages.")
+        parser.add_argument('--minifi-options', default="", help="Overrides 
the default minifi options during the "
+                                                                 "initial 
parsing")
+        parser.add_argument('--cmake-options', default="", help="Appends this 
to the final cmake command")
+        parser.add_argument('--skip-compiler-install', action="store_true", 
default=False,
+                            help="Skips the installation of the default 
compiler")
+        parser.add_argument('--noninteractive', action="store_true", 
default=False,
+                            help="Initiates the one click build")
+        args = parser.parse_args()
+        no_confirm = args.noconfirm or args.noninteractive
+
+        package_manager = get_package_manager(no_confirm)
+        if not args.skip_compiler_install:
+            compiler_override = package_manager.install_compiler()
+        else:
+            compiler_override = ""
+        package_manager.ensure_environment()
+
+        cmake_options_for_parsing = " ".join(filter(None, 
[args.minifi_options, compiler_override]))
+        cmake_options_for_cmake = " ".join(filter(None, [args.cmake_options, 
compiler_override]))
+
+        path = pathlib.Path(__file__).parent.resolve() / '..' / "cmake" / 
"MiNiFiOptions.cmake"
+
+        minifi_options = parse_minifi_options(str(path.as_posix()),
+                                              cmake_options_for_parsing,
+                                              package_manager,
+                                              cmake_cache_dir)
+        minifi_options.no_confirm = no_confirm
+        minifi_options.set_cmake_override(cmake_options_for_cmake)
+
+        if args.noninteractive:
+            do_one_click_build(minifi_options, package_manager)
+        else:
+            main_menu(minifi_options, package_manager)
diff --git a/bootstrap/minifi_option.py b/bootstrap/minifi_option.py
new file mode 100644
index 000000000..0c659eba9
--- /dev/null
+++ b/bootstrap/minifi_option.py
@@ -0,0 +1,60 @@
+# 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.
+
+from typing import Dict
+
+import pathlib
+
+import cmake_parser
+from cmake_parser import CMakeCacheValue
+from package_manager import PackageManager
+
+
+class MinifiOptions:
+    def __init__(self, cache_values: Dict[str, CMakeCacheValue]):
+        self.cmake_override = ""
+        self.build_type = CMakeCacheValue("Specifies the build type on 
single-configuration generators",
+                                          "CMAKE_BUILD_TYPE", "STRING", 
"Release")
+        self.build_type.possible_values = ["Release", "Debug", 
"RelWithDebInfo", "MinSizeRel"]
+        self.bool_options = {name: cache_value for name, cache_value in 
cache_values.items() if
+                             cache_value.value_type == "BOOL" and ("ENABLE" in 
name or "MINIFI" in name)}
+        self.multi_choice_options = [cache_value for name, cache_value in 
cache_values.items() if
+                                     cache_value.value_type == "STRING" and 
cache_value.possible_values is not None]
+        self.build_dir = pathlib.Path(__file__).parent.parent.resolve() / 
"build"
+        self.source_dir = pathlib.Path(__file__).parent.parent.resolve()
+        self.no_confirm = False
+
+    def create_cmake_options_str(self) -> str:
+        cmake_options = [bool_option.create_cmake_option_str() for name, 
bool_option in self.bool_options.items()]
+        if self.cmake_override:
+            cmake_options.append(self.cmake_override)
+        cmake_options.append(f'-DCMAKE_BUILD_TYPE={self.build_type.value}')
+        cmake_options_str = " ".join(filter(None, cmake_options))
+        return cmake_options_str
+
+    def is_enabled(self, option_name: str) -> bool:
+        if option_name not in self.bool_options:
+            raise ValueError(f"Expected {option_name} to be a minifi option")
+        if "ENABLE_ALL" in self.bool_options and 
self.bool_options["ENABLE_ALL"].value == "ON":
+            return True
+        return self.bool_options[option_name].value == "ON"
+
+    def set_cmake_override(self, cmake_override: str):
+        self.cmake_override = cmake_override
+
+
+def parse_minifi_options(path: str, cmake_options: str, package_manager: 
PackageManager, cmake_cache_dir: str):
+    cmake_cache_path = cmake_parser.create_cmake_cache(path, cmake_options, 
cmake_cache_dir, package_manager)
+    return 
MinifiOptions(cmake_parser.parse_cmake_cache_values(cmake_cache_path))
diff --git a/bootstrap/package_manager.py b/bootstrap/package_manager.py
new file mode 100644
index 000000000..972d42dc2
--- /dev/null
+++ b/bootstrap/package_manager.py
@@ -0,0 +1,318 @@
+# 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.
+import os
+import pathlib
+import platform
+import subprocess
+import sys
+from enum import Enum
+from typing import Dict, Set
+
+from distro import distro
+
+
+class VsWhereLocation(Enum):
+    CHOCO = 1
+    DEFAULT = 2
+
+
+def _query_yes_no(question: str, no_confirm: bool) -> bool:
+    valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False}
+
+    if no_confirm:
+        print("Running {} with noconfirm".format(question))
+        return True
+    while True:
+        print("{} [y/n]".format(question), end=' ', flush=True)
+        choice = input().lower()
+        if choice in valid:
+            return valid[choice]
+        else:
+            print("Please respond with 'yes' or 'no' " "(or 'y' or 'n').")
+
+
+def _run_command_with_confirm(command: str, no_confirm: bool) -> bool:
+    if _query_yes_no("Running {}".format(command), no_confirm):
+        return os.system(command) == 0
+
+
+class PackageManager(object):
+    def __init__(self, no_confirm):
+        self.no_confirm = no_confirm
+        pass
+
+    def install(self, dependencies: Dict[str, Set[str]]) -> bool:
+        raise Exception("NotImplementedException")
+
+    def install_compiler(self) -> str:
+        raise Exception("NotImplementedException")
+
+    def ensure_environment(self):
+        pass
+
+    def _install(self, dependencies: Dict[str, Set[str]], replace_dict: 
Dict[str, Set[str]], install_cmd: str) -> bool:
+        dependencies.update({k: v for k, v in replace_dict.items() if k in 
dependencies})
+        dependencies = self._filter_out_installed_packages(dependencies)
+        dependencies_str = " ".join(str(value) for value_set in 
dependencies.values() for value in value_set)
+        if not dependencies_str or dependencies_str.isspace():
+            return True
+        return _run_command_with_confirm(f"{install_cmd} {dependencies_str}", 
self.no_confirm)
+
+    def _get_installed_packages(self) -> Set[str]:
+        raise Exception("NotImplementedException")
+
+    def _filter_out_installed_packages(self, dependencies: Dict[str, 
Set[str]]):
+        installed_packages = self._get_installed_packages()
+        filtered_packages = {k: (v - installed_packages) for k, v in 
dependencies.items()}
+        for installed_package in installed_packages:
+            filtered_packages.pop(installed_package, None)
+        return filtered_packages
+
+    def run_cmd(self, cmd: str) -> bool:
+        result = subprocess.run(f"{cmd}", shell=True, text=True)
+        return result.returncode == 0
+
+
+class BrewPackageManager(PackageManager):
+    def __init__(self, no_confirm):
+        PackageManager.__init__(self, no_confirm)
+
+    def install(self, dependencies: Dict[str, Set[str]]) -> bool:
+        return self._install(dependencies=dependencies,
+                             install_cmd="brew install",
+                             replace_dict={"patch": set(),
+                                           "jni": {"maven"}})
+
+    def install_compiler(self) -> str:
+        self.install({"compiler": set()})
+        return ""
+
+    def _get_installed_packages(self) -> Set[str]:
+        result = subprocess.run(['brew', 'list'], text=True, 
capture_output=True, check=True)
+        lines = result.stdout.splitlines()
+        lines = [line.split('@', 1)[0] for line in lines]
+        return set(lines)
+
+
+class AptPackageManager(PackageManager):
+    def __init__(self, no_confirm):
+        PackageManager.__init__(self, no_confirm)
+
+    def install(self, dependencies: Dict[str, Set[str]]) -> bool:
+        return self._install(dependencies=dependencies,
+                             install_cmd="sudo apt install -y",
+                             replace_dict={"libarchive": {"liblzma-dev"},
+                                           "lua": {"liblua5.1-0-dev"},
+                                           "python": {"libpython3-dev"},
+                                           "libusb": {"libusb-1.0-0-dev", 
"libusb-dev"},
+                                           "libpng": {"libpng-dev"},
+                                           "libpcap": {"libpcap-dev"},
+                                           "jni": {"openjdk-8-jdk", 
"openjdk-8-source", "maven"},
+                                           "gpsd": {"libgps-dev"}})
+
+    def _get_installed_packages(self) -> Set[str]:
+        result = subprocess.run(['dpkg', '--get-selections'], text=True, 
capture_output=True, check=True)
+        lines = [line.split('\t')[0] for line in result.stdout.splitlines()]
+        lines = [line.rsplit(':', 1)[0] for line in lines]
+        return set(lines)
+
+    def install_compiler(self) -> str:
+        if distro.id() == "ubuntu" and int(distro.major_version()) < 22:
+            self.install({"compiler_prereq": {"apt-transport-https", 
"ca-certificates", "software-properties-common"}})
+            _run_command_with_confirm("sudo add-apt-repository -y 
ppa:ubuntu-toolchain-r/test",
+                                      no_confirm=self.no_confirm)
+            self.install({"compiler": {"build-essential", "g++-11"}})
+            return "-DCMAKE_C_COMPILER=gcc-11 -DCMAKE_CXX_COMPILER=g++-11"
+        self.install({"compiler": {"g++"}})
+        return ""
+
+
+class DnfPackageManager(PackageManager):
+    def __init__(self, no_confirm):
+        PackageManager.__init__(self, no_confirm)
+
+    def install(self, dependencies: Dict[str, Set[str]]) -> bool:
+        return self._install(dependencies=dependencies,
+                             install_cmd="sudo dnf --enablerepo=crb install -y 
epel-release",
+                             replace_dict={"gpsd": {"gpsd-devel"},
+                                           "libpcap": {"libpcap-devel"},
+                                           "lua": {"lua-devel"},
+                                           "python": {"python3-devel"},
+                                           "jni": {"java-1.8.0-openjdk", 
"java-1.8.0-openjdk-devel", "maven"},
+                                           "libpng": {"libpng-devel"},
+                                           "libusb": {"libusb-devel"}})
+
+    def _get_installed_packages(self) -> Set[str]:
+        result = subprocess.run(['dnf', 'list', 'installed'], text=True, 
capture_output=True, check=True)
+        lines = [line.split(' ')[0] for line in result.stdout.splitlines()]
+        lines = [line.rsplit('.', 1)[0] for line in lines]
+        return set(lines)
+
+    def install_compiler(self) -> str:
+        self.install({"compiler": {"gcc-c++"}})
+        return ""
+
+
+class PacmanPackageManager(PackageManager):
+    def __init__(self, no_confirm):
+        PackageManager.__init__(self, no_confirm)
+
+    def install(self, dependencies: Dict[str, Set[str]]) -> bool:
+        return self._install(dependencies=dependencies,
+                             install_cmd="sudo pacman --noconfirm -S",
+                             replace_dict={"jni": {"jdk8-openjdk", "maven"}})
+
+    def _get_installed_packages(self) -> Set[str]:
+        result = subprocess.run(['pacman', '-Qq'], text=True, 
capture_output=True, check=True)
+        return set(result.stdout.splitlines())
+
+    def install_compiler(self) -> str:
+        self.install({"compiler": {"gcc"}})
+        return ""
+
+
+def _get_vs_dev_cmd_path(vs_where_location: VsWhereLocation):
+    if vs_where_location == VsWhereLocation.CHOCO:
+        vs_where_path = "vswhere"
+    else:
+        vs_where_path = "%ProgramFiles(x86)%\\Microsoft Visual 
Studio\\Installer\\vswhere.exe"
+
+    vswhere_results = subprocess.run(
+        f"{vs_where_path} -products * "
+        f"-property installationPath "
+        f"-requires Microsoft.VisualStudio.Component.VC.ATL "
+        f"-version 17",
+        capture_output=True)
+
+    for vswhere_result in vswhere_results.stdout.splitlines():
+        possible_path = 
f"{vswhere_result.decode()}\\Common7\\Tools\\VsDevCmd.bat"
+        if os.path.exists(possible_path):
+            return f'"{possible_path}"'
+    return None
+
+
+def _get_vs_dev_cmd(vs_where_location: VsWhereLocation) -> str:
+    vs_dev_path = _get_vs_dev_cmd_path(vs_where_location)
+    return f"{vs_dev_path} -arch=x64 -host_arch=x64"
+
+
+def _get_activate_venv_path():
+    return pathlib.Path(__file__).parent.resolve() / "venv" / "Scripts" / 
"activate.bat"
+
+
+def _minifi_setup_env_str(vs_where_location: VsWhereLocation) -> str:
+    return f"""
+call refreshenv
+call {_get_vs_dev_cmd(vs_where_location)}
+setlocal EnableDelayedExpansion
+  set PATH=!PATH:C:\\Strawberry\\c\\bin;=!;C:\\Program Files\\NASM;
+endlocal & set PATH=%PATH%
+set build_platform=x64
+IF "%VIRTUALENV%"=="" (
+  echo already in venv
+) ELSE (
+  {_get_activate_venv_path()}
+)
+
+"""
+
+
+def _create_minifi_setup_env_batch(vs_where_location: VsWhereLocation):
+    with open(pathlib.Path(__file__).parent.resolve() / 
"build_environment.bat", "w") as f:
+        f.write(_minifi_setup_env_str(vs_where_location))
+
+
+class ChocolateyPackageManager(PackageManager):
+    def __init__(self, no_confirm):
+        PackageManager.__init__(self, no_confirm)
+
+    def install(self, dependencies: Dict[str, Set[str]]) -> bool:
+        self._install(dependencies=dependencies,
+                      install_cmd="choco install -y",
+                      replace_dict={"lua": set(),
+                                    "python": set(),
+                                    "patch": set(),
+                                    "bison": set(),
+                                    "flex": set(),
+                                    "libarchive": set(),
+                                    "libpcap": set(),
+                                    "libpng": set(),
+                                    "gpsd": set(),
+                                    "automake": set(),
+                                    "autoconf": set(),
+                                    "libtool": set(),
+                                    "libusb": set(),
+                                    "make": set(),
+                                    "jni": {"openjdk", "maven"},
+                                    "perl": {"strawberryperl", "NASM"}})
+        return True
+
+    def _get_installed_packages(self) -> Set[str]:
+        result = subprocess.run(['choco', 'list'], text=True, 
capture_output=True, check=True)
+        lines = [line.split(' ')[0] for line in result.stdout.splitlines()]
+        lines = [line.rsplit('.', 1)[0] for line in lines]
+        if os.path.exists("C:\\Program Files\\NASM"):
+            lines.append("NASM")  # choco doesnt remember NASM
+        return set(lines)
+
+    def _acquire_vswhere(self):
+        installed_packages = self._get_installed_packages()
+        if "vswhere" in installed_packages:
+            return VsWhereLocation.CHOCO
+        vswhere_default_path = "%ProgramFiles(x86)%\\Microsoft Visual 
Studio\\Installer\\vswhere.exe"
+        if os.path.exists(vswhere_default_path):
+            return VsWhereLocation.DEFAULT
+        self.install({"vswhere": {"vswhere"}})
+        return VsWhereLocation.CHOCO
+
+    def install_compiler(self) -> str:
+        vs_where_loc = self._acquire_vswhere()
+        vs_dev_path = _get_vs_dev_cmd_path(vs_where_loc)
+        if not vs_dev_path:
+            self.install(
+                {"visualstudio2022buildtools": {'visualstudio2022buildtools 
--package-parameters "--wait --quiet '
+                                                '--add 
Microsoft.VisualStudio.Workload.VCTools '
+                                                '--add 
Microsoft.VisualStudio.Component.VC.ATL '
+                                                '--includeRecommended"'}})
+        return ""
+
+    def run_cmd(self, cmd: str) -> bool:
+        env_bat_path = pathlib.Path(__file__).parent.resolve() / 
"build_environment.bat"
+        res = subprocess.run(f"{env_bat_path} & {cmd}", check=True, text=True)
+
+        return res.returncode == 0
+
+    def ensure_environment(self):
+        _create_minifi_setup_env_batch(self._acquire_vswhere())
+
+
+def get_package_manager(no_confirm: bool) -> PackageManager:
+    platform_system = platform.system()
+    if platform_system == "Darwin":
+        return BrewPackageManager(no_confirm)
+    elif platform_system == "Linux":
+        distro_id = distro.id()
+        if distro_id == "ubuntu":
+            return AptPackageManager(no_confirm)
+        elif "arch" in distro_id or "manjaro" in distro_id:
+            return PacmanPackageManager(no_confirm)
+        elif "rocky" in distro_id:
+            return DnfPackageManager(no_confirm)
+        else:
+            sys.exit(f"Unsupported platform {distro_id} exiting")
+    elif platform_system == "Windows":
+        return ChocolateyPackageManager(no_confirm)
+    else:
+        sys.exit(f"Unsupported platform {platform_system} exiting")
diff --git a/bootstrap/py_bootstrap.bat b/bootstrap/py_bootstrap.bat
new file mode 100644
index 000000000..8580e02cd
--- /dev/null
+++ b/bootstrap/py_bootstrap.bat
@@ -0,0 +1,26 @@
+@echo off
+
+REM Check if Python is installed
+where python > nul 2>&1
+if %errorlevel% neq 0 (
+    echo Python is not installed
+    exit /b 1
+)
+
+set "SCRIPT_DIR=%~dp0"
+set "VENV_DIR=%SCRIPT_DIR%venv"
+
+if exist "%VENV_DIR%" (
+    call "%VENV_DIR%\Scripts\activate.bat"
+) else (
+    echo Creating virtualenv
+    python -m venv "%VENV_DIR%"
+    if %errorlevel% neq 0 (
+        echo venv module is not available
+        exit /b 1
+    )
+    call "%VENV_DIR%\Scripts\activate.bat"
+    pip install -r "%SCRIPT_DIR%requirements.txt"
+)
+python "%SCRIPT_DIR%main.py"
+deactivate
diff --git a/bootstrap/py_bootstrap.sh b/bootstrap/py_bootstrap.sh
new file mode 100755
index 000000000..7ca3a7188
--- /dev/null
+++ b/bootstrap/py_bootstrap.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+# Check if Python is installed
+if ! command -v python3 &>/dev/null; then
+    echo "Python is not installed"
+    exit 1
+fi
+
+SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+VENV_DIR="$SCRIPT_DIR/venv"
+
+set -e
+
+if [ -d "$VENV_DIR" ]; then
+    source "$VENV_DIR/bin/activate"
+else
+    echo "Creating virtualenv"
+    if ! python3 -m venv "$VENV_DIR"; then
+        echo "Creating virtualenv failed. Is venv installed?"
+        exit 1
+    fi
+    source "$VENV_DIR/bin/activate"
+    pip install -r "$SCRIPT_DIR/requirements.txt"
+fi
+
+python "$SCRIPT_DIR/main.py"
diff --git a/bootstrap/requirements.txt b/bootstrap/requirements.txt
new file mode 100644
index 000000000..fe82268dc
--- /dev/null
+++ b/bootstrap/requirements.txt
@@ -0,0 +1,6 @@
+inquirer==3.1.3
+cmake==3.26.3
+pathlib==1.0.1
+distro==1.8.0
+ninja==1.11.1
+argparse==1.4.0
diff --git a/bootstrap/system_dependency.py b/bootstrap/system_dependency.py
new file mode 100644
index 000000000..2271178b6
--- /dev/null
+++ b/bootstrap/system_dependency.py
@@ -0,0 +1,58 @@
+# 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.
+
+from __future__ import annotations
+
+from typing import Dict, Set
+
+from minifi_option import MinifiOptions
+from package_manager import PackageManager
+import platform
+
+
+def _create_system_dependencies(minifi_options: MinifiOptions) -> Dict[str, 
Set[str]]:
+    system_dependencies = {'patch': {'patch'}, 'make': {'make'}}
+    if minifi_options.is_enabled("ENABLE_EXPRESSION_LANGUAGE"):
+        system_dependencies['bison'] = {'bison'}
+        system_dependencies['flex'] = {'flex'}
+    if minifi_options.is_enabled("ENABLE_LIBARCHIVE"):
+        system_dependencies['libarchive'] = {'libarchive'}
+    if minifi_options.is_enabled("ENABLE_PCAP"):
+        system_dependencies['libpcap'] = {'libpcap'}
+    if minifi_options.is_enabled("ENABLE_USB_CAMERA"):
+        system_dependencies['libusb'] = {'libusb'}
+        system_dependencies['libpng'] = {'libpng'}
+    if minifi_options.is_enabled("ENABLE_GPS"):
+        system_dependencies['gpsd'] = {'gpsd'}
+    if minifi_options.is_enabled("ENABLE_COAP"):
+        system_dependencies['automake'] = {'automake'}
+        system_dependencies['autoconf'] = {'autoconf'}
+        system_dependencies['libtool'] = {'libtool'}
+    if minifi_options.is_enabled("ENABLE_LUA_SCRIPTING"):
+        system_dependencies['lua'] = {'lua'}
+    if minifi_options.is_enabled("ENABLE_PYTHON_SCRIPTING"):
+        system_dependencies['python'] = {'python'}
+    if minifi_options.is_enabled("MINIFI_OPENSSL"):
+        system_dependencies['perl'] = {'perl'}
+    if minifi_options.is_enabled("ENABLE_JNI"):
+        system_dependencies['jni'] = {'openjdk'}
+        system_dependencies['maven'] = {'maven'}
+    if platform.system() == "Windows":
+        system_dependencies['wixtoolset'] = {'wixtoolset'}
+    return system_dependencies
+
+
+def install_required(minifi_options: MinifiOptions, package_manager: 
PackageManager) -> bool:
+    return package_manager.install(_create_system_dependencies(minifi_options))
diff --git a/bstrp_functions.sh b/bstrp_functions.sh
index 5cd25f382..6a1857182 100755
--- a/bstrp_functions.sh
+++ b/bstrp_functions.sh
@@ -164,7 +164,7 @@ save_state(){
   echo_state_variable BUILD_PROFILE
   echo_state_variable USE_SHARED_LIBS
   echo_state_variable ASAN_ENABLED
-  echo_state_variable FAIL_ON_WARNINGS
+  echo_state_variable MINIFI_FAIL_ON_WARNINGS
   for option in "${OPTIONS[@]}" ; do
     echo_state_variable "${option}"
   done
@@ -399,7 +399,7 @@ show_supported_features() {
   echo "4. Use Shared Dependency Links .$(print_feature_status 
USE_SHARED_LIBS)"
   echo "5. Build Profile ...............$(print_multi_option_status 
BUILD_PROFILE)"
   echo "6. Create ASAN build ...........$(print_feature_status ASAN_ENABLED)"
-  echo "7. Treat warnings as errors.....$(print_feature_status 
FAIL_ON_WARNINGS)"
+  echo "7. Treat warnings as errors.....$(print_feature_status 
MINIFI_FAIL_ON_WARNINGS)"
   echo "8. Enable OpenSSL...............$(print_feature_status 
OPENSSL_ENABLED)"
   echo "P. Continue with these options"
   if [ "$GUIDED_INSTALL" = "${TRUE}" ]; then
@@ -452,7 +452,7 @@ read_feature_options(){
     4) ToggleFeature USE_SHARED_LIBS;;
     5) ToggleMultiOption BUILD_PROFILE;;
     6) ToggleFeature ASAN_ENABLED;;
-    7) ToggleFeature FAIL_ON_WARNINGS;;
+    7) ToggleFeature MINIFI_FAIL_ON_WARNINGS;;
     8) ToggleFeature OPENSSL_ENABLED;;
     p) export FEATURES_SELECTED="true" ;;
     r) if [ "$GUIDED_INSTALL" = "${TRUE}" ]; then
diff --git a/centos.sh b/centos.sh
index 63fa62809..489326809 100644
--- a/centos.sh
+++ b/centos.sh
@@ -45,7 +45,7 @@ verify_enable_platform() {
 
 add_os_flags() {
     get_toolset_name
-    source /opt/rh/$TOOLSET_NAME/enable
+    source "/opt/rh/$TOOLSET_NAME/enable"
 }
 install_bison() {
     INSTALLED+=("bison")
diff --git a/cmake/Abseil.cmake b/cmake/Abseil.cmake
index a4497a7e4..9872b41b9 100644
--- a/cmake/Abseil.cmake
+++ b/cmake/Abseil.cmake
@@ -30,5 +30,6 @@ FetchContent_Declare(
         URL      
https://github.com/abseil/abseil-cpp/archive/refs/tags/20230802.0.tar.gz
         URL_HASH 
SHA256=59d2976af9d6ecf001a81a35749a6e551a335b949d34918cfade07737b9d93c5
         PATCH_COMMAND "${PC}"
+        OVERRIDE_FIND_PACKAGE
 )
 FetchContent_MakeAvailable(absl)
diff --git a/cmake/BuildTests.cmake b/cmake/BuildTests.cmake
index cd25b4d61..d299d67fb 100644
--- a/cmake/BuildTests.cmake
+++ b/cmake/BuildTests.cmake
@@ -121,7 +121,7 @@ FOREACH(testfile ${UNIT_TESTS})
 ENDFOREACH()
 message("-- Finished building ${UNIT_TEST_COUNT} unit test file(s)...")
 
-if (NOT OPENSSL_OFF)
+if (MINIFI_OPENSSL)
     SET(UNIT_TEST_COUNT 0)
     FOREACH(testfile ${TLS_UNIT_TESTS})
         get_filename_component(testfilename "${testfile}" NAME_WE)
diff --git a/cmake/BundledLibArchive.cmake b/cmake/BundledLibArchive.cmake
index 14bd48f60..bcfe53e1d 100644
--- a/cmake/BundledLibArchive.cmake
+++ b/cmake/BundledLibArchive.cmake
@@ -49,19 +49,19 @@ function(use_bundled_libarchive SOURCE_DIR BINARY_DIR)
             -DENABLE_TEST=OFF
             -DENABLE_WERROR=OFF)
 
-    if (OPENSSL_OFF)
+    if (MINIFI_OPENSSL)
         list(APPEND LIBARCHIVE_CMAKE_ARGS -DENABLE_OPENSSL=OFF)
     else()
         list(APPEND LIBARCHIVE_CMAKE_ARGS -DENABLE_OPENSSL=ON)
     endif()
 
-    if (DISABLE_LZMA)
+    if (NOT ENABLE_LZMA)
         list(APPEND LIBARCHIVE_CMAKE_ARGS -DENABLE_LZMA=OFF)
     else()
         list(APPEND LIBARCHIVE_CMAKE_ARGS -DENABLE_LZMA=ON)
     endif()
 
-    if (DISABLE_BZIP2)
+    if (NOT ENABLE_BZIP2)
         list(APPEND LIBARCHIVE_CMAKE_ARGS -DENABLE_BZip2=OFF)
     else()
         list(APPEND LIBARCHIVE_CMAKE_ARGS -DENABLE_BZip2=ON)
@@ -84,13 +84,13 @@ function(use_bundled_libarchive SOURCE_DIR BINARY_DIR)
 
     # Set dependencies
     add_dependencies(libarchive-external ZLIB::ZLIB)
-    if (NOT OPENSSL_OFF)
+    if (MINIFI_OPENSSL)
         add_dependencies(libarchive-external OpenSSL::Crypto)
     endif()
-    if (NOT DISABLE_LZMA)
+    if (ENABLE_LZMA)
         add_dependencies(libarchive-external LibLZMA::LibLZMA)
     endif()
-    if (NOT DISABLE_BZIP2)
+    if (ENABLE_BZIP2)
         add_dependencies(libarchive-external BZip2::BZip2)
     endif()
 
@@ -105,13 +105,13 @@ function(use_bundled_libarchive SOURCE_DIR BINARY_DIR)
     set_target_properties(LibArchive::LibArchive PROPERTIES IMPORTED_LOCATION 
"${LIBARCHIVE_LIBRARY}")
     add_dependencies(LibArchive::LibArchive libarchive-external)
     set_property(TARGET LibArchive::LibArchive APPEND PROPERTY 
INTERFACE_LINK_LIBRARIES ZLIB::ZLIB)
-    if (NOT OPENSSL_OFF)
+    if (MINIFI_OPENSSL)
         set_property(TARGET LibArchive::LibArchive APPEND PROPERTY 
INTERFACE_LINK_LIBRARIES OpenSSL::Crypto)
     endif()
-    if (NOT DISABLE_LZMA)
+    if (ENABLE_LZMA)
         set_property(TARGET LibArchive::LibArchive APPEND PROPERTY 
INTERFACE_LINK_LIBRARIES LibLZMA::LibLZMA)
     endif()
-    if (NOT DISABLE_BZIP2)
+    if (ENABLE_BZIP2)
         set_property(TARGET LibArchive::LibArchive APPEND PROPERTY 
INTERFACE_LINK_LIBRARIES BZip2::BZip2)
     endif()
     file(MAKE_DIRECTORY ${LIBARCHIVE_INCLUDE_DIRS})
diff --git a/cmake/BundledLibcURL.cmake b/cmake/BundledLibcURL.cmake
index 6cd6407ea..23735457d 100644
--- a/cmake/BundledLibcURL.cmake
+++ b/cmake/BundledLibcURL.cmake
@@ -51,7 +51,7 @@ function(use_bundled_curl SOURCE_DIR BINARY_DIR)
             -DUSE_LIBIDN2=OFF
             -DCURL_USE_LIBPSL=OFF
             )
-    if (OPENSSL_OFF)
+    if (NOT MINIFI_OPENSSL)
         list(APPEND CURL_CMAKE_ARGS -DCURL_USE_OPENSSL=OFF)
     else()
         list(APPEND CURL_CMAKE_ARGS -DCURL_USE_OPENSSL=ON)
@@ -74,7 +74,7 @@ function(use_bundled_curl SOURCE_DIR BINARY_DIR)
 
     # Set dependencies
     add_dependencies(curl-external ZLIB::ZLIB)
-    if (NOT OPENSSL_OFF)
+    if (MINIFI_OPENSSL)
         add_dependencies(curl-external OpenSSL::SSL OpenSSL::Crypto)
     endif()
 
@@ -102,7 +102,7 @@ function(use_bundled_curl SOURCE_DIR BINARY_DIR)
         target_link_libraries(CURL::libcurl INTERFACE "-framework 
SystemConfiguration")
         target_link_libraries(CURL::libcurl INTERFACE "-framework 
CoreServices")
     endif()
-    if (NOT OPENSSL_OFF)
+    if (MINIFI_OPENSSL)
         target_link_libraries(CURL::libcurl INTERFACE OpenSSL::SSL 
OpenSSL::Crypto)
     endif()
 endfunction(use_bundled_curl SOURCE_DIR BINARY_DIR)
diff --git a/cmake/MiNiFiOptions.cmake b/cmake/MiNiFiOptions.cmake
index 865a11dfe..caac0ef6d 100644
--- a/cmake/MiNiFiOptions.cmake
+++ b/cmake/MiNiFiOptions.cmake
@@ -14,6 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
+include(CMakeDependentOption)
 
 set(MINIFI_OPTIONS "")
 function(add_minifi_option OPTION_NAME OPTION_DESCRIPTION OPTION_VALUE)
@@ -44,33 +45,30 @@ add_minifi_option(PORTABLE "Instructs the compiler to 
remove architecture specif
 add_minifi_option(USE_SHARED_LIBS "Builds using shared libraries" ON)
 add_minifi_dependent_option(STATIC_BUILD "Attempts to statically link as many 
dependencies as possible." ON "NOT USE_SHARED_LIBS" OFF)
 add_minifi_option(LIBC_STATIC "Instructs the build system to statically link 
libstdc++ and glibc into minifiexe. Experiemental" OFF)
-add_minifi_option(OPENSSL_OFF "Disables OpenSSL" OFF)
+add_minifi_option(MINIFI_OPENSSL "Enables OpenSSL" ON)
 add_minifi_option(ENABLE_OPS "Enable Operations/zlib Tools" ON)
 add_minifi_option(ENABLE_JNI "Instructs the build system to enable the JNI 
extension" OFF)
-add_minifi_option(ENABLE_OPENCV "Instructs the build system to enable the 
OpenCV extension" OFF)
 add_minifi_option(ENABLE_OPC "Instructs the build system to enable the OPC 
extension" ON)
 add_minifi_option(ENABLE_NANOFI "Instructs the build system to enable nanofi 
library" OFF)
 add_minifi_option(BUILD_SHARED_LIBS "Build yaml cpp shared lib" OFF)
 
 add_minifi_option(BUILD_ROCKSDB "Instructs the build system to use RocksDB 
from the third party directory" ON)
-add_minifi_option(FORCE_WINDOWS "Instructs the build system to force Windows 
builds when WIN32 is specified" OFF)
-add_minifi_option(DISABLE_CURL "Disables libCurl Properties." OFF)
+add_minifi_option(ENABLE_CURL "Enables libCurl Properties." ON)
 
-add_minifi_option(USE_GOLD_LINKER "Use Gold Linker" OFF)
 add_minifi_option(INSTALLER_MERGE_MODULES "Creates installer with merge 
modules" OFF)
-add_minifi_option(FAIL_ON_WARNINGS "Treat warnings as errors" OFF)
-add_minifi_option(USE_REAL_ODBC_TEST_DRIVER "Use SQLite ODBC driver in SQL 
extenstion unit tests instead of a mock database" OFF)
+add_minifi_option(MINIFI_FAIL_ON_WARNINGS "Treat warnings as errors" OFF)
+add_minifi_option(MINIFI_USE_REAL_ODBC_TEST_DRIVER "Use SQLite ODBC driver in 
SQL extenstion unit tests instead of a mock database" OFF)
 # This is needed for ninja:
 # By default, neither Clang or GCC will add ANSI-formatted colors to your 
output if they detect
 # the output medium is not a terminal. This means no coloring when using a 
generator
 # different than "GNU Makefiles".
-add_minifi_option (FORCE_COLORED_OUTPUT "Always produce ANSI-colored output 
(GNU/Clang only)." FALSE)
+add_minifi_option(FORCE_COLORED_OUTPUT "Always produce ANSI-colored output 
(GNU/Clang only)." ON)
 add_minifi_option(AWS_ENABLE_UNITY_BUILD "If enabled, AWS SDK libraries will 
be built as a single, generated .cpp file. \
     This can significantly reduce static library size as well as speed up a 
single compilation time, but it is regenerated \
     and recompiled in every iterative build instance. Turn off to avoid 
recompilation." ON)
 
-add_minifi_dependent_option(ASAN_BUILD "Uses AddressSanitizer to instrument 
the code" OFF "NOT WIN32" OFF)
-add_minifi_dependent_option(ENABLE_COVERAGE "Use coverage build options and 
enable coverage build target" OFF "NOT WIN32" OFF)
+add_minifi_dependent_option(MINIFI_ADVANCED_ASAN_BUILD "Uses AddressSanitizer 
to instrument the code" OFF "NOT WIN32" OFF)
+add_minifi_dependent_option(MINIFI_ADVANCED_CODE_COVERAGE "Use coverage build 
options and enable coverage build target" OFF "NOT WIN32" OFF)
 
 # Option: STRICT_GSL_CHECKS
 # AUDIT: Enable all checks, including gsl_ExpectsAudit() and gsl_EnsuresAudit()
@@ -83,7 +81,7 @@ set_property(CACHE STRICT_GSL_CHECKS PROPERTY STRINGS 
${STRICT_GSL_CHECKS_Values
 
 if (WIN32)
     add_minifi_option(MSI_REDISTRIBUTE_UCRT_NONASL "Redistribute Universal C 
Runtime DLLs with the MSI generated by CPack. The resulting MSI is not 
distributable under Apache 2.0." OFF)
-    add_minifi_option(ENABLE_WEL "Enables the suite of Windows Event Log 
extensions." OFF)
+    add_minifi_option(ENABLE_WEL "Enables the suite of Windows Event Log 
extensions." ON)
     add_minifi_option(ENABLE_PDH "Enables PDH support." OFF)
     add_minifi_option(ENABLE_SMB "Enables SMB support." ON)
 endif()
@@ -92,19 +90,20 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
     add_minifi_option(ENABLE_SYSTEMD "Enables the systemd extension." ON)
 endif()
 
-add_minifi_option(DISABLE_EXPRESSION_LANGUAGE "Disables expression language." 
OFF)
-add_minifi_option(DISABLE_CIVET "Disables CivetWeb components." OFF)
-add_minifi_option(DISABLE_ROCKSDB "Disables the RocksDB extension." OFF)
-add_minifi_option(DISABLE_LIBARCHIVE "Disables the lib archive extensions." 
OFF)
-add_minifi_option(DISABLE_LZMA "Disables the liblzma build" OFF)
-add_minifi_option(DISABLE_BZIP2 "Disables the bzip2 build" OFF)
+add_minifi_option(ENABLE_ALL "Enables all extensions" OFF)
+add_minifi_option(ENABLE_EXPRESSION_LANGUAGE "Enables expression language." ON)
+add_minifi_option(ENABLE_CIVET "Enables CivetWeb components." ON)
+add_minifi_option(ENABLE_ROCKSDB "Enables the RocksDB extension." ON)
+add_minifi_option(ENABLE_LIBARCHIVE "Enables the lib archive extensions." ON)
+add_minifi_option(ENABLE_LZMA "Enables the liblzma build" ON)
+add_minifi_option(ENABLE_BZIP2 "Enables the bzip2 build" ON)
 add_minifi_option(ENABLE_GPS "Enables the GPS extension." OFF)
 add_minifi_option(ENABLE_COAP "Enables the CoAP extension." OFF)
 add_minifi_option(ENABLE_SQL "Enables the SQL Suite of Tools." ON)
 add_minifi_option(ENABLE_MQTT "Enables the mqtt extension." ON)
 add_minifi_option(ENABLE_PCAP "Enables the PCAP extension." OFF)
 add_minifi_option(ENABLE_LIBRDKAFKA "Enables the librdkafka extension." ON)
-add_minifi_option(ENABLE_LUA_SCRIPTING "Enables lua scripting" ON)
+add_minifi_option(ENABLE_LUA_SCRIPTING "Enables lua scripting" OFF)
 add_minifi_option(ENABLE_PYTHON_SCRIPTING "Enables python scripting" ON)
 add_minifi_option(ENABLE_SENSORS "Enables the Sensors package." OFF)
 add_minifi_option(ENABLE_USB_CAMERA "Enables USB camera support." OFF)
@@ -123,8 +122,7 @@ add_minifi_option(ENABLE_TEST_PROCESSORS "Enables test 
processors" OFF)
 add_minifi_option(ENABLE_PROMETHEUS "Enables Prometheus support." ON)
 add_minifi_option(ENABLE_GRAFANA_LOKI "Enable Grafana Loki support" OFF)
 add_minifi_option(ENABLE_GRPC_FOR_LOKI "Enable gRPC for Grafana Loki 
extension" ON)
-add_minifi_option(DISABLE_JEMALLOC "Disables jemalloc." OFF)
-add_minifi_dependent_option(ENABLE_CONTROLLER "Enables the build of MiNiFi 
controller binary." ON "NOT DISABLE_CURL" OFF)
+add_minifi_dependent_option(ENABLE_CONTROLLER "Enables the build of MiNiFi 
controller binary." ON "ENABLE_CURL" OFF)
 
 set_minifi_cache_variable(CUSTOM_MALLOC OFF "Overwrite malloc implementation.")
 set_property(CACHE CUSTOM_MALLOC PROPERTY STRINGS "jemalloc" "mimalloc" 
"rpmalloc" OFF)
@@ -147,5 +145,14 @@ function(get_minifi_docker_options RET_VALUE)
     set(${RET_VALUE} ${MINIFI_DOCKER_OPTIONS_STR} PARENT_SCOPE)
 endfunction()
 
+
+function(print_minifi_options)
+    foreach(option ${MINIFI_OPTIONS})
+        message(STATUS "  MiNiFi Option: ${option}: ${${option}}")
+    endforeach()
+endfunction()
+
 set(MINIFI_DOCKER_OPTIONS_STR "")
 get_minifi_docker_options(MINIFI_DOCKER_OPTIONS_STR)
+list(SORT MINIFI_OPTIONS)
+print_minifi_options()
diff --git a/cmake/PahoMqttC.cmake b/cmake/PahoMqttC.cmake
index 9f41dc2ad..bc744c5ca 100644
--- a/cmake/PahoMqttC.cmake
+++ b/cmake/PahoMqttC.cmake
@@ -22,7 +22,7 @@ set(PAHO_BUILD_STATIC ON CACHE BOOL "" FORCE)
 set(PAHO_BUILD_SHARED OFF CACHE BOOL "" FORCE)
 set(PAHO_ENABLE_TESTING OFF CACHE BOOL "" FORCE)
 
-if (OPENSSL_OFF)
+if (NOT MINIFI_OPENSSL)
     set(PAHO_WITH_SSL OFF CACHE BOOL "" FORCE)
 else()
     set(PAHO_WITH_SSL ON CACHE BOOL "" FORCE)
@@ -42,7 +42,7 @@ FetchContent_Declare(
 FetchContent_MakeAvailable(paho.mqtt.c-external)
 
 # Set dependencies and target to link to
-if (NOT OPENSSL_OFF)
+if (MINIFI_OPENSSL)
     add_library(paho.mqtt.c ALIAS paho-mqtt3as-static)
     add_dependencies(common_ssl_obj_static OpenSSL::SSL OpenSSL::Crypto)
 else()
diff --git a/cmake/prep_for_win_package.cmake b/cmake/prep_for_win_package.cmake
new file mode 100644
index 000000000..7bafff193
--- /dev/null
+++ b/cmake/prep_for_win_package.cmake
@@ -0,0 +1 @@
+file(COPY "${CPACK_PACKAGE_DIRECTORY}/bin/minifi.exe" DESTINATION 
"${CPACK_PACKAGE_DIRECTORY}/minifi_main")
diff --git a/controller/CMakeLists.txt b/controller/CMakeLists.txt
index 1e632584c..bea1c7eea 100644
--- a/controller/CMakeLists.txt
+++ b/controller/CMakeLists.txt
@@ -59,6 +59,3 @@ if (NOT WIN32)
 endif()
 
 install(TARGETS minificontroller RUNTIME DESTINATION bin COMPONENT bin)
-
-add_custom_command(TARGET minificontroller POST_BUILD
-    COMMAND cat ${CMAKE_BINARY_DIR}/all.log)
diff --git a/extensions/civetweb/CMakeLists.txt 
b/extensions/civetweb/CMakeLists.txt
index 391054073..0eab2b98c 100644
--- a/extensions/civetweb/CMakeLists.txt
+++ b/extensions/civetweb/CMakeLists.txt
@@ -17,7 +17,7 @@
 # under the License.
 #
 
-if (DISABLE_CIVET)
+if (NOT ENABLE_CIVET)
     return()
 endif()
 
diff --git a/extensions/civetweb/tests/CMakeLists.txt 
b/extensions/civetweb/tests/CMakeLists.txt
index 5452f2836..180617872 100644
--- a/extensions/civetweb/tests/CMakeLists.txt
+++ b/extensions/civetweb/tests/CMakeLists.txt
@@ -17,7 +17,7 @@
 # under the License.
 #
 
-if(NOT DISABLE_CURL)
+if(ENABLE_CURL)
     file(GLOB CIVETWEB_INTEGRATION_TESTS "*.cpp")
     SET(CIVETWEB-EXTENSIONS_TEST_COUNT 0)
     FOREACH(testfile ${CIVETWEB_INTEGRATION_TESTS})
diff --git a/extensions/coap/tests/CMakeLists.txt 
b/extensions/coap/tests/CMakeLists.txt
index cbea3b4a4..de962ee56 100644
--- a/extensions/coap/tests/CMakeLists.txt
+++ b/extensions/coap/tests/CMakeLists.txt
@@ -21,7 +21,7 @@ file(GLOB COAP_INTEGRATION_TESTS "*.cpp")
 
 SET(CURL_INT_TEST_COUNT 0)
 
-if (NOT DISABLE_CURL)
+if (ENABLE_CURL)
     FOREACH(testfile ${COAP_INTEGRATION_TESTS})
         get_filename_component(testfilename "${testfile}" NAME_WE)
         add_minifi_executable("${testfilename}" "${testfile}")
diff --git a/extensions/expression-language/CMakeLists.txt 
b/extensions/expression-language/CMakeLists.txt
index 5fe897071..0b357cea1 100644
--- a/extensions/expression-language/CMakeLists.txt
+++ b/extensions/expression-language/CMakeLists.txt
@@ -17,7 +17,7 @@
 # under the License.
 #
 
-if (DISABLE_EXPRESSION_LANGUAGE)
+if (NOT ENABLE_EXPRESSION_LANGUAGE)
     return()
 endif()
 
diff --git a/extensions/expression-language/Expression.cpp 
b/extensions/expression-language/Expression.cpp
index b7e8152c9..8c651c31f 100644
--- a/extensions/expression-language/Expression.cpp
+++ b/extensions/expression-language/Expression.cpp
@@ -35,7 +35,7 @@
 #include "expression/Expression.h"
 #include "utils/RegexUtils.h"
 
-#ifndef DISABLE_CURL
+#ifdef ENABLE_CURL
 #ifdef WIN32
 #pragma comment(lib, "wldap32.lib" )
 #pragma comment(lib, "crypt32.lib" )
@@ -702,7 +702,7 @@ Value expr_unescapeCsv(const std::vector<Value> &args) {
 }
 
 Value expr_urlEncode(const std::vector<Value> &args) {
-#ifndef DISABLE_CURL
+#ifdef ENABLE_CURL
   auto arg_0 = args[0].asString();
   CURL *curl = curl_easy_init();
   if (curl != nullptr) {
@@ -725,7 +725,7 @@ Value expr_urlEncode(const std::vector<Value> &args) {
 }
 
 Value expr_urlDecode(const std::vector<Value> &args) {
-#ifndef DISABLE_CURL
+#ifdef ENABLE_CURL
   auto arg_0 = args[0].asString();
   CURL *curl = curl_easy_init();
   if (curl != nullptr) {
diff --git a/extensions/expression-language/tests/CMakeLists.txt 
b/extensions/expression-language/tests/CMakeLists.txt
index 10688c874..c427efa28 100644
--- a/extensions/expression-language/tests/CMakeLists.txt
+++ b/extensions/expression-language/tests/CMakeLists.txt
@@ -31,7 +31,7 @@ FOREACH(testfile ${EXPRESSION_LANGUAGE_TESTS})
     target_include_directories(${testfilename} BEFORE PRIVATE 
"${CMAKE_SOURCE_DIR}/extensions/expression-language")
     createTests(${testfilename})
     target_link_libraries(${testfilename} Catch2WithMain)
-    if(NOT DISABLE_CURL)
+    if(ENABLE_CURL)
         target_link_libraries(${testfilename} CURL::libcurl)
     endif()
     target_link_libraries(${testfilename} 
minifi-expression-language-extensions)
@@ -57,7 +57,7 @@ FOREACH(testfile ${INT_EXPRESSION_LANGUAGE_TESTS})
     target_include_directories(${testfilename} BEFORE PRIVATE 
"${CMAKE_SOURCE_DIR}/extensions/standard-processors/processors")
     target_include_directories(${testfilename} BEFORE PRIVATE 
"${CMAKE_SOURCE_DIR}/extensions/expression-language")
     createTests(${testfilename})
-    if(NOT DISABLE_CURL)
+    if(ENABLE_CURL)
         target_link_libraries(${testfilename} CURL::libcurl)
     endif()
     target_link_libraries(${testfilename} 
minifi-expression-language-extensions)
diff --git a/extensions/expression-language/tests/ExpressionLanguageTests.cpp 
b/extensions/expression-language/tests/ExpressionLanguageTests.cpp
index ef75b7b24..7882e523e 100644
--- a/extensions/expression-language/tests/ExpressionLanguageTests.cpp
+++ b/extensions/expression-language/tests/ExpressionLanguageTests.cpp
@@ -20,7 +20,7 @@
 
 #include <memory>
 #include <string>
-#ifndef DISABLE_CURL
+#ifdef ENABLE_CURL
 #ifdef WIN32
 #ifdef _DEBUG
 #pragma comment(lib, "libcurl-d.lib")
@@ -1215,7 +1215,7 @@ TEST_CASE("Encode Decode CSV", 
"[expressionEncodeDecodeCSV]") {
   REQUIRE("Zero > One < \"two!\" & 'true'" == expr(expression::Parameters{ 
flow_file_a.get() }).asString());
 }
 
-#ifndef DISABLE_CURL
+#ifdef ENABLE_CURL
 TEST_CASE("Encode URL", "[expressionEncodeURL]") {
   auto expr = expression::compile("${message:urlEncode()}");
 
diff --git a/extensions/grafana-loki/CMakeLists.txt 
b/extensions/grafana-loki/CMakeLists.txt
index e66bc033d..27a738d64 100644
--- a/extensions/grafana-loki/CMakeLists.txt
+++ b/extensions/grafana-loki/CMakeLists.txt
@@ -42,8 +42,10 @@ if (ENABLE_GRPC_FOR_LOKI)
         ${LOKI_PROTOBUF_GENERATED_DIR}/grafana-loki-push.pb.cc
     )
 
-    
set_source_files_properties(${LOKI_PROTOBUF_GENERATED_DIR}/grafana-loki-push.grpc.pb.cc
 PROPERTIES COMPILE_FLAGS -Wno-error)
-    
set_source_files_properties(${LOKI_PROTOBUF_GENERATED_DIR}/grafana-loki-push.pb.cc
 PROPERTIES COMPILE_FLAGS -Wno-error)
+    if (NOT WIN32)
+        
set_source_files_properties(${LOKI_PROTOBUF_GENERATED_DIR}/grafana-loki-push.grpc.pb.cc
 PROPERTIES COMPILE_FLAGS -Wno-error)
+        
set_source_files_properties(${LOKI_PROTOBUF_GENERATED_DIR}/grafana-loki-push.pb.cc
 PROPERTIES COMPILE_FLAGS -Wno-error)
+    endif()
 else()
     set(SOURCES
         ${CMAKE_CURRENT_SOURCE_DIR}/PushGrafanaLoki.cpp
diff --git a/extensions/grafana-loki/tests/PushGrafanaLokiRESTTest.cpp 
b/extensions/grafana-loki/tests/PushGrafanaLokiRESTTest.cpp
index fec25d5f8..4299dd7d9 100644
--- a/extensions/grafana-loki/tests/PushGrafanaLokiRESTTest.cpp
+++ b/extensions/grafana-loki/tests/PushGrafanaLokiRESTTest.cpp
@@ -22,6 +22,11 @@
 #include "utils/StringUtils.h"
 #include "utils/TestUtils.h"
 
+#ifdef WIN32
+#pragma push_macro("GetObject")
+#undef GetObject  // windows.h #defines GetObject = GetObjectA or GetObjectW, 
which conflicts with rapidjson
+#endif
+
 namespace org::apache::nifi::minifi::extensions::grafana::loki::test {
 
 TEST_CASE("Url property is required", "[PushGrafanaLokiREST]") {
@@ -295,3 +300,7 @@ TEST_CASE_METHOD(PushGrafanaLokiRESTTestFixture, "Bearer 
token is set for authen
 }
 
 }  // namespace org::apache::nifi::minifi::extensions::grafana::loki::test
+
+#ifdef WIN32
+#pragma pop_macro("GetObject")
+#endif
diff --git a/extensions/http-curl/CMakeLists.txt 
b/extensions/http-curl/CMakeLists.txt
index 23fef0ae1..47c182d50 100644
--- a/extensions/http-curl/CMakeLists.txt
+++ b/extensions/http-curl/CMakeLists.txt
@@ -17,7 +17,7 @@
 # under the License.
 #
 
-if (DISABLE_CURL OR DISABLE_CIVET)
+if (NOT ENABLE_CURL OR NOT ENABLE_CIVET)
     return()
 endif()
 
diff --git a/extensions/http-curl/tests/CMakeLists.txt 
b/extensions/http-curl/tests/CMakeLists.txt
index 315758cc7..250b82ca5 100644
--- a/extensions/http-curl/tests/CMakeLists.txt
+++ b/extensions/http-curl/tests/CMakeLists.txt
@@ -77,7 +77,7 @@ add_test(NAME C2DescribeCoreComponentStateTest COMMAND 
C2DescribeCoreComponentSt
 add_test(NAME C2FailedUpdateTest COMMAND C2FailedUpdateTest 
"${TEST_RESOURCES}/TestHTTPGet.yml" "${TEST_RESOURCES}/" 
"${TEST_RESOURCES}/TestBad.yml")
 add_test(NAME C2NullConfiguration COMMAND C2NullConfiguration 
"${TEST_RESOURCES}/TestNull.yml"  "${TEST_RESOURCES}/")
 add_test(NAME C2RequestClassTest COMMAND C2RequestClassTest)
-if (NOT OPENSSL_OFF)
+if (MINIFI_OPENSSL)
     add_test(NAME VerifyInvokeHTTPGetTestSecure COMMAND 
VerifyInvokeHTTPGetTest "${TEST_RESOURCES}/TestHTTPGetSecure.yml"  
"${TEST_RESOURCES}/")
     add_test(NAME C2VerifyHeartbeatAndStopSecure COMMAND 
C2VerifyHeartbeatAndStop "${TEST_RESOURCES}/C2VerifyHeartbeatAndStopSecure.yml" 
"${TEST_RESOURCES}/")
     add_test(NAME C2VerifyLightweightHeartbeatAndStopSecure COMMAND 
C2VerifyLightweightHeartbeatAndStop 
"${TEST_RESOURCES}/C2VerifyHeartbeatAndStopSecure.yml" "${TEST_RESOURCES}/")
@@ -99,7 +99,7 @@ add_test(NAME VerifyInvokeHTTPPostTest COMMAND 
VerifyInvokeHTTPPostTest "${TEST_
 add_test(NAME AbsoluteTimeoutTest COMMAND AbsoluteTimeoutTest)
 add_test(NAME C2PauseResumeTest COMMAND C2PauseResumeTest 
"${TEST_RESOURCES}/C2PauseResumeTest.yml")
 add_test(NAME C2LogHeartbeatTest COMMAND C2LogHeartbeatTest)
-if (NOT DISABLE_LIBARCHIVE)
+if (ENABLE_LIBARCHIVE)
     add_test(NAME C2DebugBundleTest COMMAND C2DebugBundleTest)
 endif()
 add_test(NAME C2PropertiesUpdateTests COMMAND C2PropertiesUpdateTests)
diff --git a/extensions/kubernetes/CMakeLists.txt 
b/extensions/kubernetes/CMakeLists.txt
index 51223197d..128e644d9 100644
--- a/extensions/kubernetes/CMakeLists.txt
+++ b/extensions/kubernetes/CMakeLists.txt
@@ -14,7 +14,7 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
-if (NOT (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND (ENABLE_ALL OR 
ENABLE_KUBERNETES)) OR OPENSSL_OFF)
+if (NOT (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND (ENABLE_ALL OR 
ENABLE_KUBERNETES)) OR NOT MINIFI_OPENSSL)
     return()
 endif()
 
diff --git a/extensions/libarchive/CMakeLists.txt 
b/extensions/libarchive/CMakeLists.txt
index 5cd813bea..57b81d08d 100644
--- a/extensions/libarchive/CMakeLists.txt
+++ b/extensions/libarchive/CMakeLists.txt
@@ -17,11 +17,11 @@
 # under the License.
 #
 
-if (DISABLE_LIBARCHIVE)
+if (NOT ENABLE_LIBARCHIVE)
     return()
 endif()
 
-if (NOT DISABLE_LZMA)
+if (ENABLE_LZMA)
     include(BundledLibLZMA)
     use_bundled_liblzma(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR})
     list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/liblzma/dummy")
diff --git a/extensions/openwsman/CMakeLists.txt 
b/extensions/openwsman/CMakeLists.txt
index 5c9e3846d..f7152cad9 100644
--- a/extensions/openwsman/CMakeLists.txt
+++ b/extensions/openwsman/CMakeLists.txt
@@ -17,7 +17,7 @@
 # under the License.
 #
 
-if (NOT ((ENABLE_ALL OR ENABLE_OPENWSMAN) AND NOT DISABLE_CIVET AND NOT 
DISABLE_CURL))
+if (WIN32 OR NOT ((ENABLE_ALL OR ENABLE_OPENWSMAN) AND ENABLE_CIVET AND 
ENABLE_CURL))
     return()
 endif()
 
diff --git a/extensions/pcap/CMakeLists.txt b/extensions/pcap/CMakeLists.txt
index de505274c..bb71aa308 100644
--- a/extensions/pcap/CMakeLists.txt
+++ b/extensions/pcap/CMakeLists.txt
@@ -52,10 +52,10 @@ endif ()
 set(PCAPPLUSPLUS_LIB_DIR "${PCAPPLUSPLUS_BASE_DIR}/Dist")
 
 add_custom_target(
-        pcappp
-        COMMAND make libs
-        BYPRODUCTS ${PCAPPLUSPLUS_LIB_DIR}/libPcap++.a 
${PCAPPLUSPLUS_LIB_DIR}/libPacket++.a ${PCAPPLUSPLUS_LIB_DIR}/libCommon++.a
-        WORKING_DIRECTORY ${PCAPPLUSPLUS_BASE_DIR}
+    pcappp
+    COMMAND make libs
+    BYPRODUCTS ${PCAPPLUSPLUS_LIB_DIR}/libPcap++.a 
${PCAPPLUSPLUS_LIB_DIR}/libPacket++.a ${PCAPPLUSPLUS_LIB_DIR}/libCommon++.a
+    WORKING_DIRECTORY ${PCAPPLUSPLUS_BASE_DIR}
 )
 
 file(GLOB SOURCES  "*.cpp")
diff --git a/extensions/rocksdb-repos/CMakeLists.txt 
b/extensions/rocksdb-repos/CMakeLists.txt
index 2cae1e31c..e9d0a7af8 100644
--- a/extensions/rocksdb-repos/CMakeLists.txt
+++ b/extensions/rocksdb-repos/CMakeLists.txt
@@ -17,7 +17,7 @@
 # under the License.
 #
 
-if (DISABLE_ROCKSDB)
+if (NOT ENABLE_ROCKSDB)
     return()
 endif()
 
diff --git a/extensions/sftp/CMakeLists.txt b/extensions/sftp/CMakeLists.txt
index 1d6c3c44b..169c7f8cc 100644
--- a/extensions/sftp/CMakeLists.txt
+++ b/extensions/sftp/CMakeLists.txt
@@ -17,7 +17,7 @@
 # under the License.
 #
 
-if (NOT ((ENABLE_ALL OR ENABLE_SFTP) AND NOT DISABLE_CURL))
+if (NOT ((ENABLE_ALL OR ENABLE_SFTP) AND ENABLE_CURL))
     return()
 endif()
 
diff --git a/extensions/sftp/tests/CMakeLists.txt 
b/extensions/sftp/tests/CMakeLists.txt
index 90491d78a..5dd84b348 100644
--- a/extensions/sftp/tests/CMakeLists.txt
+++ b/extensions/sftp/tests/CMakeLists.txt
@@ -23,7 +23,7 @@ find_package(Maven)
 message(STATUS "JAVA_HOME: '$ENV{JAVA_HOME}'")
 message(STATUS "MAVEN: ${MAVEN_EXECUTABLE}")
 
-if (NOT SKIP_TESTS AND Java_FOUND AND Maven_FOUND AND NOT 
DISABLE_EXPRESSION_LANGUAGE)
+if (NOT SKIP_TESTS AND Java_FOUND AND Maven_FOUND AND 
ENABLE_EXPRESSION_LANGUAGE)
     file(GLOB SFTP_INTEGRATION_TESTS "*.cpp")
     SET(SFTP-EXTENSIONS_TEST_COUNT 0)
     FOREACH(testfile ${SFTP_INTEGRATION_TESTS})
@@ -46,7 +46,7 @@ if (NOT SKIP_TESTS AND Java_FOUND AND Maven_FOUND AND NOT 
DISABLE_EXPRESSION_LAN
         target_link_libraries(${testfilename} minifi-sftp)
         target_link_libraries(${testfilename} 
minifi-expression-language-extensions)
         target_link_libraries(${testfilename} minifi-standard-processors)
-        if (NOT DISABLE_ROCKSDB)
+        if (ENABLE_ROCKSDB)
             target_link_libraries(${testfilename} minifi-rocksdb-repos)
         endif()
 
diff --git a/extensions/sql/tests/SQLTestController.h 
b/extensions/sql/tests/SQLTestController.h
index f89c7f0d1..a590acfdb 100644
--- a/extensions/sql/tests/SQLTestController.h
+++ b/extensions/sql/tests/SQLTestController.h
@@ -34,7 +34,7 @@
 #include "processors/QueryDatabaseTable.h"
 #include "SQLTestPlan.h"
 
-#ifdef USE_REAL_ODBC_TEST_DRIVER
+#ifdef MINIFI_USE_REAL_ODBC_TEST_DRIVER
 #include "services/ODBCConnector.h"
 using ODBCConnection = minifi::sql::ODBCConnection;
 #else
diff --git a/extensions/sql/tests/SQLTestPlan.h 
b/extensions/sql/tests/SQLTestPlan.h
index 984207b11..81854fbc9 100644
--- a/extensions/sql/tests/SQLTestPlan.h
+++ b/extensions/sql/tests/SQLTestPlan.h
@@ -30,7 +30,7 @@
 #include "Catch.h"
 #include "processors/SQLProcessor.h"
 
-#ifdef USE_REAL_ODBC_TEST_DRIVER
+#ifdef MINIFI_USE_REAL_ODBC_TEST_DRIVER
 static const std::string ODBC_SERVICE = "ODBCService";
 #else
 #include "mocks/MockODBCService.h"
diff --git a/extensions/standard-processors/tests/CMakeLists.txt 
b/extensions/standard-processors/tests/CMakeLists.txt
index 8095b873c..6defa1a98 100644
--- a/extensions/standard-processors/tests/CMakeLists.txt
+++ b/extensions/standard-processors/tests/CMakeLists.txt
@@ -44,7 +44,7 @@ FOREACH(testfile ${PROCESSOR_UNIT_TESTS})
     target_link_libraries(${testfilename} minifi-standard-processors)
     target_link_libraries(${testfilename} minifi-civet-extensions)
     target_compile_definitions("${testfilename}" PRIVATE 
JOLT_TESTS_DIR="${jolt_tests_SOURCE_DIR}/jolt-core/src/test/resources/json/shiftr")
-    if (NOT DISABLE_ROCKSDB)
+    if (ENABLE_ROCKSDB)
         target_link_libraries(${testfilename} minifi-rocksdb-repos)
     endif()
     add_test(NAME "${testfilename}" COMMAND "${testfilename}" 
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
@@ -69,7 +69,7 @@ FOREACH(testfile ${PROCESSOR_INTEGRATION_TESTS})
     target_link_libraries(${testfilename} minifi-standard-processors)
     target_link_libraries(${testfilename} minifi-civet-extensions)
     target_compile_definitions("${testfilename}" PRIVATE 
TZ_DATA_DIR="${CMAKE_BINARY_DIR}/tzdata")
-    if (NOT DISABLE_ROCKSDB)
+    if (ENABLE_ROCKSDB)
         target_link_libraries(${testfilename} minifi-rocksdb-repos)
     endif()
 
diff --git a/libminifi/CMakeLists.txt b/libminifi/CMakeLists.txt
index a7a3e966f..baf43d1fa 100644
--- a/libminifi/CMakeLists.txt
+++ b/libminifi/CMakeLists.txt
@@ -40,7 +40,7 @@ else()
     set(SOCKET_SOURCES "src/io/posix/*.cpp")
 endif()
 
-if (NOT OPENSSL_OFF)
+if (MINIFI_OPENSSL)
     set(TLS_SOURCES "src/utils/tls/*.cpp" "src/io/tls/*.cpp")
 endif()
 
@@ -82,7 +82,7 @@ list(APPEND LIBMINIFI_LIBRARIES yaml-cpp ZLIB::ZLIB 
concurrentqueue RapidJSON sp
 if(NOT WIN32)
     list(APPEND LIBMINIFI_LIBRARIES OSSP::libuuid++)
 endif()
-if (NOT OPENSSL_OFF)
+if (MINIFI_OPENSSL)
     list(APPEND LIBMINIFI_LIBRARIES OpenSSL::Crypto OpenSSL::SSL)
 endif()
 if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION 
VERSION_LESS 9)
diff --git a/libminifi/test/flow-tests/CMakeLists.txt 
b/libminifi/test/flow-tests/CMakeLists.txt
index e9c7e6bd6..092f0e8df 100644
--- a/libminifi/test/flow-tests/CMakeLists.txt
+++ b/libminifi/test/flow-tests/CMakeLists.txt
@@ -28,7 +28,7 @@ FOREACH(testfile ${FLOW_TESTS})
     target_include_directories(${testfilename} PRIVATE BEFORE 
"${CMAKE_SOURCE_DIR}/extensions/standard-processors/")
     createTests("${testfilename}")
     target_link_libraries(${testfilename} minifi-standard-processors)
-    if (NOT DISABLE_ROCKSDB)
+    if (ENABLE_ROCKSDB)
         target_link_libraries(${testfilename} minifi-rocksdb-repos)
     endif()
 
diff --git a/libminifi/test/keyvalue-tests/CMakeLists.txt 
b/libminifi/test/keyvalue-tests/CMakeLists.txt
index 1b2af80de..2225f3a34 100644
--- a/libminifi/test/keyvalue-tests/CMakeLists.txt
+++ b/libminifi/test/keyvalue-tests/CMakeLists.txt
@@ -27,7 +27,7 @@ FOREACH(testfile ${KEYVALUE_TESTS})
     target_include_directories(${testfilename} PRIVATE BEFORE 
"${CMAKE_SOURCE_DIR}/libminifi/test/")
     createTests("${testfilename}")
     target_link_libraries(${testfilename} minifi-standard-processors Catch2)
-    if (NOT DISABLE_ROCKSDB)
+    if (ENABLE_ROCKSDB)
         target_link_libraries(${testfilename} minifi-rocksdb-repos)
     endif()
 
@@ -37,7 +37,7 @@ ENDFOREACH()
 message("-- Finished building ${KEYVALUE_INT_TEST_COUNT} keyvalue controller 
test file(s)...")
 
 add_test(NAME PersistentMapStateStorageTest COMMAND PersistentStateStorageTest 
--config-yaml "${TEST_RESOURCES}/PersistentMapStateStorage.yml")
-if (NOT DISABLE_ROCKSDB)
+if (ENABLE_ROCKSDB)
     add_test(NAME RocksDbStateStorageTest COMMAND PersistentStateStorageTest 
--config-yaml "${TEST_RESOURCES}/RocksDbStateStorage.yml")
 endif()
 add_test(NAME VolatileMapStateStorageTest COMMAND VolatileMapStateStorageTest 
--config-yaml "${TEST_RESOURCES}/VolatileMapStateStorage.yml")
diff --git a/nanofi/CMakeLists.txt b/nanofi/CMakeLists.txt
index ec50ed3d5..d8fe2c99a 100644
--- a/nanofi/CMakeLists.txt
+++ b/nanofi/CMakeLists.txt
@@ -44,7 +44,7 @@ add_minifi_library(nanofi STATIC ${NANOFI_SOURCES})
 
 target_link_libraries(nanofi spdlog ut core-minifi minifi-standard-processors)
 
-if (NOT DISABLE_CURL)
+if (ENABLE_CURL)
     add_subdirectory(examples)
     add_subdirectory(ecu)
 endif()
diff --git a/run_shellcheck.sh b/run_shellcheck.sh
index 6f1430a73..f23fc3a5d 100755
--- a/run_shellcheck.sh
+++ b/run_shellcheck.sh
@@ -19,4 +19,4 @@
 set -euo pipefail
 
 directory=${1:-.}
-find "${directory}" -type d \( -path "*thirdparty*" -o -path "*build*" \) 
-prune -false -o -type f -name "*.sh" | xargs shellcheck --exclude=SC1090,SC1091
+find "${directory}" -type d \( -path "*thirdparty*" -o -path "*build*" -o 
-path "*venv*" \) -prune -false -o -type f -name "*.sh" | xargs shellcheck 
--exclude=SC1090,SC1091
diff --git a/win_build_vs.bat b/win_build_vs.bat
old mode 100755
new mode 100644
index 50b5250b4..c388fb7b0
--- a/win_build_vs.bat
+++ b/win_build_vs.bat
@@ -117,14 +117,14 @@ if [%generator%] EQU ["Ninja"] (
     set "build_platform_cmd=-A %build_platform%"
 )
 echo on
-cmake -G %generator% %build_platform_cmd% 
-DINSTALLER_MERGE_MODULES=%installer_merge_modules% 
-DTEST_CUSTOM_WEL_PROVIDER=%test_custom_wel_provider% -DENABLE_SQL=%enable_sql% 
-DUSE_REAL_ODBC_TEST_DRIVER=%real_odbc% ^
-        -DCMAKE_BUILD_TYPE_INIT=%cmake_build_type% 
-DCMAKE_BUILD_TYPE=%cmake_build_type% -DWIN32=WIN32 
-DENABLE_LIBRDKAFKA=%enable_kafka% -DENABLE_JNI=%enable_jni% -DOPENSSL_OFF=OFF ^
+cmake -G %generator% %build_platform_cmd% 
-DINSTALLER_MERGE_MODULES=%installer_merge_modules% 
-DTEST_CUSTOM_WEL_PROVIDER=%test_custom_wel_provider% -DENABLE_SQL=%enable_sql% 
-DMINIFI_USE_REAL_ODBC_TEST_DRIVER=%real_odbc% ^
+        -DCMAKE_BUILD_TYPE_INIT=%cmake_build_type% 
-DCMAKE_BUILD_TYPE=%cmake_build_type% -DWIN32=WIN32 
-DENABLE_LIBRDKAFKA=%enable_kafka% -DENABLE_JNI=%enable_jni% 
-DMINIFI_OPENSSL=ON ^
         -DENABLE_COAP=%enable_coap% -DENABLE_AWS=%enable_aws% 
-DENABLE_PDH=%enable_pdh% -DENABLE_AZURE=%enable_azure% 
-DENABLE_SFTP=%enable_sftp% -DENABLE_SPLUNK=%enable_splunk% 
-DENABLE_GCP=%enable_gcp% ^
         -DENABLE_NANOFI=%enable_nanofi% -DENABLE_OPENCV=%enable_opencv% 
-DENABLE_PROMETHEUS=%enable_prometheus% -DENABLE_ELASTICSEARCH=%enable_elastic% 
-DUSE_SHARED_LIBS=OFF -DENABLE_CONTROLLER=OFF  ^
         -DENABLE_BUSTACHE=%enable_bustache% 
-DENABLE_ENCRYPT_CONFIG=%enable_encrypt_config% 
-DENABLE_LUA_SCRIPTING=%enable_lua_scripting% -DENABLE_SMB=%enable_smb% ^
         -DENABLE_MQTT=%enable_mqtt% -DENABLE_OPC=%enable_opc% 
-DENABLE_OPENWSMAN=%enable_openwsman% -DENABLE_OPS=%enable_ops% 
-DENABLE_PCAP=%enable_pcap% ^
         -DENABLE_PYTHON_SCRIPTING=%enable_python_scripting% 
-DENABLE_SENSORS=%enable_sensors% -DENABLE_USB_CAMERA=%enable_usb_camera% 
-DENABLE_GRAFANA_LOKI=%enable_grafana_loki% ^
-        -DBUILD_ROCKSDB=ON -DFORCE_WINDOWS=ON -DUSE_SYSTEM_UUID=OFF 
-DDISABLE_LIBARCHIVE=OFF -DENABLE_WEL=ON -DFAIL_ON_WARNINGS=OFF 
-DSKIP_TESTS=%skiptests% ^
+        -DBUILD_ROCKSDB=ON -DUSE_SYSTEM_UUID=OFF -DENABLE_LIBARCHIVE=ON 
-DENABLE_WEL=ON -DMINIFI_FAIL_ON_WARNINGS=OFF -DSKIP_TESTS=%skiptests% ^
         %strict_gsl_checks% %redist% %sccache_arg% %EXTRA_CMAKE_ARGUMENTS% 
"%scriptdir%" && %buildcmd%
 IF %ERRORLEVEL% NEQ 0 EXIT /b %ERRORLEVEL%
 if [%cpack%] EQU [ON] (

Reply via email to