# -c Clean as you go. Delete generated files as soon as they are not needed anymore.
# -d Disable automatic dependencies.
# -mi Let make handle creation of install directories. Rbuild will not generate the directories.
+# -ps Generate proxy makefiles in source tree instead of the output tree.
.PHONY: all
.PHONY: clean
class XMLElement;
+extern std::string working_directory;
+
void
InitWorkingDirectory();
printf ( "done\n" );
}
+string
+MingwBackend::GetProxyMakefileTree () const
+{
+ if ( configuration.GenerateProxyMakefilesInSourceTree )
+ return "";
+ else
+ return Environment::GetOutputPath ();
+}
+
void
MingwBackend::GenerateProxyMakefiles ()
{
printf ( "Generating proxy makefiles..." );
ProxyMakefile proxyMakefile ( ProjectNode );
- proxyMakefile.GenerateProxyMakefiles ( configuration.Verbose );
+ proxyMakefile.GenerateProxyMakefiles ( configuration.Verbose,
+ GetProxyMakefileTree () );
printf ( "done\n" );
}
NormalizeFilename ( module.GetPath () ),
outputDirectory );
OutputInstallTarget ( sourceFilename,
- module.installName,
- module.installBase );
+ module.installName,
+ module.installBase );
}
}
}
std::string GetBin2ResExecutable ();
void UnpackWineResources ();
void GenerateTestSupportCode ();
+ std::string GetProxyMakefileTree () const;
void GenerateProxyMakefiles ();
void CheckAutomaticDependencies ();
bool IncludeDirectoryTarget ( const std::string& directory ) const;
public:
ProxyMakefile ( const Project& project );
~ProxyMakefile ();
- void GenerateProxyMakefiles ( bool verbose );
+ void GenerateProxyMakefiles ( bool verbose,
+ std::string outputTree );
private:
std::string GeneratePathToParentDirectory ( int numberOfParentDirectories );
std::string GetPathToTopDirectory ( Module& module );
+ bool GenerateProxyMakefile ( Module& module );
void GenerateProxyMakefileForModule ( Module& module,
- bool verbose );
+ bool verbose,
+ std::string outputTree );
const Project& project;
};
{
}
+bool
+ProxyMakefile::GenerateProxyMakefile ( Module& module )
+{
+ return module.GenerateInOutputTree ();
+}
+
void
-ProxyMakefile::GenerateProxyMakefiles ( bool verbose )
+ProxyMakefile::GenerateProxyMakefiles ( bool verbose,
+ string outputTree )
{
for ( size_t i = 0; i < project.modules.size (); i++ )
{
- GenerateProxyMakefileForModule ( *project.modules[i],
- verbose );
+ Module& module = *project.modules[i];
+ if ( !module.enabled )
+ continue;
+ if ( !GenerateProxyMakefile ( module ) )
+ continue;
+ GenerateProxyMakefileForModule ( module,
+ verbose,
+ outputTree );
}
}
void
ProxyMakefile::GenerateProxyMakefileForModule ( Module& module,
- bool verbose )
+ bool verbose,
+ string outputTree )
{
char* buf;
char* s;
module.name.c_str () );
}
- string proxyMakefile = NormalizeFilename ( module.GetBasePath () + SSEP "makefile" );
- string pathToTopDirectory = GetPathToTopDirectory ( module );
+ string base;
+ string pathToTopDirectory;
+ if ( outputTree.length () > 0 )
+ {
+ base = outputTree + SSEP + module.GetBasePath ();
+ Path path;
+ pathToTopDirectory = working_directory;
+ }
+ else
+ {
+ base = module.GetBasePath ();
+ pathToTopDirectory = GetPathToTopDirectory ( module );
+ }
+ string proxyMakefile = NormalizeFilename ( base + SSEP "makefile" );
string defaultTarget = module.name;
buf = (char*) malloc ( 10*1024 );
CleanAsYouGo = false;
AutomaticDependencies = true;
MakeHandlesInstallDirectories = false;
+ GenerateProxyMakefilesInSourceTree = false;
}
Configuration::~Configuration ()
__LINE__ );
}
+bool
+Module::GenerateInOutputTree () const
+{
+ switch ( type )
+ {
+ case Kernel:
+ case KernelModeDLL:
+ case NativeDLL:
+ case Win32DLL:
+ case KernelModeDriver:
+ case NativeCUI:
+ case Win32CUI:
+ case Test:
+ case Win32GUI:
+ case BuildTool:
+ case BootLoader:
+ case BootSector:
+ case Iso:
+ case LiveIso:
+ return true;
+ case StaticLibrary:
+ case ObjectLibrary:
+ case RpcServer:
+ case RpcClient:
+ return false;
+ }
+ throw InvalidOperationException ( __FILE__,
+ __LINE__ );
+}
+
string
Module::GetTargetName () const
{
return true;
}
+bool
+ParseProxyMakefileSwitch ( char switchChar2 )
+{
+ switch ( switchChar2 )
+ {
+ case 's':
+ configuration.GenerateProxyMakefilesInSourceTree = true;
+ break;
+ default:
+ printf ( "Unknown switch -p%c",
+ switchChar2 );
+ return false;
+ }
+ return true;
+}
+
bool
ParseSwitch ( int argc, char** argv, int index )
{
break;
case 'm':
return ParseMakeSwitch ( switchChar2 );
+ case 'p':
+ return ParseProxyMakefileSwitch ( switchChar2 );
default:
printf ( "Unknown switch -%c",
switchChar );
printf ( " -d Disable automatic dependencies.\n" );
printf ( " -rfile.xml Name of the root xml file. Default is ReactOS.xml.\n" );
printf ( " -mi Let make handle creation of install directories. Rbuild will not generate the directories.\n" );
+ printf ( " -ps Generate proxy makefiles in source tree instead of the output tree.\n" );
printf ( "\n" );
printf ( " buildsystem Target build system. Can be one of:\n" );
printf ( " mingw MinGW\n" );
bool CleanAsYouGo;
bool AutomaticDependencies;
bool MakeHandlesInstallDirectories;
+ bool GenerateProxyMakefilesInSourceTree;
};
class Environment
const XMLAttribute& attribute );
bool HasImportLibrary () const;
bool IsDLL () const;
+ bool GenerateInOutputTree () const;
std::string GetTargetName () const;
std::string GetDependencyPath () const;
std::string GetBasePath () const;