* 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 this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#ifndef __RBUILD_H
-#define __RBUILD_H
+
+#pragma once
#include "pch.h"
#define DEF_SBAD_SEP "\\"
#endif
-#define MS_VS_DEF_VERSION "7.10"
+#define MS_VS_DEF_VERSION "9.00"
class XmlNode;
class Directory;
class InvokeFile;
class Dependency;
class ImportLibrary;
-class If;
class CompilerFlag;
class LinkerFlag;
class LinkerScript;
class SourceFileTest;
class Metadata;
+class Bootsector;
typedef std::map<std::string,Directory*> directory_map;
bool verbose );
};
+enum DependenciesType
+{
+ NoDependencies,
+ AutomaticDependencies,
+ FullDependencies
+};
+
+enum CompilerSet
+{
+ GnuGcc,
+ MicrosoftC
+};
+
+enum LinkerSet
+{
+ GnuLd,
+ MicrosoftLink
+};
+
+enum SpecFileType
+{
+ None,
+ Spec = 1,
+ PSpec = 2
+};
class Configuration
{
~Configuration ();
bool Verbose;
bool CleanAsYouGo;
- bool AutomaticDependencies;
+ DependenciesType Dependencies;
bool CheckDependenciesForModuleOnly;
bool CompilationUnitsEnabled;
+ bool PrecompiledHeadersEnabled;
std::string CheckDependenciesForModuleOnlyModule;
std::string VSProjectVersion;
std::string VSConfigurationType;
bool MakeHandlesInstallDirectories;
bool GenerateProxyMakefilesInSourceTree;
bool InstallFiles;
+ CompilerSet Compiler;
+ LinkerSet Linker;
};
class Environment
static std::string GetArch ();
static std::string GetIntermediatePath ();
static std::string GetOutputPath ();
+ static std::string GetSourcePath ();
static std::string GetCdOutputPath ();
static std::string GetInstallPath ();
static std::string GetAutomakeFile ( const std::string& defaultFile );
class ParseContext
{
public:
- If* ifData;
CompilationUnit* compilationUnit;
ParseContext ();
};
std::vector<Include*> includes;
std::vector<Define*> defines;
std::vector<Library*> libraries;
- std::vector<Property*> properties;
+ std::map<std::string, Property*> properties;
std::vector<Module*> modules;
std::vector<CompilerFlag*> compilerFlags;
- std::vector<If*> ifs;
int asmFiles; // number of .asm files in compilationUnits
IfableData();
~IfableData();
void ProcessXML();
- void ExtractModules( std::vector<Module*> &modules );
+ void ExtractModules( std::map<std::string, Module*> &modules );
};
class Project
std::vector<LinkerFlag*> linkerFlags;
std::vector<CDFile*> cdfiles;
std::vector<InstallFile*> installfiles;
- std::vector<Module*> modules;
+ std::map<std::string, Module*> modules;
IfableData non_if_data;
+ IfableData host_non_if_data;
+ bool allowWarnings;
+ bool allowWarningsSet;
Project ( const Configuration& configuration,
const std::string& filename,
~Project ();
void SetBackend ( Backend* backend ) { _backend = backend; }
Backend& GetBackend() { return *_backend; }
- void WriteConfigurationFile ();
void ExecuteInvocations ();
void ProcessXML ( const std::string& path );
const Module* LocateModule ( const std::string& name ) const;
const std::string& GetProjectFilename () const;
std::string ResolveProperties ( const std::string& s ) const;
+ const Property* LookupProperty ( const std::string& name ) const;
+ std::string GetCompilerSet () const;
+ std::string GetLinkerSet () const;
+ void GenerateInstallerFileList();
private:
std::string ResolveNextProperty ( const std::string& s ) const;
- const Property* LookupProperty ( const std::string& name ) const;
- void SetConfigurationOption ( char* s,
- std::string name,
- std::string alternativeName );
- void SetConfigurationOption ( char* s,
- std::string name );
void ReadXml ();
void ProcessXMLSubElement ( const XMLElement& e,
const std::string& path,
enum ModuleType
{
- BuildTool = 0,
- StaticLibrary = 1,
- ObjectLibrary = 2,
- Kernel = 3,
- KernelModeDLL = 4,
- KernelModeDriver = 5,
- NativeDLL = 6,
- NativeCUI = 7,
- Win32DLL = 8,
- Win32OCX = 9,
- Win32CUI = 10,
- Win32GUI = 11,
- BootLoader = 12,
- BootSector = 13,
- Iso = 14,
- LiveIso = 15,
- Test = 16,
- RpcServer = 17,
- RpcClient = 18,
- Alias = 19,
- BootProgram = 20,
- Win32SCR = 21,
- IdlHeader = 23,
- IsoRegTest = 24,
- LiveIsoRegTest = 25,
- EmbeddedTypeLib = 26,
- ElfExecutable = 27,
+ BuildTool,
+ StaticLibrary,
+ ObjectLibrary,
+ Kernel,
+ KernelModeDLL,
+ KernelModeDriver,
+ NativeDLL,
+ NativeCUI,
+ Win32DLL,
+ Win32OCX,
+ Win32CUI,
+ Win32GUI,
+ BootLoader,
+ BootSector,
+ Iso,
+ LiveIso,
+ Test,
+ RpcServer,
+ RpcClient,
+ Alias,
+ BootProgram,
+ Win32SCR,
+ IdlHeader,
+ IdlInterface,
+ EmbeddedTypeLib,
+ ElfExecutable,
RpcProxy,
HostStaticLibrary,
- TypeDontCare,
Cabinet,
- KeyboardLayout
+ KeyboardLayout,
+ MessageHeader,
+ TypeDontCare, // always at the end
};
enum HostType
enum CompilerType
{
- CompilerTypeDontCare,
CompilerTypeCC,
+ CompilerTypeCXX,
CompilerTypeCPP,
+ CompilerTypeAS,
+ CompilerTypeMIDL,
+ CompilerTypeRC,
+ CompilerTypeNASM,
+
+ CompilerTypesCount
};
class FileLocation
std::string buildtype;
ModuleType type;
ImportLibrary* importLibrary;
+ ImportLibrary* delayImportLibrary;
Metadata* metadata;
- bool mangledSymbols;
- bool underscoreSymbols;
+ Bootsector* bootSector;
bool isUnicode;
bool isDefaultEntryPoint;
Bootstrap* bootstrap;
std::vector<CompilerFlag*> compilerFlags;
std::vector<LinkerFlag*> linkerFlags;
std::vector<StubbedComponent*> stubbedComponents;
+ std::vector<CDFile*> cdfiles;
LinkerScript* linkerScript;
PchFile* pch;
bool cplusplus;
std::string prefix;
- HostType host;
std::string aliasedModuleName;
bool allowWarnings;
bool enabled;
bool isStartupLib;
+ bool isCRT;
+ std::string CRT;
+ bool dynamicCRT;
+ std::string installbase;
FileLocation *output; // "path/foo.exe"
FileLocation *dependency; // "path/foo.exe" or "path/libfoo.a"
FileLocation *install;
std::string description;
std::string lcid;
+ std::string layoutId;
+ std::string layoutNameResId;
Module ( const Project& project,
const XMLElement& moduleNode,
bool IsDLL () const;
std::string GetPathWithPrefix ( const std::string& prefix ) const; // "path/prefixfoo.exe"
std::string GetPathToBaseDir() const; // "../" offset to rootdirectory
- std::string GetEntryPoint(bool leadingUnderscore) const;
+ std::string GetEntryPoint() const;
void GetTargets ( string_list& ) const;
std::string GetInvocationTarget ( const int index ) const;
bool HasFileWithExtension ( const IfableData&, const std::string& extension ) const;
void InvokeModule () const;
void ProcessXML ();
+ std::string GetDllName() const;
+ SpecFileType IsSpecDefinitionFile () const;
private:
void SetImportLibrary ( ImportLibrary* importLibrary );
+ void SetDelayImportLibrary ( ImportLibrary* importLibrary );
DirectoryLocation GetTargetDirectoryTree () const;
std::string GetDefaultModuleExtension () const;
std::string GetDefaultModuleEntrypoint () const;
std::string GetDefaultModuleBaseaddress () const;
+ std::string GetDefaultModuleCRT () const;
+ bool GetDefaultModuleIsCRT () const;
std::string entrypoint;
void ProcessXMLSubElement ( const XMLElement& e,
DirectoryLocation directory,
const std::string& relative_path,
ParseContext& parseContext );
+ bool GetBooleanAttribute ( const XMLElement& moduleNode,
+ const char * name,
+ bool default_value = false );
};
+class ToolsetDirective
+{
+private:
+ bool enabled;
+
+protected:
+ void ParseToolsets ( const Project& project, const XMLElement& node );
+
+public:
+ virtual ~ToolsetDirective() { }
+ bool IsEnabled () const;
+};
-class Include
+class CompilerDirective
+{
+private:
+ std::bitset<CompilerTypesCount> compilersSet;
+ bool enabled;
+
+protected:
+ void ParseCompilers ( const XMLElement& node, const std::string& defaultValue );
+
+public:
+ CompilerDirective (): enabled ( true ) { }
+ virtual ~CompilerDirective() { }
+ void SetCompiler ( CompilerType compiler );
+ void UnsetCompiler ( CompilerType compiler );
+ void SetAllCompilers ();
+ void UnsetAllCompilers ();
+ bool IsCompilerSet ( CompilerType compiler ) const;
+};
+
+class Include: public CompilerDirective, public ToolsetDirective
{
public:
FileLocation *directory;
const XMLElement* node;
const Module* module;
DirectoryLocation GetDefaultDirectoryTree ( const Module* module ) const;
+ void Initialize ();
};
-class Define
+class Define: public CompilerDirective, public ToolsetDirective
{
public:
const Project& project;
const Module* module;
const XMLElement* node;
std::string name;
+ std::string arguments;
std::string value;
std::string backend;
- bool overridable;
+ bool redefine;
Define ( const Project& project,
const XMLElement& defineNode );
Define ( const Project& project,
const Module* module,
const std::string& name_,
- const std::string& backend_ = "" );
+ const std::string& backend_ = "",
+ bool redefine_ = false );
~Define();
void ProcessXML();
private:
const Module& module;
std::string name;
const Module* importedModule;
+ bool delayimp;
Library ( const XMLElement& _node,
const Module& _module,
void ProcessXML();
};
+class Bootsector
+{
+public:
+ const XMLElement& node;
+ const Module* module;
+ const Module* bootSectorModule;
+
+ Bootsector ( const XMLElement& _node,
+ const Module* _module );
+
+ void ProcessXML();
+private:
+ bool IsSupportedModuleType ( ModuleType type );
+};
+
class Metadata
{
public:
class ImportLibrary : public XmlNode
{
public:
- const Module& module;
+ const Module* module;
std::string dllname;
FileLocation *source;
+ FileLocation *target;
ImportLibrary ( const Project& project,
const XMLElement& node,
- const Module& module );
+ const Module* module,
+ bool delayimp );
~ImportLibrary ();
};
-class If
-{
-public:
- const XMLElement& node;
- const Project& project;
- const Module* module;
- const bool negated;
- std::string property, value;
- IfableData data;
-
- If ( const XMLElement& node_,
- const Project& project_,
- const Module* module_,
- const bool negated_ = false );
- ~If();
-
- void ProcessXML();
-};
-
-
-class CompilerFlag
+class CompilerFlag: public CompilerDirective, public ToolsetDirective
{
public:
const Project& project;
const Module* module;
const XMLElement& node;
std::string flag;
- CompilerType compiler;
CompilerFlag ( const Project& project,
const XMLElement& compilerFlagNode );
};
-class LinkerFlag
+class LinkerFlag: public ToolsetDirective
{
public:
const Project& project;
public:
FileLocation *source;
FileLocation *target;
+ std::string installbase;
InstallFile ( const Project& project,
const XMLElement& bootstrapNode,
extern std::string
ToLower ( std::string filename );
-
-#endif /* __RBUILD_H */