Counter Strike : Global Offensive Source Code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

317 lines
8.2 KiB

//========= Copyright © 1996-2006, Valve Corporation, All rights reserved. ============//
//
// Purpose: VPC
//
//=====================================================================================//
#include "vpc.h"
static KeywordName_t s_KeywordNameTable[] =
{
{"$General", KEYWORD_GENERAL},
{"$Debugging", KEYWORD_DEBUGGING},
{"$Compiler", KEYWORD_COMPILER},
{"$SNCCompiler", KEYWORD_PS3_SNCCOMPILER},
{"$GCCCompiler", KEYWORD_PS3_GCCCOMPILER},
{"$Librarian", KEYWORD_LIBRARIAN},
{"$Linker", KEYWORD_LINKER},
{"$SNCLinker", KEYWORD_PS3_SNCLINKER},
{"$GCCLinker", KEYWORD_PS3_GCCLINKER},
{"$ManifestTool", KEYWORD_MANIFEST},
{"$XMLDocumentGenerator", KEYWORD_XMLDOCGEN},
{"$BrowseInformation", KEYWORD_BROWSEINFO},
{"$Resources", KEYWORD_RESOURCES},
{"$PreBuildEvent", KEYWORD_PREBUILDEVENT},
{"$PreLinkEvent", KEYWORD_PRELINKEVENT},
{"$PostBuildEvent", KEYWORD_POSTBUILDEVENT},
{"$CustomBuildStep", KEYWORD_CUSTOMBUILDSTEP},
{"$Xbox360ImageConversion", KEYWORD_XBOXIMAGE},
{"$ConsoleDeployment", KEYWORD_XBOXDEPLOYMENT},
};
const char *CVPC::KeywordToName( configKeyword_e keyword )
{
COMPILE_TIME_ASSERT( ARRAYSIZE( s_KeywordNameTable ) == KEYWORD_MAX );
if ( keyword == KEYWORD_UNKNOWN )
{
return "???";
}
return s_KeywordNameTable[keyword].m_pName;
}
configKeyword_e CVPC::NameToKeyword( const char *pKeywordName )
{
COMPILE_TIME_ASSERT( ARRAYSIZE( s_KeywordNameTable ) == KEYWORD_MAX );
for ( int i = 0; i < ARRAYSIZE( s_KeywordNameTable ); i++ )
{
if ( !V_stricmp( pKeywordName, s_KeywordNameTable[i].m_pName ) )
{
return s_KeywordNameTable[i].m_Keyword;
}
}
return KEYWORD_UNKNOWN;
}
//-----------------------------------------------------------------------------
// VPC_Config_Keyword
//
//-----------------------------------------------------------------------------
void VPC_Config_Keyword( configKeyword_e keyword, const char *pkeywordToken )
{
const char *pToken;
bool bShouldSkip = false;
if ( !g_pVPC->GetProjectGenerator()->StartPropertySection( keyword, &bShouldSkip ) )
{
g_pVPC->VPCSyntaxError( "Unsupported Keyword: %s for target platform", pkeywordToken );
}
if ( bShouldSkip )
{
pToken = g_pVPC->GetScript().PeekNextToken( true );
if ( !pToken || !pToken[0] || V_stricmp( pToken, "{" ) )
g_pVPC->VPCSyntaxError();
g_pVPC->GetScript().SkipBracedSection();
}
else
{
pToken = g_pVPC->GetScript().GetToken( true );
if ( !pToken || !pToken[0] || V_stricmp( pToken, "{" ) )
g_pVPC->VPCSyntaxError();
while ( 1 )
{
pToken = g_pVPC->GetScript().GetToken( true );
if ( !pToken || !pToken[0] )
break;
if ( !V_stricmp( pToken, "}" ) )
{
// end of section
break;
}
// Copy off the token name so HandleProperty() doesn't have to (or else the parser will overwrite it on the next token).
char tempTokenName[MAX_PATH];
V_strncpy( tempTokenName, pToken, sizeof( tempTokenName ) );
g_pVPC->GetProjectGenerator()->HandleProperty( tempTokenName );
}
}
g_pVPC->GetProjectGenerator()->EndPropertySection( keyword );
}
//-----------------------------------------------------------------------------
// VPC_Keyword_Configuration
//
//-----------------------------------------------------------------------------
void VPC_Keyword_Configuration()
{
const char *pToken;
char szConfigName[MAX_PATH];
bool bAllowNextLine = false;
int i;
CUtlVector<CUtlString> configs;
char buff[MAX_SYSTOKENCHARS];
while ( 1 )
{
pToken = g_pVPC->GetScript().GetToken( bAllowNextLine );
if ( !pToken || !pToken[0] )
break;
if ( !V_stricmp( pToken, "\\" ) )
{
bAllowNextLine = true;
continue;
}
else
{
bAllowNextLine = false;
}
int index = configs.AddToTail();
configs[index] = pToken;
// check for another optional config
pToken = g_pVPC->GetScript().PeekNextToken( bAllowNextLine );
if ( !pToken || !pToken[0] || !V_stricmp( pToken, "{" ) || !V_stricmp( pToken, "}" ) || (pToken[0] == '$') )
break;
}
// no configuration specified, use all known
if ( !configs.Count() )
{
g_pVPC->GetProjectGenerator()->GetAllConfigurationNames( configs );
if ( !configs.Count() )
{
g_pVPC->VPCError( "Trying to parse a configuration block and no configs have been defined yet.\n[%s line:%d]", g_pVPC->GetScript().GetName(), g_pVPC->GetScript().GetLine() );
}
}
// save parser state
CScriptSource scriptSource = g_pVPC->GetScript().GetCurrentScript();
for ( i=0; i<configs.Count(); i++ )
{
// restore parser state
g_pVPC->GetScript().RestoreScript( scriptSource );
V_strncpy( szConfigName, configs[i].String(), sizeof( szConfigName ) );
// get access objects
g_pVPC->GetProjectGenerator()->StartConfigurationBlock( szConfigName, false );
pToken = g_pVPC->GetScript().GetToken( true );
if ( !pToken || !pToken[0] || V_stricmp( pToken, "{" ) )
{
g_pVPC->VPCSyntaxError();
}
while ( 1 )
{
g_pVPC->GetScript().SkipToValidToken();
if ( !g_pVPC->GetScript().ParsePropertyValue( NULL, buff, sizeof( buff ) ) )
{
g_pVPC->GetScript().SkipBracedSection();
continue;
}
if ( !V_stricmp( buff, "}" ) )
{
// end of section
break;
}
configKeyword_e keyword = g_pVPC->NameToKeyword( buff );
if ( keyword == KEYWORD_UNKNOWN )
{
g_pVPC->VPCSyntaxError();
}
else
{
VPC_Config_Keyword( keyword, buff );
}
}
g_pVPC->GetProjectGenerator()->EndConfigurationBlock();
}
}
//-----------------------------------------------------------------------------
// VPC_Keyword_FileConfiguration
//
//-----------------------------------------------------------------------------
void VPC_Keyword_FileConfiguration()
{
const char *pToken;
char szConfigName[MAX_PATH];
bool bAllowNextLine = false;
char buff[MAX_SYSTOKENCHARS];
CUtlVector< CUtlString > configurationNames;
while ( 1 )
{
pToken = g_pVPC->GetScript().GetToken( bAllowNextLine );
if ( !pToken || !pToken[0] )
break;
if ( !V_stricmp( pToken, "\\" ) )
{
bAllowNextLine = true;
continue;
}
else
{
bAllowNextLine = false;
}
strcpy( szConfigName, pToken );
configurationNames.AddToTail( pToken );
// check for another optional config
pToken = g_pVPC->GetScript().PeekNextToken( bAllowNextLine );
if ( !pToken || !pToken[0] || !V_stricmp( pToken, "{" ) || !V_stricmp( pToken, "}" ) || (pToken[0] == '$') )
break;
}
// no configuration specified, use all known
if ( configurationNames.Count() == 0 )
{
g_pVPC->GetProjectGenerator()->GetAllConfigurationNames( configurationNames );
}
// save parser state
CScriptSource scriptSource = g_pVPC->GetScript().GetCurrentScript();
for ( int i=0; i < configurationNames.Count(); i++ )
{
// restore parser state
g_pVPC->GetScript().RestoreScript( scriptSource );
// Tell the generator we're about to feed it configuration data for this file.
g_pVPC->GetProjectGenerator()->StartConfigurationBlock( configurationNames[i].String(), true );
pToken = g_pVPC->GetScript().GetToken( true );
if ( !pToken || !pToken[0] || V_stricmp( pToken, "{" ) )
{
g_pVPC->VPCSyntaxError();
}
while ( 1 )
{
g_pVPC->GetScript().SkipToValidToken();
pToken = g_pVPC->GetScript().PeekNextToken( true );
if ( pToken && pToken[0] && !V_stricmp( pToken, "$ExcludedFromBuild" ) )
{
pToken = g_pVPC->GetScript().GetToken( true );
if ( !pToken || !pToken[0] )
g_pVPC->VPCSyntaxError();
char buff[MAX_SYSTOKENCHARS];
if ( g_pVPC->GetScript().ParsePropertyValue( NULL, buff, sizeof( buff ) ) )
{
g_pVPC->GetProjectGenerator()->FileExcludedFromBuild( Sys_StringToBool( buff ) );
}
continue;
}
if ( !g_pVPC->GetScript().ParsePropertyValue( NULL, buff, sizeof( buff ) ) )
{
g_pVPC->GetScript().SkipBracedSection();
continue;
}
if ( !V_stricmp( buff, "}" ) )
{
// end of section
break;
}
configKeyword_e keyword = g_pVPC->NameToKeyword( buff );
switch ( keyword )
{
case KEYWORD_COMPILER:
case KEYWORD_PS3_SNCCOMPILER:
case KEYWORD_PS3_GCCCOMPILER:
case KEYWORD_RESOURCES:
case KEYWORD_CUSTOMBUILDSTEP:
VPC_Config_Keyword( keyword, buff );
break;
default:
g_pVPC->VPCSyntaxError();
}
}
g_pVPC->GetProjectGenerator()->EndConfigurationBlock();
}
}