From 7e68068c2501a681dbbcbce9abf60073f35687ee Mon Sep 17 00:00:00 2001 From: pavelxdd Date: Sat, 25 Nov 2017 04:26:01 +0300 Subject: [PATCH] fix compilation with boost::filesystem CMakeLists.txt: --------------------------- Until now build with boost::filesystem was completely broken, since cmake exported definitions with wrong name prefixes, and nana always defaulted to internal filesystem implementation. After fixing the boost definitions, a number of errors came up due to incompatibility of boost::filesystem with nana and std filesystems. This commit tries to fix them all. filesystem.cpp, filesystem.hpp, filebox.cpp: -------------------------------------------- boost::filesystem doesn't have a file_time_type, so declared it in the filesystem.hpp header. boost::filesystem::last_write_time has a return type std::time_t unlike the other two implementations of this function in nana and std, so added ifdef to convert the result to file_time_type. fixed build on gcc-4.9, since it doesn't have a std::put_time function, included in that case. boost::filesystem::file_type types have different names than std::experimental::filesystem::file_type types, fixed it by creating an enum class file_type with the same type names as in std::experimental::filesystem::file_type. This fix requires static_cast from functions results to internal file_type, since boost file_type and std file_type a different enum classes. changed switch to if, bacause old gcc fails on converting enum class members to int. stdc++.hpp: ----------- added ifndef guards to prevent errors on multiple includes of this header. wvl.cpp: -------- added boost/chrono.hpp include for the cases when std::thread is not available. travis: ------- added boost system, thread, chrono libs to install, they are needed for the nana-demo to compile. --- .travis.yml | 3 +++ CMakeLists.txt | 4 ++-- include/nana/filesystem/filesystem.hpp | 15 +++++++++++++++ include/nana/stdc++.hpp | 7 ++++++- source/filesystem/filesystem.cpp | 14 +++++++++++++- source/gui/filebox.cpp | 26 ++++++++++++-------------- source/gui/wvl.cpp | 7 ++++++- 7 files changed, 57 insertions(+), 19 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4543e6b3..c7b02176 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,6 +35,9 @@ matrix: - libx11-dev - libxft-dev - libboost-filesystem-dev + - libboost-system-dev + - libboost-thread-dev + - libboost-chrono-dev sources: - ubuntu-toolchain-r-test diff --git a/CMakeLists.txt b/CMakeLists.txt index 1a43b5b5..cc4622bf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -238,7 +238,7 @@ elseif (NANA_CMAKE_STD_FILESYSTEM_FORCE) add_definitions(-DSTD_FILESYSTEM_FORCE) elseif (NANA_CMAKE_FIND_BOOST_FILESYSTEM OR NANA_CMAKE_BOOST_FILESYSTEM_FORCE) if (NANA_CMAKE_BOOST_FILESYSTEM_FORCE) - add_definitions(-DNANA_BOOST_FILESYSTEM_FORCE) + add_definitions(-DBOOST_FILESYSTEM_FORCE) endif(NANA_CMAKE_BOOST_FILESYSTEM_FORCE) # https://cmake.org/cmake/help/git-master/module/FindBoost.html # Implicit dependencies such as Boost::filesystem requiring Boost::system will be automatically detected and satisfied, @@ -246,7 +246,7 @@ elseif (NANA_CMAKE_FIND_BOOST_FILESYSTEM OR NANA_CMAKE_BOOST_FILESYSTEM_FORCE) # If using Boost::thread, then Thread::Thread will also be added automatically. find_package(Boost COMPONENTS filesystem) if (Boost_FOUND) - add_definitions(-DNANA_BOOST_FILESYSTEM_AVAILABLE) + add_definitions(-DBOOST_FILESYSTEM_AVAILABLE) include_directories(SYSTEM "${Boost_INCLUDE_DIR}") list(APPEND NANA_LINKS ${Boost_LIBRARIES}) ###### FIRST !!!!!!!!!!!!!!!!! add is not first endif (Boost_FOUND) diff --git a/include/nana/filesystem/filesystem.hpp b/include/nana/filesystem/filesystem.hpp index 59020d68..067586f5 100644 --- a/include/nana/filesystem/filesystem.hpp +++ b/include/nana/filesystem/filesystem.hpp @@ -53,6 +53,7 @@ #undef NANA_USING_BOOST_FILESYSTEM #define NANA_USING_BOOST_FILESYSTEM 1 +# include # include // add boost::filesystem into std::experimental::filesystem @@ -60,6 +61,20 @@ namespace std { namespace experimental { namespace filesystem { using namespace boost::filesystem; + using file_time_type = std::chrono::time_point; + + enum class file_type { + none = boost::filesystem::file_type::status_unknown, + not_found = boost::filesystem::file_type::file_not_found, + regular = boost::filesystem::file_type::regular_file, + directory = boost::filesystem::file_type::directory_file, + symlink = boost::filesystem::file_type::symlink_file, + block = boost::filesystem::file_type::block_file, + character = boost::filesystem::file_type::character_file, + fifo = boost::filesystem::file_type::fifo_file, + socket = boost::filesystem::file_type::socket_file, + unknown = boost::filesystem::file_type::type_unknown, + }; } // filesystem } // experimental } // std diff --git a/include/nana/stdc++.hpp b/include/nana/stdc++.hpp index 4d8bbef9..fc2d6568 100644 --- a/include/nana/stdc++.hpp +++ b/include/nana/stdc++.hpp @@ -12,6 +12,9 @@ * @brief Implement the lack support of standard library. */ +#ifndef NANA_STDCXX_INCLUDED +#define NANA_STDCXX_INCLUDED + #include "c++defines.hpp" //Implement workarounds for GCC/MinGW which version is below 4.8.2 @@ -153,4 +156,6 @@ namespace std return (v < lo ? lo : (hi < v ? hi : v)); } } -#endif \ No newline at end of file +#endif + +#endif // NANA_STDCXX_INCLUDED diff --git a/source/filesystem/filesystem.cpp b/source/filesystem/filesystem.cpp index 4613ca7a..fa5a8cb8 100644 --- a/source/filesystem/filesystem.cpp +++ b/source/filesystem/filesystem.cpp @@ -14,7 +14,13 @@ #include #include #include -#include //put_time + +#include +#ifdef _enable_std_put_time + #include +#else + #include +#endif #if defined(NANA_WINDOWS) #include @@ -97,7 +103,13 @@ namespace nana std::string pretty_file_date(const fs::path& path) // todo: move to .cpp { try { +#if NANA_USING_BOOST_FILESYSTEM + // The return type of boost::filesystem::last_write_time isn't + // the same as in nana and std implementations of this function + auto ftime = std::chrono::system_clock::from_time_t(fs::last_write_time(path)); +#else auto ftime = fs::last_write_time(path); +#endif // crash: VS2015 will not read the time for some files (for example: C:/hiberfil.sys) // and will return file_time_type(-1) without throwing diff --git a/source/gui/filebox.cpp b/source/gui/filebox.cpp index 96f1e1c6..b31653cc 100644 --- a/source/gui/filebox.cpp +++ b/source/gui/filebox.cpp @@ -505,21 +505,18 @@ namespace nana auto fpath = i->path().native(); auto fattr = fs::status(fpath); + auto ftype = static_cast(fattr.type()); item_fs m; m.name = name; m.directory = fs::is_directory(fattr); - switch(fattr.type()) - { - case fs::file_type::not_found: - case fs::file_type::unknown: - case fs::file_type::directory: + if (ftype == fs::file_type::not_found || + ftype == fs::file_type::unknown || + ftype == fs::file_type::directory) m.bytes = 0; - break; - default: + else m.bytes = fs::file_size(fpath); - } fs_ext::modified_file_time(fpath, m.modified_time); @@ -692,13 +689,12 @@ namespace nana return; } - using file_type = fs::file_type; - fs::path fspath(fb_.addr_.filesystem + path); - auto fst = fs::status(fspath); + auto fattr = fs::status(fspath); + auto ftype = static_cast(fattr.type()); - if(fst.type() != file_type::not_found && fst.type() != file_type::none) + if(ftype != fs::file_type::not_found && ftype != fs::file_type::none) { mb<(fattr.type()); //Check if the selected name is a directory auto is_dir = fs::is_directory(fattr); @@ -808,6 +805,7 @@ namespace nana { //Add the extension, then check if it is a directory again. fattr = fs::status(tar); + ftype = static_cast(fattr.type()); is_dir = fs::is_directory(fattr); } @@ -820,7 +818,7 @@ namespace nana if(io_read_) { - if(fs::file_type::not_found == fattr.type()) + if(fs::file_type::not_found == ftype) { msgbox mb(*this, caption()); mb.icon(msgbox::icon_information); @@ -832,7 +830,7 @@ namespace nana } else { - if(fs::file_type::not_found != fattr.type()) + if(fs::file_type::not_found != ftype) { msgbox mb(*this, caption(), msgbox::yes_no); mb.icon(msgbox::icon_question); diff --git a/source/gui/wvl.cpp b/source/gui/wvl.cpp index 820a8ba7..610484cd 100644 --- a/source/gui/wvl.cpp +++ b/source/gui/wvl.cpp @@ -15,7 +15,12 @@ #include #include #include -#include + +#ifdef STD_THREAD_NOT_SUPPORTED +# include +#else +# include +#endif //#define NANA_AUTOMATIC_GUI_TESTING namespace nana