Subversion Repositories Programming Utils

Rev

Rev 67 | Rev 79 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#ifndef MAKEFILE_H
#define MAKEFILE_H

#include <set>
#include <string>
#include <map>

#include "dirlist.h"

/**
 * Represents a makefile
 */

class Makefile{

        public:
                /**
                 * Parse an already existing makefile
                 */

                Makefile( const char* filename, std::map<std::string, std::string>* conf );

                /**
                 * Create a new Makefile
                 */

                Makefile( std::map<std::string, std::string>* conf, DirList* dirList  );

                ~Makefile();

                /**
                 * Output a Makefile
                 */

                void writeMakefile();

                /**
                 * Add files to the makefile
                 */

                void addFiles( DirList* dirlist );

        private:
                void write_header();

                void write_variables();

                void write_lists();

                void write_main_targets();

                void write_main_target_list( const std::set<std::string>&, std::string, std::string );

                void write_dependencies();

                void doFork(int);

                void findMainPrograms();

                void findLibraries();

                void write_install_targets();

                void remove_old_files();

                void write_trailer( bool );

                /**
                 * Initialize the makefile variables to their default values
                 */

                void initializeMakefileVariables();

        private:

                //Lists of files
                std::set<std::string> cpp_files; //all C++ files
                std::set<std::string> cpp_main;  //all C++ files with main
                std::set<std::string> cpp_other; //all C++ files with no main
                std::set<std::string> h_files;   //all header files
                std::set<std::string> c_files;   //all C files
                std::set<std::string> c_main;    //all C files with main
                std::set<std::string> c_other;   //all C files with no main
                std::set<std::string> ps_files;  //preprocessed assembly
                std::set<std::string> ps_main;   //preprocessed assembly with main
                std::set<std::string> ps_other;  //preprocessed assembly with no main
                std::set<std::string> s_files;   //assembly
                std::set<std::string> s_main;    //assembly files with main
                std::set<std::string> s_other;   //assembly files with no main
                std::set<std::string> lib_files; //library files(those that start with 'lib')

                std::set<std::string> archive;   //all archive files
       
                std::set<std::string> products;

                std::string cpp_flags;           //preprocessor flags
                std::string c_flags;             // c flags
                std::string cxx_flags;           // c++ flags
                std::string clib_flags;          //c library flags
                std::string cxxlib_flags;        //c++ library flags

                std::map<std::string, std::string> makefileVariables; //Variables that were defined
                                                                        //in the makefile.  These may be
                                                                        //standard variables, or they
                                                                        //may be custom

                std::map<std::string, std::string>* configuration;

};

#endif