From 914851b91aeb450592e2d62749169298ac48fb0c Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Tue, 10 Oct 2023 20:21:57 +0100 Subject: [PATCH] internal: better versioning (#3543) * better versioning * meson: better versioning * nix: better versioning --------- Co-authored-by: Mihai Fufezan --- .gitignore | 2 ++ CMakeLists.txt | 30 ++---------------------------- meson.build | 12 ++---------- nix/default.nix | 12 +++++++++--- nix/patches/meson-build.patch | 33 ++++++++++++++------------------- scripts/generateVersion.sh | 14 ++++++++++++++ src/macros.hpp | 27 ++++++++------------------- src/version.h.in | 5 +++++ 8 files changed, 56 insertions(+), 79 deletions(-) create mode 100755 scripts/generateVersion.sh create mode 100644 src/version.h.in diff --git a/.gitignore b/.gitignore index 96fd6c87..dfee530e 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,5 @@ gmon.out *.tar.gz PKGBUILD + +src/version.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b3bc5526..29eccd64 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,34 +21,8 @@ message(STATUS "Gathering git info") # Get git info # hash and branch execute_process( - COMMAND git rev-parse --abbrev-ref HEAD - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE GIT_BRANCH - OUTPUT_STRIP_TRAILING_WHITESPACE) - -execute_process( - COMMAND git rev-parse HEAD - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE GIT_COMMIT_HASH - OUTPUT_STRIP_TRAILING_WHITESPACE) - -execute_process( - COMMAND sh -c "git show ${GIT_COMMIT_HASH} | head -n 5 | tail -n 1 | sed -e 's/#//g' -e 's/\"//g'" - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE GIT_COMMIT_MESSAGE - OUTPUT_STRIP_TRAILING_WHITESPACE) - -execute_process( - COMMAND sh -c "git diff-index --quiet HEAD -- || echo \"dirty\"" - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE GIT_DIRTY - OUTPUT_STRIP_TRAILING_WHITESPACE) - -execute_process( - COMMAND sh -c "git describe --tags" - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_VARIABLE GIT_TAG - OUTPUT_STRIP_TRAILING_WHITESPACE) + COMMAND ./scripts/generateVersion.sh + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) # # diff --git a/meson.build b/meson.build index d515621e..726933bc 100644 --- a/meson.build +++ b/meson.build @@ -20,22 +20,12 @@ else error('Could not configure current C++ compiler (' + cpp_compiler.get_id() + ' ' + cpp_compiler.version() + ') with required C++ standard (C++23)') endif -GIT_BRANCH = run_command('git', 'rev-parse', '--abbrev-ref', 'HEAD', check: false).stdout().strip() -GIT_COMMIT_HASH = run_command('git', 'rev-parse', 'HEAD', check: false).stdout().strip() -GIT_COMMIT_MESSAGE = run_command('sh', '-c', 'git show | head -n 5 | tail -n 1', check: false).stdout().strip() -GIT_DIRTY = run_command('sh', '-c', 'git diff-index --quiet HEAD -- || echo "dirty"', check: false).stdout().strip() - add_project_arguments( [ '-Wno-unused-parameter', '-Wno-unused-value', '-Wno-missing-field-initializers', '-Wno-narrowing', - - f'-DGIT_BRANCH="@GIT_BRANCH@"', - f'-DGIT_COMMIT_HASH="@GIT_COMMIT_HASH@"', - f'-DGIT_COMMIT_MESSAGE="@GIT_COMMIT_MESSAGE@"', - f'-DGIT_DIRTY="@GIT_DIRTY@"', ], language: 'cpp') @@ -81,6 +71,8 @@ foreach file : headers install_headers(file, subdir: 'hyprland', preserve_path: true) endforeach +version_h = run_command('sh', '-c', 'scripts/generateVersion.sh') + subdir('protocols') subdir('src') subdir('hyprctl') diff --git a/nix/default.nix b/nix/default.nix index 96fa12d7..d12bc073 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -105,9 +105,15 @@ assert lib.assertMsg (!hidpiXWayland) "The option `hidpiXWayland` has been remov postPatch = '' # Fix hardcoded paths to /usr installation sed -i "s#/usr#$out#" src/render/OpenGL.cpp - substituteInPlace meson.build \ - --replace "@GIT_COMMIT_HASH@" '${commit}' \ - --replace "@GIT_DIRTY@" '${ + + # Generate version.h + cp src/version.h.in src/version.h + substituteInPlace src/version.h \ + --replace "@HASH@" '${commit}' \ + --replace "@BRANCH@" "" \ + --replace "@MESSAGE@" "" \ + --replace "@TAG@" "" \ + --replace "@DIRTY@" '${ if commit == "" then "dirty" else "" diff --git a/nix/patches/meson-build.patch b/nix/patches/meson-build.patch index d0cba18a..23442172 100644 --- a/nix/patches/meson-build.patch +++ b/nix/patches/meson-build.patch @@ -1,20 +1,8 @@ diff --git a/meson.build b/meson.build -index f3802553..6a924a79 100644 +index 726933bc..28b4d9ac 100644 --- a/meson.build +++ b/meson.build -@@ -21,9 +21,9 @@ else - endif - - GIT_BRANCH = run_command('git', 'rev-parse', '--abbrev-ref', 'HEAD', check: false).stdout().strip() --GIT_COMMIT_HASH = run_command('git', 'rev-parse', 'HEAD', check: false).stdout().strip() -+GIT_COMMIT_HASH = '@GIT_COMMIT_HASH@' - GIT_COMMIT_MESSAGE = run_command('sh', '-c', 'git show | head -n 5 | tail -n 1', check: false).stdout().strip() --GIT_DIRTY = run_command('sh', '-c', 'git diff-index --quiet HEAD -- || echo "dirty"', check: false).stdout().strip() -+GIT_DIRTY = '@GIT_DIRTY@' - - add_project_arguments( - [ -@@ -39,21 +39,8 @@ add_project_arguments( +@@ -29,20 +29,7 @@ add_project_arguments( ], language: 'cpp') @@ -32,17 +20,24 @@ index f3802553..6a924a79 100644 -have_xwayland = xcb_dep.found() and have_xwlr - -if not have_xwayland -- add_project_arguments('-DNO_XWAYLAND', language: 'cpp') +if get_option('xwayland').disabled() -+ add_project_arguments('-DNO_XWAYLAND', language: 'cpp') + add_project_arguments('-DNO_XWAYLAND', language: 'cpp') endif - backtrace_dep = cpp_compiler.find_library('execinfo', required: false) +@@ -71,8 +58,6 @@ foreach file : headers + install_headers(file, subdir: 'hyprland', preserve_path: true) + endforeach + +-version_h = run_command('sh', '-c', 'scripts/generateVersion.sh') +- + subdir('protocols') + subdir('src') + subdir('hyprctl') diff --git a/src/meson.build b/src/meson.build -index 7b658d31..60aa4057 100644 +index 2065c6f5..55530605 100644 --- a/src/meson.build +++ b/src/meson.build -@@ -7,16 +7,16 @@ executable('Hyprland', src, +@@ -9,16 +9,16 @@ executable('Hyprland', src, server_protos, dependency('wayland-server'), dependency('wayland-client'), diff --git a/scripts/generateVersion.sh b/scripts/generateVersion.sh new file mode 100755 index 00000000..01bf1539 --- /dev/null +++ b/scripts/generateVersion.sh @@ -0,0 +1,14 @@ +#!/bin/sh +cp ./src/version.h.in ./src/version.h -fr + +HASH=$(git rev-parse HEAD) +BRANCH=$(git rev-parse --abbrev-ref HEAD) +MESSAGE=$(git show ${GIT_COMMIT_HASH} | head -n 5 | tail -n 1 | sed -e 's/#//g' -e 's/\"//g') +DIRTY=$(git diff-index --quiet HEAD -- || echo \"dirty\") +TAG=$(git describe --tags) + +awk -i inplace "{sub(/@HASH@/,\"${HASH}\")}1" ./src/version.h +awk -i inplace "{sub(/@BRANCH@/,\"${BRANCH}\")}1" ./src/version.h +awk -i inplace "{sub(/@MESSAGE@/,\"${MESSAGE}\")}1" ./src/version.h +awk -i inplace "{sub(/@DIRTY@/,\"${DIRTY}\")}1" ./src/version.h +awk -i inplace "{sub(/@TAG@/,\"${TAG}\")}1" ./src/version.h \ No newline at end of file diff --git a/src/macros.hpp b/src/macros.hpp index 8874ad3e..eada3a9f 100644 --- a/src/macros.hpp +++ b/src/macros.hpp @@ -14,22 +14,7 @@ #define ISDEBUG false #endif -// git stuff -#ifndef GIT_COMMIT_HASH -#define GIT_COMMIT_HASH "?" -#endif -#ifndef GIT_BRANCH -#define GIT_BRANCH "?" -#endif -#ifndef GIT_COMMIT_MESSAGE -#define GIT_COMMIT_MESSAGE "?" -#endif -#ifndef GIT_DIRTY -#define GIT_DIRTY "?" -#endif -#ifndef GIT_TAG -#define GIT_TAG "?" -#endif +#include "version.h" #define SPECIAL_WORKSPACE_START (-99) @@ -57,7 +42,7 @@ if (!(expr)) { \ Debug::log(CRIT, "\n==========================================================================================\nASSERTION FAILED! \n\n{}\n\nat: line {} in {}", \ std::format(reason, ##__VA_ARGS__), __LINE__, \ - ([]() constexpr -> std::string { return std::string(__FILE__).substr(std::string(__FILE__).find_last_of('/') + 1); })()); \ + ([]() constexpr->std::string { return std::string(__FILE__).substr(std::string(__FILE__).find_last_of('/') + 1); })()); \ printf("Assertion failed! See the log in /tmp/hypr/hyprland.log for more info."); \ raise(SIGABRT); \ } @@ -76,7 +61,9 @@ } #define FORMAT_FLAG(spec__, flag__) \ - case spec__: (flag__) = true; break; + case spec__: \ + (flag__) = true; \ + break; #define FORMAT_NUMBER(buf__) \ case '0': \ @@ -88,7 +75,9 @@ case '6': \ case '7': \ case '8': \ - case '9': (buf__).push_back(*it); break; + case '9': \ + (buf__).push_back(*it); \ + break; #if ISDEBUG #define UNREACHABLE() \ diff --git a/src/version.h.in b/src/version.h.in new file mode 100644 index 00000000..01cfa7c5 --- /dev/null +++ b/src/version.h.in @@ -0,0 +1,5 @@ +#define GIT_COMMIT_HASH "@HASH@" +#define GIT_BRANCH "@BRANCH@" +#define GIT_COMMIT_MESSAGE "@MESSAGE@" +#define GIT_DIRTY "@DIRTY@" +#define GIT_TAG "@TAG@" \ No newline at end of file