>From 1c6dd7b456d9efc6fdd30cc5c170817cddb361ce Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Miguel=20=C3=81ngel=20Arruga=20Vivas?=
Date: Mon, 28 Oct 2019 09:56:06 +0100
Subject: [PATCH 2/2] install: Add only-platform-installation option.
* util/grub-install.c (only_platform_installation): New variable.
(unnamed enum): Add OPTION_ONLY_PLATFORM_INSTALLATION.
(argp_parser): Add check.
: New case.
(options): Add only-platform-installation option.
(main): Do not write into grubdir and platdir when
only-platform-installation option is seleted.
---
util/grub-install.c | 105 ++++++++++++++++++++++++++++----------------
1 file changed, 66 insertions(+), 39 deletions(-)
diff --git a/util/grub-install.c b/util/grub-install.c
index 8f84bf8cd..2b446717e 100644
--- a/util/grub-install.c
+++ b/util/grub-install.c
@@ -79,6 +79,7 @@ static char *label_color;
static char *label_bgcolor;
static char *product_version;
static int add_rs_codes = 1;
+static int only_platform_installation = 0;
enum
{
@@ -109,7 +110,8 @@ enum
OPTION_LABEL_FONT,
OPTION_LABEL_COLOR,
OPTION_LABEL_BGCOLOR,
- OPTION_PRODUCT_VERSION
+ OPTION_PRODUCT_VERSION,
+ OPTION_ONLY_PLATFORM_INSTALLATION
};
static int fs_probe = 1;
@@ -197,6 +199,9 @@ argp_parser (int key, char *arg, struct argp_state *state)
return 0;
case OPTION_NO_NVRAM:
+ if (only_platform_installation)
+ grub_util_error ("%s", _("Option --only-platform-installation is "
+ "incompatible with --no-bootsector/nvram."));
update_nvram = 0;
return 0;
@@ -217,6 +222,9 @@ argp_parser (int key, char *arg, struct argp_state *state)
return 0;
case OPTION_NO_BOOTSECTOR:
+ if (only_platform_installation)
+ grub_util_error ("%s", _("Option --only-platform-installation is "
+ "incompatible with --no-bootsector/nvram."));
install_bootsector = 0;
return 0;
@@ -233,6 +241,13 @@ argp_parser (int key, char *arg, struct argp_state *state)
bootloader_id = xstrdup (arg);
return 0;
+ case OPTION_ONLY_PLATFORM_INSTALLATION:
+ if (!install_bootsector && !update_nvram)
+ grub_util_error ("%s", _("Option --only-platform-installation is "
+ "incompatible with --no-bootsector/nvram."));
+ only_platform_installation = 1;
+ return 0;
+
case ARGP_KEY_ARG:
if (install_device)
grub_util_error ("%s", _("More than one install device?"));
@@ -275,6 +290,8 @@ static struct argp_option options[] = {
{"disk-module", OPTION_DISK_MODULE, N_("MODULE"), 0,
N_("disk module to use (biosdisk or native). "
"This option is only available on BIOS target."), 2},
+ {"only-platform-installation", OPTION_ONLY_PLATFORM_INSTALLATION, 0, 0,
+ N_("only perform the platform-dependant installation."), 0},
{"no-nvram", OPTION_NO_NVRAM, 0, 0,
N_("don't update the `boot-device'/`Boot*' NVRAM variables. "
"This option is only available on EFI and IEEE1275 targets."), 2},
@@ -533,7 +550,8 @@ probe_cryptodisk_uuid (grub_disk_t disk)
free (list);
list = tmp;
}
- if (disk->dev->id == GRUB_DISK_DEVICE_CRYPTODISK_ID)
+ if (disk->dev->id == GRUB_DISK_DEVICE_CRYPTODISK_ID
+ && !only_platform_installation)
{
const char *uuid = grub_util_cryptodisk_get_uuid (disk);
if (!load_cfg_f)
@@ -1247,11 +1265,12 @@ main (int argc, char *argv[])
}
}
- grub_install_copy_files (grub_install_source_directory,
- grubdir, platform);
+ if (!only_platform_installation)
+ grub_install_copy_files (grub_install_source_directory,
+ grubdir, platform);
char *envfile = grub_util_path_concat (2, grubdir, "grubenv");
- if (!grub_util_is_regular (envfile))
+ if (!grub_util_is_regular (envfile) && !only_platform_installation)
grub_util_create_envblk_file (envfile);
size_t ndev = 0;
@@ -1343,9 +1362,10 @@ main (int argc, char *argv[])
load_cfg = grub_util_path_concat (2, platdir,
"load.cfg");
- grub_util_unlink (load_cfg);
+ if (!only_platform_installation)
+ grub_util_unlink (load_cfg);
- if (debug_image && debug_image[0])
+ if (debug_image && debug_image[0] && !only_platform_installation)
{
load_cfg_f = grub_util_fopen (load_cfg, "wb");
have_load_cfg = 1;
@@ -1375,7 +1395,7 @@ main (int argc, char *argv[])
}
}
- if (!have_abstractions)
+ if (!have_abstractions && !only_platform_installation)
{
if ((disk_module && grub_strcmp (disk_module, "biosdisk") != 0)
|| grub_drives[1]
@@ -1418,8 +1438,9 @@ main (int argc, char *argv[])
grub_util_error (_("Can't create file: %s"), strerror (errno));
fclose (flf);
relfl = grub_make_system_path_relative_to_its_root (fl);
- fprintf (load_cfg_f, "search.file %s root ",
- relfl);
+ if (!only_platform_installation)
+ fprintf (load_cfg_f, "search.file %s root ",
+ relfl);
grub_install_push_module ("search_fs_file");
}
for (curdev = grub_devices, curdrive = grub_drives; *curdev; curdev++,
@@ -1534,7 +1555,7 @@ main (int argc, char *argv[])
prefix_drive = xasprintf ("(%s)", p);
}
}
- else
+ else if (!only_platform_installation)
{
if (config.is_cryptodisk_enabled)
{
@@ -1628,44 +1649,48 @@ main (int argc, char *argv[])
core_name);
char *prefix = xasprintf ("%s%s", prefix_drive ? : "",
relative_grubdir);
- grub_install_make_image_wrap (/* source dir */ grub_install_source_directory,
- /*prefix */ prefix,
- /* output */ imgfile,
- /* memdisk */ NULL,
- have_load_cfg ? load_cfg : NULL,
- /* image target */ mkimage_target, 0);
+ if (!only_platform_installation)
+ grub_install_make_image_wrap (/* source dir */ grub_install_source_directory,
+ /*prefix */ prefix,
+ /* output */ imgfile,
+ /* memdisk */ NULL,
+ have_load_cfg ? load_cfg : NULL,
+ /* image target */ mkimage_target, 0);
/* Backward-compatibility kludges. */
switch (platform)
{
case GRUB_INSTALL_PLATFORM_MIPSEL_LOONGSON:
- {
- char *dst = grub_util_path_concat (2, bootdir, "grub.elf");
- grub_install_copy_file (imgfile, dst, 1);
- free (dst);
- }
+ if (!only_platform_installation)
+ {
+ char *dst = grub_util_path_concat (2, bootdir, "grub.elf");
+ grub_install_copy_file (imgfile, dst, 1);
+ free (dst);
+ }
break;
case GRUB_INSTALL_PLATFORM_I386_IEEE1275:
case GRUB_INSTALL_PLATFORM_POWERPC_IEEE1275:
- {
- char *dst = grub_util_path_concat (2, grubdir, "grub");
- grub_install_copy_file (imgfile, dst, 1);
- free (dst);
- }
+ if (!only_platform_installation)
+ {
+ char *dst = grub_util_path_concat (2, grubdir, "grub");
+ grub_install_copy_file (imgfile, dst, 1);
+ free (dst);
+ }
break;
case GRUB_INSTALL_PLATFORM_I386_EFI:
case GRUB_INSTALL_PLATFORM_X86_64_EFI:
- {
- char *dst = grub_util_path_concat (2, platdir, "grub.efi");
- grub_install_make_image_wrap (/* source dir */ grub_install_source_directory,
- /* prefix */ "",
- /* output */ dst,
- /* memdisk */ NULL,
- have_load_cfg ? load_cfg : NULL,
- /* image target */ mkimage_target, 0);
- free (dst);
- }
+ if (!only_platform_installation)
+ {
+ char *dst = grub_util_path_concat (2, platdir, "grub.efi");
+ grub_install_make_image_wrap (/* source dir */ grub_install_source_directory,
+ /* prefix */ "",
+ /* output */ dst,
+ /* memdisk */ NULL,
+ have_load_cfg ? load_cfg : NULL,
+ /* image target */ mkimage_target, 0);
+ free (dst);
+ }
break;
case GRUB_INSTALL_PLATFORM_ARM_EFI:
case GRUB_INSTALL_PLATFORM_ARM64_EFI:
@@ -1703,7 +1728,8 @@ main (int argc, char *argv[])
"boot.img");
char *boot_img = grub_util_path_concat (2, platdir,
"boot.img");
- grub_install_copy_file (boot_img_src, boot_img, 1);
+ if (!only_platform_installation)
+ grub_install_copy_file (boot_img_src, boot_img, 1);
grub_util_info ("%sgrub-bios-setup %s %s %s %s %s --directory='%s' --device-map='%s' '%s'",
/* TRANSLATORS: This is a prefix in the log to indicate that usually
@@ -1732,7 +1758,8 @@ main (int argc, char *argv[])
"boot.img");
char *boot_img = grub_util_path_concat (2, platdir,
"boot.img");
- grub_install_copy_file (boot_img_src, boot_img, 1);
+ if (!only_platform_installation)
+ grub_install_copy_file (boot_img_src, boot_img, 1);
grub_util_info ("%sgrub-sparc64-setup %s %s %s %s --directory='%s' --device-map='%s' '%s'",
install_bootsector ? "" : "NOT RUNNING: ",
--
2.23.0