From 2f7b865d7305b4cdfabaf4f218171928dd560811 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fridrich=20=C5=A0trba?= <fridrich.strba@bluewin.ch>
Date: Fri, 11 Aug 2023 12:14:45 +0200
Subject: [PATCH 1/3] Possibility to build against a host of filesystem
 implementations

---
 configure.ac                                  |  14 +-
 doc_example/Makefile.am                       |  26 +++
 doc_example/spreadsheet_doc_1.cpp             |  13 +-
 .../spreadsheet_doc_1_num_and_formula.cpp     |  13 +-
 doc_example/spreadsheet_doc_2.cpp             |  13 +-
 ...preadsheet_doc_2_sheets_no_string_pool.cpp |  13 +-
 .../spreadsheet_doc_2_sheets_with_formula.cpp |  13 +-
 ...eadsheet_doc_2_sheets_with_string_pool.cpp |  13 +-
 src/Makefile.am                               | 172 +++++++++++++++---
 src/cli_global.cpp                            |  12 +-
 src/liborcus/Makefile.am                      |  80 +++++++-
 src/liborcus/css_document_tree_test.cpp       |  15 +-
 src/liborcus/format_detection_test.cpp        |  11 +-
 src/liborcus/json_document_tree.cpp           |  12 +-
 src/liborcus/json_document_tree_test.cpp      |  13 +-
 src/liborcus/json_structure_tree_test.cpp     |  14 +-
 src/liborcus/xml_structure_tree_test.cpp      |  13 +-
 src/liborcus/yaml_document_tree_test.cpp      |  15 +-
 src/orcus_filter_global.cpp                   |  15 +-
 src/orcus_json_cli.cpp                        |  13 +-
 src/orcus_test_import_ods.cpp                 |  12 +-
 src/orcus_test_json_mapped.cpp                |  13 +-
 src/orcus_test_ods.cpp                        |  13 +-
 src/orcus_test_xlsx.cpp                       |  12 +-
 src/orcus_test_xml_mapped.cpp                 |  12 +-
 src/orcus_xml_main.cpp                        |  15 +-
 src/orcus_yaml_main.cpp                       |  13 +-
 src/parser/Makefile.am                        |  62 +++++--
 src/parser/parser_test_xml_validation.cpp     |  12 +-
 src/parser/stream.cpp                         |  13 +-
 src/parser/zip_archive_test.cpp               |  12 +-
 src/spreadsheet/Makefile.am                   |  17 +-
 src/spreadsheet/debug_state_dumper.cpp        |   2 -
 src/spreadsheet/debug_state_dumper.hpp        |  28 ++-
 src/spreadsheet/document.cpp                  |   1 -
 src/spreadsheet/document_impl.hpp             |   1 -
 src/spreadsheet/sheet.cpp                     |  12 +-
 37 files changed, 651 insertions(+), 102 deletions(-)

diff --git a/configure.ac b/configure.ac
index 772fc3b3..4484336f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -44,6 +44,16 @@ PKG_PROG_PKG_CONFIG([0.20])
 # =====================
 AC_CHECK_HEADERS([stdlib.h sys/time.h unistd.h])
 
+# ===================================
+# Check for filesystem implementation
+# ===================================
+AC_CHECK_HEADER([filesystem], [have_filesystem=yes], [have_filesystem=no], [])
+
+AC_CHECK_HEADER([experimental/filesystem], [have_experimental_filesystem=yes], [have_experimental_filesystem=no], [])
+
+AM_CONDITIONAL([HAVE_FILESYSTEM], [test "x$have_filesystem" = "xyes"])
+AM_CONDITIONAL([HAVE_EXPERIMENTAL_FILESYSTEM], [test "x$have_experimental_filesystem" = "xyes"])
+
 # =============================================================
 # Checks for typedefs, structures, and compiler characteristics
 # =============================================================
@@ -82,8 +92,10 @@ AC_SUBST(ORCUS_MINOR_VERSION)
 AC_SUBST(ORCUS_MICRO_VERSION)
 
 BOOST_REQUIRE([1.36])
-BOOST_FILESYSTEM
 BOOST_SYSTEM
+AS_IF([test "x$have_filesystem" != "xyes" -a "x$have_experimental_filesystem" != "xyes"], [
+    BOOST_FILESYSTEM
+])
 
 # =========================================================
 # Determine if we are going to build static lib (for MinGW)
diff --git a/doc_example/Makefile.am b/doc_example/Makefile.am
index 0f097b27..94312442 100644
--- a/doc_example/Makefile.am
+++ b/doc_example/Makefile.am
@@ -4,6 +4,14 @@ AM_CPPFLAGS = \
 	$(LIBIXION_CFLAGS) \
 	-DSRCDIR=\""$(top_srcdir)"\"
 
+if HAVE_FILESYSTEM
+AM_CPPFLAGS += -DHAVE_FILESYSTEM=1
+endif
+
+if HAVE_EXPERIMENTAL_FILESYSTEM
+AM_CPPFLAGS += -DHAVE_EXPERIMENTAL_FILESYSTEM=1
+endif
+
 bin_PROGRAMS =
 
 EXTRA_PROGRAMS = \
@@ -91,6 +99,24 @@ spreadsheet_doc_2_sheets_with_formula_LDADD = \
 	../src/parser/liborcus-parser-@ORCUS_API_VERSION@.la \
 	../src/liborcus/liborcus-@ORCUS_API_VERSION@.la
 
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+spreadsheet_doc_1_LDADD += -lstdc++fs
+spreadsheet_doc_1_num_and_formula_LDADD += -lstdc++fs
+spreadsheet_doc_2_LDADD += -lstdc++fs
+spreadsheet_doc_2_sheets_no_string_pool_LDADD += -lstdc++fs
+spreadsheet_doc_2_sheets_with_string_pool_LDADD += -lstdc++fs
+spreadsheet_doc_2_sheets_with_formula_LDADD += -lstdc++fs
+else
+spreadsheet_doc_1_LDADD += $(BOOST_FILESYSTEM_LIBS) $(BOOST_SYSTEM_LIBS)
+spreadsheet_doc_1_num_and_formula_LDADD += $(BOOST_FILESYSTEM_LIBS) $(BOOST_SYSTEM_LIBS)
+spreadsheet_doc_2_LDADD += $(BOOST_FILESYSTEM_LIBS) $(BOOST_SYSTEM_LIBS)
+spreadsheet_doc_2_sheets_no_string_pool_LDADD += $(BOOST_FILESYSTEM_LIBS) $(BOOST_SYSTEM_LIBS)
+spreadsheet_doc_2_sheets_with_string_pool_LDADD += $(BOOST_FILESYSTEM_LIBS) $(BOOST_SYSTEM_LIBS)
+spreadsheet_doc_2_sheets_with_formula_LDADD += $(BOOST_FILESYSTEM_LIBS) $(BOOST_SYSTEM_LIBS)
+endif
+endif
+
 AM_TESTS_ENVIRONMENT = \
 	INPUTDIR=$(srcdir)/files; export INPUTDIR;
 
