From 9bcf266ce285966dc7e57f7aebe67d27d5a338d9 Mon Sep 17 00:00:00 2001 From: Luis Stanglmeier Date: Wed, 22 Jun 2022 17:49:52 +0200 Subject: [PATCH] added json classes added cmake files minor changes --- LSFramework/CJsonArray.h | 0 LSFramework/CJsonDocument.h | 8 + LSFramework/CJsonNode.h | 12 + LSFramework/CJsonObject.h | 0 .../CMake.1.6.0/AutoBuild/BuildAllLinux.sh | 35 + .../CMake.1.6.0/AutoBuild/BuildAllVS2017.cmd | 43 + .../AutoBuild/BuildAllVS2017INtime.cmd | 43 + .../AutoBuild/BuildLinuxProject.sh | 75 ++ .../AutoBuild/BuildVS2017INtimeProject.cmd | 126 +++ .../AutoBuild/BuildVS2017Project.cmd | 77 ++ .../CMake.1.6.0/AutoBuild/RunUnitTest.sh | 35 + .../CMake/CMake.1.6.0/CMake.1.6.0.nupkg | Bin 0 -> 63640 bytes LSFramework/CMake/CMake.1.6.0/CMakeCore.cmake | 65 ++ .../CMake/CMake.1.6.0/CMakeMacros.cmake | 807 ++++++++++++++++++ .../CMake/CMake.1.6.0/CMakeSettings.cmake | 165 ++++ .../CMake/CMake.1.6.0/Includes/TsepVersion.h | 28 + .../TsepNativeRecommendedRules.ruleset | 283 ++++++ .../RuleSets/TsepPropertySheet.props | 10 + .../Templates/CMake.nuspec.Template | 17 + .../CMakeLists.Console.Template.cmake | 91 ++ .../Templates/CMakeLists.Dll.Template.cmake | 98 +++ .../Templates/CMakeLists.Gui.Template.cmake | 130 +++ .../Templates/CMakeLists.Lib.Template.cmake | 85 ++ .../Templates/CMakeLists.Nexus.Template.cmake | 25 + .../CMakeLists.Project.Template.cmake | 58 ++ .../CMakeLists.UnitTests.Template.cmake | 79 ++ .../CMakeLists.VS_CodeAnalyzer.Template.cmake | 29 + .../LinuxGenerateProject.Template.sh | 35 + .../Templates/ProjektName.Exports.Template.h | 47 + .../Templates/Translation.Template.ts | 4 + .../Templates/Translations.Template.qrc | 5 + .../Templates/VSGenerateProject.cmd.Template | 44 + .../Versions/Win32/DefaultAppVersion.rc | 46 + .../Versions/Win32/DefaultDllVersion.rc | 46 + .../CMake/CMake.1.6.0/Versions/Win32/TSEP.ico | Bin 0 -> 59625 bytes LSFramework/LSString.cpp | 44 +- LSFramework/LSString.h | 22 +- LSFramework/LSVector.h | 9 + LSFramework/VSGenerateProject.cmd | 25 + LSFramework/main.cpp | 53 +- 40 files changed, 2765 insertions(+), 39 deletions(-) create mode 100644 LSFramework/CJsonArray.h create mode 100644 LSFramework/CJsonDocument.h create mode 100644 LSFramework/CJsonNode.h create mode 100644 LSFramework/CJsonObject.h create mode 100644 LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildAllLinux.sh create mode 100644 LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildAllVS2017.cmd create mode 100644 LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildAllVS2017INtime.cmd create mode 100644 LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildLinuxProject.sh create mode 100644 LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildVS2017INtimeProject.cmd create mode 100644 LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildVS2017Project.cmd create mode 100644 LSFramework/CMake/CMake.1.6.0/AutoBuild/RunUnitTest.sh create mode 100644 LSFramework/CMake/CMake.1.6.0/CMake.1.6.0.nupkg create mode 100644 LSFramework/CMake/CMake.1.6.0/CMakeCore.cmake create mode 100644 LSFramework/CMake/CMake.1.6.0/CMakeMacros.cmake create mode 100644 LSFramework/CMake/CMake.1.6.0/CMakeSettings.cmake create mode 100644 LSFramework/CMake/CMake.1.6.0/Includes/TsepVersion.h create mode 100644 LSFramework/CMake/CMake.1.6.0/RuleSets/TsepNativeRecommendedRules.ruleset create mode 100644 LSFramework/CMake/CMake.1.6.0/RuleSets/TsepPropertySheet.props create mode 100644 LSFramework/CMake/CMake.1.6.0/Templates/CMake.nuspec.Template create mode 100644 LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Console.Template.cmake create mode 100644 LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Dll.Template.cmake create mode 100644 LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Gui.Template.cmake create mode 100644 LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Lib.Template.cmake create mode 100644 LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Nexus.Template.cmake create mode 100644 LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Project.Template.cmake create mode 100644 LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.UnitTests.Template.cmake create mode 100644 LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.VS_CodeAnalyzer.Template.cmake create mode 100644 LSFramework/CMake/CMake.1.6.0/Templates/LinuxGenerateProject.Template.sh create mode 100644 LSFramework/CMake/CMake.1.6.0/Templates/ProjektName.Exports.Template.h create mode 100644 LSFramework/CMake/CMake.1.6.0/Templates/Translation.Template.ts create mode 100644 LSFramework/CMake/CMake.1.6.0/Templates/Translations.Template.qrc create mode 100644 LSFramework/CMake/CMake.1.6.0/Templates/VSGenerateProject.cmd.Template create mode 100644 LSFramework/CMake/CMake.1.6.0/Versions/Win32/DefaultAppVersion.rc create mode 100644 LSFramework/CMake/CMake.1.6.0/Versions/Win32/DefaultDllVersion.rc create mode 100644 LSFramework/CMake/CMake.1.6.0/Versions/Win32/TSEP.ico create mode 100644 LSFramework/VSGenerateProject.cmd diff --git a/LSFramework/CJsonArray.h b/LSFramework/CJsonArray.h new file mode 100644 index 0000000..e69de29 diff --git a/LSFramework/CJsonDocument.h b/LSFramework/CJsonDocument.h new file mode 100644 index 0000000..f1152b6 --- /dev/null +++ b/LSFramework/CJsonDocument.h @@ -0,0 +1,8 @@ +private: + CcJsonNode m_oJsonData; + bool m_bParseError = false; + CcString m_sParseErrorMsg; + bool m_bIntend = false; + uint16 m_uiIntendLevel = 0; + + static const CcString c_sIndent; \ No newline at end of file diff --git a/LSFramework/CJsonNode.h b/LSFramework/CJsonNode.h new file mode 100644 index 0000000..adb1bf4 --- /dev/null +++ b/LSFramework/CJsonNode.h @@ -0,0 +1,12 @@ +private: + union CcDocumentsSHARED UJsonDataType + { + void* m_pVoid; + CcVariant* m_ovValue; + CcJsonObject* m_poJsonObject; + CcJsonArray* m_poJsonArray; + }; + UJsonDataType m_uData; + EJsonDataType m_eType = EJsonDataType::Unknown; //!< Enum of current stored Object type. + CcString m_sName; //!< Name of this Object +}; \ No newline at end of file diff --git a/LSFramework/CJsonObject.h b/LSFramework/CJsonObject.h new file mode 100644 index 0000000..e69de29 diff --git a/LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildAllLinux.sh b/LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildAllLinux.sh new file mode 100644 index 0000000..b61c46e --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildAllLinux.sh @@ -0,0 +1,35 @@ +#//======================================================================== +#// Copyright (c) Technische Software Entwicklung Plazotta © 2021 +#// +#// DESCRIPTION: +#// Shell Script to Build a cmake project under linux, running the Unittest and finally start teh install step +#// +#// HISTORY: +#// 09.04.2021 / PP +#// Module created. +#//======================================================================== +#!/bin/bash +# +ProjectName=@TSEP_AUTOBUILD_PROJECT@ +UnitTestExe=@TSEP_AUTOBUILD_USED_UNITTEST@ + +#======================================================================= +# Start build +#======================================================================= +#echo " Auto Build Project : " $ProjectName +#echo " Auto Build Unit Test : " $UnitTestExe +#echo "." +#- Release -------------------------------------------------------------- +./scripts/BuildLinuxProject.sh $ProjectName Release $UnitTestExe +if [ $? -ne 0 ]; then + echo "Error during Release build ..." + exit 1 +fi +#- Debug ---------------------------------------------------------------- +./scripts//BuildLinuxProject.sh $ProjectName Debug $UnitTestExe +if [ $? -ne 0 ]; then + echo "Error during Debug build ..." + exit 1 +fi +# +exit 0 \ No newline at end of file diff --git a/LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildAllVS2017.cmd b/LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildAllVS2017.cmd new file mode 100644 index 0000000..76d8aa7 --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildAllVS2017.cmd @@ -0,0 +1,43 @@ +@ECHO OFF +REM //======================================================================== +REM // Copyright (c) Technische Software Entwicklung Plazotta © 2021 +REM // +REM // DESCRIPTION: +REM // Batch Building for Windows / Project Framework.Core +REM // +REM // HISTORY: +REM // 09.04.2021 / PP +REM // Module created. +REM //======================================================================== +setlocal +pushd . +REM ======================================================================= +REM Setup Parameter +REM ======================================================================= +set ProjectName=@TSEP_AUTOBUILD_PROJECT@ +set UnitTestExecutables=@TSEP_AUTOBUILD_USED_UNITTEST@ +REM +REM ======================================================================= +REM Rebuild the project +REM ======================================================================= +cd scripts +call BuildVS2017Project.cmd %ProjectName% Release "%UnitTestExecutables%" +IF %ERRORLEVEL% NEQ 0 goto ERROR +call BuildVS2017Project.cmd %ProjectName% Debug "%UnitTestExecutables%" +IF %ERRORLEVEL% NEQ 0 goto ERROR +goto END +REM +REM ======================================================================= +REM Error +REM ======================================================================= +:ERROR +echo Error during automated build ...... +PAUSE +exit /b 1 +REM +REM ======================================================================= +REM END +REM ======================================================================= +:END +echo Automated build successful done ..... +exit /b 0 diff --git a/LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildAllVS2017INtime.cmd b/LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildAllVS2017INtime.cmd new file mode 100644 index 0000000..ee31b9a --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildAllVS2017INtime.cmd @@ -0,0 +1,43 @@ +@ECHO OFF +REM //======================================================================== +REM // Copyright (c) Technische Software Entwicklung Plazotta © 2021 +REM // +REM // DESCRIPTION: +REM // Batch Building for INtime / Project Framework.Core +REM // +REM // HISTORY: +REM // 27.07.2021 / DM +REM // Module created. +REM //======================================================================== +setlocal +pushd . +REM ======================================================================= +REM Setup Parameter +REM ======================================================================= +set ProjectName=@TSEP_AUTOBUILD_PROJECT@ +set UnitTestExecutables=@TSEP_AUTOBUILD_USED_UNITTEST@ +REM +REM ======================================================================= +REM Rebuild the project +REM ======================================================================= +cd scripts +call BuildVS2017INtimeProject.cmd %ProjectName% Release "%UnitTestExecutables%" +IF %ERRORLEVEL% NEQ 0 goto ERROR +call BuildVS2017INtimeProject.cmd %ProjectName% Debug "%UnitTestExecutables%" +IF %ERRORLEVEL% NEQ 0 goto ERROR +goto END +REM +REM ======================================================================= +REM Error +REM ======================================================================= +:ERROR +echo Error during automated build ...... +PAUSE +exit /b 1 +REM +REM ======================================================================= +REM END +REM ======================================================================= +:END +echo Automated build successful done ..... +exit /b 0 diff --git a/LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildLinuxProject.sh b/LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildLinuxProject.sh new file mode 100644 index 0000000..23c8820 --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildLinuxProject.sh @@ -0,0 +1,75 @@ +#//======================================================================== +#// Copyright (c) Technische Software Entwicklung Plazotta © 2021 +#// +#// DESCRIPTION: +#// Shell Script to Build a cmake project under linux, running the Unittest and finally start teh install step +#// +#// HISTORY: +#// 09.04.2021 / PP +#// Module created. +#//======================================================================== +#!/bin/bash +# +#======================================================================= +# Check Parameter +#======================================================================= +if [ -z "$1" ] +then + echo "usage: BuildLinuxProject [ProjectName] [Configuration] [UnitTestExe]" + exit 2 +fi +if [ -z "$2" ] +then + echo "usage: BuildLinuxProject [ProjectName] [Configuration] [UnitTestExe]" + exit 2 +fi +if [ -z "$3" ] +then + echo "usage: BuildLinuxProject [ProjectName] [Configuration] [UnitTestExe]" + exit 2 +fi +#======================================================================= +# Show Parameter +#======================================================================= +echo "=======================================================================" +echo " Build Parameter" +echo "=======================================================================" +echo " Project = $1" +echo " Configuration = $2" +echo " Unit Test Executable = $3" +echo "=======================================================================" +echo "." +#======================================================================= +# parse unit test s +#======================================================================= +IFS=',' +read -rasplitIFS<<< "$3" +#======================================================================= +# Start build +#======================================================================= +cd ../../BuildResults_linux_$2 +#- MAKE ALL ------------------------------------------------------------ +make all +if [ $? -ne 0 ]; then + echo "Build error ..." + exit 1 +fi +#- UNIT Test ----------------------------------------------------------- +cd bin +for unittests in "${splitIFS[@]}"; do + + echo tsep | sudo -S ./../../AutoBuild/linux/scripts/RunUnitTest.sh $unittests + if [ $? -ne 0 ]; then + echo "Error during Unit test ..." + exit 1 + fi +done +cd .. +#- Install ------------------------------------------------------------- +make install +if [ $? -ne 0 ]; then + echo "Error during INSTALL ..." + exit 1 +fi +# +exit 0 \ No newline at end of file diff --git a/LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildVS2017INtimeProject.cmd b/LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildVS2017INtimeProject.cmd new file mode 100644 index 0000000..f9aa4e2 --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildVS2017INtimeProject.cmd @@ -0,0 +1,126 @@ +@ECHO OFF +REM //======================================================================== +REM // Copyright (c) Technische Software Entwicklung Plazotta © 2021 +REM // +REM // DESCRIPTION: +REM // Batch Building a VS2017 INtime Project, running the Unittest and finally start the install step +REM // +REM // HISTORY: +REM // 27.07.2021 / DM +REM // Module created. +REM // Refactored for INtime with PP's Windows Template. +REM //======================================================================== +setlocal +setlocal enabledelayedexpansion +pushd . +REM ======================================================================= +REM Check Parameter +REM ======================================================================= +set TestFiles=%3 +set TestFiles=%TestFiles:"=% +@if "%1"=="" goto HELP +@if "%2"=="" goto HELP +@if "%TestFiles%"=="" goto NO_PARSE +set TestFiles=%TestFiles:,= % +:NO_PARSE +REM ======================================================================= +REM Show Parameter +REM ======================================================================= +echo ======================================================================= +echo Build Parameter +echo ======================================================================= +echo Project = %1 +echo Configuration = %2 +echo Unit Test Executable = %TestFiles% +echo ======================================================================= +echo . +REM ======================================================================= +REM Setup the VS2017 environment +REM ======================================================================= +call "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Enterprise\Common7\Tools\vsdevcmd" +REM +REM ======================================================================= +REM Rebuild the project +REM ======================================================================= +cd ..\..\..\BuildResults\msvc2017_INtime +devenv %1.sln /rebuild %2 +IF %ERRORLEVEL% NEQ 0 goto ERROR +REM +REM ======================================================================= +REM Before running the unit tests delete the LdrtaResult file +REM to be sure the loop can work properly +REM ======================================================================= +del /f ..\..\AutoBuild\INtime\scripts\LdrtaResult.txt +REM +REM ======================================================================= +REM Run all unit tests +REM ======================================================================= +for %%f in (%TestFiles%) do ( + start ldrta.exe %2\bin\%%f.rta + if !ERRORLEVEL! NEQ 0 goto ERROR +) +REM +REM ======================================================================= +REM Loop for recognizing the creation of the LdrtaResult file. +REM After check unit tests were successfully, otherwise error +REM ======================================================================= +cd ..\..\AutoBuild\INtime\scripts +set /a CounterEnd=120 +set /a Counter=0 +set /a OkResult=0 +set LdrtaFile=LdrtaResult.txt +:LOOP +echo Checking if the unit tests have created the result file +if exist "%LdrtaFile%" ( + echo File was created + set /p Result=<"%LdrtaFile%" + goto FILECREATED +) else ( + echo File was not created + goto FILENOTCREATED +) +:FILECREATED +if %Result% EQU %OkResult% ( + echo Continueing AllBuild process + goto CONTINUE +) else ( + echo Unit tests failed ... + goto ERROR +) +:FILENOTCREATED +if %Counter% EQU %CounterEnd% ( + goto ERROR +) else ( + set /a Counter=%Counter%+1 + timeout /t 2 /nobreak + echo Timeout corresponds to 2 seconds + set /a CounterX2=%Counter%*2 + echo Current total timeout counter: %CounterX2% + goto LOOP +) + +REM +REM ======================================================================= +REM Install files +REM ======================================================================= +:CONTINUE +cd ..\..\..\BuildResults\msvc2017_INtime +devenv %1.sln /build %2 /Project INSTALL +IF %ERRORLEVEL% NEQ 0 goto ERROR +goto END +REM +REM ======================================================================= +REM Error +REM ======================================================================= +:ERROR +echo Error during build ... +exit /b 1 +REM +REM ======================================================================= +REM HELP +REM ======================================================================= +:HELP +echo Usage BuildVs2017INtimeProject [ProjectName] [Configuration] [UnitTestExe] +echo . +:END +exit /b 0 diff --git a/LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildVS2017Project.cmd b/LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildVS2017Project.cmd new file mode 100644 index 0000000..37aa88f --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/AutoBuild/BuildVS2017Project.cmd @@ -0,0 +1,77 @@ +@ECHO OFF +REM //======================================================================== +REM // Copyright (c) Technische Software Entwicklung Plazotta © 2021 +REM // +REM // DESCRIPTION: +REM // Batch Building a VS2017 Project, running the Unittest and finally start the install step +REM // +REM // HISTORY: +REM // 09.04.2021 / PP +REM // Module created. +REM //======================================================================== +setlocal +setlocal enabledelayedexpansion +pushd . +REM ======================================================================= +REM Check Parameter +REM ======================================================================= +set TestFiles=%3 +set TestFiles=%TestFiles:"=% +@if "%1"=="" goto HELP +@if "%2"=="" goto HELP +@if "%TestFiles%"=="" goto NO_PARSE +set TestFiles=%TestFiles:,= % +:NO_PARSE +REM ======================================================================= +REM Show Parameter +REM ======================================================================= +echo ======================================================================= +echo Build Parameter +echo ======================================================================= +echo Project = %1 +echo Configuration = %2 +echo Unit Test Executable = %TestFiles% +echo ======================================================================= +echo . +REM ======================================================================= +REM Setup the VS2017 environment +REM ======================================================================= +call "%ProgramFiles(x86)%\Microsoft Visual Studio\2017\Enterprise\Common7\Tools\vsdevcmd" +REM +REM ======================================================================= +REM Rebuild the project +REM ======================================================================= +cd ..\..\..\BuildResults\msvc2017_x64 +devenv %1.sln /rebuild %2 +IF %ERRORLEVEL% NEQ 0 goto ERROR +REM +REM ======================================================================= +REM Run all unit tests +REM ======================================================================= +for %%f in (%TestFiles%) do ( + start /WAIT %2\bin\%%f.exe + IF !ERRORLEVEL! NEQ 0 goto ERROR +) +REM +REM ======================================================================= +REM Install files +REM ======================================================================= +devenv %1.sln /build %2 /Project INSTALL +IF %ERRORLEVEL% NEQ 0 goto ERROR +goto END +REM +REM ======================================================================= +REM Error +REM ======================================================================= +:ERROR +echo Error during build ... +exit /b 1 +REM +REM ======================================================================= +REM HELP +REM ======================================================================= +:HELP +echo Usage BuildVs2017Project [ProjectName] [Configuration] [UnitTestExe] +echo . +:END +exit /b 0 diff --git a/LSFramework/CMake/CMake.1.6.0/AutoBuild/RunUnitTest.sh b/LSFramework/CMake/CMake.1.6.0/AutoBuild/RunUnitTest.sh new file mode 100644 index 0000000..35d7b4a --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/AutoBuild/RunUnitTest.sh @@ -0,0 +1,35 @@ +#//======================================================================== +#// Copyright (c) Technische Software Entwicklung Plazotta © 2021 +#// +#// DESCRIPTION: +#// Shell Script to Build a cmake project under linux, running the Unittest and finally start teh install step +#// +#// HISTORY: +#// 09.04.2021 / PP +#// Module created. +#//======================================================================== +#!/bin/bash +# +#======================================================================= +# Check Parameter +#======================================================================= +if [ -z "$1" ] +then + echo "usage: RunUnitTest [UnitTestExe]" + exit 2 +fi +#======================================================================= +# Run Unit Test +#======================================================================= + +#- Get the RUNPATH and setup the LD_LIBRARY_PATH------------------------ + +USED_LD_PATH=$(readelf -d $1 | grep RUNPATH | awk 'NR > 1 {print $1}' RS='[' FS=']') +export LD_LIBRARY_PATH=$USED_LD_PATH + +./$1 +if [ $? -ne 0 ]; then + exit 1 +fi +# +exit 0 \ No newline at end of file diff --git a/LSFramework/CMake/CMake.1.6.0/CMake.1.6.0.nupkg b/LSFramework/CMake/CMake.1.6.0/CMake.1.6.0.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..753573b96956f270e7816ca2fc8e497f501c4202 GIT binary patch literal 63640 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

