Index: boot/Makefile
===================================================================
--- boot/Makefile	(revision fd6c8b148ed237cc37d2249be4bb6fbf25708eaf)
+++ boot/Makefile	(revision 28fcaeee0e558ade40f886ba1cb2fe6acbbbd253)
@@ -31,5 +31,5 @@
 include Makefile.common
 
-all: $(VERSION_DEF) $(COMMON_MAKEFILE) $(CONFIG_MAKEFILE) $(CONFIG_HEADER) $(PREBUILD)
+all: $(VERSION_DEF) $(COMMON_MAKEFILE) $(CONFIG_MAKEFILE) $(CONFIG_HEADER)
 	$(MAKE) -r -f $(BUILD) PRECHECK=$(PRECHECK)
 ifneq ($(POSTBUILD),)
Index: boot/Makefile.grub
===================================================================
--- boot/Makefile.grub	(revision fd6c8b148ed237cc37d2249be4bb6fbf25708eaf)
+++ boot/Makefile.grub	(revision 28fcaeee0e558ade40f886ba1cb2fe6acbbbd253)
@@ -27,84 +27,5 @@
 #
 
-.PHONY: all build_dist clean
+.PHONY: all
+all:
 
-include Makefile.common
-
-GRUB = grub/$(BARCH)-$(GRUB_ARCH)
-BOOT = $(DISTROOT)/boot
-BOOT_CONFIG = $(BOOT)/grub/grub.cfg
-
-ELTORITO = boot/grub/$(GRUB_ARCH).img
-IMAGE = $(DISTROOT)/$(ELTORITO)
-
-ifeq ($(GRUB_ARCH),pc)
-	MULTIBOOT_CMD = multiboot
-	MODULE_CMD = module
-endif
-ifeq ($(GRUB_ARCH),efi)
-	MULTIBOOT_CMD = multiboot2
-	MODULE_CMD = module2
-endif
-
-all: $(POST_OUTPUT)
-
-$(POST_OUTPUT): build_dist
-ifeq ($(GRUB_ARCH),pc)
-	$(GENISOIMAGE) -J -r -input-charset utf-8 -V "HelenOS-CD" -eltorito-boot $(ELTORITO) -no-emul-boot -boot-info-table -o $@ $(DISTROOT)/
-endif
-ifeq ($(GRUB_ARCH),efi)
-	$(GENISOIMAGE) -J -r -input-charset utf-8 -V "HelenOS-CD" --efi-boot $(ELTORITO) -o $@ $(DISTROOT)/
-endif
-
-build_dist: clean $(COMPONENTS)
-	mkdir -p $(BOOT)
-	cp -r -L $(GRUB) $(BOOT)/grub
-ifeq ($(GRUB_ARCH),efi)
-	gunzip $(IMAGE)
-endif
-
-ifeq ($(GRUB_LOADER),multiboot)
-	for module in $(COMPONENTS) ; do \
-		cp "$$module" $(BOOT)/ ; \
-	done
-endif
-ifeq ($(GRUB_LOADER),chainloader)
-	cp "$(BOOT_OUTPUT)" $(BOOT)/
-endif
-
-	echo "set default=0" > $(BOOT_CONFIG)
-	echo "set timeout=10" >> $(BOOT_CONFIG)
-	echo "" >> $(BOOT_CONFIG)
-
-ifeq ($(GRUB_ARCH),pc)
-	echo "insmod vbe" >> $(BOOT_CONFIG)
-	echo "insmod vga" >> $(BOOT_CONFIG)
-endif
-ifeq ($(GRUB_ARCH),efi)
-	echo "insmod efi_gop" >> $(BOOT_CONFIG)
-	echo "insmod efi_uga" >> $(BOOT_CONFIG)
-endif
-	echo "" >> $(BOOT_CONFIG)
-
-	echo "menuentry 'HelenOS $(RELEASE)' --class helenos --class os {" >> $(BOOT_CONFIG)
-ifeq ($(GRUB_LOADER),multiboot)
-	for module in $(MODULES) ; do \
-		echo "	echo 'Loading $$module'" >> $(BOOT_CONFIG) ; \
-		if [ "$$module" = "kernel.elf" ] ; then \
-			echo "	$(MULTIBOOT_CMD) /boot/$$module" >> $(BOOT_CONFIG) ; \
-		else \
-			echo "	$(MODULE_CMD) /boot/$$module /boot/$$module" >> $(BOOT_CONFIG) ; \
-		fi \
-	done
-endif
-ifeq ($(GRUB_LOADER),chainloader)
-	echo "	echo 'Loading $(BOOT_OUTPUT)'" >> $(BOOT_CONFIG)
-	echo "	chainloader /boot/$(BOOT_OUTPUT)" >> $(BOOT_CONFIG)
-	echo "	boot" >> $(BOOT_CONFIG)
-endif
-	echo "}" >> $(BOOT_CONFIG)
-
-clean:
-	rm -fr $(DISTROOT)
-
-include Makefile.initrd
Index: boot/arch/abs32le/Makefile.inc
===================================================================
--- boot/arch/abs32le/Makefile.inc	(revision fd6c8b148ed237cc37d2249be4bb6fbf25708eaf)
+++ boot/arch/abs32le/Makefile.inc	(revision 28fcaeee0e558ade40f886ba1cb2fe6acbbbd253)
@@ -31,4 +31,3 @@
 JOB =
 MAP =
