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
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();
|
|
}
|
|
}
|
|
|