diff --git a/reactos/tools/rbuild/backend/mingw/mingw.cpp b/reactos/tools/rbuild/backend/mingw/mingw.cpp index 239882a1c60..8d2379863e4 100644 --- a/reactos/tools/rbuild/backend/mingw/mingw.cpp +++ b/reactos/tools/rbuild/backend/mingw/mingw.cpp @@ -41,6 +41,18 @@ v2s ( const string_list& v, int wrap_at ) } +/* static */ string +Environment::GetVariable ( const string& name ) +{ + char* value = getenv ( name.c_str () ); + if ( value != NULL && strlen ( value ) > 0 ) + return ssprintf ( "%s", + value ); + else + return ""; +} + + Directory::Directory ( const string& name_ ) : name(name_) { @@ -119,22 +131,11 @@ 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 ); + const string& environmentVariableValue = Environment::GetVariable ( name ); if ( environmentVariableValue.length () > 0 ) return NormalizeFilename ( environmentVariableValue ); else @@ -283,6 +284,7 @@ MingwBackend::ProcessModules () void MingwBackend::Process () { + DetectCompiler (); DetectPipeSupport (); DetectPCHSupport (); CreateMakefile (); @@ -556,6 +558,45 @@ MingwBackend::GenerateDirectories () printf ( "done\n" ); } +bool +MingwBackend::TryToDetectThisCompiler ( const string& compiler ) +{ + string command = ssprintf ( + "%s -v 2>%s", + compiler.c_str (), + NUL ); + int exitcode = system ( command.c_str () ); + return (exitcode == 0); +} + +void +MingwBackend::DetectCompiler () +{ + printf ( "Detecting compiler..." ); + + bool detectedCompiler = false; + const string& ROS_PREFIXValue = Environment::GetVariable ( "ROS_PREFIX" ); + if ( ROS_PREFIXValue.length () > 0 ) + { + compilerCommand = ROS_PREFIXValue + "-gcc"; + detectedCompiler = TryToDetectThisCompiler ( compilerCommand ); + } + if ( !detectedCompiler ) + { + compilerCommand = "gcc"; + detectedCompiler = TryToDetectThisCompiler ( compilerCommand ); + } + if ( !detectedCompiler ) + { + compilerCommand = "mingw32-gcc"; + detectedCompiler = TryToDetectThisCompiler ( compilerCommand ); + } + if ( detectedCompiler ) + printf ( "detected (%s)\n", compilerCommand.c_str () ); + else + printf ( "not detected\n" ); +} + void MingwBackend::DetectPipeSupport () { @@ -565,7 +606,8 @@ MingwBackend::DetectPipeSupport () string pipe_detectionObjectFilename = ReplaceExtension ( pipe_detection, ".o" ); string command = ssprintf ( - "gcc -pipe -c %s -o %s 2>%s", + "%s -pipe -c %s -o %s 2>%s", + compilerCommand.c_str (), pipe_detection.c_str (), pipe_detectionObjectFilename.c_str (), NUL ); @@ -593,7 +635,8 @@ MingwBackend::DetectPCHSupport () string path = "tools" SSEP "rbuild" SSEP "backend" SSEP "mingw" SSEP "pch_detection.h"; string cmd = ssprintf ( - "gcc -c %s 2>%s", + "%s -c %s 2>%s", + compilerCommand.c_str (), path.c_str (), NUL ); system ( cmd.c_str () ); diff --git a/reactos/tools/rbuild/backend/mingw/mingw.h b/reactos/tools/rbuild/backend/mingw/mingw.h index d370f072ee9..7b9cb6a3f9d 100644 --- a/reactos/tools/rbuild/backend/mingw/mingw.h +++ b/reactos/tools/rbuild/backend/mingw/mingw.h @@ -17,6 +17,14 @@ v2s ( const string_list& v, int wrap_at ); typedef std::map directory_map; + +class Environment +{ +public: + static std::string GetVariable ( const std::string& name ); +}; + + class Directory { public: @@ -51,6 +59,7 @@ public: virtual void Process (); std::string AddDirectoryTarget ( const std::string& directory, Directory* directoryTree ); + std::string compilerCommand; bool usePipe; Directory* intermediateDirectory; Directory* outputDirectory; @@ -73,6 +82,8 @@ private: void GenerateXmlBuildFilesMacro() const; void CheckAutomaticDependencies (); bool IncludeDirectoryTarget ( const std::string& directory ) const; + bool TryToDetectThisCompiler ( const std::string& compiler ); + void DetectCompiler (); void DetectPipeSupport (); void DetectPCHSupport (); void ProcessModules ();