Index: boot/meson.build
===================================================================
--- boot/meson.build	(revision 56440a5727e948c740e9ce3665218dfeb5e62fb3)
+++ boot/meson.build	(revision d3357e97957ecf67e76d762d625365b3d0a1a3ad)
@@ -81,4 +81,12 @@
 	endif
 
+	boot_files = static_library('bootfiles', boot_src,
+		include_directories: boot_include_dirs,
+		implicit_include_directories: false,
+		c_args: boot_c_args,
+		pic: false,
+		build_by_default: true,
+	)
+
 	# Preprocess linker script using C preprocessor.
 	boot_ldscript = custom_target('_link.ld',
@@ -97,4 +105,5 @@
 		],
 		capture: true,
+		build_by_default: true
 	)
 
@@ -133,7 +142,6 @@
 	boot_image_map_path = meson.current_build_dir()/boot_image_name + '.map'
 
-	boot_elf = executable(boot_image_name + '.elf', boot_src, boot_comps_o,
+	boot_elf = executable(boot_image_name + '.elf', boot_comps_o,
 		include_directories: boot_include_dirs,
-		implicit_include_directories: false,
 		c_args: boot_c_args,
 		link_args: boot_c_args + boot_link_args + [
@@ -141,7 +149,7 @@
 		],
 		link_depends: boot_ldscript,
-		install: true,
-		install_dir: 'boot',
+		link_whole: boot_files,
 		pie: false,
+		build_by_default: false,
 	)
 
@@ -160,8 +168,4 @@
 endif
 
-if POSTBUILD == 'none'
-	POST_INPUT = disabler()
-endif
-
 if POSTBUILD == 'raw'
 	POST_INPUT = boot_image
Index: build_all.sh
===================================================================
--- build_all.sh	(revision 56440a5727e948c740e9ce3665218dfeb5e62fb3)
+++ build_all.sh	(revision d3357e97957ecf67e76d762d625365b3d0a1a3ad)
@@ -22,9 +22,10 @@
 
 
-echo "Configuring all profiles."
+echo
+echo "###################### Configuring all profiles ######################"
 
 for profile in $PROFILES; do
 	if [ -f ${profile}/build.ninja ]; then
-		echo "Profile ${profile} already configured."
+		ninja -C ${profile} build.ninja || exit 1
 		continue
 	fi
@@ -51,8 +52,21 @@
 done
 
-
-echo "Building all profiles."
+echo
+echo "###################### Building all profiles ######################"
 
 for profile in $PROFILES; do
-	ninja -C ${profile}
+	ninja -C ${profile} || exit 1
 done
+
+
+if [ "$#" -eq 1 ] && [ "$1" = 'images' ]; then
+	echo "###################### Building all images ######################"
+
+	for profile in $PROFILES; do
+		ninja -C ${profile} image_path || exit 1
+	done
+else
+	echo
+	echo "Bootable images not built."
+	echo "Run '$0 images' to build them as well."
+fi
Index: kernel/meson.build
===================================================================
--- kernel/meson.build	(revision 56440a5727e948c740e9ce3665218dfeb5e62fb3)
+++ kernel/meson.build	(revision d3357e97957ecf67e76d762d625365b3d0a1a3ad)
@@ -54,4 +54,5 @@
 	],
 	capture: true,
+	build_by_default: true,
 )
 
Index: meson.build
===================================================================
--- meson.build	(revision 56440a5727e948c740e9ce3665218dfeb5e62fb3)
+++ meson.build	(revision d3357e97957ecf67e76d762d625365b3d0a1a3ad)
@@ -518,8 +518,22 @@
 subdir('boot')
 
-custom_target(POST_OUTPUT,
-	output: POST_OUTPUT,
-	input: POST_INPUT,
-	command: [ cp, '@INPUT@', '@OUTPUT@' ],
-	build_by_default: true,
-)
+if is_variable('POST_INPUT')
+	image = custom_target(POST_OUTPUT,
+		output: POST_OUTPUT,
+		input: POST_INPUT,
+		command: [ cp, '@INPUT@', '@OUTPUT@' ],
+	)
+
+	custom_target('image_path',
+		output: 'image_path',
+		input: image,
+		command: [ 'echo', '@INPUT@' ],
+		capture: true,
+	)
+else
+	custom_target('image_path',
+		output: 'image_path',
+		command: [ 'echo' ],
+		capture: true,
+	)
+endif
