mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-22 06:06:50 +00:00
Initial android support (#17)
* Upload Android armv7 libs * Fix debug build * utlvector: fix undefined behavior * wscript: add --use-ccache option * wscript: store ccache in a separate directory * Propertly use gl4es * fontconfig: fix font detection * [android]remove fontconfig dependency * Add build guide for other platforms Co-authored-by: JusicP <slender87844@gmail.com> Co-authored-by: nillerusr <nillerusr@users.noreply.github.com>
This commit is contained in:
parent
2a490d398c
commit
2c6669f5e3
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,11 +1,10 @@
|
||||
*.mak
|
||||
*.mak.vpc_crc
|
||||
*.vpc_crc
|
||||
*.a
|
||||
*.project
|
||||
lib/
|
||||
*obj_*
|
||||
build/
|
||||
.waf*
|
||||
.lock-waf*
|
||||
__pycache__
|
||||
*.pyc
|
||||
|
12
README.md
12
README.md
@ -11,11 +11,19 @@ The main purpose of this repository is to port the engine for other platforms.
|
||||
* replace current buildsystem with waf
|
||||
* rewrite achivement system( to work without steam )
|
||||
# How to Build?
|
||||
On Linux:
|
||||
1. Clone repo ( ```git clone https://github.com/nillerusr/source-engine```)
|
||||
2. Run ```git submodule init && git submodule update```
|
||||
3. Build
|
||||
|
||||
On Linux:
|
||||
```
|
||||
./waf configure -T debug
|
||||
./waf build
|
||||
```
|
||||
On Linux for Android(**Note: only Android NDK r10e is supported**):
|
||||
```
|
||||
export ANDROID_NDK=/path/to/ndk
|
||||
./waf configure -T debug --android=armeabi-v7a,4.9,21
|
||||
./waf build
|
||||
```
|
||||
On Windows:
|
||||
**TODO(WAF is not configured for Windows. Use VPC as temporary solution)**
|
||||
|
@ -56,6 +56,11 @@ COpenGLEntryPoints *gGL = NULL;
|
||||
|
||||
const int kBogusSwapInterval = INT_MAX;
|
||||
|
||||
#ifdef ANDROID
|
||||
static void *gl4es = NULL;
|
||||
void *(*_glGetProcAddress)( const char * );
|
||||
#endif
|
||||
|
||||
/*
|
||||
From Ryan Gordon:
|
||||
|
||||
@ -174,7 +179,19 @@ void *VoidFnPtrLookup_GlMgr(const char *fn, bool &okay, const bool bRequired, vo
|
||||
return NULL;
|
||||
|
||||
// The SDL path would work on all these platforms, if we were using SDL there, too...
|
||||
#if defined( USE_SDL )
|
||||
|
||||
|
||||
#ifdef ANDROID
|
||||
// SDL does the right thing, so we never need to use tier0 in this case.
|
||||
if( _glGetProcAddress )
|
||||
retval = _glGetProcAddress(fn);
|
||||
//printf("CDynamicFunctionOpenGL: SDL_GL_GetProcAddress(\"%s\") returned %p\n", fn, retval);
|
||||
if ((retval == NULL) && (fallback != NULL))
|
||||
{
|
||||
//printf("CDynamicFunctionOpenGL: Using fallback %p for \"%s\"\n", fallback, fn);
|
||||
retval = fallback;
|
||||
}
|
||||
#elif defined( USE_SDL )
|
||||
// SDL does the right thing, so we never need to use tier0 in this case.
|
||||
retval = SDL_GL_GetProcAddress(fn);
|
||||
//printf("CDynamicFunctionOpenGL: SDL_GL_GetProcAddress(\"%s\") returned %p\n", fn, retval);
|
||||
@ -196,7 +213,7 @@ void *VoidFnPtrLookup_GlMgr(const char *fn, bool &okay, const bool bRequired, vo
|
||||
// We can't continue execution, because one or more GL function pointers will be NULL.
|
||||
Error( "Could not find required OpenGL entry point '%s'! Either your video card is unsupported, or your OpenGL driver needs to be updated.\n", fn);
|
||||
}
|
||||
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -742,6 +759,18 @@ bool CSDLMgr::CreateHiddenGameWindow( const char *pTitle, int width, int height
|
||||
|
||||
SDL_GL_MakeCurrent(m_Window, m_GLContext);
|
||||
|
||||
#ifdef ANDROID
|
||||
gl4es = dlopen("libgl4es.so", RTLD_LAZY);
|
||||
|
||||
if( gl4es )
|
||||
{
|
||||
_glGetProcAddress = dlsym(gl4es, "gl4es_GetProcAddress" );
|
||||
void (*initialize_gl4es)( );
|
||||
initialize_gl4es = dlsym(gl4es, "initialize_gl4es" );
|
||||
initialize_gl4es();
|
||||
}
|
||||
#endif
|
||||
|
||||
// !!! FIXME: note for later...we never delete this context anywhere, I think.
|
||||
// !!! FIXME: when we do get around to that, don't forget to delete/NULL gGL!
|
||||
|
||||
@ -762,7 +791,7 @@ bool CSDLMgr::CreateHiddenGameWindow( const char *pTitle, int width, int height
|
||||
#endif // DBGFLAG_ASSERT
|
||||
|
||||
gGL = GetOpenGLEntryPoints(VoidFnPtrLookup_GlMgr);
|
||||
|
||||
|
||||
// It is now safe to call any base GL entry point that's supplied by gGL.
|
||||
// You still need to explicitly test for extension entry points, though!
|
||||
|
||||
|
@ -1,7 +1,11 @@
|
||||
#ifndef __FTCONFIG_H__MULTILIB
|
||||
#define __FTCONFIG_H__MULTILIB
|
||||
|
||||
#ifdef ANDROID
|
||||
#include <sys/cdefs.h>
|
||||
#else
|
||||
#include <bits/wordsize.h>
|
||||
#endif
|
||||
|
||||
#if __WORDSIZE == 32
|
||||
# include "ftconfig-32.h"
|
||||
|
@ -35,6 +35,9 @@ def build(bld):
|
||||
|
||||
libs = ['tier0','tier1','tier2','tier3']
|
||||
|
||||
if bld.env.DEST_OS == 'android':
|
||||
libs += ['ANDROID_SUPPORT']
|
||||
|
||||
install_path = bld.env.LIBDIR
|
||||
|
||||
bld.shlib(
|
||||
|
@ -2898,7 +2898,7 @@ void CDmaDecorator<T,B>::Init( CDmElement *pOwner, const char *pAttributeName, i
|
||||
{
|
||||
Assert( pOwner );
|
||||
this->m_pAttribute = pOwner->AddExternalAttribute( pAttributeName, CDmAttributeInfo<CUtlVector<T> >::AttributeType(), &Value() );
|
||||
Assert( m_pAttribute );
|
||||
Assert( this->m_pAttribute );
|
||||
if ( nFlags )
|
||||
{
|
||||
this->m_pAttribute->AddFlag( nFlags );
|
||||
|
@ -323,12 +323,15 @@ def build(bld):
|
||||
'../common',
|
||||
'audio',
|
||||
'audio/public',
|
||||
'audio/private'
|
||||
'audio/private',
|
||||
]
|
||||
|
||||
defines = []
|
||||
|
||||
libs = ['tier0','vgui_controls','dmxloader','tier1','tier2','tier3','bitmap','vstdlib','appframework','datamodel','vtf','mathlib','steam_api','matsys_controls','BZ2','SDL2','JPEG','ZLIB','OPENAL','CURL']
|
||||
libs = ['tier0','vgui_controls','dmxloader','tier1','tier2','tier3','bitmap','vstdlib','appframework','datamodel','vtf','mathlib','steam_api','matsys_controls','BZ2','SDL2','JPEG','ZLIB','OPENAL','CURL' ]
|
||||
|
||||
if bld.env.DEST_OS == 'android':
|
||||
libs += ['SSL', 'CRYPTO'] # android curl was built with openssl
|
||||
|
||||
install_path = bld.env.LIBDIR
|
||||
|
||||
|
@ -3770,8 +3770,10 @@ bool CBaseFileSystem::IsFileWritable( char const *pFileName, char const *pPathID
|
||||
{
|
||||
#ifdef WIN32
|
||||
if( buf.st_mode & _S_IWRITE )
|
||||
#elif LINUX
|
||||
#elif defined (LINUX) && !defined (ANDROID)
|
||||
if( buf.st_mode & S_IWRITE )
|
||||
#elif ANDROID
|
||||
if( buf.st_mode & S_IWUSR )
|
||||
#else
|
||||
if( buf.st_mode & S_IWRITE )
|
||||
#endif
|
||||
@ -3792,8 +3794,10 @@ bool CBaseFileSystem::IsFileWritable( char const *pFileName, char const *pPathID
|
||||
{
|
||||
#ifdef WIN32
|
||||
if ( buf.st_mode & _S_IWRITE )
|
||||
#elif LINUX
|
||||
#elif defined (LINUX) && !defined (ANDROID)
|
||||
if ( buf.st_mode & S_IWRITE )
|
||||
#elif ANDROID
|
||||
if ( buf.st_mode & S_IWUSR )
|
||||
#else
|
||||
if ( buf.st_mode & S_IWRITE )
|
||||
#endif
|
||||
@ -3812,6 +3816,8 @@ bool CBaseFileSystem::SetFileWritable( char const *pFileName, bool writable, con
|
||||
|
||||
#ifdef _WIN32
|
||||
int pmode = writable ? ( _S_IWRITE | _S_IREAD ) : ( _S_IREAD );
|
||||
#elif ANDROID
|
||||
int pmode = writable ? ( S_IWUSR | S_IRUSR ) : ( S_IRUSR );
|
||||
#else
|
||||
int pmode = writable ? ( S_IWRITE | S_IREAD ) : ( S_IREAD );
|
||||
#endif
|
||||
@ -5062,13 +5068,15 @@ CSysModule *CBaseFileSystem::LoadModule( const char *pFileName, const char *pPat
|
||||
|
||||
|
||||
#ifdef POSIX
|
||||
Q_snprintf( tempPathID, sizeof(tempPathID), "lib%s", pFileName );
|
||||
pModule = Sys_LoadModule( tempPathID );
|
||||
if( !pModule )
|
||||
#endif
|
||||
{
|
||||
pModule = Sys_LoadModule( pFileName );
|
||||
Q_snprintf( tempPathID, sizeof(tempPathID), "lib%s", pFileName );
|
||||
pModule = Sys_LoadModule( tempPathID );
|
||||
}
|
||||
#endif
|
||||
|
||||
if( !pModule )
|
||||
pModule = Sys_LoadModule( pFileName );
|
||||
|
||||
return pModule;
|
||||
}
|
||||
|
@ -972,7 +972,11 @@ void CStdioFile::FS_fclose()
|
||||
AUTO_LOCK( m_MutexLockedFD );
|
||||
|
||||
struct _stat buf;
|
||||
#ifdef ANDROID
|
||||
int fd = fileno( m_pFile ); // need to test this
|
||||
#else
|
||||
int fd = fileno_unlocked( m_pFile );
|
||||
#endif
|
||||
fstat( fd, &buf );
|
||||
|
||||
fflush( m_pFile );
|
||||
|
@ -879,10 +879,10 @@ int64 CZipPackFileHandle::AbsoluteBaseOffset()
|
||||
return m_pOwner->GetPackFileBaseOffset() + m_nBase;
|
||||
}
|
||||
|
||||
#if defined( _DEBUG ) && !defined( OSX )
|
||||
#if defined( _DEBUG ) && !defined( OSX ) && !defined( ANDROID )
|
||||
#include <atomic>
|
||||
static std::atomic<int> sLZMAPackFileHandles( 0 );
|
||||
#endif // defined( _DEBUG ) && !defined( OSX )
|
||||
#endif // defined( _DEBUG ) && !defined( OSX ) && !defined( ANDROID )
|
||||
|
||||
CLZMAZipPackFileHandle::CLZMAZipPackFileHandle( CZipPackFile* pOwner, int64 nBase, unsigned int nOriginalSize, unsigned int nCompressedSize,
|
||||
unsigned int nIndex, unsigned int nFilePointer )
|
||||
@ -892,7 +892,7 @@ CLZMAZipPackFileHandle::CLZMAZipPackFileHandle( CZipPackFile* pOwner, int64 nBas
|
||||
m_pLZMAStream( NULL ), m_nSeekPosition( 0 ), m_nOriginalSize( nOriginalSize )
|
||||
{
|
||||
Reset();
|
||||
#if defined( _DEBUG ) && !defined( OSX )
|
||||
#if defined( _DEBUG ) && !defined( OSX ) && !defined( ANDROID )
|
||||
if ( ++sLZMAPackFileHandles == PACKFILE_COMPRESSED_FILE_HANDLES_WARNING )
|
||||
{
|
||||
// By my count a live filehandle is currently around 270k, mostly due to the LZMA dictionary (256k) with the
|
||||
@ -901,17 +901,17 @@ CLZMAZipPackFileHandle::CLZMAZipPackFileHandle( CZipPackFile* pOwner, int64 nBas
|
||||
"These carry large buffers around, and can cause high memory usage\n",
|
||||
PACKFILE_COMPRESSED_FILE_HANDLES_WARNING );
|
||||
}
|
||||
#endif // defined( _DEBUG ) && !defined( OSX )
|
||||
#endif // defined( _DEBUG ) && !defined( OSX ) && !defined( ANDROID )
|
||||
}
|
||||
|
||||
CLZMAZipPackFileHandle::~CLZMAZipPackFileHandle()
|
||||
{
|
||||
delete m_pLZMAStream;
|
||||
m_pLZMAStream = NULL;
|
||||
#if defined( _DEBUG ) && !defined( OSX )
|
||||
#if defined( _DEBUG ) && !defined( OSX ) && !defined( ANDROID )
|
||||
sLZMAPackFileHandles--;
|
||||
Assert( sLZMAPackFileHandles >= 0 );
|
||||
#endif // defined( _DEBUG ) && !defined( OSX )
|
||||
#endif // defined( _DEBUG ) && !defined( OSX ) && !defined( ANDROID )
|
||||
}
|
||||
|
||||
int CLZMAZipPackFileHandle::Read( void* pBuffer, int nDestSize, int nBytes )
|
||||
|
@ -98,6 +98,8 @@ void CMumbleSystem::LevelInitPostEntity()
|
||||
g_hMapObject = NULL;
|
||||
return;
|
||||
}
|
||||
#elif defined( ANDROID )
|
||||
return; // TODO(JusicP): implement
|
||||
#elif defined( POSIX )
|
||||
char memname[256];
|
||||
V_sprintf_safe( memname, "/MumbleLink.%d", getuid() );
|
||||
|
@ -559,7 +559,9 @@ def build(bld):
|
||||
'RT'
|
||||
]
|
||||
|
||||
install_path = bld.env.PREFIX+'/hl2/bin'
|
||||
install_path = bld.env.PREFIX
|
||||
if bld.env.DEST_OS != 'android':
|
||||
install_path += '/hl2/bin'
|
||||
|
||||
bld.shlib(
|
||||
source = source,
|
||||
|
@ -602,7 +602,9 @@ def build(bld):
|
||||
|
||||
libs = ['tier0','particles','dmxloader','tier1','tier2','tier3','mathlib','vstdlib','choreoobjects','steam_api']
|
||||
|
||||
install_path = bld.env.PREFIX+'/hl2/bin'
|
||||
install_path = bld.env.PREFIX
|
||||
if bld.env.DEST_OS != 'android':
|
||||
install_path += '/hl2/bin'
|
||||
|
||||
bld.shlib(
|
||||
source = source,
|
||||
|
@ -107,7 +107,7 @@ def build(bld):
|
||||
|
||||
defines = []
|
||||
|
||||
libs = ['tier0','vgui_controls','tier1','tier2','tier3','vstdlib','vtf','bitmap','mathlib','SDL2','steam_api','matsys_controls','JPEG','PNG']
|
||||
libs = ['tier0','vgui_controls','tier1','tier2','tier3','vstdlib','vtf','bitmap','mathlib','SDL2','steam_api','matsys_controls','JPEG','PNG','ZLIB']
|
||||
|
||||
install_path = bld.env.LIBDIR
|
||||
|
||||
|
145
launcher/android.cpp
Normal file
145
launcher/android.cpp
Normal file
@ -0,0 +1,145 @@
|
||||
#ifdef ANDROID
|
||||
|
||||
#include <android/log.h>
|
||||
#include <jni.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
|
||||
#include "tier0/threadtools.h"
|
||||
|
||||
char *LauncherArgv[512];
|
||||
char java_args[4096];
|
||||
int iLastArgs = 0;
|
||||
|
||||
#define TAG "SRCENG"
|
||||
#define PRIO ANDROID_LOG_DEBUG
|
||||
#define LogPrintf(...) do { __android_log_print(PRIO, TAG, __VA_ARGS__); printf( __VA_ARGS__); } while( 0 );
|
||||
#define DLLEXPORT extern "C" __attribute__((visibility("default")))
|
||||
|
||||
DLLEXPORT void Java_com_valvesoftware_ValveActivity2_setDataDirectoryPath(JNIEnv *env, jclass *clazz, jstring path)
|
||||
{
|
||||
setenv( "APP_DATA_PATH", env->GetStringUTFChars(path, NULL), 1);
|
||||
LogPrintf( "Java_com_valvesoftware_ValveActivity2_setDataDirectoryPath: %s", getenv("APP_DATA_PATH") );
|
||||
}
|
||||
|
||||
DLLEXPORT void Java_com_valvesoftware_ValveActivity2_setGameDirectoryPath(JNIEnv *env, jclass *clazz, jstring path)
|
||||
{
|
||||
LogPrintf( "Java_com_valvesoftware_ValveActivity2_setGameDirectoryPath" );
|
||||
setenv( "VALVE_GAME_PATH", env->GetStringUTFChars(path, NULL), 1 );
|
||||
}
|
||||
|
||||
DLLEXPORT int Java_com_valvesoftware_ValveActivity2_setenv(JNIEnv *jenv, jclass *jclass, jstring env, jstring value, jint over)
|
||||
{
|
||||
LogPrintf( "Java_com_valvesoftware_ValveActivity2_setenv %s=%s", jenv->GetStringUTFChars(env, NULL), jenv->GetStringUTFChars(value, NULL) );
|
||||
return setenv( jenv->GetStringUTFChars(env, NULL), jenv->GetStringUTFChars(value, NULL), over );
|
||||
}
|
||||
|
||||
DLLEXPORT void Java_com_valvesoftware_ValveActivity2_nativeOnActivityResult()
|
||||
{
|
||||
LogPrintf( "Java_com_valvesoftware_ValveActivity_nativeOnActivityResult" );
|
||||
}
|
||||
|
||||
void parseArgs( char *args )
|
||||
{
|
||||
char *pch;
|
||||
pch = strtok (args," ");
|
||||
while (pch != NULL)
|
||||
{
|
||||
LauncherArgv[iLastArgs++] = pch;
|
||||
pch = strtok (NULL, " ");
|
||||
}
|
||||
}
|
||||
|
||||
DLLEXPORT void Java_com_valvesoftware_ValveActivity2_setArgs(JNIEnv *env, jclass *clazz, jstring str)
|
||||
{
|
||||
strncpy( java_args, env->GetStringUTFChars(str, NULL), sizeof java_args );
|
||||
}
|
||||
|
||||
DLLEXPORT int LauncherMain( int argc, char **argv );
|
||||
|
||||
#define A(a,b) LauncherArgv[iLastArgs++] = (char*)a; \
|
||||
LauncherArgv[iLastArgs++] = (char*)b
|
||||
|
||||
#define D(a) LauncherArgv[iLastArgs++] = (char*)a
|
||||
|
||||
void SetLauncherArgs()
|
||||
{
|
||||
static char binPath[2048];
|
||||
snprintf(binPath, sizeof binPath, "%s/hl2_linux", getenv("APP_DATA_PATH") );
|
||||
LogPrintf(binPath);
|
||||
D(binPath);
|
||||
|
||||
parseArgs(java_args);
|
||||
|
||||
A("-game", "hl2");
|
||||
D("-window");
|
||||
D("-nosteam");
|
||||
D("-insecure");
|
||||
}
|
||||
|
||||
static void *lgles;
|
||||
|
||||
typedef void (*t_set_getprocaddress)(void *(*new_proc_address)(const char *));
|
||||
t_set_getprocaddress gl4es_set_getprocaddress;
|
||||
|
||||
typedef void *(*t_eglGetProcAddress)( const char * );
|
||||
t_eglGetProcAddress eglGetProcAddress;
|
||||
|
||||
void *GetProcAddress( const char *procname )
|
||||
{
|
||||
void *result = dlsym(lgles, procname);
|
||||
if(result)
|
||||
return result;
|
||||
else
|
||||
return eglGetProcAddress(procname);
|
||||
}
|
||||
|
||||
DLLEXPORT int LauncherMainAndroid( int argc, char **argv )
|
||||
{
|
||||
|
||||
SetLauncherArgs();
|
||||
|
||||
void *lgl4es = dlopen("libgl4es.so", 0);
|
||||
if( !lgl4es )
|
||||
{
|
||||
LogPrintf("Failed to dlopen library libgl4es.so: %s\n", dlerror());
|
||||
return 1;
|
||||
}
|
||||
|
||||
void *lEGL = dlopen("libEGL.so", 0);
|
||||
if( !lEGL )
|
||||
{
|
||||
LogPrintf("Failed to dlopen library libEGL.so: %s\n", dlerror());
|
||||
return 1;
|
||||
}
|
||||
|
||||
lgles = dlopen("libGLESv2.so", 0);
|
||||
if( !lgles )
|
||||
{
|
||||
LogPrintf("Failed to dlopen library libGLESv2.so: %s\n", dlerror());
|
||||
return 1;
|
||||
}
|
||||
|
||||
gl4es_set_getprocaddress = (t_set_getprocaddress)dlsym(lgl4es, "set_getprocaddress");
|
||||
eglGetProcAddress = (t_eglGetProcAddress)dlsym(lEGL, "eglGetProcAddress");
|
||||
|
||||
if( gl4es_set_getprocaddress && eglGetProcAddress )
|
||||
{
|
||||
gl4es_set_getprocaddress( &GetProcAddress );
|
||||
}
|
||||
else
|
||||
{
|
||||
LogPrintf("Failed to call set_getprocaddress\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
DeclareCurrentThreadIsMainThread(); // Init thread propertly on Android
|
||||
|
||||
return LauncherMain(iLastArgs, LauncherArgv);
|
||||
}
|
||||
|
||||
#endif
|
@ -82,6 +82,11 @@ int MessageBox( HWND hWnd, const char *message, const char *header, unsigned uTy
|
||||
#define RELAUNCH_FILE "/tmp/hl2_relaunch"
|
||||
#endif
|
||||
|
||||
#if defined ( ANDROID )
|
||||
#include <android/log.h>
|
||||
#include "jni.h"
|
||||
#endif
|
||||
|
||||
// memdbgon must be the last include file in a .cpp file!!!
|
||||
#include "tier0/memdbgon.h"
|
||||
|
||||
@ -248,7 +253,11 @@ bool GetExecutableName( char *out, int outSize )
|
||||
//-----------------------------------------------------------------------------
|
||||
char *GetBaseDirectory( void )
|
||||
{
|
||||
#ifdef ANDROID
|
||||
return getenv("VALVE_GAME_PATH");
|
||||
#else
|
||||
return g_szBasedir;
|
||||
#endif
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -680,8 +689,7 @@ bool CSourceAppSystemGroup::Create()
|
||||
|
||||
if ( !AddSystems( appSystems ) )
|
||||
return false;
|
||||
|
||||
|
||||
|
||||
// This will be NULL for games that don't support VR. That's ok. Just don't load the DLL
|
||||
AppModule_t sourceVRModule = LoadModule( "sourcevr" DLL_EXT_STRING );
|
||||
if( sourceVRModule != APP_MODULE_INVALID )
|
||||
@ -934,7 +942,9 @@ bool GrabSourceMutex()
|
||||
CRC32_ProcessBuffer( &gameCRC, (void *)pchGameParam, Q_strlen( pchGameParam ) );
|
||||
CRC32_Final( &gameCRC );
|
||||
|
||||
#ifdef LINUX
|
||||
#ifdef ANDROID
|
||||
return true;
|
||||
#elif defined (LINUX)
|
||||
/*
|
||||
* Linux
|
||||
*/
|
||||
@ -1175,7 +1185,7 @@ static const char *BuildCommand()
|
||||
// Output : int APIENTRY
|
||||
//-----------------------------------------------------------------------------
|
||||
#ifdef WIN32
|
||||
extern "C" __declspec(dllexport) int LauncherMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
|
||||
extern "C" __declspec(DLL_EXPORT) int LauncherMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
|
||||
#else
|
||||
DLL_EXPORT int LauncherMain( int argc, char **argv )
|
||||
#endif
|
||||
@ -1229,7 +1239,7 @@ DLL_EXPORT int LauncherMain( int argc, char **argv )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
const char *filename;
|
||||
#ifdef WIN32
|
||||
CommandLine()->CreateCmdLine( IsPC() ? VCRHook_GetCommandLine() : lpCmdLine );
|
||||
@ -1448,6 +1458,7 @@ DLL_EXPORT int LauncherMain( int argc, char **argv )
|
||||
|
||||
// Figure out the directory the executable is running from
|
||||
// and make that be the current working directory
|
||||
|
||||
_chdir( GetBaseDirectory() );
|
||||
|
||||
g_LeakDump.m_bCheckLeaks = CommandLine()->CheckParm( "-leakcheck" ) ? true : false;
|
||||
|
@ -19,6 +19,7 @@ def build(bld):
|
||||
'../public/filesystem_init.cpp',
|
||||
'launcher.cpp',
|
||||
'reslistgenerator.cpp',
|
||||
'android.cpp'
|
||||
]
|
||||
|
||||
includes = [
|
||||
|
@ -146,6 +146,7 @@ int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdL
|
||||
#if defined( LINUX )
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
static bool IsDebuggerPresent( int time )
|
||||
{
|
||||
|
@ -15,6 +15,8 @@ def configure(conf):
|
||||
return
|
||||
|
||||
def build(bld):
|
||||
if bld.env.DEST_OS == 'android':
|
||||
return
|
||||
|
||||
source = ['main.cpp']
|
||||
includes = ['../public']
|
||||
@ -22,7 +24,7 @@ def build(bld):
|
||||
libs = []
|
||||
|
||||
if bld.env.DEST_OS != 'win32':
|
||||
libs += [ 'DL' ]
|
||||
libs += [ 'DL', 'LOG' ]
|
||||
else:
|
||||
libs += ['USER32', 'SHELL32']
|
||||
source += ['launcher_main.rc']
|
||||
|
BIN
lib/android/armeabi-v7a/libSDL2.so
Executable file
BIN
lib/android/armeabi-v7a/libSDL2.so
Executable file
Binary file not shown.
BIN
lib/android/armeabi-v7a/libandroid_support.a
Normal file
BIN
lib/android/armeabi-v7a/libandroid_support.a
Normal file
Binary file not shown.
BIN
lib/android/armeabi-v7a/libbz2.a
Executable file
BIN
lib/android/armeabi-v7a/libbz2.a
Executable file
Binary file not shown.
BIN
lib/android/armeabi-v7a/libcrypto.a
Executable file
BIN
lib/android/armeabi-v7a/libcrypto.a
Executable file
Binary file not shown.
BIN
lib/android/armeabi-v7a/libcurl.a
Executable file
BIN
lib/android/armeabi-v7a/libcurl.a
Executable file
Binary file not shown.
BIN
lib/android/armeabi-v7a/libexpat.a
Executable file
BIN
lib/android/armeabi-v7a/libexpat.a
Executable file
Binary file not shown.
BIN
lib/android/armeabi-v7a/libfreetype2.a
Executable file
BIN
lib/android/armeabi-v7a/libfreetype2.a
Executable file
Binary file not shown.
BIN
lib/android/armeabi-v7a/libjpeg.a
Executable file
BIN
lib/android/armeabi-v7a/libjpeg.a
Executable file
Binary file not shown.
BIN
lib/android/armeabi-v7a/libopenal.a
Executable file
BIN
lib/android/armeabi-v7a/libopenal.a
Executable file
Binary file not shown.
BIN
lib/android/armeabi-v7a/libpng.a
Executable file
BIN
lib/android/armeabi-v7a/libpng.a
Executable file
Binary file not shown.
BIN
lib/android/armeabi-v7a/libssl.a
Executable file
BIN
lib/android/armeabi-v7a/libssl.a
Executable file
Binary file not shown.
BIN
lib/android/x86/libandroid_support.a
Normal file
BIN
lib/android/x86/libandroid_support.a
Normal file
Binary file not shown.
@ -15,7 +15,7 @@ def configure(conf):
|
||||
conf.env.append_unique('DEFINES',[
|
||||
'SHADERAPIDX9',
|
||||
'SHADER_DLL_EXPORT',
|
||||
'PROTECTED_THINGS_ENABLE',
|
||||
#'PROTECTED_THINGS_ENABLE', # conflicts with stlport
|
||||
'strncpy=use_Q_strncpy_instead',
|
||||
'_snprintf=use_Q_snprintf_instead',
|
||||
'GL_GLEXT_PROTOTYPES',
|
||||
@ -58,6 +58,9 @@ def build(bld):
|
||||
|
||||
libs = ['tier0','tier1','tier2','vstdlib','togl','bitmap','mathlib']
|
||||
|
||||
if bld.env.DEST_OS == 'android':
|
||||
libs += ['ANDROID_SUPPORT']
|
||||
|
||||
install_path = bld.env.LIBDIR
|
||||
|
||||
bld.shlib(
|
||||
|
@ -150,6 +150,9 @@ def build(bld):
|
||||
|
||||
libs = ['tier0','shaderlib','tier1','mathlib']
|
||||
|
||||
if bld.env.DEST_OS == 'android':
|
||||
libs += ['ANDROID_SUPPORT']
|
||||
|
||||
install_path = bld.env.LIBDIR
|
||||
|
||||
bld.shlib(
|
||||
|
@ -15,7 +15,7 @@ def configure(conf):
|
||||
conf.env.append_unique('DEFINES',[
|
||||
'DEFINE_MATERIALSYSTEM_INTERFACE',
|
||||
'MATERIALSYSTEM_EXPORTS',
|
||||
'PROTECTED_THINGS_ENABLE',
|
||||
#'PROTECTED_THINGS_ENABLE', # conflicts with stlport
|
||||
'strncpy=use_Q_strncpy_instead',
|
||||
'_snprintf=use_Q_snprintf_instead'
|
||||
])
|
||||
|
@ -341,29 +341,40 @@ bool FileSystem_GetExecutableDir( char *exedir, int exeDirLen )
|
||||
|
||||
Q_FixSlashes( exedir );
|
||||
|
||||
#ifdef ANDROID
|
||||
const char* libDir = "lib";
|
||||
#else
|
||||
const char* libDir = "bin";
|
||||
#endif
|
||||
|
||||
// Return the bin directory as the executable dir if it's not in there
|
||||
// because that's really where we're running from...
|
||||
char ext[MAX_PATH];
|
||||
Q_StrRight( exedir, 4, ext, sizeof( ext ) );
|
||||
if ( ext[0] != CORRECT_PATH_SEPARATOR || Q_stricmp( ext+1, "bin" ) != 0 )
|
||||
if ( ext[0] != CORRECT_PATH_SEPARATOR || Q_stricmp( ext+1, libDir ) != 0 )
|
||||
{
|
||||
Q_strncat( exedir, CORRECT_PATH_SEPARATOR_S, exeDirLen, COPY_ALL_CHARACTERS );
|
||||
Q_strncat( exedir, "bin", exeDirLen, COPY_ALL_CHARACTERS );
|
||||
Q_strncat( exedir, libDir, exeDirLen, COPY_ALL_CHARACTERS );
|
||||
Q_FixSlashes( exedir );
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool FileSystem_GetBaseDir( char *baseDir, int baseDirLen )
|
||||
{
|
||||
#ifdef ANDROID
|
||||
strncpy(baseDir, getenv("VALVE_GAME_PATH"), baseDirLen);
|
||||
return true;
|
||||
#else
|
||||
if ( FileSystem_GetExecutableDir( baseDir, baseDirLen ) )
|
||||
{
|
||||
Q_StripFilename( baseDir );
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
|
||||
void LaunchVConfig()
|
||||
@ -543,6 +554,8 @@ FSReturnCode_t FileSystem_LoadSearchPaths( CFSSearchPathsInit &initInfo )
|
||||
if ( !FileSystem_GetBaseDir( baseDir, sizeof( baseDir ) ) )
|
||||
return SetupFileSystemError( false, FS_INVALID_PARAMETERS, "FileSystem_GetBaseDir failed." );
|
||||
|
||||
Msg("filesystem BaseDir: %s\n", baseDir);
|
||||
|
||||
// The MOD directory is always the one that contains gameinfo.txt
|
||||
Q_strncpy( initInfo.m_ModPath, initInfo.m_pDirectoryName, sizeof( initInfo.m_ModPath ) );
|
||||
|
||||
|
@ -39,7 +39,9 @@
|
||||
#define _NORMAL_BLOCK 1
|
||||
|
||||
#include <cstddef>
|
||||
#ifndef ANDROID
|
||||
#include <glob.h>
|
||||
#endif
|
||||
#include <new>
|
||||
#include <sys/types.h>
|
||||
#if !defined( DID_THE_OPERATOR_NEW )
|
||||
|
@ -390,7 +390,7 @@ extern "C"
|
||||
// ensures they are here even when linking against debug or release static libs
|
||||
//-----------------------------------------------------------------------------
|
||||
#ifndef NO_MEMOVERRIDE_NEW_DELETE
|
||||
#ifdef OSX
|
||||
#if defined (OSX) || defined (ANDROID)
|
||||
void *__cdecl operator new( size_t nSize ) throw (std::bad_alloc)
|
||||
#else
|
||||
void *__cdecl operator new( size_t nSize )
|
||||
@ -404,7 +404,7 @@ void *__cdecl operator new( size_t nSize, int nBlockUse, const char *pFileName,
|
||||
return g_pMemAlloc->Alloc(nSize, pFileName, nLine);
|
||||
}
|
||||
|
||||
#ifdef OSX
|
||||
#if defined (OSX) || defined (ANDROID)
|
||||
void __cdecl operator delete( void *pMem ) throw()
|
||||
#else
|
||||
void __cdecl operator delete( void *pMem )
|
||||
@ -412,8 +412,7 @@ void __cdecl operator delete( void *pMem )
|
||||
{
|
||||
g_pMemAlloc->Free( pMem );
|
||||
}
|
||||
|
||||
#ifdef OSX
|
||||
#if defined (OSX) || defined (ANDROID)
|
||||
void operator delete(void*pMem, std::size_t)
|
||||
#else
|
||||
void operator delete(void*pMem, std::size_t) throw()
|
||||
@ -422,7 +421,7 @@ void operator delete(void*pMem, std::size_t) throw()
|
||||
g_pMemAlloc->Free( pMem );
|
||||
}
|
||||
|
||||
#ifdef OSX
|
||||
#if defined (OSX) || defined (ANDROID)
|
||||
void *__cdecl operator new[]( size_t nSize ) throw (std::bad_alloc)
|
||||
#else
|
||||
void *__cdecl operator new[]( size_t nSize )
|
||||
@ -436,7 +435,7 @@ void *__cdecl operator new[] ( size_t nSize, int nBlockUse, const char *pFileNam
|
||||
return g_pMemAlloc->Alloc(nSize, pFileName, nLine);
|
||||
}
|
||||
|
||||
#ifdef OSX
|
||||
#if defined (OSX) || defined (ANDROID)
|
||||
void __cdecl operator delete[]( void *pMem ) throw()
|
||||
#else
|
||||
void __cdecl operator delete[]( void *pMem )
|
||||
|
@ -182,6 +182,7 @@ public:
|
||||
|
||||
// Purges the list and calls delete on each element in it.
|
||||
void PurgeAndDeleteElements();
|
||||
void PurgeAndDeleteElementsArray();
|
||||
|
||||
// Compacts the vector to the number of elements actually in use
|
||||
void Compact();
|
||||
@ -475,6 +476,18 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void PurgeAndDeleteElementsArray()
|
||||
{
|
||||
if ( m_pData != StaticData() )
|
||||
{
|
||||
for( int i=0; i < m_pData->m_Size; i++ )
|
||||
{
|
||||
delete[] Element(i);
|
||||
}
|
||||
RemoveAll();
|
||||
}
|
||||
}
|
||||
|
||||
void FastRemove( int elem )
|
||||
{
|
||||
Assert( IsValidIndex(elem) );
|
||||
@ -1413,6 +1426,17 @@ inline void CUtlVector<T, A>::PurgeAndDeleteElements()
|
||||
Purge();
|
||||
}
|
||||
|
||||
template< typename T, class A >
|
||||
inline void CUtlVector<T, A>::PurgeAndDeleteElementsArray()
|
||||
{
|
||||
for( int i=0; i < m_Size; i++ )
|
||||
{
|
||||
delete[] Element(i);
|
||||
}
|
||||
RemoveAll();
|
||||
}
|
||||
|
||||
|
||||
template< typename T, class A >
|
||||
inline void CUtlVector<T, A>::Compact()
|
||||
{
|
||||
@ -1441,23 +1465,16 @@ void CUtlVector<T, A>::Validate( CValidator &validator, char *pchName )
|
||||
}
|
||||
#endif // DBGFLAG_VALIDATE
|
||||
|
||||
// A vector class for storing pointers, so that the elements pointed to by the pointers are deleted
|
||||
// on exit.
|
||||
template<class T> class CUtlVectorAutoPurge : public CUtlVector< T, CUtlMemory< T, int> >
|
||||
{
|
||||
public:
|
||||
~CUtlVectorAutoPurge( void )
|
||||
{
|
||||
this->PurgeAndDeleteElements();
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
// easy string list class with dynamically allocated strings. For use with V_SplitString, etc.
|
||||
// Frees the dynamic strings in destructor.
|
||||
class CUtlStringList : public CUtlVectorAutoPurge< char *>
|
||||
class CUtlStringList : public CUtlVector< char*, CUtlMemory< char*, int > >
|
||||
{
|
||||
public:
|
||||
~CUtlStringList( void )
|
||||
{
|
||||
PurgeAndDeleteElementsArray();
|
||||
}
|
||||
|
||||
void CopyAndAddToTail( char const *pString ) // clone the string and add to the end
|
||||
{
|
||||
char *pNewStr = new char[1 + strlen( pString )];
|
||||
|
@ -13,7 +13,7 @@ def options(opt):
|
||||
|
||||
def configure(conf):
|
||||
conf.define('_WINDOWS',1) # WTF? this defined in original vpc file
|
||||
conf.define('PROTECTED_THINGS_ENABLE',1)
|
||||
#conf.define('PROTECTED_THINGS_ENABLE',1) # conflicts with stlport
|
||||
|
||||
def build(bld):
|
||||
source = [
|
||||
@ -32,6 +32,9 @@ def build(bld):
|
||||
|
||||
libs = ['tier0','tier1']
|
||||
|
||||
if bld.env.DEST_OS == 'android':
|
||||
libs += ['ANDROID_SUPPORT']
|
||||
|
||||
install_path = bld.env.LIBDIR
|
||||
|
||||
bld.shlib(
|
||||
|
@ -213,7 +213,11 @@ class Android:
|
||||
|
||||
def system_stl(self):
|
||||
# TODO: proper STL support
|
||||
return os.path.abspath(os.path.join(self.ndk_home, 'sources', 'cxx-stl', 'system', 'include'))
|
||||
return [
|
||||
#os.path.abspath(os.path.join(self.ndk_home, 'sources', 'cxx-stl', 'system', 'include')),
|
||||
os.path.abspath(os.path.join(self.ndk_home, 'sources', 'cxx-stl', 'stlport', 'stlport')),
|
||||
os.path.abspath(os.path.join(self.ndk_home, 'sources', 'android', 'support', 'include'))
|
||||
]
|
||||
|
||||
def libsysroot(self):
|
||||
arch = self.arch
|
||||
@ -243,7 +247,7 @@ class Android:
|
||||
'-isystem', '%s/usr/include/' % (self.sysroot())
|
||||
]
|
||||
|
||||
cflags += ['-I%s' % (self.system_stl()), '-DANDROID', '-D__ANDROID__']
|
||||
cflags += ['-I%s'%i for i in 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']
|
||||
@ -335,13 +339,15 @@ def configure(conf):
|
||||
conf.env.CXXFLAGS += android.cflags(True)
|
||||
conf.env.LINKFLAGS += android.linkflags()
|
||||
conf.env.LDFLAGS += android.ldflags()
|
||||
conf.env.STLIBPATH += [os.path.abspath(os.path.join(android.ndk_home, 'sources','cxx-stl','stlport','libs',values[0]))]
|
||||
conf.env.LDFLAGS += ['-lstlport_static']
|
||||
|
||||
conf.env.HAVE_M = True
|
||||
if android.is_hardfp():
|
||||
conf.env.LIB_M = ['m_hard']
|
||||
else: conf.env.LIB_M = ['m']
|
||||
|
||||
conf.env.PREFIX = '/lib/%s' % android.apk_arch()
|
||||
conf.env.PREFIX += '/lib/%s' % android.apk_arch()
|
||||
|
||||
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
|
||||
|
@ -14,7 +14,7 @@ def options(opt):
|
||||
def configure(conf):
|
||||
conf.define('SOUNDEMITTERSYSTEM_EXPORTS',1)
|
||||
conf.define('_WINDOWS',1)
|
||||
conf.define('PROTECTED_THINGS_ENABLE',1)
|
||||
#conf.define('PROTECTED_THINGS_ENABLE',1) # conflicts with stlport
|
||||
#conf.define('fopen','dont_use_fopen') # WINDOWS
|
||||
|
||||
def build(bld):
|
||||
|
@ -14,7 +14,7 @@ def options(opt):
|
||||
def configure(conf):
|
||||
conf.env.append_unique('DEFINES',[
|
||||
'STUDIORENDER_EXPORTS',
|
||||
'PROTECTED_THINGS_ENABLE'
|
||||
#'PROTECTED_THINGS_ENABLE' # conflicts with stlport
|
||||
])
|
||||
|
||||
def build(bld):
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit ecce0cecc39b32bdf704542e3cb870ba4e2e8e42
|
||||
Subproject commit c397ca0520de10f8bf9c85fadc9fcc3055c60b0f
|
@ -31,6 +31,10 @@
|
||||
#include "xbox/xbox_console.h"
|
||||
#endif
|
||||
|
||||
#ifdef ANDROID
|
||||
#include <android/log.h>
|
||||
#endif
|
||||
|
||||
#include "tier0/etwprof.h"
|
||||
|
||||
#ifndef STEAM
|
||||
@ -309,6 +313,10 @@ static SpewRetval_t _SpewMessage( SpewType_t spewType, const char *pGroupName, i
|
||||
nLevel
|
||||
};
|
||||
|
||||
#ifdef ANDROID
|
||||
__android_log_print( ANDROID_LOG_INFO, "SRCENG", "%s", pTempBuffer );
|
||||
#endif
|
||||
|
||||
g_pSpewInfo = &spewInfo;
|
||||
ret = s_SpewOutputFunc( spewType, pTempBuffer );
|
||||
g_pSpewInfo = (int)NULL;
|
||||
|
@ -28,6 +28,9 @@
|
||||
#include <time.h>
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
#ifdef ANDROID
|
||||
#include <linux/stat.h>
|
||||
#endif
|
||||
|
||||
#include "tier0/memdbgon.h"
|
||||
// Benchmark mode uses this heavy-handed method
|
||||
|
@ -23,8 +23,13 @@
|
||||
#elif defined(POSIX)
|
||||
|
||||
#if !defined(OSX)
|
||||
#if defined(ANDROID)
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#else
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/unistd.h>
|
||||
#endif
|
||||
#define sem_unlink( arg )
|
||||
#define OS_TO_PTHREAD(x) (x)
|
||||
#else
|
||||
|
@ -54,7 +54,7 @@ def build(bld):
|
||||
'vcrmode_posix.cpp', #[$POSIX]
|
||||
'vprof.cpp',
|
||||
# 'win32consoleio.cpp', [$WINDOWS]
|
||||
'../tier1/pathmatch.cpp' # [$LINUXALL]
|
||||
#'../tier1/pathmatch.cpp' # [$LINUXALL]
|
||||
]
|
||||
|
||||
includes = [
|
||||
@ -65,7 +65,7 @@ def build(bld):
|
||||
|
||||
defines = []
|
||||
|
||||
libs = ['DL']
|
||||
libs = ['DL', 'M', 'LOG']
|
||||
|
||||
install_path = bld.env.LIBDIR
|
||||
|
||||
|
@ -247,8 +247,10 @@ HMODULE Sys_LoadLibrary( const char *pLibraryName, Sys_Flags flags )
|
||||
#elif POSIX
|
||||
int dlopen_mode = RTLD_NOW;
|
||||
|
||||
#ifndef ANDROID
|
||||
if ( flags & SYS_NOLOAD )
|
||||
dlopen_mode |= RTLD_NOLOAD;
|
||||
#endif
|
||||
|
||||
HMODULE ret = ( HMODULE )dlopen( str, dlopen_mode );
|
||||
if ( !ret && !( flags & SYS_NOLOAD ) )
|
||||
@ -301,20 +303,34 @@ CSysModule *Sys_LoadModule( const char *pModuleName, Sys_Flags flags /* = SYS_NO
|
||||
size_t cCwd = strlen( szCwd );
|
||||
|
||||
bool bUseLibPrefix = false;
|
||||
|
||||
|
||||
#ifdef ANDROID
|
||||
struct stat statBuf;
|
||||
char *dataPath = getenv("APP_DATA_PATH");
|
||||
|
||||
|
||||
Q_snprintf(szAbsoluteModuleName, sizeof(szAbsoluteModuleName), "%s/lib/lib%s", dataPath ,pModuleName);
|
||||
if( stat(szAbsoluteModuleName, &statBuf) != 0 )
|
||||
Q_snprintf(szAbsoluteModuleName, sizeof(szAbsoluteModuleName), "%s/lib/%s", dataPath ,pModuleName);
|
||||
#else
|
||||
|
||||
#ifdef POSIX
|
||||
struct stat statBuf;
|
||||
Q_snprintf(szModuleName, sizeof(szModuleName), "bin/lib%s", pModuleName);
|
||||
bUseLibPrefix |= stat(szModuleName, &statBuf) == 0;
|
||||
#endif
|
||||
|
||||
if( bUseLibPrefix )
|
||||
Q_snprintf( szAbsoluteModuleName, sizeof(szAbsoluteModuleName), "%s/bin/lib%s", szCwd, pModuleName );
|
||||
else
|
||||
Q_snprintf( szAbsoluteModuleName, sizeof(szAbsoluteModuleName), "%s/bin/%s", szCwd, pModuleName );
|
||||
#endif // ANDROID
|
||||
Msg("LoadLibrary: pModule: %s, path: %s\n", pModuleName, szAbsoluteModuleName);
|
||||
|
||||
hDLL = Sys_LoadLibrary( szAbsoluteModuleName, flags );
|
||||
}
|
||||
else
|
||||
Msg("LoadLibrary: path: %s\n", pModuleName);
|
||||
|
||||
|
||||
if ( !hDLL )
|
||||
{
|
||||
|
@ -750,7 +750,7 @@ extern "C" {
|
||||
|
||||
return CALL(freopen)( mpath, mode, stream );
|
||||
}
|
||||
|
||||
#ifndef ANDROID
|
||||
WRAP(fopen, FILE *, const char *path, const char *mode)
|
||||
{
|
||||
// if mode does not have w, a, or +, it's open for read.
|
||||
@ -788,7 +788,7 @@ extern "C" {
|
||||
{
|
||||
return __wrap_open( pathname, O_CREAT|O_WRONLY|O_TRUNC, mode );
|
||||
}
|
||||
|
||||
#endif
|
||||
int __wrap_access(const char *pathname, int mode)
|
||||
{
|
||||
return __real_access( CWrap( pathname, false ), mode );
|
||||
@ -815,6 +815,7 @@ extern "C" {
|
||||
{
|
||||
return CALL(opendir)( CWrap( name, false ) );
|
||||
}
|
||||
#ifndef ANDROID
|
||||
|
||||
WRAP(__xstat, int, int __ver, __const char *__filename, struct stat *__stat_buf)
|
||||
{
|
||||
@ -835,7 +836,7 @@ extern "C" {
|
||||
{
|
||||
return CALL(__lxstat64)( __ver, CWrap( __filename, false), __stat_buf );
|
||||
}
|
||||
|
||||
#endif
|
||||
WRAP(chmod, int, const char *path, mode_t mode)
|
||||
{
|
||||
return CALL(chmod)( CWrap( path, false), mode );
|
||||
|
@ -40,7 +40,7 @@ def build(bld):
|
||||
'memstack.cpp',
|
||||
'NetAdr.cpp',
|
||||
'newbitbuf.cpp',
|
||||
'pathmatch.cpp', # [$LINUXALL]
|
||||
# 'pathmatch.cpp', # [$LINUXALL]
|
||||
# 'processor_detect.cpp', # [$WINDOWS||$X360]
|
||||
'processor_detect_linux.cpp', # [$POSIX]
|
||||
'qsort_s.cpp', # [$LINUXALL||$PS3]
|
||||
|
@ -43,7 +43,7 @@
|
||||
#include "tier1.h"
|
||||
#include "tier2/tier2.h"
|
||||
|
||||
#ifdef _LINUX
|
||||
#if defined(_LINUX) && !defined(__ANDROID__)
|
||||
#include <GL/glx.h>
|
||||
#endif
|
||||
|
||||
@ -296,7 +296,7 @@ static bool CheckOpenGLExtension_internal(const char *ext, const int coremajor,
|
||||
return false;
|
||||
}
|
||||
}
|
||||
#elif !defined ( OSX )
|
||||
#elif !defined ( OSX ) && !defined( __ANDROID__ )
|
||||
if (!ptr)
|
||||
{
|
||||
static CDynamicFunctionOpenGL< true, Display *( APIENTRY *)( ), Display* > glXGetCurrentDisplay("glXGetCurrentDisplay");
|
||||
@ -377,10 +377,12 @@ COpenGLEntryPoints::COpenGLEntryPoints()
|
||||
// !!! FIXME: hint Apple's drivers and not because we rely on the
|
||||
// !!! FIXME: functionality. If so, just remove this check (and the
|
||||
// !!! FIXME: GL_NV_fence code entirely).
|
||||
#ifndef ANDROID // HACK
|
||||
if ((m_bHave_OpenGL) && ((!m_bHave_GL_NV_fence) && (!m_bHave_GL_ARB_sync) && (!m_bHave_GL_APPLE_fence)))
|
||||
{
|
||||
Error( "Required OpenGL extension \"GL_NV_fence\", \"GL_ARB_sync\", or \"GL_APPLE_fence\" is not supported. Please upgrade your OpenGL driver." );
|
||||
}
|
||||
#endif
|
||||
|
||||
// same extension, different name.
|
||||
if (m_bHave_GL_EXT_vertex_array_bgra || m_bHave_GL_ARB_vertex_array_bgra)
|
||||
|
@ -13,7 +13,6 @@ def options(opt):
|
||||
|
||||
def configure(conf):
|
||||
conf.define('TOGL_DLL_EXPORT',1)
|
||||
conf.define('PROTECTED_THINGS_ENABLE',1)
|
||||
conf.env.append_unique('DEFINES',['strncpy=use_Q_strncpy_instead',
|
||||
'_snprintf=use_Q_snprintf_instead'])
|
||||
|
||||
|
@ -92,7 +92,8 @@ void CLinuxFont::CreateFontList()
|
||||
if ( m_FriendlyNameCache.Count() > 0 )
|
||||
return;
|
||||
|
||||
if(!FcInit())
|
||||
#ifndef ANDROID
|
||||
if(!FcInit())
|
||||
return;
|
||||
FcConfig *config;
|
||||
FcPattern *pat;
|
||||
@ -160,8 +161,11 @@ void CLinuxFont::CreateFontList()
|
||||
FcFontSetDestroy(fontset);
|
||||
FcObjectSetDestroy(os);
|
||||
FcPatternDestroy(pat);
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef ANDROID
|
||||
static FcPattern* FontMatch(const char* type, FcType vtype, const void* value,
|
||||
...)
|
||||
{
|
||||
@ -204,6 +208,7 @@ static FcPattern* FontMatch(const char* type, FcType vtype, const void* value,
|
||||
|
||||
return match;
|
||||
}
|
||||
#endif
|
||||
|
||||
bool CLinuxFont::CreateFromMemory(const char *windowsFontName, void *data, int datasize, int tall, int weight, int blur, int scanlines, int flags)
|
||||
{
|
||||
@ -400,6 +405,52 @@ bool CLinuxFont::CreateFromMemory(const char *windowsFontName, void *data, int d
|
||||
return true;
|
||||
}
|
||||
|
||||
#ifdef ANDROID
|
||||
char *FindFontAndroid(bool bBold, int italic)
|
||||
{
|
||||
const char *fontFileName, *fontFileNamePost = NULL;
|
||||
|
||||
fontFileName = "Roboto";
|
||||
|
||||
if( bBold )
|
||||
{
|
||||
if( italic )
|
||||
fontFileNamePost = "BoldItalic";
|
||||
else
|
||||
fontFileNamePost = "Bold";
|
||||
}
|
||||
else if( italic )
|
||||
fontFileNamePost = "Italic";
|
||||
else
|
||||
fontFileName = "Regular";
|
||||
|
||||
char dataFile[MAX_PATH];
|
||||
|
||||
if( fontFileNamePost )
|
||||
snprintf( dataFile, sizeof dataFile, "/system/fonts/%s-%s.ttf", fontFileName, fontFileNamePost );
|
||||
else
|
||||
snprintf( dataFile, sizeof dataFile, "/system/fonts/%s.ttf", fontFileName );
|
||||
|
||||
if( access( dataFile, R_OK ) != 0 )
|
||||
{
|
||||
fontFileNamePost = NULL;
|
||||
fontFileName = "DroidSans";
|
||||
if( bBold > 500 )
|
||||
fontFileNamePost = "Bold";
|
||||
|
||||
if( fontFileNamePost )
|
||||
snprintf( dataFile, sizeof dataFile, "/system/fonts/%s-%s.ttf", fontFileName, fontFileNamePost );
|
||||
else
|
||||
snprintf( dataFile, sizeof dataFile, "/system/fonts/%s.ttf", fontFileName );
|
||||
|
||||
if( access( dataFile, R_OK ) != 0 )
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return dataFile;
|
||||
}
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Given a font name from windows, match it to the filename and return that.
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -413,18 +464,24 @@ char *CLinuxFont::GetFontFileName( const char *windowsFontName, int flags )
|
||||
else if ( !Q_stricmp( pchFontName, "Arial Black" ) || Q_stristr( pchFontName, "bold" ) )
|
||||
bBold = true;
|
||||
|
||||
const int italic = ( flags & vgui::ISurface::FONTFLAG_ITALIC ) ? FC_SLANT_ITALIC : FC_SLANT_ROMAN;
|
||||
const int nFcWeight = bBold ? FC_WEIGHT_BOLD : FC_WEIGHT_NORMAL;
|
||||
const int italic = ( flags & vgui::ISurface::FONTFLAG_ITALIC ) ? FC_SLANT_ITALIC : FC_SLANT_ROMAN;
|
||||
|
||||
FcPattern *match = FontMatch( FC_FAMILY, FcTypeString, pchFontName,
|
||||
#ifdef ANDROID
|
||||
char *filename = FindFontAndroid( bBold, italic );
|
||||
Msg("Android font: %s", filename);
|
||||
if( !filename ) return NULL;
|
||||
return strdup( filename );
|
||||
#else
|
||||
const int nFcWeight = bBold ? FC_WEIGHT_BOLD : FC_WEIGHT_NORMAL;
|
||||
FcPattern *match = FontMatch( FC_FAMILY, FcTypeString, pchFontName,
|
||||
FC_WEIGHT, FcTypeInteger, nFcWeight,
|
||||
FC_SLANT, FcTypeInteger, italic,
|
||||
NULL);
|
||||
if ( !match )
|
||||
{
|
||||
{
|
||||
AssertMsg1( false, "Unable to find font named %s\n", windowsFontName );
|
||||
return NULL;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
char *filenameret = NULL;
|
||||
@ -440,8 +497,11 @@ char *CLinuxFont::GetFontFileName( const char *windowsFontName, int flags )
|
||||
}
|
||||
|
||||
FcPatternDestroy( match );
|
||||
Msg("Android font fc: %s", filenameret);
|
||||
|
||||
return filenameret;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@ -502,7 +562,7 @@ void CLinuxFont::GetCharRGBA( wchar_t ch, int rgbaWide, int rgbaTall, unsigned c
|
||||
if( error == 0 )
|
||||
{
|
||||
uint32 alpha_scale = 1;
|
||||
int Width = min( rgbaWide, bitmap.width );
|
||||
int Width = MIN( rgbaWide, bitmap.width );
|
||||
unsigned char *rgba = prgba + ( nSkipRows * rgbaWide * 4 );
|
||||
|
||||
switch( m_face->glyph->bitmap.pixel_mode )
|
||||
|
@ -31,7 +31,7 @@ def build(bld):
|
||||
'../../public',
|
||||
'../../public/tier0',
|
||||
'../../public/tier1',
|
||||
'../../common'
|
||||
'../../common',
|
||||
] + bld.env.INCLUDES_FT2
|
||||
|
||||
defines = []
|
||||
|
@ -15,7 +15,7 @@ def configure(conf):
|
||||
conf.define('VGUIMATSURFACE_DLL_EXPORT',1)
|
||||
conf.define('GAMEUI_EXPORTS',1)
|
||||
conf.define('DONT_PROTECT_FILEIO_FUNCTIONS',1)
|
||||
conf.define('PROTECTED_THINGS_ENABLE',1)
|
||||
#conf.define('PROTECTED_THINGS_ENABLE',1) # conflicts with stlport
|
||||
|
||||
|
||||
def build(bld):
|
||||
@ -38,13 +38,16 @@ def build(bld):
|
||||
'../public',
|
||||
'../public/tier0',
|
||||
'../public/tier1',
|
||||
'../common'
|
||||
] + bld.env.INCLUDES_SDL2 + bld.env.INCLUDES_FREETYPE
|
||||
'../common',
|
||||
]
|
||||
|
||||
defines = []
|
||||
|
||||
libs = ['bitmap','mathlib','tier0','vgui_controls','tier1','vstdlib','tier2','tier3','vgui_surfacelib','FT2','FC','SDL2']
|
||||
|
||||
if bld.env.DEST_OS == 'android':
|
||||
libs += ['EXPAT']
|
||||
|
||||
install_path = bld.env.LIBDIR
|
||||
|
||||
bld.shlib(
|
||||
|
@ -40,6 +40,9 @@ def build(bld):
|
||||
|
||||
libs = ['tier0','tier1']
|
||||
|
||||
if bld.env.DEST_OS == 'android':
|
||||
libs += ['ANDROID_SUPPORT']
|
||||
|
||||
install_path = bld.env.LIBDIR
|
||||
|
||||
bld.shlib(
|
||||
|
93
wscript
93
wscript
@ -1,6 +1,6 @@
|
||||
#! /usr/bin/env python
|
||||
# encoding: utf-8
|
||||
# a1batross, mittorn, nillerusr
|
||||
# nillerusr
|
||||
|
||||
from __future__ import print_function
|
||||
from waflib import Logs, Context, Configure
|
||||
@ -86,7 +86,7 @@ projects={
|
||||
'dedicated_main',
|
||||
'dmxloader',
|
||||
'engine',
|
||||
# 'game/server',
|
||||
'game/server',
|
||||
'ivp/havana',
|
||||
'ivp/havana/havok/hk_base',
|
||||
'ivp/havana/havok/hk_math',
|
||||
@ -154,15 +154,12 @@ def define_platform(conf):
|
||||
if conf.options.SDL:
|
||||
conf.define('USE_SDL', 1)
|
||||
|
||||
print(conf.env.DEST_OS)
|
||||
|
||||
if conf.env.DEST_OS == 'linux':
|
||||
conf.define('_GLIBCXX_USE_CXX11_ABI',0)
|
||||
conf.env.append_unique('DEFINES', [
|
||||
'LINUX=1', '_LINUX=1',
|
||||
'POSIX=1', '_POSIX=1',
|
||||
'GNUC',
|
||||
'NDEBUG',
|
||||
'NO_HOOK_MALLOC',
|
||||
'_DLL_EXT=.so'
|
||||
])
|
||||
@ -173,11 +170,19 @@ def define_platform(conf):
|
||||
'LINUX=1', '_LINUX=1',
|
||||
'POSIX=1', '_POSIX=1',
|
||||
'GNUC',
|
||||
'NDEBUG',
|
||||
'NO_HOOK_MALLOC',
|
||||
'_DLL_EXT=.so'
|
||||
])
|
||||
|
||||
if conf.options.DEBUG_ENGINE:
|
||||
conf.env.append_unique('DEFINES', [
|
||||
'DEBUG', '_DEBUG'
|
||||
])
|
||||
else:
|
||||
conf.env.append_unique('DEFINES', [
|
||||
'NDEBUG'
|
||||
])
|
||||
|
||||
def options(opt):
|
||||
grp = opt.add_option_group('Common options')
|
||||
|
||||
@ -187,12 +192,18 @@ def options(opt):
|
||||
grp.add_option('-d', '--dedicated', action = 'store_true', dest = 'DEDICATED', default = False,
|
||||
help = 'build dedicated server [default: %default]')
|
||||
|
||||
grp.add_option('-D', '--debug-engine', action = 'store_true', dest = 'DEBUG_ENGINE', default = False,
|
||||
help = 'build with -DDEBUG [default: %default]')
|
||||
|
||||
grp.add_option('--use-sdl', action = 'store', dest = 'SDL', type = 'int', default = True,
|
||||
help = 'build engine with SDL [default: %default]')
|
||||
|
||||
grp.add_option('--use-togl', action = 'store', dest = 'GL', type = 'int', default = True,
|
||||
help = 'build engine with ToGL [default: %default]')
|
||||
|
||||
grp.add_option('--use-ccache', action = 'store_true', dest = 'CCACHE', default = False,
|
||||
help = 'build using ccache [default: %default]')
|
||||
|
||||
opt.load('compiler_optimizations subproject')
|
||||
|
||||
# opt.add_subproject(projects['game'])
|
||||
@ -226,20 +237,6 @@ def configure(conf):
|
||||
|
||||
conf.load('force_32bit')
|
||||
|
||||
if conf.options.SDL:
|
||||
conf.check_cfg(package='sdl2', uselib_store='SDL2', args=['--cflags', '--libs'])
|
||||
if conf.options.DEDICATED:
|
||||
conf.check_cfg(package='libedit', uselib_store='EDIT', args=['--cflags', '--libs'])
|
||||
else:
|
||||
conf.check_pkg('freetype2', 'FT2', FT2_CHECK)
|
||||
conf.check_pkg('fontconfig', 'FC', FC_CHECK)
|
||||
conf.check_cfg(package='openal', uselib_store='OPENAL', args=['--cflags', '--libs'])
|
||||
conf.check_cfg(package='libjpeg', uselib_store='JPEG', args=['--cflags', '--libs'])
|
||||
conf.check_cfg(package='libpng', uselib_store='PNG', args=['--cflags', '--libs'])
|
||||
conf.check_cfg(package='libcurl', uselib_store='CURL', args=['--cflags', '--libs'])
|
||||
|
||||
conf.check_cfg(package='zlib', uselib_store='ZLIB', args=['--cflags', '--libs'])
|
||||
|
||||
compiler_optional_flags = [
|
||||
'-Wall',
|
||||
'-fdiagnostics-color=always',
|
||||
@ -258,6 +255,17 @@ def configure(conf):
|
||||
|
||||
flags = ['-fPIC']
|
||||
|
||||
if conf.env.DEST_OS == 'android':
|
||||
flags += [
|
||||
'-L'+os.path.abspath('.')+'/lib/android/armeabi-v7a/',
|
||||
'-I'+os.path.abspath('.')+'/thirdparty/curl/include',
|
||||
'-I'+os.path.abspath('.')+'/thirdparty/SDL',
|
||||
'-I'+os.path.abspath('.')+'/thirdparty/openal-soft/include/',
|
||||
'-I'+os.path.abspath('.')+'/thirdparty/fontconfig',
|
||||
'-I'+os.path.abspath('.')+'/thirdparty/freetype/include',
|
||||
'-llog'
|
||||
]
|
||||
|
||||
if conf.env.DEST_CPU == 'arm':
|
||||
flags += ['-mfpu=neon', '-fsigned-char']
|
||||
else:
|
||||
@ -270,15 +278,17 @@ def configure(conf):
|
||||
cxxflags = list(cflags) + ['-std=c++11','-fpermissive']
|
||||
|
||||
if conf.env.COMPILER_CC == 'gcc':
|
||||
wrapfunctions = ['freopen','fopen','open','creat','access','__xstat','stat','lstat','fopen64','open64',
|
||||
'opendir','__lxstat','chmod','chown','lchown','symlink','link','__lxstat64','mknod',
|
||||
'utimes','unlink','rename','utime','__xstat64','mount','mkfifo','mkdir','rmdir','scandir','realpath']
|
||||
# wrapfunctions = ['freopen','creat','access','__xstat','stat','lstat','fopen64','open64',
|
||||
# 'opendir','__lxstat','chmod','chown','lchown','symlink','link','__lxstat64','mknod',
|
||||
# 'utimes','unlink','rename','utime','__xstat64','mount','mkdir','rmdir','scandir','realpath','mkfifo']
|
||||
|
||||
# for func in wrapfunctions:
|
||||
# linkflags += ['-Wl,--wrap='+func]
|
||||
|
||||
for func in wrapfunctions:
|
||||
linkflags += ['-Wl,--wrap='+func]
|
||||
|
||||
conf.define('COMPILER_GCC', 1)
|
||||
|
||||
|
||||
if conf.env.COMPILER_CC != 'msvc':
|
||||
conf.check_cc(cflags=cflags, linkflags=linkflags, msg='Checking for required C flags')
|
||||
conf.check_cxx(cxxflags=cxxflags, linkflags=linkflags, msg='Checking for required C++ flags')
|
||||
@ -296,6 +306,32 @@ def configure(conf):
|
||||
conf.env.append_unique('LINKFLAGS', linkflags)
|
||||
conf.env.append_unique('INCLUDES', [os.path.abspath('common/')])
|
||||
|
||||
if conf.env.DEST_OS != 'android':
|
||||
if conf.options.SDL:
|
||||
conf.check_cfg(package='sdl2', uselib_store='SDL2', args=['--cflags', '--libs'])
|
||||
if conf.options.DEDICATED:
|
||||
conf.check_cfg(package='libedit', uselib_store='EDIT', args=['--cflags', '--libs'])
|
||||
else:
|
||||
conf.check_pkg('freetype2', 'FT2', FT2_CHECK)
|
||||
conf.check_pkg('fontconfig', 'FC', FC_CHECK)
|
||||
conf.check_cfg(package='openal', uselib_store='OPENAL', args=['--cflags', '--libs'])
|
||||
conf.check_cfg(package='libjpeg', uselib_store='JPEG', args=['--cflags', '--libs'])
|
||||
conf.check_cfg(package='libpng', uselib_store='PNG', args=['--cflags', '--libs'])
|
||||
conf.check_cfg(package='libcurl', uselib_store='CURL', args=['--cflags', '--libs'])
|
||||
conf.check_cfg(package='zlib', uselib_store='ZLIB', args=['--cflags', '--libs'])
|
||||
else:
|
||||
conf.check(lib='SDL2', uselib_store='SDL2')
|
||||
conf.check(lib='freetype2', uselib_store='FT2')
|
||||
conf.check(lib='openal', uselib_store='OPENAL')
|
||||
conf.check(lib='jpeg', uselib_store='JPEG')
|
||||
conf.check(lib='png', uselib_store='PNG')
|
||||
conf.check(lib='curl', uselib_store='CURL')
|
||||
conf.check(lib='z', uselib_store='ZLIB')
|
||||
conf.check(lib='crypto', uselib_store='CRYPTO')
|
||||
conf.check(lib='ssl', uselib_store='SSL')
|
||||
conf.check(lib='expat', uselib_store='EXPAT')
|
||||
conf.check(lib='android_support', uselib_store='ANDROID_SUPPORT')
|
||||
|
||||
if conf.env.DEST_OS != 'win32':
|
||||
conf.check_cc(lib='dl', mandatory=False)
|
||||
conf.check_cc(lib='bz2', mandatory=False)
|
||||
@ -336,12 +372,19 @@ def configure(conf):
|
||||
else:
|
||||
conf.env.LIBDIR = conf.env.BINDIR = conf.env.PREFIX
|
||||
|
||||
if conf.options.CCACHE:
|
||||
conf.env.CC.insert(0, 'ccache')
|
||||
conf.env.CXX.insert(0, 'ccache')
|
||||
print( conf.env )
|
||||
|
||||
if conf.options.DEDICATED:
|
||||
conf.add_subproject(projects['dedicated'])
|
||||
else:
|
||||
conf.add_subproject(projects['game'])
|
||||
|
||||
def build(bld):
|
||||
os.environ["CCACHE_DIR"] = os.path.abspath('.ccache/'+bld.env.COMPILER_CC+'/'+bld.env.DEST_OS+'/'+bld.env.DEST_CPU)
|
||||
|
||||
if bld.env.DEDICATED:
|
||||
bld.add_subproject(projects['dedicated'])
|
||||
else:
|
||||
|
Loading…
Reference in New Issue
Block a user