// BuildArgs //------------------------------------------------------------------------------ bool LibraryNode::BuildArgs( Args & fullArgs ) const { Array< AString > tokens( 1024, true ); m_LibrarianArgs.Tokenize( tokens ); const AString * const end = tokens.End(); for ( const AString * it = tokens.Begin(); it!=end; ++it ) { const AString & token = *it; if ( token.EndsWith( "%1" ) ) { // handle /Option:%1 -> /Option:A /Option:B /Option:C AStackString<> pre; if ( token.GetLength() > 2 ) { pre.Assign( token.Get(), token.GetEnd() - 2 ); } // concatenate files, unquoted GetInputFiles( fullArgs, pre, AString::GetEmpty() ); } else if ( token.EndsWith( "\"%1\"" ) ) { // handle /Option:"%1" -> /Option:"A" /Option:"B" /Option:"C" AStackString<> pre( token.Get(), token.GetEnd() - 3 ); // 3 instead of 4 to include quote AStackString<> post( "\"" ); // concatenate files, quoted GetInputFiles( fullArgs, pre, post ); } else if ( token.EndsWith( "%2" ) ) { // handle /Option:%2 -> /Option:A if ( token.GetLength() > 2 ) { fullArgs += AStackString<>( token.Get(), token.GetEnd() - 2 ); } fullArgs += m_Name; } else if ( token.EndsWith( "\"%2\"" ) ) { // handle /Option:"%2" -> /Option:"A" AStackString<> pre( token.Get(), token.GetEnd() - 3 ); // 3 instead of 4 to include quote fullArgs += pre; fullArgs += m_Name; fullArgs += '"'; // post } else { fullArgs += token; } fullArgs.AddDelimiter(); } // orbis-ar.exe requires escaped slashes inside response file if ( GetFlag( LIB_FLAG_ORBIS_AR ) ) { fullArgs.SetEscapeSlashesInResponseFile(); } // Handle all the special needs of args if ( fullArgs.Finalize( m_LibrarianPath, GetName(), CanUseResponseFile() ) == false ) { return false; // Finalize will have emitted an error } return true; }
// BuildArgs //------------------------------------------------------------------------------ bool LinkerNode::BuildArgs( Args & fullArgs ) const { PROFILE_FUNCTION // split into tokens Array< AString > tokens( 1024, true ); m_LinkerOptions.Tokenize( tokens ); const AString * const end = tokens.End(); for ( const AString * it = tokens.Begin(); it!=end; ++it ) { const AString & token = *it; // %1 -> InputFiles const char * found = token.Find( "%1" ); if ( found ) { AStackString<> pre( token.Get(), found ); AStackString<> post( found + 2, token.GetEnd() ); GetInputFiles( fullArgs, pre, post ); fullArgs.AddDelimiter(); continue; } // %2 -> OutputFile found = token.Find( "%2" ); if ( found ) { fullArgs += AStackString<>( token.Get(), found ); fullArgs += m_Name; fullArgs += AStackString<>( found + 2, token.GetEnd() ); fullArgs.AddDelimiter(); continue; } // %3 -> AssemblyResources if ( GetFlag( LINK_FLAG_MSVC ) ) { found = token.Find( "%3" ); if ( found ) { AStackString<> pre( token.Get(), found ); AStackString<> post( found + 2, token.GetEnd() ); GetAssemblyResourceFiles( fullArgs, pre, post ); fullArgs.AddDelimiter(); continue; } } // untouched token fullArgs += token; fullArgs.AddDelimiter(); } // orbis-ld.exe requires escaped slashes inside response file if ( GetFlag( LINK_FLAG_ORBIS_LD ) ) { fullArgs.SetEscapeSlashesInResponseFile(); } // Handle all the special needs of args if ( fullArgs.Finalize( m_Linker, GetName(), CanUseResponseFile() ) == false ) { return false; // Finalize will have emitted an error } return true; }