git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3820 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			297 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			297 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        projgen.h
 | |
| // Purpose:     Project generator classes.
 | |
| // Author:      Julian Smart
 | |
| // Modified by:
 | |
| // Created:     04/12/98
 | |
| // RCS-ID:      $Id$
 | |
| // Copyright:   (c) Julian Smart
 | |
| // Licence:     wxWindows licence
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| /*
 | |
| 
 | |
| Description
 | |
| -----------
 | |
| 
 | |
| The top-level object is wxProjectDatabase, which maintains a list of wxProjectGenerator
 | |
| objects. Each wxProjectGenerator object contains a list of wxGeneratorConfiguration objects,
 | |
| and each of these in turn stores a list of variants which represent compiler-specific options in that
 | |
| configuration. wxProjectDatabase also stores a list of generic options (again variants),
 | |
| which may cause compiler-specific options to be stored in configurations.
 | |
| 
 | |
| The usage is like this. The IDE (or other calling application) adds a number of project generators
 | |
| at initialization, one for each kind of compiler. For a new project, the app should call InitializeGenerators
 | |
| in order to call OnInitializeDefaults for each generator, which will call back into the wxProjectDatabase
 | |
| to get user-settable defaults.
 | |
| 
 | |
| The app can then set generic options. When a generic option (such as 'use debug info')
 | |
| is set for a particular configuration, all generator objects are notified via OnSetGenericOption and they
 | |
| translate the generic option into a specific one (for that configuration).
 | |
| 
 | |
| The wxProjectDatabase object can also be used to set compiler-specific options directly if required,
 | |
| but normally this would not be required. Each wxProjectGenerator should also have the opportunity
 | |
| to set initial defaults. These defaults should be editable by the user.
 | |
| 
 | |
| Each wxProjectGenerator can access the parent wxProjectDatabase object at any time, since it
 | |
| may need to make a judgement about several generic settings in order to know what specific
 | |
| compiler options should be set.
 | |
| 
 | |
| TODO: make a list of generic compiler options that each generator should recognise.
 | |
| 
 | |
| */
 | |
| 
 | |
| #ifndef _PROJGEN_H_
 | |
| #define _PROJGEN_H_
 | |
| 
 | |
| #ifdef __GNUG__
 | |
| #pragma interface "projgen.h"
 | |
| #endif
 | |
| 
 | |
| #include "wx/defs.h"
 | |
| #include "wx/string.h"
 | |
| #include "wx/hash.h"
 | |
| #include "wx/variant.h"
 | |
| 
 | |
| typedef enum {
 | |
|   wxPROJECT_CAP_NONE = 0,
 | |
|   wxPROJECT_CAP_MAKEFILE = 1,
 | |
|   wxPROJECT_CAP_PROJECT = 2,
 | |
| } wxProjectCapability;
 | |
| 
 | |
| class wxProjectGenerator;
 | |
| class wxGeneratorConfiguration;
 | |
| 
 | |
| /*
 | |
|  * wxProjectDatabase
 | |
|  * This class maintains a list to all wxProjectGenerator objects, one for
 | |
|  * each compiler.
 | |
|  * Setting a generic option in wxProjectDatabase causes the individual wxProjectGenerator
 | |
|  * objects to set their compiler-specific options for later generation.
 | |
|  */
 | |
| 
 | |
| class wxProjectDatabase: public wxObject
 | |
