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(