diff --git a/reactos/Makefile b/reactos/Makefile index b05a0b9c61e..27f9d2ef2f4 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -178,6 +178,13 @@ else endif OUTPUT_ := $(OUTPUT)$(SEP) +ifneq ($(ROS_INSTALL),) + INSTALL := $(ROS_INSTALL) +else + INSTALL := reactos +endif +INSTALL_ := $(INSTALL)$(SEP) + $(INTERMEDIATE): ${mkdir} $@ @@ -186,6 +193,7 @@ $(OUTPUT): ${mkdir} $@ endif + NTOSKRNL_MC = ntoskrnl$(SEP)ntoskrnl.mc KERNEL32_MC = lib$(SEP)kernel32$(SEP)kernel32.mc BUILDNO_H = include$(SEP)reactos$(SEP)buildno.h diff --git a/reactos/tools/rbuild/backend/mingw/mingw.cpp b/reactos/tools/rbuild/backend/mingw/mingw.cpp index 7675cab01e6..320e5e19ef9 100644 --- a/reactos/tools/rbuild/backend/mingw/mingw.cpp +++ b/reactos/tools/rbuild/backend/mingw/mingw.cpp @@ -119,6 +119,28 @@ Directory::ReplaceVariable ( string name, return path; } +string +Directory::GetEnvironmentVariable ( const string& name ) +{ + char* value = getenv ( name.c_str () ); + if ( value != NULL && strlen ( value ) > 0 ) + return ssprintf ( "%s", + value ); + else + return ""; +} + +string +Directory::GetEnvironmentVariablePathOrDefault ( const string& name, + const string& defaultValue ) +{ + const string& environmentVariableValue = GetEnvironmentVariable ( name ); + if ( environmentVariableValue.length () > 0 ) + return NormalizeFilename ( environmentVariableValue ); + else + return defaultValue; +} + string Directory::GetIntermediatePath () { @@ -131,12 +153,20 @@ Directory::GetOutputPath () return "output-i386"; } +string +Directory::GetInstallPath () +{ + return GetEnvironmentVariablePathOrDefault ( "ROS_INSTALL", + "reactos" ); +} + void Directory::ResolveVariablesInPath ( char* buf, string path ) { string s = ReplaceVariable ( "$(INTERMEDIATE)", GetIntermediatePath (), path ); s = ReplaceVariable ( "$(OUTPUT)", GetOutputPath (), s ); + s = ReplaceVariable ( "$(INSTALL)", GetInstallPath (), s ); strcpy ( buf, s.c_str () ); } @@ -181,7 +211,8 @@ public: MingwBackend::MingwBackend ( Project& project, bool verbose ) : Backend ( project, verbose ), intermediateDirectory ( new Directory ("$(INTERMEDIATE)" ) ), - outputDirectory ( new Directory ( "$(OUTPUT)" ) ) + outputDirectory ( new Directory ( "$(OUTPUT)" ) ), + installDirectory ( new Directory ( "$(INSTALL)" ) ) { } @@ -189,6 +220,7 @@ MingwBackend::~MingwBackend() { delete intermediateDirectory; delete outputDirectory; + delete installDirectory; } string @@ -514,15 +546,10 @@ MingwBackend::GenerateDirectories () printf ( "Creating directories..." ); intermediateDirectory->GenerateTree ( "", verbose ); outputDirectory->GenerateTree ( "", verbose ); + installDirectory->GenerateTree ( "", verbose ); printf ( "done\n" ); } -string -FixupTargetFilename ( const string& targetFilename ) -{ - return NormalizeFilename ( targetFilename ); -} - void MingwBackend::DetectPipeSupport () { @@ -551,9 +578,6 @@ MingwBackend::DetectPipeSupport () printf ( "detected\n" ); else printf ( "not detected\n" ); - - // TODO FIXME - eventually check for ROS_USE_PCH env var and - // allow that to override use_pch if true } void @@ -583,30 +607,25 @@ MingwBackend::DetectPCHSupport () printf ( "detected\n" ); else printf ( "not detected\n" ); - - // TODO FIXME - eventually check for ROS_USE_PCH env var and - // allow that to override use_pch if true } void MingwBackend::GetNonModuleInstallTargetFiles ( - string installDirectory, vector& out ) const { for ( size_t i = 0; i < ProjectNode.installfiles.size (); i++ ) { const InstallFile& installfile = *ProjectNode.installfiles[i]; - string targetFilenameNoFixup = installDirectory + SSEP + installfile.base + SSEP + installfile.newname; + string targetFilenameNoFixup = installfile.base + SSEP + installfile.newname; string targetFilename = MingwModuleHandler::PassThruCacheDirectory ( NormalizeFilename ( targetFilenameNoFixup ), - outputDirectory ); + installDirectory ); out.push_back ( targetFilename ); } } void MingwBackend::GetModuleInstallTargetFiles ( - string installDirectory, vector& out ) const { for ( size_t i = 0; i < ProjectNode.modules.size (); i++ ) @@ -614,10 +633,10 @@ MingwBackend::GetModuleInstallTargetFiles ( const Module& module = *ProjectNode.modules[i]; if ( module.installName.length () > 0 ) { - string targetFilenameNoFixup = installDirectory + SSEP + module.installBase + SSEP + module.installName; + string targetFilenameNoFixup = module.installBase + SSEP + module.installName; string targetFilename = MingwModuleHandler::PassThruCacheDirectory ( NormalizeFilename ( targetFilenameNoFixup ), - outputDirectory ); + installDirectory ); out.push_back ( targetFilename ); } } @@ -625,27 +644,23 @@ MingwBackend::GetModuleInstallTargetFiles ( void MingwBackend::GetInstallTargetFiles ( - string installDirectory, vector& out ) const { - GetNonModuleInstallTargetFiles ( installDirectory, - out ); - GetModuleInstallTargetFiles ( installDirectory, - out ); + GetNonModuleInstallTargetFiles ( out ); + GetModuleInstallTargetFiles ( out ); } void -MingwBackend::OutputInstallTarget ( const string& installDirectory, - const string& sourceFilename, +MingwBackend::OutputInstallTarget ( const string& sourceFilename, const string& targetFilename, const string& targetDirectory ) { string normalizedTargetFilename = MingwModuleHandler::PassThruCacheDirectory ( - NormalizeFilename ( installDirectory + SSEP + targetDirectory + SSEP + targetFilename ), - outputDirectory ); + NormalizeFilename ( targetDirectory + SSEP + targetFilename ), + installDirectory ); string normalizedTargetDirectory = MingwModuleHandler::PassThruCacheDirectory ( - NormalizeFilename ( installDirectory + SSEP + targetDirectory ), - outputDirectory ); + NormalizeFilename ( targetDirectory ), + installDirectory ); fprintf ( fMakefile, "%s: %s %s\n", normalizedTargetFilename.c_str (), @@ -660,20 +675,19 @@ MingwBackend::OutputInstallTarget ( const string& installDirectory, } void -MingwBackend::OutputNonModuleInstallTargets ( const string& installDirectory ) +MingwBackend::OutputNonModuleInstallTargets () { for ( size_t i = 0; i < ProjectNode.installfiles.size (); i++ ) { const InstallFile& installfile = *ProjectNode.installfiles[i]; - OutputInstallTarget ( installDirectory, - installfile.GetPath (), + OutputInstallTarget ( installfile.GetPath (), installfile.newname, installfile.base ); } } void -MingwBackend::OutputModuleInstallTargets ( const string& installDirectory ) +MingwBackend::OutputModuleInstallTargets () { for ( size_t i = 0; i < ProjectNode.modules.size (); i++ ) { @@ -683,8 +697,7 @@ MingwBackend::OutputModuleInstallTargets ( const string& installDirectory ) string sourceFilename = MingwModuleHandler::PassThruCacheDirectory ( NormalizeFilename ( module.GetPath () ), outputDirectory ); - OutputInstallTarget ( installDirectory, - sourceFilename, + OutputInstallTarget ( sourceFilename, module.installName, module.installBase ); } @@ -702,11 +715,12 @@ MingwBackend::GetRegistrySourceFiles () } string -MingwBackend::GetRegistryTargetFiles ( const string& installDirectory ) +MingwBackend::GetRegistryTargetFiles () { - string system32ConfigDirectory = MingwModuleHandler::PassThruCacheDirectory ( - NormalizeFilename ( installDirectory + SSEP + "system32" + SSEP "config" ), - outputDirectory ); + string system32ConfigDirectory = NormalizeFilename ( + MingwModuleHandler::PassThruCacheDirectory ( + "system32" SSEP "config" SSEP, + installDirectory ) ); return system32ConfigDirectory + SSEP "default " + system32ConfigDirectory + SSEP "sam " + system32ConfigDirectory + SSEP "security " + @@ -715,14 +729,15 @@ MingwBackend::GetRegistryTargetFiles ( const string& installDirectory ) } void -MingwBackend::OutputRegistryInstallTarget ( const string& installDirectory ) +MingwBackend::OutputRegistryInstallTarget () { - string system32ConfigDirectory = MingwModuleHandler::PassThruCacheDirectory ( - NormalizeFilename ( installDirectory + SSEP + "system32" + SSEP "config" ), - outputDirectory ); + string system32ConfigDirectory = NormalizeFilename ( + MingwModuleHandler::PassThruCacheDirectory ( + "system32" SSEP "config" SSEP, + installDirectory ) ); string registrySourceFiles = GetRegistrySourceFiles (); - string registryTargetFiles = GetRegistryTargetFiles ( installDirectory ); + string registryTargetFiles = GetRegistryTargetFiles (); fprintf ( fMakefile, "install_registry: %s\n", registryTargetFiles.c_str () ); @@ -743,22 +758,16 @@ MingwBackend::OutputRegistryInstallTarget ( const string& installDirectory ) void MingwBackend::GenerateInstallTarget () { - string installDirectoryNoFixup = "reactos"; - string installDirectory = MingwModuleHandler::PassThruCacheDirectory ( - NormalizeFilename ( installDirectoryNoFixup ), - outputDirectory ); vector vInstallTargetFiles; - GetInstallTargetFiles ( installDirectoryNoFixup, - vInstallTargetFiles ); + GetInstallTargetFiles ( vInstallTargetFiles ); string installTargetFiles = v2s ( vInstallTargetFiles, 5 ); fprintf ( fMakefile, - "install: %s %s install_registry\n", - installDirectory.c_str (), + "install: %s install_registry\n", installTargetFiles.c_str () ); - OutputNonModuleInstallTargets ( installDirectoryNoFixup ); - OutputModuleInstallTargets ( installDirectoryNoFixup ); - OutputRegistryInstallTarget ( installDirectoryNoFixup ); + OutputNonModuleInstallTargets (); + OutputModuleInstallTargets (); + OutputRegistryInstallTarget (); fprintf ( fMakefile, "\n" ); } diff --git a/reactos/tools/rbuild/backend/mingw/mingw.h b/reactos/tools/rbuild/backend/mingw/mingw.h index 40ecc1e41a4..d370f072ee9 100644 --- a/reactos/tools/rbuild/backend/mingw/mingw.h +++ b/reactos/tools/rbuild/backend/mingw/mingw.h @@ -31,8 +31,12 @@ private: std::string ReplaceVariable ( std::string name, std::string value, std::string path ); + std::string GetEnvironmentVariable ( const std::string& name ); + std::string GetEnvironmentVariablePathOrDefault ( const std::string& name, + const std::string& defaultValue ); std::string GetIntermediatePath (); std::string GetOutputPath (); + std::string GetInstallPath (); void ResolveVariablesInPath ( char* buf, std::string path ); bool CreateDirectory ( std::string path ); @@ -50,6 +54,7 @@ public: bool usePipe; Directory* intermediateDirectory; Directory* outputDirectory; + Directory* installDirectory; private: void CreateMakefile (); void CloseMakefile () const; @@ -75,26 +80,20 @@ private: std::string GetInstallDirectories ( const std::string& installDirectory ); void GetNonModuleInstallFiles ( std::vector& out ) const; void GetInstallFiles ( std::vector& out ) const; - void GetNonModuleInstallTargetFiles ( std::string installDirectory, - std::vector& out ) const; - void GetModuleInstallTargetFiles ( std::string installDirectory, - std::vector& out ) const; - void GetInstallTargetFiles ( std::string installDirectory, - std::vector& out ) const; - void OutputInstallTarget ( const std::string& installDirectory, - const std::string& sourceFilename, + void GetNonModuleInstallTargetFiles ( std::vector& out ) const; + void GetModuleInstallTargetFiles ( std::vector& out ) const; + void GetInstallTargetFiles ( std::vector& out ) const; + void OutputInstallTarget ( const std::string& sourceFilename, const std::string& targetFilename, const std::string& targetDirectory ); - void OutputNonModuleInstallTargets ( const std::string& installDirectory ); - void OutputModuleInstallTargets ( const std::string& installDirectory ); + void OutputNonModuleInstallTargets (); + void OutputModuleInstallTargets (); std::string GetRegistrySourceFiles (); - std::string GetRegistryTargetFiles ( const std::string& installDirectory ); - void OutputRegistryInstallTarget ( const std::string& installDirectory ); + std::string GetRegistryTargetFiles (); + void OutputRegistryInstallTarget (); void GenerateInstallTarget (); FILE* fMakefile; bool use_pch; }; -std::string FixupTargetFilename ( const std::string& targetFilename ); - #endif /* MINGW_H */ diff --git a/reactos/tools/rbuild/backend/mingw/modulehandler.cpp b/reactos/tools/rbuild/backend/mingw/modulehandler.cpp index 26a749314fb..33f3b9ee898 100644 --- a/reactos/tools/rbuild/backend/mingw/modulehandler.cpp +++ b/reactos/tools/rbuild/backend/mingw/modulehandler.cpp @@ -119,7 +119,7 @@ MingwModuleHandler::GetTargetFilename ( string_list* pclean_files ) { string target = PassThruCacheDirectory ( - FixupTargetFilename ( module.GetPath () ), + NormalizeFilename ( module.GetPath () ), backend->outputDirectory ); if ( pclean_files ) { @@ -135,7 +135,7 @@ MingwModuleHandler::GetImportLibraryFilename ( string_list* pclean_files ) { string target = PassThruCacheDirectory ( - FixupTargetFilename ( module.GetDependencyPath () ), + NormalizeFilename ( module.GetDependencyPath () ), backend->outputDirectory ); if ( pclean_files ) { @@ -1402,11 +1402,11 @@ MingwModuleHandler::GenerateInvocations () const invoke_targets[i].c_str () ); fprintf ( fMakefile, ": %s\n", - FixupTargetFilename ( invoke.invokeModule->GetPath () ).c_str () ); + NormalizeFilename ( invoke.invokeModule->GetPath () ).c_str () ); fprintf ( fMakefile, "\t$(ECHO_INVOKE)\n" ); fprintf ( fMakefile, "\t%s %s\n\n", - FixupTargetFilename ( invoke.invokeModule->GetPath () ).c_str (), + NormalizeFilename ( invoke.invokeModule->GetPath () ).c_str (), invoke.GetParameters ().c_str () ); } } @@ -1932,7 +1932,7 @@ MingwWin32DLLModuleHandler::GenerateExtractWineDLLResourcesTarget () string extension = GetExtension ( file.name ); if ( extension == ".rc" || extension == ".RC" ) { - string resource = FixupTargetFilename ( file.name ); + string resource = NormalizeFilename ( file.name ); fprintf ( fMakefile, "\t$(ECHO_BIN2RES)\n" ); fprintf ( fMakefile, "\t@:echo ${bin2res} -f -x %s\n", resource.c_str () ); @@ -2272,7 +2272,7 @@ MingwIsoModuleHandler::GetBootstrapCdFiles ( { const Module& m = *module.project.modules[i]; if ( m.bootstrap != NULL ) - out.push_back ( FixupTargetFilename ( m.GetPath () ) ); + out.push_back ( NormalizeFilename ( m.GetPath () ) ); } } @@ -2299,13 +2299,13 @@ void MingwIsoModuleHandler::GenerateIsoModuleTarget () { string bootcdDirectory = "cd"; - string isoboot = FixupTargetFilename ( "boot/freeldr/bootsect/isoboot.o" ); + string isoboot = NormalizeFilename ( "boot/freeldr/bootsect/isoboot.o" ); string bootcdReactosNoFixup = bootcdDirectory + "/reactos"; string bootcdReactos = PassThruCacheDirectory ( NormalizeFilename ( bootcdReactosNoFixup ), backend->outputDirectory ); CLEAN_FILE ( bootcdReactos ); - string reactosInf = ros_temp + FixupTargetFilename ( bootcdReactosNoFixup + "/reactos.inf" ); + string reactosInf = ros_temp + NormalizeFilename ( bootcdReactosNoFixup + "/reactos.inf" ); string reactosDff = NormalizeFilename ( "bootdata/packages/reactos.dff" ); string cdDirectories = GetCdDirectories ( bootcdDirectory ); vector vCdFiles; diff --git a/reactos/tools/rbuild/tests/functiontest.cpp b/reactos/tools/rbuild/tests/functiontest.cpp index 269a9913c93..3e766567304 100644 --- a/reactos/tools/rbuild/tests/functiontest.cpp +++ b/reactos/tools/rbuild/tests/functiontest.cpp @@ -4,6 +4,6 @@ using std::string; void FunctionTest::Run () { - string fixedupFilename = FixupTargetFilename ( "." SSEP "dir1" SSEP "dir2" SSEP ".." SSEP "filename.txt" ); + string fixedupFilename = NormalizeFilename ( "." SSEP "dir1" SSEP "dir2" SSEP ".." SSEP "filename.txt" ); ARE_EQUAL ( "dir1" SSEP "filename.txt", fixedupFilename ); }