From 2a30c0d77b83f23d933d6492308134428cccc805 Mon Sep 17 00:00:00 2001 From: Eugene Lykov Date: Fri, 19 Dec 2025 20:08:22 +0000 Subject: [PATCH] Initial commit --- .gitignore | 101 +++++++++++++++++ .vscode/new_class.code-snippets | 41 +++++++ .vscode/settings.json | 3 + CMakeLists.txt | 191 ++++++++++++++++++++++++++++++++ LICENSE | 11 ++ README.md | 3 + esProject.code-workspace | 11 ++ libs/CMakeLists.txt | 10 ++ srcs/CMakeLists.txt | 54 +++++++++ srcs/Version.h.in | 6 + srcs/main.cpp | 5 + tools/cmake/SubDirList.cmake | 8 ++ 12 files changed, 444 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/new_class.code-snippets create mode 100644 .vscode/settings.json create mode 100644 CMakeLists.txt create mode 100644 LICENSE create mode 100644 README.md create mode 100644 esProject.code-workspace create mode 100644 libs/CMakeLists.txt create mode 100644 srcs/CMakeLists.txt create mode 100644 srcs/Version.h.in create mode 100644 srcs/main.cpp create mode 100644 tools/cmake/SubDirList.cmake diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d029754 --- /dev/null +++ b/.gitignore @@ -0,0 +1,101 @@ +srcs/Version.h + +# ---> CMake +bin/* +build/* +CMakeLists.txt.user +CMakeCache.txt +CMakeFiles +CMakeScripts +Testing +Makefile +cmake_install.cmake +install_manifest.txt +compile_commands.json +CTestTestfile.cmake +_deps + +# ---> VisualStudioCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +# ---> Linux +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +# ---> Windows +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# ---> macOS +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + diff --git a/.vscode/new_class.code-snippets b/.vscode/new_class.code-snippets new file mode 100644 index 0000000..4f07f5b --- /dev/null +++ b/.vscode/new_class.code-snippets @@ -0,0 +1,41 @@ +{ + // Place your esEngine workspace snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and + // description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope + // is left empty or omitted, the snippet gets applied to all languages. The prefix is what is + // used to trigger the snippet and the body will be expanded and inserted. Possible variables are: + // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. + // Placeholders with the same ids are connected. + // Example: + // "Print to console": { + // "scope": "javascript,typescript", + // "prefix": "log", + // "body": [ + // "console.log('$1');", + // "$2" + // ], + // "description": "Log output to console" + // } + "Guard": { + "prefix": "esGuard", + "scope": "cpp", + "body": [ + "#ifndef ${WORKSPACE_NAME/(\\w+)/${1:/upcase}${1:+_}/g}${TM_DIRECTORY/(\\w+)(?!\\w*$)|(\\W)|(\\w+)/${3:/upcase}${3:+_}/g}${TM_FILENAME/(\\w+)(?!\\w*$)|(\\W)|(\\w+)/${1:/upcase}${2:+_}${3:/upcase}${3:+_}/g}GUARD", + "#define ${WORKSPACE_NAME/(\\w+)/${1:/upcase}${1:+_}/g}${TM_DIRECTORY/(\\w+)(?!\\w*$)|(\\W)|(\\w+)/${3:/upcase}${3:+_}/g}${TM_FILENAME/(\\w+)(?!\\w*$)|(\\W)|(\\w+)/${1:/upcase}${2:+_}${3:/upcase}${3:+_}/g}GUARD", + "\nnamespace ${WORKSPACE_NAME}\n{", + "\tnamespace ${TM_DIRECTORY/(\\w+)(?!\\w*$)|(\\W)|(\\w+)/$3/g}\n\t{", + "\n\t} // ${TM_DIRECTORY/(\\w+)(?!\\w*$)|(\\W)|(\\w+)/$3/g}", + "} // ${WORKSPACE_NAME}", + "\n#endif // ${WORKSPACE_NAME/(\\w+)/${1:/upcase}${1:+_}/g}${TM_DIRECTORY/(\\w+)(?!\\w*$)|(\\W)|(\\w+)/${3:/upcase}${3:+_}/g}${TM_FILENAME/(\\w+)(?!\\w*$)|(\\W)|(\\w+)/${1:/upcase}${2:+_}${3:/upcase}${3:+_}/g}GUARD", + ] + }, + "Namespace": { + "prefix": "esNamespace", + "scope": "cpp", + "body": [ + "\nnamespace ${WORKSPACE_NAME}\n{", + "\tnamespace ${TM_DIRECTORY/(\\w+)(?!\\w*$)|(\\W)|(\\w+)/$3/g}\n\t{", + "\n\t} // ${TM_DIRECTORY/(\\w+)(?!\\w*$)|(\\W)|(\\w+)/$3/g}", + "} // ${WORKSPACE_NAME}" + ] + } +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..70e34ec --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "C_Cpp.errorSquiggles": "disabled" +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..5a089b8 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,191 @@ +# CMakeList.txt : Top-level CMake project file, do global configuration +# and include sub-projects here. +# +cmake_minimum_required (VERSION 3.10) + +list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/tools/cmake) +include(SubDirList) + +get_filename_component(PROJECT_DIR ${CMAKE_CURRENT_SOURCE_DIR} NAME) +string(REPLACE " " "_" PROJECT_DIR ${PROJECT_DIR}) +project(${PROJECT_DIR}) + +set(PROJECT_VERSION_MAJOR 0) +set(PROJECT_VERSION_MINOR 1) +set(PROJECT_VERSION_PATCH 0) +set(PROJECT_VERSION_BRANCH "N/A") +set(PROJECT_VERSION_COMMIT "N/A") + +# Get the current working branch +execute_process( + COMMAND git rev-parse --abbrev-ref HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE PROJECT_VERSION_BRANCH + OUTPUT_STRIP_TRAILING_WHITESPACE) + +# Get the latest commit hash +execute_process( + COMMAND git rev-parse --short HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE PROJECT_VERSION_COMMIT + OUTPUT_STRIP_TRAILING_WHITESPACE) + +set(PROJECT_VERSION_FULL ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}-${PROJECT_VERSION_BRANCH}-${PROJECT_VERSION_COMMIT}) + +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}/bin) + +set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install) + +set(CMAKE_CACHEFILE_DIR ${CMAKE_SOURCE_DIR}/build) + +include(CTest) +enable_testing() + +set(CMAKE_CXX_STANDARD 20) +set(CPACK_PROJECT_NAME ${${PROJECT_NAME}_NAME}) +set(CPACK_PROJECT_VERSION ${${PROJECT_NAME}_VERSION}) +include(CPack) + +option(${PROJECT_NAME}_BUILD_ENGINE "Build engine library" ON) +option(${PROJECT_NAME}_BUILD_APPS "Build supplimentary applications" ON) +option(${PROJECT_NAME}_BUILD_DEPS "Build dependencies" ON) + +option(ONLY_COVERAGE "Build only tests necessary for coverage" OFF) +option(LIBCPP "Build with libc++" OFF) +option(ENABLE_COVERAGE "Enable coverage reporting for gcc/clang" OFF) +option(ENABLE_ASAN "Enable address sanitizer" OFF) +option(BUILD_SHARED_LIBS "Enable compilation of shared libraries" OFF) +option(ENABLE_TESTING "Enable the building of the test" OFF) +option(ENABLE_CLANG_TIDY "Enable testing with clang-tidy" OFF) +option(ENABLE_CPPCHECK "Enable testing with cppcheck" OFF) +option(SIMPLE_BUILD "Build the project as minimally as possible" OFF) +option(BUILD_DOC "Build the project's documentation" OFF) +option(FORCE_COLORED_OUTPUT "Always produce ANSI-colored output (GNU/Clang only)." OFF) +option(DEBUG_LOGGING "Enabling debug logging" OFF) + +add_library(project_warnings INTERFACE) +add_library(project_options INTERFACE) + +if(ONLY_COVERAGE OR ENABLE_COVERAGE) + target_compile_options(project_options INTERFACE --coverage -O0 -g) + target_link_libraries(project_options INTERFACE --coverage) +endif() + +if(ENABLE_ASAN) + target_compile_options(project_options INTERFACE -fsanitize=address) + target_link_libraries(project_options INTERFACE -fsanitize=address) +endif() + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + target_compile_options(project_warnings + INTERFACE + -Wall + -Wextra + -Wshadow + -Wnon-virtual-dtor + -Wold-style-cast + -Wcast-align + -Wunused + -Woverloaded-virtual + -Wpedantic + -Wconversion + -Wsign-conversion + -Wnull-dereference + -Wdouble-promotion + -Wformat=2) +endif() + +# some GCC specific warnings. These flags are added only if the used compiler is GCC. +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + target_compile_options(project_warnings + INTERFACE + -Wmisleading-indentation + -Wduplicated-cond + -Wlogical-op + -Wuseless-cast + ) + target_link_libraries(project_options INTERFACE stdc++fs) +endif() + +if (${FORCE_COLORED_OUTPUT}) + if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + target_compile_options(project_options INTERFACE -fdiagnostics-color=always) + elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + target_compile_options(project_options INTERFACE -fcolor-diagnostics) + endif () +endif () + +find_program(CCACHE ccache) +if(CCACHE) + set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE}) +endif() + +if(ENABLE_CPPCHECK) + find_program(CPPCHECK cppcheck) + if(CPPCHECK) + set(CMAKE_CXX_CPPCHECK + ${CPPCHECK} + --suppress=syntaxError + --enable=all + --inconclusive) + else() + message(SEND_ERROR "cppcheck requested but executable not found") + endif() +endif() + +if(ENABLE_CLANG_TIDY) + find_program(CLANGTIDY clang-tidy) + if(CLANGTIDY) + set(CMAKE_CXX_CLANG_TIDY ${CLANGTIDY}) + else() + message(SEND_ERROR "clang-tidy requested but executable not found") + endif() +endif() + +if(BUILD_DOC) + find_package(Doxygen) + if (DOXYGEN_FOUND) + SET(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/doc/Doxyfile.in) + SET(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile) + + configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY) + + add_custom_target(doc ALL + COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Buidling Doxygen documentation" + VERBATIM ) + else (DOXYGEN_FOUND) + message("No doxygen binary found on the system.") + SET(${BUILD_DOC} OFF) + endif () +endif() + +message(STATUS "") +message(STATUS "Summary") +#message(STATUS "") +#message(STATUS "Build libs: \t ${${PROJECT_NAME}_BUILD_DEPS}") +#message(STATUS "Build src: \t ${${PROJECT_NAME}_BUILD_ENGINE}") +message(STATUS "") +message(STATUS "Build type: \t ${CMAKE_BUILD_TYPE}") +message(STATUS "Install prefix: \t ${CMAKE_INSTALL_PREFIX}") +message(STATUS "Testing enabled: \t ${ENABLE_TESTING}") +message(STATUS "Clang-tidy: \t ${ENABLE_CLANG_TIDY}") +message(STATUS "Cppcheck: \t ${ENABLE_CPPCHECK}") +message(STATUS "Compiler: \t ${CMAKE_CXX_COMPILER_ID}") +message(STATUS "Sanizizers: \t ${ENABLE_ASAN}") +message(STATUS "Shared libs: \t ${BUILD_SHARED_LIBS}") +message(STATUS "Build libcpp: \t ${LIBCPP}") +message(STATUS "CCache executable:\t ${CCACHE}") +message(STATUS "Building doc: \t ${BUILD_DOC}") +message(STATUS "Force color output:\t ${FORCE_COLORED_OUTPUT}") +message(STATUS "") +message(STATUS "Version: \t ${${PROJECT_NAME}_VERSION}") +message(STATUS "") + +add_subdirectory("libs") +add_subdirectory("srcs") diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e0e3605 --- /dev/null +++ b/LICENSE @@ -0,0 +1,11 @@ +zlib License + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source distribution. diff --git a/README.md b/README.md new file mode 100644 index 0000000..0a7d7a0 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# esProject + +Eugene Smile's CMake Project Template \ No newline at end of file diff --git a/esProject.code-workspace b/esProject.code-workspace new file mode 100644 index 0000000..35b132c --- /dev/null +++ b/esProject.code-workspace @@ -0,0 +1,11 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "cmake.generator": "Ninja", + } + } +} \ No newline at end of file diff --git a/libs/CMakeLists.txt b/libs/CMakeLists.txt new file mode 100644 index 0000000..c8e9965 --- /dev/null +++ b/libs/CMakeLists.txt @@ -0,0 +1,10 @@ +set(TARGET_NAME ${PROJECT_NAME}_LIBS) +message(STATUS "Configuring ${TARGET_NAME} third party libraries") + +set(LIBS_LIST "") +SubDirList(${CMAKE_CURRENT_LIST_DIR} LIBS_LIST) + +foreach(LIB_DIR IN LISTS LIB_LIST) + message(STATUS "Adding library: ${LIB_DIR}") + add_subdirectory(${LIB_DIR}) +endforeach() diff --git a/srcs/CMakeLists.txt b/srcs/CMakeLists.txt new file mode 100644 index 0000000..6c4dc75 --- /dev/null +++ b/srcs/CMakeLists.txt @@ -0,0 +1,54 @@ +set(TARGET_NAME ${PROJECT_NAME}) +message(STATUS "Configuring ${TARGET_NAME}") + +# Build configuration + +configure_file( + ${CMAKE_CURRENT_LIST_DIR}/Version.h.in + ${CMAKE_CURRENT_LIST_DIR}/Version.h) + +set(${PROJECT_NAME}_SOURCES "main.cpp") +set(${PROJECT_NAME}_INCLUDES "Version.h") +set(${PROJECT_NAME}_INCLUDE_DIRS "") +set(${PROJECT_NAME}_DEPENDENCIES "") + +# Find all subdirectories +set(SUBDIRS_LIST "") +SubDirList(${CMAKE_CURRENT_LIST_DIR} SUBDIRS_LIST) + +foreach(SUBDIR IN LISTS SUBDIRS_LIST) + if (NOT ${PROJECT_NAME}_BUILD_SUBDIR_${SUBDIR}) + option(${PROJECT_NAME}_BUILD_SUBDIR_${SUBDIR} "Build ${SUBDIR} subdirectory" ON) + endif() + if(${PROJECT_NAME}_BUILD_SUBDIR_${SUBDIR}) + file(GLOB SUBDIR_SOURCES ${CMAKE_CURRENT_LIST_DIR}/${SUBDIR}/*.cc ${CMAKE_CURRENT_LIST_DIR}/${SUBDIR}/*.cpp) + list(APPEND ${PROJECT_NAME}_SOURCES ${SUBDIR_SOURCES}) + file(GLOB SUBDIR_INCLUDES ${CMAKE_CURRENT_LIST_DIR}/${SUBDIR}/*.h) + list(APPEND ${PROJECT_NAME}_INCLUDES ${SUBDIR_INCLUDES}) + list(APPEND ${PROJECT_NAME}_INCLUDE_DIRS ${CMAKE_CURRENT_LIST_DIR}/${SUBDIR}) + endif() +endforeach() + +add_executable(${TARGET_NAME} ${${PROJECT_NAME}_SOURCES} ${${PROJECT_NAME}_INCLUDES}) +if(NOT ${${PROJECT_NAME}_DEPENDENCIES}) + add_dependencies(${TARGET_NAME} ${${PROJECT_NAME}_DEPENDENCIES}) + target_link_libraries(${TARGET_NAME} ${${PROJECT_NAME}_DEPENDENCIES}) +endif() + +#include_directories(${CMAKE_CURRENT_LIST_DIR}) +#target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_CURRENT_LIST_DIR}) + +install(TARGETS ${TARGET_NAME} + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${TARGET_NAME}/ + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${TARGET_NAME}/ + ARCHIVE DESTINATION ${CMAKE_INSTALL_SHAREDSTATEDIR}) + +message(STATUS "") +message(STATUS "${TARGET_NAME} summary") +message(STATUS "") +foreach(SUBDIR IN LISTS SUBDIRS_LIST) + message(STATUS "Build subdirectory ${SUBDIR}: \t \t ${${PROJECT_NAME}_BUILD_SUBDIR_${SUBDIR}}") +endforeach() +message(STATUS "") \ No newline at end of file diff --git a/srcs/Version.h.in b/srcs/Version.h.in new file mode 100644 index 0000000..622072e --- /dev/null +++ b/srcs/Version.h.in @@ -0,0 +1,6 @@ +#define PROJECT_VERSION_MAJOR @PROJECT_VERSION_MAJOR@ +#define PROJECT_VERSION_MINOR @PROJECT_VERSION_MINOR@ +#define PROJECT_VERSION_PATCH @PROJECT_VERSION_PATCH@ +#define VERSION_BRANCH @PROJECT_VERSION_BRANCH@ +#define VERSION_COMMIT @PROJECT_VERSION_COMMIT@ +#define VERSION_FULL "@PROJECT_VERSION_FULL@" diff --git a/srcs/main.cpp b/srcs/main.cpp new file mode 100644 index 0000000..73e32ca --- /dev/null +++ b/srcs/main.cpp @@ -0,0 +1,5 @@ + +int main(int argc, char **argv) +{ + return 0; +} \ No newline at end of file diff --git a/tools/cmake/SubDirList.cmake b/tools/cmake/SubDirList.cmake new file mode 100644 index 0000000..30124cc --- /dev/null +++ b/tools/cmake/SubDirList.cmake @@ -0,0 +1,8 @@ +macro(SubDirList curdir result) + file(GLOB children RELATIVE ${curdir} ${curdir}/*) + foreach(child ${children}) + if(IS_DIRECTORY ${curdir}/${child}) + list(APPEND ${result} ${child}) + endif() + endforeach() +endmacro()