diff --git a/doc_example/spreadsheet_doc_1.cpp b/doc_example/spreadsheet_doc_1.cpp
index 00bbba43..293076cd 100644
--- a/doc_example/spreadsheet_doc_1.cpp
+++ b/doc_example/spreadsheet_doc_1.cpp
@@ -8,13 +8,24 @@
 
 #include <iostream>
 #include <cstdlib>
+#ifdef HAVE_FILESYSTEM
 #include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
+#include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
 
 using namespace orcus;
 
 int main()
 {
-    std::filesystem::path input_dir = std::getenv("INPUTDIR");
+    fs::path input_dir = std::getenv("INPUTDIR");
 
     //!code-start: instantiate
     spreadsheet::range_size_t ss{1048576, 16384};
diff --git a/doc_example/spreadsheet_doc_1_num_and_formula.cpp b/doc_example/spreadsheet_doc_1_num_and_formula.cpp
index 88c405c7..fddfc268 100644
--- a/doc_example/spreadsheet_doc_1_num_and_formula.cpp
+++ b/doc_example/spreadsheet_doc_1_num_and_formula.cpp
@@ -9,13 +9,24 @@
 #include <ixion/cell.hpp>
 
 #include <iostream>
+#ifdef HAVE_FILESYSTEM
 #include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
+#include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
 
 using namespace orcus;
 
 int main()
 {
-    std::filesystem::path input_dir = std::getenv("INPUTDIR");
+    fs::path input_dir = std::getenv("INPUTDIR");
 
     // Instantiate a document, and wrap it with a factory.
     spreadsheet::range_size_t ss{1048576, 16384};
diff --git a/doc_example/spreadsheet_doc_2.cpp b/doc_example/spreadsheet_doc_2.cpp
index 614b50b8..47e376f4 100644
--- a/doc_example/spreadsheet_doc_2.cpp
+++ b/doc_example/spreadsheet_doc_2.cpp
@@ -2,7 +2,18 @@
 #include <orcus/spreadsheet/import_interface.hpp>
 #include <orcus/orcus_ods.hpp>
 
+#ifdef HAVE_FILESYSTEM
 #include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
+#include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
 #include <iostream>
 
 namespace ss = orcus::spreadsheet;
@@ -33,7 +44,7 @@ public:
 
 int main()
 {
-    std::filesystem::path input_dir = std::getenv("INPUTDIR");
+    fs::path input_dir = std::getenv("INPUTDIR");
     auto filepath = input_dir / "multi-sheets.ods";
 
     my_empty_import_factory factory;
diff --git a/doc_example/spreadsheet_doc_2_sheets_no_string_pool.cpp b/doc_example/spreadsheet_doc_2_sheets_no_string_pool.cpp
index ea58d5e1..ee862fdd 100644
--- a/doc_example/spreadsheet_doc_2_sheets_no_string_pool.cpp
+++ b/doc_example/spreadsheet_doc_2_sheets_no_string_pool.cpp
@@ -4,7 +4,18 @@
 
 #include <iostream>
 #include <memory>
+#ifdef HAVE_FILESYSTEM
 #include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
+#include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
 
 //!code-start: cell_value
 namespace ss = orcus::spreadsheet;
@@ -112,7 +123,7 @@ public:
 
 int main()
 {
-    std::filesystem::path input_dir = std::getenv("INPUTDIR");
+    fs::path input_dir = std::getenv("INPUTDIR");
     auto filepath = input_dir / "multi-sheets.ods";
 
     my_import_factory factory;
diff --git a/doc_example/spreadsheet_doc_2_sheets_with_formula.cpp b/doc_example/spreadsheet_doc_2_sheets_with_formula.cpp
index 29511e47..01093353 100644
--- a/doc_example/spreadsheet_doc_2_sheets_with_formula.cpp
+++ b/doc_example/spreadsheet_doc_2_sheets_with_formula.cpp
@@ -6,7 +6,18 @@
 #include <memory>
 #include <unordered_map>
 #include <deque>
+#ifdef HAVE_FILESYSTEM
 #include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
+#include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
 
 namespace ss = orcus::spreadsheet;
 
@@ -279,7 +290,7 @@ public:
 
 int main()
 {
-    std::filesystem::path input_dir = std::getenv("INPUTDIR");
+    fs::path input_dir = std::getenv("INPUTDIR");
     auto filepath = input_dir / "multi-sheets.ods";
 
     my_import_factory factory;
diff --git a/doc_example/spreadsheet_doc_2_sheets_with_string_pool.cpp b/doc_example/spreadsheet_doc_2_sheets_with_string_pool.cpp
index 76fcf807..19929f88 100644
--- a/doc_example/spreadsheet_doc_2_sheets_with_string_pool.cpp
+++ b/doc_example/spreadsheet_doc_2_sheets_with_string_pool.cpp
@@ -6,7 +6,18 @@
 #include <memory>
 #include <unordered_map>
 #include <deque>
+#ifdef HAVE_FILESYSTEM
 #include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
+#include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
 
 namespace ss = orcus::spreadsheet;
 
@@ -193,7 +204,7 @@ public:
 
 int main()
 {
-    std::filesystem::path input_dir = std::getenv("INPUTDIR");
+    fs::path input_dir = std::getenv("INPUTDIR");
     auto filepath = input_dir / "multi-sheets.ods";
 
     my_import_factory factory;
diff --git a/src/Makefile.am b/src/Makefile.am
index 1006194f..8839ab42 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -16,6 +16,14 @@ EXTRA_PROGRAMS = \
 
 AM_CPPFLAGS += $(BOOST_CPPFLAGS) $(LIBIXION_CFLAGS)
 
+if HAVE_FILESYSTEM
+AM_CPPFLAGS += "-DHAVE_FILESYSTEM=1"
+endif
+
+if HAVE_EXPERIMENTAL_FILESYSTEM
+AM_CPPFLAGS += "-DHAVE_EXPERIMENTAL_FILESYSTEM=1"
+endif
+
 if HAVE_STATIC_LIB
 AM_CPPFLAGS += -D__ORCUS_STATIC_LIB=1
 endif
@@ -83,16 +91,23 @@ orcus_json_SOURCES = \
 
 orcus_json_LDFLAGS = \
 	$(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
-	$(BOOST_FILESYSTEM_LDFLAGS) \
 	$(BOOST_SYSTEM_LDFLAGS)
 
 orcus_json_LDADD = \
 	parser/liborcus-parser-@ORCUS_API_VERSION@.la \
 	liborcus/liborcus-@ORCUS_API_VERSION@.la \
 	$(BOOST_PROGRAM_OPTIONS_LIBS) \
-	$(BOOST_FILESYSTEM_LIBS) \
 	$(BOOST_SYSTEM_LIBS)
 
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_json_LDADD += -lstdc++fs
+else
+orcus_json_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_json_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
 orcus_json_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
 
 # orcus-yaml
@@ -102,16 +117,23 @@ orcus_yaml_SOURCES = \
 
 orcus_yaml_LDFLAGS = \
 	$(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
-	$(BOOST_FILESYSTEM_LDFLAGS) \
 	$(BOOST_SYSTEM_LDFLAGS)
 
 orcus_yaml_LDADD = \
 	parser/liborcus-parser-@ORCUS_API_VERSION@.la \
 	liborcus/liborcus-@ORCUS_API_VERSION@.la \
 	$(BOOST_PROGRAM_OPTIONS_LIBS) \
-	$(BOOST_FILESYSTEM_LIBS) \
 	$(BOOST_SYSTEM_LIBS)
 
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_yaml_LDADD += -lstdc++fs
+else
+orcus_yaml_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_yaml_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
 orcus_yaml_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
 
 #----------------------------------------------------------------------------
@@ -134,15 +156,22 @@ orcus_mso_encryption_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_
 orcus_detect_SOURCES = orcus_detect_main.cpp
 orcus_detect_LDFLAGS = \
 	$(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
-	$(BOOST_FILESYSTEM_LDFLAGS) \
 	$(BOOST_SYSTEM_LDFLAGS)
 orcus_detect_LDADD = \
 	parser/liborcus-parser-@ORCUS_API_VERSION@.la \
 	liborcus/liborcus-@ORCUS_API_VERSION@.la \
 	$(BOOST_PROGRAM_OPTIONS_LIBS) \
-	$(BOOST_FILESYSTEM_LIBS) \
 	$(BOOST_SYSTEM_LIBS)
 
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_detect_LDADD += -lstdc++fs
+else
+orcus_detect_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_detect_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
 orcus_detect_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
 
 #----------------------------------------------------------------------------
@@ -164,16 +193,23 @@ orcus_csv_SOURCES = \
 
 orcus_csv_LDFLAGS = \
 	$(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
-	$(BOOST_FILESYSTEM_LDFLAGS) \
 	$(BOOST_SYSTEM_LDFLAGS)
 orcus_csv_LDADD = \
 	liborcus/liborcus-@ORCUS_API_VERSION@.la \
 	parser/liborcus-parser-@ORCUS_API_VERSION@.la \
 	spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
 	$(BOOST_PROGRAM_OPTIONS_LIBS) \
-	$(BOOST_FILESYSTEM_LIBS) \
 	$(BOOST_SYSTEM_LIBS)
 
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_csv_LDADD += -lstdc++fs
+else
+orcus_csv_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_csv_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
 orcus_csv_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
 
 # orcus-xml
@@ -186,16 +222,23 @@ orcus_xml_SOURCES = \
 
 orcus_xml_LDFLAGS = \
 	$(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
-	$(BOOST_FILESYSTEM_LDFLAGS) \
 	$(BOOST_SYSTEM_LDFLAGS)
 orcus_xml_LDADD = \
 	liborcus/liborcus-@ORCUS_API_VERSION@.la \
 	parser/liborcus-parser-@ORCUS_API_VERSION@.la \
 	spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
 	$(BOOST_PROGRAM_OPTIONS_LIBS) \
-	$(BOOST_FILESYSTEM_LIBS) \
 	$(BOOST_SYSTEM_LIBS)
 
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_xml_LDADD += -lstdc++fs
+else
+orcus_xml_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_xml_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
 orcus_xml_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
 
 if WITH_ODS_FILTER
@@ -213,16 +256,22 @@ orcus_ods_SOURCES = \
 
 orcus_ods_LDFLAGS = \
 	$(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
-	$(BOOST_FILESYSTEM_LDFLAGS) \
 	$(BOOST_SYSTEM_LDFLAGS)
 orcus_ods_LDADD = \
 	liborcus/liborcus-@ORCUS_API_VERSION@.la \
 	parser/liborcus-parser-@ORCUS_API_VERSION@.la \
 	spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
 	$(BOOST_PROGRAM_OPTIONS_LIBS) \
-	$(BOOST_FILESYSTEM_LIBS) \
 	$(BOOST_SYSTEM_LIBS)
 
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_ods_LDADD += -lstdc++fs
+else
+orcus_ods_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_ods_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
 
 orcus_ods_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
 
@@ -235,7 +284,6 @@ orcus_styles_ods_SOURCES = \
 
 orcus_styles_ods_LDFLAGS = \
 	$(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
-	$(BOOST_FILESYSTEM_LDFLAGS) \
 	$(BOOST_SYSTEM_LDFLAGS)
 
 orcus_styles_ods_LDADD = \
@@ -243,9 +291,17 @@ orcus_styles_ods_LDADD = \
 	parser/liborcus-parser-@ORCUS_API_VERSION@.la \
 	spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
 	$(BOOST_PROGRAM_OPTIONS_LIBS) \
-	$(BOOST_FILESYSTEM_LIBS) \
 	$(BOOST_SYSTEM_LIBS)
 
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_styles_ods_LDADD += -lstdc++fs
+else
+orcus_styles_ods_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_styles_ods_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
 orcus_styles_ods_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
 
 endif # WITH_ODS_FILTER
@@ -264,16 +320,23 @@ orcus_xlsx_SOURCES = \
 
 orcus_xlsx_LDFLAGS = \
 	$(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
-	$(BOOST_FILESYSTEM_LDFLAGS) \
 	$(BOOST_SYSTEM_LDFLAGS)
 orcus_xlsx_LDADD = \
 	liborcus/liborcus-@ORCUS_API_VERSION@.la \
 	parser/liborcus-parser-@ORCUS_API_VERSION@.la \
 	spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
 	$(BOOST_PROGRAM_OPTIONS_LIBS) \
-	$(BOOST_FILESYSTEM_LIBS) \
 	$(BOOST_SYSTEM_LIBS)
 
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_xlsx_LDADD += -lstdc++fs
+else
+orcus_xlsx_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_xlsx_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
 orcus_xlsx_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
 
 endif # WITH_XLSX_FILTER
@@ -292,16 +355,23 @@ orcus_xls_xml_SOURCES = \
 
 orcus_xls_xml_LDFLAGS = \
 	$(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
-	$(BOOST_FILESYSTEM_LDFLAGS) \
 	$(BOOST_SYSTEM_LDFLAGS)
 orcus_xls_xml_LDADD = \
 	liborcus/liborcus-@ORCUS_API_VERSION@.la \
 	parser/liborcus-parser-@ORCUS_API_VERSION@.la \
 	spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
 	$(BOOST_PROGRAM_OPTIONS_LIBS) \
-	$(BOOST_FILESYSTEM_LIBS) \
 	$(BOOST_SYSTEM_LIBS)
 
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_xls_xml_LDADD += -lstdc++fs
+else
+orcus_xls_xml_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_xls_xml_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
 orcus_xls_xml_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
 
 endif # WITH_XLS_XML_FILTER
@@ -320,16 +390,23 @@ orcus_gnumeric_SOURCES = \
 
 orcus_gnumeric_LDFLAGS = \
 	$(BOOST_PROGRAM_OPTIONS_LDFLAGS) \
-	$(BOOST_FILESYSTEM_LDFLAGS) \
 	$(BOOST_SYSTEM_LDFLAGS)
 orcus_gnumeric_LDADD = \
 	liborcus/liborcus-@ORCUS_API_VERSION@.la \
 	parser/liborcus-parser-@ORCUS_API_VERSION@.la \
 	spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
 	$(BOOST_PROGRAM_OPTIONS_LIBS) \
-	$(BOOST_FILESYSTEM_LIBS) \
 	$(BOOST_SYSTEM_LIBS)
 
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_gnumeric_LDADD += -lstdc++fs
+else
+orcus_gnumeric_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_gnumeric_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
 orcus_gnumeric_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
 
 endif # WITH_GNUMERIC_FILTER
@@ -372,7 +449,6 @@ orcus_test_xml_mapped_SOURCES = \
 	orcus_test_global.cpp
 
 orcus_test_xml_mapped_LDFLAGS = \
-	$(BOOST_FILESYSTEM_LDFLAGS) \
 	$(BOOST_SYSTEM_LDFLAGS)
 
 orcus_test_xml_mapped_LDADD = \
@@ -380,9 +456,17 @@ orcus_test_xml_mapped_LDADD = \
 	parser/liborcus-parser-@ORCUS_API_VERSION@.la \
 	./test/liborcus-test.a \
 	spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
-	$(BOOST_FILESYSTEM_LIBS) \
 	$(BOOST_SYSTEM_LIBS)
 
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_test_xml_mapped_LDADD += -lstdc++fs
+else
+orcus_test_xml_mapped_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_test_xml_mapped_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
 orcus_test_xml_mapped_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS) -DSRCDIR=\""$(top_srcdir)"\"
 
 # orcus-test-json-mapped
@@ -391,16 +475,23 @@ orcus_test_json_mapped_SOURCES = \
 	orcus_test_json_mapped.cpp
 
 orcus_test_json_mapped_LDFLAGS = \
-	$(BOOST_FILESYSTEM_LDFLAGS) \
 	$(BOOST_SYSTEM_LDFLAGS)
 
 orcus_test_json_mapped_LDADD = \
 	liborcus/liborcus-@ORCUS_API_VERSION@.la \
 	parser/liborcus-parser-@ORCUS_API_VERSION@.la \
 	spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
-	$(BOOST_FILESYSTEM_LIBS) \
 	$(BOOST_SYSTEM_LIBS)
 
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_test_json_mapped_LDADD += -lstdc++fs
+else
+orcus_test_json_mapped_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_test_json_mapped_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
 orcus_test_json_mapped_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS) -DSRCDIR=\""$(top_srcdir)"\"
 
 TESTS += \
@@ -422,13 +513,20 @@ orcus_test_ods_LDADD = \
 	liborcus/liborcus-@ORCUS_API_VERSION@.la \
 	parser/liborcus-parser-@ORCUS_API_VERSION@.la \
 	spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
-	$(BOOST_FILESYSTEM_LIBS) \
 	$(BOOST_SYSTEM_LIBS)
 
 orcus_test_ods_LDFLAGS = \
-	$(BOOST_FILESYSTEM_LDFLAGS) \
 	$(BOOST_SYSTEM_LDFLAGS)
 
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_test_ods_LDADD += -lstdc++fs
+else
+orcus_test_ods_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_test_ods_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
 orcus_test_ods_CPPFLAGS = $(AM_CPPFLAGS) \
 	-I$(top_builddir)/lib/liborcus/liborcus.la -DSRCDIR=\""$(top_srcdir)"\"
 
@@ -447,13 +545,20 @@ orcus_test_import_ods_LDADD = \
 	parser/liborcus-parser-@ORCUS_API_VERSION@.la \
 	spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
 	./test/liborcus-test.a \
-	$(BOOST_FILESYSTEM_LIBS) \
 	$(BOOST_SYSTEM_LIBS)
 
 orcus_test_import_ods_LDFLAGS = \
-	$(BOOST_FILESYSTEM_LDFLAGS) \
 	$(BOOST_SYSTEM_LDFLAGS)
 
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_test_import_ods_LDADD += -lstdc++fs
+else
+orcus_test_import_ods_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_test_import_ods_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
 orcus_test_import_ods_CPPFLAGS = $(AM_CPPFLAGS) \
 	-I$(top_builddir)/lib/liborcus/liborcus.la -DSRCDIR=\""$(top_srcdir)"\"
 
@@ -473,7 +578,6 @@ orcus_test_xlsx_SOURCES = \
 	orcus_test_xlsx.cpp
 
 orcus_test_xlsx_LDFLAGS = \
-	$(BOOST_FILESYSTEM_LDFLAGS) \
 	$(BOOST_SYSTEM_LDFLAGS)
 
 orcus_test_xlsx_LDADD = \
@@ -482,9 +586,17 @@ orcus_test_xlsx_LDADD = \
 	test/liborcus-test.a \
 	spreadsheet/liborcus-spreadsheet-model-@ORCUS_API_VERSION@.la \
 	@LIBIXION_LIBS@ \
-	$(BOOST_FILESYSTEM_LIBS) \
 	$(BOOST_SYSTEM_LIBS)
 
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+orcus_test_xlsx_LDADD += -lstdc++fs
+else
+orcus_test_xlsx_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+orcus_test_xlsx_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
 orcus_test_xlsx_CPPFLAGS = \
 	@LIBIXION_CFLAGS@  $(AM_CPPFLAGS) \
 	-I$(top_builddir)/lib/liborcus/liborcus.la -DSRCDIR=\""$(top_srcdir)"\"
diff --git a/src/cli_global.cpp b/src/cli_global.cpp
index aa3455de..876d7519 100644
--- a/src/cli_global.cpp
+++ b/src/cli_global.cpp
@@ -10,10 +10,20 @@
 #include <iostream>
 #include <fstream>
 
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
 #include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
 
 namespace po = boost::program_options;
-namespace fs = boost::filesystem;
 
 namespace orcus {
 
diff --git a/src/liborcus/Makefile.am b/src/liborcus/Makefile.am
index 6ff24676..32842e9a 100644
--- a/src/liborcus/Makefile.am
+++ b/src/liborcus/Makefile.am
@@ -28,15 +28,32 @@ else
 AM_CPPFLAGS += -D__ORCUS_BUILDING_DLL=1
 endif
 
+if HAVE_FILESYSTEM
+AM_CPPFLAGS += "-DHAVE_FILESYSTEM=1"
+endif
+
+if HAVE_EXPERIMENTAL_FILESYSTEM
+AM_CPPFLAGS += "-DHAVE_EXPERIMENTAL_FILESYSTEM=1"
+endif
+
 liborcus_@ORCUS_API_VERSION@_la_CXXFLAGS = \
 	$(ZLIB_CFLAGS)
 
 liborcus_@ORCUS_API_VERSION@_la_LDFLAGS = \
-	-no-undefined $(BOOST_SYSTEM_LDFLAGS) $(BOOST_FILESYSTEM_LDFLAGS)
+	-no-undefined $(BOOST_SYSTEM_LDFLAGS)
 
 liborcus_@ORCUS_API_VERSION@_la_LIBADD = \
 	../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
-	 $(BOOST_SYSTEM_LIBS) $(ZLIB_LIBS) $(BOOST_FILESYSTEM_LIBS)
+	 $(BOOST_SYSTEM_LIBS) $(ZLIB_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+liborcus_@ORCUS_API_VERSION@_la_LDFLAGS += -lstdc++fs
+else
+liborcus_@ORCUS_API_VERSION@_la_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+liborcus_@ORCUS_API_VERSION@_la_LIBADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
 
 AM_CPPFLAGS += -DSRCDIR=\""$(top_srcdir)"\"
 
@@ -389,7 +406,15 @@ css_document_tree_test_SOURCES = \
 css_document_tree_test_LDADD = \
 	liborcus-@ORCUS_API_VERSION@.la \
 	../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
-	$(BOOST_FILESYSTEM_LIBS) $(BOOST_SYSTEM_LIBS)
+	$(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+css_document_tree_test_LDADD += -lstdc++fs
+else
+css_document_tree_test_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
 
 # json-document-tree-test
 
@@ -402,7 +427,15 @@ json_document_tree_test_LDADD = \
 	liborcus-@ORCUS_API_VERSION@.la \
 	../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
 	../test/liborcus-test.a \
-	$(BOOST_FILESYSTEM_LIBS) $(BOOST_SYSTEM_LIBS)
+	$(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+json_document_tree_test_LDADD += -lstdc++fs
+else
+json_document_tree_test_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
 
 json_document_tree_test_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
 
@@ -416,7 +449,15 @@ yaml_document_tree_test_SOURCES = \
 yaml_document_tree_test_LDADD = \
 	liborcus-@ORCUS_API_VERSION@.la \
 	../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
-	$(BOOST_FILESYSTEM_LIBS) $(BOOST_SYSTEM_LIBS)
+	$(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+yaml_document_tree_test_LDADD += -lstdc++fs
+else
+yaml_document_tree_test_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
 
 yaml_document_tree_test_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(AM_CPPFLAGS)
 
@@ -434,7 +475,8 @@ xml_map_tree_test_SOURCES = \
 xml_map_tree_test_LDADD = \
 	liborcus-@ORCUS_API_VERSION@.la \
 	../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
-	../test/liborcus-test.a
+	../test/liborcus-test.a \
+    $(BOOST_SYSTEM_LIBS)
 
 # xml-structure-tree-test
 
@@ -449,7 +491,15 @@ xml_structure_tree_test_CPPFLAGS = -I$(top_builddir)/lib/liborcus/liborcus.la $(
 xml_structure_tree_test_LDADD = \
 	liborcus-@ORCUS_API_VERSION@.la \
 	../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
-	$(BOOST_FILESYSTEM_LIBS) $(BOOST_SYSTEM_LIBS)
+	$(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+xml_structure_tree_test_LDADD += -lstdc++fs
+else
+xml_structure_tree_test_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
 
 # common-test
 
@@ -483,7 +533,15 @@ json_structure_tree_test_SOURCES = json_structure_tree_test.cpp
 json_structure_tree_test_LDADD = \
 	liborcus-@ORCUS_API_VERSION@.la \
 	../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
-	$(BOOST_SYSTEM_LIBS) $(BOOST_FILESYSTEM_LIBS)
+	$(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+json_structure_tree_test_LDADD += -lstdc++fs
+else
+json_structure_tree_test_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
 
 # json-map-tree-test
 
@@ -492,7 +550,8 @@ json_map_tree_test_SOURCES = json_map_tree_test.cpp \
 	spreadsheet_impl_types.cpp
 json_map_tree_test_LDADD = \
 	liborcus-@ORCUS_API_VERSION@.la \
-	../parser/liborcus-parser-@ORCUS_API_VERSION@.la
+	../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+	$(BOOST_SYSTEM_LIBS)
 
 # xpath-parser-test
 
@@ -501,7 +560,8 @@ xpath_parser_test_SOURCES = \
 	xpath_parser.cpp
 xpath_parser_test_LDADD = \
 	liborcus-@ORCUS_API_VERSION@.la \
-	../parser/liborcus-parser-@ORCUS_API_VERSION@.la
+	../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
+	$(BOOST_SYSTEM_LIBS)
 
 TESTS += \
 	css-document-tree-test \
diff --git a/src/liborcus/css_document_tree_test.cpp b/src/liborcus/css_document_tree_test.cpp
index 09b98d2f..bb367a33 100644
--- a/src/liborcus/css_document_tree_test.cpp
+++ b/src/liborcus/css_document_tree_test.cpp
@@ -16,12 +16,21 @@
 #include <sstream>
 #include <iterator>
 
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
 #include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
 
 using namespace orcus;
 
-namespace fs = boost::filesystem;
-
 bool check_prop(const css_properties_t& props, std::string_view key, std::string_view val)
 {
     css_properties_t::const_iterator it = props.find(key);
@@ -93,7 +102,7 @@ void test_css_invalids()
         if (!fs::is_regular_file(path))
             continue;
 
-        if (fs::extension(path) != ".css")
+        if (path.extension().string() != ".css")
             continue;
 
         std::cout << "parsing invalid file " << path.filename().string() << "..." << std::endl;
diff --git a/src/liborcus/format_detection_test.cpp b/src/liborcus/format_detection_test.cpp
index 74b4e51e..c62ec8a2 100644
--- a/src/liborcus/format_detection_test.cpp
+++ b/src/liborcus/format_detection_test.cpp
@@ -12,9 +12,18 @@
 #include <iostream>
 #include <string>
 
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
 #include <boost/filesystem.hpp>
-
 namespace fs = boost::filesystem;
+#endif
+#endif
 
 fs::path base_test_dir = fs::path{SRCDIR} / "test";
 
diff --git a/src/liborcus/json_document_tree.cpp b/src/liborcus/json_document_tree.cpp
index 071198b5..680b2bc2 100644
--- a/src/liborcus/json_document_tree.cpp
+++ b/src/liborcus/json_document_tree.cpp
@@ -23,10 +23,20 @@
 #include <deque>
 
 #include <boost/current_function.hpp>
-#include <boost/filesystem.hpp>
 #include <boost/pool/object_pool.hpp>
 
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
+#include <boost/filesystem.hpp>
 namespace fs = boost::filesystem;
+#endif
+#endif
 
 namespace orcus { namespace json {
 
diff --git a/src/liborcus/json_document_tree_test.cpp b/src/liborcus/json_document_tree_test.cpp
index 018702c0..98632209 100644
--- a/src/liborcus/json_document_tree_test.cpp
+++ b/src/liborcus/json_document_tree_test.cpp
@@ -14,7 +14,18 @@
 #include <orcus/xml_namespace.hpp>
 #include <orcus/dom_tree.hpp>
 
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
 #include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
 
 #include <cassert>
 #include <cstdlib>
@@ -22,8 +33,6 @@
 #include <cmath>
 #include <cstring>
 
-namespace fs = boost::filesystem;
-
 using namespace orcus;
 
 fs::path json_test_dirs[] = {
diff --git a/src/liborcus/json_structure_tree_test.cpp b/src/liborcus/json_structure_tree_test.cpp
index d41f8467..d71bb214 100644
--- a/src/liborcus/json_structure_tree_test.cpp
+++ b/src/liborcus/json_structure_tree_test.cpp
@@ -14,10 +14,20 @@
 #include <cassert>
 #include <unordered_set>
 
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
 #include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
 
 using namespace orcus;
-namespace fs = boost::filesystem;
 
 std::vector<const char*> base_dirs = {
     SRCDIR"/test/json-structure/arrays-in-object/",
@@ -44,7 +54,7 @@ void test_no_value_nodes()
         if (!fs::is_regular_file(p))
             continue;
 
-        if (fs::extension(p) != ".json")
+        if (p.extension().string() != ".json")
             continue;
 
         file_content strm(p.string().data());
diff --git a/src/liborcus/xml_structure_tree_test.cpp b/src/liborcus/xml_structure_tree_test.cpp
index 3942d85d..596c7e44 100644
--- a/src/liborcus/xml_structure_tree_test.cpp
+++ b/src/liborcus/xml_structure_tree_test.cpp
@@ -15,11 +15,22 @@
 #include <iostream>
 #include <sstream>
 #include <vector>
+
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
 #include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
 
 using namespace std;
 using namespace orcus;
-namespace fs = boost::filesystem;
 
 const fs::path test_base_dir(SRCDIR"/test/xml-structure");
 
diff --git a/src/liborcus/yaml_document_tree_test.cpp b/src/liborcus/yaml_document_tree_test.cpp
index 7a732ac5..8f9895cc 100644
--- a/src/liborcus/yaml_document_tree_test.cpp
+++ b/src/liborcus/yaml_document_tree_test.cpp
@@ -14,13 +14,22 @@
 #include <iostream>
 #include <cmath>
 
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
 #include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
 
 using namespace orcus;
 using namespace std;
 
-namespace fs = boost::filesystem;
-
 bool string_expected(const yaml::const_node& node, const char* expected)
 {
     if (node.type() != yaml::node_t::string)
@@ -83,7 +92,7 @@ void test_yaml_invalids()
         if (!fs::is_regular_file(path))
             continue;
 
-        if (fs::extension(path) != ".yaml")
+        if (path.extension().string() != ".yaml")
             continue;
 
         ++file_count;
diff --git a/src/orcus_filter_global.cpp b/src/orcus_filter_global.cpp
index fa6ce44f..6c3c7479 100644
--- a/src/orcus_filter_global.cpp
+++ b/src/orcus_filter_global.cpp
@@ -11,16 +11,27 @@
 #include "orcus/spreadsheet/factory.hpp"
 
 #include <mdds/sorted_string_map.hpp>
-#include <boost/filesystem.hpp>
 #include <vector>
 #include <iostream>
 #include <fstream>
 
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
+#include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
+
 using namespace std;
 using namespace orcus;
 
 namespace po = boost::program_options;
-namespace fs = boost::filesystem;
 
 namespace orcus {
 
diff --git a/src/orcus_json_cli.cpp b/src/orcus_json_cli.cpp
index 5818612c..c0fd7bd0 100644
--- a/src/orcus_json_cli.cpp
+++ b/src/orcus_json_cli.cpp
@@ -22,12 +22,23 @@
 
 #include <mdds/sorted_string_map.hpp>
 #include <boost/program_options.hpp>
+
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
 #include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
 
 using namespace std;
 using namespace orcus;
 namespace po = boost::program_options;
-namespace fs = boost::filesystem;
 
 namespace orcus { namespace detail {
 
diff --git a/src/orcus_test_import_ods.cpp b/src/orcus_test_import_ods.cpp
index a6308adb..09be6306 100644
--- a/src/orcus_test_import_ods.cpp
+++ b/src/orcus_test_import_ods.cpp
@@ -19,9 +19,19 @@
 #include <iostream>
 #include <sstream>
 
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
 #include <boost/filesystem.hpp>
-
 namespace fs = boost::filesystem;
+#endif
+#endif
+
 namespace ss = orcus::spreadsheet;
 
 using orcus::test::stack_printer;
diff --git a/src/orcus_test_json_mapped.cpp b/src/orcus_test_json_mapped.cpp
index bdd665c0..65d3abe3 100644
--- a/src/orcus_test_json_mapped.cpp
+++ b/src/orcus_test_json_mapped.cpp
@@ -16,11 +16,22 @@
 #include <vector>
 #include <cassert>
 #include <sstream>
+
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
 #include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
 
 using namespace std;
 using namespace orcus;
-namespace fs = boost::filesystem;
 
 namespace {
 
diff --git a/src/orcus_test_ods.cpp b/src/orcus_test_ods.cpp
index c170534b..f8d38a24 100644
--- a/src/orcus_test_ods.cpp
+++ b/src/orcus_test_ods.cpp
@@ -22,7 +22,19 @@
 #include <sstream>
 #include <vector>
 
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
 #include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
+
 #include <mdds/flat_segment_tree.hpp>
 
 using namespace orcus;
@@ -30,7 +42,6 @@ using namespace orcus::spreadsheet;
 
 namespace ss = orcus::spreadsheet;
 
-namespace fs = boost::filesystem;
 
 typedef mdds::flat_segment_tree<std::size_t, bool> bool_segment_type;
 
diff --git a/src/orcus_test_xlsx.cpp b/src/orcus_test_xlsx.cpp
index 4c55f46f..013edfff 100644
--- a/src/orcus_test_xlsx.cpp
+++ b/src/orcus_test_xlsx.cpp
@@ -31,11 +31,21 @@
 #include <ixion/address.hpp>
 #include <ixion/formula_name_resolver.hpp>
 
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
 #include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
 
 using namespace orcus;
 namespace ss = orcus::spreadsheet;
-namespace fs = boost::filesystem;
 
 namespace {
 
diff --git a/src/orcus_test_xml_mapped.cpp b/src/orcus_test_xml_mapped.cpp
index 005241b3..34f6bbe2 100644
--- a/src/orcus_test_xml_mapped.cpp
+++ b/src/orcus_test_xml_mapped.cpp
@@ -24,10 +24,20 @@
 #include <fstream>
 #include <vector>
 
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
 #include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
 
 using namespace orcus;
-namespace fs = boost::filesystem;
 
 const fs::path test_base_dir(SRCDIR"/test/xml-mapped");
 
diff --git a/src/orcus_xml_main.cpp b/src/orcus_xml_main.cpp
index 617dc658..a0feea12 100644
--- a/src/orcus_xml_main.cpp
+++ b/src/orcus_xml_main.cpp
@@ -22,13 +22,24 @@
 #include <iostream>
 #include <fstream>
 #include <boost/program_options.hpp>
-#include <boost/filesystem.hpp>
 #include <mdds/sorted_string_map.hpp>
 
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
+#include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
+
 using namespace orcus;
 using namespace std;
 namespace po = boost::program_options;
-namespace fs = boost::filesystem;
 
 namespace {
 
diff --git a/src/orcus_yaml_main.cpp b/src/orcus_yaml_main.cpp
index 09dc48bc..2ae75c92 100644
--- a/src/orcus_yaml_main.cpp
+++ b/src/orcus_yaml_main.cpp
@@ -15,13 +15,24 @@
 #include <string>
 
 #include <boost/program_options.hpp>
+
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
 #include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
 
 using namespace std;
 using namespace orcus;
 
 namespace po = boost::program_options;
-namespace fs = boost::filesystem;
 
 const char* help_program = "The FILE must specify a path to an existing file.";
 const char* err_no_input_file = "No input file.";
diff --git a/src/parser/Makefile.am b/src/parser/Makefile.am
index c99d316c..5039dc53 100644
--- a/src/parser/Makefile.am
+++ b/src/parser/Makefile.am
@@ -6,6 +6,14 @@ AM_CPPFLAGS = \
 	$(BOOST_CPPFLAGS) \
 	-D__ORCUS_PSR_BUILDING_DLL
 
+if HAVE_FILESYSTEM
+AM_CPPFLAGS += "-DHAVE_FILESYSTEM=1"
+endif
+
+if HAVE_EXPERIMENTAL_FILESYSTEM
+AM_CPPFLAGS += "-DHAVE_EXPERIMENTAL_FILESYSTEM=1"
+endif
+
 lib_LTLIBRARIES = liborcus-parser-@ORCUS_API_VERSION@.la
 liborcus_parser_@ORCUS_API_VERSION@_la_SOURCES = \
 	win_stdint.h \
@@ -39,14 +47,21 @@ liborcus_parser_@ORCUS_API_VERSION@_la_SOURCES = \
 
 liborcus_parser_@ORCUS_API_VERSION@_la_LDFLAGS = \
 	-no-undefined \
-	$(BOOST_SYSTEM_LDFLAGS) \
-	$(BOOST_FILESYSTEM_LDFLAGS)
+	$(BOOST_SYSTEM_LDFLAGS)
 
 liborcus_parser_@ORCUS_API_VERSION@_la_LIBADD = \
 	$(BOOST_SYSTEM_LIBS) \
-	$(BOOST_FILESYSTEM_LIBS) \
 	$(ZLIB_LIBS)
 
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+liborcus_parser_@ORCUS_API_VERSION@_la_LDFLAGS += -lstdc++fs
+else
+liborcus_parser_@ORCUS_API_VERSION@_la_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+liborcus_parser_@ORCUS_API_VERSION@_la_LIBADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
 EXTRA_PROGRAMS = \
 	css-parser-test \
 	csv-parser-test \
@@ -77,7 +92,10 @@ parser_test_string_pool_SOURCES = \
 	string_pool.cpp \
 	string_pool_test.cpp
 
-parser_test_string_pool_LDADD = liborcus-parser-@ORCUS_API_VERSION@.la
+parser_test_string_pool_LDADD = \
+    liborcus-parser-@ORCUS_API_VERSION@.la \
+	$(BOOST_SYSTEM_LIBS)
+    
 parser_test_string_pool_CPPFLAGS = $(AM_CPPFLAGS)
 
 # parser-test-xml-namespace
@@ -88,7 +106,9 @@ parser_test_xml_namespace_SOURCES = \
 
 parser_test_xml_namespace_LDADD = \
 	liborcus-parser-@ORCUS_API_VERSION@.la \
-	../test/liborcus-test.a
+	../test/liborcus-test.a \
+	$(BOOST_SYSTEM_LIBS)
+
 parser_test_xml_namespace_CPPFLAGS = $(AM_CPPFLAGS)
 
 # parser-test-xml-validation
@@ -98,13 +118,20 @@ parser_test_xml_validation_SOURCES = \
 
 parser_test_xml_validation_CPPFLAGS = $(AM_CPPFLAGS)
 parser_test_xml_validation_LDFLAGS = \
-	$(BOOST_SYSTEM_LDFLAGS) \
-	$(BOOST_FILESYSTEM_LDFLAGS)
+	$(BOOST_SYSTEM_LDFLAGS)
 parser_test_xml_validation_LDADD = \
 	liborcus-parser-@ORCUS_API_VERSION@.la \
 	../test/liborcus-test.a \
-	$(BOOST_SYSTEM_LIBS) \
-	$(BOOST_FILESYSTEM_LIBS)
+	$(BOOST_SYSTEM_LIBS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+parser_test_xml_validation_LDFLAGS += -lstdc++fs
+else
+parser_test_xml_validation_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+parser_test_xml_validation_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
 
 # parser-test-base64
 
@@ -207,11 +234,20 @@ parser_test_zip_archive_CPPFLAGS = $(AM_CPPFLAGS)
 parser_test_zip_archive_LDADD = \
 	liborcus-parser-@ORCUS_API_VERSION@.la \
 	../test/liborcus-test.a \
-	$(BOOST_SYSTEM_LIBS) \
-	$(BOOST_FILESYSTEM_LIBS)
+	$(BOOST_SYSTEM_LIBS)
 parser_test_zip_archive_LDFLAGS = \
-	$(BOOST_SYSTEM_LDFLAGS) \
-	$(BOOST_FILESYSTEM_LDFLAGS)
+	$(BOOST_SYSTEM_LDFLAGS)
+
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+parser_test_zip_archive_LDFLAGS += -lstdc++fs
+else
+parser_test_zip_archive_LDFLAGS += $(BOOST_FILESYSTEM_LDFLAGS)
+parser_test_zip_archive_LDADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
+
 
 # parser-test-base
 
diff --git a/src/parser/parser_test_xml_validation.cpp b/src/parser/parser_test_xml_validation.cpp
index bf831224..aa602651 100644
--- a/src/parser/parser_test_xml_validation.cpp
+++ b/src/parser/parser_test_xml_validation.cpp
@@ -10,10 +10,20 @@
 #include <orcus/stream.hpp>
 
 #include <iostream>
-#include <boost/filesystem.hpp>
 #include <boost/range/iterator_range.hpp>
 
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
+#include <boost/filesystem.hpp>
 namespace fs = boost::filesystem;
+#endif
+#endif
 
 void test_valid()
 {
diff --git a/src/parser/stream.cpp b/src/parser/stream.cpp
index 3964e4b5..593123ab 100644
--- a/src/parser/stream.cpp
+++ b/src/parser/stream.cpp
@@ -19,11 +19,22 @@
 #include <codecvt>
 #include <iostream>
 
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
 #include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
+
 #include <boost/interprocess/file_mapping.hpp>
 #include <boost/interprocess/mapped_region.hpp>
 
-namespace fs = boost::filesystem;
 namespace bip = boost::interprocess;
 
 namespace orcus {
diff --git a/src/parser/zip_archive_test.cpp b/src/parser/zip_archive_test.cpp
index 5f6fea86..387507fe 100644
--- a/src/parser/zip_archive_test.cpp
+++ b/src/parser/zip_archive_test.cpp
@@ -13,7 +13,18 @@
 #include <orcus/zip_archive_stream.hpp>
 #include <orcus/zip_archive.hpp>
 
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
 #include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
 
 #define ASSERT_THROW(expr) \
 try \
@@ -26,7 +37,6 @@ catch (...) \
 }
 
 using namespace orcus;
-namespace fs = boost::filesystem;
 
 void test_zip_archive_stream(zip_archive_stream* const strm, const unsigned char* const data, std::size_t const length)
 {
diff --git a/src/spreadsheet/Makefile.am b/src/spreadsheet/Makefile.am
index 17e731e6..8f1e0fb7 100644
--- a/src/spreadsheet/Makefile.am
+++ b/src/spreadsheet/Makefile.am
@@ -7,6 +7,14 @@ AM_CPPFLAGS = \
 
 AM_CPPFLAGS += $(BOOST_CPPFLAGS) $(LIBIXION_CFLAGS)
 
+if HAVE_FILESYSTEM
+AM_CPPFLAGS += "-DHAVE_FILESYSTEM=1"
+endif
+
+if HAVE_EXPERIMENTAL_FILESYSTEM
+AM_CPPFLAGS += "-DHAVE_EXPERIMENTAL_FILESYSTEM=1"
+endif
+
 COMMON_CPPFLAGS = $(AM_CPPFLAGS)
 
 if HAVE_STATIC_LIB
@@ -67,9 +75,16 @@ liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_LDFLAGS = -no-undefined
 liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_LIBADD = \
 	$(LIBIXION_LIBS) \
 	$(BOOST_DATE_TIME_LIBS) \
-	$(BOOST_FILESYSTEM_LIBS) \
 	$(BOOST_SYSTEM_LIBS) \
 	../parser/liborcus-parser-@ORCUS_API_VERSION@.la \
 	../liborcus/liborcus-@ORCUS_API_VERSION@.la
 
+if !HAVE_FILESYSTEM
+if HAVE_EXPERIMENTAL_FILESYSTEM
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_LIBADD += -lstdc++fs
+else
+liborcus_spreadsheet_model_@ORCUS_API_VERSION@_la_LIBADD += $(BOOST_FILESYSTEM_LIBS)
+endif
+endif
+
 endif
diff --git a/src/spreadsheet/debug_state_dumper.cpp b/src/spreadsheet/debug_state_dumper.cpp
index 5d1d25b8..133bf7d2 100644
--- a/src/spreadsheet/debug_state_dumper.cpp
+++ b/src/spreadsheet/debug_state_dumper.cpp
@@ -14,8 +14,6 @@
 #include <fstream>
 #include <algorithm>
 
-namespace fs = boost::filesystem;
-
 namespace orcus { namespace spreadsheet { namespace detail {
 
 doc_debug_state_dumper::doc_debug_state_dumper(const document_impl& doc) : m_doc(doc)
diff --git a/src/spreadsheet/debug_state_dumper.hpp b/src/spreadsheet/debug_state_dumper.hpp
index 93af45cf..d755a492 100644
--- a/src/spreadsheet/debug_state_dumper.hpp
+++ b/src/spreadsheet/debug_state_dumper.hpp
@@ -7,7 +7,19 @@
 
 #pragma once
 
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
 #include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
+
 #include <string_view>
 
 namespace orcus { namespace spreadsheet {
@@ -26,11 +38,11 @@ class doc_debug_state_dumper
 public:
     doc_debug_state_dumper(const document_impl& doc);
 
-    void dump(const boost::filesystem::path& outdir) const;
+    void dump(const fs::path& outdir) const;
 
 private:
-    void dump_properties(const boost::filesystem::path& outdir) const;
-    void dump_styles(const boost::filesystem::path& outdir) const;
+    void dump_properties(const fs::path& outdir) const;
+    void dump_styles(const fs::path& outdir) const;
 };
 
 class sheet_debug_state_dumper
@@ -41,13 +53,13 @@ class sheet_debug_state_dumper
 public:
     sheet_debug_state_dumper(const sheet_impl& sheet, std::string_view sheet_name);
 
-    void dump(const boost::filesystem::path& outdir) const;
+    void dump(const fs::path& outdir) const;
 
 private:
-    void dump_cell_values(const boost::filesystem::path& outdir) const;
-    void dump_cell_formats(const boost::filesystem::path& outdir) const;
-    void dump_column_formats(const boost::filesystem::path& outdir) const;
-    void dump_row_formats(const boost::filesystem::path& outdir) const;
+    void dump_cell_values(const fs::path& outdir) const;
+    void dump_cell_formats(const fs::path& outdir) const;
+    void dump_column_formats(const fs::path& outdir) const;
+    void dump_row_formats(const fs::path& outdir) const;
 };
 
 }}}
diff --git a/src/spreadsheet/document.cpp b/src/spreadsheet/document.cpp
index 56739248..92c16081 100644
--- a/src/spreadsheet/document.cpp
+++ b/src/spreadsheet/document.cpp
@@ -15,7 +15,6 @@
 #include <algorithm>
 
 using namespace std;
-namespace fs = boost::filesystem;
 
 namespace orcus { namespace spreadsheet {
 
diff --git a/src/spreadsheet/document_impl.hpp b/src/spreadsheet/document_impl.hpp
index 3541e9eb..44ee91f8 100644
--- a/src/spreadsheet/document_impl.hpp
+++ b/src/spreadsheet/document_impl.hpp
@@ -17,7 +17,6 @@
 #include <orcus/string_pool.hpp>
 #include <orcus/types.hpp>
 
-#include <boost/filesystem.hpp>
 #include <ixion/config.hpp>
 #include <ixion/formula.hpp>
 #include <ixion/formula_name_resolver.hpp>
diff --git a/src/spreadsheet/sheet.cpp b/src/spreadsheet/sheet.cpp
index 8dbd9ae8..47921a97 100644
--- a/src/spreadsheet/sheet.cpp
+++ b/src/spreadsheet/sheet.cpp
@@ -29,12 +29,22 @@
 
 #include <boost/date_time/posix_time/posix_time.hpp>
 #include <boost/date_time/gregorian/greg_date.hpp>
+#ifdef HAVE_FILESYSTEM
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#ifdef HAVE_EXPERIMENTAL_FILESYSTEM
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#else
 #include <boost/filesystem.hpp>
+namespace fs = boost::filesystem;
+#endif
+#endif
 
 #define ORCUS_DEBUG_SHEET 0
 
 using namespace std;
-namespace fs = boost::filesystem;
 namespace gregorian = boost::gregorian;
 namespace posix_time = boost::posix_time;
 
-- 
2.41.0

