mirror of
https://github.com/YGGverse/hlsdk-portable.git
synced 2025-01-24 05:34:18 +00:00
Merge branch 'master' into opfor-update
This commit is contained in:
commit
97264225cf
@ -77,7 +77,7 @@ void WeaponsResource::LoadWeaponSprites( WEAPON *pWeapon )
|
||||
else
|
||||
iRes = 640;
|
||||
|
||||
char sz[128];
|
||||
char sz[256];
|
||||
|
||||
if( !pWeapon )
|
||||
return;
|
||||
|
@ -204,7 +204,7 @@ int CHudDeathNotice::MsgFunc_DeathMsg( const char *pszName, int iSize, void *pbu
|
||||
// Get the Victim's name
|
||||
const char *victim_name = "";
|
||||
// If victim is -1, the killer killed a specific, non-player object (like a sentrygun)
|
||||
if( ( (char)victim ) != -1 )
|
||||
if( ( (signed char)victim ) != -1 )
|
||||
victim_name = g_PlayerInfoList[victim].name;
|
||||
if( !victim_name )
|
||||
{
|
||||
@ -219,7 +219,7 @@ int CHudDeathNotice::MsgFunc_DeathMsg( const char *pszName, int iSize, void *pbu
|
||||
}
|
||||
|
||||
// Is it a non-player object kill?
|
||||
if( ( (char)victim ) == -1 )
|
||||
if( ( (signed char)victim ) == -1 )
|
||||
{
|
||||
rgDeathNoticeList[i].iNonPlayerKill = TRUE;
|
||||
|
||||
|
@ -820,7 +820,7 @@ bool CHudSpectator::IsActivePlayer( cl_entity_t *ent )
|
||||
|
||||
bool CHudSpectator::ParseOverviewFile()
|
||||
{
|
||||
char filename[255] = { 0 };
|
||||
char filename[512] = { 0 };
|
||||
char levelname[255] = { 0 };
|
||||
char token[1024] = { 0 };
|
||||
float height;
|
||||
@ -842,7 +842,7 @@ bool CHudSpectator::ParseOverviewFile()
|
||||
m_OverviewData.layersHeights[0] = 0.0f;
|
||||
strcpy( m_OverviewData.map, gEngfuncs.pfnGetLevelName() );
|
||||
|
||||
if( strlen( m_OverviewData.map ) == 0 )
|
||||
if( m_OverviewData.map[0] == '\0' )
|
||||
return false; // not active yet
|
||||
|
||||
strcpy( levelname, m_OverviewData.map + 5 );
|
||||
|
@ -169,7 +169,7 @@ int KB_ConvertString( char *in, char **ppout )
|
||||
*pEnd = '\0';
|
||||
|
||||
pBinding = NULL;
|
||||
if( strlen( binding + 1 ) > 0 )
|
||||
if( binding[1] != '\0' )
|
||||
{
|
||||
// See if there is a binding for binding?
|
||||
pBinding = gEngfuncs.Key_LookupBinding( binding + 1 );
|
||||
|
@ -48,7 +48,7 @@ def build(bld):
|
||||
if bld.env.GOLDSRC:
|
||||
libs += ['DL']
|
||||
|
||||
if bld.env.DEST_OS2 not in ['android']:
|
||||
if bld.env.DEST_OS not in ['android']:
|
||||
install_path = os.path.join(bld.env.GAMEDIR, bld.env.CLIENT_DIR)
|
||||
else:
|
||||
install_path = bld.env.PREFIX
|
||||
|
@ -203,7 +203,7 @@ void SequencePrecache( void *pmodel, const char *pSequenceName )
|
||||
// of it's name if it is.
|
||||
if( IsSoundEvent( pevent[i].event ) )
|
||||
{
|
||||
if( !strlen( pevent[i].options ) )
|
||||
if( pevent[i].options[0] == '\0' )
|
||||
{
|
||||
ALERT( at_error, "Bad sound event %d in sequence %s :: %s (sound is \"%s\")\n", pevent[i].event, pstudiohdr->name, pSequenceName, pevent[i].options );
|
||||
}
|
||||
|
@ -434,7 +434,7 @@ void CFuncRotating::Precache( void )
|
||||
BOOL NullSound = FALSE;
|
||||
|
||||
// set up fan sounds
|
||||
if( !FStringNull( pev->message ) && strlen( szSoundFile ) > 0 )
|
||||
if( !FStringNull( pev->message ) && szSoundFile[0] != '\0' )
|
||||
{
|
||||
// if a path is set for a wave, use it
|
||||
}
|
||||
|
@ -694,7 +694,7 @@ CBaseButton::BUTTON_CODE CBaseButton::ButtonResponseToTouch( void )
|
||||
void CBaseButton::ButtonTouch( CBaseEntity *pOther )
|
||||
{
|
||||
// Ignore touches by anything but players
|
||||
if( !FClassnameIs( pOther->pev, "player" ) )
|
||||
if( !pOther->IsPlayer() )
|
||||
return;
|
||||
|
||||
m_hActivator = pOther;
|
||||
|
@ -520,10 +520,8 @@ void CBaseDoor::Precache( void )
|
||||
//
|
||||
void CBaseDoor::DoorTouch( CBaseEntity *pOther )
|
||||
{
|
||||
entvars_t *pevToucher = pOther->pev;
|
||||
|
||||
// Ignore touches by anything but players
|
||||
if( !FClassnameIs( pevToucher, "player" ) )
|
||||
if( !pOther->IsPlayer() )
|
||||
return;
|
||||
|
||||
// If door has master, and it's not ready to trigger,
|
||||
@ -542,7 +540,7 @@ void CBaseDoor::DoorTouch( CBaseEntity *pOther )
|
||||
|
||||
m_hActivator = pOther;// remember who activated the door
|
||||
|
||||
if( DoorActivate())
|
||||
if( DoorActivate() )
|
||||
SetTouch( NULL ); // Temporarily disable the touch function, until movement is finished.
|
||||
}
|
||||
|
||||
|
@ -106,8 +106,12 @@ void CRecharge::Precache()
|
||||
|
||||
void CRecharge::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
|
||||
{
|
||||
// Make sure that we have a caller
|
||||
if( !pActivator )
|
||||
return;
|
||||
|
||||
// if it's not a player, ignore
|
||||
if( !FClassnameIs( pActivator->pev, "player" ) )
|
||||
if( !pActivator->IsPlayer() )
|
||||
return;
|
||||
|
||||
// if there is no juice left, turn it off
|
||||
@ -135,16 +139,8 @@ void CRecharge::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use
|
||||
if( m_flNextCharge >= gpGlobals->time )
|
||||
return;
|
||||
|
||||
// Make sure that we have a caller
|
||||
if( !pActivator )
|
||||
return;
|
||||
|
||||
m_hActivator = pActivator;
|
||||
|
||||
//only recharge the player
|
||||
if( !m_hActivator->IsPlayer() )
|
||||
return;
|
||||
|
||||
// Play the on sound or the looping charging sound
|
||||
if( !m_iOn )
|
||||
{
|
||||
@ -152,6 +148,7 @@ void CRecharge::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE use
|
||||
EMIT_SOUND( ENT( pev ), CHAN_ITEM, "items/suitchargeok1.wav", 0.85, ATTN_NORM );
|
||||
m_flSoundTime = 0.56 + gpGlobals->time;
|
||||
}
|
||||
|
||||
if( ( m_iOn == 1 ) && ( m_flSoundTime <= gpGlobals->time ) )
|
||||
{
|
||||
m_iOn++;
|
||||
|
@ -1373,7 +1373,8 @@ int ReloadMapCycleFile( const char *filename, mapcycle_t *cycle )
|
||||
hasbuffer = 0;
|
||||
|
||||
pFileList = COM_Parse( pFileList );
|
||||
if( strlen( com_token ) <= 0 )
|
||||
|
||||
if( com_token[0] == '\0' )
|
||||
break;
|
||||
|
||||
strcpy( szMap, com_token );
|
||||
@ -1382,7 +1383,8 @@ int ReloadMapCycleFile( const char *filename, mapcycle_t *cycle )
|
||||
if( COM_TokenWaiting( pFileList ) )
|
||||
{
|
||||
pFileList = COM_Parse( pFileList );
|
||||
if( strlen( com_token ) > 0 )
|
||||
|
||||
if( com_token[0] != '\0' )
|
||||
{
|
||||
hasbuffer = 1;
|
||||
strcpy( szBuffer, com_token );
|
||||
@ -1538,7 +1540,8 @@ void ExtractCommandString( char *s, char *szCommand )
|
||||
*o = 0;
|
||||
|
||||
strcat( szCommand, pkey );
|
||||
if( strlen( value ) > 0 )
|
||||
|
||||
if( value[0] != '\0' )
|
||||
{
|
||||
strcat( szCommand, " " );
|
||||
strcat( szCommand, value );
|
||||
@ -1673,13 +1676,15 @@ void CHalfLifeMultiplay::ChangeLevel( void )
|
||||
{
|
||||
ALERT( at_console, "PLAYER COUNT: min %i max %i current %i\n", minplayers, maxplayers, curplayers );
|
||||
}
|
||||
if( strlen( szRules ) > 0 )
|
||||
|
||||
if( szRules[0] != '\0' )
|
||||
{
|
||||
ALERT( at_console, "RULES: %s\n", szRules );
|
||||
}
|
||||
|
||||
CHANGE_LEVEL( szNextMap, NULL );
|
||||
if( strlen( szCommands ) > 0 )
|
||||
|
||||
if( szCommands[0] != '\0' )
|
||||
{
|
||||
SERVER_COMMAND( szCommands );
|
||||
}
|
||||
|
@ -724,7 +724,7 @@ void CNihilanth::NextActivity()
|
||||
|
||||
if( ( pev->health < gSkillData.nihilanthHealth / 2 || m_iActiveSpheres < N_SPHERES / 2 ) && m_hRecharger == 0 && m_iLevel <= 9 )
|
||||
{
|
||||
char szName[64];
|
||||
char szName[128];
|
||||
|
||||
CBaseEntity *pEnt = NULL;
|
||||
CBaseEntity *pRecharger = NULL;
|
||||
@ -772,7 +772,7 @@ void CNihilanth::NextActivity()
|
||||
|
||||
if( iseq != pev->sequence )
|
||||
{
|
||||
char szText[64];
|
||||
char szText[128];
|
||||
|
||||
sprintf( szText, "%s%d", m_szDrawUse, m_iLevel );
|
||||
FireTargets( szText, this, this, USE_ON, 1.0 );
|
||||
@ -820,7 +820,7 @@ void CNihilanth::NextActivity()
|
||||
}
|
||||
else
|
||||
{
|
||||
char szText[64];
|
||||
char szText[128];
|
||||
|
||||
sprintf( szText, "%s%d", m_szTeleportTouch, m_iTeleport );
|
||||
CBaseEntity *pTouch = UTIL_FindEntityByTargetname( NULL, szText );
|
||||
@ -1100,7 +1100,7 @@ void CNihilanth::HandleAnimEvent( MonsterEvent_t *pEvent )
|
||||
// prayer
|
||||
if( m_hEnemy != 0 )
|
||||
{
|
||||
char szText[32];
|
||||
char szText[128];
|
||||
|
||||
sprintf( szText, "%s%d", m_szTeleportTouch, m_iTeleport );
|
||||
CBaseEntity *pTouch = UTIL_FindEntityByTargetname( NULL, szText );
|
||||
|
@ -358,8 +358,7 @@ void CPlatTrigger::SpawnInsideTrigger( CFuncPlat *pPlatform )
|
||||
void CPlatTrigger::Touch( CBaseEntity *pOther )
|
||||
{
|
||||
// Ignore touches by non-players
|
||||
entvars_t *pevToucher = pOther->pev;
|
||||
if( !FClassnameIs( pevToucher, "player" ) )
|
||||
if( !pOther->IsPlayer() )
|
||||
return;
|
||||
|
||||
CFuncPlat *pPlatform = (CFuncPlat*)(CBaseEntity*)m_hPlatform;
|
||||
|
@ -2964,7 +2964,7 @@ edict_t *EntSelectSpawnPoint( CBaseEntity *pPlayer )
|
||||
}
|
||||
}
|
||||
// If startspot is set, (re)spawn there.
|
||||
if( FStringNull( gpGlobals->startspot ) || !strlen(STRING( gpGlobals->startspot ) ) )
|
||||
if( FStringNull( gpGlobals->startspot ) || (STRING( gpGlobals->startspot ) )[0] == '\0')
|
||||
{
|
||||
pSpot = UTIL_FindEntityByClassname( NULL, "info_player_start" );
|
||||
if( !FNullEnt( pSpot ) )
|
||||
@ -4659,7 +4659,7 @@ void CBasePlayer::DropPlayerItem( char *pszItemName )
|
||||
return;
|
||||
}
|
||||
|
||||
if( !strlen( pszItemName ) )
|
||||
if( pszItemName[0] == '\0' )
|
||||
{
|
||||
// if this string has no length, the client didn't type a name!
|
||||
// assume player wants to drop the active item.
|
||||
|
@ -535,6 +535,9 @@ void CRpg::UpdateSpot( void )
|
||||
#ifndef CLIENT_DLL
|
||||
if( m_fSpotActive )
|
||||
{
|
||||
if (m_pPlayer->pev->viewmodel == 0)
|
||||
return;
|
||||
|
||||
if( !m_pSpot )
|
||||
{
|
||||
m_pSpot = CLaserSpot::CreateSpot();
|
||||
|
@ -1069,14 +1069,17 @@ BOOL CScriptedSentence::AcceptableSpeaker( CBaseMonster *pMonster )
|
||||
{
|
||||
if( pev->spawnflags & SF_SENTENCE_FOLLOWERS )
|
||||
{
|
||||
if( pMonster->m_hTargetEnt == 0 || !FClassnameIs( pMonster->m_hTargetEnt->pev, "player" ) )
|
||||
if( pMonster->m_hTargetEnt == 0 || !pMonster->m_hTargetEnt->IsPlayer() )
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL override;
|
||||
|
||||
if( pev->spawnflags & SF_SENTENCE_INTERRUPT )
|
||||
override = TRUE;
|
||||
else
|
||||
override = FALSE;
|
||||
|
||||
if( pMonster->CanPlaySentence( override ) )
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -184,7 +184,7 @@ void CAmbientGeneric::Spawn( void )
|
||||
|
||||
const char *szSoundFile = STRING( pev->message );
|
||||
|
||||
if( FStringNull( pev->message ) || strlen( szSoundFile ) < 1 )
|
||||
if( FStringNull( pev->message ) || szSoundFile[0] == '\0' )
|
||||
{
|
||||
ALERT( at_error, "EMPTY AMBIENT AT: %f, %f, %f\n", pev->origin.x, pev->origin.y, pev->origin.z );
|
||||
pev->nextthink = gpGlobals->time + 0.1;
|
||||
@ -218,7 +218,7 @@ void CAmbientGeneric::Precache( void )
|
||||
{
|
||||
const char *szSoundFile = STRING( pev->message );
|
||||
|
||||
if( !FStringNull( pev->message ) && strlen( szSoundFile ) > 1 )
|
||||
if( !FStringNull( pev->message ) && szSoundFile[0] != '\0' )
|
||||
{
|
||||
if( *szSoundFile != '!' )
|
||||
PRECACHE_SOUND( szSoundFile );
|
||||
@ -1281,9 +1281,9 @@ void SENTENCEG_Init()
|
||||
if( !buffer[j] )
|
||||
continue;
|
||||
|
||||
if( gcallsentences > CVOXFILESENTENCEMAX )
|
||||
if( gcallsentences >= CVOXFILESENTENCEMAX )
|
||||
{
|
||||
ALERT( at_error, "Too many sentences in sentences.txt!\n" );
|
||||
ALERT( at_error, "Too many sentences in sentences.txt! >%d\n", gcallsentences );
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1740,7 +1740,7 @@ void CSpeaker::Spawn( void )
|
||||
{
|
||||
const char *szSoundFile = STRING( pev->message );
|
||||
|
||||
if( !m_preset && ( FStringNull( pev->message ) || strlen( szSoundFile ) < 1 ) )
|
||||
if( !m_preset && ( FStringNull( pev->message ) || szSoundFile[0] == '\0' ) )
|
||||
{
|
||||
ALERT( at_error, "SPEAKER with no Level/Sentence! at: %f, %f, %f\n", pev->origin.x, pev->origin.y, pev->origin.z );
|
||||
pev->nextthink = gpGlobals->time + 0.1;
|
||||
|
@ -108,13 +108,6 @@ void CBaseEntity::UpdateOnRemove( void )
|
||||
|
||||
if( pev->globalname )
|
||||
gGlobalState.EntitySetState( pev->globalname, GLOBAL_DEAD );
|
||||
|
||||
// tell owner ( if any ) that we're dead.This is mostly for MonsterMaker functionality.
|
||||
//Killtarget didn't do this before, so the counter broke. - Solokiller
|
||||
if( CBaseEntity* pOwner = pev->owner ? Instance( pev->owner ) : 0 )
|
||||
{
|
||||
pOwner->DeathNotice( pev );
|
||||
}
|
||||
}
|
||||
|
||||
// Convenient way to delay removing oneself
|
||||
|
@ -52,14 +52,14 @@ CHalfLifeTeamplay::CHalfLifeTeamplay()
|
||||
if( teamoverride.value )
|
||||
{
|
||||
const char *pTeamList = STRING( pWorld->v.team );
|
||||
if( pTeamList && strlen( pTeamList ) )
|
||||
if( pTeamList && pTeamList[0] != '\0' )
|
||||
{
|
||||
strncpy( m_szTeamList, pTeamList, TEAMPLAY_TEAMLISTLENGTH );
|
||||
}
|
||||
}
|
||||
}
|
||||
// Has the server set teams
|
||||
if( strlen( m_szTeamList ) )
|
||||
if( m_szTeamList[0] != '\0' )
|
||||
m_teamLimit = TRUE;
|
||||
else
|
||||
m_teamLimit = FALSE;
|
||||
|
@ -1087,7 +1087,7 @@ void CBaseTrigger::ActivateMultiTrigger( CBaseEntity *pActivator )
|
||||
if( pev->nextthink > gpGlobals->time )
|
||||
return; // still waiting for reset time
|
||||
|
||||
if( !UTIL_IsMasterTriggered( m_sMaster,pActivator ) )
|
||||
if( !UTIL_IsMasterTriggered( m_sMaster, pActivator ) )
|
||||
return;
|
||||
|
||||
if( FClassnameIs( pev, "trigger_secret" ) )
|
||||
@ -1154,7 +1154,7 @@ void CBaseTrigger::CounterUse( CBaseEntity *pActivator, CBaseEntity *pCaller, US
|
||||
|
||||
BOOL fTellActivator =
|
||||
( m_hActivator != 0 ) &&
|
||||
FClassnameIs( m_hActivator->pev, "player" ) &&
|
||||
m_hActivator->IsPlayer() &&
|
||||
!FBitSet( pev->spawnflags, SPAWNFLAG_NOMESSAGE );
|
||||
if( m_cTriggersLeft != 0 )
|
||||
{
|
||||
@ -1462,7 +1462,7 @@ void CChangeLevel::ChangeLevelNow( CBaseEntity *pActivator )
|
||||
//
|
||||
void CChangeLevel::TouchChangeLevel( CBaseEntity *pOther )
|
||||
{
|
||||
if( !FClassnameIs( pOther->pev, "player" ) )
|
||||
if( !pOther->IsPlayer() )
|
||||
return;
|
||||
|
||||
ChangeLevelNow( pOther );
|
||||
|
@ -2219,7 +2219,7 @@ int CRestore::ReadField( void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCou
|
||||
pString++;
|
||||
}
|
||||
pInputData = pString;
|
||||
if( strlen( (char *)pInputData ) == 0 )
|
||||
if( ( (char *)pInputData )[0] == '\0' )
|
||||
*( (string_t *)pOutputData ) = 0;
|
||||
else
|
||||
{
|
||||
@ -2314,7 +2314,7 @@ int CRestore::ReadField( void *pBaseData, TYPEDESCRIPTION *pFields, int fieldCou
|
||||
*( (void**)pOutputData ) = *(void **)pInputData;
|
||||
break;
|
||||
case FIELD_FUNCTION:
|
||||
if( strlen( (char *)pInputData ) == 0 )
|
||||
if( ( (char *)pInputData )[0] == '\0' )
|
||||
*( (void**)pOutputData ) = 0;
|
||||
else
|
||||
*( (void**)pOutputData ) = (void*)FUNCTION_FROM_NAME( (char *)pInputData );
|
||||
|
@ -54,7 +54,7 @@ def build(bld):
|
||||
|
||||
libs = []
|
||||
|
||||
if bld.env.DEST_OS2 not in ['android']:
|
||||
if bld.env.DEST_OS not in ['android']:
|
||||
install_path = os.path.join(bld.env.GAMEDIR, bld.env.SERVER_DIR)
|
||||
else:
|
||||
install_path = bld.env.PREFIX
|
||||
|
49
scripts/waifulib/strip_on_install.py
Normal file
49
scripts/waifulib/strip_on_install.py
Normal file
@ -0,0 +1,49 @@
|
||||
#! /usr/bin/env python
|
||||
# Modified: Alibek Omarov <a1ba.omarov@gmail.com>
|
||||
# Originally taken from Thomas Nagy's blogpost
|
||||
|
||||
"""
|
||||
Strip executables upon installation
|
||||
"""
|
||||
|
||||
import shutil, os
|
||||
from waflib import Build, Utils, Context, Errors, Logs
|
||||
|
||||
def options(opt):
|
||||
grp = opt.option_groups['install/uninstall options']
|
||||
grp.add_option('--no-strip', dest='no_strip', action='store_true', default=False,
|
||||
help='don\'t strip binaries. You must pass this flag to install command(default: False)')
|
||||
|
||||
def configure(conf):
|
||||
if conf.env.DEST_BINFMT in ['elf', 'mac-o']:
|
||||
conf.find_program('strip', var='STRIP')
|
||||
if not conf.env.STRIPFLAGS:
|
||||
conf.env.STRIPFLAGS = os.environ['STRIPFLAGS'] if 'STRIPFLAGS' in os.environ else []
|
||||
|
||||
def copy_fun(self, src, tgt):
|
||||
inst_copy_fun(self, src, tgt)
|
||||
|
||||
if self.generator.bld.options.no_strip:
|
||||
return
|
||||
|
||||
if self.env.DEST_BINFMT not in ['elf', 'mac-o']: # don't strip unknown formats or PE
|
||||
return
|
||||
|
||||
if getattr(self.generator, 'link_task', None) and self.generator.link_task.outputs[0] in self.inputs:
|
||||
cmd = self.env.STRIP + self.env.STRIPFLAGS + [tgt]
|
||||
try:
|
||||
self.generator.bld.cmd_and_log(cmd, output=Context.BOTH, quiet=Context.BOTH)
|
||||
if not self.generator.bld.progress_bar:
|
||||
c1 = Logs.colors.NORMAL
|
||||
c2 = Logs.colors.CYAN
|
||||
|
||||
f1 = os.path.getsize(src)
|
||||
f2 = os.path.getsize(tgt)
|
||||
|
||||
Logs.info('%s+ strip %s%s%s (%d bytes change)', c1, c2, tgt, c1, f2 - f1)
|
||||
except Errors.WafError as e:
|
||||
print(e.stdout, e.stderr)
|
||||
|
||||
inst_copy_fun = Build.inst.copy_fun
|
||||
Build.inst.copy_fun = copy_fun
|
||||
|
@ -13,41 +13,45 @@
|
||||
|
||||
try: from fwgslib import get_flags_by_compiler
|
||||
except: from waflib.extras.fwgslib import get_flags_by_compiler
|
||||
from waflib import Logs
|
||||
from waflib import Logs, TaskGen
|
||||
from waflib.Tools import c_config
|
||||
from collections import OrderedDict
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Output:
|
||||
# CROSSCOMPILING -- set to true, if crosscompiling is enabled
|
||||
# DEST_OS2 -- as some operating systems is built on top of another, it's better to not change DEST_OS,
|
||||
# instead of this DEST_OS2 is defined with target value
|
||||
# For example: android is built on top of linux and have many things in common,
|
||||
# but it can't be considered as default GNU/Linux.
|
||||
# Possible values:
|
||||
# DEST_OS2 DEST_OS
|
||||
# 'android' 'linux'
|
||||
ANDROID_NDK_ENVVARS = ['ANDROID_NDK_HOME', 'ANDROID_NDK']
|
||||
ANDROID_NDK_SUPPORTED = [10, 19, 20]
|
||||
ANDROID_NDK_HARDFP_MAX = 11 # latest version that supports hardfp
|
||||
ANDROID_NDK_GCC_MAX = 17 # latest NDK that ships with GCC
|
||||
ANDROID_NDK_UNIFIED_SYSROOT_MIN = 15
|
||||
ANDROID_NDK_SYSROOT_FLAG_MAX = 19 # latest NDK that need --sysroot flag
|
||||
ANDROID_NDK_API_MIN = { 10: 3, 19: 16, 20: 16 } # minimal API level ndk revision supports
|
||||
ANDROID_64BIT_API_MIN = 21 # minimal API level that supports 64-bit targets
|
||||
|
||||
# This class does support ONLY r10e and r19c NDK
|
||||
# This class does support ONLY r10e and r19c/r20 NDK
|
||||
class Android:
|
||||
ctx = None # waf context
|
||||
arch = None
|
||||
toolchain = None
|
||||
api = None
|
||||
toolchain_path = None
|
||||
ndk_home = None
|
||||
ndk_rev = 0
|
||||
is_hardfloat = False
|
||||
clang = False
|
||||
|
||||
|
||||
def __init__(self, ctx, arch, toolchain, api):
|
||||
self.ctx = ctx
|
||||
for i in ['ANDROID_NDK_HOME', 'ANDROID_NDK']:
|
||||
self.api = api
|
||||
self.toolchain = toolchain
|
||||
self.arch = arch
|
||||
|
||||
for i in ANDROID_NDK_ENVVARS:
|
||||
self.ndk_home = os.getenv(i)
|
||||
if self.ndk_home != None:
|
||||
break
|
||||
|
||||
if not self.ndk_home:
|
||||
conf.fatal('Set ANDROID_NDK_HOME environment variable pointing to the root of Android NDK!')
|
||||
else:
|
||||
ctx.fatal('Set %s environment variable pointing to the root of Android NDK!' %
|
||||
' or '.join(ANDROID_NDK_ENVVARS))
|
||||
|
||||
# TODO: this were added at some point of NDK development
|
||||
# but I don't know at which version
|
||||
@ -61,37 +65,35 @@ class Android:
|
||||
|
||||
if 'Pkg.Revision' in trimed_tokens:
|
||||
self.ndk_rev = int(trimed_tokens[1].split('.')[0])
|
||||
|
||||
if self.ndk_rev not in ANDROID_NDK_SUPPORTED:
|
||||
ctx.fatal('Unknown NDK revision: %d' % (self.ndk_rev))
|
||||
else:
|
||||
self.ndk_rev = 10
|
||||
self.ndk_rev = ANDROID_NDK_SUPPORTED[0]
|
||||
|
||||
if self.ndk_rev not in [10, 19, 20]:
|
||||
ctx.fatal('Unknown NDK revision: {}'.format(self.ndk_rev))
|
||||
if 'clang' in self.toolchain or self.ndk_rev > ANDROID_NDK_GCC_MAX:
|
||||
self.clang = True
|
||||
|
||||
self.arch = arch
|
||||
if self.arch == 'armeabi-v7a-hard':
|
||||
if self.ndk_rev <= 10:
|
||||
if self.ndk_rev <= ANDROID_NDK_HARDFP_MAX:
|
||||
self.arch = 'armeabi-v7a' # Only armeabi-v7a have hard float ABI
|
||||
self.is_hardfloat = True
|
||||
else:
|
||||
raise Exception('NDK does not support hardfloat ABI')
|
||||
ctx.fatal('NDK does not support hardfloat ABI')
|
||||
|
||||
self.toolchain = toolchain
|
||||
if self.api < ANDROID_NDK_API_MIN[self.ndk_rev]:
|
||||
self.api = ANDROID_NDK_API_MIN[self.ndk_rev]
|
||||
Logs.warn('API level automatically was set to %d due to NDK support' % self.api)
|
||||
|
||||
if self.ndk_rev >= 19 or 'clang' in self.toolchain:
|
||||
self.clang = True
|
||||
if self.is_arm64() or self.is_amd64() and self.api < ANDROID_64BIT_API_MIN:
|
||||
self.api = ANDROID_64BIT_API_MIN
|
||||
Logs.warn('API level for 64-bit target automatically was set to %d' % self.api)
|
||||
|
||||
if self.is_arm64() or self.is_amd64() and self.api < 21:
|
||||
Logs.warn('API level for 64-bit target automatically was set to 21')
|
||||
self.api = 21
|
||||
elif self.ndk_rev >= 19 and self.api < 16:
|
||||
Logs.warn('API level automatically was set to 16 due to NDK support')
|
||||
self.api = 16
|
||||
else: self.api = api
|
||||
self.toolchain_path = self.gen_toolchain_path()
|
||||
|
||||
# TODO: Crystax support?
|
||||
# TODO: Support for everything else than linux-x86_64?
|
||||
# TODO: Determine if I actually need to implement listed above
|
||||
def is_host(self):
|
||||
'''
|
||||
Checks if we using host compiler(implies clang)
|
||||
'''
|
||||
return self.toolchain == 'host'
|
||||
|
||||
def is_arm(self):
|
||||
'''
|
||||
@ -126,90 +128,146 @@ class Android:
|
||||
def is_hardfp(self):
|
||||
return self.is_hardfloat
|
||||
|
||||
def gen_toolchain_path(self):
|
||||
path = 'toolchains'
|
||||
def ndk_triplet(self, llvm_toolchain = False, toolchain_folder = False):
|
||||
if self.is_x86():
|
||||
if toolchain_folder:
|
||||
return 'x86'
|
||||
else:
|
||||
return 'i686-linux-android'
|
||||
elif self.is_arm():
|
||||
if llvm_toolchain:
|
||||
return 'armv7a-linux-androideabi'
|
||||
else:
|
||||
return 'arm-linux-androideabi'
|
||||
elif self.is_amd64() and toolchain_folder:
|
||||
return 'x86_64'
|
||||
else:
|
||||
return self.arch + '-linux-android'
|
||||
|
||||
if sys.platform.startswith('linux'):
|
||||
toolchain_host = 'linux'
|
||||
def apk_arch(self):
|
||||
if self.is_arm64():
|
||||
return 'arm64-v8a'
|
||||
return self.arch
|
||||
|
||||
def gen_host_toolchain(self):
|
||||
# With host toolchain we don't care about OS
|
||||
# so just download NDK for Linux x86_64
|
||||
if self.is_host():
|
||||
return 'linux-x86_64'
|
||||
|
||||
if sys.platform.startswith('win32') or sys.platform.startswith('cygwin'):
|
||||
osname = 'windows'
|
||||
elif sys.platform.startswith('darwin'):
|
||||
toolchain_host = 'darwin'
|
||||
elif sys.platform.startswith('win32') or sys.platform.startswith('cygwin'):
|
||||
toolchain_host = 'windows'
|
||||
else: raise Exception('Unsupported by NDK host platform')
|
||||
osname = 'darwin'
|
||||
elif sys.platform.startswith('linux'):
|
||||
osname = 'linux'
|
||||
else:
|
||||
self.ctx.fatal('Unsupported by NDK host platform')
|
||||
|
||||
toolchain_host += '-'
|
||||
if sys.maxsize > 2**32:
|
||||
arch = 'x86_64'
|
||||
else: arch = 'x86'
|
||||
|
||||
# Assuming we are building on x86
|
||||
if sys.maxsize > 2**32:
|
||||
toolchain_host += 'x86_64'
|
||||
else: toolchain_host += 'x86'
|
||||
return '%s-%s' % (osname, arch)
|
||||
|
||||
def gen_gcc_toolchain_path(self):
|
||||
path = 'toolchains'
|
||||
toolchain_host = self.gen_host_toolchain()
|
||||
|
||||
if self.is_clang():
|
||||
if self.ndk_rev < 19:
|
||||
raise Exception('Clang is not supported for this NDK')
|
||||
|
||||
toolchain_folder = 'llvm'
|
||||
|
||||
if self.is_x86():
|
||||
triplet = 'i686-linux-android{}-'.format(self.api)
|
||||
elif self.is_arm():
|
||||
triplet = 'armv7a-linux-androideabi{}-'.format(self.api)
|
||||
else:
|
||||
triplet = self.arch + '-linux-android{}-'.format(self.api)
|
||||
else:
|
||||
if self.is_x86() or self.is_amd64():
|
||||
toolchain_folder = self.arch + '-' + self.toolchain
|
||||
elif self.is_arm():
|
||||
toolchain_folder = 'arm-linux-androideabi-' + self.toolchain
|
||||
if self.is_host():
|
||||
toolchain = '4.9'
|
||||
else:
|
||||
toolchain_folder = self.arch + '-linux-android-' + self.toolchain
|
||||
toolchain = self.toolchain
|
||||
|
||||
if self.is_x86():
|
||||
triplet = 'i686-linux-android-'
|
||||
elif self.is_arm():
|
||||
triplet = 'arm-linux-androideabi-'
|
||||
else:
|
||||
triplet = self.arch + '-linux-android-'
|
||||
toolchain_folder = '%s-%s' % (self.ndk_triplet(toolchain_folder = True), toolchain)
|
||||
|
||||
return os.path.join(path, toolchain_folder, 'prebuilt', toolchain_host, 'bin', triplet)
|
||||
return os.path.abspath(os.path.join(self.ndk_home, path, toolchain_folder, 'prebuilt', toolchain_host))
|
||||
|
||||
def gen_toolchain_path(self):
|
||||
if self.is_clang():
|
||||
triplet = '%s%d-' % (self.ndk_triplet(llvm_toolchain = True), self.api)
|
||||
else:
|
||||
triplet = self.ndk_triplet() + '-'
|
||||
return os.path.join(self.gen_gcc_toolchain_path(), 'bin', triplet)
|
||||
|
||||
def gen_binutils_path(self):
|
||||
return os.path.join(self.gen_gcc_toolchain_path(), self.ndk_triplet(), 'bin')
|
||||
|
||||
def cc(self):
|
||||
return os.path.abspath(os.path.join(self.ndk_home, self.toolchain_path + ('clang' if self.is_clang() else 'gcc')))
|
||||
if self.is_host():
|
||||
return 'clang --target=%s%d' % (self.ndk_triplet(), self.api)
|
||||
return self.gen_toolchain_path() + ('clang' if self.is_clang() else 'gcc')
|
||||
|
||||
def cxx(self):
|
||||
return os.path.abspath(os.path.join(self.ndk_home, self.toolchain_path + ('clang++' if self.is_clang() else 'g++')))
|
||||
if self.is_host():
|
||||
return 'clang++ --target=%s%d' % (self.ndk_triplet(), self.api)
|
||||
return self.gen_toolchain_path() + ('clang++' if self.is_clang() else 'g++')
|
||||
|
||||
def strip(self):
|
||||
if self.is_host():
|
||||
return 'llvm-strip'
|
||||
return os.path.join(self.gen_binutils_path(), 'strip')
|
||||
|
||||
def system_stl(self):
|
||||
# TODO: proper STL support
|
||||
return os.path.abspath(os.path.join(self.ndk_home, 'sources', 'cxx-stl', 'system', 'include'))
|
||||
|
||||
def libsysroot(self):
|
||||
arch = self.arch
|
||||
if self.is_arm():
|
||||
arch = 'arm'
|
||||
elif self.is_arm64():
|
||||
arch = 'arm64'
|
||||
path = 'platforms/android-%s/arch-%s' % (self.api, arch)
|
||||
|
||||
return os.path.abspath(os.path.join(self.ndk_home, path))
|
||||
|
||||
def sysroot(self):
|
||||
if self.ndk_rev >= 19:
|
||||
if self.ndk_rev >= ANDROID_NDK_UNIFIED_SYSROOT_MIN:
|
||||
return os.path.abspath(os.path.join(self.ndk_home, 'sysroot'))
|
||||
else:
|
||||
arch = self.arch
|
||||
if self.is_arm():
|
||||
arch = 'arm'
|
||||
elif self.is_arm64():
|
||||
arch = 'arm64'
|
||||
path = 'platforms/android-{}/arch-{}'.format(self.api, arch)
|
||||
return self.libsysroot()
|
||||
|
||||
return os.path.abspath(os.path.join(self.ndk_home, path))
|
||||
|
||||
def cflags(self):
|
||||
def cflags(self, cxx = False):
|
||||
cflags = []
|
||||
if self.ndk_rev < 20:
|
||||
cflags = ['--sysroot={0}'.format(self.sysroot())]
|
||||
cflags += ['-DANDROID', '-D__ANDROID__']
|
||||
cflags += ['-I{0}'.format(self.system_stl())]
|
||||
|
||||
if self.ndk_rev <= ANDROID_NDK_SYSROOT_FLAG_MAX:
|
||||
cflags += ['--sysroot=%s' % (self.sysroot())]
|
||||
else:
|
||||
if self.is_host():
|
||||
cflags += [
|
||||
'--sysroot=%s/sysroot' % (self.gen_gcc_toolchain_path()),
|
||||
'-isystem', '%s/usr/include/' % (self.sysroot())
|
||||
]
|
||||
|
||||
cflags += ['-I%s' % (self.system_stl()), '-DANDROID', '-D__ANDROID__']
|
||||
|
||||
if cxx and not self.is_clang() and self.toolchain not in ['4.8','4.9']:
|
||||
cflags += ['-fno-sized-deallocation']
|
||||
|
||||
if self.is_arm():
|
||||
if self.arch == 'armeabi-v7a':
|
||||
# ARMv7 support
|
||||
cflags += ['-mthumb', '-mfpu=neon', '-mcpu=cortex-a9', '-DHAVE_EFFICIENT_UNALIGNED_ACCESS', '-DVECTORIZE_SINCOS']
|
||||
if not self.is_clang():
|
||||
|
||||
if not self.is_clang() and not self.is_host():
|
||||
cflags += [ '-mvectorize-with-neon-quad' ]
|
||||
if self.is_hardfloat:
|
||||
cflags += ['-D_NDK_MATH_NO_SOFTFP=1', '-mhard-float', '-mfloat-abi=hard', '-DLOAD_HARDFP', '-DSOFTFP_LINK']
|
||||
|
||||
if self.is_hardfp():
|
||||
cflags += ['-D_NDK_MATH_NO_SOFTFP=1', '-mfloat-abi=hard', '-DLOAD_HARDFP', '-DSOFTFP_LINK']
|
||||
|
||||
if self.is_host():
|
||||
# Clang builtin redefine w/ different calling convention bug
|
||||
# NOTE: I did not added complex.h functions here, despite
|
||||
# that NDK devs forgot to put __NDK_FPABI_MATH__ for complex
|
||||
# math functions
|
||||
# I personally don't need complex numbers support, but if you want it
|
||||
# just run sed to patch header
|
||||
for f in ['strtod', 'strtof', 'strtold']:
|
||||
cflags += ['-fno-builtin-%s' % f]
|
||||
else:
|
||||
cflags += ['-mfloat-abi=softfp']
|
||||
else:
|
||||
@ -222,16 +280,32 @@ class Android:
|
||||
# they go before object list
|
||||
def linkflags(self):
|
||||
linkflags = []
|
||||
if self.ndk_rev < 20:
|
||||
linkflags = ['--sysroot={0}'.format(self.sysroot())]
|
||||
if self.is_host():
|
||||
linkflags += ['--gcc-toolchain=%s' % self.gen_gcc_toolchain_path()]
|
||||
|
||||
if self.ndk_rev <= ANDROID_NDK_SYSROOT_FLAG_MAX:
|
||||
linkflags += ['--sysroot=%s' % (self.sysroot())]
|
||||
elif self.is_host():
|
||||
linkflags += ['--sysroot=%s/sysroot' % (self.gen_gcc_toolchain_path())]
|
||||
|
||||
if self.is_clang() or self.is_host():
|
||||
linkflags += ['-fuse-ld=lld']
|
||||
|
||||
linkflags += ['-Wl,--hash-style=both','-Wl,--no-undefined']
|
||||
return linkflags
|
||||
|
||||
def ldflags(self):
|
||||
ldflags = ['-lgcc', '-no-canonical-prefixes']
|
||||
if self.is_clang() or self.is_host():
|
||||
ldflags += ['-stdlib=libstdc++']
|
||||
if self.is_arm():
|
||||
if self.arch == 'armeabi-v7a':
|
||||
ldflags += ['-march=armv7-a', '-Wl,--fix-cortex-a8', '-mthumb']
|
||||
if self.is_hardfloat:
|
||||
ldflags += ['-march=armv7-a', '-mthumb']
|
||||
|
||||
if not self.is_clang() and not self.is_host(): # lld only
|
||||
ldflags += ['-Wl,--fix-cortex-a8']
|
||||
|
||||
if self.is_hardfp():
|
||||
ldflags += ['-Wl,--no-warn-mismatch', '-lm_hard']
|
||||
else:
|
||||
ldflags += ['-march=armv5te']
|
||||
@ -248,17 +322,17 @@ def configure(conf):
|
||||
if len(values) != 3:
|
||||
conf.fatal('Invalid --android paramater value!')
|
||||
|
||||
valid_archs = ['x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'armeabi-v7a-hard', 'aarch64', 'mipsel', 'mips64el']
|
||||
valid_archs = ['x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'armeabi-v7a-hard', 'aarch64']
|
||||
|
||||
if values[0] not in valid_archs:
|
||||
conf.fatal('Unknown arch: {}. Supported: {}'.format(values[0], ', '.join(valid_archs)))
|
||||
conf.fatal('Unknown arch: %s. Supported: %r' % (values[0], ', '.join(valid_archs)))
|
||||
|
||||
android = Android(conf, values[0], values[1], int(values[2]))
|
||||
setattr(conf, 'android', android)
|
||||
conf.android = android = Android(conf, values[0], values[1], int(values[2]))
|
||||
conf.environ['CC'] = android.cc()
|
||||
conf.environ['CXX'] = android.cxx()
|
||||
conf.environ['STRIP'] = android.strip()
|
||||
conf.env.CFLAGS += android.cflags()
|
||||
conf.env.CXXFLAGS += android.cflags()
|
||||
conf.env.CXXFLAGS += android.cflags(True)
|
||||
conf.env.LINKFLAGS += android.linkflags()
|
||||
conf.env.LDFLAGS += android.ldflags()
|
||||
|
||||
@ -267,20 +341,27 @@ def configure(conf):
|
||||
conf.env.LIB_M = ['m_hard']
|
||||
else: conf.env.LIB_M = ['m']
|
||||
|
||||
conf.env.PREFIX = '/lib/{}'.format(android.arch)
|
||||
conf.env.PREFIX = '/lib/%s' % android.apk_arch()
|
||||
|
||||
conf.msg('Selected Android NDK', '{}, version: {}'.format(android.ndk_home, android.ndk_rev))
|
||||
conf.msg('Selected Android NDK', '%s, version: %d' % (android.ndk_home, android.ndk_rev))
|
||||
# no need to print C/C++ compiler, as it would be printed by compiler_c/cxx
|
||||
conf.msg('... C/C++ flags', ' '.join(android.cflags()).replace(android.ndk_home, '$NDK'))
|
||||
conf.msg('... link flags', ' '.join(android.linkflags()).replace(android.ndk_home, '$NDK'))
|
||||
conf.msg('... ld flags', ' '.join(android.ldflags()).replace(android.ndk_home, '$NDK'))
|
||||
conf.msg('... C/C++ flags', ' '.join(android.cflags()).replace(android.ndk_home, '$NDK/'))
|
||||
conf.msg('... link flags', ' '.join(android.linkflags()).replace(android.ndk_home, '$NDK/'))
|
||||
conf.msg('... ld flags', ' '.join(android.ldflags()).replace(android.ndk_home, '$NDK/'))
|
||||
|
||||
# conf.env.ANDROID_OPTS = android
|
||||
conf.env.DEST_OS2 = 'android'
|
||||
# else:
|
||||
# conf.load('compiler_c compiler_cxx') # Use host compiler :)
|
||||
|
||||
MACRO_TO_DESTOS = OrderedDict({ '__ANDROID__' : 'android' })
|
||||
for k in c_config.MACRO_TO_DESTOS:
|
||||
MACRO_TO_DESTOS[k] = c_config.MACRO_TO_DESTOS[k] # ordering is important
|
||||
c_config.MACRO_TO_DESTOS = MACRO_TO_DESTOS
|
||||
|
||||
def post_compiler_cxx_configure(conf):
|
||||
conf.msg('Target OS', conf.env.DEST_OS)
|
||||
conf.msg('Target CPU', conf.env.DEST_CPU)
|
||||
conf.msg('Target binfmt', conf.env.DEST_BINFMT)
|
||||
|
||||
if conf.options.ANDROID_OPTS:
|
||||
if conf.android.ndk_rev == 19:
|
||||
conf.env.CXXFLAGS_cxxshlib += ['-static-libstdc++']
|
||||
@ -288,6 +369,10 @@ def post_compiler_cxx_configure(conf):
|
||||
return
|
||||
|
||||
def post_compiler_c_configure(conf):
|
||||
conf.msg('Target OS', conf.env.DEST_OS)
|
||||
conf.msg('Target CPU', conf.env.DEST_CPU)
|
||||
conf.msg('Target binfmt', conf.env.DEST_BINFMT)
|
||||
|
||||
return
|
||||
|
||||
from waflib.Tools import compiler_cxx, compiler_c
|
||||
@ -305,3 +390,20 @@ def patch_compiler_c_configure(conf):
|
||||
|
||||
setattr(compiler_cxx, 'configure', patch_compiler_cxx_configure)
|
||||
setattr(compiler_c, 'configure', patch_compiler_c_configure)
|
||||
|
||||
@TaskGen.feature('cshlib', 'cxxshlib', 'dshlib', 'fcshlib', 'vnum')
|
||||
@TaskGen.after_method('apply_link', 'propagate_uselib_vars')
|
||||
@TaskGen.before_method('apply_vnum')
|
||||
def apply_android_soname(self):
|
||||
"""
|
||||
Enforce SONAME on Android
|
||||
"""
|
||||
if self.env.DEST_OS != 'android':
|
||||
return
|
||||
|
||||
setattr(self, 'vnum', None) # remove vnum, so SONAME would not be overwritten
|
||||
link = self.link_task
|
||||
node = link.outputs[0]
|
||||
libname = node.name
|
||||
v = self.env.SONAME_ST % libname
|
||||
self.env.append_value('LINKFLAGS', v.split())
|
||||
|
161
wscript
161
wscript
@ -3,15 +3,16 @@
|
||||
# a1batross, mittorn, 2018
|
||||
|
||||
from __future__ import print_function
|
||||
from waflib import Logs
|
||||
from waflib import Logs, Context, Configure
|
||||
import sys
|
||||
import os
|
||||
sys.path.append(os.path.realpath('scripts/waflib'))
|
||||
|
||||
VERSION = '2.4'
|
||||
APPNAME = 'hlsdk-xash3d'
|
||||
top = '.'
|
||||
|
||||
Context.Context.line_just = 55 # should fit for everything on 80x26
|
||||
|
||||
def options(opt):
|
||||
grp = opt.add_option_group('Common options')
|
||||
|
||||
@ -19,19 +20,26 @@ def options(opt):
|
||||
help = 'build type: debug, release or none(custom flags)')
|
||||
|
||||
grp.add_option('-8', '--64bits', action = 'store_true', dest = 'ALLOW64', default = False,
|
||||
help = 'allow targetting 64-bit game dlls')
|
||||
help = 'allow targetting 64-bit engine(Linux/Windows/OSX x86 only) [default: %default]')
|
||||
|
||||
grp.add_option('--enable-voicemgr', action = 'store_true', dest = 'VOICEMGR', default = False,
|
||||
help = 'enable voice manager')
|
||||
help = 'enable voice manager [default: %default]')
|
||||
|
||||
grp.add_option('--enable-goldsrc-support', action = 'store_true', dest = 'GOLDSRC', default = False,
|
||||
help = 'enable GoldSource engine support')
|
||||
help = 'enable GoldSource engine support [default: %default]')
|
||||
|
||||
grp.add_option('--enable-lto', action = 'store_true', dest = 'LTO', default = False,
|
||||
help = 'enable Link Time Optimization [default: %default]')
|
||||
|
||||
grp.add_option('--enable-poly-opt', action = 'store_true', dest = 'POLLY', default = False,
|
||||
help = 'enable polyhedral optimization if possible [default: %default]')
|
||||
|
||||
|
||||
opt.recurse('cl_dll dlls')
|
||||
|
||||
opt.load('xcompile compiler_cxx compiler_c')
|
||||
opt.load('xcompile compiler_cxx compiler_c clang_compilation_database strip_on_install')
|
||||
if sys.platform == 'win32':
|
||||
opt.load('msvc msdev')
|
||||
opt.load('msvc msdev msvs')
|
||||
opt.load('reconfigure')
|
||||
|
||||
|
||||
@ -43,7 +51,7 @@ def configure(conf):
|
||||
conf.env.SERVER_NAME = 'hl'
|
||||
conf.env.PREFIX = ''
|
||||
|
||||
conf.load('reconfigure')
|
||||
conf.load('fwgslib reconfigure')
|
||||
|
||||
conf.start_msg('Build type')
|
||||
if conf.options.BUILD_TYPE == None:
|
||||
@ -56,7 +64,7 @@ def configure(conf):
|
||||
|
||||
# -march=native should not be used
|
||||
if conf.options.BUILD_TYPE == 'fast':
|
||||
Logs.warn('WARNING: \'fast\' build type should not be used in release builds')
|
||||
Logs.warn('WARNING: \'fast\' build type should not be used in release builds')
|
||||
|
||||
conf.env.VOICEMGR = conf.options.VOICEMGR
|
||||
conf.env.GOLDSRC = conf.options.GOLDSRC
|
||||
@ -68,88 +76,143 @@ def configure(conf):
|
||||
conf.env.MSVC_TARGETS = ['x86'] # explicitly request x86 target for MSVC
|
||||
if sys.platform == 'win32':
|
||||
conf.load('msvc msdev')
|
||||
conf.load('xcompile compiler_c compiler_cxx')
|
||||
conf.load('xcompile compiler_c compiler_cxx strip_on_install')
|
||||
|
||||
if conf.env.DEST_OS2 == 'android':
|
||||
conf.options.ALLOW64 = True
|
||||
if conf.env.DEST_OS == 'android':
|
||||
conf.options.GOLDSRC = False
|
||||
conf.env.SERVER_NAME = 'server' # can't be any other name, until specified
|
||||
|
||||
# print(conf.options.ALLOW64)
|
||||
|
||||
conf.env.BIT32_MANDATORY = not conf.options.ALLOW64
|
||||
conf.env.BIT32_ALLOW64 = conf.options.ALLOW64
|
||||
conf.load('force_32bit')
|
||||
|
||||
if conf.env.DEST_SIZEOF_VOID_P == 4:
|
||||
Logs.info('NOTE: will build game dlls for 32-bit target')
|
||||
# We restrict 64-bit builds ONLY for Win/Linux/OSX running on Intel architecture
|
||||
# Because compatibility with original GoldSrc
|
||||
if conf.env.DEST_OS in ['win32', 'linux', 'darwin'] and conf.env.DEST_CPU in ['x86_64']:
|
||||
conf.env.BIT32_ALLOW64 = conf.options.ALLOW64
|
||||
if not conf.env.BIT32_ALLOW64:
|
||||
Logs.info('WARNING: will build engine for 32-bit target')
|
||||
else:
|
||||
Logs.warn('WARNING: 64-bit game dlls may be unstable')
|
||||
conf.env.BIT32_ALLOW64 = True
|
||||
conf.env.BIT32_MANDATORY = not conf.env.BIT32_ALLOW64
|
||||
conf.load('force_32bit')
|
||||
|
||||
linker_flags = {
|
||||
'common': {
|
||||
'msvc': ['/DEBUG'], # always create PDB, doesn't affect result binaries
|
||||
'gcc': ['-Wl,--no-undefined']
|
||||
'msvc': ['/DEBUG'], # always create PDB, doesn't affect result binaries
|
||||
'gcc': ['-Wl,--no-undefined']
|
||||
},
|
||||
'sanitize': {
|
||||
'gcc': ['-fsanitize=undefined', '-fsanitize=address'],
|
||||
'clang': ['-fsanitize=undefined', '-fsanitize=address'],
|
||||
'gcc': ['-fsanitize=undefined', '-fsanitize=address'],
|
||||
}
|
||||
}
|
||||
|
||||
compiler_c_cxx_flags = {
|
||||
'common': {
|
||||
'msvc': ['/D_USING_V110_SDK71_', '/Zi', '/FS'],
|
||||
'clang': ['-g', '-gdwarf-2'],
|
||||
'gcc': ['-g', '-Werror=implicit-function-declaration', '-fdiagnostics-color=always']
|
||||
# disable thread-safe local static initialization for C++11 code, as it cause crashes on Windows XP
|
||||
'msvc': ['/D_USING_V110_SDK71_', '/Zi', '/FS', '/Zc:threadSafeInit-', '/MT'],
|
||||
'clang': ['-g', '-gdwarf-2', '-fvisibility=hidden'],
|
||||
'gcc': ['-g', '-fvisibility=hidden']
|
||||
},
|
||||
'fast': {
|
||||
'msvc': ['/O2', '/Oy'], #todo: check /GL /LTCG
|
||||
'gcc': ['-Ofast', '-march=native', '-funsafe-math-optimizations', '-funsafe-loop-optimizations', '-fomit-frame-pointer'],
|
||||
'msvc': ['/O2', '/Oy'], #todo: check /GL /LTCG
|
||||
'gcc': ['-Ofast', '-march=native', '-funsafe-math-optimizations', '-funsafe-loop-optimizations', '-fomit-frame-pointer'],
|
||||
'clang': ['-Ofast', '-march=native'],
|
||||
'default': ['-O3']
|
||||
},
|
||||
'release': {
|
||||
'msvc': ['/O2'],
|
||||
'msvc': ['/O2'],
|
||||
'default': ['-O3']
|
||||
},
|
||||
'debug': {
|
||||
'msvc': ['/O1'],
|
||||
'gcc': ['-Og'],
|
||||
'msvc': ['/O1'],
|
||||
'gcc': ['-Og'],
|
||||
'default': ['-O1']
|
||||
},
|
||||
'sanitize': {
|
||||
'msvc': ['/Od', '/RTC1'],
|
||||
'gcc': ['-Og', '-fsanitize=undefined', '-fsanitize=address'],
|
||||
'default': ['-O1']
|
||||
'msvc': ['/Od', '/RTC1'],
|
||||
'gcc': ['-Og', '-fsanitize=undefined', '-fsanitize=address'],
|
||||
'clang': ['-O0', '-fsanitize=undefined', '-fsanitize=address'],
|
||||
'default': ['-O0']
|
||||
},
|
||||
'nooptimize': {
|
||||
'msvc': ['/Od'],
|
||||
'msvc': ['/Od'],
|
||||
'default': ['-O0']
|
||||
}
|
||||
}
|
||||
|
||||
conf.env.append_unique('CFLAGS', conf.get_flags_by_type(
|
||||
compiler_c_cxx_flags, conf.options.BUILD_TYPE, conf.env.COMPILER_CC))
|
||||
conf.env.append_unique('CXXFLAGS', conf.get_flags_by_type(
|
||||
compiler_c_cxx_flags, conf.options.BUILD_TYPE, conf.env.COMPILER_CC))
|
||||
conf.env.append_unique('LINKFLAGS', conf.get_flags_by_type(
|
||||
linker_flags, conf.options.BUILD_TYPE, conf.env.COMPILER_CC))
|
||||
compiler_optional_flags = [
|
||||
'-fdiagnostics-color=always',
|
||||
'-Werror=implicit-function-declaration',
|
||||
'-Werror=int-conversion',
|
||||
'-Werror=return-type',
|
||||
'-Werror=parentheses',
|
||||
'-Werror=vla',
|
||||
'-Werror=tautological-compare',
|
||||
'-Werror=duplicated-cond',
|
||||
'-Werror=bool-compare',
|
||||
'-Werror=bool-operation',
|
||||
'-Wstrict-aliasing',
|
||||
]
|
||||
|
||||
c_compiler_optional_flags = [
|
||||
'-Werror=implicit-int',
|
||||
'-Werror=declaration-after-statement'
|
||||
]
|
||||
|
||||
linkflags = conf.get_flags_by_type(linker_flags, conf.options.BUILD_TYPE, conf.env.COMPILER_CC)
|
||||
cflags = conf.get_flags_by_type(compiler_c_cxx_flags, conf.options.BUILD_TYPE, conf.env.COMPILER_CC)
|
||||
|
||||
# Here we don't differentiate C or C++ flags
|
||||
if conf.options.LTO:
|
||||
lto_cflags = {
|
||||
'msvc': ['/GL'],
|
||||
'gcc': ['-flto'],
|
||||
'clang': ['-flto']
|
||||
}
|
||||
|
||||
lto_linkflags = {
|
||||
'msvc': ['/LTCG'],
|
||||
'gcc': ['-flto'],
|
||||
'clang': ['-flto']
|
||||
}
|
||||
cflags += conf.get_flags_by_compiler(lto_cflags, conf.env.COMPILER_CC)
|
||||
linkflags += conf.get_flags_by_compiler(lto_linkflags, conf.env.COMPILER_CC)
|
||||
|
||||
if conf.options.POLLY:
|
||||
polly_cflags = {
|
||||
'gcc': ['-fgraphite-identity'],
|
||||
'clang': ['-mllvm', '-polly']
|
||||
# msvc sosat :(
|
||||
}
|
||||
|
||||
cflags += conf.get_flags_by_compiler(polly_cflags, conf.env.COMPILER_CC)
|
||||
|
||||
# And here C++ flags starts to be treated separately
|
||||
cxxflags = list(cflags)
|
||||
if conf.env.COMPILER_CC != 'msvc':
|
||||
conf.check_cc(cflags=cflags, msg= 'Checking for required C flags')
|
||||
conf.check_cxx(cxxflags=cflags, msg= 'Checking for required C++ flags')
|
||||
|
||||
cflags += conf.filter_cflags(compiler_optional_flags + c_compiler_optional_flags, cflags)
|
||||
cxxflags += conf.filter_cxxflags(compiler_optional_flags, cflags)
|
||||
|
||||
conf.env.append_unique('CFLAGS', cflags)
|
||||
conf.env.append_unique('CXXFLAGS', cxxflags)
|
||||
conf.env.append_unique('LINKFLAGS', linkflags)
|
||||
|
||||
if conf.env.COMPILER_CC == 'msvc':
|
||||
conf.env.append_unique('DEFINES', ['_CRT_SECURE_NO_WARNINGS','_CRT_NONSTDC_NO_DEPRECATE'])
|
||||
conf.define('_CRT_SECURE_NO_WARNINGS', 1)
|
||||
conf.define('_CRT_NONSTDC_NO_DEPRECATE', 1)
|
||||
else:
|
||||
conf.env.append_unique('DEFINES', ['stricmp=strcasecmp','strnicmp=strncasecmp','_LINUX','LINUX','_snprintf=snprintf','_vsnprintf=vsnprintf'])
|
||||
cflags = ['-fvisibility=hidden','-Wno-write-strings']
|
||||
conf.env.append_unique('CFLAGS', cflags)
|
||||
conf.env.append_unique('CXXFLAGS', cflags + ['-Wno-invalid-offsetof', '-fno-rtti', '-fno-exceptions'])
|
||||
conf.env.append_unique('DEFINES', ['stricmp=strcasecmp', 'strnicmp=strncasecmp', '_snprintf=snprintf', '_vsnprintf=vsnprintf', '_LINUX', 'LINUX'])
|
||||
conf.env.append_unique('CXXFLAGS', ['-Wno-invalid-offsetof', '-fno-rtti', '-fno-exceptions'])
|
||||
|
||||
# strip lib from pattern
|
||||
if conf.env.DEST_OS in ['linux', 'darwin'] and conf.env.DEST_OS2 not in ['android']:
|
||||
if conf.env.DEST_OS in ['linux', 'darwin']:
|
||||
if conf.env.cshlib_PATTERN.startswith('lib'):
|
||||
conf.env.cshlib_PATTERN = conf.env.cshlib_PATTERN[3:]
|
||||
if conf.env.cxxshlib_PATTERN.startswith('lib'):
|
||||
conf.env.cxxshlib_PATTERN = conf.env.cxxshlib_PATTERN[3:]
|
||||
|
||||
conf.env.append_unique('DEFINES', 'CLIENT_WEAPONS')
|
||||
conf.define('CLIENT_WEAPONS', '1')
|
||||
|
||||
conf.recurse('cl_dll dlls')
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user