diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..b22a0fa --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "3rdparty/gitversion"] + path = 3rdparty/gitversion + url = https://github.com/vintagepc/gitversion.git diff --git a/3rdparty/gitversion b/3rdparty/gitversion new file mode 160000 index 0000000..5d7a224 --- /dev/null +++ b/3rdparty/gitversion @@ -0,0 +1 @@ +Subproject commit 5d7a224de4ac7f35f5761c296df70fddd067745f diff --git a/CMakeLists.txt b/CMakeLists.txt index f395e78..96969f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,12 +1,14 @@ cmake_minimum_required(VERSION 3.15) include(cmake/Utilities.cmake) -include(cmake/GetGitRevisionDescription.cmake) -include(cmake/ProjectVersion.cmake) +INCLUDE(3rdparty/gitversion/cmake.cmake) + +GET_GIT_SEMVER(PROJECT_GIT_VER) +#message(STATUS "Semver is: ${PROJECT_GIT_VER}") project( MMU LANGUAGES C CXX ASM - VERSION ${PROJECT_VERSION} + VERSION "${PROJECT_GIT_VER}" ) if(NOT CMAKE_CROSSCOMPILING) @@ -32,22 +34,6 @@ set(PRINTER STRING "Select the MMU unit for which you want to compile the project (valid values are ${PRINTER_VALID_OPTS})." ) -set(PROJECT_VERSION_SUFFIX - "" - CACHE - STRING - "Full version suffix to be shown on the info screen in settings (e.g. full_version=4.0.3-BETA+1035.PR111.B4, suffix=-BETA+1035.PR111.B4). Defaults to '+..' if set to ''." - ) -set(PROJECT_VERSION_SUFFIX_SHORT - "" - CACHE - STRING - "Short version suffix to be shown on splash screen. Defaults to '+' if set to ''." - ) -set(BUILD_NUMBER - "" - CACHE STRING "Build number of the firmware. Resolved automatically if not specified." - ) set(CUSTOM_COMPILE_OPTIONS "" CACHE STRING "Allows adding custom C/C++ flags" @@ -60,8 +46,6 @@ foreach(OPTION "PRINTER") endif() endforeach() -# Resolve BUILD_NUMBER and PROJECT_VERSION_* variables -resolve_version_variables() # Check GCC Version get_recommended_gcc_version(RECOMMENDED_TOOLCHAIN_VERSION) @@ -81,10 +65,6 @@ endif() # Inform user about the resolved settings message(STATUS "Project version: ${PROJECT_VERSION}") -message(STATUS "Project version with full suffix: ${PROJECT_VERSION_FULL}") -message( - STATUS "Project version with short suffix: ${PROJECT_VERSION}${PROJECT_VERSION_SUFFIX_SHORT}" - ) message(STATUS "Using toolchain file: ${CMAKE_TOOLCHAIN_FILE}.") message(STATUS "Printer: ${PRINTER}") @@ -163,6 +143,8 @@ endif() add_executable(firmware) +TARGET_GIT_VERSION_INIT(firmware) + set_target_properties(firmware PROPERTIES CXX_STANDARD 14) # generate firmware.bin file @@ -184,17 +166,6 @@ target_compile_options(firmware PRIVATE -Wdouble-promotion) target_sources(firmware PRIVATE src/main.cpp) -set_property( - SOURCE src/version.c - APPEND - PROPERTY COMPILE_DEFINITIONS - FW_BUILD_NUMBER=${BUILD_NUMBER} - FW_VERSION_FULL=${PROJECT_VERSION_FULL} - FW_VERSION=${PROJECT_VERSION} - FW_VERSION_SUFFIX=${PROJECT_VERSION_SUFFIX} - FW_VERSION_SUFFIX_SHORT=${PROJECT_VERSION_SUFFIX_SHORT} - ) - if(NOT CMAKE_CROSSCOMPILING) enable_testing() add_subdirectory(tests) diff --git a/cmake/GetGitRevisionDescription.cmake b/cmake/GetGitRevisionDescription.cmake deleted file mode 100644 index 0eccbc1..0000000 --- a/cmake/GetGitRevisionDescription.cmake +++ /dev/null @@ -1,232 +0,0 @@ -# * Returns a version string from Git -# -# These functions force a re-configure on each git commit so that you can trust the values of the -# variables in your build system. -# -# get_git_head_revision( [ ...]) -# -# Returns the refspec and sha hash of the current head revision -# -# git_describe( [ ...]) -# -# Returns the results of git describe on the source tree, and adjusting the output so that it tests -# false if an error occurs. -# -# git_get_exact_tag( [ ...]) -# -# Returns the results of git describe --exact-match on the source tree, and adjusting the output so -# that it tests false if there was no exact matching tag. -# -# git_local_changes() -# -# Returns either "CLEAN" or "DIRTY" with respect to uncommitted changes. Uses the return code of -# "git diff-index --quiet HEAD --". Does not regard untracked files. -# -# git_count_parent_commits() -# -# Returns number of commits preceeding current commit -1 if git rev-list --count HEAD failed or -# "GIT-NOTFOUND" if git executable was not found or "HEAD-HASH-NOTFOUND" if head hash was not found. -# I don't know if get_git_head_revision() must be called internally or not, as reason of calling it -# is not clear for me also in git_local_changes(). -# -# Requires CMake 2.6 or newer (uses the 'function' command) -# -# Original Author: 2009-2010 Ryan Pavlik -# http://academic.cleardefinition.com Iowa State University HCI Graduate Program/VRAC -# -# Copyright Iowa State University 2009-2010. Distributed under the Boost Software License, Version -# 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -if(__get_git_revision_description) - return() -endif() -set(__get_git_revision_description YES) - -# We must run the following at "include" time, not at function call time, to find the path to this -# module rather than the path to a calling list file -get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) - -function(get_git_head_revision _refspecvar _hashvar) - set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}") - set(GIT_DIR "${GIT_PARENT_DIR}/.git") - while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories - set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}") - get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH) - if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT) - # We have reached the root directory, we are not in git - set(${_refspecvar} - "GITDIR-NOTFOUND" - PARENT_SCOPE - ) - set(${_hashvar} - "GITDIR-NOTFOUND" - PARENT_SCOPE - ) - return() - endif() - set(GIT_DIR "${GIT_PARENT_DIR}/.git") - endwhile() - # check if this is a submodule - if(NOT IS_DIRECTORY ${GIT_DIR}) - file(READ ${GIT_DIR} submodule) - string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule}) - get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH) - get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE) - endif() - set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data") - if(NOT EXISTS "${GIT_DATA}") - file(MAKE_DIRECTORY "${GIT_DATA}") - endif() - - if(NOT EXISTS "${GIT_DIR}/HEAD") - return() - endif() - set(HEAD_FILE "${GIT_DATA}/HEAD") - configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY) - - configure_file( - "${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" "${GIT_DATA}/grabRef.cmake" @ONLY - ) - include("${GIT_DATA}/grabRef.cmake") - - set(${_refspecvar} - "${HEAD_REF}" - PARENT_SCOPE - ) - set(${_hashvar} - "${HEAD_HASH}" - PARENT_SCOPE - ) -endfunction() - -function(git_describe _var) - if(NOT GIT_FOUND) - find_package(Git QUIET) - endif() - get_git_head_revision(refspec hash) - if(NOT GIT_FOUND) - set(${_var} - "GIT-NOTFOUND" - PARENT_SCOPE - ) - return() - endif() - if(NOT hash) - set(${_var} - "HEAD-HASH-NOTFOUND" - PARENT_SCOPE - ) - return() - endif() - - # TODO sanitize if((${ARGN}" MATCHES "&&") OR (ARGN MATCHES "||") OR (ARGN MATCHES "\\;")) - # message("Please report the following error to the project!") message(FATAL_ERROR "Looks like - # someone's doing something nefarious with git_describe! Passed arguments ${ARGN}") endif() - - # message(STATUS "Arguments to execute_process: ${ARGN}") - - execute_process( - COMMAND "${GIT_EXECUTABLE}" describe ${hash} ${ARGN} - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - RESULT_VARIABLE res - OUTPUT_VARIABLE out - ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE - ) - if(NOT res EQUAL 0) - set(out "${out}-${res}-NOTFOUND") - endif() - - set(${_var} - "${out}" - PARENT_SCOPE - ) -endfunction() - -function(git_get_exact_tag _var) - git_describe(out --exact-match ${ARGN}) - set(${_var} - "${out}" - PARENT_SCOPE - ) -endfunction() - -function(git_local_changes _var) - if(NOT GIT_FOUND) - find_package(Git QUIET) - endif() - get_git_head_revision(refspec hash) - if(NOT GIT_FOUND) - set(${_var} - "GIT-NOTFOUND" - PARENT_SCOPE - ) - return() - endif() - if(NOT hash) - set(${_var} - "HEAD-HASH-NOTFOUND" - PARENT_SCOPE - ) - return() - endif() - - execute_process( - COMMAND "${GIT_EXECUTABLE}" diff-index --quiet HEAD -- - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - RESULT_VARIABLE res - OUTPUT_VARIABLE out - ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE - ) - if(res EQUAL 0) - set(${_var} - "CLEAN" - PARENT_SCOPE - ) - else() - set(${_var} - "DIRTY" - PARENT_SCOPE - ) - endif() -endfunction() - -function(git_count_parent_commits _var) - if(NOT GIT_FOUND) - find_package(Git QUIET) - endif() - get_git_head_revision(refspec hash) - if(NOT GIT_FOUND) - set(${_var} - "GIT-NOTFOUND" - PARENT_SCOPE - ) - return() - endif() - if(NOT hash) - set(${_var} - "HEAD-HASH-NOTFOUND" - PARENT_SCOPE - ) - return() - endif() - - execute_process( - COMMAND "${GIT_EXECUTABLE}" rev-list --count HEAD - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - RESULT_VARIABLE res - OUTPUT_VARIABLE out - ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE - ) - if(res EQUAL 0) - set(${_var} - "${out}" - PARENT_SCOPE - ) - else() - set(${_var} - "-1" - PARENT_SCOPE - ) - endif() - -endfunction() diff --git a/cmake/GetGitRevisionDescription.cmake.in b/cmake/GetGitRevisionDescription.cmake.in deleted file mode 100644 index f7d93dd..0000000 --- a/cmake/GetGitRevisionDescription.cmake.in +++ /dev/null @@ -1,37 +0,0 @@ -# -# Internal file for GetGitRevisionDescription.cmake -# -# Requires CMake 2.6 or newer (uses the 'function' command) -# -# Original Author: 2009-2010 Ryan Pavlik -# http://academic.cleardefinition.com Iowa State University HCI Graduate Program/VRAC -# -# Copyright Iowa State University 2009-2010. Distributed under the Boost Software License, Version -# 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -set(HEAD_HASH) - -file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) - -string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) -if(HEAD_CONTENTS MATCHES "ref") - # named branch - string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") - if(EXISTS "@GIT_DIR@/${HEAD_REF}") - configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) - else() - configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY) - file(READ "@GIT_DATA@/packed-refs" PACKED_REFS) - if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}") - set(HEAD_HASH "${CMAKE_MATCH_1}") - endif() - endif() -else() - # detached HEAD - configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) -endif() - -if(NOT HEAD_HASH) - file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024) - string(STRIP "${HEAD_HASH}" HEAD_HASH) -endif() diff --git a/cmake/ProjectVersion.cmake b/cmake/ProjectVersion.cmake deleted file mode 100644 index 65c4fb5..0000000 --- a/cmake/ProjectVersion.cmake +++ /dev/null @@ -1,62 +0,0 @@ -# -# This file is responsible for setting the following variables: -# -# ~~~ -# BUILD_NUMBER (1035) -# PROJECT_VERSION (4.0.3) -# PROJECT_VERSION_FULL (4.0.3-BETA+1035.PR111.B4) -# PROJECT_VERSION_SUFFIX (-BETA+1035.PR111.B4) -# PROJECT_VERSION_SUFFIX_SHORT (+1035) -# -# The `PROJECT_VERSION` variable is set as soon as the file is included. -# To set the rest, the function `resolve_version_variables` has to be called. -# -# ~~~ - -# PROJECT_VERSION -file(READ "${CMAKE_SOURCE_DIR}/version.txt" content) -string(REGEX MATCH "([0-9]+)\.([0-9]+)\.([0-9]+)" result "${content}") -if(NOT result) - message(FATAL_ERROR "Failed to read version info from ${version_file}") -endif() -set(PROJECT_VERSION ${CMAKE_MATCH_0}) - -function(resolve_version_variables) - # BUILD_NUMBER - if(NOT BUILD_NUMBER) - git_count_parent_commits(BUILD_NUMBER) - set(ERRORS "GIT-NOTFOUND" "HEAD-HASH-NOTFOUND") - if(BUILD_NUMBER IN_LIST ERRORS) - message(WARNING "Failed to resolve build number: ${BUILD_NUMBER}. Setting to zero.") - set(BUILD_NUMBER "0") - endif() - set(BUILD_NUMBER - ${BUILD_NUMBER} - PARENT_SCOPE - ) - endif() - - # PROJECT_VERSION_SUFFIX - if(PROJECT_VERSION_SUFFIX STREQUAL "") - # TODO: set to +.dirty?.debug? - set(PROJECT_VERSION_SUFFIX "+${BUILD_NUMBER}.LOCAL") - set(PROJECT_VERSION_SUFFIX - "+${BUILD_NUMBER}.LOCAL" - PARENT_SCOPE - ) - endif() - - # PROJECT_VERSION_SUFFIX_SHORT - if(PROJECT_VERSION_SUFFIX_SHORT STREQUAL "") - set(PROJECT_VERSION_SUFFIX_SHORT - "+${BUILD_NUMBER}" - PARENT_SCOPE - ) - endif() - - # PROJECT_VERSION_FULL - set(PROJECT_VERSION_FULL - "${PROJECT_VERSION}${PROJECT_VERSION_SUFFIX}" - PARENT_SCOPE - ) -endfunction() diff --git a/src/version.c b/src/version.c deleted file mode 100644 index 20bd1c0..0000000 --- a/src/version.c +++ /dev/null @@ -1,21 +0,0 @@ -#include "version.h" -#include "config.h" - -#define _STR(x) #x -#define STR(x) _STR(x) - -const char project_version[] = STR(FW_VERSION); - -const char project_version_full[] = STR(FW_VERSION_FULL); - -const char project_version_suffix[] = STR(FW_VERSION_SUFFIX); - -const char project_version_suffix_short[] = STR(FW_VERSION_SUFFIX_SHORT); - -const int project_build_number = FW_BUILD_NUMBER; - -#if (PRINTER_TYPE == PRINTER_PRUSA_MINI) -const char project_firmware_name[] = "Buddy_MINI"; -#else - #error "unknown printer type" -#endif diff --git a/src/version.h b/src/version.h deleted file mode 100644 index 2d852c7..0000000 --- a/src/version.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif //__cplusplus - -/// Project's version (4.0.2) -extern const char project_version[]; - -/// Full project's version (4.0.3-BETA+1035.PR111.B4) -extern const char project_version_full[]; - -/// Project's version suffix (-BETA+1035.PR111.B4) -extern const char project_version_suffix[]; - -/// Project's short version suffix (+1035) -extern const char project_version_suffix_short[]; - -/// Project's build number (number of commits in a branch) -extern const int project_build_number; - -/// Firmware name -extern const char project_firmware_name[]; - -#ifdef __cplusplus -} -#endif //__cplusplus diff --git a/version.txt b/version.txt deleted file mode 100644 index 227cea2..0000000 --- a/version.txt +++ /dev/null @@ -1 +0,0 @@ -2.0.0