byddr2!@ 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 literal 0 HcmV?d00001 diff --git a/LSFramework/CMake/CMake.1.6.0/CMakeCore.cmake b/LSFramework/CMake/CMake.1.6.0/CMakeCore.cmake new file mode 100644 index 0000000..6eb419f --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/CMakeCore.cmake @@ -0,0 +1,65 @@ +########################################################################################### +# +# (c) Technical Software Engineering Plazotta 2019 +# +# CMAKE project settings file +# +# History +# 29.09.2019 / Plazotta +# Template created. +# +#----------------------------------------------------------------------------------------- +# Macro for version parsing +# +MACRO( VERSION_STR_TO_INTS major minor patch version ) + STRING( REGEX REPLACE "([0-9]+).[0-9]+.[0-9]+" "\\1" ${major} ${version} ) + STRING( REGEX REPLACE "[0-9]+.([0-9]+).[0-9]+" "\\1" ${minor} ${version} ) + STRING( REGEX REPLACE "[0-9]+.[0-9]+.([0-9]+)" "\\1" ${patch} ${version} ) +ENDMACRO( VERSION_STR_TO_INTS ) +# +#----------------------------------------------------------------------------------------- +# Define the global CMAKE settings +# +set(CMAKE_CONFIGURATION_TYPES Debug Release) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +# +#----------------------------------------------------------------------------------------- +# Define LINUX +# +if(UNIX AND NOT APPLE) + set(LINUX TRUE) +else() + set(LINUX FALSE) +endif() +# +#----------------------------------------------------------------------------------------- +# Define TSEP CMAKE GENERATOR +# +message(" Generate Generator ....") +# +IF(WIN32) + set(TSEP_CMAKE_GENERATOR ${CMAKE_GENERATOR}) + set(TSEP_BUILD_CONFIGURATION $(Configuration)) +ENDIF() +# +IF(LINUX) + VERSION_STR_TO_INTS(GCC_MAJOR GCC_MINOR GCC_PATH ${CMAKE_CXX_COMPILER_VERSION}) + set(TSEP_CMAKE_GENERATOR "Linux-gcc-") + string(APPEND TSEP_CMAKE_GENERATOR ${GCC_MAJOR}) + if(CMAKE_BINARY_DIR MATCHES "(Debug*)") + set(TSEP_BUILD_CONFIGURATION "Debug") + else() + set(TSEP_BUILD_CONFIGURATION "Release") + endif() + message(" Generate Generator -> Linux ...." ${TSEP_CMAKE_GENERATOR}) +ENDIF() +# +#----------------------------------------------------------------------------------------- +# handle the product/developer build variables +# +if(NOT DEFINED TSEP_PRODUCT_BUILD) + set (TSEP_PRODUCT_BUILD 0) +endif() +#----------------------------------------------------------------------------------------- +# diff --git a/LSFramework/CMake/CMake.1.6.0/CMakeMacros.cmake b/LSFramework/CMake/CMake.1.6.0/CMakeMacros.cmake new file mode 100644 index 0000000..0b737de --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/CMakeMacros.cmake @@ -0,0 +1,807 @@ +include (CMakeParseArguments) + +#///////////////////////////////////////////////////////////////////////////////////////////////// +#################################### +#set_output_dir +# Description: +# Change the output directory of the project to given folder +# for all configurations +# +# Syntax: +# set_output_dir(foldername) +#################################### +macro (set_output_dir DIR) + foreach (CONFIG ${CMAKE_CONFIGURATION_TYPES}) + # make configuration variable upper case for CMAKE macros + string(TOUPPER ${CONFIG} CONFIGUPPERCASE) + + # set directories + set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CONFIGUPPERCASE} ${DIR}) + set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${CONFIGUPPERCASE} ${DIR}) + set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CONFIGUPPERCASE} ${DIR}) + set( CMAKE_PDB_OUTPUT_DIRECTORY_${CONFIGUPPERCASE} ${DIR}) + endforeach (CONFIG ${CMAKE_CONFIGURATION_TYPES}) +endmacro (set_output_dir) + +#///////////////////////////////////////////////////////////////////////////////////////////////// +function(TSEP_TRANSLATE) + + # define file lists for all languages + foreach(arg IN LISTS ARGN) + set(TRANSLATION_FILES_ORIG + ${TRANSLATION_FILES_ORIG} + resources/${PROJECT_NAME}_${arg}_generated.ts + ) + set(TRANSLATION_FILES + ${TRANSLATION_FILES} + resources/${PROJECT_NAME}_${arg}.ts + ) + set(TRANSLATION_RESOURCE_LIST + ${TRANSLATION_RESOURCE_LIST} + "${PROJECT_NAME}_${arg}.qm" + ) + if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/resources/${PROJECT_NAME}_${arg}.ts) + configure_file(${TSEP_PROJECT_CMAKE}/Templates/Translation.Template.ts ${CMAKE_CURRENT_LIST_DIR}/resources/${PROJECT_NAME}_${arg}.ts COPYONLY) + endif() + endforeach() + + # replace all ";" from the resource list + string(REPLACE ";" "\n " TRANSLATION_RESOURCE_STRING "${TRANSLATION_RESOURCE_LIST}") + + if (WIN32) + # copy project specific *translations.qrc to the resources folder + configure_file(${TSEP_PROJECT_CMAKE}/Templates/Translations.Template.qrc ${CMAKE_CURRENT_LIST_DIR}/resources/${PROJECT_NAME}_translations.qrc @ONLY) + endif() + + # call qt translation functions + qt5_create_translation(ORIG_TRANSLATIONS ${CMAKE_CURRENT_LIST_DIR} ${TRANSLATION_FILES_ORIG}) + qt5_add_translation(QM_FILES ${TRANSLATION_FILES}) + configure_file(resources/${PROJECT_NAME}_translations.qrc ${CMAKE_BINARY_DIR}/${PROJECT_NAME} COPYONLY) + + # define TSEP_TRANSLATION_FILES in parent scope so it can be added to the project by add_executable or add_library + set(TSEP_TRANSLATION_FILES_LOCAL ${TRANSLATION_FILES} ${TRANSLATION_FILES_ORIG} ${CMAKE_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}_translations.qrc) + set(TSEP_TRANSLATION_FILES ${TSEP_TRANSLATION_FILES_LOCAL} PARENT_SCOPE) + + # Group the files in the solution + source_group("Translation Files" FILES ${TSEP_TRANSLATION_FILES_LOCAL}) + +endfunction() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +function(TSEP_SETUP_DLL_VERSION ComponentDescription) + + #------------------------------------------------------------------------------ + # Windows Version Description with Resource Files + if(WIN32) + add_definitions(-DVER_COMPANYNAME_STR="${TSEP_COMPANY_LONGNAME}") + add_definitions(-DVER_FILEVERSION_STR="${TSEP_PRODUCT_VERSION}") + add_definitions(-DVER_FILEVERSION=${TSEP_PRODUCT_VERSION}) + add_definitions(-DVER_FILEDESCRIPTION_STR="${ComponentDescription}") + add_definitions(-DVER_LEGALCOPYRIGHT_STR="${TSEP_COPYRIGHT_STRING}") + add_definitions(-DVER_PRODUCTNAME_STR="${TSEP_PROJECT}") + + set(AUTOMATED_VERSION_FILES + ${TSEP_DLL_VERSION_RC} + ) + source_group("Automated Version Files" FILES ${AUTOMATED_VERSION_FILES}) + else() + # define entry point for shared library to print the version information + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-e,tsep_version_entry_point" PARENT_SCOPE) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,-e,tsep_version_entry_point" PARENT_SCOPE) + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wl,-e,tsep_version_entry_point" PARENT_SCOPE) + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wl,-e,tsep_version_entry_point" PARENT_SCOPE) + endif() + + add_definitions(-DTSEP_VERSION="${TSEP_VERSION}") + add_definitions(-DTSEP_VERSION_MAJOR=${TSEP_VERSION_MAJOR}) + add_definitions(-DTSEP_VERSION_MINOR=${TSEP_VERSION_MINOR}) + add_definitions(-DTSEP_VERSION_PATCH=${TSEP_VERSION_PATCH}) + add_definitions(-DTSEP_PRODUCT_NAME="${TSEP_PRODUCT_NAME}") + add_definitions(-DTSEP_COPYRIGHT="${TSEP_COPYRIGHT_STRING}") + add_definitions(-DTSEP_COMPANY_NAME="${TSEP_COMPANY_LONGNAME}") + +endfunction() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +function(TSEP_SETUP_APP_VERSION ComponentDescription) + + #------------------------------------------------------------------------------ + # Windows Version Description with Resource Files + if(WIN32) + add_definitions(-DVER_COMPANYNAME_STR="${TSEP_COMPANY_LONGNAME}") + add_definitions(-DVER_FILEVERSION_STR="${TSEP_PRODUCT_VERSION}") + add_definitions(-DVER_FILEVERSION=${TSEP_PRODUCT_VERSION}) + add_definitions(-DVER_FILEDESCRIPTION_STR="${ComponentDescription}") + add_definitions(-DVER_LEGALCOPYRIGHT_STR="${TSEP_COPYRIGHT_STRING}") + add_definitions(-DVER_PRODUCTNAME_STR="${TSEP_PROJECT}") + + set(AUTOMATED_VERSION_FILES + ${TSEP_APP_VERSION_RC} + ) + + source_group("Automated Version Files" FILES ${AUTOMATED_VERSION_FILES}) + endif() + + add_definitions(-DTSEP_VERSION="${TSEP_VERSION}") + add_definitions(-DTSEP_VERSION_MAJOR=${TSEP_VERSION_MAJOR}) + add_definitions(-DTSEP_VERSION_MINOR=${TSEP_VERSION_MINOR}) + add_definitions(-DTSEP_VERSION_PATCH=${TSEP_VERSION_PATCH}) + +endfunction() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +function(TSEP_ADD_EXPORT_FILE ) + + message(" Generating import cmake file for project / " ${PROJECT_NAME}) + + set(TEMP_PRODUCT_NAME "Tsep.") + string(APPEND TEMP_PRODUCT_NAME ${TSEP_PRODUCT_NAME}) + set(TEMP_PROJECT_COLON_NAME "") + string(REPLACE "." "::" TEMP_PROJECT_COLON_NAME ${TEMP_PRODUCT_NAME}) + set(TEMP_PROJECT_SIMPLE_NAME "") + string(REPLACE "." "" TEMP_PROJECT_SIMPLE_NAME ${TEMP_PRODUCT_NAME}) + set(TEMP_PROJECT_DOT_NAME ${TEMP_PRODUCT_NAME}) + string(TOUPPER ${TSEP_PRODUCT_NAME} TEMP_CMAKE_PROJECT_NAME) + + #message("Colon " ${TEMP_PROJECT_COLON_NAME}) + #message("Dot " ${TEMP_PROJECT_DOT_NAME}) + #message("Simple " ${TEMP_PROJECT_SIMPLE_NAME}) + + # Copy the nuspec template file and configure it for the product + configure_file( ${TSEP_PROJECT_CMAKE}/Templates/CMakeLists.Import.Template ${TSEP_EXPORT_DIR}/${TEMP_PROJECT_SIMPLE_NAME}Config.cmake @ONLY ) + +endfunction() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +macro(TSEP_ADD_EXPORT_HEADER HeaderList) + +message(" Generating custom action to export header files for project / " ${PROJECT_NAME}) + +set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER "${HeaderList}") + +endmacro() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +macro(TSEP_ADD_PROJECT_NEXUS_UPLOAD) + +# Lower case for configuration flag +string( TOLOWER ${TSEP_UPDATE_IN_NEXUS} TSEP_UPDATE_IN_NEXUS_LOWER ) + +# Add a new target if Nexus upload is requested +if( TSEP_UPDATE_IN_NEXUS_LOWER STREQUAL "true" ) + + message(" Generating Nexus upload project for product / " ${TSEP_PRODUCT_NAME}) + + # Copy the nuspec template file and configure it for the product + configure_file( ${TSEP_PROJECT_CMAKE}/Templates/CMake.nuspec.Template ${TSEP_EXPORT_DIR}/${TSEP_PRODUCT_NAME}.nuspec ) + + # Copy the template nexus upload cmake file + file(MAKE_DIRECTORY NEXUS_UPLOAD) + file(COPY ${TSEP_PROJECT_CMAKE}/Templates/CMakeLists.Nexus.Template.cmake DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/NEXUS_UPLOAD ) + file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/NEXUS_UPLOAD/CMakeLists.Nexus.Template.cmake ${CMAKE_CURRENT_SOURCE_DIR}/NEXUS_UPLOAD/CMakeLists.txt ) + + # Create a new project for the nexus upload + add_subdirectory ( "NEXUS_UPLOAD" "${CMAKE_CURRENT_BINARY_DIR}/NEXUS_UPLOAD" ) + +endif() + +endmacro() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +macro(TSEP_THIRDPARTY_NEXUS_UPLOAD) + +# Lower case for configuration flag +string( TOLOWER ${TSEP_UPDATE_IN_NEXUS} TSEP_UPDATE_IN_NEXUS_LOWER ) + +# Add a new target if Nexus upload is requested +if( TSEP_UPDATE_IN_NEXUS_LOWER STREQUAL "true" ) + + message(" Executing Nexus upload for third party product / " ${TSEP_PRODUCT_NAME}) + + # Create package + execute_process( WORKING_DIRECTORY ${TSEP_EXPORT_DIR} + COMMAND ${TSEP_NUGET_APPLICATION} pack ${TSEP_EXPORT_DIR}/${TSEP_PRODUCT_NAME}.nuspec -outputdirectory ${TSEP_EXPORT_DIR} -BasePath ${TSEP_EXPORT_DIR} -verbosity detailed + ) + + execute_process( WORKING_DIRECTORY ${TSEP_EXPORT_DIR} + COMMAND ${TSEP_NUGET_APPLICATION} push *.nupkg ${TSEP_NEXUS_GUID} -source ${TSEP_NEXUS_URL}/Development/ -verbosity detailed + ) + +endif() + +endmacro() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +macro(TSEP_ADD_PROJECT_CODE_ANALYZER) + +# Visual Studio +if(WIN32) + + message(" Generating Visual Studio Code Analyzer project for product / " ${TSEP_PRODUCT_NAME}) + + # Copy the template Nexus upload CMake file + file(MAKE_DIRECTORY VS_CODE_ANALYZER) + file(COPY ${TSEP_PROJECT_CMAKE}/Templates/CMakeLists.VS_CodeAnalyzer.Template.cmake DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/VS_CODE_ANALYZER ) + file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/VS_CODE_ANALYZER/CMakeLists.VS_CodeAnalyzer.Template.cmake ${CMAKE_CURRENT_SOURCE_DIR}/VS_CODE_ANALYZER/CMakeLists.txt ) + + # Create a new project for the Visual Studio CodeAnalyzer + add_subdirectory ( "VS_CODE_ANALYZER" "${CMAKE_CURRENT_BINARY_DIR}/VS_CODE_ANALYZER" ) + +endif() + +endmacro() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +MACRO(TSEP_GET_HEADER_DIRECTORIES return_list target_dir) + + FILE(GLOB_RECURSE new_list ${target_dir}/*.h) + SET(dir_list "") + FOREACH(file_path ${new_list}) + GET_FILENAME_COMPONENT(dir_path ${file_path} PATH) + SET(dir_list ${dir_list} ${dir_path}) + ENDFOREACH() + LIST(REMOVE_DUPLICATES dir_list) + SET(${return_list} ${dir_list}) + +ENDMACRO() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +macro(TSEP_ADD_OS_SPECIFIC_SETTINGS) + +IF (WIN32) + target_link_libraries(${PROJECT_NAME} PUBLIC Iphlpapi.lib) + target_link_libraries(${PROJECT_NAME} PUBLIC Shlwapi.lib) + target_link_libraries(${PROJECT_NAME} PUBLIC Ws2_32.lib) +ENDIF() + +IF (LINUX) + target_link_libraries(${PROJECT_NAME} PUBLIC dl) + target_link_libraries(${PROJECT_NAME} PUBLIC pthread) + target_link_libraries(${PROJECT_NAME} PUBLIC rt) + target_link_libraries(${PROJECT_NAME} PUBLIC stdc++fs) +ENDIF() + + set_target_properties(${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX d) +endmacro() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +macro(TSEP_CREATE_LINK_FOR_DIRECTORY directory_for_search) + +if(WIN32) + #- Get all files from the given directory + file(GLOB FILES_TO_LINK ${directory_for_search}/bin/*.dll ${directory_for_search}/bin/*.exe) + + #- Loop over all files + foreach(file_and_path_to_link ${FILES_TO_LINK}) + + #- Get the file name from the complete path + get_filename_component(file_to_link ${file_and_path_to_link} NAME) + + #- convert the path into an operating system depending format + file(TO_NATIVE_PATH ${file_and_path_to_link} native_file_and_path_to_link) + + #- create the link + if(EXISTS "${PROJECT_BINARY_DIR}/Debug/bin/${file_to_link}") + file(REMOVE "${PROJECT_BINARY_DIR}/Debug/bin/${file_to_link}") + endif() + execute_process( WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/Debug/bin + COMMAND cmd.exe /c mklink "${file_to_link}" "${native_file_and_path_to_link}" + OUTPUT_QUIET) + + #- create the link + if(EXISTS "${PROJECT_BINARY_DIR}/Release/bin/${file_to_link}") + file(REMOVE "${PROJECT_BINARY_DIR}/Release/bin/${file_to_link}") + endif() + execute_process( WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/Release/bin + COMMAND cmd.exe /c mklink "${file_to_link}" "${native_file_and_path_to_link}" + OUTPUT_QUIET) + + endforeach() + +endif() + +endmacro() + +#////////////////////////////////////////////////////////////////////// +macro(TSEP_USE_GOOGLE_TESTING) + + message(" Enabling the Google Test Framework ") + + enable_testing() + +if(WIN32) + set(GTEST_ROOT ${TSEP_PROJECT_GOOGLE.TEST}/${TSEP_CMAKE_GENERATOR}) # <- Working hand-in-hand with the google export! +endif() + + find_package(GTest REQUIRED) + +if(WIN32) + TSEP_CREATE_LINK_FOR_DIRECTORY(${TSEP_PROJECT_GOOGLE.TEST}/${TSEP_CMAKE_GENERATOR}) +endif() + +endmacro() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +macro(TSEP_CREATE_EXPORT) + + #- Only for developer build + if(NOT TSEP_PRODUCT_BUILD) + + message(" Generating custom action to export files for project / " ${PROJECT_NAME}) + + install(TARGETS ${PROJECT_NAME} + EXPORT ${MAIN_PROJECT_NAME}Config + RUNTIME DESTINATION bin/${TSEP_CMAKE_GENERATOR} + LIBRARY DESTINATION bin/${TSEP_CMAKE_GENERATOR} + ARCHIVE DESTINATION bin/${TSEP_CMAKE_GENERATOR} + PUBLIC_HEADER DESTINATION inc + ) + + if (WIN32 AND NOT ${ARGC}) + install (FILES $ DESTINATION bin/${TSEP_CMAKE_GENERATOR} OPTIONAL) + endif() + + install(EXPORT ${MAIN_PROJECT_NAME}Config + DESTINATION bin/${TSEP_CMAKE_GENERATOR}/cmake + NAMESPACE Tsep:: + ) + endif() +endmacro() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +macro(TSEP_PROVIDE_UNITTEST_FILES TestFileList) + +message(" Generating custom action to provide the test file in the tmp directory / " ${PROJECT_NAME}) + +if (WIN32) + file(TO_NATIVE_PATH $ENV{TMP}/${PROJECT_NAME} DEST_DIR) +else() + file(TO_NATIVE_PATH /tmp/${PROJECT_NAME} DEST_DIR) +endif() + +#- Add pre-link step to the copy the source files +add_custom_command(TARGET ${PROJECT_NAME} + DEPENDS ${TestFileList} + COMMENT "Provide Unit Test Files..." + POST_BUILD + VERBATIM + WORKING_DIRECTORY + COMMAND_EXPAND_LISTS + COMMAND ${CMAKE_COMMAND} -E remove_directory ${DEST_DIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${TestFileList} ${DEST_DIR} +) + +endmacro() + + +#///////////////////////////////////////////////////////////////////////////////////////////////// +macro(TSEP_PROVIDE_APPLICATION_DATA_FILES ApplicationName AppDataFileList) + +message(" Generating custom action to provide the application data file in the application data directory / " ${ApplicationName}) + +# Calculate the length of the loop +list(LENGTH ${AppDataFileList} len1) +math(EXPR len2 "${len1} / 2") + +# Loop over the array +foreach(val RANGE 0 ${len2} 2) + # Calculate the next idx + math(EXPR valN "${val} + 1") + + # Get the items + list(GET ${AppDataFileList} ${val} SubFolder) + list(GET ${AppDataFileList} ${valN} FileName) + + # Do copy + if("${SubFolder}" STREQUAL "") + TSEP_PROVIDE_APPLICATION_DATA_FILES_IN_ROOTFOLDER(${ApplicationName} ${FileName}) + else() + TSEP_PROVIDE_APPLICATION_DATA_FILES_IN_SUBFOLDER(${ApplicationName} ${SubFolder} ${FileName}) + endif() + +# message(STATUS "${val1} ${val2}") +endforeach() + +endmacro() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +macro(TSEP_PROVIDE_APPLICATION_DATA_FILES_IN_ROOTFOLDER ApplicationName AppDataFile) + +message(" Generating custom action to provide the application data file -> ${AppDataFile}") + +if (WIN32) + file(TO_NATIVE_PATH $ENV{PROGRAMDATA}/Tsep/${ApplicationName} DEST_DIR) +else() + file(TO_NATIVE_PATH $ENV{HOME}/.local/share DEST_DIR) +endif() + +#- Add pre-link step to the copy the source files +add_custom_command(TARGET ${PROJECT_NAME} + DEPENDS ${AppDataFileList} + POST_BUILD + VERBATIM + WORKING_DIRECTORY + COMMAND_EXPAND_LISTS + COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${AppDataFile} ${DEST_DIR} +) + +endmacro() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +macro(TSEP_PROVIDE_APPLICATION_DATA_FILES_IN_SUBFOLDER ApplicationName SubFolder AppDataFile) + +message(" Generating custom action to provide the application data file in folder ${SubFolder} -> ${AppDataFile}") + +if (WIN32) + file(TO_NATIVE_PATH $ENV{PROGRAMDATA}/Tsep/${ApplicationName}/${SubFolder} DEST_DIR) +else() + file(TO_NATIVE_PATH $ENV{HOME}/.local/share/${SubFolder} DEST_DIR) +endif() + +#- Add pre-link step to the copy the source files +add_custom_command(TARGET ${PROJECT_NAME} + DEPENDS ${AppDataFileList} + POST_BUILD + VERBATIM + WORKING_DIRECTORY + COMMAND_EXPAND_LISTS + COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${AppDataFile} ${DEST_DIR} +) + +endmacro() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +function(TSEP_GENERATE_DEPENDENCY_LINKS) + message(" Generating executable links for all dependencies") + + # Generate the link only if we are in developer mode + if(NOT TSEP_PRODUCT_BUILD) + # Debug ---------------------------------------------------------------------------------------- + TSEP_GENERATE_DEPENDENCY_LINKS_FOR_CONFIGURATION(Debug) + TSEP_GENERATE_ADDED_DEPENDENCY_LINKS_FOR_CONFIGURATION(Debug) + + # Release ---------------------------------------------------------------------------------------- + TSEP_GENERATE_DEPENDENCY_LINKS_FOR_CONFIGURATION(Release) + TSEP_GENERATE_ADDED_DEPENDENCY_LINKS_FOR_CONFIGURATION(Release) + endif() +endfunction() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +function(TSEP_GENERATE_DEPENDENCY_LINKS_FOR_CONFIGURATION) + + get_target_property(ExecutableLinks ${PROJECT_NAME} LINK_LIBRARIES) + set (CONTAINS_QT_PROJECT_GLOBAL FALSE) + + # For all files -------------------------------------------------------------------------------- + foreach (Executable ${ExecutableLinks}) + set (CONTAINS_QT_PROJECT FALSE) + set (CONTAINS_SSL_PROJECT FALSE) + set (CONTAINS_CRYPTO_PROJECT FALSE) + set (CONTAINS_TSEP_PROJECT FALSE) + + string(FIND ${Executable} "Tsep::" TsepExecutable) + if (TsepExecutable GREATER -1) + set (CONTAINS_TSEP_PROJECT TRUE) + endif() + if(WIN32) + string(FIND ${Executable} "Qt5::" QtExecutable) + if (QtExecutable GREATER -1) + set (CONTAINS_QT_PROJECT TRUE) + set (CONTAINS_QT_PROJECT_GLOBAL TRUE) + endif() + string(FIND ${Executable} "OpenSSL::SSL" OpenSslExecutable) + if (OpenSslExecutable GREATER -1) + set (CONTAINS_SSL_PROJECT TRUE) + endif() + string(FIND ${Executable} "OpenSSL::Crypto" OpenSslExecutable) + if (OpenSslExecutable GREATER -1) + set (CONTAINS_CRYPTO_PROJECT TRUE) + endif() + endif() + + if(CONTAINS_TSEP_PROJECT OR CONTAINS_QT_PROJECT OR CONTAINS_SSL_PROJECT OR CONTAINS_CRYPTO_PROJECT) + # at the moment not needed for linux + if(WIN32) + if(CONTAINS_SSL_PROJECT) + set(LinkFile ${OPENSSL_ROOT_DIR}/bin/libssl-1_1-x64.dll) + elseif(CONTAINS_CRYPTO_PROJECT) + set(LinkFile ${OPENSSL_ROOT_DIR}/bin/libcrypto-1_1-x64.dll) + elseif (${ARGV0} STREQUAL Debug) + get_target_property(LinkFile ${Executable} LOCATION_DEBUG) + else() + get_target_property(LinkFile ${Executable} LOCATION_RELEASE) + endif() + + #- Get the file name from the complete path + get_filename_component(LinkFileName ${LinkFile} NAME) + + #- convert the path into an operating system depending format + file(TO_NATIVE_PATH ${LinkFile} LinkFileNative) + + #- remove the file if it exists + if(EXISTS "${PROJECT_BINARY_DIR}/${ARGV0}/bin/${LinkFileName}") + file(REMOVE "${PROJECT_BINARY_DIR}/${ARGV0}/bin/${LinkFileName}") + endif() + + #- convert the path into an operating system depending format + file(TO_NATIVE_PATH ${LinkFileName} LinkFileNameNative) + execute_process( WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${ARGV0}/bin + COMMAND cmd.exe /c mklink "${LinkFileNameNative}" "${LinkFileNative}" + OUTPUT_QUIET) + endif() + endif() + endforeach() + + # Qt platforms and iconengines have special destination folders + if(${CONTAINS_QT_PROJECT_GLOBAL}) + set(PLATFORMS_DIR ${Qt5_DIR}/../../../plugins/platforms) + file(TO_NATIVE_PATH ${PLATFORMS_DIR} NATIVE_PLATFORMS_DIR) + execute_process(WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${ARGV0}/bin + COMMAND cmd.exe /c mklink /D platforms "${NATIVE_PLATFORMS_DIR}" + OUTPUT_QUIET) + + set(ICONENGINES_DIR ${Qt5_DIR}/../../../plugins/iconengines) + file(TO_NATIVE_PATH ${ICONENGINES_DIR} NATIVE_ICONENGINES_DIR) + execute_process(WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${ARGV0}/bin + COMMAND cmd.exe /c mklink /D iconengines "${NATIVE_ICONENGINES_DIR}" + OUTPUT_QUIET) + endif() + +endfunction() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +# creates dependency links for dynamically loaded libraries under windows and extends the rpath under linux +function(TSEP_GENERATE_ADDED_DEPENDENCY_LINKS_FOR_CONFIGURATION) + +get_target_property(ExecutableLinks ${PROJECT_NAME} MANUALLY_ADDED_DEPENDENCIES) + +# For all files -------------------------------------------------------------------------------- +foreach (Executable ${ExecutableLinks}) + set (CONTAINS_TSEP_PROJECT FALSE) + + string(FIND ${Executable} "Tsep::" TsepExecutable) + if (TsepExecutable GREATER -1) + set (CONTAINS_TSEP_PROJECT TRUE) + endif() + + if(CONTAINS_TSEP_PROJECT) + + if (${ARGV0} STREQUAL Debug) + get_target_property(LinkFile ${Executable} LOCATION_DEBUG) + else() + get_target_property(LinkFile ${Executable} LOCATION_RELEASE) + endif() + + if(WIN32) + #- Get the file name from the complete path + get_filename_component(LinkFileName ${LinkFile} NAME) + + #- convert the path into an operating system depending format + file(TO_NATIVE_PATH ${LinkFile} LinkFileNative) + + #- create the link + + #- remove the file if it exists + if(EXISTS "${PROJECT_BINARY_DIR}/${ARGV0}/bin/${LinkFileName}") + file(REMOVE "${PROJECT_BINARY_DIR}/${ARGV0}/bin/${LinkFileName}") + endif() + + #- convert the path into an operating system depending format + file(TO_NATIVE_PATH ${LinkFileName} LinkFileNameNative) + execute_process( WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${ARGV0}/bin + COMMAND cmd.exe /c mklink "${LinkFileNameNative}" "${LinkFileNative}" + OUTPUT_QUIET) + else() + #- Get the path of the file + get_filename_component(LinkDirectoryName ${LinkFile} DIRECTORY) + get_target_property(OLD_RPATH ${PROJECT_NAME} BUILD_RPATH) + if (${OLD_PATH}) + set_property(TARGET ${PROJECT_NAME} PROPERTY BUILD_RPATH "${OLD_RPATH};${LinkDirectoryName}") + else() + set_property(TARGET ${PROJECT_NAME} PROPERTY BUILD_RPATH "$ORIGIN;${LinkDirectoryName}") + endif() + endif() + + endif() +endforeach() + +endfunction() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +function(TSEP_GENERATE_CUSTOM_DEPENDENCY_LINK) +message(" Generating executable links for all dependencies") + +# Debug ---------------------------------------------------------------------------------------- +TSEP_GENERATE_CUSTOM_DEPENDENCY_LINK_FOR_CONFIGURATION(Debug ${ARGV0} ${ARGV1}) + +# Release ---------------------------------------------------------------------------------------- +TSEP_GENERATE_CUSTOM_DEPENDENCY_LINK_FOR_CONFIGURATION(Release ${ARGV0} ${ARGV1}) + +endfunction() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +function(TSEP_GENERATE_CUSTOM_DEPENDENCY_LINK_FOR_CONFIGURATION) + #- Get the file name from the complete path + set(LinkFile ${ARGV1}) + get_filename_component(LinkFileName ${LinkFile} NAME) + + if(${ARGC} GREATER 2) + set(LinkFileName ${ARGV2}/${LinkFileName}) + file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/${ARGV0}/bin/${ARGV2}) + endif() + + #- convert the path into an operating system depending format + file(TO_NATIVE_PATH ${LinkFile} LinkFileNative) + + #- create the link + if(WIN32) + #- remove the file if it exists + if(EXISTS "${PROJECT_BINARY_DIR}/${ARGV0}/bin/${LinkFileName}") + file(REMOVE "${PROJECT_BINARY_DIR}/${ARGV0}/bin/${LinkFileName}") + endif() + + #- convert the path into an operating system depending format + file(TO_NATIVE_PATH ${LinkFileName} LinkFileNameNative) + execute_process( WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${ARGV0}/bin + COMMAND cmd.exe /c mklink "${LinkFileNameNative}" "${LinkFileNative}" + OUTPUT_QUIET) + else() + file(COPY ${LinkFile} DESTINATION ${PROJECT_BINARY_DIR}/bin/) + endif() +endfunction() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +function(TSEP_GENERATE_CUSTOM_DEPENDENCY_TARGET_LINK) +message(" Generating executable links for all dependencies") + +# Debug ---------------------------------------------------------------------------------------- +TSEP_GENERATE_CUSTOM_DEPENDENCY_TARGET_LINK_FOR_CONFIGURATION(Debug ${ARGV0} ${ARGV1}) + +# Release ---------------------------------------------------------------------------------------- +TSEP_GENERATE_CUSTOM_DEPENDENCY_TARGET_LINK_FOR_CONFIGURATION(Release ${ARGV0} ${ARGV1}) + +endfunction() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +function(TSEP_GENERATE_CUSTOM_DEPENDENCY_TARGET_LINK_FOR_CONFIGURATION) + #- Get the file name from the complete path + set(Executable ${ARGV1}) + + if (${ARGV0} STREQUAL Debug) + get_target_property(LinkFile ${Executable} LOCATION_DEBUG) + else() + get_target_property(LinkFile ${Executable} LOCATION_RELEASE) + endif() + + get_filename_component(LinkFileName ${LinkFile} NAME) + + if(${ARGC} GREATER 2) + set(LinkFileName ${ARGV2}/${LinkFileName}) + file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/${ARGV0}/bin/${ARGV2}) + endif() + + #- create the link + if(WIN32) + #- convert the path into an operating system depending format + file(TO_NATIVE_PATH ${LinkFile} LinkFileNative) + + #- remove the file if it exists + if(EXISTS "${PROJECT_BINARY_DIR}/${ARGV0}/bin/${LinkFileName}") + file(REMOVE "${PROJECT_BINARY_DIR}/${ARGV0}/bin/${LinkFileName}") + endif() + + #- convert the path into an operating system depending format + file(TO_NATIVE_PATH ${LinkFileName} LinkFileNameNative) + execute_process( WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/${ARGV0}/bin + COMMAND cmd.exe /c mklink "${LinkFileNameNative}" "${LinkFileNative}" + OUTPUT_QUIET) + else() + message("${LinkFile} -> ${PROJECT_BINARY_DIR}/bin/${LinkFileName}") + file(COPY ${LinkFile} DESTINATION ${PROJECT_BINARY_DIR}/bin/) + endif() +endfunction() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +function(TSEP_USE_CODE_ANALYSIS ProjectName) + +if (WIN32) + #- generate the poperty file only if it not exists + if(NOT EXISTS "${PROJECT_BINARY_DIR}/${TSEP_VS_PROP_FILE}") + message(" Create VS property sheet for code analysing for project / " ${ProjectName}) + + set(TsepConfigPropFile ${TSEP_PROJECT_CMAKE}/${TSEP_CA_RULESET_DIR}/${TSEP_VS_PROP_FILE}) + file(TO_NATIVE_PATH ${TsepConfigPropFile} TsepConfigPropFileNative) + + set(TsepCAFile ${TSEP_PROJECT_CMAKE}/${TSEP_CA_RULESET_DIR}/${TSEP_CA_RULESET_FILE}) + file(TO_NATIVE_PATH ${TsepCAFile} TsepCAFileNative) + + # Copy the nuspec template file and configure it for the product + configure_file(${TsepConfigPropFileNative} ${PROJECT_BINARY_DIR}/${TSEP_VS_PROP_FILE} @ONLY ) + + endif() + + #- set the property + set_target_properties(${ProjectName} PROPERTIES VS_USER_PROPS ../${TSEP_VS_PROP_FILE}) + +endif() + +endfunction() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +function(TSEP_ADD_AUTOBUILD_UNITTEST UnitExecutableName) + get_property(local_prop GLOBAL PROPERTY TSEP_AUTOBUILD_UNITTEST) + set(local_prop "${local_prop};${UnitExecutableName}") + set_property(GLOBAL PROPERTY TSEP_AUTOBUILD_UNITTEST ${local_prop}) + #message("list " ${local_prop}) +endfunction() + +#///////////////////////////////////////////////////////////////////////////////////////////////// +function(TSEP_ADD_AUTOBUILD MainProjectName) + +IF (INTIME) + set(TSEP_AUTOBUILD_DIR "${PROJECT_BINARY_DIR}/../../AutoBuild/INtime") +elseif (WIN32) + set(TSEP_AUTOBUILD_DIR "${PROJECT_BINARY_DIR}/../../AutoBuild/Windows") +elseif (LINUX) + set(TSEP_AUTOBUILD_DIR "${PROJECT_BINARY_DIR}/../AutoBuild/linux") +endif() + + set(TSEP_AUTOBUILD_PROJECT ${MainProjectName}) + + get_property(local_prop GLOBAL PROPERTY TSEP_AUTOBUILD_UNITTEST) + + message("-------------------------------------------------------") + message(" Auto Build Solution name : " ${TSEP_AUTOBUILD_PROJECT}) + + # Create the auto build directory + message(" Prepare auto build dir : " ${TSEP_AUTOBUILD_DIR}) + if(EXISTS ${TSEP_AUTOBUILD_DIR}) + file(REMOVE_RECURSE ${TSEP_AUTOBUILD_DIR}) + endif() + file(MAKE_DIRECTORY ${TSEP_AUTOBUILD_DIR}) + file(MAKE_DIRECTORY ${TSEP_AUTOBUILD_DIR}/scripts) + + # Copy the files for the build, os dependend + IF (INTIME) + configure_file(${TSEP_PROJECT_CMAKE}/AutoBuild/BuildVs2017INtimeProject.cmd ${TSEP_AUTOBUILD_DIR}/scripts COPYONLY) + foreach (TSEP_AUTOBUILD_UNIT_EXE ${local_prop}) + if("${TSEP_AUTOBUILD_USED_UNITTEST}" STREQUAL "") + set(TSEP_AUTOBUILD_USED_UNITTEST "${TSEP_AUTOBUILD_UNIT_EXE}") + else() + set(TSEP_AUTOBUILD_USED_UNITTEST "${TSEP_AUTOBUILD_USED_UNITTEST},${TSEP_AUTOBUILD_UNIT_EXE}") + endif() + endforeach() + message(" Auto Build Unittest : " ${TSEP_AUTOBUILD_USED_UNITTEST}) + configure_file(${TSEP_PROJECT_CMAKE}/AutoBuild/BuildAllVS2017INtime.cmd ${TSEP_AUTOBUILD_DIR}/BuildAll.cmd @ONLY) + elseif (WIN32) + set(TSEP_AUTOBUILD_USED_UNITTEST "") + configure_file(${TSEP_PROJECT_CMAKE}/AutoBuild/BuildVS2017Project.cmd ${TSEP_AUTOBUILD_DIR}/scripts COPYONLY) + foreach (TSEP_AUTOBUILD_UNIT_EXE ${local_prop}) + if("${TSEP_AUTOBUILD_USED_UNITTEST}" STREQUAL "") + set(TSEP_AUTOBUILD_USED_UNITTEST "${TSEP_AUTOBUILD_UNIT_EXE}") + else() + set(TSEP_AUTOBUILD_USED_UNITTEST "${TSEP_AUTOBUILD_USED_UNITTEST},${TSEP_AUTOBUILD_UNIT_EXE}") + endif() + endforeach() + message(" Auto Build Unittest : " ${TSEP_AUTOBUILD_USED_UNITTEST}) + configure_file(${TSEP_PROJECT_CMAKE}/AutoBuild/BuildAllVS2017.cmd ${TSEP_AUTOBUILD_DIR}/BuildAll.cmd @ONLY) + elseif (LINUX) + configure_file(${TSEP_PROJECT_CMAKE}/AutoBuild/BuildLinuxProject.sh ${TSEP_AUTOBUILD_DIR}/scripts COPYONLY) + configure_file(${TSEP_PROJECT_CMAKE}/AutoBuild/RunUnitTest.sh ${TSEP_AUTOBUILD_DIR}/scripts COPYONLY) + foreach (TSEP_AUTOBUILD_UNIT_EXE ${local_prop}) + if("${TSEP_AUTOBUILD_USED_UNITTEST}" STREQUAL "") + set(TSEP_AUTOBUILD_USED_UNITTEST "${TSEP_AUTOBUILD_UNIT_EXE}") + else() + set(TSEP_AUTOBUILD_USED_UNITTEST "${TSEP_AUTOBUILD_USED_UNITTEST},${TSEP_AUTOBUILD_UNIT_EXE}") + endif() + endforeach() + message(" Auto Build Unittest : " ${TSEP_AUTOBUILD_USED_UNITTEST}) + configure_file(${TSEP_PROJECT_CMAKE}/AutoBuild/BuildAllLinux.sh ${TSEP_AUTOBUILD_DIR}/BuildAll.sh @ONLY) + endif() + +endfunction() + + diff --git a/LSFramework/CMake/CMake.1.6.0/CMakeSettings.cmake b/LSFramework/CMake/CMake.1.6.0/CMakeSettings.cmake new file mode 100644 index 0000000..3c1ab20 --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/CMakeSettings.cmake @@ -0,0 +1,165 @@ +########################################################################################### +# +# (c) Technical Software Engineering Plazotta 2019 +# +# CMAKE project settings file +# +# History +# 29.09.2019 / Plazotta +# Template created. +# +#----------------------------------------------------------------------------------------- +# +#----------------------------------------------------------------------------------------- +# Define the project global CMAKE settings +# +set (TSEP_PROJECT_NAME ${PROJECT_NAME}) +set (TSEP_SOURCE_DIR ${PROJECT_SOURCE_DIR}) +set (TSEP_EXPORT_DIR ${PROJECT_SOURCE_DIR}/../Export) +set (TSEP_BINARY_DIR ${PROJECT_BINARY_DIR}) +set (TSEP_TARGET_DIR ${CMAKE_BINARY_DIR}/${TSEP_BUILD_CONFIGURATION}) +set (TSEP_CA_RULESET_DIR RuleSets) +set (TSEP_CA_RULESET_FILE TsepNativeRecommendedRules.ruleset) +set (TSEP_VS_PROP_FILE TsepPropertySheet.props) + +set(TSEP_AUTOBUILD_PROJECT "") +set_property(GLOBAL PROPERTY TSEP_AUTOBUILD_UNITTEST) + +IF (WIN32) + set (TSEP_APPLICATION_ICON_PATH ${TSEP_PROJECT_CMAKE}"/Versions/Win32/TSEP.ico") + set (TSEP_APP_VERSION_RC ${TSEP_PROJECT_CMAKE}"/Versions/Win32/DefaultAppVersion.rc") + set (TSEP_DLL_VERSION_RC ${TSEP_PROJECT_CMAKE}"/Versions/Win32/DefaultDllVersion.rc") + set (TSEP_NUGET_APPLICATION nuget.exe) +ELSE() + set (TSEP_APPLICATION_ICON_PATH "") + set (TSEP_APP_VERSION_RC "") + set (TSEP_DLL_VERSION_RC "") + set (TSEP_NUGET_APPLICATION nuget) +ENDIF() + +############################################################################### + +############################################################################### +# SET INCLUDE PATH FOR CMAKE PROVIDED HEADERS +############################################################################### +include_directories(${CMAKE_CURRENT_LIST_DIR}/Includes) + +############################################################################### +# PROJECT SPECIFIC VARIABLES +############################################################################### + +############################################################################### +# COMPILER SETTINGS +############################################################################### +# Windows +############################################################################### +IF (WIN32) + +#- Compiler Warning level 4 -> /W4 -------------------------------------------- +#- Compiler Generate Debug Info -> /Zi ---------------------------------------- +add_compile_options( + /W4 + /Zi +) + +#- Compile with UNICODE chars ------------------------------------------------- +#- Compile with minimal windows libs -------------------------------------------- +#- Minimum Windows is W7 (0x0601) --------------------------------------------- +#- No secure warnings --------------------------------------------------------- +add_definitions( + /DUNICODE + /D_UNICODE + /DWIN32_LEAN_AND_MEAN + /D_WIN32_WINNT=0x0601 + /D_CRT_SECURE_NO_WARNINGS +) + +add_link_options( + /Debug +) + +ENDIF() + +############################################################################### +# LINUX +############################################################################### +IF (LINUX) + +#- Define for Intel linux ----------------------------------------------------- +#- relocatable code ---------------------------------------------------------- +add_compile_options( + -fPIC + -pthread +) + +#add_definitions( +#) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -Wno-unknown-pragmas -Wno-pragma-once-outside-header -fvisibility=hidden") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -pedantic -Wno-unknown-pragmas -Wno-pragma-once-outside-header -fvisibility=hidden") + +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG") +set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG") + +set(CMAKE_INSTALL_RPATH "$ORIGIN") +set(CMAKE_BUILD_RPATH "$ORIGIN") + +ENDIF() + +############################################################################### +# SET OUTPUT DIRECTORIES for exe, dll, lib and pdb files +############################################################################### + +# must set directories for each configuration, +if(WIN32) + set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/../../Export) + + # cmake can not use the $(Configuration) variable, so we must define separate debug and release variables + set(TSEP_TARGET_DIR ${CMAKE_BINARY_DIR}/$(Configuration)) + set(TSEP_TARGET_DIR_RELEASE ${CMAKE_BINARY_DIR}/Release) + set(TSEP_TARGET_DIR_DEBUG ${CMAKE_BINARY_DIR}/Debug) +else() + set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/../Export) + + set(TSEP_TARGET_DIR ${CMAKE_BINARY_DIR}) + set(TSEP_TARGET_DIR_RELEASE ${CMAKE_BINARY_DIR}) + set(TSEP_TARGET_DIR_DEBUG ${CMAKE_BINARY_DIR}) +endif() + +# set directories +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${TSEP_TARGET_DIR_RELEASE}/bin) +if(WIN32) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${TSEP_TARGET_DIR_RELEASE}/lib) +else() +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${TSEP_TARGET_DIR_RELEASE}/bin) +endif() +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${TSEP_TARGET_DIR_RELEASE}/lib) +set(CMAKE_PDB_OUTPUT_DIRECTORY_RELEASE ${TSEP_TARGET_DIR_RELEASE}/lib) + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${TSEP_TARGET_DIR_DEBUG}/bin) +if(WIN32) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${TSEP_TARGET_DIR_DEBUG}/lib) +else() +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${TSEP_TARGET_DIR_DEBUG}/bin) +endif() +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${TSEP_TARGET_DIR_DEBUG}/lib) +set(CMAKE_PDB_OUTPUT_DIRECTORY_DEBUG ${TSEP_TARGET_DIR_DEBUG}/lib) + +IF (WIN32) + file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/Debug/bin") + file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/Release/bin") +ENDIF() + +############################################################################### + +message(NOTICE "------------------------------------------------------------") +message(NOTICE " Used Generator = ${TSEP_CMAKE_GENERATOR}") +message(NOTICE " Used Config = ${TSEP_BUILD_CONFIGURATION}") +message(NOTICE " Used Project = ${TSEP_PROJECT_NAME}") +message(NOTICE " Source path = ${TSEP_SOURCE_DIR}") +message(NOTICE " Binary path = ${TSEP_BINARY_DIR}") +message(NOTICE " Target path = ${TSEP_TARGET_DIR}") +message(NOTICE " Product Build = ${TSEP_PRODUCT_BUILD}") +message(NOTICE "------------------------------------------------------------") + +############################################################################### diff --git a/LSFramework/CMake/CMake.1.6.0/Includes/TsepVersion.h b/LSFramework/CMake/CMake.1.6.0/Includes/TsepVersion.h new file mode 100644 index 0000000..f1731f2 --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/Includes/TsepVersion.h @@ -0,0 +1,28 @@ +// define the version string and embed it into the binary +extern "C" const char TSEP_BINARY_VERSION[] = "TSEP_VERSION:" TSEP_VERSION; + +#ifdef __linux__ + #ifdef TSEP_SHARED_LIBRARY + + // if TSEP_SHARED_LIBRARY is defined an entry point for a shared library will be defined + // which will print the binary infromation + + #include + #include + + extern "C" const char interp_path[] __attribute__((section(".interp"))) = "/lib64/ld-linux-x86-64.so.2"; + + extern "C" void tsep_version_entry_point() + { + printf(TSEP_PRODUCT_NAME " " TSEP_VERSION "\n"); + printf(TSEP_COPYRIGHT "\n"); + printf("Compiled by GCC %d.%d", __GNUC__, __GNUC_MINOR__); + #ifdef _DEBUG + printf(" (debug build)"); + #endif + printf("\n"); + exit(0); + } + + #endif +#endif \ No newline at end of file diff --git a/LSFramework/CMake/CMake.1.6.0/RuleSets/TsepNativeRecommendedRules.ruleset b/LSFramework/CMake/CMake.1.6.0/RuleSets/TsepNativeRecommendedRules.ruleset new file mode 100644 index 0000000..8762034 --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/RuleSets/TsepNativeRecommendedRules.ruleset @@ -0,0 +1,283 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/LSFramework/CMake/CMake.1.6.0/RuleSets/TsepPropertySheet.props b/LSFramework/CMake/CMake.1.6.0/RuleSets/TsepPropertySheet.props new file mode 100644 index 0000000..d9e540b --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/RuleSets/TsepPropertySheet.props @@ -0,0 +1,10 @@ + + + + + + @TsepCAFileNative@ + + + + \ No newline at end of file diff --git a/LSFramework/CMake/CMake.1.6.0/Templates/CMake.nuspec.Template b/LSFramework/CMake/CMake.1.6.0/Templates/CMake.nuspec.Template new file mode 100644 index 0000000..0e3eb4f --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/Templates/CMake.nuspec.Template @@ -0,0 +1,17 @@ + + + + @TSEP_PRODUCT_NAME@ + @TSEP_NEXUS_VERSION@ + $ENV{USERNAME} + TSEP + @TSEP_PRODUCT_DESCRIPTION@ + internal + Copyright 2021 + Application + + + + + + diff --git a/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Console.Template.cmake b/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Console.Template.cmake new file mode 100644 index 0000000..a6ea3ec --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Console.Template.cmake @@ -0,0 +1,91 @@ +########################################################################################### +# +# (c) Technical Software Engineering Plazotta 2021 +# +# CMAKE project file / @Add your project name@ +# +# +#----------------------------------------------------------------------------------------- +# Define project specific requirements +# +# Project name, output file name, project description +# +set(PROJECT_NAME @Add your project name@) +set(PROJECT_OUTPUT_NAME @Add your project dll name@) +set(PROJECT_DESCRIPTION "@Add your project description@") +# +#----------------------------------------------------------------------------------------- +# Define group file names +# +# SOURCE FILES +# +set(SOURCE_FILES + src/... +) +# +# HEADER FILES +# +set(HEADER_FILES + src/... +) +# +# Define folders for group files +# +source_group("Source Files" FILES ${SOURCE_FILES}) +source_group("Header Files" FILES ${HEADER_FILES}) +# +# Include files, add your own includes +# +include_directories( + ${CMAKE_CURRENT_LIST_DIR}/src +# /- Add your additional include paths -/ +) +# +#----------------------------------------------------------------------------------------- +# Console application definitions +# +# Setup application version +# +TSEP_SETUP_APP_VERSION(${PROJECT_DESCRIPTION}) +# +# Create console application +# +add_executable(${PROJECT_NAME} + ${SOURCE_FILES} + ${HEADER_FILES} + ${TSEP_APP_VERSION_RC} +) +# +# Setup TSEP OS specific settings for the project +# +TSEP_ADD_OS_SPECIFIC_SETTINGS() +# +# Setup output +# +set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_OUTPUT_NAME}) +# +# Add used libs +# +#target_link_libraries(${PROJECT_NAME} +# PUBLIC +# /- Add your additional libraries -/ +#) +# +# Include application data files +# i.e +#set (APPLICATION_DATA_FILES +# "certificates" ${CMAKE_CURRENT_LIST_DIR}/../Test/certificates/Themis.cer +#) +# +#set (APPLICATION_DATA_FILES +# "Folder in application data folder, may be empty" ${CMAKE_CURRENT_LIST_DIR}/../folder/File_to_Be_Used +#) +# +# Create links to necessary dependency libraries +# +TSEP_GENERATE_DEPENDENCY_LINKS() +# +# Create an Export directory with the defined data +# +TSEP_CREATE_EXPORT() +# diff --git a/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Dll.Template.cmake b/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Dll.Template.cmake new file mode 100644 index 0000000..8cf8a5d --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Dll.Template.cmake @@ -0,0 +1,98 @@ +########################################################################################### +# +# (c) Technical Software Engineering Plazotta 2021 +# +# CMAKE project file / @Add your project name@ +# +# +#----------------------------------------------------------------------------------------- +# Define project specific requirements +# +# Project name, output file name, project description +# +set(PROJECT_NAME @Add your project name@) +set(PROJECT_OUTPUT_NAME @Add your project dll name@) +set(PROJECT_DESCRIPTION "@Add your project description@") +# +#----------------------------------------------------------------------------------------- +# Define group file names +# +# SOURCE FILES +# +set(SOURCE_FILES + src/... +) +# +# HEADER FILES +# +set(HEADER_FILES + src/... +) +# +#----------------------------------------------------------------------------------------- +# Define solution folders for group files +# +source_group("Source Files" FILES ${SOURCE_FILES}) +source_group("Header Files" FILES ${HEADER_FILES}) +# +#----------------------------------------------------------------------------------------- +# DLL definitions +# +# Setup shared library version +# +TSEP_SETUP_DLL_VERSION(${PROJECT_DESCRIPTION}) +# +# Create shared library target +# +add_library(${PROJECT_NAME} SHARED + ${SOURCE_FILES} + ${HEADER_FILES} + ${TSEP_DLL_VERSION_RC} +) +# +# Add alias for the project +# +add_library(Tsep::${PROJECT_NAME} ALIAS ${PROJECT_NAME}) +# +# Setup TSEP OS specific settings for the project +# +TSEP_ADD_OS_SPECIFIC_SETTINGS() +# +# Setup output name +# +set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_OUTPUT_NAME}) +# +# Use VS Code Analysis for the project +# +TSEP_USE_CODE_ANALYSIS(${PROJECT_NAME}) +# +# Define Export Headers +# +TSEP_ADD_EXPORT_HEADER("${HEADER_FILES}") +# +# Include files, add your own includes and for the export +# +target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ + #PRIVATE + # include paths, which will not be exported +) +# +# Add used libs +# +#target_link_libraries(${PROJECT_NAME} +# PUBLIC +# /- Add your additional libraries -/ +#) +# +# Create an Export directory with the defined data +# +TSEP_CREATE_EXPORT() +# +# +# Create links to necessary dependency libraries +# +TSEP_GENERATE_DEPENDENCY_LINKS() +# diff --git a/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Gui.Template.cmake b/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Gui.Template.cmake new file mode 100644 index 0000000..7639c69 --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Gui.Template.cmake @@ -0,0 +1,130 @@ +########################################################################################### +# +# (c) Technical Software Engineering Plazotta 2021 +# +# CMAKE project file / @Add your project name@ +# +# +#----------------------------------------------------------------------------------------- +# Define project specific requirements +# +# Project name, output file name, project description +# +set(PROJECT_NAME @Add your project name@) +set(PROJECT_OUTPUT_NAME @Add your project dll name@) +set(PROJECT_DESCRIPTION "@Add your project description@") +# +#----------------------------------------------------------------------------------------- +# +# qt moc, rcc uic +# +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_INCLUDE_CURRENT_DIR ON) +# +# Define group file names +# +# SOURCE FILES +# +set(SOURCE_FILES + src/... +) +# +# HEADER FILES +# +set(HEADER_FILES + src/... +) +# +# UI FILES +# +set(UI_FILES + ui/... +) +qt5_wrap_ui(UI_FILES_WRAPPED ${UI_FILES}) +# +# +# TRANSLATION +# +# Define supported Language +set(LANGUAGES + de +) +# +# Create .ts and .qm Files +TSEP_TRANSLATE(${LANGUAGES}) +# +# +# RESOURCE FILES +# +set(RESOURCE_FILES + resources/... +) +# +# Define folders for group files +# +source_group("Source Files" FILES ${SOURCE_FILES}) +source_group("Header Files" FILES ${HEADER_FILES}) +source_group("UI Files" FILES ${UI_FILES} ${UI_FILES_WRAPPED}) +source_group("Resource Files" FILES ${RESOURCE_FILES}) +# +# Include files, add your own includes +# +include_directories( + ${CMAKE_CURRENT_LIST_DIR}/src +# /- Add your additional include paths -/ +) +# +#----------------------------------------------------------------------------------------- +# Gui application definitions +# +# Setup application version +# +TSEP_SETUP_APP_VERSION(${PROJECT_DESCRIPTION}) +# +# Create gui application +# +add_executable(${PROJECT_NAME} WIN32 + ${SOURCE_FILES} + ${HEADER_FILES} + ${UI_FILES} + ${UI_FILES_WRAPPED} + ${RESOURCE_FILES} + ${TSEP_APP_VERSION_RC} + ${TSEP_TRANSLATION_FILES} +) +# +# Setup TSEP OS specific settings for the project +# +TSEP_ADD_OS_SPECIFIC_SETTINGS() +# +# Setup output +# +set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_OUTPUT_NAME}) +# +# Add used libs +# +#target_link_libraries(${PROJECT_NAME} +# PUBLIC +# /- Add your additional libraries -/ +#) +# +# +# Include application data files +# i.e +#set (APPLICATION_DATA_FILES +# "certificates" ${CMAKE_CURRENT_LIST_DIR}/../Test/certificates/Themis.cer +#) +# +#set (APPLICATION_DATA_FILES +# "Folder in application data folder, may be empty" ${CMAKE_CURRENT_LIST_DIR}/../folder/File_to_Be_Used +#) + +# Create links to necessary dependency libraries +# +TSEP_GENERATE_DEPENDENCY_LINKS() +# +# Create an Export directory with the defined data +# +TSEP_CREATE_EXPORT() +# diff --git a/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Lib.Template.cmake b/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Lib.Template.cmake new file mode 100644 index 0000000..5a537e7 --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Lib.Template.cmake @@ -0,0 +1,85 @@ +########################################################################################### +# +# (c) Technical Software Engineering Plazotta 2021 +# +# CMAKE project file / @Add your project name@ +# +# +#----------------------------------------------------------------------------------------- +# Define project specific requirements +# +# Project name, output file name, project description +# +set(PROJECT_NAME @Add your project name@) +set(PROJECT_OUTPUT_NAME @Add your project lib name@) +set(PROJECT_DESCRIPTION "@Add your project description@") +# +#----------------------------------------------------------------------------------------- +# Define group file names +# +# SOURCE FILES +# +set(SOURCE_FILES + src/... +) +# +# HEADER FILES +# +set(HEADER_FILES + src/... +) +# +#----------------------------------------------------------------------------------------- +# Define solution folders for group files +# +source_group("Source Files" FILES ${SOURCE_FILES}) +source_group("Header Files" FILES ${HEADER_FILES}) +# +# Create static library target +# +add_library(${PROJECT_NAME} STATIC + ${SOURCE_FILES} + ${HEADER_FILES} +) +# +# Add alias for the project +# +add_library(Tsep::${PROJECT_NAME} ALIAS ${PROJECT_NAME}) +# +# Setup TSEP OS specific settings for the project +# +TSEP_ADD_OS_SPECIFIC_SETTINGS() +# +# Setup output name +# +set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_OUTPUT_NAME}) +# +# Use VS Code Analysis for the project +# +TSEP_USE_CODE_ANALYSIS(${PROJECT_NAME}) +# +# Define Export Headers +# +TSEP_ADD_EXPORT_HEADER("${HEADER_FILES}") +# +# Include files, add your own includes and for the export +# +target_include_directories(${PROJECT_NAME} + PUBLIC + $ + $ + #PRIVATE + # include paths, which will not be exported +) +# +# Add used libs +# +#target_link_libraries(${PROJECT_NAME} +# PUBLIC +# /- Add your additional libraries -/ +#) +# +# Create an Export directory with the defined data +# +TSEP_CREATE_EXPORT(static) +# diff --git a/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Nexus.Template.cmake b/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Nexus.Template.cmake new file mode 100644 index 0000000..8a362b6 --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Nexus.Template.cmake @@ -0,0 +1,25 @@ +########################################################################################### +# +# (c) Technical Software Engineering Plazotta 2021 +# +# CMAKE template file to upload the paket into Nexus +# +# +#----------------------------------------------------------------------------------------- +# Define project specific requirements +# +set(PROJECT_NAME NEXUS_UPLOAD) +set(PROJECT_DESCRIPTION "TSEP Nexus upload project") + +add_custom_target(${PROJECT_NAME} + COMMENT "Upload Nexus Paket ..." + VERBATIM + WORKING_DIRECTORY ${TSEP_EXPORT_DIR} + COMMAND_EXPAND_LISTS + COMMAND ${TSEP_NUGET_APPLICATION} pack ${TSEP_EXPORT_DIR}/${TSEP_PRODUCT_NAME}.nuspec -outputdirectory ${TSEP_EXPORT_DIR} -BasePath ${TSEP_EXPORT_DIR} -verbosity detailed + COMMAND ${TSEP_NUGET_APPLICATION} push *.nupkg ${TSEP_NEXUS_GUID} -source ${TSEP_NEXUS_URL}/Development/ -verbosity detailed +) + +set_target_properties(${PROJECT_NAME} PROPERTIES FOLDER "CMakePredefinedTargets") +set_target_properties(${PROJECT_NAME} PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1) + diff --git a/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Project.Template.cmake b/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Project.Template.cmake new file mode 100644 index 0000000..bb8672b --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.Project.Template.cmake @@ -0,0 +1,58 @@ +########################################################################################### +# +# (c) Technical Software Engineering Plazotta 2021 +# +# CMAKE project main file / @Add your project name@ +# +#----------------------------------------------------------------------------------------- +# Define project specific requirements +# +# Minimum CMAKE version for this project +# +cmake_minimum_required (VERSION 3.15.0) +# +# Name of the project +set(MAIN_PROJECT_NAME @Add your project name@) +project(${MAIN_PROJECT_NAME}) +# +#----------------------------------------------------------------------------------------- +# Include project specific definitions -> Generated file +# +include(Project.conf.cmake) +# +#----------------------------------------------------------------------------------------- +# Include cmake settings and macros +# +include(${TSEP_PROJECT_CMAKE}/CMakeMacros.cmake) +include(${TSEP_PROJECT_CMAKE}/CMakeSettings.cmake) +# +#----------------------------------------------------------------------------------------- +# google test framework -> enable if used +# +#TSEP_USE_GOOGLE_TESTING() +# +#----------------------------------------------------------------------------------------- +# Current project description +# +set(TSEP_PROJECT "@Add your project description@") +# +#----------------------------------------------------------------------------------------- +# Allow project folder structure +# +set_property(GLOBAL PROPERTY USE_FOLDERS ON) +# +#----------------------------------------------------------------------------------------- +# Define projects for building +# +add_subdirectory("@Add your project name@") +add_subdirectory("@Add your unittest name@") +# +#----------------------------------------------------------------------------------------- +# Define projects for managing and distributing +# +# NEXUS Upload (Only windows) +# +IF(WIN32) + TSEP_ADD_PROJECT_NEXUS_UPLOAD() +ENDIF() +# diff --git a/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.UnitTests.Template.cmake b/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.UnitTests.Template.cmake new file mode 100644 index 0000000..b5788c0 --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.UnitTests.Template.cmake @@ -0,0 +1,79 @@ +########################################################################################### +# +# (c) Technical Software Engineering Plazotta 2021 +# +# CMAKE project file / @Add your project name@ + +# +#----------------------------------------------------------------------------------------- +# Define project specific requirements +# +# Project name, output file name, project description +# +set(PROJECT_NAME @Add your project name@) +set(PROJECT_OUTPUT_NAME @Add your project name@) +set(UNITTEST_PROJECT @Add your unittest name@) +set(PROJECT_DESCRIPTION "Unit tests for project @Add your project name@") +# +#----------------------------------------------------------------------------------------- +# Define group file names +# +# NOTE: When using GLOB or GLOB_RECURSE for gathering files, CMake will not notice when the amount of files has changed (a file has been added/removed). +# The CMakeList has to be compiled manually after adding/removing a source/header file. +# +# SOURCE FILES +# +FILE(GLOB_RECURSE SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/*/*.cpp) +# +# HEADER FILES +# +FILE(GLOB_RECURSE HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/*/*.h) +# +#----------------------------------------------------------------------------------------- +# Define solution folders for group files +# +source_group("Source Files" FILES ${SOURCE_FILES} main.cpp) +source_group("Header Files" FILES ${HEADER_FILES}) +# +#----------------------------------------------------------------------------------------- +# Console application definitions +# +# Setup application version +# +TSEP_SETUP_APP_VERSION(${PROJECT_DESCRIPTION}) +# +# Create console application +# +add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${HEADER_FILES} ${TSEP_APP_VERSION_RC} main.cpp) +# +# Setup output +# +set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_OUTPUT_NAME}) +set_target_properties(${PROJECT_NAME} PROPERTIES FOLDER "UnitTest") +# +# Add used libs +# +target_link_libraries(${PROJECT_NAME} + PUBLIC + ${UNITTEST_PROJECT} + GTest::GTest +) +# +#----------------------------------------------------------------------------------------- +# Include files, add your own includes +TSEP_GET_HEADER_DIRECTORIES(SOURCE_INCLUDE_LIST ${TSEP_SOURCE_DIR}/${UNITTEST_PROJECT}) +TSEP_GET_HEADER_DIRECTORIES(UNIT_TEST_INCLUDE_LIST ${CMAKE_CURRENT_LIST_DIR}) +# +target_include_directories(${PROJECT_NAME} + PUBLIC + ${UNIT_TEST_INCLUDE_LIST} + ${SOURCE_INCLUDE_LIST} + #PRIVATE + # include paths, which will not be exported +) +# +# Create links to necessary dependency libraries +# +TSEP_GENERATE_DEPENDENCY_LINKS() +# + diff --git a/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.VS_CodeAnalyzer.Template.cmake b/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.VS_CodeAnalyzer.Template.cmake new file mode 100644 index 0000000..1987190 --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/Templates/CMakeLists.VS_CodeAnalyzer.Template.cmake @@ -0,0 +1,29 @@ +########################################################################################### +# +# (c) Technical Software Engineering Plazotta 2021 +# +# CMAKE project main file +# +# History +# 29.09.2019 / Plazotta +# Template created. +# +#----------------------------------------------------------------------------------------- +# Define project spezific requierements +# +# Project name, output file name, project description +# +set(PROJECT_NAME VS_CODE_ANALYZER) +set(PROJECT_DESCRIPTION "TSEP Static Code Analyzer for Visual Studio") +# +#----------------------------------------------------------------------------------------- +# Static Code Analyzer for VS in Windows +# +# +IF (WIN32) +add_custom_target(${PROJECT_NAME} + COMMAND msbuild $(SolutionDir)/$(SolutionFileName) /m /t:Rebuild /p:RunCodeAnalysis=true /p:CodeAnalysisRuleSet=AllRules.ruleset + COMMENT "Running Code Analyzer ..." +) +set_target_properties(${PROJECT_NAME} PROPERTIES FOLDER "CMakePredefinedTargets") +ENDIF (WIN32) diff --git a/LSFramework/CMake/CMake.1.6.0/Templates/LinuxGenerateProject.Template.sh b/LSFramework/CMake/CMake.1.6.0/Templates/LinuxGenerateProject.Template.sh new file mode 100644 index 0000000..a27f862 --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/Templates/LinuxGenerateProject.Template.sh @@ -0,0 +1,35 @@ +#//======================================================================== +#// Copyright (c) Technische Software Entwicklung Plazotta © 2021 +#// +#// DESCRIPTION: +#// Shell Script to Build a cmake project under linux +#// +#// HISTORY: +#// 09.04.2021 / PP +#// Module created. +#//======================================================================== +#!/bin/bash +# +#- Setup Build Results ------------------------------------------------- +cd .. +mkdir -p BuildResults +rm -r ./BuildResults_linux_Release +rm -r ./BuildResults_linux_Debug +mkdir -p BuildResults_linux_Release +mkdir -p BuildResults_linux_Debug + +#- CMAKE (Release)------------------------------------------------------ +cd BuildResults_linux_Release +cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release ../Software +if [ $? -ne 0 ]; then + echo "Error during CMake(Release) generation..." + exit 1 +fi + +#- CMAKE (Debug) ------------------------------------------------------- +cd ../BuildResults_linux_Debug +cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug ../Software +if [ $? -ne 0 ]; then + echo "Error during CMake(Debug) generation..." + exit 1 +fi diff --git a/LSFramework/CMake/CMake.1.6.0/Templates/ProjektName.Exports.Template.h b/LSFramework/CMake/CMake.1.6.0/Templates/ProjektName.Exports.Template.h new file mode 100644 index 0000000..af00a57 --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/Templates/ProjektName.Exports.Template.h @@ -0,0 +1,47 @@ +/** +* @page @Add your project name@ +* +* @author TSEP +* +* @copyright (c) Technical Software Engineering Plazotta 2021 +* +*/ +/** +* @file @Add your project name@.Exports.h +* @brief Definition of export declarations for this library +* +**************************************************************************/ +//TSEP_Pragma.UnitTest.Skip +#pragma once + +// Note: +// "_EXPORTS" preprocessor define is defined by CMake when compiling + +/*------------------------------------------------------------------------------ +// OPERATING SYSTEM : WIN32 +//----------------------------------------------------------------------------*/ +#ifdef _WIN32 + +/// @cond Exclude this macro from doxygen +#ifdef @Add your project name@_EXPORTS +#define TSEP_@Add your uppercase project name@_API __declspec(dllexport) +#else +#define TSEP_@Add your uppercase project name@_API __declspec(dllimport) +#endif +/// @endcond + +#endif + +/*------------------------------------------------------------------------------ +// OPERATING SYSTEM : LINUX +//----------------------------------------------------------------------------*/ +#ifdef __linux__ + +#ifdef @Add your project name@_EXPORTS +#define TSEP_@Add your uppercase project name@_API __attribute__((visibility("default"))) +#else +#define TSEP_@Add your uppercase project name@_API +#endif + +#endif // __linux__ + diff --git a/LSFramework/CMake/CMake.1.6.0/Templates/Translation.Template.ts b/LSFramework/CMake/CMake.1.6.0/Templates/Translation.Template.ts new file mode 100644 index 0000000..1552582 --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/Templates/Translation.Template.ts @@ -0,0 +1,4 @@ + + + + diff --git a/LSFramework/CMake/CMake.1.6.0/Templates/Translations.Template.qrc b/LSFramework/CMake/CMake.1.6.0/Templates/Translations.Template.qrc new file mode 100644 index 0000000..2a8f166 --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/Templates/Translations.Template.qrc @@ -0,0 +1,5 @@ + + + @TRANSLATION_RESOURCE_STRING@ + + \ No newline at end of file diff --git a/LSFramework/CMake/CMake.1.6.0/Templates/VSGenerateProject.cmd.Template b/LSFramework/CMake/CMake.1.6.0/Templates/VSGenerateProject.cmd.Template new file mode 100644 index 0000000..1111f36 --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/Templates/VSGenerateProject.cmd.Template @@ -0,0 +1,44 @@ +@echo off +setlocal + +rem ########################################################################################### +rem # +rem # (c) Technical Software Engineering Plazotta 2019 +rem # +rem # CMAKE generator file for Windows VS +rem # +rem # History +rem # 29.09.2019 / Plazotta +rem # Template created. +rem # +rem ########################################################################################### +rem # +rem # This generator executes cmake based on the here configured values. All files will be +rem # copied to the location as given in the parameter BUILDRESULTS. The solution file can +rem # be found in this location. +rem # In this case a normal Windows Visual Studio 2017 solution will be created. +rem # +rem ########################################################################################### + +rem Define build parameters +set ARCHITECTURE=x64 +set VISUAL_STUDIO=msvc2017 +set GENERATOR=Visual Studio 15 2017 Win64 + +rem ########################################################################################### +rem Concatenate build directory +set BUILDRESULTS=%~dp0\..\BuildResults\%VISUAL_STUDIO%_%ARCHITECTURE% + +rem ########################################################################################### +rem Create build directory and push into it +if not exist %BUILDRESULTS% mkdir %BUILDRESULTS% +pushd %BUILDRESULTS% + +rem ########################################################################################### +rem Run CMake to build the solution +echo running CMake... +cmake.exe -G "%GENERATOR%" ../../Software + +rem ########################################################################################### +popd +pause \ No newline at end of file diff --git a/LSFramework/CMake/CMake.1.6.0/Versions/Win32/DefaultAppVersion.rc b/LSFramework/CMake/CMake.1.6.0/Versions/Win32/DefaultAppVersion.rc new file mode 100644 index 0000000..ced4f31 --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/Versions/Win32/DefaultAppVersion.rc @@ -0,0 +1,46 @@ +#include "winres.h" + +#ifndef DEBUG +#define VER_DEBUG 0 +#else +#define VER_DEBUG 1 +#endif + +VS_VERSION_INFO VERSIONINFO + + + +FILEVERSION VER_FILEVERSION +PRODUCTVERSION VER_FILEVERSION +FILEFLAGSMASK 0x3fL +FILEFLAGS VER_DEBUG +FILEOS 0x40004L +FILETYPE 0x0L +FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", VER_COMPANYNAME_STR + VALUE "FileDescription", VER_FILEDESCRIPTION_STR + VALUE "FileVersion", VER_FILEVERSION_STR + VALUE "LegalCopyright", VER_LEGALCOPYRIGHT_STR + VALUE "ProductName", VER_PRODUCTNAME_STR + VALUE "ProductVersion", VER_FILEVERSION_STR + END + END + + BLOCK "VarFileInfo" + BEGIN + /* The following line should only be modified for localized versions. */ + /* It consists of any number of WORD,WORD pairs, with each pair */ + /* describing a language,codepage combination supported by the file. */ + /* */ + /* For example, a file might have values "0x409,1252" indicating that it */ + /* supports English language (0x409) in the Windows ANSI codepage (1252). */ + + VALUE "Translation", 0x409, 1252 + + END +END \ No newline at end of file diff --git a/LSFramework/CMake/CMake.1.6.0/Versions/Win32/DefaultDllVersion.rc b/LSFramework/CMake/CMake.1.6.0/Versions/Win32/DefaultDllVersion.rc new file mode 100644 index 0000000..39c302c --- /dev/null +++ b/LSFramework/CMake/CMake.1.6.0/Versions/Win32/DefaultDllVersion.rc @@ -0,0 +1,46 @@ +#include "winres.h" + +#ifndef DEBUG +#define VER_DEBUG 0 +#else +#define VER_DEBUG 1 +#endif + +VS_VERSION_INFO VERSIONINFO + + + +FILEVERSION VER_FILEVERSION +PRODUCTVERSION VER_FILEVERSION +FILEFLAGSMASK 0x3fL +FILEFLAGS VER_DEBUG +FILEOS 0x40004L +FILETYPE 0x1L +FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", VER_COMPANYNAME_STR + VALUE "FileDescription", VER_FILEDESCRIPTION_STR + VALUE "FileVersion", VER_FILEVERSION_STR + VALUE "LegalCopyright", VER_LEGALCOPYRIGHT_STR + VALUE "ProductName", VER_PRODUCTNAME_STR + VALUE "ProductVersion", VER_FILEVERSION_STR + END + END + + BLOCK "VarFileInfo" + BEGIN + /* The following line should only be modified for localized versions. */ + /* It consists of any number of WORD,WORD pairs, with each pair */ + /* describing a language,codepage combination supported by the file. */ + /* */ + /* For example, a file might have values "0x409,1252" indicating that it */ + /* supports English language (0x409) in the Windows ANSI codepage (1252). */ + + VALUE "Translation", 0x409, 1252 + + END +END \ No newline at end of file diff --git a/LSFramework/CMake/CMake.1.6.0/Versions/Win32/TSEP.ico b/LSFramework/CMake/CMake.1.6.0/Versions/Win32/TSEP.ico new file mode 100644 index 0000000000000000000000000000000000000000..bc07432d6a13ff71235c4016c61a8ff4c838baad GIT binary patch literal 59625 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 m_uiCapacity) { IncreaseCapacity(zNewLength); } - char* pLeft = m_pData + uiPos; - char* pRight = m_pData + uiPos + zLength; + char* pLeft = m_pData + zPos; + char* pRight = m_pData + zPos + zLength; - memcpy(pRight, m_pData + uiPos, m_uiLength - uiPos); + memcpy(pRight, m_pData + zPos, m_zSize - zPos); memcpy(pLeft, pData, zLength); - m_uiLength = zNewLength; + m_zSize = zNewLength; } //----------------------------------------------------------------------------------------------------------------------------- bool LSString::RemoveAt(size_t uiPos, size_t uiSize) { - if (uiPos > m_uiLength) return false; + if (uiPos > m_zSize) return false; - m_uiLength = m_uiLength - uiSize; + m_zSize = m_zSize - uiSize; char* pLast = m_pData + uiPos + uiSize; memcpy(m_pData + uiPos, pLast, uiSize); memset(pLast, 0, uiSize); @@ -87,20 +86,19 @@ bool LSString::RemoveAt(size_t uiPos, size_t uiSize) size_t LSString::StringLength(const char* pChar) const { if (!pChar) return 0; - size_t iRet = 0; - while (*pChar != 0x0) + size_t zRet = 0; + while (*(pChar + zRet) != 0x0) { - pChar++; - iRet++; + zRet++; } - return iRet; + return zRet; } //----------------------------------------------------------------------------------------------------------------------------- int LSString::Find(const char * pData, size_t uiOffset, size_t uiLength) const { int iRet = -1; - while (uiOffset + uiLength <= m_uiLength) + while (uiOffset + uiLength <= m_zSize) { iRet = memcmp(m_pData + uiOffset, pData, uiLength); if (iRet == 0) break; @@ -115,7 +113,7 @@ void LSString::IncreaseCapacity(size_t uiNewLength) m_uiCapacity = (m_uiCapacity + uiNewLength) * c_uiCapacityIncreaseFactor; char* pNew = new char[m_uiCapacity + 1]; memset(pNew, 0, m_uiCapacity + 1); - memcpy(pNew, m_pData, m_uiLength); + memcpy(pNew, m_pData, m_zSize); DELETE_ARRAY(m_pData); m_pData = pNew; } \ No newline at end of file diff --git a/LSFramework/LSString.h b/LSFramework/LSString.h index ae2b86e..beb9be6 100644 --- a/LSFramework/LSString.h +++ b/LSFramework/LSString.h @@ -33,7 +33,7 @@ public: //----------------------------------------------------------------------------------------------------------------------------- inline void Append(const LSString& sRhs) { - Insert(sRhs, sRhs.Length()); + Insert(sRhs, sRhs.Size()); } inline void Append(const std::string& sRhs) { @@ -41,21 +41,21 @@ public: } inline void Append(const char* pData) { - Insert(pData, m_uiLength); + Insert(pData, StringLength(pData), m_zSize); } //----------------------------------------------------------------------------------------------------------------------------- - inline void Insert(const LSString& sRhs, size_t uiPos) + inline void Insert(const LSString& sRhs, size_t zPos) { - Insert(sRhs.m_pData, uiPos); + Insert(sRhs.m_pData, sRhs.Size(), zPos); } - inline void Insert(const std::string& sRhs, size_t uiPos) + inline void Insert(const std::string& sRhs, size_t zPos) { - Insert(sRhs.c_str(), uiPos); + Insert(sRhs.c_str(), sRhs.size(), zPos); } //----------------------------------------------------------------------------------------------------------------------------- inline bool Remove(const LSString& sRhs) { - return RemoveAt(Find(sRhs), sRhs.m_uiLength); + return RemoveAt(Find(sRhs), sRhs.m_zSize); } inline bool Remove(const std::string& sRhs) { @@ -69,7 +69,7 @@ public: #pragma region Logic void Assign(const char* pData); - void Insert(const char* pData, size_t uiPos); + void Insert(const char* pData, size_t zLength, size_t zPos); bool RemoveAt(size_t uiPos, size_t uiSize); #pragma endregion @@ -125,9 +125,9 @@ public: return *(m_pData + uiPos); } //----------------------------------------------------------------------------------------------------------------------------- - inline size_t Length() const + inline size_t Size() const { - return m_uiLength; + return m_zSize; } //----------------------------------------------------------------------------------------------------------------------------- inline size_t Capacity() const @@ -150,7 +150,7 @@ private: void IncreaseCapacity(size_t uiNewLength = 0); char* m_pData = nullptr; - size_t m_uiLength = 0; + size_t m_zSize = 0; size_t m_uiCapacity = 0; const float c_uiCapacityIncreaseFactor = 1.5; }; diff --git a/LSFramework/LSVector.h b/LSFramework/LSVector.h index ab8b150..1e00e06 100644 --- a/LSFramework/LSVector.h +++ b/LSFramework/LSVector.h @@ -4,5 +4,14 @@ template class LSVector { + LSVector() + { + + } + + ~LSVector() + { + + } }; diff --git a/LSFramework/VSGenerateProject.cmd b/LSFramework/VSGenerateProject.cmd new file mode 100644 index 0000000..0c0d8f7 --- /dev/null +++ b/LSFramework/VSGenerateProject.cmd @@ -0,0 +1,25 @@ +@echo off +setlocal + +rem define build parameters +set ARCHITECTURE=x64 +set VISUAL_STUDIO=msvc2019 +set GENERATOR=Visual Studio 16 2019 Win64 + +rem concatenate build directory +set BUILDRESULTS=%~dp0\..\BuildResults\%VISUAL_STUDIO%_%ARCHITECTURE% + +rem create build directory and push into it +if not exist %BUILDRESULTS% mkdir %BUILDRESULTS% +if not exist %BUILDRESULTS%\Debug\bin mkdir %BUILDRESULTS%\Debug\bin +if not exist %BUILDRESULTS%\Release\bin mkdir %BUILDRESULTS%\Release\bin + +pushd %BUILDRESULTS% + +rem run CMake to build the solution +echo running CMake... +cmake.exe -G "%GENERATOR%" ../../Software + +popd + +pause \ No newline at end of file diff --git a/LSFramework/main.cpp b/LSFramework/main.cpp index 8e8ae36..2d3cc86 100644 --- a/LSFramework/main.cpp +++ b/LSFramework/main.cpp @@ -3,11 +3,58 @@ #include "LSList.h" #include "Timer.h" -#define RUNS 50U +//#define RUNS 50U +#define RUNS ULLONG_MAX-1 #define PAYLOAD "1873612578869" +size_t StrLen1(const char* pChar) +{ + if (!pChar) return 0; + size_t zRet = 0; + while (*(pChar + zRet) != 0x0) + { + zRet++; + } + return zRet; +} + +size_t StrLen2(const char* pChar) +{ + if (!pChar) return 0; + const char* pFirst = pChar; + while (*pChar != 0x0) + { + pChar++; + } + return pChar - pFirst; +} + int main() { + + char string[] = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis.At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit ametDuis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis au"; + + size_t i = 0; + { + Timer tWhole("String1 Func1 "); + for (size_t zRun = 0; zRun <= RUNS; zRun++) + { + i = StrLen1(string); + } + printf("Ergebniss: %d\n", (int) i); + } + + { + Timer tWhole("String1 Func2 "); + for (size_t zRun = 0; zRun <= RUNS; zRun++) + { + i = StrLen2(string); + } + printf("Ergebniss: %d\n", (int) i); + } + + return i; + printf("---LSString---\n"); LSString s3; const LSString s1 = "187"; @@ -16,10 +63,6 @@ int main() { s3 = s1 + s2; } - - - return 0; - // - STRING