-PREBUILD =
 BUILD = Makefile.empty
Index: boot/arch/amd64/Makefile.inc
===================================================================
--- boot/arch/amd64/Makefile.inc	(revision fd6c8b148ed237cc37d2249be4bb6fbf25708eaf)
+++ boot/arch/amd64/Makefile.inc	(revision 28fcaeee0e558ade40f886ba1cb2fe6acbbbd253)
@@ -27,7 +27,4 @@
 #
 
-RD_DRV_CFG += \
-	bus/isa
-
 POST_OUTPUT = $(ROOT_PATH)/image.iso
 BUILD = Makefile.empty
Index: boot/arch/amd64/meson.build
===================================================================
--- boot/arch/amd64/meson.build	(revision 28fcaeee0e558ade40f886ba1cb2fe6acbbbd253)
+++ boot/arch/amd64/meson.build	(revision 28fcaeee0e558ade40f886ba1cb2fe6acbbbd253)
@@ -0,0 +1,4 @@
+POST_OUTPUT = 'image.iso'
+BUILD = false
+POSTBUILD = 'grub'
+GRUB_LOADER = 'multiboot'
Index: boot/grub/build_dist.sh.in
===================================================================
--- boot/grub/build_dist.sh.in	(revision 28fcaeee0e558ade40f886ba1cb2fe6acbbbd253)
+++ boot/grub/build_dist.sh.in	(revision 28fcaeee0e558ade40f886ba1cb2fe6acbbbd253)
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+DIST_DIR="$1"
+GRUB_DIR="$2"
+GRUB_CFG="$3"
+
+# TODO: keep the original and compare them
+rm -rf ${DIST_DIR}
+
+mkdir -p ${DIST_DIR}/boot/grub
+cp -r -L -t ${DIST_DIR}/boot/grub ${GRUB_DIR}/*
+cp ${GRUB_CFG} ${DIST_DIR}/boot/grub
+
+gunzip -q ${DIST_DIR}/boot/grub/*.gz || true
+
+@text@
Index: boot/grub/grub.cfg.in
===================================================================
--- boot/grub/grub.cfg.in	(revision 28fcaeee0e558ade40f886ba1cb2fe6acbbbd253)
+++ boot/grub/grub.cfg.in	(revision 28fcaeee0e558ade40f886ba1cb2fe6acbbbd253)
@@ -0,0 +1,8 @@
+set default=0
+set timeout=10
+
+@INSMODS@
+
+menuentry 'HelenOS @RELEASE@' --class helenos --class os {
+	@LOADS@
+}
Index: boot/grub/meson.build
===================================================================
--- boot/grub/meson.build	(revision 28fcaeee0e558ade40f886ba1cb2fe6acbbbd253)
+++ boot/grub/meson.build	(revision 28fcaeee0e558ade40f886ba1cb2fe6acbbbd253)
@@ -0,0 +1,98 @@
+
+
+# TODO
+install_snippet = 'mkdir -p ${DIST_DIR}/`dirname @1@`; cp @0@ ${DIST_DIR}/@1@'
+dist_dirname = 'grub_dist'
+
+build_dist_text = []
+build_dist_deps = []
+foreach init : rd_init_binaries
+	target = 'boot/' + run_command(basename, init[1], check: true).stdout().strip()
+
+	build_dist_text += install_snippet.format(init[0].full_path(), target)
+	build_dist_deps += init[0]
+endforeach
+
+build_dist_sh = configure_file(
+	input: 'build_dist.sh.in',
+	output: 'build_dist.sh',
+	configuration: { 'text' : '\n'.join(build_dist_text) },
+)
+
+
+MODULES = rd_init + [ 'boot/initrd.img' ]
+
+if GRUB_ARCH == 'pc'
+	MULTIBOOT_CMD = 'multiboot'
+	MODULE_CMD = 'module'
+	INSMODS = [ 'insmod vbe', 'insmod vga' ]
+elif GRUB_ARCH == 'efi'
+	MULTIBOOT_CMD = 'multiboot2'
+	MODULE_CMD = 'module2'
+	INSMODS = [ 'insmod efi_gop', 'insmod efi_uga' ]
+endif
+
+if GRUB_LOADER == 'multiboot'
+	LOADS = [ 'echo \'Loading kernel\'' ]
+	LOADS += [ MULTIBOOT_CMD + ' /boot/kernel.elf' ]
+
+	foreach module : MODULES
+		module = '/boot/' + run_command(basename, module, check: true).stdout().strip()
+		LOADS += 'echo \'Loading @0@\''.format(module)
+		LOADS += '@0@ @1@ @1@'.format(MODULE_CMD, module)
+	endforeach
+endif
+
+if GRUB_LOADER == 'chainloader'
+	LOADS = [
+		'echo \'Loading ' + BOOT_OUTPUT + '\'',
+		'chainloader /boot/' + BOOT_OUTPUT,
+		'boot',
+	]
+endif
+
+grub_cfg = configure_file(
+	input: 'grub.cfg.in',
+	output: 'grub.cfg',
+	configuration: {
+		'INSMODS' : '\n'.join(INSMODS),
+		'RELEASE' : HELENOS_RELEASE,
+		'LOADS'   : '\n'.join(LOADS),
+	},
+)
+
+grub_dir = meson.current_source_dir() / BARCH + '-' + GRUB_ARCH
+
+dist_dir = custom_target(dist_dirname,
+	output: dist_dirname,
+	input: [ build_dist_sh, grub_cfg, build_dist_deps ],
+	command: [ sh, '@INPUT0@', '@OUTPUT@', grub_dir, '@INPUT1@' ],
+)
+
+
+# Create .iso image.
+
+grub_image = 'boot/grub' / GRUB_ARCH + '.img'
+
+if GRUB_ARCH == 'pc'
+	genisoimage_args = [ '-eltorito-boot', grub_image, '-no-emul-boot', '-boot-info-table' ]
+elif GRUB_ARCH == 'efi'
+	genisoimage_args = [ '--efi-boot', grub_image ]
+endif
+
+image_iso = custom_target('image.iso',
+	output: 'image.iso',
+	input: dist_dir,
+	command: [
+		genisoimage,
+		'-J',
+		'-r',
+		'-input-charset', 'utf-8',
+		'-V', 'HelenOS-CD',
+		genisoimage_args,
+		'-o', '@OUTPUT@',
+		'@INPUT@',
+	],
+)
+
+POST_INPUT = image_iso
Index: boot/meson.build
===================================================================
--- boot/meson.build	(revision 28fcaeee0e558ade40f886ba1cb2fe6acbbbd253)
+++ boot/meson.build	(revision 28fcaeee0e558ade40f886ba1cb2fe6acbbbd253)
@@ -0,0 +1,6 @@
+
+subdir('arch' / BARCH)
+
+if POSTBUILD == 'grub'
+	subdir('grub')
+endif
