Index: Makefile
===================================================================
--- Makefile	(revision 45b26114971f5c084a8e07c2f5740ed79d8a539a)
+++ Makefile	(revision 2e2cefdb40a3bb2e685f7101a4fdb532a280b3de)
@@ -34,5 +34,5 @@
 FORMAT = clang-format
 CHECK = tools/check.sh
-CONFIG = tools/config.py
+CONFIG = $(abspath tools/config.py)
 MESON = meson
 
@@ -41,8 +41,9 @@
 CONFIG_RULES = HelenOS.config
 
-CONFIG_MAKEFILE = Makefile.config
-CONFIG_HEADER = config.h
+CONFIG_MAKEFILE = $(BUILD_DIR)/Makefile.config
+CONFIG_HEADER = $(BUILD_DIR)/config.h
 ERRNO_HEADER = abi/include/abi/errno.h
 ERRNO_INPUT = abi/include/abi/errno.in
+VERSION_FILE = version
 
 -include $(CONFIG_MAKEFILE)
@@ -70,5 +71,5 @@
 all: meson
 
-$(BUILD_DIR)/build.ninja: Makefile.config version
+$(BUILD_DIR)/build.ninja: $(CONFIG_MAKEFILE) $(VERSION_FILE)
 	PATH="$(CROSS_PATH):$$PATH" meson . $(BUILD_DIR) --cross-file meson/cross/$(CROSS_TARGET) $(MESON_ARGS)
 
@@ -131,15 +132,18 @@
 
 config_default $(CONFIG_MAKEFILE) $(CONFIG_HEADER): $(CONFIG_RULES)
+	mkdir -p $(BUILD_DIR)
 ifeq ($(HANDS_OFF),y)
-	$(CONFIG) $< defaults hands-off $(PROFILE)
+	cd $(BUILD_DIR) && $(CONFIG) $(abspath $<) $(abspath defaults) hands-off $(PROFILE)
 else
-	$(CONFIG) $< defaults default $(PROFILE)
+	cd $(BUILD_DIR) && $(CONFIG) $(abspath $<) $(abspath defaults) default $(PROFILE)
 endif
 
 config: $(CONFIG_RULES)
-	$(CONFIG) $< defaults
+	mkdir -p $(BUILD_DIR)
+	cd $(BUILD_DIR) && $(CONFIG) $(abspath $<) $(abspath defaults)
 
 random-config: $(CONFIG_RULES)
-	$(CONFIG) $< defaults random
+	mkdir -p $(BUILD_DIR)
+	cd $(BUILD_DIR) && $(CONFIG) $(abspath $<) $(abspath defaults) random
 
 # Release files
Index: boot/meson.build
===================================================================
--- boot/meson.build	(revision 45b26114971f5c084a8e07c2f5740ed79d8a539a)
+++ boot/meson.build	(revision 2e2cefdb40a3bb2e685f7101a4fdb532a280b3de)
@@ -53,5 +53,5 @@
 
 	boot_defs = [
-		'-imacros', meson.source_root() / 'config.h',
+		'-imacros', meson.build_root() / 'config.h',
 		'-D_HELENOS_SOURCE',
 		'-DBOOT',
Index: kernel/meson.build
===================================================================
--- kernel/meson.build	(revision 45b26114971f5c084a8e07c2f5740ed79d8a539a)
+++ kernel/meson.build	(revision 2e2cefdb40a3bb2e685f7101a4fdb532a280b3de)
@@ -28,5 +28,5 @@
 
 kernel_defs = [
-	'-imacros', meson.source_root() / 'config.h',
+	'-imacros', meson.build_root() / 'config.h',
 	'-D_HELENOS_SOURCE',
 	'-DKERNEL',
Index: meson.build
===================================================================
--- meson.build	(revision 45b26114971f5c084a8e07c2f5740ed79d8a539a)
+++ meson.build	(revision 2e2cefdb40a3bb2e685f7101a4fdb532a280b3de)
@@ -176,6 +176,8 @@
 ]
 
+CONFIG_MAKEFILE = files(meson.build_root() / 'Makefile.config')
+
 foreach varname : config_variables
-	result = run_command(grep, '^' + varname + '\\b', meson.source_root() / 'Makefile.config')
+	result = run_command(grep, '^' + varname + '\\b', CONFIG_MAKEFILE)
 	if result.returncode() != 0
 		# TODO: Output negative/inapplicable variables too in config, so that we can check for typos here.
@@ -220,5 +222,5 @@
 add_project_arguments(
 	# TODO: Remove from project arguments and only use where needed.
-	'-imacros', join_paths(meson.source_root(), 'config.h'),
+	'-imacros', meson.build_root() / 'config.h',
 	language : [ 'c' ],
 )
@@ -442,6 +444,6 @@
 
 # TODO: remove
-install_files += [[ 'config', meson.current_source_dir() / 'Makefile.config', 'Makefile.config' ]]
-install_deps += files('Makefile.config')
+install_files += [[ 'config', meson.build_root() / 'Makefile.config', 'Makefile.config' ]]
+install_deps += CONFIG_MAKEFILE
 
 if CONFIG_DEVEL_FILES
