dxx-rebirth/SConstruct
Kp 2fc9fe867f Fix longstanding bug preventing build of both Windows binaries at once
SCons rejected building both Windows targets due to conflicting
instructions on how to compile messagebox.c.  Restructure the lookup so
that only one set of instructions is issued.
2013-05-05 17:39:03 +00:00

902 lines
30 KiB
Python

#SConstruct
# needed imports
import sys
import os
import SCons.Util
class argumentIndirection:
def __init__(self,prefix):
self.prefix = prefix
self.ARGUMENTS = ARGUMENTS
def get(self,name,value):
return self.ARGUMENTS.get('%s_%s' % (self.prefix, name), self.ARGUMENTS.get(name,value))
# endianess-checker
def checkEndian():
if ARGUMENTS.has_key('endian'):
r = ARGUMENTS['endian']
if r == "little" or r == "big":
return r
raise SCons.Errors.UserError("Unknown endian value: %s" % r)
import struct
array = struct.pack('cccc', '\x01', '\x02', '\x03', '\x04')
i = struct.unpack('i', array)
if i == struct.unpack('<i', array):
return "little"
elif i == struct.unpack('>i', array):
return "big"
return "unknown"
class LazyObjectConstructor:
def __lazy_objects(self,name,source):
try:
return self.__lazy_object_cache[name]
except KeyError as e:
def __strip_extension(self,name):
return os.path.splitext(name)[0]
value = []
for s in source:
if isinstance(s, str):
s = {'source': [s]}
transform_target = s.get('transform_target', __strip_extension)
for srcname in s['source']:
t = transform_target(self, srcname)
value.append(self.env.StaticObject(target='%s%s%s' % (self.user_settings.builddir, t, self.env["OBJSUFFIX"]), source=srcname))
self.__lazy_object_cache[name] = value
return value
@staticmethod
def create_lazy_object_getter(sources):
name = repr(sources)
return lambda s: s.__lazy_objects(name, sources)
@classmethod
def create_lazy_object_property(cls,sources):
return property(cls.create_lazy_object_getter(sources))
def __init__(self):
self.__lazy_object_cache = {}
class DXXCommon(LazyObjectConstructor):
__endian = checkEndian()
class UserSettings:
def __init__(self,ARGUMENTS):
# Paths for the Videocore libs/includes on the Raspberry Pi
self.RPI_DEFAULT_VC_PATH='/opt/vc'
self.debug = int(ARGUMENTS.get('debug', 0))
self.profiler = int(ARGUMENTS.get('profiler', 0))
self.opengl = int(ARGUMENTS.get('opengl', 1))
self.asm = int(ARGUMENTS.get('asm', 0))
self.editor = int(ARGUMENTS.get('editor', 0))
self.extra_version = ARGUMENTS.get('extra_version', None)
self.sdlmixer = int(ARGUMENTS.get('sdlmixer', 1))
self.ipv6 = int(ARGUMENTS.get('ipv6', 0))
self.platform_name = ARGUMENTS.get('host_platform', None)
self.use_udp = int(ARGUMENTS.get('use_udp', 1))
self.use_tracker = int(ARGUMENTS.get('use_tracker', 1))
self.verbosebuild = int(ARGUMENTS.get('verbosebuild', 0))
self.raspberrypi = int(ARGUMENTS.get('raspberrypi', 0))
self.rpi_vc_path = str(ARGUMENTS.get('rpi_vc_path', self.RPI_DEFAULT_VC_PATH))
self.default_opengles = 0
self.default_OGLES_LIB = 'GLES_CM'
# automatic setup for raspberrypi
if (self.raspberrypi == 1):
self.default_opengles=1
self.default_OGLES_LIB='GLESv2'
self.opengles = int(ARGUMENTS.get('opengles', self.default_opengles))
self.opengles_lib = str(ARGUMENTS.get('opengles_lib', self.default_OGLES_LIB))
builddir_prefix = ARGUMENTS.get('builddir_prefix', None)
builddir_suffix = ARGUMENTS.get('builddir_suffix', None)
default_builddir = builddir_prefix or ''
if builddir_prefix is not None or builddir_suffix is not None:
if self.platform_name:
default_builddir += '%s-' % self.platform_name
if os.environ.has_key('CC'):
default_builddir += '%s-' % os.path.basename(os.environ['CC'])
for a in (
('debug', 'dbg'),
('profiler', 'prf'),
('editor', 'ed'),
('opengl', 'ogl'),
('opengles', 'es'),
('raspberrypi', 'rpi'),
):
if getattr(self, a[0]):
default_builddir += a[1]
if builddir_suffix is not None:
default_builddir += builddir_prefix
self.builddir = ARGUMENTS.get('builddir', default_builddir)
if self.builddir != '' and self.builddir[-1:] != '/':
self.builddir += '/'
# Base class for platform-specific settings processing
class _PlatformSettings:
tools = None
ogllibs = ''
osasmdef = None
platform_sources = []
platform_objects = []
# Settings to apply to mingw32 builds
class Win32PlatformSettings(_PlatformSettings):
tools = ['mingw']
osdef = '_WIN32'
osasmdef = 'win32'
def __init__(self,user_settings):
pass
def adjust_environment(self,program,env):
env.Append(CPPDEFINES = ['_WIN32', 'HAVE_STRUCT_TIMEVAL'])
class DarwinPlatformSettings(_PlatformSettings):
osdef = '__APPLE__'
def __init__(self,user_settings):
user_settings.asm = 0
self.lflags = os.environ["LDFLAGS"] if os.environ.has_key('LDFLAGS') else ''
def adjust_environment(self,program,env):
VERSION = str(program.VERSION_MAJOR) + '.' + str(program.VERSION_MINOR)
if (program.VERSION_MICRO):
VERSION += '.' + str(program.VERSION_MICRO)
env['VERSION_NUM'] = VERSION
env['VERSION_NAME'] = program.PROGRAM_NAME + ' v' + VERSION
env.Append(CPPDEFINES = ['HAVE_STRUCT_TIMESPEC', 'HAVE_STRUCT_TIMEVAL', '__unix__'])
env.Append(CPPPATH = [os.path.join(program.srcdir, '../physfs'), os.path.join(os.getenv("HOME"), 'Library/Frameworks/SDL.framework/Headers'), '/Library/Frameworks/SDL.framework/Headers'])
env.Append(FRAMEWORKS = ['ApplicationServices', 'Carbon', 'Cocoa', 'SDL'])
if (self.user_settings.opengl == 1) or (self.user_settings.opengles == 1):
env.Append(FRAMEWORKS = ['OpenGL'])
env.Append(FRAMEWORKPATH = [os.path.join(os.getenv("HOME"), 'Library/Frameworks'), '/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks'])
self.libs = ['']
env['LIBPATH'] = '../physfs/build/Debug'
# Settings to apply to Linux builds
class LinuxPlatformSettings(_PlatformSettings):
osdef = '__LINUX__'
osasmdef = 'elf'
__opengl_libs = ['GL', 'GLU']
__pkg_config_sdl = {}
def __init__(self,user_settings):
if (user_settings.opengles == 1):
self.ogllibs = [ user_settings.opengles_lib, 'EGL']
else:
self.ogllibs = self.__opengl_libs
def adjust_environment(self,program,env):
env.Append(CPPDEFINES = ['__LINUX__', 'HAVE_STRUCT_TIMESPEC', 'HAVE_STRUCT_TIMEVAL'])
try:
pkgconfig = os.environ['PKG_CONFIG']
except KeyError as e:
try:
pkgconfig = '%s-pkg-config' % os.environ['CHOST']
except KeyError as e:
pkgconfig = 'pkg-config'
cmd = '%s --cflags --libs sdl' % pkgconfig
try:
flags = self.__pkg_config_sdl[cmd]
except KeyError as e:
if (program.user_settings.verbosebuild != 0):
print "%s: reading SDL settings from `%s`" % (program.PROGRAM_NAME, cmd)
self.__pkg_config_sdl[cmd] = env.backtick(cmd)
flags = self.__pkg_config_sdl[cmd]
env.MergeFlags(flags)
def __init__(self):
LazyObjectConstructor.__init__(self)
self.sources = []
def prepare_environment(self):
if self.user_settings.builddir != '':
self.env.VariantDir(self.user_settings.builddir, '.', duplicate=0)
# Prettier build messages......
if (self.user_settings.verbosebuild == 0):
builddir = self.user_settings.builddir if self.user_settings.builddir != '' else '.'
self.env["CCCOMSTR"] = "Compiling %s %s $SOURCE" % (self.target, builddir)
self.env["CXXCOMSTR"] = "Compiling %s %s $SOURCE" % (self.target, builddir)
self.env["LINKCOMSTR"] = "Linking %s $TARGET" % self.target
self.env["ARCOMSTR"] = "Archiving $TARGET ..."
self.env["RANLIBCOMSTR"] = "Indexing $TARGET ..."
# Use -Wundef to catch when a shared source file includes a
# shared header that misuses conditional compilation. Use
# -Werror=undef to make this fatal. Both are needed, since
# gcc 4.5 silently ignores -Werror=undef. On gcc 4.5, misuse
# produces a warning. On gcc 4.7, misuse produces an error.
self.env.Append(CCFLAGS = ['-Wall', '-Wundef', '-Werror=undef', '-funsigned-char', '-Werror=implicit-int', '-Werror=implicit-function-declaration', '-pthread'])
self.env.Append(CFLAGS = ['-std=gnu99'])
self.env.Append(CPPDEFINES = ['NETWORK'])
self.env.Append(CPPPATH = ['common/include', 'common/main', '.'])
if (self.user_settings.editor == 1):
self.env.Append(CPPPATH = ['common/include/editor'])
# Get traditional compiler environment variables
for cc in ['CC', 'CXX']:
if os.environ.has_key(cc):
self.env[cc] = os.environ[cc]
for flags in ['CFLAGS', 'CXXFLAGS']:
if os.environ.has_key(flags):
self.env[flags] += SCons.Util.CLVar(os.environ[flags])
self.sources += self.objects_common[:]
def check_endian(self):
# set endianess
if (self.__endian == "big"):
print "%s: BigEndian machine detected" % self.PROGRAM_NAME
self.asm = 0
self.env.Append(CPPDEFINES = ['WORDS_BIGENDIAN'])
elif (self.__endian == "little"):
print "%s: LittleEndian machine detected" % self.PROGRAM_NAME
def check_platform(self):
# windows or *nix?
platform_name = self.user_settings.platform_name or sys.platform
print "%s: compiling on %s for %s" % (self.PROGRAM_NAME, sys.platform, platform_name)
if platform_name == 'win32':
platform = self.Win32PlatformSettings
elif platform_name == 'darwin':
platform = self.DarwinPlatformSettings
else:
platform = self.LinuxPlatformSettings
self.platform_settings = platform(self.user_settings)
# Acquire environment object...
self.env = Environment(ENV = os.environ, tools = platform.tools)
self.platform_settings.adjust_environment(self, self.env)
self.sources += self.platform_settings.platform_sources
def process_user_settings(self):
env = self.env
# opengl or software renderer?
if (self.user_settings.opengl == 1) or (self.user_settings.opengles == 1):
if (self.user_settings.opengles == 1):
print "%s: building with OpenGL ES" % self.PROGRAM_NAME
env.Append(CPPDEFINES = ['OGLES'])
else:
print "%s: building with OpenGL" % self.PROGRAM_NAME
env.Append(CPPDEFINES = ['OGL'])
# assembler code?
if (self.user_settings.asm == 1) and (self.user_settings.opengl == 0):
print "%s: including: ASSEMBLER" % self.PROGRAM_NAME
env.Replace(AS = 'nasm')
env.Append(ASCOM = ' -f ' + str(self.platform_settings.osasmdef) + ' -d' + str(self.platform_settings.osdef) + ' -Itexmap/ ')
self.sources += asm_sources
else:
env.Append(CPPDEFINES = ['NO_ASM'])
# SDL_mixer support?
if (self.user_settings.sdlmixer == 1):
print "%s: including SDL_mixer" % self.PROGRAM_NAME
env.Append(CPPDEFINES = ['USE_SDLMIXER'])
# debug?
if (self.user_settings.debug == 1):
print "%s: including: DEBUG" % self.PROGRAM_NAME
env.Append(CPPFLAGS = ['-g'])
else:
env.Append(CPPDEFINES = ['NDEBUG', 'RELEASE'])
env.Append(CPPFLAGS = ['-O2'])
# profiler?
if (self.user_settings.profiler == 1):
env.Append(CPPFLAGS = ['-pg'])
#editor build?
if (self.user_settings.editor == 1):
env.Append(CPPDEFINES = ['EDITOR'])
# IPv6 compability?
if (self.user_settings.ipv6 == 1):
env.Append(CPPDEFINES = ['IPv6'])
# UDP support?
if (self.user_settings.use_udp == 1):
env.Append(CPPDEFINES = ['USE_UDP'])
# Tracker support? (Relies on UDP)
if( self.user_settings.use_tracker == 1 ):
env.Append( CPPDEFINES = [ 'USE_TRACKER' ] )
class DXXArchive(DXXCommon):
srcdir = 'common'
target = 'dxx-common'
# Use a prefix of "common" since that is the source directory
# governed by these arguments.
ARGUMENTS = argumentIndirection('common')
__objects_common = DXXCommon.create_lazy_object_property([os.path.join(srcdir, f) for f in [
'2d/2dsline.c',
'2d/bitblt.c',
'2d/bitmap.c',
'2d/box.c',
'2d/canvas.c',
'2d/circle.c',
'2d/disc.c',
'2d/gpixel.c',
'2d/line.c',
'2d/pixel.c',
'2d/poly.c',
'2d/rect.c',
'2d/rle.c',
'2d/scalec.c',
'3d/clipper.c',
'3d/draw.c',
'3d/globvars.c',
'3d/instance.c',
'3d/matrix.c',
'3d/points.c',
'3d/rod.c',
'3d/setup.c',
'arch/sdl/joy.c',
'arch/sdl/rbaudio.c',
'arch/sdl/window.c',
'maths/fixc.c',
'maths/rand.c',
'maths/tables.c',
'maths/vecmat.c',
'misc/dl_list.c',
'misc/error.c',
'misc/hmp.c',
'misc/ignorecase.c',
'misc/strio.c',
'misc/strutil.c',
'texmap/ntmap.c',
'texmap/scanline.c'
]
])
objects_editor = DXXCommon.create_lazy_object_property([os.path.join(srcdir, f) for f in [
'editor/func.c',
'ui/button.c',
'ui/checkbox.c',
'ui/dialog.c',
'ui/file.c',
'ui/gadget.c',
'ui/icon.c',
'ui/inputbox.c',
'ui/keypad.c',
'ui/keypress.c',
'ui/keytrap.c',
'ui/listbox.c',
'ui/menu.c',
'ui/menubar.c',
'ui/message.c',
'ui/popup.c',
'ui/radio.c',
'ui/scroll.c',
'ui/ui.c',
'ui/uidraw.c',
'ui/userbox.c'
]
])
# for non-ogl
objects_arch_sdl = DXXCommon.create_lazy_object_property([os.path.join(srcdir, f) for f in [
'texmap/tmapflat.c'
]
])
objects_arch_sdlmixer = DXXCommon.create_lazy_object_property([os.path.join(srcdir, f) for f in [
'arch/sdl/digi_mixer_music.c',
]
])
class Win32PlatformSettings(LazyObjectConstructor, DXXCommon.Win32PlatformSettings):
platform_objects = LazyObjectConstructor.create_lazy_object_property([
'common/arch/win32/messagebox.c'
])
def __init__(self,user_settings):
LazyObjectConstructor.__init__(self)
DXXCommon.Win32PlatformSettings.__init__(self, user_settings)
self.user_settings = user_settings
def adjust_environment(self,program,env):
DXXCommon.Win32PlatformSettings.adjust_environment(self, program, env)
self.env = env
@property
def objects_common(self):
objects_common = self.__objects_common
return objects_common + self.platform_settings.platform_objects
def __init__(self,builddir):
self.PROGRAM_NAME = 'DXX-Archive'
DXXCommon.__init__(self)
self.user_settings = self.UserSettings(ARGUMENTS)
self.user_settings.builddir = builddir
self.check_platform()
self.prepare_environment()
self.check_endian()
self.process_user_settings()
class DXXProgram(DXXCommon):
# version number
VERSION_MAJOR = 0
VERSION_MINOR = 57
VERSION_MICRO = 3
static_archive_construction = {}
def _apply_target_name(self,name):
return os.path.join(os.path.dirname(name), '.%s.%s' % (self.target, os.path.splitext(os.path.basename(name))[0]))
objects_similar_arch_ogl = DXXCommon.create_lazy_object_property([{
'source':[os.path.join('similar', f) for f in [
'arch/ogl/gr.c',
'arch/ogl/ogl.c',
]
],
'transform_target':_apply_target_name,
}])
objects_similar_arch_sdl = DXXCommon.create_lazy_object_property([{
'source':[os.path.join('similar', f) for f in [
'arch/sdl/gr.c',
]
],
'transform_target':_apply_target_name,
}])
objects_similar_arch_sdlmixer = DXXCommon.create_lazy_object_property([{
'source':[os.path.join('similar', f) for f in [
'arch/sdl/digi_mixer.c',
'arch/sdl/jukebox.c'
]
],
'transform_target':_apply_target_name,
}])
objects_common = DXXCommon.create_lazy_object_property([{
'source':[os.path.join('similar', f) for f in [
'3d/interp.c',
'arch/sdl/event.c',
'arch/sdl/init.c',
'arch/sdl/key.c',
'arch/sdl/mouse.c',
'arch/sdl/timer.c',
'main/config.c',
'main/console.c',
'main/controls.c',
'main/credits.c',
'main/digiobj.c',
'main/effects.c',
'main/gamefont.c',
'main/hostage.c',
'main/hud.c',
'main/inferno.c',
'main/kmatrix.c',
'main/lighting.c',
'main/mglobal.c',
'main/morph.c',
'main/multibot.c',
'main/newmenu.c',
'main/paging.c',
'main/physics.c',
'main/player.c',
'main/robot.c',
'main/scores.c',
'main/slew.c',
'main/terrain.c',
'main/texmerge.c',
'main/text.c',
'main/vclip.c',
'main/wall.c',
'mem/mem.c',
'misc/hash.c',
'misc/physfsx.c',
]
],
'transform_target':_apply_target_name,
}])
objects_editor = DXXCommon.create_lazy_object_property([{
'source':[os.path.join('similar', f) for f in [
'editor/autosave.c',
'editor/centers.c',
'editor/curves.c',
'editor/eglobal.c',
'editor/elight.c',
'editor/eobject.c',
'editor/eswitch.c',
'editor/fixseg.c',
'editor/group.c',
'editor/info.c',
'editor/kbuild.c',
'editor/kcurve.c',
'editor/kfuncs.c',
'editor/kgame.c',
'editor/khelp.c',
'editor/kmine.c',
'editor/ksegmove.c',
'editor/ksegsel.c',
'editor/ksegsize.c',
'editor/ktmap.c',
'editor/kview.c',
'editor/med.c',
'editor/meddraw.c',
'editor/medmisc.c',
'editor/medrobot.c',
'editor/medsel.c',
'editor/medwall.c',
'editor/mine.c',
'editor/objpage.c',
'editor/segment.c',
'editor/seguvs.c',
'editor/texpage.c',
'editor/texture.c',
]
],
'transform_target':_apply_target_name,
}])
class UserSettings(DXXCommon.UserSettings):
def __init__(self,ARGUMENTS,target):
DXXCommon.UserSettings.__init__(self, ARGUMENTS)
# installation path
PREFIX = str(ARGUMENTS.get('prefix', '/usr/local'))
self.BIN_DIR = PREFIX + '/bin'
self.DATA_DIR = PREFIX + '/share/games/' + target
# command-line parms
self.sharepath = str(ARGUMENTS.get('sharepath', self.DATA_DIR))
# Settings to apply to mingw32 builds
class Win32PlatformSettings(DXXCommon.Win32PlatformSettings):
def __init__(self,user_settings):
DXXCommon.Win32PlatformSettings.__init__(self,user_settings)
user_settings.sharepath = ''
self.lflags = '-mwindows'
self.libs = ['glu32', 'wsock32', 'ws2_32', 'winmm', 'mingw32', 'SDLmain', 'SDL']
def adjust_environment(self,program,env):
DXXCommon.Win32PlatformSettings.adjust_environment(self, program, env)
env.RES(os.path.join(program.srcdir, 'arch/win32/%s.rc' % program.target))
env.Append(CPPPATH = [os.path.join(program.srcdir, 'arch/win32/include')])
# Settings to apply to Apple builds
class DarwinPlatformSettings(DXXCommon.DarwinPlatformSettings):
def __init__(self,user_settings):
DXXCommon.DarwinPlatformSettings.__init__(self)
user_settings.sharepath = ''
if (user_settings.sdlmixer == 1):
print "including SDL_mixer"
platform_settings.lflags += ' -framework SDL_mixer'
# Ugly way of linking to frameworks, but kreator has seen uglier
self.lflags = '-framework ApplicationServices -framework Carbon -framework Cocoa -framework SDL'
if (sdl_only == 0):
self.lflags += ' -framework OpenGL'
self.libs = ['../physfs/build/Debug/libphysfs.dylib']
def adjust_environment(self,program,env):
DXXCommon.DarwinPlatformSettings.adjust_environment(self, program, env)
self.platform_sources = [os.path.join(program.srcdir, f) for f in ['arch/cocoa/SDLMain.m', 'arch/carbon/messagebox.c']]
# Settings to apply to Linux builds
class LinuxPlatformSettings(DXXCommon.LinuxPlatformSettings):
def __init__(self,user_settings):
DXXCommon.LinuxPlatformSettings.__init__(self,user_settings)
user_settings.sharepath += '/'
self.lflags = os.environ["LDFLAGS"] if os.environ.has_key('LDFLAGS') else ''
def adjust_environment(self,program,env):
DXXCommon.LinuxPlatformSettings.adjust_environment(self, program, env)
self.libs = env['LIBS']
env.Append(CPPPATH = [os.path.join(program.srcdir, 'arch/linux/include')])
def __init__(self):
DXXCommon.__init__(self)
self.user_settings = self.UserSettings(self.ARGUMENTS, self.target)
if not DXXProgram.static_archive_construction.has_key(self.user_settings.builddir):
DXXProgram.static_archive_construction[self.user_settings.builddir] = DXXArchive(self.user_settings.builddir)
self.check_platform()
self.prepare_environment()
self.banner()
self.check_endian()
self.process_user_settings()
self.register_program()
def prepare_environment(self):
DXXCommon.prepare_environment(self)
self.VERSION_STRING = ' v' + str(self.VERSION_MAJOR) + '.' + str(self.VERSION_MINOR) + '.' + str(self.VERSION_MICRO)
self.env.Append(CPPDEFINES = [('PROGRAM_NAME', '\\"' + str(self.PROGRAM_NAME) + '\\"'), ('DXX_VERSION_MAJORi', str(self.VERSION_MAJOR)), ('DXX_VERSION_MINORi', str(self.VERSION_MINOR)), ('DXX_VERSION_MICROi', str(self.VERSION_MICRO))])
def banner(self):
print '\n===== ' + self.PROGRAM_NAME + self.VERSION_STRING + ' =====\n'
def check_platform(self):
DXXCommon.check_platform(self)
env = self.env
# windows or *nix?
if sys.platform == 'darwin':
VERSION = str(VERSION_MAJOR) + '.' + str(VERSION_MINOR)
if (VERSION_MICRO):
VERSION += '.' + str(VERSION_MICRO)
env['VERSION_NUM'] = VERSION
env['VERSION_NAME'] = self.PROGRAM_NAME + ' v' + VERSION
import tool_bundle
self.platform_settings.libs += ['physfs', 'm']
def process_user_settings(self):
DXXCommon.process_user_settings(self)
env = self.env
# opengl or software renderer?
# SDL_mixer support?
if (self.user_settings.sdlmixer == 1):
if (sys.platform != 'darwin'):
self.platform_settings.libs += ['SDL_mixer']
else:
env.Append(FRAMEWORKS = ['SDL_mixer'])
# profiler?
if (self.user_settings.profiler == 1):
self.platform_settings.lflags += ' -pg'
#editor build?
if (self.user_settings.editor == 1):
env.Append(CPPPATH = [os.path.join(self.srcdir, 'include/editor')])
env.Append(CPPDEFINES = [('SHAREPATH', '\\"' + str(self.user_settings.sharepath) + '\\"')])
def _register_program(self,dxxstr,program_specific_objects=[]):
env = self.env
exe_target = os.path.join(self.srcdir, self.target)
static_archive_construction = self.static_archive_construction[self.user_settings.builddir]
objects = static_archive_construction.objects_common[:]
objects.extend(program_specific_objects)
if (self.user_settings.sdlmixer == 1):
objects.extend(static_archive_construction.objects_arch_sdlmixer)
objects.extend(self.objects_similar_arch_sdlmixer)
if (self.user_settings.opengl == 1) or (self.user_settings.opengles == 1):
self.platform_settings.libs += self.platform_settings.ogllibs
objects.extend(self.objects_similar_arch_ogl)
else:
print "%s: building with Software Renderer" % self.PROGRAM_NAME
objects.extend(static_archive_construction.objects_arch_sdl)
objects.extend(self.objects_similar_arch_sdl)
if (self.user_settings.use_udp == 1):
objects.extend(self.objects_use_udp)
if (self.user_settings.editor == 1):
objects.extend(self.objects_editor)
objects.extend(static_archive_construction.objects_editor)
# finally building program...
env.Program(target='%s%s' % (self.user_settings.builddir, str(exe_target)), source = self.sources + objects, LIBS = self.platform_settings.libs, LINKFLAGS = str(self.platform_settings.lflags))
if (sys.platform != 'darwin'):
env.Install(self.user_settings.BIN_DIR, str(exe_target))
env.Alias('install', self.user_settings.BIN_DIR)
else:
sys.path += ['./arch/cocoa']
import tool_bundle
tool_bundle.TOOL_BUNDLE(env)
env.MakeBundle(self.PROGRAM_NAME + '.app', exe_target,
'free.%s-rebirth' % dxxstr, '%sgl-Info.plist' % dxxstr,
typecode='APPL', creator='DCNT',
icon_file='arch/cocoa/%s-rebirth.icns' % dxxstr,
subst_dict={'%sgl' % dxxstr : exe_target}, # This is required; manually update version for Xcode compatibility
resources=[['English.lproj/InfoPlist.strings', 'English.lproj/InfoPlist.strings']])
class D1XProgram(DXXProgram):
PROGRAM_NAME = 'D1X-Rebirth'
target = 'd1x-rebirth'
srcdir = 'd1x-rebirth'
ARGUMENTS = argumentIndirection('d1x')
def prepare_environment(self):
DXXProgram.prepare_environment(self)
# Flags and stuff for all platforms...
self.env.Append(CPPPATH = [os.path.join(self.srcdir, f) for f in ['include', 'main', 'arch/include']])
self.env.Append(CPPDEFINES = [('DXX_BUILD_DESCENT_I', 1)])
# general source files
__objects_common = DXXCommon.create_lazy_object_property([{
'source':[os.path.join(srcdir, f) for f in [
'2d/font.c',
'2d/palette.c',
'2d/pcx.c',
'arch/sdl/digi.c',
'arch/sdl/digi_audio.c',
'iff/iff.c',
'main/ai.c',
'main/aipath.c',
'main/automap.c',
'main/bm.c',
'main/bmread.c',
'main/cntrlcen.c',
'main/collide.c',
'main/custom.c',
'main/dumpmine.c',
'main/endlevel.c',
'main/fireball.c',
'main/fuelcen.c',
'main/fvi.c',
'main/game.c',
'main/gamecntl.c',
'main/gamemine.c',
'main/gamerend.c',
'main/gamesave.c',
'main/gameseg.c',
'main/gameseq.c',
'main/gauges.c',
'main/hostage.c',
'main/kconfig.c',
'main/laser.c',
'main/menu.c',
'main/mission.c',
'main/multi.c',
'main/newdemo.c',
'main/object.c',
'main/piggy.c',
'main/playsave.c',
'main/polyobj.c',
'main/powerup.c',
'main/render.c',
'main/snddecom.c',
'main/songs.c',
'main/state.c',
'main/switch.c',
'main/titles.c',
'main/weapon.c',
'misc/args.c',
#'tracker/client/tracker_client.c'
]
],
}])
@property
def objects_common(self):
return self.__objects_common + DXXProgram.objects_common.fget(self)
# for editor
__objects_editor = DXXCommon.create_lazy_object_property([{
'source':[os.path.join(srcdir, f) for f in [
'editor/ehostage.c',
]
],
}])
@property
def objects_editor(self):
return self.__objects_editor + DXXProgram.objects_editor.fget(self)
objects_use_udp = DXXCommon.create_lazy_object_property([os.path.join(srcdir, 'main/net_udp.c')])
# assembler related
objects_asm = DXXCommon.create_lazy_object_property([os.path.join(srcdir, f) for f in [
'texmap/tmap_ll.asm',
'texmap/tmap_flt.asm',
'texmap/tmapfade.asm',
'texmap/tmap_lin.asm',
'texmap/tmap_per.asm'
]
])
def register_program(self):
versid_cppdefines=self.env['CPPDEFINES'][:]
if self.user_settings.extra_version:
versid_cppdefines.append(('DESCENT_VERSION_EXTRA', '\\"%s\\"' % self.user_settings.extra_version))
versid_sources = [self.env.StaticObject(target='%s%s%s' % (self.user_settings.builddir, self._apply_target_name(s), self.env["OBJSUFFIX"]), source=os.path.join(self.srcdir, s), CPPDEFINES=versid_cppdefines) for s in ['main/vers_id.c']]
self._register_program('d1x', versid_sources)
class D2XProgram(DXXProgram):
PROGRAM_NAME = 'D2X-Rebirth'
target = 'd2x-rebirth'
srcdir = 'd2x-rebirth'
ARGUMENTS = argumentIndirection('d2x')
def prepare_environment(self):
DXXProgram.prepare_environment(self)
# Flags and stuff for all platforms...
self.env.Append(CPPPATH = [os.path.join(self.srcdir, f) for f in ['include', 'main', 'arch/include']])
self.env.Append(CPPDEFINES = [('DXX_BUILD_DESCENT_II', 1)])
# general source files
__objects_common = DXXCommon.create_lazy_object_property([{
'source':[os.path.join(srcdir, f) for f in [
'2d/font.c',
'2d/palette.c',
'2d/pcx.c',
'arch/sdl/digi.c',
'arch/sdl/digi_audio.c',
'iff/iff.c',
'libmve/decoder8.c',
'libmve/decoder16.c',
'libmve/mve_audio.c',
'libmve/mvelib.c',
'libmve/mveplay.c',
'main/ai.c',
'main/ai2.c',
'main/aipath.c',
'main/automap.c',
'main/bm.c',
'main/cntrlcen.c',
'main/collide.c',
'main/dumpmine.c',
'main/endlevel.c',
'main/escort.c',
'main/fireball.c',
'main/fuelcen.c',
'main/fvi.c',
'main/game.c',
'main/gamecntl.c',
'main/gamemine.c',
'main/gamepal.c',
'main/gamerend.c',
'main/gamesave.c',
'main/gameseg.c',
'main/gameseq.c',
'main/gauges.c',
'main/kconfig.c',
'main/laser.c',
'main/menu.c',
'main/mission.c',
'main/movie.c',
'main/multi.c',
'main/newdemo.c',
'main/object.c',
'main/piggy.c',
'main/playsave.c',
'main/polyobj.c',
'main/powerup.c',
'main/render.c',
'main/segment.c',
'main/songs.c',
'main/state.c',
'main/switch.c',
'main/titles.c',
'main/weapon.c',
'misc/args.c',
'misc/physfsrwops.c',
]
],
}])
@property
def objects_common(self):
return self.__objects_common + DXXProgram.objects_common.fget(self)
# for editor
__objects_editor = DXXCommon.create_lazy_object_property([{
'source':[os.path.join(srcdir, f) for f in [
'main/bmread.c',
]
],
}])
@property
def objects_editor(self):
return self.__objects_editor + DXXProgram.objects_editor.fget(self)
objects_use_udp = DXXCommon.create_lazy_object_property([os.path.join(srcdir, 'main/net_udp.c')])
# assembler related
objects_asm = DXXCommon.create_lazy_object_property([os.path.join(srcdir, f) for f in [
'texmap/tmap_ll.asm',
'texmap/tmap_flt.asm',
'texmap/tmapfade.asm',
'texmap/tmap_lin.asm',
'texmap/tmap_per.asm'
]
])
def register_program(self):
versid_cppdefines=self.env['CPPDEFINES'][:]
if self.user_settings.extra_version:
versid_cppdefines.append(('DESCENT_VERSION_EXTRA', '\\"%s\\"' % self.user_settings.extra_version))
versid_sources = [self.env.StaticObject(target='%s%s%s' % (self.user_settings.builddir, self._apply_target_name(s), self.env["OBJSUFFIX"]), source=os.path.join(self.srcdir, s), CPPDEFINES=versid_cppdefines) for s in ['main/vers_id.c']]
self._register_program('d2x', versid_sources)
program_d1x = None
program_d2x = None
if int(ARGUMENTS.get('d1x', 1)):
program_d1x = D1XProgram()
if int(ARGUMENTS.get('d2x', 1)):
program_d2x = D2XProgram()
# show some help when running scons -h
Help('DXX-Rebirth, SConstruct file help:' +
"""
Type 'scons' to build the binary.
Type 'scons install' to build (if it hasn't been done) and install.
Type 'scons -c' to clean up.
Extra options (add them to command line, like 'scons extraoption=value'):
'sharepath=[DIR]' (non-Mac OS *NIX only) use [DIR] for shared game data. [default: /usr/local/share/games/d2x-rebirth]
'opengl=[0/1]' build with OpenGL support [default: 1]
'opengles=[0/1]' build with OpenGL ES support [default: 0]
'opengles_lib=[NAME]' specify the name of the OpenGL ES library to link against
'sdlmixer=[0/1]' build with SDL_Mixer support for sound and music (includes external music support) [default: 1]
'asm=[0/1]' build with ASSEMBLER code (only with opengl=0, requires NASM and x86) [default: 0]
'debug=[0/1]' build DEBUG binary which includes asserts, debugging output, cheats and more output [default: 0]
'profiler=[0/1]' profiler build [default: 0]
'editor=[0/1]' include editor into build (!EXPERIMENTAL!) [default: 0]
'ipv6=[0/1]' enable IPv6 compability [default: 0]
'use_udp=[0/1]' enable UDP support [default: 1]
'use_tracker=[0/1]' enable Tracker support (requires udp) [default :1]
'verbosebuild=[0/1]' print out all compiler/linker messages during building [default: 0]
'raspberrypi=[0/1]' build for Raspberry Pi (automatically sets opengles and opengles_lib) [default: 0]
'rpi_vc_path=[DIR]' use [DIR] to look for VideoCore libraries/header files (RPi only)
Default values:
""" +
((' d1x sharepath = ' + program_d1x.user_settings.DATA_DIR + '\n') if program_d1x else '') +
((' d2x sharepath = ' + program_d2x.user_settings.DATA_DIR + '\n') if program_d2x else '') +
((' d2x opengles_lib = ' + program_d2x.user_settings.default_OGLES_LIB + '\n') if program_d2x else '') +
((' d2x rpi_vc_path = ' + program_d2x.user_settings.RPI_DEFAULT_VC_PATH + '\n') if program_d2x else '') +
"""
Some influential environment variables:
CC C compiler command
CFLAGS C compiler flags
LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
nonstandard directory <lib dir>
<include dir>
CXX C++ compiler command
CXXFLAGS C++ compiler flags
""")
#EOF