From dc9dc62b2bab7ad6e1b235dd3e3f730566b11fc1 Mon Sep 17 00:00:00 2001
From: WolverinDEV <git@mcgalaxy.de>
Date: Tue, 2 Jul 2019 02:23:51 +0200
Subject: [PATCH] A lot of fixes for the automatic build system

---
 .gitignore                                    |  1 +
 .gitmodules                                   |  3 +
 build_shared.sh                               | 34 +++++++++++
 cmake/FindBreakpad.cmake                      |  5 +-
 cmake/FindDataPipes.cmake                     | 14 ++---
 cmake/FindEd25519.cmake                       | 18 +++---
 cmake/FindOpus.cmake                          | 15 +++--
 cmake/FindPortAudio.cmake                     | 15 +++--
 cmake/FindSoxr.cmake                          | 19 +++---
 cmake/FindStringVariable.cmake                | 14 ++---
 cmake/FindTeaSpeak_SharedLib.cmake            |  4 +-
 cmake/FindThreadPool.cmake                    | 15 +++--
 cmake/FindTomCrypt.cmake                      | 14 ++---
 cmake/FindTomMath.cmake                       | 15 ++---
 cmake/Findfvad.cmake                          | 15 +++--
 .../{ => config}/libraries_wolverin_lap.cmake |  3 +
 cmake/config/tearoot-client.cmake             | 23 ++++++++
 cmake/tearoot-helper.cmake                    | 34 +++++++++++
 helper.txt                                    | 11 +++-
 scripts/build_helper.sh                       | 59 ++++++++++++++++---
 shared                                        |  1 +
 third_party/boringssl                         |  2 +-
 third_party/build.sh                          | 38 ++----------
 23 files changed, 241 insertions(+), 131 deletions(-)
 create mode 100755 build_shared.sh
 rename cmake/{ => config}/libraries_wolverin_lap.cmake (91%)
 create mode 100644 cmake/config/tearoot-client.cmake
 create mode 100644 cmake/tearoot-helper.cmake
 create mode 160000 shared

diff --git a/.gitignore b/.gitignore
index 9f11b75..562b66d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
 .idea/
+out/
\ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
index e86a016..5fe1627 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -64,3 +64,6 @@
 [submodule "third_party/jemalloc"]
 	path = third_party/jemalloc
 	url = https://github.com/jemalloc/jemalloc.git
+[submodule "shared"]
+	path = shared
+	url = https://git.did.science/WolverinDEV/TeaSpeak-SharedLib.git
diff --git a/build_shared.sh b/build_shared.sh
new file mode 100755
index 0000000..ad45c3b
--- /dev/null
+++ b/build_shared.sh
@@ -0,0 +1,34 @@
+#!/usr/bin/env bash
+
+# Enter third_party/ directory
+cd $(dirname $0)
+
+tearoot_cmake_config="`pwd`/cmake/config/tearoot-client.cmake"
+tearoot_cmake_module="`pwd`/cmake/"
+traroot_library="`pwd`/third_party"
+
+shared_path="shared"
+source scripts/build_helper.sh
+begin_task "build_shared" "Building shared library"
+requires_rebuild ${shared_path}
+[[ $? -eq 0 ]] && {
+    end_task "build_shared" "Shared build finished"
+    exit 0
+}
+
+generate_build_path shared
+echo "Build path: $build_path"
+if [[ -d ${build_path} ]]; then
+    echo "Deleting old build folder"
+    rm -r ${build_path}
+    check_err_exit ${shared_path} "Failed to delete old build folder"
+fi
+
+#set(CMAKE_MODULE_PATH "C:/Users/WolverinDEV/TeaSpeak/cmake")
+#include(${CMAKE_MODULE_PATH}/libraries_wolverin_lap.cmake)
+
+cmake_build ${shared_path} -DCMAKE_MODULE_PATH="$tearoot_cmake_module" -DCMAKE_PLATFORM_INCLUDE="$tearoot_cmake_config" -DLIBRARY_PATH="$traroot_library" -DBUILD_TESTS=OFF
+check_err_exit ${shared_path} "Failed to build TeaSpeak shared library!"
+set_build_successful ${shared_path}
+
+end_task "build_shared" "Shared build finished"
\ No newline at end of file
diff --git a/cmake/FindBreakpad.cmake b/cmake/FindBreakpad.cmake
index 971418d..66a6f23 100644
--- a/cmake/FindBreakpad.cmake
+++ b/cmake/FindBreakpad.cmake
@@ -18,6 +18,10 @@
 #  breakpad_SOURCE_FILES      The source files which have to be included.
 #  breakpad_HEADER_FIOLES     Header files which might be included.
 