| {
 | |
| DECLARE_CLASS(wxProjectDatabase)
 | |
| public:
 | |
|     wxProjectDatabase();
 | |
|     ~wxProjectDatabase();
 | |
| 
 | |
| // Operations
 | |
|     // Generate project or makefile for a named compiler. Give an optional compiler version.
 | |
|     virtual bool GenerateProject(const wxString& compiler, const wxString& filename, bool isMakefile, int compilerVersion = 0);
 | |
| 
 | |
|     // This calls each wxProjectGenerator's OnInitializeDefaults function to fill out the
 | |
|     // defaults for each configuration. The generators will probably call back into the wxProjectDatabase
 | |
|     // to get the defaults from a file (see GetDefaultCompilerOptions below).
 | |
|     virtual bool InitializeGenerators();
 | |
| 
 | |
| // Accessors
 | |
|     // Get the capability: can it generate projects, or makefiles, or neither?
 | |
|     virtual wxProjectCapability GetCapability(const wxString& compiler) const ;
 | |
| 
 | |
|     // Override this for your app so that when the wxProjectGenerator initializes its defaults, it
 | |
|     // can call this to get specific option values that may be setup by the user.
 | |
|     virtual wxVariant GetDefaultCompilerOption(const wxString& compiler, const wxString& config, const wxString& option) const ;
 | |
| 
 | |
|     // Gets all the default options for the named compiler/config. Likewise, override this to provide
 | |
|     // a list of defaults to the calling wxProjectGenerator.
 | |
|     virtual wxStringList GetDefaultCompilerOptionList(const wxString& compiler, const wxString& config) const ;
 | |
| 
 | |
| // Compiler/configuration-specific options
 | |
|     // Get a compiler-specific option value from the name.
 | |
|     virtual wxVariant GetCompilerOption(const wxString& compiler, const wxString& config, const wxString& name) const;
 | |
| 
 | |
|     // Set the compiler-specific option
 | |
|     virtual void SetCompilerOption(const wxString& compiler, const wxString& config, const wxString& name, const wxVariant& value);
 | |
| 
 | |
|     // Removes the compiler-specific option
 | |
|     virtual void RemoveCompilerOption(const wxString& compiler, const wxString& config, const wxString& name);
 | |
| 
 | |
|     // Does this option exist?
 | |
|     virtual bool HasCompilerOption(const wxString& compiler, const wxString& config, const wxString& name) const;
 | |
| 
 | |
| // Generic options
 | |
|     // Get a generic option value from the name.
 | |
|     virtual wxVariant GetGenericOption(const wxString& config, const wxString& name) const;
 | |
| 
 | |
|     // Set the generic option value. This calls SetGenericOption for each wxProjectGenerator,
 | |
|     // which will cause compiler-specific values to be placed in the relevant config
 | |
|     virtual void SetGenericOption(const wxString& config, const wxString& name, const wxVariant& value);
 | |
| 
 | |
|     // Removes the generic option.
 | |
|     virtual void RemoveGenericOption(const wxString& config, const wxString& name);
 | |
| 
 | |
|     // Does this option exist?
 | |
|     virtual bool HasGenericOption(const wxString& config, const wxString& name) const;
 | |
| 
 | |
| // Project path
 | |
|     inline void SetProjectPath(const wxString& path) { m_projectPath = path; };
 | |
|     inline wxString GetProjectPath() const { return m_projectPath; };
 | |
| 
 | |
| // Project name
 | |
|     inline void SetProjectName(const wxString& name) { m_projectName = name; };
 | |
|     inline wxString GetProjectName() const { return m_projectName; };
 | |
| 
 | |
| // The source files in the project
 | |
|     // Add a file to the project. Normally this will be relative to the project path.
 | |
|     // TODO: Files are managed within the wxProjectDatabase, but what about extra files
 | |
|     // for specific platforms? Well, let's assume that even on Unix, you'd create a .rc
 | |
|     // file, even if this isn't used in the resulting project/makefile on Unix.
 | |
|     virtual void AddFile(const wxString& filename);
 | |
|     virtual void RemoveFile(const wxString& filename);
 | |
|     virtual bool FileExists(const wxString& filename) const;
 | |
| 
 | |
| // TODO: management of include paths, library paths, libraries
 | |
| 
 | |
| // Generator management
 | |
|     virtual void AddGenerator(wxProjectGenerator* generator) ;
 | |
|     virtual void RemoveGenerator(wxProjectGenerator* generator) ; // Doesn't delete it, just removes it
 | |
|     virtual wxProjectGenerator* FindGenerator(const wxString& compiler) const ;
 | |
|     virtual void ClearGenerators();
 | |
| 
 | |
| protected:
 | |
|     // List of wxProjectGenerator objects
 | |
|     wxList          m_generators;
 | |
| 
 | |
|     // List of compiler-independent configurations, such as "debug".
 | |
|     wxList          m_genericConfigurations;
 | |
| 
 | |
|     // List of source files
 | |
|     wxStringList    m_sourceFiles;
 | |
| 
 | |
|     // List of library paths
 | |
|     wxStringList    m_libraryPaths;
 | |
| 
 | |
|     // List of libraries: TODO this should be compiler-specific, surely?
 | |
|     wxStringList    m_libraries;
 | |
| 
 | |
|     // List of include paths
 | |
|     wxStringList    m_includePaths;
 | |
| 
 | |
|     // Project path
 | |
|     wxString        m_projectPath;
 | |
| 
 | |
|     // Project name
 | |
|     wxString        m_projectName;
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * wxGeneratorConfiguration
 | |
|  * A configuration, e.g. "debug", "release"
 | |
|  */
 | |
| 
 | |
| class wxGeneratorConfiguration: public wxObject
 | |
| {
 | |
| DECLARE_CLASS(wxGeneratorConfiguration)
 | |
| public:
 | |
|     wxGeneratorConfiguration(const wxString& name);
 | |
|     ~wxGeneratorConfiguration();
 | |
| 
 | |
|     // Does this option exist?
 | |
|     virtual bool HasOption(const wxString& name) const;
 | |
| 
 | |
|     // Find option: returns NULL if there is no such option.
 | |
|     wxVariant* FindOption(const wxString& name) const;
 | |
| 
 | |
|     // Get an option value
 | |
|     virtual wxVariant GetOption(const wxString& name) const;
 | |
| 
 | |
|     // Set the option
 | |
|     virtual void SetOption(const wxString& name, const wxVariant& value);
 | |
| 
 | |
|     // Remove the option
 | |
|     virtual void RemoveOption(const wxString& name);
 | |
| 
 | |
|     // Does this option exist?
 | |
|     virtual bool HasOption(const wxString& name) const;
 | |
| 
 | |
|     // Get the list of options
 | |
|     inline const wxList& GetOptions() const { return m_options; }
 | |
| 
 | |
|     inline void SetName(const wxString& name) { m_name = name; }
 | |
|     inline wxString GetName() const { return m_name; }
 | |
| 
 | |
| protected:
 | |
|     // Configuration name
 | |
|     wxString    m_name;
 | |
| 
 | |
|     // List of wxVariants
 | |
|     wxList      m_options;
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * wxProjectGenerator.
 | |
|  * Only derived classes can be instantiated.
 | |
|  */
 | |
| 
 | |
| class wxProjectGenerator: public wxObject
 | |
| {
 | |
| DECLARE_CLASS(wxProjectGenerator)
 | |
| public:
 | |
|     wxProjectGenerator(const wxString& name, wxProjectDatabase* topLevel);
 | |
|     ~wxProjectGenerator();
 | |
| 
 | |
| // Operations
 | |
|     // Generate project or makefile. Give an optional compiler version.
 | |
|     virtual bool GenerateProject(bool isMakefile, int compilerVersion = 0) = 0;
 | |
| 
 | |
|     // Called when the defaults should be initialized.
 | |
|     // It would recognise e.g. the "Debug" configuration name and set specific defaults, possibly
 | |
|     // reading them from a database to allow for tailoring.
 | |
|     // It is likely to call wxProjectDatabase::GetDefaultCompilerOption.
 | |
|     virtual bool OnInitializeDefaults(const wxString& config) = 0;
 | |
| 
 | |
|     // This is called by wxProjectDatabase::SetGenericOption, and it tells this object
 | |
|     // to translate it to a specific option. Then this object will (probably) call SetOption.
 | |
|     virtual bool OnSetGenericOption(const wxString& config, const wxString& name, const wxVariant& value) = 0;
 | |
| 
 | |
| // Accessors
 | |
|     // Get the capability: can it generate projects, or makefiles, or neither?
 | |
|     virtual wxProjectCapability GetCapability() const = 0;
 | |
| 
 | |
|     // Name
 | |
|     inline void SetName(const wxString& name) { m_name = name; }
 | |
|     inline wxString GetName() const { return m_name; }
 | |
| 
 | |
|     // Top-level wxProjectDatabase object
 | |
|     inline void SetTopLevel(wxProjectDatabase* topLevel) { m_topLevel = topLevel; }
 | |
|     inline wxProjectDatabase* GetTopLevel() const { return m_topLevel; }
 | |
| 
 | |
| // Options
 | |
|     // Get an option value
 | |
|     virtual wxVariant GetOption(const wxString& config, const wxString& name) const;
 | |
| 
 | |
|     // Set the option
 | |
|     virtual void SetOption(const wxString& config, const wxString& name, const wxVariant& value);
 | |
| 
 | |
|     // Remove the option
 | |
|     virtual void RemoveOption(const wxString& config, const wxString& name);
 | |
| 
 | |
|     // Does this option exist?
 | |
|     virtual bool HasOption(const wxString& name) const;
 | |
| 
 | |
|     // Get the list of options
 | |
|     inline const wxList& GetConfigurations() const { return m_configs; }
 | |
| 
 | |
| // Configuration management
 | |
|     wxGeneratorConfiguation* FindConfiguration(const wxString& config) const ;
 | |
|     void AddConfiguration(wxGeneratorConfiguration* config) ;
 | |
|     void RemoveConfiguration(wxGeneratorConfiguration* config) ;
 | |
|     void ClearConfigurations() ;
 | |
| 
 | |
| protected:
 | |
|     // List of wxGeneratorConfiguration objects
 | |
|     wxList                  m_configs;
 | |
| 
 | |
|     // Compiler name
 | |
|     wxString                m_name;
 | |
| 
 | |
|     // Top-level object
 | |
|     wxProjectDatabase*      m_topLevel;
 | |
| };
 | |
| 
 | |
| #endif
 | |
|     // projgen.h
 | |
| 
 |