From 019589e23ff95ad8d14a083a614a3ccf17083007 Mon Sep 17 00:00:00 2001 From: nnra <104775644+nnra6864@users.noreply.github.com> Date: Thu, 23 Oct 2025 21:50:32 +0200 Subject: [PATCH] build: replace generateVersion.sh (#12110) * Implemented the CMake version of generateVersion.sh * Made version.h.in compatible with the new build system and included version.h in helpers/MiscFunctions.cpp * Deleted the scripts/generateVersion.sh as it's no longer needed * Updated meson.build to match the new workflow * Added an empty line between includes and namespaces that I accidentally removed --- CMakeLists.txt | 58 +++++++++++++++++++----- meson.build | 85 ++++++++++++++++++++++------------- scripts/generateVersion.sh | 27 ----------- src/helpers/MiscFunctions.cpp | 2 + src/version.h.in | 41 +++++++---------- 5 files changed, 119 insertions(+), 94 deletions(-) delete mode 100755 scripts/generateVersion.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index b1c784786..845f302a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,9 +23,6 @@ set(CMAKE_MESSAGE_LOG_LEVEL "STATUS") message(STATUS "Gathering git info") -# Get git info hash and branch -execute_process(COMMAND ./scripts/generateVersion.sh - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) # Make shader files includable execute_process(COMMAND ./scripts/generateShaderIncludes.sh WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}) @@ -119,14 +116,53 @@ list(GET AQ_VERSION_LIST 0 AQ_VERSION_MAJOR) list(GET AQ_VERSION_LIST 1 AQ_VERSION_MINOR) list(GET AQ_VERSION_LIST 2 AQ_VERSION_PATCH) -add_compile_definitions(AQUAMARINE_VERSION="${aquamarine_dep_VERSION}") -add_compile_definitions(AQUAMARINE_VERSION_MAJOR=${AQ_VERSION_MAJOR}) -add_compile_definitions(AQUAMARINE_VERSION_MINOR=${AQ_VERSION_MINOR}) -add_compile_definitions(AQUAMARINE_VERSION_PATCH=${AQ_VERSION_PATCH}) -add_compile_definitions(HYPRLANG_VERSION="${hyprlang_dep_VERSION}") -add_compile_definitions(HYPRUTILS_VERSION="${hyprutils_dep_VERSION}") -add_compile_definitions(HYPRCURSOR_VERSION="${hyprcursor_dep_VERSION}") -add_compile_definitions(HYPRGRAPHICS_VERSION="${hyprgraphics_dep_VERSION}") +set(AQUAMARINE_VERSION "${aquamarine_dep_VERSION}") +set(AQUAMARINE_VERSION_MAJOR "${AQ_VERSION_MAJOR}") +set(AQUAMARINE_VERSION_MINOR "${AQ_VERSION_MINOR}") +set(AQUAMARINE_VERSION_PATCH "${AQ_VERSION_PATCH}") +set(HYPRLANG_VERSION "${hyprlang_dep_VERSION}") +set(HYPRUTILS_VERSION "${hyprutils_dep_VERSION}") +set(HYPRCURSOR_VERSION "${hyprcursor_dep_VERSION}") +set(HYPRGRAPHICS_VERSION "${hyprgraphics_dep_VERSION}") + +find_package(Git QUIET) +if(Git_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git") + execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse HEAD + OUTPUT_VARIABLE GIT_COMMIT_HASH OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND ${GIT_EXECUTABLE} branch --show-current + OUTPUT_VARIABLE GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND ${GIT_EXECUTABLE} show -s --format=%s + OUTPUT_VARIABLE GIT_COMMIT_MESSAGE OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND ${GIT_EXECUTABLE} show -s --format=%cd --date=local + OUTPUT_VARIABLE GIT_COMMIT_DATE OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND ${GIT_EXECUTABLE} diff-index --quiet HEAD -- OUTPUT_STRIP_TRAILING_WHITESPACE + RESULT_VARIABLE GIT_DIRTY_RESULT) + if(NOT GIT_DIRTY_RESULT EQUAL 0) + set(GIT_DIRTY "dirty") + else() + set(GIT_DIRTY "clean") + endif() + execute_process(COMMAND ${GIT_EXECUTABLE} describe --tags + OUTPUT_VARIABLE GIT_TAG OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND ${GIT_EXECUTABLE} rev-list --count HEAD + OUTPUT_VARIABLE GIT_COMMITS OUTPUT_STRIP_TRAILING_WHITESPACE) +else() + set(GIT_COMMIT_HASH "unknown") + set(GIT_BRANCH "unknown") + set(GIT_COMMIT_MESSAGE "unknown") + set(GIT_COMMIT_DATE "unknown") + set(GIT_DIRTY "unknown") + set(GIT_TAG "unknown") + set(GIT_COMMITS "0") +endif() + +configure_file( + ${CMAKE_SOURCE_DIR}/src/version.h.in + ${CMAKE_SOURCE_DIR}/src/version.h + @ONLY +) + +set_source_files_properties(${CMAKE_SOURCE_DIR}/src/version.h PROPERTIES GENERATED TRUE) pkg_check_modules( deps diff --git a/meson.build b/meson.build index 4f910bfe9..f3142135e 100644 --- a/meson.build +++ b/meson.build @@ -9,7 +9,6 @@ project( 'optimization=3', 'buildtype=release', 'debug=false', - 'b_lto=false', 'cpp_std=c++26', ], meson_version: '>= 1.1.0', @@ -22,7 +21,8 @@ add_project_arguments( '-Wno-unused-value', '-Wno-missing-field-initializers', '-Wno-narrowing', - '-Wno-pointer-arith', datarootdir, + '-Wno-pointer-arith', + datarootdir, '-DHYPRLAND_VERSION="' + meson.project_version() + '"', ], language: 'cpp', @@ -35,18 +35,55 @@ endif aquamarine = dependency('aquamarine', version: '>=0.9.3') hyprcursor = dependency('hyprcursor', version: '>=0.1.7') -hyprgraphics = dependency('hyprgraphics', version: '>= 0.1.6') -hyprlang = dependency('hyprlang', version: '>= 0.3.2') -hyprutils = dependency('hyprutils', version: '>= 0.8.2') -aquamarine_version_list = aquamarine.version().split('.') -add_project_arguments(['-DAQUAMARINE_VERSION="@0@"'.format(aquamarine.version())], language: 'cpp') -add_project_arguments(['-DAQUAMARINE_VERSION_MAJOR=@0@'.format(aquamarine_version_list.get(0))], language: 'cpp') -add_project_arguments(['-DAQUAMARINE_VERSION_MINOR=@0@'.format(aquamarine_version_list.get(1))], language: 'cpp') -add_project_arguments(['-DAQUAMARINE_VERSION_PATCH=@0@'.format(aquamarine_version_list.get(2))], language: 'cpp') -add_project_arguments(['-DHYPRCURSOR_VERSION="@0@"'.format(hyprcursor.version())], language: 'cpp') -add_project_arguments(['-DHYPRGRAPHICS_VERSION="@0@"'.format(hyprgraphics.version())], language: 'cpp') -add_project_arguments(['-DHYPRLANG_VERSION="@0@"'.format(hyprlang.version())], language: 'cpp') -add_project_arguments(['-DHYPRUTILS_VERSION="@0@"'.format(hyprutils.version())], language: 'cpp') +hyprgraphics = dependency('hyprgraphics', version: '>=0.1.6') +hyprlang = dependency('hyprlang', version: '>=0.3.2') +hyprutils = dependency('hyprutils', version: '>=0.8.2') + +aq_ver_list = aquamarine.version().split('.') +git = find_program('git', required: false) + +if git.found() + git_hash = run_command(git, 'rev-parse', 'HEAD').stdout().strip() + git_branch = run_command(git, 'branch', '--show-current').stdout().strip() + git_message = run_command(git, 'show', '-s', '--format=%s').stdout().strip() + git_date = run_command(git, 'show', '-s', '--format=%cd', '--date=local').stdout().strip() + git_dirty = run_command(git, 'diff-index', '--quiet', 'HEAD', '--', check: false).returncode() != 0 ? 'dirty' : 'clean' + git_tag = run_command(git, 'describe', '--tags').stdout().strip() + git_commits = run_command(git, 'rev-list', '--count', 'HEAD').stdout().strip() +else + git_hash = 'unknown' + git_branch = 'unknown' + git_message = 'unknown' + git_date = 'unknown' + git_dirty = 'unknown' + git_tag = 'unknown' + git_commits = '0' +endif + +cfg = configuration_data() +cfg.set('GIT_COMMIT_HASH', git_hash) +cfg.set('GIT_BRANCH', git_branch) +cfg.set('GIT_COMMIT_MESSAGE', git_message) +cfg.set('GIT_COMMIT_DATE', git_date) +cfg.set('GIT_DIRTY', git_dirty) +cfg.set('GIT_TAG', git_tag) +cfg.set('GIT_COMMITS', git_commits) +cfg.set('AQUAMARINE_VERSION', aquamarine.version()) +cfg.set('AQUAMARINE_VERSION_MAJOR', aq_ver_list[0]) +cfg.set('AQUAMARINE_VERSION_MINOR', aq_ver_list[1]) +cfg.set('AQUAMARINE_VERSION_PATCH', aq_ver_list[2]) +cfg.set('HYPRLANG_VERSION', hyprlang.version()) +cfg.set('HYPRUTILS_VERSION', hyprutils.version()) +cfg.set('HYPRCURSOR_VERSION', hyprcursor.version()) +cfg.set('HYPRGRAPHICS_VERSION', hyprgraphics.version()) + +version_h = configure_file( + input: 'src/version.h.in', + output: 'version.h', + configuration: cfg +) + +install_headers(version_h, subdir: 'src') xcb_dep = dependency('xcb', required: get_option('xwayland')) xcb_composite_dep = dependency('xcb-composite', required: get_option('xwayland')) @@ -55,7 +92,6 @@ xcb_icccm_dep = dependency('xcb-icccm', required: get_option('xwayland')) xcb_render_dep = dependency('xcb-render', required: get_option('xwayland')) xcb_res_dep = dependency('xcb-res', required: get_option('xwayland')) xcb_xfixes_dep = dependency('xcb-xfixes', required: get_option('xwayland')) - gio_dep = dependency('gio-2.0', required: true) if not xcb_dep.found() @@ -63,18 +99,14 @@ if not xcb_dep.found() endif backtrace_dep = cpp_compiler.find_library('execinfo', required: false) -epoll_dep = dependency('epoll-shim', required: false) # timerfd on BSDs -inotify_dep = dependency('libinotify', required: false) # inotify on BSDs - +epoll_dep = dependency('epoll-shim', required: false) +inotify_dep = dependency('libinotify', required: false) re2 = dependency('re2', required: true) -# Handle options systemd_option = get_option('systemd') systemd = dependency('systemd', required: systemd_option) systemd_option.enable_auto_if(systemd.found()) - if (systemd_option.enabled()) - message('Enabling systemd integration') add_project_arguments('-DUSES_SYSTEMD', language: 'cpp') subdir('systemd') endif @@ -83,40 +115,31 @@ if get_option('buildtype') == 'debug' add_project_arguments('-DHYPRLAND_DEBUG', language: 'cpp') endif -# Generate hyprland version and populate version.h -run_command('sh', '-c', 'scripts/generateVersion.sh', check: true) -# Make shader files includable run_command('sh', '-c', 'scripts/generateShaderIncludes.sh', check: true) -# Install headers globber = run_command('find', 'src', '-name', '*.h*', '-o', '-name', '*.inc', check: true) headers = globber.stdout().strip().split('\n') foreach file : headers install_headers(file, subdir: 'hyprland', preserve_path: true) endforeach +install_headers(version_h, subdir: 'src') tracy = dependency('tracy', static: true, required: get_option('tracy_enable')) - if get_option('tracy_enable') and get_option('buildtype') != 'debugoptimized' warning('Profiling builds should set -- buildtype = debugoptimized') endif - - subdir('protocols') subdir('src') subdir('hyprctl') subdir('assets') subdir('example') subdir('docs') - if get_option('hyprpm').enabled() subdir('hyprpm/src') endif -# Generate hyprland.pc pkg_install_dir = join_paths(get_option('datadir'), 'pkgconfig') - import('pkgconfig').generate( name: 'Hyprland', filebase: 'hyprland', diff --git a/scripts/generateVersion.sh b/scripts/generateVersion.sh deleted file mode 100755 index 9313815da..000000000 --- a/scripts/generateVersion.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh - -# if the git directory doesn't exist, don't gather data to avoid overwriting, unless -# the version file is missing altogether (otherwise compiling will fail) -if [ ! -d ./.git ]; then - if [ -f ./src/version.h ]; then - exit 0 - fi -fi - -cp -fr ./src/version.h.in ./src/version.h - -HASH=${HASH-$(git rev-parse HEAD)} -BRANCH=${BRANCH-$(git branch --show-current)} -MESSAGE=${MESSAGE-$(git show | head -n 5 | tail -n 1 | sed -e 's/#//g' -e 's/\"//g')} -DATE=${DATE-$(git show --no-patch --format=%cd --date=local)} -DIRTY=${DIRTY-$(git diff-index --quiet HEAD -- || echo dirty)} -TAG=${TAG-$(git describe --tags)} -COMMITS=${COMMITS-$(git rev-list --count HEAD)} - -sed -i -e "s#@HASH@#${HASH}#" ./src/version.h -sed -i -e "s#@BRANCH@#${BRANCH}#" ./src/version.h -sed -i -e "s#@MESSAGE@#${MESSAGE}#" ./src/version.h -sed -i -e "s#@DATE@#${DATE}#" ./src/version.h -sed -i -e "s#@DIRTY@#${DIRTY}#" ./src/version.h -sed -i -e "s#@TAG@#${TAG}#" ./src/version.h -sed -i -e "s#@COMMITS@#${COMMITS}#" ./src/version.h diff --git a/src/helpers/MiscFunctions.cpp b/src/helpers/MiscFunctions.cpp index 50a89622d..17ddc6333 100644 --- a/src/helpers/MiscFunctions.cpp +++ b/src/helpers/MiscFunctions.cpp @@ -23,6 +23,8 @@ #endif #include #include +#include "../version.h" + using namespace Hyprutils::String; using namespace Hyprutils::OS; diff --git a/src/version.h.in b/src/version.h.in index 862e87786..28152d731 100644 --- a/src/version.h.in +++ b/src/version.h.in @@ -1,28 +1,19 @@ #pragma once -#define GIT_COMMIT_HASH "@HASH@" -#define GIT_BRANCH "@BRANCH@" -#define GIT_COMMIT_MESSAGE "@MESSAGE@" -#define GIT_COMMIT_DATE "@DATE@" -#define GIT_DIRTY "@DIRTY@" -#define GIT_TAG "@TAG@" -#define GIT_COMMITS "@COMMITS@" +#define GIT_COMMIT_HASH "@GIT_COMMIT_HASH@" +#define GIT_BRANCH "@GIT_BRANCH@" +#define GIT_COMMIT_MESSAGE "@GIT_COMMIT_MESSAGE@" +#define GIT_COMMIT_DATE "@GIT_COMMIT_DATE@" +#define GIT_DIRTY "@GIT_DIRTY@" +#define GIT_TAG "@GIT_TAG@" +#define GIT_COMMITS "@GIT_COMMITS@" -#ifndef HYPRCURSOR_VERSION -#define HYPRCURSOR_VERSION "@HYPRCURSOR_VERSION@" -#endif - -#ifndef HYPRGRAPHICS_VERSION -#define HYPRGRAPHICS_VERSION "@HYPRGRAPHICS_VERSION@" -#endif - -#ifndef HYPRLANG_VERSION -#define HYPRLANG_VERSION "@HYPRLANG_VERSION@" -#endif - -#ifndef HYPRUTILS_VERSION -#define HYPRUTILS_VERSION "@HYPRUTILS_VERSION@" -#endif - -#ifndef AQUAMARINE_VERSION #define AQUAMARINE_VERSION "@AQUAMARINE_VERSION@" -#endif +// clang-format off +#define AQUAMARINE_VERSION_MAJOR @AQUAMARINE_VERSION_MAJOR@ +#define AQUAMARINE_VERSION_MINOR @AQUAMARINE_VERSION_MINOR@ +#define AQUAMARINE_VERSION_PATCH @AQUAMARINE_VERSION_PATCH@ +// clang-format on +#define HYPRLANG_VERSION "@HYPRLANG_VERSION@" +#define HYPRUTILS_VERSION "@HYPRUTILS_VERSION@" +#define HYPRCURSOR_VERSION "@HYPRCURSOR_VERSION@" +#define HYPRGRAPHICS_VERSION "@HYPRGRAPHICS_VERSION@"