Index: boot/arch/arm32/meson.build
===================================================================
--- boot/arch/arm32/meson.build	(revision 98975a82755ce9aa9edd1fad289db15a79921dc8)
+++ boot/arch/arm32/meson.build	(revision 5b586b9a32f80302879788263b29cffd509a776a)
@@ -4,6 +4,6 @@
 
 if MACHINE == 'gta02'
-	LADDR = 0x30008000
-	SADDR = 0x30008000
+	LADDR = '0x30008000'
+	SADDR = '0x30008000'
 	POSTBUILD = 'uboot'
 	POST_OUTPUT = 'uImage.bin'
@@ -11,6 +11,6 @@
 
 if MACHINE == 'beagleboardxm' or MACHINE == 'beaglebone'
-	LADDR = 0x80000000
-	SADDR = 0x80000000
+	LADDR = '0x80000000'
+	SADDR = '0x80000000'
 	POSTBUILD = 'uboot'
 	POST_OUTPUT = 'uImage.bin'
@@ -18,6 +18,6 @@
 
 if MACHINE == 'raspberrypi'
-	LADDR = 0x00008000
-	SADDR = 0x00008000
+	LADDR = '0x00008000'
+	SADDR = '0x00008000'
 	POSTBUILD = 'uboot'
 	POST_OUTPUT = 'uImage.bin'
Index: boot/meson.build
===================================================================
--- boot/meson.build	(revision 98975a82755ce9aa9edd1fad289db15a79921dc8)
+++ boot/meson.build	(revision 5b586b9a32f80302879788263b29cffd509a776a)
@@ -1,3 +1,7 @@
 subdir('arch' / BARCH)
+
+if POSTBUILD == 'uimage'
+	boot_image_format = 'binary'
+endif
 
 if BUILD
@@ -137,7 +141,7 @@
 	if boot_image_format == 'binary'
 		# Some platforms can't ELF.
-		boot_image = custom_target(boot_image_name,
+		boot_image = custom_target(boot_image_name + '.bin',
 			input: boot_elf,
-			output: boot_image_name,
+			output: boot_image_name + '.bin',
 			command: [ objcopy, '-O', 'binary', '@INPUT@', '@OUTPUT@' ],
 		)
@@ -154,6 +158,19 @@
 
 if POSTBUILD == 'uboot'
-	# TODO
-	error('unfinished')
+	IMAGE_NAME = 'HelenOS-' + HELENOS_RELEASE
+
+	POST_INPUT = custom_target('uboot-image',
+		output: 'uboot-image.bin',
+		input: boot_image,
+		command: [
+			mkuimage,
+			'-name', IMAGE_NAME,
+			'-laddr', LADDR,
+			'-saddr', SADDR,
+			'-ostype', UIMAGE_OS,
+			'@INPUT@',
+			'@OUTPUT@',
+		],
+	)
 endif
 
