/* This file is part of hugin. hugin is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. hugin is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with hugin. If not, see . */ /** * @file Makefile.h * @brief * Created on: May 25, 2010 * @author Florian Achleitner */ #ifndef MAKEFILE_H_ #define MAKEFILE_H_ #include "char_type.h" #include #include #include #include #include /** * */ namespace makefile { class MakefileItem; /** * Container and Manager for all our \ref MakefileItem "MakefileItems". * It also contains some static utils and enums. */ class MAKEIMPEX Makefile { /// Holds pointers to every existing MakefileItem. std::vector items; /// has the makefile been written? bool written; Makefile() : written(false) {} static Makefile* instance; public: virtual ~Makefile() {} static Makefile& getSingleton(); static void clean(); /** * Prepare output streams to get number output right with this locale. * We use the "C" locale for NUMERIC and the system's for everything else. * @note: C++ locales are different from C. Calling setlocale doesn't influence C++ streams! */ static const std::locale locale; /** * Selects quoting modes. */ enum QuoteMode {MAKE, SHELL, NONE}; static string quote(const string& in, Makefile::QuoteMode mode); #ifdef WIN32 /** special quoting for environemnt variables on windows */ static string quoteEnvironment(const string& in); #endif /** * Adds a MakefileItem to a list of existing Items. * This adds a MakefileItem to the output order. Only items added are * output. * @param item pointer */ void add(MakefileItem* item) { items.push_back(item); } /** * Removes a MakefileItem to a list of existing Items. * MakefileItem::~MakefileItem removes itself using this. * We have to make sure that we don't hold pointers to non-existing * MakefileItems. * @note The easiest way is to wipe the whole Makefile singleton, so * if one MakefileItem is destructed, we loose the pointers to all the others * too. This is ok if removing an item while needing the rest is not a use case. * And if memory handling is not done by this class. * @todo Should it be necessary, implement this remove method to not throw everyting away. * @param item pointer */ static void remove(MakefileItem* item); /** * Outputs all known MakefileItem to an ostream. * @param out ostream to write the Makefile to. * @return */ int writeMakefile(ostream& out); }; MAKEIMPEX const std::locale GetMakefileLocale(); } #endif /* MAKEFILE_H_ */