mirror of
https://github.com/dhewm/dhewm3.git
synced 2024-11-26 22:31:17 +00:00
Basic infrastructure for native x86_64 builds
Let scons link directly in the build folder. Multiple archs can coexist next to each other. New scons variable "X86" to cross compile x86 binaries on x86_64.
This commit is contained in:
parent
49859d747e
commit
2995bcab30
7 changed files with 90 additions and 63 deletions
5
.gitignore
vendored
5
.gitignore
vendored
|
@ -3,8 +3,3 @@ build
|
|||
.*.swp
|
||||
*.pyc
|
||||
neo/site.conf
|
||||
neo/scons.signatures.dblite
|
||||
neo/doom.x86
|
||||
neo/doomded.x86
|
||||
neo/game*.so
|
||||
neo/core
|
||||
|
|
123
neo/SConstruct
123
neo/SConstruct
|
@ -12,7 +12,7 @@ import scons_utils
|
|||
conf_filename='site.conf'
|
||||
# choose configuration variables which should be saved between runs
|
||||
# ( we handle all those as strings )
|
||||
serialized=['CC', 'CXX', 'BUILD', 'IDNET_HOST', 'GL_HARDLINK', 'DEDICATED',
|
||||
serialized=['CC', 'CXX', 'X86', 'BUILD', 'IDNET_HOST', 'GL_HARDLINK', 'DEDICATED',
|
||||
'DEBUG_MEMORY', 'LIBC_MALLOC', 'ID_NOLANADDRESS', 'ID_MCHECK', 'ALSA',
|
||||
'TARGET_CORE', 'TARGET_GAME', 'TARGET_D3XP', 'TARGET_MONO', 'TARGET_DEMO', 'NOCURL',
|
||||
'BUILD_ROOT', 'BUILD_GAMEPAK', 'BASEFLAGS' ]
|
||||
|
@ -63,6 +63,9 @@ BUILD_GAMEPAK (default 0)
|
|||
BASEFLAGS (default '')
|
||||
Add compile flags
|
||||
|
||||
X86 (default 0)
|
||||
cross compile for x86 (only applicable on x86_64)
|
||||
|
||||
NOCONF (default 0, not saved)
|
||||
ignore site configuration and use defaults + command line only
|
||||
"""
|
||||
|
@ -136,16 +139,25 @@ EnsureSConsVersion( 0, 96 )
|
|||
# system detection -------------------------------
|
||||
|
||||
# CPU type
|
||||
cpu = commands.getoutput('uname -m')
|
||||
exp = re.compile('.*i?86.*')
|
||||
if exp.match(cpu):
|
||||
cpu = 'x86'
|
||||
else:
|
||||
cpu = commands.getoutput('uname -p')
|
||||
if ( cpu == 'powerpc' ):
|
||||
cpu = 'ppc'
|
||||
else:
|
||||
cpu = 'cpu'
|
||||
g_cpu = ''
|
||||
|
||||
uname = commands.getoutput('uname -m')
|
||||
if uname == 'x86_64':
|
||||
g_cpu = 'x86_64'
|
||||
|
||||
if len(g_cpu) < 1:
|
||||
exp = re.compile('.*i?86.*')
|
||||
if exp.match(uname):
|
||||
g_cpu = 'x86'
|
||||
|
||||
if len(g_cpu) < 1:
|
||||
uname = commands.getoutput('uname -p')
|
||||
if (uname == 'powerpc'):
|
||||
g_cpu = 'ppc'
|
||||
|
||||
if len(g_cpu) < 1:
|
||||
g_cpu = 'cpu'
|
||||
|
||||
g_os = 'Linux'
|
||||
|
||||
# end system detection ---------------------------
|
||||
|
@ -155,6 +167,7 @@ g_os = 'Linux'
|
|||
CC = 'gcc'
|
||||
CXX = 'g++'
|
||||
BUILD = 'debug'
|
||||
X86 = '0'
|
||||
DEDICATED = '0'
|
||||
TARGET_CORE = '1'
|
||||
TARGET_GAME = '1'
|
||||
|
@ -236,21 +249,6 @@ if ( g_sdk or SDK != '0' ):
|
|||
|
||||
# general configuration, target selection --------
|
||||
|
||||
g_build = BUILD_ROOT + '/' + BUILD
|
||||
|
||||
SConsignFile( 'scons.signatures' )
|
||||
|
||||
if ( GL_HARDLINK != '0' ):
|
||||
g_build += '-hardlink'
|
||||
|
||||
if ( DEBUG_MEMORY != '0' ):
|
||||
g_build += '-debugmem'
|
||||
|
||||
if ( LIBC_MALLOC != '1' ):
|
||||
g_build += '-nolibcmalloc'
|
||||
|
||||
LINK = CXX
|
||||
|
||||
# common flags
|
||||
# BASE + CORE + OPT for engine
|
||||
# BASE + GAME + OPT for game
|
||||
|
@ -267,6 +265,27 @@ CORELINKFLAGS = [ ]
|
|||
# for release build, further optimisations that may not work on all files
|
||||
OPTCPPFLAGS = [ ]
|
||||
|
||||
if (g_cpu == 'x86_64' and X86 == '1'):
|
||||
print('cross compiling for x86')
|
||||
g_cpu = 'x86'
|
||||
BASECPPFLAGS.append('-m32')
|
||||
BASELINKFLAGS.append('-m32')
|
||||
|
||||
g_build = '%s/%s-%s' % (BUILD_ROOT, g_cpu, BUILD)
|
||||
|
||||
SConsignFile( g_build + '/scons.signatures' )
|
||||
|
||||
if ( GL_HARDLINK != '0' ):
|
||||
g_build += '-hardlink'
|
||||
|
||||
if ( DEBUG_MEMORY != '0' ):
|
||||
g_build += '-debugmem'
|
||||
|
||||
if ( LIBC_MALLOC != '1' ):
|
||||
g_build += '-nolibcmalloc'
|
||||
|
||||
LINK = CXX
|
||||
|
||||
BASECPPFLAGS.extend( BASEFLAGS.split(' ') )
|
||||
BASECPPFLAGS.append( '-pipe' )
|
||||
# warn all
|
||||
|
@ -278,9 +297,6 @@ CORECPPFLAGS.append( '-DXTHREADS' )
|
|||
if ( g_os == 'Linux' ):
|
||||
# gcc 4.x option only - only export what we mean to from the game SO
|
||||
BASECPPFLAGS.append( '-fvisibility=hidden' )
|
||||
# get the 64 bits machine on the distcc array to produce 32 bit binaries :)
|
||||
BASECPPFLAGS.append( '-m32' )
|
||||
BASELINKFLAGS.append( '-m32' )
|
||||
|
||||
if ( g_sdk or SDK != '0' ):
|
||||
BASECPPFLAGS.append( '-D_D3SDK' )
|
||||
|
@ -299,7 +315,10 @@ elif ( BUILD == 'release' ):
|
|||
# -finline-functions: implicit at -O3
|
||||
# -fschedule-insns2: implicit at -O2
|
||||
# no-unsafe-math-optimizations: that should be on by default really. hit some wonko bugs in physics code because of that
|
||||
OPTCPPFLAGS = [ '-O3', '-march=pentium3', '-Winline', '-ffast-math', '-fno-unsafe-math-optimizations', '-fomit-frame-pointer' ]
|
||||
OPTCPPFLAGS = [ '-O3', '-ffast-math', '-fno-unsafe-math-optimizations', '-fomit-frame-pointer' ]
|
||||
if (g_cpu == 'x86'):
|
||||
OPTCPPFLAGS.append('-march=pentium3')
|
||||
|
||||
if ( ID_MCHECK == '0' ):
|
||||
ID_MCHECK = '2'
|
||||
else:
|
||||
|
@ -367,7 +386,7 @@ local_idlibpic = 0
|
|||
# switch between base game build and d3xp game build
|
||||
local_d3xp = 0
|
||||
|
||||
GLOBALS = 'g_env g_env_noopt g_game_env g_os ID_MCHECK ALSA idlib_objects game_objects local_dedicated local_gamedll local_demo local_idlibpic local_curl local_d3xp OPTCPPFLAGS'
|
||||
GLOBALS = 'g_env g_env_noopt g_game_env g_os g_cpu g_build ID_MCHECK ALSA idlib_objects game_objects local_dedicated local_gamedll local_demo local_idlibpic local_curl local_d3xp OPTCPPFLAGS'
|
||||
|
||||
# end general configuration ----------------------
|
||||
|
||||
|
@ -395,14 +414,13 @@ if ( TARGET_CORE == '1' ):
|
|||
local_dedicated = 0
|
||||
Export( 'GLOBALS ' + GLOBALS )
|
||||
|
||||
VariantDir( g_build + '/core/glimp', '.', duplicate = 1 )
|
||||
SConscript( g_build + '/core/glimp/sys/scons/SConscript.gl' )
|
||||
VariantDir( g_build + '/core', '.', duplicate = 0 )
|
||||
idlib_objects = SConscript( g_build + '/core/sys/scons/SConscript.idlib' )
|
||||
VariantDir( g_build + '/obj-core/glimp', '.', duplicate = 1 )
|
||||
SConscript( g_build + '/obj-core/glimp/sys/scons/SConscript.gl' )
|
||||
VariantDir( g_build + '/obj-core', '.', duplicate = 0 )
|
||||
idlib_objects = SConscript( g_build + '/obj-core/sys/scons/SConscript.idlib' )
|
||||
Export( 'GLOBALS ' + GLOBALS ) # update idlib_objects
|
||||
doom = SConscript( g_build + '/core/sys/scons/SConscript.core' )
|
||||
|
||||
InstallAs( '#doom.' + cpu, doom )
|
||||
doom = SConscript( g_build + '/obj-core/sys/scons/SConscript.core' )
|
||||
g_env.Default(doom)
|
||||
|
||||
if ( DEDICATED == '1' or DEDICATED == '2' ):
|
||||
local_dedicated = 1
|
||||
|
@ -414,8 +432,7 @@ if ( TARGET_CORE == '1' ):
|
|||
idlib_objects = SConscript( g_build + '/dedicated/sys/scons/SConscript.idlib' )
|
||||
Export( 'GLOBALS ' + GLOBALS )
|
||||
doomded = SConscript( g_build + '/dedicated/sys/scons/SConscript.core' )
|
||||
|
||||
InstallAs( '#doomded.' + cpu, doomded )
|
||||
g_env.Default(doomded)
|
||||
|
||||
if ( TARGET_GAME == '1' or TARGET_D3XP == '1' ):
|
||||
local_gamedll = 1
|
||||
|
@ -429,24 +446,24 @@ if ( TARGET_GAME == '1' or TARGET_D3XP == '1' ):
|
|||
# clear the build directory to be safe
|
||||
g_env.PreBuildSDK( [ g_build + '/game', g_build + '/d3xp' ] )
|
||||
dupe = 1
|
||||
VariantDir( g_build + '/game', '.', duplicate = dupe )
|
||||
idlib_objects = SConscript( g_build + '/game/sys/scons/SConscript.idlib' )
|
||||
VariantDir( g_build + '/obj-base', '.', duplicate = dupe )
|
||||
idlib_objects = SConscript( g_build + '/obj-base/sys/scons/SConscript.idlib' )
|
||||
if ( TARGET_GAME == '1' ):
|
||||
local_d3xp = 0
|
||||
Export( 'GLOBALS ' + GLOBALS )
|
||||
game = SConscript( g_build + '/game/sys/scons/SConscript.game' )
|
||||
game_base = InstallAs( '#game%s-base.so' % cpu, game )
|
||||
game = SConscript( g_build + '/obj-base/sys/scons/SConscript.game' )
|
||||
g_env.Default(game)
|
||||
if ( BUILD_GAMEPAK == '1' ):
|
||||
Command( '#game01-base.pk4', [ game_base, game ], Action( g_env.BuildGamePak ) )
|
||||
Command( '#game01-base.pk4', [ game, game ], Action( g_env.BuildGamePak ) )
|
||||
if ( TARGET_D3XP == '1' ):
|
||||
# uses idlib as compiled for game/
|
||||
local_d3xp = 1
|
||||
VariantDir( g_build + '/d3xp', '.', duplicate = dupe )
|
||||
VariantDir( g_build + '/obj-d3xp', '.', duplicate = dupe )
|
||||
Export( 'GLOBALS ' + GLOBALS )
|
||||
d3xp = SConscript( g_build + '/d3xp/sys/scons/SConscript.game' )
|
||||
game_d3xp = InstallAs( '#game%s-d3xp.so' % cpu, d3xp )
|
||||
d3xp = SConscript( g_build + '/obj-d3xp/sys/scons/SConscript.game' )
|
||||
g_env.Default(d3xp)
|
||||
if ( BUILD_GAMEPAK == '1' ):
|
||||
Command( '#game01-d3xp.pk4', [ game_d3xp, d3xp ], Action( g_env.BuildGamePak ) )
|
||||
Command( '#game01-d3xp.pk4', [ d3xp, d3xp ], Action( g_env.BuildGamePak ) )
|
||||
|
||||
if ( TARGET_MONO == '1' ):
|
||||
# NOTE: no D3XP atm. add a TARGET_MONO_D3XP
|
||||
|
@ -463,7 +480,7 @@ if ( TARGET_MONO == '1' ):
|
|||
game_objects = SConscript( g_build + '/mono/sys/scons/SConscript.game' )
|
||||
Export( 'GLOBALS ' + GLOBALS )
|
||||
doom_mono = SConscript( g_build + '/mono/sys/scons/SConscript.core' )
|
||||
InstallAs( '#doom-mon.' + cpu, doom_mono )
|
||||
g_env.Default(doom_mono)
|
||||
|
||||
if ( TARGET_DEMO == '1' ):
|
||||
# NOTE: no D3XP atm. add a TARGET_DEMO_D3XP
|
||||
|
@ -480,8 +497,7 @@ if ( TARGET_DEMO == '1' ):
|
|||
idlib_objects = SConscript( g_build + '/demo/sys/scons/SConscript.idlib' )
|
||||
Export( 'GLOBALS ' + GLOBALS )
|
||||
doom_demo = SConscript( g_build + '/demo/sys/scons/SConscript.core' )
|
||||
|
||||
InstallAs( '#doom-demo.' + cpu, doom_demo )
|
||||
g_env.Default(doom_demo)
|
||||
|
||||
local_idlibpic = 1
|
||||
Export( 'GLOBALS ' + GLOBALS )
|
||||
|
@ -489,8 +505,7 @@ if ( TARGET_DEMO == '1' ):
|
|||
idlib_objects = SConscript( g_build + '/demo/game/sys/scons/SConscript.idlib' )
|
||||
Export( 'GLOBALS ' + GLOBALS )
|
||||
game_demo = SConscript( g_build + '/demo/game/sys/scons/SConscript.game' )
|
||||
|
||||
InstallAs( '#game%s-demo.so' % cpu, game_demo )
|
||||
g_env.Default(doom_demo)
|
||||
|
||||
if ( SETUP != '0' ):
|
||||
brandelf = Program( 'brandelf', 'sys/linux/setup/brandelf.c' )
|
||||
|
|
|
@ -93,6 +93,7 @@ If you have questions concerning this license or the applicable additional terms
|
|||
#define NDEBUG
|
||||
#endif
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
|
|
|
@ -273,5 +273,13 @@ source_list += g_env_noopt.StaticObject( '../../tools/compilers/dmap/optimize_gc
|
|||
if ( local_gamedll == 0 ):
|
||||
source_list += game_objects
|
||||
|
||||
d3wm = local_env.Program( target = 'doom', source = source_list )
|
||||
basename = 'doom'
|
||||
if ( local_dedicated == 1 ):
|
||||
basename += 'ded'
|
||||
elif ( local_gamedll == 0 ):
|
||||
basename += '-mon'
|
||||
if ( local_demo == 1 ):
|
||||
basename += '-demo'
|
||||
|
||||
d3wm = local_env.Program( target = '%s/%s.%s' % (g_build, basename, g_cpu), source = source_list )
|
||||
Return( 'd3wm' )
|
||||
|
|
|
@ -84,10 +84,13 @@ if ( local_d3xp ):
|
|||
game_string += ' \
|
||||
Grabber.cpp \
|
||||
physics/Force_Grab.cpp'
|
||||
game_name = 'd3xp'
|
||||
game_list = scons_utils.BuildList( 'd3xp', game_string )
|
||||
else:
|
||||
game_name = 'base'
|
||||
game_list = scons_utils.BuildList( 'game', game_string )
|
||||
|
||||
|
||||
for i in range( len( game_list ) ):
|
||||
game_list[ i ] = '../../' + game_list[ i ]
|
||||
|
||||
|
@ -100,7 +103,7 @@ if ( local_demo == 1 ):
|
|||
|
||||
if ( local_gamedll == 1 ):
|
||||
local_env.Append( CPPDEFINES = [ 'GAME_DLL' ] )
|
||||
ret = local_env.SharedLibrarySafe( local_env, 'game', game_list + idlib_objects )
|
||||
ret = local_env.SharedLibrary( '%s/game%s-%s.so' % (g_build, g_cpu, game_name), game_list + idlib_objects, SHLIBPREFIX='' )
|
||||
Return( 'ret' )
|
||||
else:
|
||||
ret_list = []
|
||||
|
|
|
@ -126,7 +126,7 @@ def checkLDD( target, source, env ):
|
|||
sys.exit(1)
|
||||
|
||||
def SharedLibrarySafe( env, target, source ):
|
||||
ret = env.SharedLibrary( target, source )
|
||||
ret = env.SharedLibrary( target, source, SHLIBPREFIX='' )
|
||||
env.AddPostAction( ret, checkLDD )
|
||||
return ret
|
||||
|
||||
|
|
|
@ -103,11 +103,16 @@ If you have questions concerning this license or the applicable additional terms
|
|||
// Linux
|
||||
#ifdef __linux__
|
||||
|
||||
#define BUILD_OS_ID 2
|
||||
|
||||
#ifdef __i386__
|
||||
#define BUILD_STRING "linux-x86"
|
||||
#define BUILD_OS_ID 2
|
||||
#define CPUSTRING "x86"
|
||||
#define CPU_EASYARGS 1
|
||||
#elif defined(__x86_64__)
|
||||
#define BUILD_STRING "linux-x86_64"
|
||||
#define CPUSTRING "x86_64"
|
||||
#define CPU_EASYARGS 0
|
||||
#elif defined(__ppc__)
|
||||
#define BUILD_STRING "linux-ppc"
|
||||
#define CPUSTRING "ppc"
|
||||
|
|
Loading…
Reference in a new issue