Re: [Test patch] Re: Duplicate files /boot/grub/locale/*.mo~ in iso file made by grub-mkrescue
Adam Purkrt <[email protected]> Fri, 30 May 2025 17:02:39 +0200
| Newsgroups | gmane.comp.boot-loaders.grub.bugs |
|---|---|
| Message-ID | <[email protected]> |
Hi, I'm having some difficulties compiling grub from git (my own
deficiencies) - I do not see any .mo files on iso with it, the locale
dir is empty, somehow the localization is off. But that happens
even without your patch, so I am doing something wrong.
I was able to apply your patches to grub-2.12 in gentoo through
the use of user patches and your patch works - there are no more
*.mo~ files in the iso made by grub-mkrescue, and all the .mo
files are there.
But looking at the patch let me say: it would be better if the
*.mo~ weren't (temporarily) made during the process of creating
the iso at all, so it would be better to prevent their creation,
rather than fix their deletion. Just a personal opinion,
I don't know how to do that.
Anyway, again, your patch works for me well, so far. Good job!
Best regards,
Adam
On 5/29/25 2:58 PM, Thomas Schmitt wrote:
>
> This is my preliminary proposal for a grub-util API call
> void grub_install_delete_backup_files (void);
> which gets called by grub-mkrescue instead of
> grub_set_install_backup_ponr (void);
>
> In my Debian 12 setup with X86_64_EFI and I386_PC this prevents the
> presence of .mo~ files in the ISO.
>
> Polishing this proposal for submission on grub-devel will be some more
> work. So i ask you to apply it to GRUB source and to test whether it
> does what we want without spoiling anything that worked before.
>
> Change details beyond just calling the atexit cleanup code:
>
> The functionality to remove backup files depended on the availability
> of system call atexit(3). Now only the ability to perform this removal
> automatically at exit time depends on HAVE_ATEXIT.
>
> The changed grub-mkrescue was tested with valgrind which reports 6610
> lost allocated bytes. I did not investigate this further since my
> changes do not allocate additional memory.
>
>
> Have a nice day :)
>
> Thomas
>
> =======================================================================
>
> diff --git a/include/grub/util/install.h b/include/grub/util/install.h
> index 5c0a52ca2..22c214a20 100644
> --- a/include/grub/util/install.h
> +++ b/include/grub/util/install.h
> @@ -146,6 +146,9 @@ void
> grub_install_copy_files (const char *src,
> const char *dst,
> enum grub_install_plat platid);
> +void
> +grub_install_delete_backup_files (void);
> +
> char *
> grub_install_get_platform_name (enum grub_install_plat platid);
>
> @@ -290,6 +293,9 @@ grub_install_is_short_mbrgap_supported (void);
> * to set the grub_install_backup_ponr flag. This way failure to perform
> * subsequent actions will not result in reverting new modules to the
> * old ones, e.g. in case efivars updates fails.
> + * Independently of HAVE_ATEXIT it is possible to set the flag and to perform
> + * immediate removal of the backup files by
> + * void grub_install_delete_backup_files (void);
> */
> #ifdef HAVE_ATEXIT
> extern void
> diff --git a/util/grub-install-common.c b/util/grub-install-common.c
> index 22bccb6a3..ee26dc91b 100644
> --- a/util/grub-install-common.c
> +++ b/util/grub-install-common.c
> @@ -287,17 +287,16 @@ clean_grub_dir_real (const char *di, enum clean_grub_dir_mode mode)
> grub_util_fd_closedir (d);
> }
>
> -#ifdef HAVE_ATEXIT
> static void
> -restore_backup_atexit (void)
> +restore_backup (int by_any_pid)
> {
> size_t i;
>
> /*
> - * Some child inherited atexit() handler, did not clear it, and called it.
> - * Thus skip clean or restore logic.
> + * If not by_any_pid, check whether some child inherited atexit() handler,
> + * did not clear it, and called it. Thus skip clean or restore logic.
> */
> - if (backup_process != getpid ())
> + if (backup_process != getpid () && !by_any_pid)
> return;
>
> for (i = 0; i < backup_dirs_size; i++)
> @@ -318,7 +317,15 @@ restore_backup_atexit (void)
>
> backup_dirs_size = 0;
>
> - free (backup_dirs);
> + if (backup_dirs != NULL)
> + free (backup_dirs);
> + backup_dirs = NULL;
> +}
> +
> +static void
> +restore_backup_atexit (void)
> +{
> + restore_backup (0);
> }
>
> static void
> @@ -329,16 +336,12 @@ append_to_backup_dirs (const char *dir)
> backup_dirs_size++;
> if (!backup_process)
> {
> +#ifdef HAVE_ATEXIT
> atexit (restore_backup_atexit);
> +#endif
> backup_process = getpid ();
> }
> }
> -#else
> -static void
> -append_to_backup_dirs (const char *dir __attribute__ ((unused)))
> -{
> -}
> -#endif
>
> static void
> clean_grub_dir (const char *di)
> @@ -1189,3 +1192,11 @@ grub_util_unlink_recursive (const char *name)
> grub_util_rmdir (name);
> grub_util_fd_closedir (d);
> }
> +
> +
> +void
> +grub_install_delete_backup_files (void)
> +{
> + grub_install_backup_ponr = 1;
> + restore_backup (1);
> +}
> diff --git a/util/grub-mkrescue.c b/util/grub-mkrescue.c
> index 6dc71a8a1..a2e5149a2 100644
> --- a/util/grub-mkrescue.c
> +++ b/util/grub-mkrescue.c
> @@ -555,7 +555,7 @@ main (int argc, char *argv[])
> source_dirs[plat] = xstrdup (grub_install_source_directory);
> }
>
> - grub_set_install_backup_ponr ();
> + grub_install_delete_backup_files ();
>
> if (system_area == SYS_AREA_AUTO || grub_install_source_directory)
> {