diff --git a/apps/fsearch/meson.build b/apps/fsearch/meson.build
index 68a9fd104a57380a525bb2171d2fc5a071682cfc..881b91df41de98f796c8d4561c9c3b1c56acf9d1 100644
--- a/apps/fsearch/meson.build
+++ b/apps/fsearch/meson.build
@@ -1,9 +1,4 @@
-walk_dir_code = '''#include <filesystem>
-int main() { auto it = std::filesystem::recursive_directory_iterator("."); }
-'''
-
-does_link = cpp_compiler.links(walk_dir_code, args: '--std=c++2a', name : 'walk_dir')
-if does_link
+if cpp_has_fs_recursive_directory_iterator
 	fsearch_exe = executable(
 	  'fsearch',
 	  'fsearch.cpp',
diff --git a/emper/Emper.hpp b/emper/Emper.hpp
index 3fb17133be9e6005e35c926f2ef5c364d4e0e9b7..530c03b566a4d22d5b16448e422273352621dbbc 100644
--- a/emper/Emper.hpp
+++ b/emper/Emper.hpp
@@ -137,4 +137,12 @@ static const bool SET_AFFINITY_ON_BLOCK =
 #endif
 		;
 
+static const bool HAS_FS_PATH =
+#ifdef EMPER_HAS_FS_PATH
+		true
+#else
+		false
+#endif
+		;
+
 }	 // namespace emper
diff --git a/emper/io.hpp b/emper/io.hpp
index 9cd813d7a97190da0f695a3d6d9fa2a60874efa0..2ab167f256c34eda540867c445dcc2ebc481f896 100644
--- a/emper/io.hpp
+++ b/emper/io.hpp
@@ -15,6 +15,7 @@
 namespace fs = std::filesystem;
 
 #include "Future.hpp"	 // for Futures
+#include "emper-config.h"
 
 /*
  * Header defining the public POSIX-like IO interface of emper.
@@ -560,6 +561,7 @@ inline void closeAndForget(int fd) {
 	future.submitAndForget();
 }
 
+#ifdef EMPER_HAS_FS_PATH
 /**
  * @brief recursively walk a file tree in parallel
  *
@@ -598,6 +600,7 @@ inline void closeAndForget(int fd) {
 void recursive_directory_walk(const fs::path &dirpath,
 															std::function<bool(const fs::directory_entry &dirent)> filter,
 															std::function<void(fs::directory_entry dirent)> fn);
+#endif
 
 /**
  * @brief Fiber accepting TCP connections and scheduling handler fibers
diff --git a/emper/io/io.cpp b/emper/io/io.cpp
index c1286774fa7e4daa0089ff3bb3ea9762ab6c0a59..e858aff6027cb961c0f67c1b4a32f56842e63fce 100644
--- a/emper/io/io.cpp
+++ b/emper/io/io.cpp
@@ -9,10 +9,12 @@
 #include <cstring>
 #include <filesystem>
 #include <ostream>
+#include <stdexcept>
 
 #include "Common.hpp"
 #include "CountingPrivateSemaphore.hpp"
 #include "Debug.hpp"
+#include "Emper.hpp"
 #include "Fiber.hpp"
 #include "Runtime.hpp"
 #include "SynchronizedFiber.hpp"
@@ -25,6 +27,10 @@ static void recursive_directory_walk_helper(
 		CPS& cps, const fs::path& dirpath,
 		std::function<bool(const fs::directory_entry& dirent)>& filter,
 		std::function<void(fs::directory_entry dirent)>& fn) {
+	if constexpr (!emper::HAS_FS_PATH) {
+		throw std::logic_error("recursive_directory_walk need c++17 std::filesystem::path");
+	}
+
 	Runtime* runtime = Runtime::getRuntime();
 	for (const auto& p : fs::directory_iterator(dirpath)) {
 		if (filter(p)) {
diff --git a/emper/io/meson.build b/emper/io/meson.build
index 63317bcad025ed7d384c20f7fc2813fbbc62fc5f..bceedac11de3e0d46515f28ebc0b350b5bf53b61 100644
--- a/emper/io/meson.build
+++ b/emper/io/meson.build
@@ -1,3 +1,21 @@
+# check if std::filesystem::recursive_directory_iterator is available
+walk_dir_code = '''#include <filesystem>
+int main() { auto it = std::filesystem::recursive_directory_iterator("."); }
+'''
+cpp_has_fs_recursive_directory_iterator = cpp_compiler.links(walk_dir_code,
+                                                                 args: '--std=c++2a',
+                                                                 name: 'walk_dir')
+
+# check if std::filesystem::path is available
+fs_path_code = '''#include <filesystem>
+int main() { std::filesystem p = "/"; }
+'''
+cpp_has_fs_path = cpp_compiler.links(walk_dir_code, args: '--std=c++2a', name: 'fs_path')
+
+if cpp_has_fs_path
+	conf_data.set('EMPER_HAS_FS_PATH', true)
+endif
+
 emper_io_include = include_directories('.')
 emper_library_include += [emper_io_include]
 emper_cpp_sources += files(
diff --git a/emper/meson.build b/emper/meson.build
index 777e7ca5a341d67cdcbb23181881b79d781bfc7e..414245a5c882067ef260027b7191c597b8e9c528 100644
--- a/emper/meson.build
+++ b/emper/meson.build
@@ -9,9 +9,6 @@ nasm_gen = generator(nasm,
 					)
 emper_asm_objects = nasm_gen.process(emper_asm_sources)
 
-emper_config_header = configure_file(output: 'emper-config.h',
-	configuration: conf_data)
-
 emper_cpp_sources = [
   'Runtime.cpp',
   'Emper.cpp',
@@ -42,6 +39,11 @@ subdir('lib')
 subdir('strategies')
 subdir('sleep_strategy')
 
+# consume the configuration object after all dubdirectories are visited
+# to allow meson code in those subdirectories to change the configuration
+emper_config_header = configure_file(output: 'emper-config.h',
+	configuration: conf_data)
+
 emper_all_include = emper_library_include + [emper_include]
 
 emper = library(