diff --git a/CMakeLists.txt b/CMakeLists.txt index ff51142..959bcc8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,51 @@ else() add_compile_definitions(JL_CONFIG_USE_FILE) endif() +# Генерация версии из git +execute_process( + COMMAND git describe --tags --abbrev=0 + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_TAG + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +if(NOT GIT_TAG) + set(GIT_TAG "none") +endif() + +execute_process( + COMMAND git branch --show-current + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_BRANCH + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +execute_process( + COMMAND git show -s --format=%h + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +# Получаем дату и время сборки +string(TIMESTAMP BUILD_DATE "%Y-%m-%d %H:%M:%S" UTC) + +# Формируем короткую версию (без хеша и даты) +if(GIT_BRANCH STREQUAL "main") + set(VERSION_SHORT "${GIT_TAG}") + set(VERSION_STRING "${GIT_TAG} ${GIT_HASH} (${BUILD_DATE})") +else() + set(VERSION_SHORT "${GIT_TAG}-${GIT_BRANCH}") + set(VERSION_STRING "${GIT_TAG}-${GIT_BRANCH} ${GIT_HASH} (${BUILD_DATE})") +endif() + +configure_file( + ${CMAKE_SOURCE_DIR}/inc/jlv135_cli/version.h.in + ${CMAKE_BINARY_DIR}/inc/jlv135_cli/version.h + @ONLY +) + # Создание исполняемого файла add_executable(${PROJECT_NAME} src/jl_modbus/jl_modbus_config.c @@ -36,8 +81,9 @@ add_executable(${PROJECT_NAME} target_link_libraries(${CMAKE_PROJECT_NAME} pthread) # Добавление каталогов для поиска заголовков -target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE - inc) +target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE + inc + ${CMAKE_BINARY_DIR}/inc) if (BUILD_FOR_JLV135) # Опция strip diff --git a/cmake/version.cmake b/cmake/version.cmake new file mode 100644 index 0000000..6cdc722 --- /dev/null +++ b/cmake/version.cmake @@ -0,0 +1,44 @@ +# Скрипт для генерации версии на основе git + +# Получаем ближайший тег +execute_process( + COMMAND git describe --tags --abbrev=0 + WORKING_DIRECTORY ${SOURCE_DIR} + OUTPUT_VARIABLE GIT_TAG + ERROR_QUIET + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +if(NOT GIT_TAG) + set(GIT_TAG "none") +endif() + +# Получаем текущую ветку +execute_process( + COMMAND git branch --show-current + WORKING_DIRECTORY ${SOURCE_DIR} + OUTPUT_VARIABLE GIT_BRANCH + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +# Получаем короткий хеш коммита +execute_process( + COMMAND git show -s --format=%h + WORKING_DIRECTORY ${SOURCE_DIR} + OUTPUT_VARIABLE GIT_HASH + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +# Формируем строку версии +if(GIT_BRANCH STREQUAL "main") + set(VERSION_STRING "${GIT_TAG} ${GIT_HASH}") +else() + set(VERSION_STRING "${GIT_TAG}-${GIT_BRANCH} ${GIT_HASH}") +endif() + +# Генерируем заголовочный файл +configure_file( + ${SOURCE_DIR}/inc/jlv135_cli/version.h.in + ${BINARY_DIR}/inc/jlv135_cli/version.h + @ONLY +) diff --git a/inc/jlv135_cli/version.h.in b/inc/jlv135_cli/version.h.in new file mode 100644 index 0000000..e58af80 --- /dev/null +++ b/inc/jlv135_cli/version.h.in @@ -0,0 +1,7 @@ +#ifndef JLV135_VERSION_H +#define JLV135_VERSION_H + +#define JLV135_VERSION "@VERSION_STRING@" +#define JLV135_VERSION_SHORT "@VERSION_SHORT@" + +#endif // JLV135_VERSION_H diff --git a/src/jlv135_cli/main.c b/src/jlv135_cli/main.c index bae4f74..181fa66 100644 --- a/src/jlv135_cli/main.c +++ b/src/jlv135_cli/main.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -12,7 +13,9 @@ print_help(const char *program_name) printf("Usage: %s [COMMAND] [BLOCK] [PARAMETERS...]\n\n", program_name); printf("Commands:\n"); printf(" get Display all parameters of the specified block\n"); - printf(" set ... Modify parameters of the specified block\n\n"); + printf(" set ... Modify parameters of the specified block\n"); + printf(" version Display full version information\n"); + printf(" ver Display short version\n\n"); printf("Available blocks:\n"); const jl_block_t *block = jl_block_get_all(); @@ -84,6 +87,18 @@ main(int argc, const char *argv[]) // Передаем оставшиеся аргументы в метод set блока return block->set(argc - 3, &argv[3]); } + // Команда version + else if (strcmp(command, "version") == 0) + { + printf("jlv135_cli version %s\n", JLV135_VERSION); + return JLV135_CLI_OK; + } + // Команда ver (короткая версия) + else if (strcmp(command, "ver") == 0) + { + printf("%s\n", JLV135_VERSION_SHORT); + return JLV135_CLI_OK; + } else { fprintf(stderr, "Error: unknown command '%s'\n", command);