diff --git a/_cmake/app_settings.cmake b/_cmake/app_settings.cmake new file mode 100644 index 0000000..db34954 --- /dev/null +++ b/_cmake/app_settings.cmake @@ -0,0 +1,17 @@ + +include(${CMAKE_CURRENT_SOURCE_DIR}/../_cmake/common.cmake) +include(${CMAKE_INC_DIR}/version.cmake) + +# Variables for application + +set(RUNTIME_OUTPUT_NAME ${PROJECT_NAME}) + +configure_file(${CMAKE_INC_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h @ONLY) + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${DISTRIB_DIR}) + +if (CMAKE_SYSTEM_NAME STREQUAL "Windows") + configure_file(${CMAKE_INC_DIR}/versioninfo.rc.in ${CMAKE_CURRENT_BINARY_DIR}/versioninfo.rc @ONLY) +endif() + + diff --git a/_cmake/common.cmake b/_cmake/common.cmake new file mode 100644 index 0000000..b659f4e --- /dev/null +++ b/_cmake/common.cmake @@ -0,0 +1,48 @@ + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(SOFT_DEVELOPER "Evgeny Teterin (nayk)") +set(DEVELOPER_DOMAIN "poseon.ru") + +set(ROOT_PROJECT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../ ) + +cmake_path(NORMAL_PATH ROOT_PROJECT_DIR OUTPUT_VARIABLE ROOT_PROJECT_DIR) + +set(CMAKE_INC_DIR + ${ROOT_PROJECT_DIR}_cmake +) + +set(RESOURCES_DIR + ${ROOT_PROJECT_DIR}_resources +) + +set(SOURCES_DIR + ${ROOT_PROJECT_DIR}sources +) + +set(COMMON_SOURCES_DIR + ${ROOT_PROJECT_DIR}_include +) + +if (${CMAKE_SIZEOF_VOID_P} STREQUAL 4) + set(DIR_PREFIX "32") +elseif (${CMAKE_SIZEOF_VOID_P} STREQUAL 8) + set(DIR_PREFIX "64") +endif () + +set(DISTRIB_DIR + ${ROOT_PROJECT_DIR}_distrib/${CMAKE_SYSTEM_NAME}_${DIR_PREFIX}-bit +) + +message(STATUS "Project '${PROJECT_NAME}' compiler ${CMAKE_CXX_COMPILER} version: ${CMAKE_CXX_COMPILER_VERSION}") +message(STATUS "Project '${PROJECT_NAME}' distrib dir: '${DISTRIB_DIR}'") +message(STATUS "Variable CMAKE_PREFIX_PATH: '${CMAKE_PREFIX_PATH}'") +message(STATUS "Variable CMAKE_SYSTEM_LIBRARY_PATH: '${CMAKE_SYSTEM_LIBRARY_PATH}'") + +if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + set(SYSTEM_INCLUDE_DIR "${CMAKE_PREFIX_PATH}/include") +else () + set(SYSTEM_INCLUDE_DIR "/usr/include") +endif () + diff --git a/_cmake/config.h.in b/_cmake/config.h.in new file mode 100644 index 0000000..41f8ac6 --- /dev/null +++ b/_cmake/config.h.in @@ -0,0 +1,9 @@ +#define PROG_NAME "@PROJECT_NAME@" +#define PROG_VERSION "@PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@.@BUILD_NUM@@PROJECT_VERSION_TWEAK@" +#define PROG_CAPTION "@PROJECT_NAME@ v" +#define PROG_DESCRIPTION "@PROJECT_DESCRIPTION@" +#define SOFT_DEVELOPER "@SOFT_DEVELOPER@" +#define DEVELOPER_DOMAIN "@DEVELOPER_DOMAIN@" +#define BUILD_DATE "@BUILD_DATE@" +#define BUILD_NUM "@BUILD_NUM@" +#define ORIGINAL_FILE_NAME "@ORIGINAL_FILE_NAME@" diff --git a/_cmake/version.cmake b/_cmake/version.cmake new file mode 100644 index 0000000..a8b12b0 --- /dev/null +++ b/_cmake/version.cmake @@ -0,0 +1,19 @@ +# Variables for generating the version. Used in the application (config.h file) +# +# BUILD_DATE - date in format 'yyyy-mm-dd H:M' +# BUILD_NUM - number of build (days of year) +# PROJECT_VERSION_PATCH - in format 'yy' +# +# Application version format: 'MAJOR.MINOR.PROJECT_VERSION_PATCH.BUILD_NUM' + +string(TIMESTAMP BUILD_DATE "%Y-%m-%d %H:%M") + +string(TIMESTAMP BUILD_NUM "%j") + +math(EXPR BUILD_NUM ${BUILD_NUM}) + +string(SUBSTRING ${BUILD_DATE} 2 2 YEAR_STR) + +set(PROJECT_VERSION_PATCH ${YEAR_STR}) + +set(ORIGINAL_FILE_NAME ${RUNTIME_OUTPUT_NAME}) diff --git a/_cmake/versioninfo.rc.in b/_cmake/versioninfo.rc.in new file mode 100644 index 0000000..607b22e --- /dev/null +++ b/_cmake/versioninfo.rc.in @@ -0,0 +1,34 @@ +1 TYPELIB "versioninfo.rc" + +1 VERSIONINFO + FILEVERSION @PROJECT_VERSION_MAJOR@, @PROJECT_VERSION_MINOR@, @PROJECT_VERSION_PATCH@, @BUILD_NUM@ + PRODUCTVERSION @PROJECT_VERSION_MAJOR@, @PROJECT_VERSION_MINOR@, @PROJECT_VERSION_PATCH@, @BUILD_NUM@ + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "@SOFT_DEVELOPER@" + VALUE "FileDescription", "@PROJECT_DESCRIPTION@" + VALUE "FileVersion","@PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@.@BUILD_NUM@" + VALUE "InternalName", "@PROJECT_NAME@" + VALUE "LegalCopyright", "Copyright (c) @YEAR_STR@ @SOFT_DEVELOPER@" + VALUE "OriginalFilename", "@ORIGINAL_FILE_NAME@" + VALUE "ProductName", "@PROJECT_NAME@" + VALUE "ProductVersion","@PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@.@BUILD_NUM@" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END diff --git a/_resources/main.ico b/_resources/main.ico new file mode 100644 index 0000000..e271339 Binary files /dev/null and b/_resources/main.ico differ diff --git a/_resources/main_icon.rc b/_resources/main_icon.rc new file mode 100644 index 0000000..59f679d --- /dev/null +++ b/_resources/main_icon.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON "main.ico" diff --git a/sources/CMakeLists.txt b/sources/CMakeLists.txt index 4eaabd4..3ea849f 100644 --- a/sources/CMakeLists.txt +++ b/sources/CMakeLists.txt @@ -1,35 +1,55 @@ cmake_minimum_required(VERSION 3.24) -project(launcher LANGUAGES CXX) +project(launcher + VERSION 1.0 + DESCRIPTION "Launcher" + LANGUAGES CXX +) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) +include(${CMAKE_CURRENT_SOURCE_DIR}/../_cmake/app_settings.cmake) -# Настройки для MSVC -if(MSVC) - # Статическая линковка CRT - set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") +set(PROJECT_SOURCES + main.cpp +) - # Оптимизация размера и скорости - add_compile_options( - "$<$:/Os>" # Оптимизация по размеру - "$<$:/Oy>" # Отключение кадров стека - "$<$:/GL>" # Включение LTO +if(CMAKE_SYSTEM_NAME STREQUAL "Windows") + + set(PROJECT_RC_FILES + ${RESOURCES_DIR}/main_icon.rc + ${CMAKE_CURRENT_BINARY_DIR}/versioninfo.rc ) - # Настройки линковщика - set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /OPT:REF /OPT:ICF") -endif() + # Настройки для MSVC + if(MSVC) + # Статическая линковка CRT + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + + # Оптимизация размера и скорости + add_compile_options( + "$<$:/Os>" # Оптимизация по размеру + "$<$:/Oy>" # Отключение кадров стека + "$<$:/GL>" # Включение LTO + ) + + # Настройки линковщика + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /OPT:REF /OPT:ICF") + endif() + + add_executable(${PROJECT_NAME} WIN32 + ${PROJECT_SOURCES} + ${PROJECT_RC_FILES} + ) + + target_link_libraries(${PROJECT_NAME} + PRIVATE Kernel32.lib + PRIVATE shlwapi.lib + ) + +else () + + #target_compile_options(${PROJECT_NAME} PRIVATE -Werror -Wall -Wextra -Wpedantic) + +endif () -add_executable(${PROJECT_NAME} WIN32 main.cpp) -target_link_libraries(${PROJECT_NAME} - PRIVATE Kernel32.lib - PRIVATE shlwapi.lib -) -include(GNUInstallDirs) -install(TARGETS ${PROJECT_NAME} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} -) diff --git a/sources/main.cpp b/sources/main.cpp index c7b4700..4409674 100644 --- a/sources/main.cpp +++ b/sources/main.cpp @@ -1,3 +1,5 @@ +#ifdef WIN32 +// Для Windows MSVC ============================================================ #include #include #include @@ -198,4 +200,13 @@ int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) return 0; } //============================================================================== +#else +// Для Linux GCC =============================================================== + + + + +//============================================================================== +#endif +//==============================================================================