+
+include(tearoot-helper)
+include(FindPackageHandleStandardArgs)
+
 find_path(breakpad_ROOT_DIR
         NAMES src/client/minidump_file_writer.h src/common/language.h
         HINTS ${breakpad_ROOT_DIR}
@@ -53,7 +57,6 @@ else()
 	message(FATAL_ERROR "Unknown system")
 endif()
 
-include(FindPackageHandleStandardArgs)
 find_package_handle_standard_args(breakpad DEFAULT_MSG
         breakpad_INCLUDE_DIR
 )
diff --git a/cmake/FindDataPipes.cmake b/cmake/FindDataPipes.cmake
index d759e93..5b96a48 100644
--- a/cmake/FindDataPipes.cmake
+++ b/cmake/FindDataPipes.cmake
@@ -18,29 +18,29 @@
 #  DataPipes_LIBRARIES_STATIC  The DataPipes libraries.
 #  DataPipes_LIBRARIES_SHARED  The DataPipes libraries.
 
+include(tearoot-helper)
+include(FindPackageHandleStandardArgs)
+
 find_path(DataPipes_ROOT_DIR
         NAMES include/buffer.h include/pipeline.h CMakeLists.txt
-        HINTS ${DataPipes_ROOT_DIR}
+        HINTS ${DataPipes_ROOT_DIR} ${DataPipes_ROOT_DIR}/${BUILD_OUTPUT}
 )
 
 find_path(DataPipes_INCLUDE_DIR
         NAMES pipes/pipeline.h pipes/buffer.h
-        HINTS ${DataPipes_ROOT_DIR}/out/win32/include/ ${DataPipes_ROOT_DIR}/out/win32_amd64/include/
+        HINTS ${DataPipes_ROOT_DIR}/include/
 )
 
 find_library(DataPipes_LIBRARIES_STATIC
         NAMES DataPipes.lib libDataPipes.a
-        PATH_SUFFIXES out/win32_amd64/Release out/win32/Release out/win32_x64/Release
-        HINTS ${DataPipes_ROOT_DIR} ${DataPipes_ROOT_DIR}/build ${DataPipes_ROOT_DIR}/libs ${DataPipes_ROOT_DIR}/out/
+        HINTS ${DataPipes_ROOT_DIR} ${DataPipes_ROOT_DIR}/lib
 )
 
 find_library(DataPipes_LIBRARIES_SHARED
         NAMES DataPipes.dll libDataPipes.so
-        PATH_SUFFIXES out/win32_amd64/Release out/win32/Release out/win32_x64/Release
-        HINTS ${DataPipes_ROOT_DIR} ${DataPipes_ROOT_DIR}/build ${DataPipes_ROOT_DIR}/libs ${DataPipes_ROOT_DIR}/out/
+		HINTS ${DataPipes_ROOT_DIR} ${DataPipes_ROOT_DIR}/lib
 )
 
-include(FindPackageHandleStandardArgs)
 find_package_handle_standard_args(DataPipes DEFAULT_MSG
         DataPipes_INCLUDE_DIR
 )
diff --git a/cmake/FindEd25519.cmake b/cmake/FindEd25519.cmake
index c8b9690..ed82b0e 100644
--- a/cmake/FindEd25519.cmake
+++ b/cmake/FindEd25519.cmake
@@ -18,31 +18,29 @@
 #  ed25519_LIBRARIES_STATIC  The ed25519 libraries.
 #  ed25519_LIBRARIES_SHARED  The ed25519 libraries.
 
+include(tearoot-helper)
+include(FindPackageHandleStandardArgs)
+
 find_path(ed25519_ROOT_DIR
-        NAMES include/ed25519.h CMakeLists.txt
-        HINTS ${ed25519_ROOT_DIR}
+        NAMES include/ed25519/ed25519
+		HINTS ${ed25519_ROOT_DIR} ${ed25519_ROOT_DIR}/${BUILD_OUTPUT}
 )
 
-#This NEEDS a fix!
 find_path(ed25519_INCLUDE_DIR
         NAMES ed25519/ed25519.h
-        PATH_SUFFIXES include
-        HINTS ${ed25519_ROOT_DIR} ${ed25519_ROOT_DIR}/build ${ed25519_ROOT_DIR}/libs ${ed25519_ROOT_DIR}/out/win32_amd64
+		HINTS ${ed25519_ROOT_DIR} ${ed25519_ROOT_DIR}/include/
 )
 
 find_library(ed25519_LIBRARIES_STATIC
         NAMES ed25519.lib ed25519.a
-        PATH_SUFFIXES out/win32_amd64/Release out/win32/Release out/win32_x64/Release
-        HINTS ${ed25519_ROOT_DIR} ${ed25519_ROOT_DIR}/build ${ed25519_ROOT_DIR}/libs ${ed25519_ROOT_DIR}/out/
+		HINTS ${ed25519_ROOT_DIR} ${ed25519_ROOT_DIR}/lib
 )
 
 find_library(ed25519_LIBRARIES_SHARED
         NAMES ed25519.dll ed25519.so
-        PATH_SUFFIXES out/win32_amd64/Release out/win32/Release out/win32_x64/Release
-        HINTS ${ed25519_ROOT_DIR} ${ed25519_ROOT_DIR}/build ${ed25519_ROOT_DIR}/libs ${ed25519_ROOT_DIR}/out/
+		HINTS ${ed25519_ROOT_DIR} ${ed25519_ROOT_DIR}/lib
 )
 
-include(FindPackageHandleStandardArgs)
 find_package_handle_standard_args(ed25519 DEFAULT_MSG
         ed25519_INCLUDE_DIR
 )
diff --git a/cmake/FindOpus.cmake b/cmake/FindOpus.cmake
index eafb67e..23defb5 100644
--- a/cmake/FindOpus.cmake
+++ b/cmake/FindOpus.cmake
@@ -18,30 +18,29 @@
 #  opus_LIBRARIES_STATIC  The opus libraries.
 #  opus_LIBRARIES_SHARED  The opus libraries.
 
+include(tearoot-helper)
+include(FindPackageHandleStandardArgs)
+
 find_path(opus_ROOT_DIR
         NAMES include/opus/opus.h
-        HINTS ${opus_ROOT_DIR}
+		HINTS ${opus_ROOT_DIR} ${opus_ROOT_DIR}/${BUILD_OUTPUT}
 )
 
 find_path(opus_INCLUDE_DIR
         NAMES opus/opus.h opus/opus_defines.h
-        HINTS ${opus_ROOT_DIR}/include/
+		HINTS ${opus_ROOT_DIR} ${opus_ROOT_DIR}/include/
 )
 
 find_library(opus_LIBRARIES_STATIC
         NAMES opus.a opus.lib
-        PATH_SUFFIXES lib/
-        HINTS 
-		${opus_ROOT_DIR}/lib
+		HINTS ${opus_ROOT_DIR} ${opus_ROOT_DIR}/lib
 )
 
 find_library(opus_LIBRARIES_SHARED
         NAMES opus.dll opus.so
-        PATH_SUFFIXES lib bin
-        HINTS ${opus_ROOT_DIR} ${opus_ROOT_DIR}/build ${opus_ROOT_DIR}/libs ${opus_ROOT_DIR}/out/
+		HINTS ${opus_ROOT_DIR} ${opus_ROOT_DIR}/lib
 )
 
-include(FindPackageHandleStandardArgs)
 find_package_handle_standard_args(opus DEFAULT_MSG
         opus_INCLUDE_DIR
 )
diff --git a/cmake/FindPortAudio.cmake b/cmake/FindPortAudio.cmake
index 2e2867c..8ac6385 100644
--- a/cmake/FindPortAudio.cmake
+++ b/cmake/FindPortAudio.cmake
@@ -18,30 +18,29 @@
 #  PortAudio_LIBRARIES_STATIC  The PortAudio libraries.
 #  PortAudio_LIBRARIES_SHARED  The PortAudio libraries.
 
+include(tearoot-helper)
+include(FindPackageHandleStandardArgs)
+
 find_path(PortAudio_ROOT_DIR
         NAMES include/portaudio.h
-        HINTS ${PortAudio_ROOT_DIR}
+		HINTS ${PortAudio_ROOT_DIR} ${PortAudio_ROOT_DIR}/${BUILD_OUTPUT}
 )
 
 find_path(PortAudio_INCLUDE_DIR
         NAMES portaudio.h
-        HINTS ${PortAudio_ROOT_DIR}/include/
+		HINTS ${PortAudio_ROOT_DIR} ${PortAudio_ROOT_DIR}/include/
 )
 
 find_library(PortAudio_LIBRARIES_STATIC
         NAMES portaudio_static_x64.a portaudio_static_x64.lib
-        PATH_SUFFIXES lib/
-        HINTS 
-		${PortAudio_ROOT_DIR}/lib
+		HINTS ${PortAudio_ROOT_DIR} ${PortAudio_ROOT_DIR}/lib
 )
 
 find_library(PortAudio_LIBRARIES_SHARED
         NAMES portaudio_shared_x64.dll portaudio_shared_x64.so
-        PATH_SUFFIXES lib bin
-        HINTS ${PortAudio_ROOT_DIR} ${PortAudio_ROOT_DIR}/build ${PortAudio_ROOT_DIR}/libs ${PortAudio_ROOT_DIR}/out/
+		HINTS ${PortAudio_ROOT_DIR} ${PortAudio_ROOT_DIR}/lib
 )
 
-include(FindPackageHandleStandardArgs)
 find_package_handle_standard_args(PortAudio DEFAULT_MSG
         PortAudio_INCLUDE_DIR
 )
diff --git a/cmake/FindSoxr.cmake b/cmake/FindSoxr.cmake
index 85a31ad..8d48957 100644
--- a/cmake/FindSoxr.cmake
+++ b/cmake/FindSoxr.cmake
@@ -18,34 +18,29 @@
 #  soxr_LIBRARIES_STATIC  The soxr libraries.
 #  soxr_LIBRARIES_SHARED  The soxr libraries.
 
+include(tearoot-helper)
+include(FindPackageHandleStandardArgs)
+
 find_path(soxr_ROOT_DIR
         NAMES src/Definitions.h CMakeLists.txt
-        HINTS ${soxr_ROOT_DIR}
+		HINTS ${soxr_ROOT_DIR} ${soxr_ROOT_DIR}/${BUILD_OUTPUT}
 )
 
 find_path(soxr_INCLUDE_DIR
         NAMES soxr.h
-        HINTS ${soxr_ROOT_DIR}/include/
+		HINTS ${soxr_ROOT_DIR} ${soxr_ROOT_DIR}/include/
 )
 
 find_library(soxr_LIBRARIES_STATIC
         NAMES soxr.a soxr.lib
-        PATH_SUFFIXES lib/
-        HINTS 
-		${soxr_ROOT_DIR} 
-		${soxr_ROOT_DIR}/build
-		${soxr_ROOT_DIR}/libs
-		${soxr_ROOT_DIR}/out/
-		${soxr_ROOT_DIR}/cmake-build-release
+		HINTS ${soxr_ROOT_DIR} ${soxr_ROOT_DIR}/lib
 )
 
 find_library(soxr_LIBRARIES_SHARED
         NAMES soxr.dll soxr.so
-        PATH_SUFFIXES lib bin
-        HINTS ${soxr_ROOT_DIR} ${soxr_ROOT_DIR}/build ${soxr_ROOT_DIR}/libs ${soxr_ROOT_DIR}/out/
+		HINTS ${soxr_ROOT_DIR} ${soxr_ROOT_DIR}/lib
 )
 
-include(FindPackageHandleStandardArgs)
 find_package_handle_standard_args(soxr DEFAULT_MSG
         soxr_INCLUDE_DIR
 )
diff --git a/cmake/FindStringVariable.cmake b/cmake/FindStringVariable.cmake
index 04c45f6..b3b3b51 100644
--- a/cmake/FindStringVariable.cmake
+++ b/cmake/FindStringVariable.cmake
@@ -18,29 +18,29 @@
 #  StringVariable_LIBRARIES_STATIC  The StringVariable libraries.
 #  StringVariable_LIBRARIES_SHARED  The StringVariable libraries.
 
+include(tearoot-helper)
+include(FindPackageHandleStandardArgs)
+
 find_path(StringVariable_ROOT_DIR
         NAMES include/StringVariable.h CMakeLists.txt
-        HINTS ${StringVariable_ROOT_DIR}
+		HINTS ${StringVariable_ROOT_DIR} ${StringVariable_ROOT_DIR}/${BUILD_OUTPUT}
 )
 
 find_path(StringVariable_INCLUDE_DIR
         NAMES StringVariable.h
-        HINTS ${StringVariable_ROOT_DIR}/include
+		HINTS ${StringVariable_ROOT_DIR} ${StringVariable_ROOT_DIR}/include/
 )
 
 find_library(StringVariable_LIBRARIES_STATIC
         NAMES StringVariablesStatic.lib StringVariablesStatic.a
-        PATH_SUFFIXES out/win32_amd64/Release out/win32/Release out/win32_x64/Release
-        HINTS ${StringVariable_ROOT_DIR} ${StringVariable_ROOT_DIR}/build ${StringVariable_ROOT_DIR}/libs ${StringVariable_ROOT_DIR}/out/
+		HINTS ${StringVariable_ROOT_DIR} ${StringVariable_ROOT_DIR}/lib
 )
 
 find_library(StringVariable_LIBRARIES_SHARED
         NAMES StringVariable.dll StringVariable.so
-        PATH_SUFFIXES out/win32_amd64/Release out/win32/Release out/win32_x64/Release
-        HINTS ${StringVariable_ROOT_DIR} ${StringVariable_ROOT_DIR}/build ${StringVariable_ROOT_DIR}/libs ${StringVariable_ROOT_DIR}/out/
+		HINTS ${StringVariable_ROOT_DIR} ${StringVariable_ROOT_DIR}/lib
 )
 
-include(FindPackageHandleStandardArgs)
 find_package_handle_standard_args(StringVariable DEFAULT_MSG
         StringVariable_INCLUDE_DIR
 )
diff --git a/cmake/FindTeaSpeak_SharedLib.cmake b/cmake/FindTeaSpeak_SharedLib.cmake
index 2524eba..c91c6c9 100644
--- a/cmake/FindTeaSpeak_SharedLib.cmake
+++ b/cmake/FindTeaSpeak_SharedLib.cmake
@@ -18,6 +18,9 @@
 #  TeaSpeak_SharedLib_LIBRARIES_STATIC  The TeaSpeak_SharedLib libraries.
 #  TeaSpeak_SharedLib_LIBRARIES_SHARED  The TeaSpeak_SharedLib libraries.
 
+include(tearoot-helper)
+include(FindPackageHandleStandardArgs)
+
 find_path(TeaSpeak_SharedLib_ROOT_DIR
         NAMES src/Definitions.h CMakeLists.txt
         HINTS ${TeaSpeak_SharedLib_ROOT_DIR}
@@ -46,7 +49,6 @@ find_library(TeaSpeak_SharedLib_LIBRARIES_SHARED
         HINTS ${TeaSpeak_SharedLib_ROOT_DIR} ${TeaSpeak_SharedLib_ROOT_DIR}/build ${TeaSpeak_SharedLib_ROOT_DIR}/libs ${TeaSpeak_SharedLib_ROOT_DIR}/out/
 )
 
-include(FindPackageHandleStandardArgs)
 find_package_handle_standard_args(TeaSpeak_SharedLib DEFAULT_MSG
         TeaSpeak_SharedLib_INCLUDE_DIR
 )
diff --git a/cmake/FindThreadPool.cmake b/cmake/FindThreadPool.cmake
index c1726f9..b9f5041 100644
--- a/cmake/FindThreadPool.cmake
+++ b/cmake/FindThreadPool.cmake
@@ -18,31 +18,30 @@
 #  ThreadPool_LIBRARIES_STATIC  The ThreadPool libraries.
 #  ThreadPool_LIBRARIES_SHARED  The ThreadPool libraries.
 
+include(tearoot-helper)
+include(FindPackageHandleStandardArgs)
+
 find_path(ThreadPool_ROOT_DIR
         NAMES include/ThreadPool.h CMakeLists.txt
-        HINTS ${ThreadPool_ROOT_DIR}
+		HINTS ${ThreadPool_ROOT_DIR} ${ThreadPool_ROOT_DIR}/${BUILD_OUTPUT}
 )
 
 #This NEEDS a fix!
 find_path(ThreadPool_INCLUDE_DIR
         NAMES ThreadPool/ThreadPool.h
-        PATH_SUFFIXES include
-        HINTS ${ThreadPool_ROOT_DIR} ${ThreadPool_ROOT_DIR}/build ${ThreadPool_ROOT_DIR}/libs ${ThreadPool_ROOT_DIR}/out/win32_amd64
+		HINTS ${ThreadPool_ROOT_DIR} ${ThreadPool_ROOT_DIR}/include/
 )
 
 find_library(ThreadPool_LIBRARIES_STATIC
         NAMES ThreadPoolStatic.lib ThreadPoolStatic.a
-        PATH_SUFFIXES out/win32_amd64/Release out/win32/Release out/win32_x64/Release
-        HINTS ${ThreadPool_ROOT_DIR} ${ThreadPool_ROOT_DIR}/build ${ThreadPool_ROOT_DIR}/libs ${ThreadPool_ROOT_DIR}/out/
+		HINTS ${ThreadPool_ROOT_DIR} ${ThreadPool_ROOT_DIR}/lib
 )
 
 find_library(ThreadPool_LIBRARIES_SHARED
         NAMES ThreadPool.dll ThreadPool.so
-        PATH_SUFFIXES out/win32_amd64/Release out/win32/Release out/win32_x64/Release
-        HINTS ${ThreadPool_ROOT_DIR} ${ThreadPool_ROOT_DIR}/build ${ThreadPool_ROOT_DIR}/libs ${ThreadPool_ROOT_DIR}/out/
+		HINTS ${ThreadPool_ROOT_DIR} ${ThreadPool_ROOT_DIR}/lib
 )
 
-include(FindPackageHandleStandardArgs)
 find_package_handle_standard_args(ThreadPool DEFAULT_MSG
         ThreadPool_INCLUDE_DIR
 )
diff --git a/cmake/FindTomCrypt.cmake b/cmake/FindTomCrypt.cmake
index c9b408b..d8ec3d7 100644
--- a/cmake/FindTomCrypt.cmake
+++ b/cmake/FindTomCrypt.cmake
@@ -18,29 +18,29 @@
 #  TomCrypt_LIBRARIES_STATIC  The TomCrypt libraries.
 #  TomCrypt_LIBRARIES_SHARED  The TomCrypt libraries.
 
+include(tearoot-helper)
+include(FindPackageHandleStandardArgs)
+
 find_path(TomCrypt_ROOT_DIR
         NAMES src/headers/tomcrypt.h makefile LICENSE
-        HINTS ${TomCrypt_ROOT_DIR}
+		HINTS ${TomCrypt_ROOT_DIR} ${TomCrypt_ROOT_DIR}/${BUILD_OUTPUT}
 )
 
 find_path(TomCrypt_INCLUDE_DIR
         NAMES tomcrypt.h tomcrypt_cfg.h
-        HINTS ${TomCrypt_ROOT_DIR}/src/headers
+		HINTS ${TomCrypt_ROOT_DIR} ${TomCrypt_ROOT_DIR}/include/  ${TomCrypt_ROOT_DIR}/src/headers
 )
 
 find_library(TomCrypt_LIBRARIES_STATIC
         NAMES libtomcrypt.lib libtomcrypt.a
-        PATH_SUFFIXES out/win32_amd64/Release out/win32/Release out/win32_x64/Release
-        HINTS ${TomCrypt_ROOT_DIR} ${TomCrypt_ROOT_DIR}/build ${TomCrypt_ROOT_DIR}/libs ${TomCrypt_ROOT_DIR}/out/
+		HINTS ${TomCrypt_ROOT_DIR} ${TomCrypt_ROOT_DIR}/lib
 )
 
 find_library(TomCrypt_LIBRARIES_SHARED
         NAMES libtomcrypt.dll libtomcrypt.so
-        PATH_SUFFIXES out/win32_amd64/Release out/win32/Release out/win32_x64/Release
-        HINTS ${TomCrypt_ROOT_DIR} ${TomCrypt_ROOT_DIR}/build ${TomCrypt_ROOT_DIR}/libs ${TomCrypt_ROOT_DIR}/out/
+		HINTS ${TomCrypt_ROOT_DIR} ${TomCrypt_ROOT_DIR}/lib
 )
 
-include(FindPackageHandleStandardArgs)
 find_package_handle_standard_args(TomCrypt DEFAULT_MSG
         TomCrypt_INCLUDE_DIR
 )
diff --git a/cmake/FindTomMath.cmake b/cmake/FindTomMath.cmake
index 3028e4a..cf40207 100644
--- a/cmake/FindTomMath.cmake
+++ b/cmake/FindTomMath.cmake
@@ -18,29 +18,24 @@
 #  TomMath_LIBRARIES_STATIC  The TomMath libraries.
 #  TomMath_LIBRARIES_SHARED  The TomMath libraries.
 
-find_path(TomMath_ROOT_DIR
-        NAMES include/tommath.h CMakeLists.txt LICENSE
-        HINTS ${TomMath_ROOT_DIR}
-)
+include(tearoot-helper)
+include(FindPackageHandleStandardArgs)
 
 find_path(TomMath_INCLUDE_DIR
         NAMES tommath.h tommath_private.h
-        HINTS ${TomMath_ROOT_DIR}/include
+		HINTS ${TomMath_ROOT_DIR}/ ${TomMath_ROOT_DIR}/include/
 )
 
 find_library(TomMath_LIBRARIES_STATIC
         NAMES tommath.lib tommath.a
-        PATH_SUFFIXES out/win32_amd64/Release out/win32/Release out/win32_x64/Release
-        HINTS ${TomMath_ROOT_DIR} ${TomMath_ROOT_DIR}/build ${TomMath_ROOT_DIR}/libs ${TomMath_ROOT_DIR}/out/
+		HINTS ${TomMath_ROOT_DIR} ${TomMath_ROOT_DIR}/lib
 )
 
 find_library(TomMath_LIBRARIES_SHARED
         NAMES tommath.dll tommath.so
-        PATH_SUFFIXES out/win32_amd64/Release out/win32/Release out/win32_x64/Release
-        HINTS ${TomMath_ROOT_DIR} ${TomMath_ROOT_DIR}/build ${TomMath_ROOT_DIR}/libs ${TomMath_ROOT_DIR}/out/
+		HINTS ${TomMath_ROOT_DIR} ${TomMath_ROOT_DIR}/lib
 )
 
-include(FindPackageHandleStandardArgs)
 find_package_handle_standard_args(TomMath DEFAULT_MSG
         TomMath_INCLUDE_DIR
 )
diff --git a/cmake/Findfvad.cmake b/cmake/Findfvad.cmake
index dffdf3b..b156d13 100644
--- a/cmake/Findfvad.cmake
+++ b/cmake/Findfvad.cmake
@@ -18,30 +18,29 @@
 #  fvad_LIBRARIES_STATIC  The fvad libraries.
 #  fvad_LIBRARIES_SHARED  The fvad libraries.
 
+include(tearoot-helper)
+include(FindPackageHandleStandardArgs)
+
 find_path(fvad_ROOT_DIR
         NAMES include/fvad.h
-        HINTS ${fvad_ROOT_DIR}
+		HINTS ${fvad_ROOT_DIR} ${fvad_ROOT_DIR}/${BUILD_OUTPUT}
 )
 
 find_path(fvad_INCLUDE_DIR
         NAMES fvad.h
-        HINTS ${fvad_ROOT_DIR}/include/
+		HINTS ${fvad_ROOT_DIR} ${fvad_ROOT_DIR}/include/
 )
 
 find_library(fvad_LIBRARIES_STATIC
         NAMES libfvad.a libfvad.lib
-        PATH_SUFFIXES lib/
-        HINTS 
-		${fvad_ROOT_DIR}/lib
+		HINTS ${fvad_ROOT_DIR} ${fvad_ROOT_DIR}/lib
 )
 
 find_library(fvad_LIBRARIES_SHARED
         NAMES libfvad.dll libfvad.so
-        PATH_SUFFIXES lib bin
-        HINTS ${fvad_ROOT_DIR} ${fvad_ROOT_DIR}/build ${fvad_ROOT_DIR}/libs ${fvad_ROOT_DIR}/out/
+		HINTS ${fvad_ROOT_DIR} ${fvad_ROOT_DIR}/lib
 )
 
-include(FindPackageHandleStandardArgs)
 find_package_handle_standard_args(fvad DEFAULT_MSG
         fvad_INCLUDE_DIR
 )
diff --git a/cmake/libraries_wolverin_lap.cmake b/cmake/config/libraries_wolverin_lap.cmake
similarity index 91%
rename from cmake/libraries_wolverin_lap.cmake
rename to cmake/config/libraries_wolverin_lap.cmake
index 37ae202..7d72efc 100644
--- a/cmake/libraries_wolverin_lap.cmake
+++ b/cmake/config/libraries_wolverin_lap.cmake
@@ -1,3 +1,6 @@
+set(BUILD_OS_TYPE "win32")
+set(BUILD_OS_ARCH "amd64")
+
 SET(TomMath_ROOT_DIR "C:/Users/WolverinDEV/TeaSpeak/third_party/tommath")
 SET(TomCrypt_ROOT_DIR "C:/Users/WolverinDEV/TeaSpeak/third_party/tomcrypt")
 SET(DataPipes_ROOT_DIR "C:/Users/WolverinDEV/TeaSpeak/third_party/DataPipes")
diff --git a/cmake/config/tearoot-client.cmake b/cmake/config/tearoot-client.cmake
new file mode 100644
index 0000000..3e26a40
--- /dev/null
+++ b/cmake/config/tearoot-client.cmake
@@ -0,0 +1,23 @@
+set(BUILD_OS_TYPE "linux")
+set(BUILD_OS_ARCH "amd64")
+
+if(NOT LIBRARY_PATH OR LIBRARY_PATH STREQUAL "")
+	message(FATAL_ERROR "Missing library path")
+endif()
+
+include(tearoot-helper)
+SET(TomMath_ROOT_DIR "${LIBRARY_PATH}/tommath/${BUILD_OUTPUT}")
+SET(TomCrypt_ROOT_DIR "${LIBRARY_PATH}/tomcrypt/${BUILD_OUTPUT}")
+SET(DataPipes_ROOT_DIR "${LIBRARY_PATH}/DataPipes/${BUILD_OUTPUT}")
+SET(StringVariable_ROOT_DIR "${LIBRARY_PATH}/StringVariable/${BUILD_OUTPUT}")
+SET(ThreadPool_ROOT_DIR "${LIBRARY_PATH}/Thread-Pool/${BUILD_OUTPUT}")
+SET(ed25519_ROOT_DIR "${LIBRARY_PATH}/ed25519/${BUILD_OUTPUT}")
+SET(LibEvent_ROOT_DIR "${LIBRARY_PATH}/libevent/${BUILD_OUTPUT}")
+SET(soxr_ROOT_DIR "${LIBRARY_PATH}/soxr/${BUILD_OUTPUT}")
+SET(PortAudio_ROOT_DIR "${LIBRARY_PATH}/portaudio/${BUILD_OUTPUT}")
+SET(fvad_ROOT_DIR "${LIBRARY_PATH}/libfvad/${BUILD_OUTPUT}")
+SET(opus_ROOT_DIR "${LIBRARY_PATH}/opus/${BUILD_OUTPUT}")
+SET(breakpad_ROOT_DIR "${LIBRARY_PATH}/breakpad/${BUILD_OUTPUT}")
+set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${LIBRARY_PATH}/spdlog/${BUILD_OUTPUT}")
+
+#SET(TeaSpeak_SharedLib_ROOT_DIR "C:/Users/WolverinDEV/TeaSpeak/TeaSpeak-SharedLib")
diff --git a/cmake/tearoot-helper.cmake b/cmake/tearoot-helper.cmake
new file mode 100644
index 0000000..c067493
--- /dev/null
+++ b/cmake/tearoot-helper.cmake
@@ -0,0 +1,34 @@
+macro(initialize_build_paths)
+	if(NOT BUILD_OS_TYPE OR BUILD_OS_TYPE STREQUAL "")
+		message(FATAL_ERROR "Missing os build type (BUILD_OS_TYPE). Please define it!")
+	endif()
+	if(NOT BUILD_OS_ARCH OR BUILD_OS_ARCH STREQUAL "")
+		message(FATAL_ERROR "Missing os build arch (BUILD_OS_ARCH). Please define it!")
+	endif()
+
+	# Test for valid values
+	if(BUILD_OS_TYPE STREQUAL "win32")
+		if(BUILD_OS_ARCH STREQUAL "x86")
+			message(FATAL_ERROR "We currently not support windows x86")
+		elseif(BUILD_OS_ARCH STREQUAL "amd64")
+
+		else()
+			message(FATAL_ERROR "Invalid os build arch (${BUILD_OS_ARCH}). Supported OS archs are: amd64, x86")
+		endif()
+	elseif(BUILD_OS_TYPE STREQUAL "linux")
+		if(BUILD_OS_ARCH STREQUAL "x86")
+
+		elseif(BUILD_OS_ARCH STREQUAL "amd64")
+
+		else()
+			message(FATAL_ERROR "Invalid os build arch (${BUILD_OS_ARCH}). Supported OS archs are: amd64, x86")
+		endif()
+	else()
+		message(FATAL_ERROR "Invalid os build type (${BUILD_OS_TYPE}). Supported OS types are: linux, win32")
+	endif()
+
+	if(NOT BUILD_OUTPUT OR BUILD_OUTPUT STREQUAL "")
+		set(BUILD_OUTPUT "/out/${BUILD_OS_TYPE}_${BUILD_OS_ARCH}")
+	endif()
+endmacro()
+initialize_build_paths()
\ No newline at end of file
diff --git a/helper.txt b/helper.txt
index 8cd0987..c3ccf78 100644
--- a/helper.txt
+++ b/helper.txt
@@ -7,4 +7,13 @@ git submodule foreach git reset --hard
 
 
 
-build_event.sh updated!
\ No newline at end of file
+build_event.sh updated!
+
+
+build_os_type: [linux|win32]
+
+build_os_type linux
+    -> build_os_arch: [x86|amd64]
+
+build_os_type win32
+    -> build_os_arch: [x86|amd64]
\ No newline at end of file
diff --git a/scripts/build_helper.sh b/scripts/build_helper.sh
index 702c1fd..3788c39 100644
--- a/scripts/build_helper.sh
+++ b/scripts/build_helper.sh
@@ -119,8 +119,8 @@ function cmake_build() {
         return 1
     fi
 
-    base_path=$(realpath $1)
-    build_path="$base_path/out/${build_os_type}_${build_os_arch}/"
+    local base_path=$(realpath $1)
+    local build_path="$base_path/out/${build_os_type}_${build_os_arch}/"
     if [[ ! -d ${base_path} ]]; then
         echo "Missing target directory. CMake build failed"
         return 1
@@ -143,8 +143,8 @@ function cmake_build() {
         return 1
     }
 
-    parameters=(${@:2})
-    final_parms=()
+    local parameters=(${@:2})
+    local final_parms=()
     declare -A final_definitions
 
     #Merge env variables with definitions
@@ -175,7 +175,7 @@ function cmake_build() {
     [[ ! -z "${C_FLAGS}" ]] && final_definitions["CMAKE_C_FLAGS"]="${final_definitions['CMAKE_C_FLAGS']} ${C_FLAGS}"
     [[ ! -z "${CXX_FLAGS}" ]] && final_definitions["CMAKE_CXX_FLAGS"]="${final_definitions['CMAKE_CXX_FLAGS']} ${CXX_FLAGS}"
 
-    definition_string=""
+    local definition_string=""
     for i in "${!final_definitions[@]}"
     do
         definition_string="${definition_string} -D$i=\"${final_definitions[$i]}\""
@@ -183,9 +183,9 @@ function cmake_build() {
     #Cut of the start space
     [[ ! -z ${definition_string} ]] && definition_string=${definition_string:1}
 
-    cmake_command="cmake $base_path$base_path_suffix ${final_parms[*]} ${definition_string} ${CMAKE_OPTIONS}"
+    local cmake_command="cmake $base_path$base_path_suffix ${final_parms[*]} ${definition_string} ${CMAKE_OPTIONS}"
 
-    origin_directory=$(pwd)
+    local origin_directory=$(pwd)
     cd ${build_path}
     [[ $? -ne 0 ]] && {
         echo "Failed to enter build directory!"
@@ -203,7 +203,7 @@ function cmake_build() {
         return 1
     fi
 
-    make_command="make ${CMAKE_MAKE_OPTIONS}"
+    local make_command="make ${CMAKE_MAKE_OPTIONS}"
     echo "Executing make command:"
     echo "> $make_command"
     eval "${make_command}"
@@ -212,7 +212,7 @@ function cmake_build() {
         return 1
     fi
 
-    make_install_command="make install"
+    local make_install_command="make install"
     echo "Executing make install command:"
     echo "> $make_install_command"
     eval "${make_install_command}"
@@ -232,4 +232,45 @@ function check_err_exit() {
     [[ ${#@} -gt 1 ]] && echo "${@:2}"
     echo -e "Aborting build\e[0;39m"
     exit 1
+}
+
+function pline() {
+    local width="150"
+    local padding="$(printf '%0.1s' ={1..120})"
+    printf "%*.*s $color_green%s$color_normal %*.*s\n" 0 "$(( ($width - 2 - ${#1}) / 2))" "$padding" "$1" 0 "$(( ($width - 1 - ${#1}) / 2 ))" "$padding"
+}
+
+function format_time() {
+    local time_needed_s=$(($1/1000000000))
+    local time_needed_m=$(($time_needed_s/60))
+    local time_needed_s=$(($time_needed_s - $time_needed_m * 60))
+
+    time=""
+    if [[ ${time_needed_m} != "0" ]]; then
+        [[ -z ${time} ]] && time="$time_needed_m min" || time="${time} $time_needed_m min"
+    fi
+    if [[ ${time_needed_s} != "0" ]]; then
+        [[ -z ${time} ]] && time="$time_needed_s sec" || time="${time} $time_needed_s sec"
+    fi
+
+    [[ -z ${time} ]] && time="0 sec"
+}
+
+declare -A task_timings
+function begin_task() {
+    local name="$1"
+    local display_name="$2"
+
+    task_timings[$name]="$(date +%s%N)"
+    pline "$display_name"
+}
+
+function end_task() {
+    local name="$1"
+    local display_name="$2"
+
+    time_end=$(date +%s%N)
+    time_start=${task_timings[$name]}
+    format_time $(($time_end-$time_start))
+    pline "$display_name ($time)"
 }
\ No newline at end of file
diff --git a/shared b/shared
new file mode 160000
index 0000000..89fd735
--- /dev/null
+++ b/shared
@@ -0,0 +1 @@
+Subproject commit 89fd73591929d08cf27e8f576e91f7f0f65b1cb3
diff --git a/third_party/boringssl b/third_party/boringssl
index d6f9c35..c19dfe2 160000
--- a/third_party/boringssl
+++ b/third_party/boringssl
@@ -1 +1 @@
-Subproject commit d6f9c359d219055a89c676cb8886421b145a08da
+Subproject commit c19dfe278c0fb8956cbfa36ab3ea8e2d0c3a14dd
diff --git a/third_party/build.sh b/third_party/build.sh
index 8d65803..71ac2f8 100755
--- a/third_party/build.sh
+++ b/third_party/build.sh
@@ -3,36 +3,13 @@
 # Enter third_party/ directory
 cd $(dirname $0)
 
-color_green='\e[92m'
-color_normal='\e[39m'
-
-function pline() {
-    width="120"
-    padding="$(printf '%0.1s' ={1..120})"
-    printf "%*.*s $color_green%s$color_normal %*.*s\n" 0 "$(( ($width - 2 - ${#1}) / 2))" "$padding" "$1" 0 "$(( ($width - 1 - ${#1}) / 2 ))" "$padding"
-}
-
-function format_time() {
-    time_needed_s=$(($1/1000000000))
-    time_needed_m=$(($time_needed_s/60))
-    time_needed_s=$(($time_needed_s - $time_needed_m * 60))
-
-    time=""
-    if [[ ${time_needed_m} != "0" ]]; then
-        [[ -z ${time} ]] && time="$time_needed_m min" || time="${time} $time_needed_m min"
-    fi
-    if [[ ${time_needed_s} != "0" ]]; then
-        [[ -z ${time} ]] && time="$time_needed_s sec" || time="${time} $time_needed_s sec"
-    fi
-
-    [[ -z ${time} ]] && time="0 sec"
-}
+source ../scripts/build_helper.sh
+begin_task "build_third_party" "Building libraries"
 
 function exec_script() {
     name=$(echo "$1" | sed -n -E 's:^build_(.*)\.sh:\1:p')
-    time_begin=$(date +%s%N)
+    begin_task "build_$name" "Building $name"
 
-    pline "$name"
 	echo -e "Building library with script $color_green${1}$color_normal"
 	./${1}
 	if [[ $? -ne 0 ]]; then
@@ -41,13 +18,10 @@ function exec_script() {
 	fi
 
     #Log the result
-    time_end=$(date +%s%N)
-    format_time $(($time_end - $time_begin))
-    pline "$name ($time)"
+    end_task "build_$name" "Finished $name"
     echo ""
 }
 
-global_time_begin=$(date +%s%N)
 exec_script build_boringssl.sh
 exec_script build_breakpad.sh #Not required for windows TeaClient
 exec_script build_event.sh
@@ -66,6 +40,4 @@ exec_script build_yaml.sh
 exec_script build_jemalloc.sh #Not required for TeaClient
 
 #Log the result
-global_time_end=$(date +%s%N)
-format_time $(($global_time_end - $global_time_begin))
-pline "Build all libraries successfully ($time)!"
\ No newline at end of file
+end_task "build_third_party" "Build all libraries successfully"
\ No newline at end of file