diff --git a/configure.ac b/configure.ac index e34e1ecd0d2fc9323b38777f49439d1133b36bf3..415beb53897e9330ff2920ceda5cf771f513ca7a 100644 --- a/configure.ac +++ b/configure.ac @@ -66,8 +66,6 @@ fi # We need 1.36 because of unordered_{set,hash} used by Dynare++ AX_BOOST_BASE([1.36], [], [AC_MSG_ERROR([Can't find Boost >= 1.36])]) -AX_BOOST_SYSTEM -AX_BOOST_FILESYSTEM CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" diff --git a/m4/ax_boost_filesystem.m4 b/m4/ax_boost_filesystem.m4 deleted file mode 100644 index c392f9d65f0196efb83945a7212396892952d55a..0000000000000000000000000000000000000000 --- a/m4/ax_boost_filesystem.m4 +++ /dev/null @@ -1,118 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_boost_filesystem.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_BOOST_FILESYSTEM -# -# DESCRIPTION -# -# Test for Filesystem library from the Boost C++ libraries. The macro -# requires a preceding call to AX_BOOST_BASE. Further documentation is -# available at <http://randspringer.de/boost/index.html>. -# -# This macro calls: -# -# AC_SUBST(BOOST_FILESYSTEM_LIB) -# -# And sets: -# -# HAVE_BOOST_FILESYSTEM -# -# LICENSE -# -# Copyright (c) 2009 Thomas Porschberg <thomas@randspringer.de> -# Copyright (c) 2009 Michael Tindal -# Copyright (c) 2009 Roman Rybalko <libtorrent@romanr.info> -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 27 - -AC_DEFUN([AX_BOOST_FILESYSTEM], -[ - AC_ARG_WITH([boost-filesystem], - AS_HELP_STRING([--with-boost-filesystem@<:@=special-lib@:>@], - [use the Filesystem library from boost - it is possible to specify a certain library for the linker - e.g. --with-boost-filesystem=boost_filesystem-gcc-mt ]), - [ - if test "$withval" = "no"; then - want_boost="no" - elif test "$withval" = "yes"; then - want_boost="yes" - ax_boost_user_filesystem_lib="" - else - want_boost="yes" - ax_boost_user_filesystem_lib="$withval" - fi - ], - [want_boost="yes"] - ) - - if test "x$want_boost" = "xyes"; then - AC_REQUIRE([AC_PROG_CC]) - CPPFLAGS_SAVED="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" - export CPPFLAGS - - LDFLAGS_SAVED="$LDFLAGS" - LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" - export LDFLAGS - - LIBS_SAVED=$LIBS - LIBS="$LIBS $BOOST_SYSTEM_LIB" - export LIBS - - AC_CACHE_CHECK(whether the Boost::Filesystem library is available, - ax_cv_boost_filesystem, - [AC_LANG_PUSH([C++]) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <boost/filesystem/path.hpp>]], - [[using namespace boost::filesystem; - path my_path( "foo/bar/data.txt" ); - return 0;]])], - ax_cv_boost_filesystem=yes, ax_cv_boost_filesystem=no) - AC_LANG_POP([C++]) - ]) - if test "x$ax_cv_boost_filesystem" = "xyes"; then - AC_DEFINE(HAVE_BOOST_FILESYSTEM,,[define if the Boost::Filesystem library is available]) - BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` - if test "x$ax_boost_user_filesystem_lib" = "x"; then - for libextension in `ls -r $BOOSTLIBDIR/libboost_filesystem* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'` ; do - ax_lib=${libextension} - AC_CHECK_LIB($ax_lib, exit, - [BOOST_FILESYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_FILESYSTEM_LIB) link_filesystem="yes"; break], - [link_filesystem="no"]) - done - if test "x$link_filesystem" != "xyes"; then - for libextension in `ls -r $BOOSTLIBDIR/boost_filesystem* 2>/dev/null | sed 's,.*/,,' | sed -e 's,\..*,,'` ; do - ax_lib=${libextension} - AC_CHECK_LIB($ax_lib, exit, - [BOOST_FILESYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_FILESYSTEM_LIB) link_filesystem="yes"; break], - [link_filesystem="no"]) - done - fi - else - for ax_lib in $ax_boost_user_filesystem_lib boost_filesystem-$ax_boost_user_filesystem_lib; do - AC_CHECK_LIB($ax_lib, exit, - [BOOST_FILESYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_FILESYSTEM_LIB) link_filesystem="yes"; break], - [link_filesystem="no"]) - done - - fi - if test "x$ax_lib" = "x"; then - AC_MSG_ERROR(Could not find a version of the library!) - fi - if test "x$link_filesystem" != "xyes"; then - AC_MSG_ERROR(Could not link against $ax_lib !) - fi - fi - - CPPFLAGS="$CPPFLAGS_SAVED" - LDFLAGS="$LDFLAGS_SAVED" - LIBS="$LIBS_SAVED" - fi -]) diff --git a/m4/ax_boost_system.m4 b/m4/ax_boost_system.m4 deleted file mode 100644 index 207d7be8de41309d204cebd5c0d5ab3fdfd3d7a4..0000000000000000000000000000000000000000 --- a/m4/ax_boost_system.m4 +++ /dev/null @@ -1,121 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_boost_system.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_BOOST_SYSTEM -# -# DESCRIPTION -# -# Test for System library from the Boost C++ libraries. The macro requires -# a preceding call to AX_BOOST_BASE. Further documentation is available at -# <http://randspringer.de/boost/index.html>. -# -# This macro calls: -# -# AC_SUBST(BOOST_SYSTEM_LIB) -# -# And sets: -# -# HAVE_BOOST_SYSTEM -# -# LICENSE -# -# Copyright (c) 2008 Thomas Porschberg <thomas@randspringer.de> -# Copyright (c) 2008 Michael Tindal -# Copyright (c) 2008 Daniel Casimiro <dan.casimiro@gmail.com> -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 19 - -AC_DEFUN([AX_BOOST_SYSTEM], -[ - AC_ARG_WITH([boost-system], - AS_HELP_STRING([--with-boost-system@<:@=special-lib@:>@], - [use the System library from boost - it is possible to specify a certain library for the linker - e.g. --with-boost-system=boost_system-gcc-mt ]), - [ - if test "$withval" = "no"; then - want_boost="no" - elif test "$withval" = "yes"; then - want_boost="yes" - ax_boost_user_system_lib="" - else - want_boost="yes" - ax_boost_user_system_lib="$withval" - fi - ], - [want_boost="yes"] - ) - - if test "x$want_boost" = "xyes"; then - AC_REQUIRE([AC_PROG_CC]) - AC_REQUIRE([AC_CANONICAL_BUILD]) - CPPFLAGS_SAVED="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" - export CPPFLAGS - - LDFLAGS_SAVED="$LDFLAGS" - LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" - export LDFLAGS - - AC_CACHE_CHECK(whether the Boost::System library is available, - ax_cv_boost_system, - [AC_LANG_PUSH([C++]) - CXXFLAGS_SAVE=$CXXFLAGS - CXXFLAGS= - - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <boost/system/error_code.hpp>]], - [[boost::system::error_category *a = 0;]])], - ax_cv_boost_system=yes, ax_cv_boost_system=no) - CXXFLAGS=$CXXFLAGS_SAVE - AC_LANG_POP([C++]) - ]) - if test "x$ax_cv_boost_system" = "xyes"; then - AC_SUBST(BOOST_CPPFLAGS) - - AC_DEFINE(HAVE_BOOST_SYSTEM,,[define if the Boost::System library is available]) - BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` - - LDFLAGS_SAVE=$LDFLAGS - if test "x$ax_boost_user_system_lib" = "x"; then - for libextension in `ls -r $BOOSTLIBDIR/libboost_system* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'` ; do - ax_lib=${libextension} - AC_CHECK_LIB($ax_lib, exit, - [BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break], - [link_system="no"]) - done - if test "x$link_system" != "xyes"; then - for libextension in `ls -r $BOOSTLIBDIR/boost_system* 2>/dev/null | sed 's,.*/,,' | sed -e 's,\..*,,'` ; do - ax_lib=${libextension} - AC_CHECK_LIB($ax_lib, exit, - [BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break], - [link_system="no"]) - done - fi - - else - for ax_lib in $ax_boost_user_system_lib boost_system-$ax_boost_user_system_lib; do - AC_CHECK_LIB($ax_lib, exit, - [BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break], - [link_system="no"]) - done - - fi - if test "x$ax_lib" = "x"; then - AC_MSG_ERROR(Could not find a version of the library!) - fi - if test "x$link_system" = "xno"; then - AC_MSG_ERROR(Could not link against $ax_lib !) - fi - fi - - CPPFLAGS="$CPPFLAGS_SAVED" - LDFLAGS="$LDFLAGS_SAVED" - fi -]) diff --git a/src/DataTree.cc b/src/DataTree.cc index 28dbbc6d20b73a2d635e1e84876167390f0457fe..ff7712dcfdc33bb9b179ce76aa36eb21ce217f68 100644 --- a/src/DataTree.cc +++ b/src/DataTree.cc @@ -22,10 +22,7 @@ #include <iostream> #include <regex> -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wold-style-cast" -#include <boost/filesystem.hpp> -#pragma GCC diagnostic pop +#include <filesystem> #include "DataTree.hh" @@ -890,6 +887,6 @@ DataTree::packageDir(const string &package) { regex pat{R"(\.)"}; string dirname = "+" + regex_replace(package, pat, "/+"); - boost::filesystem::create_directories(dirname); + filesystem::create_directories(dirname); return dirname; } diff --git a/src/DynamicModel.cc b/src/DynamicModel.cc index c046b914202655f8e349cf4e1bbad292d3875fd6..6ac66420f2096d9f338ddfae7510ef648c1a2659 100644 --- a/src/DynamicModel.cc +++ b/src/DynamicModel.cc @@ -965,7 +965,7 @@ DynamicModel::writeModelEquationsCode(const string &basename, const map_idx_t &m unsigned int instruction_number = 0; bool file_open = false; - boost::filesystem::create_directories(basename + "/model/bytecode"); + filesystem::create_directories(basename + "/model/bytecode"); string main_name = basename + "/model/bytecode/dynamic.cod"; code_file.open(main_name, ios::out | ios::binary | ios::ate); @@ -1233,7 +1233,7 @@ DynamicModel::writeModelEquationsCode_Block(const string &basename, const map_id vector<int> feedback_variables; bool file_open = false; string main_name; - boost::filesystem::create_directories(basename + "/model/bytecode"); + filesystem::create_directories(basename + "/model/bytecode"); if (linear_decomposition) main_name = basename + "/model/bytecode/non_linear.cod"; else @@ -1692,7 +1692,7 @@ DynamicModel::writeDynamicJuliaFile(const string &basename) const void DynamicModel::writeDynamicCFile(const string &basename, const int order) const { - boost::filesystem::create_directories(basename + "/model/src"); + filesystem::create_directories(basename + "/model/src"); string filename = basename + "/model/src/dynamic.c"; string filename_mex = basename + "/model/src/dynamic_mex.c"; ofstream mDynamicModelFile, mDynamicMexFile; @@ -3378,7 +3378,7 @@ DynamicModel::writeOutput(ostream &output, const string &basename, bool block_de if (estimation_present) { ofstream KF_index_file; - boost::filesystem::create_directories(basename + "/model/bytecode"); + filesystem::create_directories(basename + "/model/bytecode"); string main_name = basename + "/model/bytecode/kfi"; KF_index_file.open(main_name, ios::out | ios::binary | ios::ate); int n_obs = symbol_table.observedVariablesNbr(); @@ -5343,7 +5343,7 @@ DynamicModel::collectBlockVariables() } void -DynamicModel::writeDynamicFile(const string &basename, bool block, bool linear_decomposition, bool bytecode, bool use_dll, const string &mexext, const boost::filesystem::path &matlabroot, const boost::filesystem::path &dynareroot, int order, bool julia) const +DynamicModel::writeDynamicFile(const string &basename, bool block, bool linear_decomposition, bool bytecode, bool use_dll, const string &mexext, const filesystem::path &matlabroot, const filesystem::path &dynareroot, int order, bool julia) const { if (block && bytecode) writeModelEquationsCode_Block(basename, map_idx, linear_decomposition); @@ -6702,7 +6702,7 @@ DynamicModel::isChecksumMatching(const string &basename, bool block) const result.process_bytes(private_buffer, strlen(private_buffer)); } - bool basename_dir_exists = !boost::filesystem::create_directory(basename); + bool basename_dir_exists = !filesystem::create_directory(basename); // check whether basename directory exist. If not, create it. // If it does, read old checksum if it exist diff --git a/src/DynamicModel.hh b/src/DynamicModel.hh index 5264a22b8248e3c8666e1081ccf161574f009bab..1af8883f0dc66c91430326b20dd6c5eb2b73382d 100644 --- a/src/DynamicModel.hh +++ b/src/DynamicModel.hh @@ -23,10 +23,10 @@ using namespace std; #include <fstream> +#include <filesystem> #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wold-style-cast" -#include <boost/filesystem.hpp> #include <boost/crc.hpp> #pragma GCC diagnostic pop @@ -365,7 +365,7 @@ public: void Write_Inf_To_Bin_File_Block(const string &basename, const int &num, int &u_count_int, bool &file_open, bool is_two_boundaries, const bool linear_decomposition) const; //! Writes dynamic model file - void writeDynamicFile(const string &basename, bool block, bool linear_decomposition, bool bytecode, bool use_dll, const string &mexext, const boost::filesystem::path &matlabroot, const boost::filesystem::path &dynareroot, int order, bool julia) const; + void writeDynamicFile(const string &basename, bool block, bool linear_decomposition, bool bytecode, bool use_dll, const string &mexext, const filesystem::path &matlabroot, const filesystem::path &dynareroot, int order, bool julia) const; //! Writes file containing parameters derivatives void writeParamsDerivativesFile(const string &basename, bool julia) const; diff --git a/src/DynareMain.cc b/src/DynareMain.cc index bc15488604dea81aaf97c72bc01a915276a95256..37990b86b130ef92aa96bb674ddeb256070c2fae 100644 --- a/src/DynareMain.cc +++ b/src/DynareMain.cc @@ -23,6 +23,7 @@ #include <vector> #include <string> #include <regex> +#include <filesystem> #include <cstdlib> @@ -32,11 +33,6 @@ #include <unistd.h> -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wold-style-cast" -#include <boost/filesystem.hpp> -#pragma GCC diagnostic pop - #include "ParsingDriver.hh" #include "ExtendedPreprocessorTypes.hh" #include "ConfigFile.hh" @@ -52,8 +48,8 @@ void main2(stringstream &in, const string &basename, bool debug, bool clear_all, bool minimal_workspace, bool compute_xrefs, FileOutputType output_mode, LanguageOutputType lang, int params_derivs_order, bool transform_unary_ops, JsonOutputPointType json, JsonFileOutputType json_output_mode, bool onlyjson, bool jsonderivsimple, - const string &mexext, const boost::filesystem::path &matlabroot, - const boost::filesystem::path &dynareroot, bool onlymodel); + const string &mexext, const filesystem::path &matlabroot, + const filesystem::path &dynareroot, bool onlymodel); void main1(const string &filename, const string &basename, istream &modfile, bool debug, bool save_macro, string &save_macro_file, bool no_line_macro, bool no_empty_line_macro, const vector<pair<string, string>> &defines, const vector<string> &path, stringstream ¯o_output); @@ -167,8 +163,8 @@ main(int argc, char **argv) bool jsonderivsimple = false; LanguageOutputType language{LanguageOutputType::matlab}; string mexext; - boost::filesystem::path matlabroot; - boost::filesystem::path dynareroot{argv[0]}; + filesystem::path matlabroot; + filesystem::path dynareroot{argv[0]}; dynareroot = dynareroot.parent_path(); dynareroot = dynareroot / ".." / ".."; bool onlymodel = false; @@ -382,7 +378,7 @@ main(int argc, char **argv) cerr << "Incorrect syntax for matlabroot option" << endl; usage(); } - matlabroot = boost::filesystem::path{s.substr(11)}; + matlabroot = filesystem::path{s.substr(11)}; } else if (s == "onlymodel") onlymodel = true; diff --git a/src/DynareMain2.cc b/src/DynareMain2.cc index 1c0819e4c685a97c567a103d54c5949c7bdcf27a..b5b2e68a04abdad1c245b771244e55a0b765e261 100644 --- a/src/DynareMain2.cc +++ b/src/DynareMain2.cc @@ -18,11 +18,7 @@ */ #include <iostream> - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wold-style-cast" -#include <boost/filesystem.hpp> -#pragma GCC diagnostic pop +#include <filesystem> #include "ParsingDriver.hh" #include "ModFile.hh" @@ -37,12 +33,12 @@ main2(stringstream &in, const string &basename, bool debug, bool clear_all, bool bool minimal_workspace, bool compute_xrefs, FileOutputType output_mode, LanguageOutputType language, int params_derivs_order, bool transform_unary_ops, JsonOutputPointType json, JsonFileOutputType json_output_mode, bool onlyjson, bool jsonderivsimple, - const string &mexext, const boost::filesystem::path &matlabroot, - const boost::filesystem::path &dynareroot, bool onlymodel) + const string &mexext, const filesystem::path &matlabroot, + const filesystem::path &dynareroot, bool onlymodel) { ParsingDriver p(warnings, nostrict); - boost::filesystem::remove_all(basename + "/model/json"); + filesystem::remove_all(basename + "/model/json"); // Do parsing and construct internal representation of mod file unique_ptr<ModFile> mod_file = p.parse(in, debug); diff --git a/src/Makefile.am b/src/Makefile.am index 8bf944bd937e7c2ec227c20ca9d643f24044b676..b14f11a048350817962a2d01a6ceae2a707aaa20 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -66,7 +66,7 @@ EXTRA_DIST = \ # The -I. is for <FlexLexer.h> dynare_m_CPPFLAGS = $(BOOST_CPPFLAGS) -I. dynare_m_LDFLAGS = $(AM_LDFLAGS) $(BOOST_LDFLAGS) -dynare_m_LDADD = macro/libmacro.a $(BOOST_FILESYSTEM_LIB) $(BOOST_SYSTEM_LIB) +dynare_m_LDADD = macro/libmacro.a -lstdc++fs DynareFlex.cc: DynareFlex.ll $(LEX) -o DynareFlex.cc DynareFlex.ll diff --git a/src/ModFile.cc b/src/ModFile.cc index 00ea67b1a00527da077c3783e92f098800107311..f73291ce94adf03d50a379e65f5fdb63f124e441 100644 --- a/src/ModFile.cc +++ b/src/ModFile.cc @@ -22,11 +22,9 @@ #include <fstream> #include <typeinfo> #include <cassert> +#include <random> -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wold-style-cast" -#include <boost/filesystem.hpp> -#pragma GCC diagnostic pop +#include <filesystem> #include "ModFile.hh" #include "ConfigFile.hh" @@ -843,8 +841,8 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all, bool clear_glo bool console, bool nograph, bool nointeractive, const ConfigFile &config_file, bool check_model_changes, bool minimal_workspace, bool compute_xrefs, const string &mexext, - const boost::filesystem::path &matlabroot, - const boost::filesystem::path &dynareroot, bool onlymodel) const + const filesystem::path &matlabroot, + const filesystem::path &dynareroot, bool onlymodel) const { bool hasModelChanged = !dynamic_model.isChecksumMatching(basename, block); if (!check_model_changes) @@ -858,21 +856,21 @@ ModFile::writeOutputFiles(const string &basename, bool clear_all, bool clear_glo preprocessor is not able to recreate it afterwards (presumably because MATLAB maintains some sort of lock on it). The workaround is to rename it before deleting it. */ - if (boost::filesystem::exists("+" + basename)) + if (filesystem::exists("+" + basename)) { - auto tmp = boost::filesystem::unique_path(); - boost::filesystem::rename("+" + basename, tmp); - boost::filesystem::remove_all(tmp); + auto tmp = unique_path(); + filesystem::rename("+" + basename, tmp); + filesystem::remove_all(tmp); } - boost::filesystem::remove_all(basename + "/model/src"); - boost::filesystem::remove_all(basename + "/model/bytecode"); + filesystem::remove_all(basename + "/model/src"); + filesystem::remove_all(basename + "/model/bytecode"); } ofstream mOutputFile; if (basename.size()) { - boost::filesystem::create_directory("+" + basename); + filesystem::create_directory("+" + basename); string fname = "+" + basename + "/driver.m"; mOutputFile.open(fname, ios::out | ios::binary); if (!mOutputFile.is_open()) @@ -1438,7 +1436,7 @@ ModFile::writeJsonOutputParsingCheck(const string &basename, JsonFileOutputType if (basename.size()) { - boost::filesystem::create_directories(basename + "/model/json"); + filesystem::create_directories(basename + "/model/json"); string fname{basename + "/model/json/modfile.json"}; jsonOutputFile.open(fname, ios::out | ios::binary); if (!jsonOutputFile.is_open()) @@ -1545,7 +1543,7 @@ ModFile::writeJsonComputingPassOutput(const string &basename, JsonFileOutputType } else { - boost::filesystem::create_directories(basename + "/model/json"); + filesystem::create_directories(basename + "/model/json"); writeJsonFileHelper(basename + "/model/json/static.json", static_output); writeJsonFileHelper(basename + "/model/json/dynamic.json", dynamic_output); @@ -1571,3 +1569,24 @@ ModFile::writeJsonFileHelper(const string &fname, ostringstream &output) const jsonOutput << output.str(); jsonOutput.close(); } + +filesystem::path +ModFile::unique_path() +{ + filesystem::path path; + string possible_characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + random_device rd; + mt19937 generator(rd()); + uniform_int_distribution<int> distribution{0, static_cast<int>(possible_characters.size())-1}; + do + { + constexpr int rand_length = 10; + string rand_str(rand_length, '\0'); + for (auto &dis : rand_str) + dis = possible_characters[distribution(generator)]; + path = filesystem::temp_directory_path() / rand_str; + } + while (filesystem::exists(path)); + + return path; +} diff --git a/src/ModFile.hh b/src/ModFile.hh index 424d76cebac0bddaf1ae9bc5dc8d36489029f90f..5c3950d1677bd288a1c840bc4837bd23283edc7a 100644 --- a/src/ModFile.hh +++ b/src/ModFile.hh @@ -131,6 +131,10 @@ private: void writeJsonComputingPassOutput(const string &basename, JsonFileOutputType json_output_mode, bool jsonderivsimple) const; void writeJsonFileHelper(const string &fname, ostringstream &output) const; vector<expr_t> pac_growth; + /* Generate a random temporary path. Equivalent to + boost::filesystem::unique_path(). Both are insecure, but currently there + is no better portable solution. Maybe in a later C++ standard? */ + static filesystem::path unique_path(); public: //! Add a statement void addStatement(unique_ptr<Statement> st); @@ -164,8 +168,8 @@ public: void writeOutputFiles(const string &basename, bool clear_all, bool clear_global, bool no_log, bool no_warn, bool console, bool nograph, bool nointeractive, const ConfigFile &config_file, bool check_model_changes, bool minimal_workspace, bool compute_xrefs, - const string &mexext, const boost::filesystem::path &matlabroot, - const boost::filesystem::path &dynareroot, bool onlymodel) const; + const string &mexext, const filesystem::path &matlabroot, + const filesystem::path &dynareroot, bool onlymodel) const; void writeExternalFiles(const string &basename, FileOutputType output, LanguageOutputType language) const; void writeExternalFilesJulia(const string &basename, FileOutputType output) const; diff --git a/src/ModelEquationBlock.cc b/src/ModelEquationBlock.cc index f765a8975d0106d664bb13a3e36af5164142fc7a..923a7b27285a73dc538058e539427340756ee36c 100644 --- a/src/ModelEquationBlock.cc +++ b/src/ModelEquationBlock.cc @@ -132,7 +132,7 @@ SteadyStateModel::checkPass(ModFileStructure &mod_file_struct, WarningConsolidat void SteadyStateModel::writeLatexSteadyStateFile(const string &basename) const { - boost::filesystem::create_directories(basename + "/latex"); + filesystem::create_directories(basename + "/latex"); ofstream output, content_output; string filename = basename + "/latex/steady_state.tex"; diff --git a/src/ModelTree.cc b/src/ModelTree.cc index 3f3d045ce9135aa08f44f60f0bbbf32fc702ac96..3015385f99ebfad915d4cd722c67b208536de40c 100644 --- a/src/ModelTree.cc +++ b/src/ModelTree.cc @@ -1845,7 +1845,7 @@ ModelTree::Write_Inf_To_Bin_File(const string &filename, void ModelTree::writeLatexModelFile(const string &mod_basename, const string &latex_basename, ExprNodeOutputType output_type, const bool write_equation_tags) const { - boost::filesystem::create_directories(mod_basename + "/latex"); + filesystem::create_directories(mod_basename + "/latex"); ofstream output, content_output; string filename = mod_basename + "/latex/" + latex_basename + ".tex"; @@ -2212,11 +2212,11 @@ ModelTree::matlab_arch(const string &mexext) } void -ModelTree::compileDll(const string &basename, const string &static_or_dynamic, const string &mexext, const boost::filesystem::path &matlabroot, const boost::filesystem::path &dynareroot) +ModelTree::compileDll(const string &basename, const string &static_or_dynamic, const string &mexext, const filesystem::path &matlabroot, const filesystem::path &dynareroot) { const string opt_flags = "-O3 -g0 --param ira-max-conflict-table-size=1 -fno-forward-propagate -fno-gcse -fno-dce -fno-dse -fno-tree-fre -fno-tree-pre -fno-tree-cselim -fno-tree-dse -fno-tree-dce -fno-tree-pta -fno-gcse-after-reload"; - boost::filesystem::path compiler; + filesystem::path compiler; ostringstream flags; string libs; @@ -2254,7 +2254,7 @@ ModelTree::compileDll(const string &basename, const string &static_or_dynamic, c // Windows flags << " -static-libgcc -static-libstdc++ -shared"; // Put the MinGW environment shipped with Dynare in the path - boost::filesystem::path mingwpath = dynareroot / (string{"mingw"} + (mexext == "mexw32" ? "32" : "64")) / "bin"; + filesystem::path mingwpath = dynareroot / (string{"mingw"} + (mexext == "mexw32" ? "32" : "64")) / "bin"; string newpath = "PATH=" + mingwpath.string() + ';' + string{getenv("PATH")}; if (putenv(const_cast<char *>(newpath.c_str())) != 0) { @@ -2272,12 +2272,12 @@ ModelTree::compileDll(const string &basename, const string &static_or_dynamic, c } } - auto model_dir = boost::filesystem::path{basename} / "model" / "src"; - boost::filesystem::path main_src{model_dir / (static_or_dynamic + ".c")}, + auto model_dir = filesystem::path{basename} / "model" / "src"; + filesystem::path main_src{model_dir / (static_or_dynamic + ".c")}, mex_src{model_dir / (static_or_dynamic + "_mex.c")}; - boost::filesystem::path mex_dir{"+" + basename}; - boost::filesystem::path binary{mex_dir / (static_or_dynamic + "." + mexext)}; + filesystem::path mex_dir{"+" + basename}; + filesystem::path binary{mex_dir / (static_or_dynamic + "." + mexext)}; ostringstream cmd; diff --git a/src/ModelTree.hh b/src/ModelTree.hh index 04c26e952e935d64577d563853fa9d5510925678..2e3387204647162589ecec63c24c01fd6939723a 100644 --- a/src/ModelTree.hh +++ b/src/ModelTree.hh @@ -28,11 +28,7 @@ using namespace std; #include <map> #include <ostream> #include <array> - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wold-style-cast" -#include <boost/filesystem.hpp> -#pragma GCC diagnostic pop +#include <filesystem> #include "DataTree.hh" #include "ExtendedPreprocessorTypes.hh" @@ -312,7 +308,7 @@ private: //! Returns the name of the MATLAB architecture given the extension used for MEX files static string matlab_arch(const string &mexext); //! Compiles the MEX file - static void compileDll(const string &basename, const string &static_or_dynamic, const string &mexext, const boost::filesystem::path &matlabroot, const boost::filesystem::path &dynareroot); + static void compileDll(const string &basename, const string &static_or_dynamic, const string &mexext, const filesystem::path &matlabroot, const filesystem::path &dynareroot); public: ModelTree(SymbolTable &symbol_table_arg, diff --git a/src/StaticModel.cc b/src/StaticModel.cc index 75340e6a029f4f9d1a958a0e924b11f7e9d07d94..db72b53e9ed487c64f048698dc914869037a78eb 100644 --- a/src/StaticModel.cc +++ b/src/StaticModel.cc @@ -556,7 +556,7 @@ StaticModel::writeModelEquationsCode(const string &basename, map_idx_t map_idx) unsigned int instruction_number = 0; bool file_open = false; - boost::filesystem::create_directories(basename + "/model/bytecode"); + filesystem::create_directories(basename + "/model/bytecode"); string main_name = basename + "/model/bytecode/static.cod"; code_file.open(main_name, ios::out | ios::binary | ios::ate); @@ -733,7 +733,7 @@ StaticModel::writeModelEquationsCode_Block(const string &basename, map_idx_t map deriv_node_temp_terms_t tef_terms; bool file_open = false; - boost::filesystem::create_directories(basename + "/model/bytecode"); + filesystem::create_directories(basename + "/model/bytecode"); string main_name = basename + "/model/bytecode/static.cod"; code_file.open(main_name, ios::out | ios::binary | ios::ate); @@ -1889,7 +1889,7 @@ void StaticModel::writeStaticCFile(const string &basename) const { // Writing comments and function definition command - boost::filesystem::create_directories(basename + "/model/src"); + filesystem::create_directories(basename + "/model/src"); string filename = basename + "/model/src/static.c"; string filename_mex = basename + "/model/src/static_mex.c"; @@ -2027,7 +2027,7 @@ StaticModel::writeStaticJuliaFile(const string &basename) const } void -StaticModel::writeStaticFile(const string &basename, bool block, bool bytecode, bool use_dll, const string &mexext, const boost::filesystem::path &matlabroot, const boost::filesystem::path &dynareroot, bool julia) const +StaticModel::writeStaticFile(const string &basename, bool block, bool bytecode, bool use_dll, const string &mexext, const filesystem::path &matlabroot, const filesystem::path &dynareroot, bool julia) const { if (block && bytecode) writeModelEquationsCode_Block(basename, map_idx, map_idx2); diff --git a/src/StaticModel.hh b/src/StaticModel.hh index 05d66eb41d0b7506771e2f1cc0cd2d1749bdacb2..4b359e94fa15f5766c6f823ac962af608909e113 100644 --- a/src/StaticModel.hh +++ b/src/StaticModel.hh @@ -23,11 +23,7 @@ using namespace std; #include <fstream> - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wold-style-cast" -#include <boost/filesystem.hpp> -#pragma GCC diagnostic pop +#include <filesystem> #include "ModelTree.hh" @@ -200,7 +196,7 @@ public: int &u_count_int, bool &file_open) const; //! Writes static model file - void writeStaticFile(const string &basename, bool block, bool bytecode, bool use_dll, const string &mexext, const boost::filesystem::path &matlabroot, const boost::filesystem::path &dynareroot, bool julia) const; + void writeStaticFile(const string &basename, bool block, bool bytecode, bool use_dll, const string &mexext, const filesystem::path &matlabroot, const filesystem::path &dynareroot, bool julia) const; //! Write JSON Output (used by PlannerObjectiveStatement) void writeJsonOutput(ostream &output) const;