diff --git a/.docker/Dockerfile b/.docker/Dockerfile index 248e513465..bd200abb73 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -47,8 +47,6 @@ RUN vcpkg/vcpkg install # build and test FROM vcpkg-installed AS firestarr-build WORKDIR /appl/firestarr -# vcpkg-installed should update when this file does -# COPY ./vcpkg*.json . # mount instead of copy to minimize layers RUN --mount=type=bind,source=./cmake,target=./cmake \ --mount=type=bind,source=./CMakeLists.txt,target=./CMakeLists.txt \ @@ -56,6 +54,7 @@ RUN --mount=type=bind,source=./cmake,target=./cmake \ --mount=type=bind,source=./.clang-format,target=./.clang-format \ --mount=type=bind,source=./.clang-tidy,target=./.clang-tidy \ --mount=type=bind,source=./.env,target=./.env \ + --mount=type=bind,source=./.git,target=./.git \ --mount=type=bind,source=./src/cpp,target=./src/cpp \ --mount=type=bind,source=./test/data,target=./test/data \ --mount=type=bind,source=./test/input,target=./test/input \ @@ -64,14 +63,6 @@ RUN --mount=type=bind,source=./cmake,target=./cmake \ cmake --preset Release \ && cmake --build --parallel --preset Release \ && ctest --preset Release -# COPY ./cmake cmake/ -# COPY ./.env ./CMake* ./.clang-* . -# COPY ./src/cpp src/cpp/ -# RUN cmake --preset Release -# RUN cmake --build --parallel --preset Release -# COPY ./test test/ -# COPY ./fuel.lut ./settings.ini . -# RUN ctest --preset Release FROM --platform=linux/amd64 ${BASE_DISTROLESS} AS distroless-amd64 diff --git a/CMakeLists.txt b/CMakeLists.txt index a77b81577d..b5b3ea667e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,7 +79,7 @@ if (WIN32) add_compile_options( "$<$:/bigobj>") else() - if(CMAKE_VERBOSE_MAKEFILE) + if(CMAKE_VERBOSE_OPTIMIZATIONS) add_compile_options(-fopt-info-vec-all) endif() add_compile_options( diff --git a/cmake/Version.cmake b/cmake/Version.cmake index 92502e8846..511eb24c73 100644 --- a/cmake/Version.cmake +++ b/cmake/Version.cmake @@ -26,29 +26,59 @@ list(APPEND FILES_USED ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt ${CMAKE_CURREN set(FILE_VERSION_CPP ${CMAKE_BINARY_DIR}/version.cpp) -# calculate hash from files that matter -set(HASHES) -# if modified from committed version then look at file timestamps -foreach(file_path IN LISTS FILES_USED) - file(SHA512 ${file_path} HASH_FILE) - if(NOT CMAKE_QUIET_MAKEFILE) - message("${file_path} ${HASH_FILE}") +set(HASH_PREFIX "") +set(HASH_SUFFIX "") +set(MODIFIED_TIME "") +if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git") + if(EXISTS "${FILE_ENV}") + # check when .env last changed - if not this commit then this is version+ + execute_process(COMMAND git log -n1 --pretty=%H ${FILE_ENV} OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE VERSION_HASH) endif() - list(APPEND HASHES ${HASH_FILE}) - file(TIMESTAMP "${file_path}" LAST_MOD_TIME "${FMT_TIME}") - if ("${LAST_MOD_TIME}" STRGREATER "${MODIFIED_TIME}") - if(NOT CMAKE_QUIET_MAKEFILE) - message("Change in ${file_path}") - endif() - set(MODIFIED_TIME "${LAST_MOD_TIME}") + execute_process(COMMAND git rev-parse --verify HEAD OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE FULL_HASH) + message("VERSION_HASH = ${VERSION_HASH}") + message("FULL_HASH = ${FULL_HASH}") + if (NOT "${VERSION_HASH}" STREQUAL "${FULL_HASH}") + # add + to version if .env isn't from current commit + set(VERSION "${VERSION}+") + endif() + # is anything in git changed? + list(JOIN FILES_USED " " FILES_USED_STRING) + execute_process(COMMAND git diff-index HEAD -- ${FILES_USED_STRING} RESULT_VARIABLE GIT_CHANGED) + message("GIT_CHANGED = ${GIT_CHANGED}") + if ("${GIT_CHANGED}" STREQUAL "0") + # use time from git commit since nothing is different + execute_process(COMMAND git log -1 --pretty=%ad --date=format:%Y-%m-%dT%H:%M:%SZ OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE MODIFIED_TIME) + else() + set(HASH_SUFFIX "+") endif() -endforeach() -list(JOIN HASHES "" ALL_HASHES) -string(SHA512 FULL_HASH ${ALL_HASHES}) +else() + # will never have a '+' for HASH_SUFFIX because it's based on exact files + set(HASH_PREFIX "file:") + list(JOIN HASHES "" ALL_HASHES) + string(SHA512 FULL_HASH ${ALL_HASHES}) +endif() -string(TIMESTAMP COMPILE_TIME "${FMT_TIME}" UTC) +if(NOT MODIFIED_TIME) + # calculate hash from files that matter + set(HASHES) + # if modified from committed version then look at file timestamps + foreach(file_path IN LISTS FILES_USED) + file(SHA512 ${file_path} HASH_FILE) + if(CMAKE_VERBOSE_MAKEFILE) + message("${file_path} ${HASH_FILE}") + endif() + list(APPEND HASHES ${HASH_FILE}) + file(TIMESTAMP "${file_path}" LAST_MOD_TIME "${FMT_TIME}") + if ("${LAST_MOD_TIME}" STRGREATER "${MODIFIED_TIME}") + set(MODIFIED_TIME "${LAST_MOD_TIME}") + endif() + endforeach() +endif() -string(SUBSTRING ${FULL_HASH} 0 8 HASH) +string(SUBSTRING ${FULL_HASH} 0 10 HASH) +set(HASH "${HASH_PREFIX}${HASH}${HASH_SUFFIX}") +set(FULL_HASH "${HASH_PREFIX}${FULL_HASH}${HASH_SUFFIX}") +string(TIMESTAMP COMPILE_TIME "${FMT_TIME}" UTC) set(COMPILED_ON "${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_SYSTEM}-${CMAKE_CXX_COMPILER_ID}") diff --git a/src/cpp/firestarr.cpp b/src/cpp/firestarr.cpp index 626f918dda..8f58c48b47 100644 --- a/src/cpp/firestarr.cpp +++ b/src/cpp/firestarr.cpp @@ -44,22 +44,24 @@ int main(const int argc, const char* const argv[]) printf("FireSTARR %s\n\n", SPECIFIC_REVISION); MainArgumentParser parser{argc, argv}; parser.parse_args(); - // HACK: check here so verbosity can affect showing compile info - if (parser.help_requested()) - { - show_help_and_exit(); - } auto result = -1; #ifdef NDEBUG try { #endif - fs::logging::check_fatal( - !Log::openLogFile(parser.log_file.c_str()), "Can't open log file %s", parser.log_file.c_str() - ); - fs::logging::note("Specific revision is %s", SPECIFIC_REVISION); - fs::logging::debug("Full hash of all sources is: %s", FULL_HASH); - fs::logging::debug("Compiled on: %s", COMPILED_ON); + const auto opened_log = Log::openLogFile(parser.log_file.c_str()); + // HACK: check here so verbosity can affect showing compile info + if (parser.help_requested()) + { + fs::logging::note("Specific revision is %s", SPECIFIC_REVISION); + fs::logging::debug("Full hash is: %s", FULL_HASH); + fs::logging::debug("Compiled on: %s", COMPILED_ON); + show_help_and_exit(); + } + if (!opened_log) + { + logging::fatal("Can't open log file %s", parser.log_file.c_str()); + } fs::logging::note("Output directory is %s", parser.output_directory.c_str()); fs::logging::note("Output log is %s", parser.log_file.c_str()); // at this point we've parsed positional args and know we're not in test mode